20242311 2026-2027-1《网络与系统攻防技术》实验四实验报告
学号: 20242311 姓名: 王润章 班级: 2423
实验名称: 恶意代码分析基础与蜜罐流量取证
一、基础知识
(一)PE 文件与加壳
Windows 的 exe 大多是 PE 格式,由文件头加若干"节区"组成,代码、数据、资源分开放。
file 输出 PE32 executable (GUI) Intel 80386, for MS Windows, 3 sections,就是"32 位 PE、图形界面、i386 平台、3 个节区"。PE 头里的 TimeDateStamp 记着编译时间。
加壳就是在原程序外套一层压缩程序,加壳后节区变少、名字也变了,入口点落在壳的解压代码上,不在原程序上。目的就三个:体积小、字符串藏起来、躲特征码。
(二)脱壳
脱壳有两条路:工具认出是什么壳直接还原(upx -d、超级巡警),或者让程序跑起来、把内存 dump 下来再修文件头。
壳会把导入表弄坏,工具还得重建导入表,所以看到多出一个 .newIID 节区,基本能判断这文件脱过壳。
(三)字符串与编码
strings 把文件里的可读字符抓出来,默认只认 ASCII。
VB 写的程序字符串是 Unicode(UTF-16LE),每个字符后跟一个 00,默认模式抓不到,要加 -e l。只跑一遍默认参数,很容易误判成"这程序不联网"。
(四)crackme 的判断逻辑
crackme 是练逆向的小程序,考"输什么能通关"。
argc 是参数个数(含程序名),argv[0] 是程序被调用时的名字,argv[1] 才是用户输的参数。程序一般用 strcmp 比较加条件跳转判断。argv[0] 跟调用方式绑在一起:cmd 里敲 xxx.exe 就是 xxx.exe,PowerShell 里敲 .\xxx.exe 就带上了 .\。
(五)IRC 与僵尸网络
IRC 是跑在 TCP 上的文本聊天协议。客户端连上先发 NICK、USER 注册,服务器回 001 才算成功,之后才能 JOIN #频道,常用端口 6667、6660–6669、6697。
僵尸网络是被同一条命令通道控制的一批机器。选 IRC 是因为在频道里发一句,所有 Bot 同时收到。
(六)流量取证看什么
取证不是把包看完,是回答"谁、对谁、做了什么、成没成"。先按五元组缩小范围,再看会话内容。
判断成没成要看状态字段,不能看流量大小:smb.nt_status 为 0x00000000 是成功、0xC000006D 是失败;DCE/RPC 的 opnum 12 是 CreateServiceW,也就是远程建服务。
Wireshark 的过滤器跟解析层次有关,字段取不到时,在详情面板右键该字段选"作为过滤器应用",比自己试字段名快。
二、实验内容
- 对 RaDa 样本做类型识别、脱壳、字符串提取,回答文件格式、运行平台、加壳工具和编写作者。
- 用 IDA 分析
crackme1.exe和crackme2.exe,找出能输出成功信息的输入。 - 分析 RaDa 样本,回答八个问题:摘要、目的、特性、反分析技术、分类、同类工具、作者溯源、检测方法。
- 对蜜罐 5 天流量做取证,回答七个问题。
三、实验过程
(一)实验准备
实验用 Windows 11 宿主机加 VMware 里的 Kali。Kali 主机名 wangrunzhang,工作目录 /home/kali/lab4;样本和工具在 G:\网络攻防\实验4\。
一开始 rada.rar 解压后只有 rada_dump_.exe,没有原始样本。查 Windows 安全中心的保护历史记录,RaDa.exe 被判为 Backdoor:Win32/RaDa 隔离删除了。加排除项重新解压才拿到,MD5 是 caaa6985a43225a0b3add54f44a0d4c7。IDA 装在中文路径下打不开 PE,解决过程写在第四章。

