3.1 正向后门

正向后门也叫Bind shell,后门程序通过Socket的bind函数监听一个特定的端口,攻击者连接后可以得到一个shell。
传统的Socket编程中实现一个TCP服务器的流程如下。
1)使用socket()创建一个Socket。
2)使用bind()绑定Socket。
3)使用listen()监听一个端口。
4)使用accept()接受客户端的连接。
5)使用send()与receiver()与客户端进行通信。
Go语言标准库的net包对Socket进行了封装,实现TCP服务只需使用net.Listen监听端口,然后用listen对象的Accept()方法接受连接并返回一个net.Conn对象,之后用net.Conn对象的Read()与Write()方法即可进行通信。
以下为一个TCP服务器的示例,正向后门就在这个示例的基础上开发的。

这个示例的功能是接收客户端的数据,并原样返回给客户端,用telnet或nc连接后可以看到效果,如图3-1所示。

●图3-1 TCP回声程序
Go语言标准库的os/exec包可以执行系统命令,也可以为标准输入、输出及错误指定处理对象,将net.Conn对象分别赋值给Stdin、Stdout与Stderr,即可实现命令的发送以及执行结果的返回,代码如下所示:

将以上程序进行编译,执行./main :99表示后门监听在99端口,然后用nc连接到该端口就可以看到效果了,如图3-2所示。

●图3-2 正向后门测试