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

学号: 20242311  姓名: 王润章  班级: 2423
实验名称: 后门原理及其应用

一、基础知识

(一)后门与反弹 Shell

后门是指绕过或弱化正常访问流程,使程序或操作者能够通过非预期通道再次进入系统的一类机制,反弹 Shell 是运行程序的机器主动连接另一台机器,再通过已经建立的网络连接传输命令和执行结果。

那为什么需要反弹 Shell这种机制呢?

因为有些主机位于 NAT 网络内部,或者受到防火墙的入站访问限制。外部设备可能无法直接向它发起连接,但它仍然可能主动向外建立网络连接。不过,反弹连接并不保证能够绕过防火墙,出站访问同样可能受到限制或监控。

实验中需要把三个角色区分清楚:运行程序的主机、接收连接的监听端,以及负责传输文件的发送端和接收端。例如 LHOST 对应反向连接的监听目标,并不必然是 Windows 宿主机的物理网卡 IP。

(二)Netcat 与 Socat

Netcat 可用于 TCP/UDP 连接、端口监听及数据传输,适合观察网络通道中的标准输入与标准输出,Netcat 只负责文件的传输,它本身不会判断文件是不是正常的 Windows 可执行文件。Socat 的全称来自 Socket CAT,它与 Netcat 的用途相似,但更强调不同数据端点之间的双向转发。和 Netcat 相比,Socat 的优势是支持更多地址类型和数据转发配置,例如双向通信、多个连接处理及伪终端等。

(三)cron 与 Windows 任务计划程序

cron 是 Linux 中负责执行定时任务的服务机制,通常由后台守护进程按照预设时间运行命令。例如,我们希望每天自动备份文件,或者每隔一段时间检查系统状态,就可以使用 cron。
Windows 中有类似的机制,叫作 Task Scheduler(任务计划程序)。它可以通过图形界面管理,也可以通过 schtasks 命令行工具管理。

(四)Metasploit、Meterpreter 与 ELF

Metasploit Framework 是一个用于安全研究、漏洞验证和渗透测试的框架。它把不同类型的安全测试功能组织成模块,使研究人员能够在授权环境中复现漏洞和分析系统行为。其中有几个重要概念:

概念 含义
Exploit 利用某种漏洞或缺陷的模块
Payload 被触发后执行的功能代码
Handler 负责处理指定类型连接或会话的模块
Auxiliary 辅助测试模块
Session 已建立的交互会话

Meterpreter 是 Metasploit 提供的一种功能较丰富的交互式载荷。普通 Shell 一般提供命令解释和程序执行能力,而 Meterpreter 还提供了面向目标系统的专用操作接口。

ELF 的全称是:Executable and Linkable Format,中文为:可执行与可链接格式。Linux 系统中常见的可执行文件、目标文件及共享库,都可以使用 ELF 格式。


二、实验内容

(一)实验任务

  1. 使用 Netcat 获取主机操作 Shell,并配置 cron 定时任务。
  2. 使用 Socat 获取主机操作 Shell,并通过 Windows 任务计划启动任务。
  3. 使用 MSF 生成实验用可执行文件,利用 Netcat 传输到 Windows 主机,并验证 Meterpreter 会话。
  4. 测试 Meterpreter 的屏幕、摄像头、键盘记录及提权相关功能。
  5. 使用 MSF 生成 Shellcode,结合实践一的 pwn1 完成 ELF 注入与反弹连接验证。

(二)实验要求问题回答

问题1:列举一个后门进入系统的可能方式。

攻击者可能将程序伪装成常见安装包,通过不可信下载页面或邮件附件诱导用户执行。一旦用户以较高权限运行未知程序,就可能在不知情的情况下建立非预期的远程通信通道。防范时应核验文件来源、数字签名与安全扫描结果。

问题2:Windows 与 Linux 系统中有哪些可能启动后门的方式?

Linux 的 cron、systemd 服务、登录脚本都能自动启动程序;Windows 则有任务计划程序、启动文件夹、系统服务和注册表启动项等机制。

问题3:Meterpreter 的哪些功能给你留下了较深印象?

本次实际验证的系统信息查询、远程目录访问、屏幕获取和摄像头抓拍较为直观。这说明远程会话不仅可能影响命令行,还可能涉及终端上的个人信息与设备资源。

问题4:如何发现系统中可能存在的异常远程控制程序?

可以综合检查网络监听端口和异常外连、当前进程、任务计划和自启动服务、可疑可执行文件的数字签名及哈希值,并结合安全日志判断。遇到不熟悉的任务应先确认创建者和用途,保留证据后再进行隔离与清理。