(二)任务一:识别、脱壳与字符串提取
(1)识别文件格式
cd ~/lab4
file RaDa.exe
md5sum RaDa.exe
objdump -h RaDa.exe | head -20
file 输出 PE32 executable (GUI) Intel 80386, for MS Windows, 3 sections,大小 20,992 字节(DIE 显示 20.50 KiB)。
节区是 JDR0、JDR1、.rsrc,不是标准的 UPX0/UPX1,说明作者改过名字躲特征。
(2)判断加壳工具
本机没装 PEiD,用 Detect It Easy:
| 项目 | 结果 |
|---|---|
| 文件类型 | PE32,20.50 KiB |
| 操作系统 | Windows(95) [I386, 32 位, GUI] |
| 编译器 | Visual Basic (6.00.8041) [Native] |
| 链接器 | Microsoft Linker (6.0) |
| 打包工具 | UPX[modified],EntryPoint + Imports like UPX (v0.94-1.93) |
| 保护 | Generic[Custom DOS] |
UPX[modified] 说明壳是 UPX 但被改过,工具只能认出"像 UPX",给不出准确版本。
超级巡警看入口点的机器码:EP 在 0000FD20、区段 JDR1、首字节 60 BE 00 C0(PUSHAD 加 MOV ESI),这是 UPX 入口的标志,工具给出 UPX 0.89.6 - 1.02 / 1.05 - 1.22 -> Markus & Laszlo。
可见认壳不能只看节区名,名字能改,入口点的机器码不好改。


(3)脱壳并核对
用超级巡警载入 RaDa.exe,脱壳后存成 20242311_RaDa_unpacked.exe,提示 Unpack successfully!。工具显示的 MD5 和 Kali 里 md5sum 一致,说明是同一个文件。
| 项目 | 脱壳前 | 脱壳后 |
|---|---|---|
| 文件大小 | 20,992 字节(21 KB) | 68,833 字节(67 KB) |
| 节区数 | 3(JDR0/JDR1/.rsrc) |
5(多出 .newIID、.mackt) |
| 入口首字节 | 60 BE 00 C0(PUSHAD) |
68 94 19 40(PUSH 0x401994) |
| 打包工具 | UPX[modified] | 无(Not packed) |
| 编译器 | — | Visual Basic v5.0 - v6.0 |
| MD5 | caaa6985a43225a0b3add54f44a0d4c7 |
02bfa8e6d4ed8ed8049004fdad840d2a |
入口从 PUSHAD 变成一条普通 push,说明壳的代码没了、直接从真入口开始跑;多出的 .newIID 是重建导入表的产物;文件从 21 KB 涨到 67 KB,符合"壳里是压缩数据、脱完还原"的预期。

(4)提取字符串找作者
strings -n 6 20242311_RaDa_unpacked.exe > 20242311_rada_strings.txt
grep -n -i -E "Raul|Perez|Siles" 20242311_rada_strings.txt
第 138 行输出 (c) Raul Siles && David Perez。IDA 里 Shift+F12 搜 Raul、双击跳转,地址是 00403F7A。
只跑默认的 strings 会漏东西,这样本是 VB6 写的,网址、注册表路径都是宽字符,要加 -e l:
strings -e l 20242311_RaDa_unpacked.exe | grep -a -i -E "http|cgi|RaDa|CurrentVersion"
这次出现了 http://10.10.10.10/RaDa、RaDa_commands.html、download.cgi、upload.cgi、C:\RaDa\tmp、C:\RaDa\bin、HKLM\Software\Microsoft\Windows\CurrentVersion\Run,后面判断行为就靠这些。


(三)任务二:crackme1 与 crackme2
(1)crackme1
先直接跑,看它什么反应:
C:\20242311_crackme>crackme1.exe
I think you are missing something.
C:\20242311_crackme>crackme1.exe hello
Pardon? What did you say?
两句提示对应两道检查:参数不够、参数不对。IDA 里按 G 跳到 _main(本机 0x401281):
cmp [ebp+argc], 2
jz short loc_4012D2
...
loc_4012D2:
mov eax, [ebp+argv]
push offset Str2 ; "I know the secret"
push dword ptr [eax] ; argv[1]
call _strcmp
test eax, eax
jz short loc_401310
...
loc_401310:
push offset aYouKnowHowToSp ; "You know how to speak to programs, Mr. "
参数正好 2 个(程序名加 1 个),strcmp(argv[1], "I know the secret") 返回 0 才跳成功。
C:\20242311_crackme>crackme1.exe "I know the secret"
You know how to speak to programs, Mr. Reverse-Engineer


