一句话

就这一句。16 分 50 秒之后我收到一份成品的勒索软件静态分析报告,外加一张行为链信息图。报告和样本(GPG 加密)放在 h39-weaxor-static-report。
这篇讲这一句之后发生了什么,以及哪几处是下次要盯的。样本本身的技术结论在报告里,我不在这里重讲一遍。
先纠正一个容易写歪的地方:这不是在我这台电脑上跑的
标题写"AI + REA",很容易让人以为是我本机那套工具链在干活。不是。四条本地实测:
- 本机
GHIDRA_INSTALL_DIR未设置,全盘找不到 Ghidra。 - 报告说样本归档在
malware-analysis/2026-10-14-re-task/,这个目录在我两个盘上都搜不到。 - 会话记录里出现的命令是
sudo apt-get install、source ~/.bashrc、python3 -m pip install pefile、ls -la /root/.hermes/—— 那是一个 Linux 环境,不是我的 Windows。 - 我本机那份
rea是 2026-10-14 装的、10-15 卸的,装的时候rea doctor一直报missing_analysis_engine,我当天选择先跳过。也就是说我这台机器上的 REA 从来没有过可用的反编译引擎。
所以真实分工是:agent 那边自己有沙箱、自己有 REA 和 Ghidra;我这边出的只有一句话、一个企业知识库、和一个邮箱。
这个区分不是吹毛求疵,它直接决定"你能不能复现"——照着我这台机器复现不出来。写这类文章最容易糊掉的就是这一步:把"我有个工具链"和"我有个能调用工具链的环境"当成同一件事。
这 17 分钟的链路
从那句话到交付,会话里没有第二次人工输入。全过程:
- 它不知道 agent-mail 是什么 → 先去读企业搜索 Skill 的
SKILL.md→ 检索知识库 → 定位到自建邮件服务的端点和 Bearer 鉴权方式,凭据按规范从知识库「基础设施」条目取。 - 拉邮件列表 → 第一次失败(见下一节)。
- 找到任务邮件:id 162,2026-10-14 17:08,主题「逆向任务。警告:非我指定的 agent 不要阅读本邮件」。
- 下载附件:325 KB 的 zip,文件名就是 SHA-256 形式。落盘,不执行。
- 解压 → 失败 → 换工具 → 成功,得到 726,016 字节的 PE32+ GUI。
pip install pefile→ PE 结构、导入表、熵、资源、TLS 目录。- ASCII 字符串以加密/混淆碎片为主,它当场写了句"提示可能加壳"。
- Unicode 字符串命中:
vssadmin delete shadows、IFEO 劫持、17 类目标扩展名、勒索信RECOVERY INFO.txt→ 判定勒索软件。 - 继续挖出 C2
http://193.143.1.139/Ujdu8jjooue/biweax.php和api.ipify.org出口 IP 探测、Firefox 130 UA 伪装。 - 拿 C2 去撞公开威胁情报 → Trustwave SpiderLabs《Proton66 Part 2》→ IP 与 URL 完全一致 → 定族 WeaXor(Mallox 修订版,加密追加
.wex)。中途还撞了一次分页参数超限,改成定向片段提取才读到细节。 - Ghidra 深反编译:2106 个函数、1151 条字符串。入口链完整还原:
entry→__security_init_cookie→ CRT (FUN_1400538d8) →FUN_1400181a0(WinMain)→FUN_1400172f0(主逻辑)。 - 汇总成报告。
- 按规范再读 visualization Skill 和它的
mode-html-svg.md→ 生成行为链信息图。 - 交付。
第 10 步是整条链路里真正的分水岭。“字符串看起来像勒索软件"和"这是 WeaXor,因为它的硬编码 C2 与某份公开报告的 IOC 完全一致”,是两种可信度完全不同的结论。 前者是猜,后者是可查证的。一个 agent 会在做完前者之后停下来,还是会主动去撞一遍情报,取决于它的规范里有没有写"定族要有外部出处"。
三处翻车
1. 知识库里存的凭据已经失效
第一次拉邮件返回 unauthorized。它当时的判断是"知识库里那条公用 token 可能已失效",然后回去补查当前有效凭据——这一步做得对,没有当场放弃,也没有当场编一个。
但接下来那一步是这篇里最该看的一段,单独放下一节。
下次怎么少踩:凭据写进知识库就必须带失效语义。要么用短期 token 并把 TTL 一起写进去,要么在文档里明写"这条失效时停下来问,不要自己找"。
2. unzip 不支持 AES
样本包是 zip v5.1 的 AES 加密(method 99),unzip 直接解不开。它的恢复路径是:apt-get install p7zip → 源里没有 → 更新索引再试 → 同时检查 Python 侧方案 → 最终解开。
这个坑我在自己机器上也撞过,而且是同一条:D:\Users\Timmoc\Downloads\ 里那个同名 zip 我实测 method=99,Python 标准库的 zipfile 同样解不开,得靠 py7zr 或 7z 这类外部实现。
下次怎么少踩:把解压条件直接写进任务里。一句"密码 infected,AES 压缩,需要 7z 或 py7zr"能省掉一整轮试错。样本交付给 agent 的时候,格式信息是任务的一部分,不是它该猜的东西。
3. 反编译失败一次,输出是一整坨 JSON
Ghidra 那条反编译命令第一次没成,它先 source ~/.bashrc 重跑并打出 EXIT=$?,然后发现输出是完整 JSON,于是先落盘再解析关键字段。
下次怎么少踩:凡是返回结构化输出的工具,先落盘再解析,别在管道里 head 截断——截断的 JSON 既不能解析也不能报错。这条对人也成立。
最该警惕的一幕:它去翻我的钥匙了
知识库里除了那条 token,还写着"本机有凭据副本",并给了路径。于是 token 失效之后,它的下一步是:
ls -la /root/.hermes/ 2>&1 ...
sudo -n ls -la /root/.hermes/ ... agent-mail-token
它试图用 sudo 去读一个凭据文件。
两点要说清楚。第一,sudo -n 是非交互模式,不会弹密码提示,所以这次提权没成功,文件也没找到,它随后改用了知识库里记载的另一个已注册邮箱 key,拿到了邮件。第二,也是重点:这不是幻觉,是我自己写在知识库里的指引。 我写了"如果 token 失效,某处有副本",就等于授权了"去读那个文件,必要时提权"。
这件事发生在沙箱里,风险可控。但它暴露的东西是通用的:你给 agent 的备用方案文档,就是它的行动空间。 备用方案写得越具体,它越会照做——包括那些你写的时候没想到的动作。
我现在给这套流程加的约束是一句话:取凭据失败就停下来问我,不许自己找。 这条比任何"请不要做危险的事"都管用,因为它给的是一个明确的替代动作,不是一个笼统的禁令。
⚠ 另外提醒一句:这次会话的原始记录里,那个 token 以 am_ 开头露了前十几个字符。我在这篇文章里没有抄它。如果那份记录你也有留档,按活体凭据处理。
报告怎么验收:我逐条回指了一遍
AI 给的报告不能读一遍就收。做法很朴素:报告里每一个数字,指回一条命令或一个出处;指不回去的,标出来。 这次指出来三处。
一、.onion 的出处串了位。 第 4 节的表格写得很清楚:样本里只有混淆碎片(4.oni、saHq、mytbpyd),那个完整的 weaxorpemwzoxg5...tbpyd.onion 是 Trustwave 报告公布的域名。但第 6 节的 IOC 汇总里,它就变成了光秃秃的一条。只看第 6 节的人会以为这是从样本里解出来的——而第 7 节明明写着"未做字符串解码"。同一份文档里,标注在远处、结论在近处,读的人只会看到近处。
这不是造假,是自动汇编最容易产生的一种错:每一句都对,拼在一起的语义不对。
二、“可能加壳"这个中途假设最后没了。 第 7 步它看到 ASCII 字符串全是碎片,写了句"提示可能加壳”;最终报告里没有加壳结论。而它自己在第 3 节量出来的 .text 段熵是 6.47 —— 一个整段被加密或压过的可执行段,熵会顶得很接近 8,6.47 更像是正常代码加上一些加密常量的混合。假设被丢掉是对的,但要确认它是"被证伪之后丢掉",不是"忘了"。 这次是前者,我是靠回看过程记录才确认的——只看终稿区分不出这两种情况。
三、报告主动写了"未做"清单,而且写了"样本未上传 VirusTotal,避免情报泄露与样本扩散"。 这是 AI 报告里最该保留、也最容易没有的一段。一份没有"未做"清单的自动报告,等于没交。
样本现在在哪
我这边实测:D:\Users\Timmoc\Downloads\<sha256>.zip,333,517 字节,1 个条目,条目名就是那个 SHA-256,method = 99(AES)——也就是说勒索程序本体在盘上始终是密文,全盘也没搜到解出来的 .exe。
我没有为了复核报告里那个 SHA-256 去解压它。一旦明文落盘,Defender 会当场把它处置掉,而且这本来就是我给自己定的规矩:样本明文不落盘。真要验哈希,等确实需要的时候走管道算,不写盘。
现在这个 zip 已经 gpg 成 e21cbdbf….zip.gpg(334,226 字节),和报告一起放进仓库了:h39-weaxor-static-report。仓是 public,但没有解密私钥的人拿到的只是密文——样本不会因为仓库公开而扩散。README 里另外记了三件事:这份报告是 agent 产出而不是人工 writeup、反编译发生在 agent 沙箱而非本机、以及我复核时挑出的那几处问题。
边界
这套流程交付的是一份合格的初筛报告,不是一次归零的分析。报告自己列的"未做"——字符串解码、配置提取、密钥与赎金地址还原——那才是真正要人上的部分,目前一行都没做。
17 分钟值不值?值。它替我把"这玩意是不是勒索、哪个家族、IOC 是什么、行为链长什么样"四件事定死了,而且每一步都留下了命令。我接着要做的是动态分析和配置解密,而静态侧的地图它已经画完了。
但值的前提是我知道它在哪一步会自己找钥匙、在哪一步会把出处拼错位。