三、实验过程

(一)实验准备:确认环境和网络地址

本实验使用 Windows 11 宿主机和 VMware 中的 Kali Linux。Windows 侧的计算机名为 LAPTOP-R4L7E2HQ,使用的登录账户为 lenovo;Kali 的用户名为 kali,终端主机名为 wangrunzhang,实验目录为 /home/kali/netsec_exp1。

开始时首先记录 Windows 的网络配置,其中物理网络环境中出现 10.30.9.91,即主机的ip地址。

fig_03

随后在 Kali 执行网络接口检查,截图中的 eth0 地址为 192.168.17.129,即虚拟机的ip地址。

fig_18

(二)任务一:Netcat 获取 Shell,cron 启动定时任务

(1)测试连接并查看远程 Shell

在 Windows 端打开 Netcat 监听并检查端口状态。截图中 2311 端口处于 LISTENING,说明程序已在等待网络连接。之后在 Kali 端测试连接,初次出现连接拒绝,检查监听状态后再次测试,Windows 端可以看到 Linux 命令的输出。

fig_04

连接测试中,Kali 曾出现 Connection refused,随后 Windows 监听窗口成功显示 ls、pwd 的执行结果,其中 pwd 返回 /root。这既记录了初次失败,也记录了后续建立交互的结果。

fig_05

(2)配置并核验 cron

Netcat 测试后,继续验证 Linux 的定时任务机制。通过 crontab 查看和配置计划任务,并在实验目录中准备输出学号的文本文件。配置阶段曾接触到系统 cron 任务文件,之后改为通过 crontab 命令管理任务,以减少直接操作任务文件产生的格式和权限风险。

fig_06

实验中使用的写入学号任务,目标是定期更新 /home/kali/wangrunzhang/tempfile/20242311.txt。截图保留了任务配置内容,便于区分时间字段与实际执行命令。

fig_08

最终在目标目录中查看到 20242311.txt,文件内容为 20242311,说明定时写入的结果得到观察。需要指出的是,文件内容截图可证明指定文本已产生,但并不能单独证明每次触发的精确执行时刻。

fig_09

(三)任务二:Socat 获取 Shell,Windows 任务计划启动

(1)测试 Socat 连接

在 Socat 测试阶段,Windows 端出现与 Cygwin 移植环境有关的 Couldn't compute FAST_CWD pointer 提示。该提示说明兼容层存在警告,不能据此直接断定连接已经失败,需要查看双方实际会话。

fig_10

随后 Kali 终端中出现 Windows 命令提示符 G:\socat\socat>,表明对应 TCP 通道已关联到 Windows 命令行,可以观察远程 Shell 的交互情况。

fig_11

(2)建立 Windows 任务计划

继续使用 Windows 的 schtasks 创建任务。初次命令中,/tn 与任务名之间缺少空格,且引号格式不规范,导致 Windows 将参数解析错误。排查后修正任务名称参数的格式,再重新创建。

fig_12

修改后再次执行任务创建命令。这里重点是命令参数分隔、使用英文引号以及正确识别 Windows 路径,不能将复制粘贴后的“命令没有报错”直接等同于任务已创建,还需查看计划任务列表。

fig_13

任务计划程序中已出现名为 20242311wrz 的任务,状态显示“准备就绪”,触发条件包含按分钟重复的设置。这张截图能够证明任务创建与配置成功;至于程序每次触发的具体执行效果,仍以相应任务历史和结果为准。

fig_14

(四)任务三:MSF 生成可执行文件、Netcat 传输并验证会话

(1)生成文件并确认监听地址

任务三使用 Kali 的 Metasploit 生成 Windows 平台的实验文件 backdoor20242311.exe。最初生成时曾将 Windows 物理网卡地址 10.30.9.91 填入反向连接监听配置,后来检查 Kali 网络接口,确认应区分“宿主机地址”和“真正运行监听端的 Kali 地址”,将相关配置与 Kali 的 192.168.17.129 保持一致。

fig_15

(2)传输过程中的文件异常

实验中选择 Windows 上的 G:\netcat-win32-1.11\netcat-1.11 目录保存文件。首次使用 PowerShell 配合 Netcat 和输出重定向接收时,出现文件内容异常。截图所示目录中同名文件一度为 0 字节,因此不能把“文件名已经出现”当成传输成功。

fig_20

检查后发现接收数据的方式需要调整。此时 Kali 仍可看到发送操作记录,但接收端的文件大小、可执行格式和哈希值均需单独核验,避免直接运行不完整文件。