(2)crackme2
crackme2 在比口令之前,多比了一次程序名:
loc_4012D5:
mov eax, [ebp+argv]
push offset Str2 ; "crackmeplease.exe"
push dword ptr [eax] ; argv[0]
call _strcmp
test eax, eax
jz short loc_401313
push offset aIHaveAnIdentit ; "I have an identity problem.\n"
两个坑:文件名少写 .exe 会失败;PowerShell 里写 .\crackmeplease.exe,argv[0] 多了 .\ 也会失败。要用 cmd,先 cd 到目录再直接敲文件名:
C:\20242311_crackme>copy crackme2.exe crackmeplease.exe
C:\20242311_crackme>crackmeplease.exe "I know the secret"
We have a little secret: Chocolate
那句 Chocolate 不是明文存的。成功分支里有个循环,把 dword_403080 的字节逐个和 0x42 异或再输出:
loc_401351:
xor eax, 42h
...
call _putchar
字符串窗口里 0x403080 处是 15h 27h 62h … 一串乱码样的字节,这是最基础的字符串混淆。



(四)任务三:RaDa 八问
(1)样本摘要
| 项目 | 值 |
|---|---|
| 文件名 | RaDa.exe(脱壳版 20242311_RaDa_unpacked.exe) |
| 大小 | 20,992 字节(20.50 KiB) |
| MD5(原始) | caaa6985a43225a0b3add54f44a0d4c7 |
| MD5(脱壳) | 02bfa8e6d4ed8ed8049004fdad840d2a |
| 文件格式 | PE32 executable (GUI) Intel 80386 |
| 编译时间 | 0x4182D97E = 2004-10-30 07:59:58(北京时间) |
| 编译器 | Microsoft Visual Basic 6.0(Native) |
| 加壳 | UPX v0.89.6–1.22,节区改名 JDR0/JDR1 |
哈希能精确匹配单个文件,编译时间和编译器能用来归类,节区命名习惯(JDR 加 .mackt)比哈希更耐改。
(2)样本的目的
这是一个用 HTTP 做通道的远程控制后门:
- 建
C:\RaDa\tmp、C:\RaDa\bin两个目录。 - 往
HKLM\Software\Microsoft\Windows\CurrentVersion\Run写启动项,开机自启。 - 连
http://10.10.10.10/RaDa,读RaDa_commands.html取指令。 - 按指令用
download.cgi下载、upload.cgi回传。
用 HTTP 是因为 80 端口出站流量在哪都算正常业务,防火墙一般不拦。样本里还留着 http://www.honeynet.org/scans/index.html 和 <TITLE>RaDa Usage</TITLE>,说明它是 Honeynet Project 的研究样本,不是真实攻击里用的。
(3)样本的特性
- 自启动:写注册表 Run 键,配合固定的
C:\RaDa\目录。 - 传文件:
download.cgi下载、upload.cgi回传。 - 听指令:从
RaDa_commands.html取任务,不保持长连接。 - 分目录:
bin和tmp分开,方便替换组件。 - 藏得浅:UPX 加壳、节区改名、宽字符字符串。
(4)反分析技术
| 技术 | 表现 | 针对的手段 |
|---|---|---|
| 加壳 | UPX 0.89.6–1.22 | strings、特征码 |
| 节区改名 | UPX0/UPX1 → JDR0/JDR1 |
按节区名匹配的规则 |
| 头偏移异常 | e_lfanew 为 0xC0(正常 0x80) |
按固定偏移解析的脚本 |
| 宽字符 | 关键字符串用 UTF-16LE | 默认参数的 strings |
| 导入表重建 | 脱壳后多出 .newIID |
靠导入表猜行为 |
客观说,这些只是提高分析成本,没有反调试、反虚拟机、代码自修改。脱壳加强制宽字符提取就能还原大部分行为,这也是它能当教学样本的原因。
(5)分类和理由
后门 / 木马,理由三条:
- 不自我复制:不感染 PE 文件、不改引导区、不自己传播,所以不是病毒、不是蠕虫。
- 主要功能是远程控制:建通道、收指令、传文件。
- 要靠用户执行才能装上:得先跑一次才能建目录、写注册表。
细分的话可以叫 RAT 型后门。
(6)功能相似的其他工具
- Back Orifice 2000(BO2K):1999 年的图形化远控,支持插件。
- Sub7:同期流行的 Windows 后门,能管文件、抓屏幕、记键盘。
- 灰鸽子:国内影响最大的 RAT 之一。
- PoisonIvy:轻量稳定的远控,同样是客户端—服务端结构。
- MSF 的
windows/meterpreter/reverse_http:把"HTTP 回连 + 执行指令"做成了标准载荷。 - PsExec / Radmin:本身是正规管理工具,常被当现成后门用,这次蜜罐里落地的
PSEXESVC、r_server就是。
(7)能不能查到作者
能,这次查到了:Raul Siles && David Perez。但有几个前提:
- 样本得是脱壳的。加壳时字符串被压缩,
strings什么都读不到。 - 字符串没加密。本样本作者名是明文宽字符;换成异或存储就只能靠代码逻辑或外部情报推。
- 元数据还在。
TimeDateStamp给出 2004-10-30,和字符串里"2004 年 9 月"对得上。 - 有外部资料佐证。样本里有
honeynet.org链接,作者身份能在项目文档里查到。
真实案件还要考虑作者留假名、抄别人代码、编译环境被别人控制。字符串里的"作者"只能当线索,不能当定案证据。
(8)五种检测方法
特征码检测。 挑稳定又唯一的字节串做特征,比如作者名、RaDa_commands.html、http://10.10.10.10/RaDa,或入口点的 60 BE 00 C0。优点是快、误报低;缺点是加壳、改名、重新编译就失效,本样本改节区名就是躲这个。
哈希黑名单。 拿 MD5 或 SHA256 去威胁情报平台查。优点是能精确认出已知样本;缺点是改一个字节哈希就变,只能覆盖那一个文件。
启发式检测。 不比具体字节,看像不像坏东西:节区名异常、导入 API 少但用了网络和注册表、字符串里同时有 download.cgi 和 CurrentVersion\Run。好处是能抓同家族变种;坏处是规则难写,也容易误伤。
沙箱动态分析。 放隔离环境里跑,看它建了哪些文件、写了哪些注册表、连了哪些地址。加壳样本在内存里一定是解开的,可以在入口点 dump 出明文。好处是绕开静态混淆;坏处是样本发现自己在虚拟机里就不干活。
流量和日志检测。 边界看 HTTP 行为:固定周期请求 /RaDa/RaDa_commands.html、往同一地址 POST /cgi-bin/upload.cgi;主机侧看进程创建、文件创建、注册表写入三类事件的时间关系。好处是能抓到已经在跑的样本、还能定位 C&C;坏处是要提前布点,加密流量也难认。
另外还能做内存取证:用 Volatility 的 malfind 找注入的可执行页、netscan 找残留连接。磁盘上是压缩的,内存里一定是展开的。
(五)任务四:蜜罐取证七问
(1)数据源
Snort 在蜜罐(172.16.134.191)上抓的 5 天流量,去掉了无关流量,IP 做了混淆。
capinfos 读出:54,000 个包、约 18 MB、时长 429,588 秒(约 4.97 天),从 2003-03-01 17:08 到 2003-03-06 16:27。
(2)IRC 和僵尸网络
IRC 是跑在 TCP 上的文本聊天协议。客户端连上先发 NICK(昵称)和 USER(用户信息)注册,服务器设了口令还要先发 PASS;回 001 表示成功,之后才能 JOIN #频道。端口常用 6667、6660–6669、6697,这次全走 6667。
僵尸网络是被集中控制的一批被感染机器,常用来打 DDoS、发垃圾邮件、当跳板、批量试密码、偷数据。蜜罐就是被装了 Bot 后自动连上频道,成了其中一员。
(3)通信过哪些 IRC 服务器
只看蜜罐主动发起的 6667 连接:
tcpdump -nn -r botnet_pcap_file.dat 'src host 172.16.134.191 and dst port 6667 and tcp[tcpflags] == tcp-syn' \
| awk '{print $5}' | cut -d'.' -f1-4 | sort -u
| 序号 | IRC 服务器 |
|---|---|
| 1 | 209.126.161.29 |
| 2 | 209.196.44.172 |
| 3 | 217.199.175.10 |
| 4 | 63.241.174.144 |
| 5 | 66.33.65.58 |
209.196.44.172 流量最大,频道交互基本都在它上面,第(4)问也以它为准。