fig_17

按照本次实验的环境条件,后来改用 Windows CMD 接收二进制文件,重新传输并核对数据。截图中 Kali 发送端计算出的 MD5 为:

1d42ad10ef26e0d4f5543428552a14a5

fig_21

Windows 端重新计算后得到相同 MD5,表明此次收到的文件与发送文件在内容上保持一致。本次实践的结论是 CMD 方式解决了当前的文件接收问题,而不是所有 PowerShell 版本都无法处理二进制流。

(3)验证 Meterpreter 会话

完成文件完整性校验后,在隔离实验环境中进行会话验证。日志显示 Windows 主机信息可以被读取,目标系统为 Windows 11 24H2,架构为 x64,Meterpreter 会话架构为 x86/windows。使用 getuid、pwd 和目录列举操作,分别记录到 Windows 登录用户与 Netcat 的工作目录。

fig_22

这一步的主要证据是实际会话中返回了目标 Windows 的系统信息,而不仅仅是监听端显示“正在监听”。通过生成、传输、哈希比对及会话验证,任务三得到完成。

(五)任务四:Meterpreter 功能测试与提权尝试

(1)屏幕和摄像头功能

在已有会话中,屏幕截图命令返回保存路径 /home/kali/EtXHYtiq.jpeg;摄像头抓拍返回 Got frame,生成 /home/kali/PaOcYEiY.jpeg。这些终端记录表明对应图像数据已保存在 Kali 中。

fig_23

通过 Kali 的文件管理器可以看到生成的 JPEG 文件,并能够在图像查看器中打开摄像头抓拍结果,构成“命令反馈—文件生成—图像打开”的连续证据。

fig_24

下方为图像查看器打开抓拍结果的实际截图。

fig_25

(2)键盘记录测试

本次执行键盘记录相关测试时,启动与停止阶段有正常提示,但导出操作返回错误:

stdapi_ui_get_keys_utf8: Operation failed: Incorrect function.

因此只能确认命令已进入相应流程,不能认定已经成功获取键盘输入记录。报错可能与系统版本、会话运行环境、API 兼容性有关,但现有记录不足以证实某一个确定原因。

(3)提权结果核验

在权限提升测试中,getsystem 返回了使用 EFSRPC 相关技术的执行提示;随后使用 getuid 复核,当前用户名仍是 LAPTOP-R4L7E2HQ\lenovo,并未显示 NT AUTHORITY\SYSTEM。因此本报告将其记为已尝试提权,但未证实当前会话权限提升至 SYSTEM,避免把工具提示和最终权限结果混为一谈。

fig_23

(六)任务五:MSF Shellcode 注入 pwn1,验证 Linux 反弹连接

(1)初次生成文件出现异常

开始时曾使用 GDB 测试输入与栈布局,但多次触发异常,后来发现更根本的问题发生在 Metasploit 的 ELF 输出阶段。

fig_29

初次输出显示 Payload size: 123 bytes、Final size of elf file: 123 bytes,通过 file 查看得到 data,而非正常 ELF。显然这不是有效的注入后可执行文件。此时无论继续调节 GDB 返回地址还是赋予执行权限,都不能从根本上解决文件格式异常。

fig_30

(2)参考周梓濠同学的方法定位并修复环境

后续参照周梓濠同学提供的排查方法,查看 Metasploit 版本所对应的 Ruby 源码。to_linux_x86_custom_elf 在处理原 ELF 并替换代码片段后,末尾为字节串赋值表达式;而 Ruby 默认返回函数最后表达式的值,因而可能返回裸 code,使生成结果只有 123 字节。

正式修改之前先备份原 Ruby 文件,并验证备份与原件相同。之后根据周梓濠同学的方法修正返回逻辑,再进行源文件语法与生成结果检查。下图中的编辑界面展示了函数尾部修复后的状态。

fig_31

(3)重新生成并核验 ELF

修复后重新以 pwn1_20242311 为载体生成实验文件 20242311_pwn1012。命令输出中的最终 ELF 大小恢复为约 7418 字节,与原始 pwn1_20242311 的文件大小相符。生成后还对文件类型、段权限作了进一步检查,而不是只看文件大小。

fig_32

实际验证中,file 将生成结果识别为 ELF 32-bit LSB executable,Intel 80386;readelf 显示首个可执行 LOAD 段由原来的 R E 变为 RWE。由此确认,生成文件不再只是 123 字节的裸载荷,而是能够由 ELF 工具正常识别的文件。