(4)多少人访问了僵尸网络
两种口径互相验证。
口径一:服务器自报在线数。 过滤 tcp.port == 6667 && irc,再用 tcp contains "global users" 找到用户统计,字段是 Current global users 4752, max 4765,即在线 4752 人、峰值 4765。
口径二:JOIN/QUIT 去重。
tcpflow -r botnet_pcap_file.dat "host 209.196.44.172 and port 6667"
F=$(ls *06667*172.016.134.191* | head -1)
cat "$F" | grep -a JOIN | cut -d '@' -f2 | cut -d' ' -f1 | sort -u > 20242311_join_hosts
cat "$F" | grep -a QUIT | cut -d '@' -f2 | cut -d' ' -f1 | sort -u > 20242311_quit_hosts
cat 20242311_join_hosts 20242311_quit_hosts | sort -u | wc -l # 5581
得到 5581 台。
两个数不一样正常:4752 是某一刻的在线数,5581 是五天里进出过的总数;服务器自报的还包含其他频道的人;抓包两头各截断了一部分。综合看规模在五千台左右。
另外频道里昵称全是随机串(iooegwr、redmsopth),频道名也混淆过(#x◆◆◆◆◆◆◆x),是专门对付按关键字和昵称黑名单的检测。


(5)哪些 IP 攻击了蜜罐
tcpdump -nn -r botnet_pcap_file.dat 'dst host 172.16.134.191' \
| awk '{print $3}' | cut -d'.' -f1-4 | sort -u > 20242311_attackers.txt
wc -l 20242311_attackers.txt # 165
165 个。里面有扫描器、蠕虫,也有真想进来的,得靠第(7)问筛。

(6)攻击了哪些漏洞
| 协议 | 端口 | 次数 | 对应服务与典型漏洞 |
|---|---|---|---|
| TCP | 80 | 1107 | HTTP,Code Red、Nimda 类蠕虫扫描 |
| TCP | 139 | 84 | NetBIOS/SMB,空会话查点 |
| TCP | 99 | 43 | 扫描器随机端口 |
| TCP | 445 | 23 | SMB,口令爆破、远程建服务 |
| TCP | 1433 | 23 | MS SQL Server,弱口令 |
| TCP | 21 | 15 | FTP,匿名登录与弱口令 |
| TCP | 57 | 10 | 扫描器杂项 |
| TCP | 4899 | 10 | Radmin 远程控制 |
| TCP | 6129 / 110 | 9 / 9 | DameWare、POP3 探测 |
| TCP | 111 | 5 | RPC 端口映射查点 |
| TCP | 25 | 3 | SMTP |
| TCP | 4 / 3 / 2 | 3 / 3 / 3 | 扫描器杂项 |
| UDP | 137 | 65 | NetBIOS 名称服务查点 |
| UDP | 1434 | 55 | SQL Slammer 蠕虫(MS02-039) |
| UDP | 28431 | 2 | 扫描器杂项 |
归四类:Web 漏洞(80,主要是蠕虫)、SMB 与 NetBIOS 漏洞和弱口令(139、445、137)、数据库漏洞(1433、1434)、远程控制软件探测(4899)。

(7)哪些攻击成功了
判断"进没进去"看三个硬指标:认证成没成、有没有远程建服务、有没有后门文件落地。
① 认证成功:smb.cmd == 0x73 && smb.flags.response == 1 && smb.nt_status == 0x00000000
② 认证失败:smb.cmd == 0x73 && smb.nt_status == 0xC000006D
③ 远程建服务:svcctl.opnum == 12 (CreateServiceW)
④ 后门落地: frame contains "PSEXESVC" || frame contains "r_server" || frame contains "raddrv"
按 ① 得到 19 条成功响应,涉及 8 个主机:
| 攻击源 IP | 看到的事实 |
|---|---|
| 119.136.247.77 | 最早的一次成功认证(frame 292、413) |
| 66.139.10.15 | 认证成功,后面没看到写操作 |
| 210.22.204.101 | 成功 4 次;之前 7 次失败;之后写入 r_server/raddrv |
| 80.181.116.202 | 成功 1 次 |
| 209.45.125.69 | 成功 3 次 |
| 129.116.182.239 | 成功 3 次 |
| 61.111.101.178 | 成功 2 次;之后连续建服务写 PSEXESVC |
| 66.8.163.125 | 成功 3 次 |
按 ② 得到 77 条失败。
对照两份结果,210.22.204.101 既失败也成功,就是一条爆破链:先连试七次(frame 1309 到 1345)都失败,然后登录成功,紧接着注册服务。
真正装了后门的只有两台:210.22.204.101 上传并注册 Radmin,拿到图形化远控;61.111.101.178 注册 PSEXESVC,拿到远程命令执行。另外 6 台认证成功了,但没看到建服务或落文件,只能算认证成功。
原因是配置问题,不是漏洞:密码太弱,攻击者没用 exploit,直接 Administrator 加常见密码就进去了;445 端口对公网开着,认证和 RPC 调用不要前置条件;权限太高、补丁没打,一登录就能用系统自带的 CreateServiceW 把程序注册成服务。
这属于"合法功能被滥用":不用传漏洞代码,只用系统自带的管理接口就能装后门。对取证有启发——判断有没有被打进去,不能只看漏洞告警。这段流量里 80 端口 1107 次 SYN 全失败,真正打进去的是最不起眼的 445 弱口令,认证成功、建服务、文件落地这三类"正常操作"才是关键。



四、问题及解决方案
(一)样本解压后找不到 RaDa.exe
问题现象: Kali 里 file RaDa.exe 报 No such file or directory;Windows 里解压后也只有 rada_dump_.exe。
排查过程: 用 7z l 看压缩包内容,再查 Windows 安全中心的保护历史记录,发现 RaDa.exe 被判成 Backdoor:Win32/RaDa 隔离删除了。文件其实解压出来了,只是当场被处理掉,rada_dump_.exe 没命中特征才留下。
解决方法: 把 G:\网络攻防\实验4\ 加进排除项重新解压,再用 md5sum 和工具显示的哈希比对,确认同一份文件。
经验总结: 分析前先确认样本完整。杀软静默处理会让"明明解压了却找不到"反复出现,判断依据应该是文件数量和哈希,不是记忆。
(二)IDA 加载文件时只有 Binary file
问题现象: IDA 8.3 打开 crackme1.exe,对话框里只有 Binary file,没有 Portable executable for 80386 (PE)。
排查过程: 先查 loaders\pe.dll(存在,179 KB)、VC 运行库(齐),都正常。改用命令行 idat64.exe -B 测试,日志里所有插件都报"找不到指定的模块",退出码 4;把 IDA 复制到 G:\ida83 后 0 报错、正常生成 .i64。问题在路径里的中文(网络攻防\实验4\IDA Pro 8.3 汉化版…)让插件加载失败,PE 加载器根本没启动。
解决方法: 把 IDA 整体搬到 G:\ida83,删掉原目录,之后加载 PE 正常。
经验总结: 工具"少选项"往往不是设置问题,而是初始化就失败了。排查先看日志和退出码,别反复点界面;逆向工具尽量别装中文路径下。
(三)crackme2 改名后还是提示 I have an identity problem
问题现象: 文件已复制成 crackmeplease.exe,运行仍输出 I have an identity problem.
排查过程: 反汇编里比的是 argv[0] 和 crackmeplease.exe 全等,而 argv[0] 是实际调用名。少写 .exe 会失败;PowerShell 里写 .\crackmeplease.exe 多了 .\ 也失败。
解决方法: 改用 cmd,cd 到目录后直接敲 crackmeplease.exe,输出 We have a little secret: Chocolate。
经验总结: 看到 strcmp 先确认比的是 argv[0] 还是 argv[1]。argv[0] 跟调用方式绑在一起,换 shell 就会变。
(四)strings 提取不到网址和注册表路径
问题现象: strings -n 6 只能搜到作者名,http://、cgi、CurrentVersion 一条都没有。
排查过程: 样本是 VB6 编译的,字符串用 Unicode(UTF-16LE)存,每个字符后跟一个 00,ASCII 模式识别不了。
解决方法: 改用 strings -e l,网址、CGI 路径、注册表路径全出来了。
经验总结: 提取字符串要覆盖多种编码。只跑一遍默认参数就说"样本没有网络行为",很容易出错。
(五)Wireshark 找不到人数,dcerpc 字段也为空
问题现象: 按 tcp.port == 6667 && irc 过滤后搜 current global users,跳到的包展开只有一串乱码昵称;dcerpc.opnum == 12 结果为空;smb.cmd == 0x73 && smb.nt_status == 0x00000000 结果里大部分是 Request。
排查过程: 第一条命中的是 353(频道成员名单),本来就不含人数,一个 TCP 段里常常并排放着几十条 IRC 应答。第二条是这段 RPC 走 SMB1 命名管道 \PIPE\svcctl,字段挂在 svcctl 下。第三条是 SMB 请求包头部状态字段本来就是 0,不限方向就误命中。
解决方法: 人数改用 tcp contains "global users" 定位,再在详情里找 Command: global 那条(265),拿到 Current global users 4752, max 4765;建服务改用 svcctl.opnum == 12;认证加 smb.flags.response == 1 只留响应,再用 0xC000006D 做对照,得出 19 次成功、77 次失败。
经验总结: 过滤器跟解析层次走,封装协议的字段不一定在顶层。取不到值时,在详情面板右键该字段选"作为过滤器应用",让工具自己写,比猜字段名快。
五、学习感悟和总结
这次实验让我印象最深的是:很多时候不是工具不会用,是没判断清楚自己看到的是不是真的。
一开始 rada.rar 解压后找不到 RaDa.exe,我以为是解压方式不对,还想换工具、换目录。真实原因是 Defender 在解压瞬间把样本隔离了,只留下一个没被识别的 rada_dump_.exe。这让我知道,分析样本的第一步不是打开工具,而是确认样本完整。
第二个体会是特征可以被改。PEiD 这类工具靠节区名认壳,而 RaDa 的作者把 UPX0/UPX1 改成 JDR0/JDR1,DIE 只能给出 UPX[modified],真正定案的是超级巡警从入口点读出的 60 BE 00 C0 和 Markus & Laszlo。字符串也一样,不加 -e l 就看不到网址和注册表路径,很容易误判成"程序不联网"。检测手段得和对抗手段对上。
第三点是排错要看证据。IDA 只给 Binary file 时我在界面上点了几轮都没用,最后是命令行日志里"所有插件找不到指定模块"提醒我想到中文路径。
任务四的取证也纠正了我的直觉:我原以为被打进去一定是某个漏洞被利用了,但数据显示 80 端口 1107 次扫描全失败,真正成功的是 445 弱口令——攻击者用 Administrator 加常见密码登录,再调用系统自带的 CreateServiceW 注册服务,全程没有 exploit。这也让我明白为什么"合法功能被滥用"难防:它不触发漏洞告警,只留下认证成功、建服务、写文件这些看着正常的记录。
六、参考资料
[1] 《网络攻防技术与实践》