fig_33

(4)Linux 会话及结果确认

完成文件层面的核验后,在实验环境中进行运行测试。截图所示监听窗口返回 Linux Meterpreter 会话建立记录,说明连接结果与本项 Linux ELF 程序对应,而不是任务三此前建立的 Windows 会话。

fig_34

进一步查看会话目录,返回路径为 /home/kali,列出 Kali 用户目录下的多个文件及文件夹。这与 Windows 会话的 G:\netcat-win32-1.11\netcat-1.11 不同,为区分任务三与任务五的实际结果提供了证据。

fig_35

综上,任务五经历了“生成异常—检查源码—参考同学方法修复—核验 ELF—观察 Linux 会话”的完整过程。


四、问题及解决方案

(一)任务三:PowerShell 接收二进制文件出现错误

问题现象: Windows 端使用 PowerShell 配合 Netcat 接收实验文件时,曾出现空文件、文件大小异常、无法作为有效 Windows 程序打开,以及发送端与接收端 MD5 不一致等情况。

排查过程: 我先检查保存目录和文件大小,再对比两端的 MD5。发现即使文件名存在,实际字节内容仍可能不一致,因此问题主要指向传输与重定向阶段,而不是 Metasploit 监听。

解决方法: 在本次使用的 Windows Netcat 环境中,改用 CMD 接收二进制数据并重新传输,最后再次计算哈希值。两端 MD5 均为 1d42ad10ef26e0d4f5543428552a14a5,问题解决。

经验总结: 传输二进制文件不能只验证是否产生文件,还必须验证长度和哈希值;在某些 PowerShell 版本中,原生命令的输出经过 PowerShell 的文本处理或编码转换后,可能无法保持原始二进制字节完全不变。而 CMD 的重定向处理方式不同,通常更适合把原生程序的二进制标准输出直接保存为文件。

(二)任务五:修复 Metasploit 输出只有 123 字节的 ELF 问题

问题现象: 初次使用 MSF 向实践一的 pwn1 注入 Shellcode 后,得到的输出文件只有 123 字节,file 显示 data,无法正常按 ELF 程序验证。

排查过程: 我一度把注意力放在 GDB、栈地址和输入内容上,但这些调整不能解决生成文件本身不是 ELF 的问题。后来根据周梓濠同学指出的方向检查 lib/msf/util/exe/linux/x86.rb,发现相关方法末尾只返回了替换片段的值,没有返回经过修改的完整 ELF 字节串。

解决方法: 先备份并校验工具源文件,参考同学提供的方法修复 Ruby 函数返回值,再重新生成并校验输出文件。后续结果显示 ELF 大小约 7418 字节,类型为 32 位 i386 ELF,首个可执行 LOAD 段权限变化符合预期,最终获得 Linux Meterpreter 会话。

经验总结: 对生成工具进行故障排查时,应先验证生成物的格式和结构,再讨论调试地址、网络连通和执行环境。此次问题的根源是工具处理 ELF 时的返回值实现,而不是最初猜测的栈地址。


五、学习感悟与总结

这次实验给我印象最深的,并不是哪条命令执行成功,而是如何判断实验是否真的成功。例如任务三中,文件已经出现在 Windows 目录里,却因为接收过程中出现问题而不能运行;只有经过 MD5 对比,才确认改用 CMD 接收后的文件与 Kali 发送端一致。这个过程让我意识到,文件传输应包含完整性验证,而不是仅以文件是否存在作为结论。

任务五的问题更加典型。起初,我一直按实验一的 BOF 思路检查 pwn1、pwn3 的输入和栈地址,但最终发现生成文件只有 123 字节、根本不是 ELF。后来在周梓濠同学的帮助下,把排查方向转向 Metasploit 源码,理解了 Ruby 最后一条表达式的返回值行为。修复后通过文件长度、格式、程序段权限和 Linux 会话结果逐项确认,才形成了比较完整的验证链。

另外,任务四也让我认识到,工具的输出提示和最终结果必须区分。屏幕截图与摄像头拍摄能够找到实际生成文件;键盘记录导出失败,就不能写成已经获取按键;提权工具返回了相关技术提示,但用户身份没有变化,也不能直接认定获得 SYSTEM 权限。今后的实验记录中,我会优先保存原始输出和关键截图,尽量把故障现象、排查思路、修正方法和验证依据一一对应。


六、参考资料

[1] netcat下载链接(需要关闭防火墙)
[2] socat下载链接
[3] 20242312 2026-2027-1 《网络与系统攻防技术》实验2实验报告