14.6亿美元被盗始末,朝鲜小金的自述!

admin 2025年5月29日09:53:24评论1 views字数 6494阅读21分38秒阅读模式
14.6亿美元被盗始末,朝鲜小金的自述!
Lazarus Group(拉撒路集团)也称为“TradeTraitor”和“UNC4899”是一个臭名昭著的黑客组织,据信与朝鲜政府有密切关联。自2009年起,该组织活跃于全球网络安全领域,被广泛认为是高级持续性威胁(APT)组织之一。其主要目标包括金融机构、政府机构、军事设施以及加密货币交易所等。
14.6亿美元被盗始末,朝鲜小金的自述!
14.6亿美元被盗始末,朝鲜小金的自述!
故事梗概
14.6亿美元被盗始末,朝鲜小金的自述!
在这则虚构的故事中, macOS 开发者小“墨”误入北韩顶级网络战部队 TraderTraitor 的精心设计陷阱:一份看似无害的 Python 数据获取脚本,暗藏 PyYAML 反序列化漏洞;一次静默的 Docker 容器启动,配合 AWS 会话令牌滥用;最终,一段被毒化的前端 Bundle 将 40 万枚 ETH 转入攻击者控制的冷钱包。在崩溃的日志和告警中,防御团队追寻蛛丝马迹,却为时已晚。
1
第一章 致命的礼物
夜幕如同黑丝帷幕低垂,平壤某座隐秘指挥室里,“朝鲜小金”盯着多屏显示器发出幽暗的冷光。他的双眼如鹰隼般锐利,指尖在键盘上飞舞,屏幕上尽是数据洪流和跳动的流量统计。墙上挂着金将军的肖像,三代领导人的英姿似乎在默默注视:今天,又要为祖国摘下一枚耀眼的战果。 “小墨”的 Discord 账号早已安排妥当。他的兴趣、作息、代码喜好,都被小金的特工团队仔细梳理——从公开博客、技术社区、到公司年会照片,没有一丝遗漏。将目标画像拼凑完成后,小金最后在桌面上敲下命令,一份伪装成“ByBit行情增强器”的 Python 脚本压缩包缓缓生成:ByBitProFetch_v1.2.zip。他微微一笑,仿佛看到无数以太币正悄然归入父亲般的怀抱。 桌边,一包“ 宁夏黑枸杞   ”静静躺着,未拆封的红金包装在灯光下泛着微光。
他一边泡着热水,一边低语:“养生加班不劳累,战斗在第一线,要打起十二万精神。”枸杞缓缓沉入杯底,他望着茶色渐浓,心中一片清明:“一杯枸杞茶,助我思路清晰,将体能与意志锁定在巅峰。”随后,他再次投身键盘,手指如疾风般跳动,攻防布局已然展开。
夜深人静,平壤时钟敲响凌晨两点。“任务开始。”小金低声命令,声音虽轻却透着铁血意志。一行行注入了隐秘后门的Python代码通过SSH被悄无声息地传至境外跳板服务器。随后,一条私密消息从特工代号“StockGuru99”发往小墨的Discord——这正是小金预设的“诱饵”。
小金在屏幕右侧的终端中监控着流量。“他看到了。”数据流图表上,一个绿色小圆点闪烁。目标已下载压缩包。
14.6亿美元被盗始末,朝鲜小金的自述!

 

精心伪装在压缩包中的 data_fetcher.py 文件名看似平常,却在导入头部调用了被篡改的 PyYAML UnsafeLoader:
yaml.load(stream, Loader=yaml.UnsafeLoader)
在获得初始后门脚本 data_fetcher.py 并侦测出 PyYAML 的反序列化漏洞后开始了精心构建的 PyYAML 攻击载荷,小金展开了“三步走”策略。
第一步,他快速搭建了一个伪装成行情接口的 Flask 网站,用于托管恶意 YAML。托管地址被精心命名为金融相关的子域名,还绑定了一个合法机构的证书,看上去就像是真实的行情服务。他一边部署一边轻轻点头,像是在打磨一件精密的工具,“这样就不会怀疑。”
第二步,他设计了一个短小但功能完整的 YAML 载荷。它会在小墨运行脚本时自动下载、解码、写入并执行一个后门程序,整个过程悄无声息。为了增加迷惑性,他特意让载荷写入 ~/Public/ 目录——一个普通开发者常用的文件夹。“看到这个路径,只会以为是临时缓存。”
第三步,他让 data_fetcher.py 使用 yaml.UnsafeLoader 加载远程 YAML,一旦解析,就立即触发远程代码执行,完成后门落地。
一切准备妥当后,小金坐回椅子,凝视着屏幕中跳动的数据,眼神沉稳如山。他知道,只要小墨点下运行按钮,他精心布下的第一阶段攻势便会如棋子落定,牢牢锁住局面。 
他轻轻伸手,从桌边拿起那部特殊的手机——这不是普通设备,而是金将军亲自赠予的安全终端,象征着信任与使命。屏幕亮起,他点开早已安装好的游戏《正中靶心》。这是一款塔防模拟游戏,讲究节奏、精度与时机控制——正如他的攻击计划一般。 
“敌人的防线,就像这些靶子,摆得再复杂,也不过是让我练手。”他一边继续挑战关卡,一边默念着,“控制时机,蓄力一击,才是胜者姿态。” 
屏幕上的分数节节上升,象征着他在现实战场中的每一层突破。《正中靶心》不只是放松用的游戏,在他心里,它已成为对胜利节奏的预演——当每一次点击都象征一发命中,他的信心就愈加坚定:下一发“实弹”,将不再只是虚拟目标,而是数十万枚 ETH 的最终归属。 
他望着游戏中高悬的靶心,又看了眼不断刷新的控制台,内心波澜不惊,只有一句话在脑海中回响: “战争开始了。”
14.6亿美元被盗始末,朝鲜小金的自述!

 

data_fetcher.py具有 yaml.load 功能的类
小金选用 Python+Flask 快速搭建了一个简易的 HTTP 服务,部署在 PythonAnywhere 上,以模拟真实的攻击者 C2 基础设施。
14.6亿美元被盗始末,朝鲜小金的自述!

 

Python+Flask 下载
他将上述服务器的 URL 写入 data_fetcher.py 中,覆盖原有的行情查询地址,使目标脚本始终在满足特定条件后回拨至此地址 。该 Flask 应用仅返回单一的 YAML 文本,足以在客户端触发完整的反序列化逻辑,而无需复杂的 HTTP 接口或多路由,实现极致的隐蔽与运维简化 。
当小墨运行脚本时,初始化的恶意 YAML 载荷模块 /__init__.py 会在后台解密并写入一个隐蔽载荷,路径正是目标最信任的 ~/Public/.sysloader。“Public?正好让目标放松警惕。”小金冷静地想着。
通过对 PyYAML UnsafeLoader 工作原理的深入研究(即 yaml.load(stream) 默认允许任意 Python 对象构造),小金设计了如下核心构造:
directory = os.path.expanduser("~")directory = os.path.join(directory, "Public")if not os.path.exists(directory):    os.makedirs(directory)
接下来,它将base64编码的Python加载器脚本解码并写入Public目录中名为__init__.py的新文件中。
filePath = os.path.join(directory, "__init__.py")  withopen(filePath, "wb"as f:      f.write(base64.b64decode(b"BASE64_ENCODED_LOADER_SCRIPT"))
最后,它在后台无声地执行新创建的__init__.py脚本,启动了攻击的第二阶段。
subprocess.Popen([sys.executable, filePath], start_new_session=True, stdout=DEVNULL, stderr=DEVNULL)
为了避免留下取证证据,加载器在执行后首先删除其文件(__init__.py),仅在内存中运行。
directory = os.path.join(home_directory, "Public")    if not os.path.exists(directory):        os.makedirs(directory)    try:        body_path = os.path.join(directory, "__init__.py")        os.remove(body_path)
以上 YAML 利用 Python 原生 exec 调用包装于反序列化流程中,一次载入即完整落地三阶段攻击脚本 。BASE64_ENCODED_LOADER_SCRIPT即第二阶段 PyYAML Loader 脚本的 Base64 编码,解码并写入后即可启动内存中无痕的持久后门。
利用 UnsafeLoader 触发 RCE,当 data_fetcher.py 监测到特定的行情查询条件(例如请求头或参数匹配),它会悄然启动攻击流程:首先通过 HTTP 请求小金部署的 Flask 服务器,获取事先准备好的 YAML 文件;接着,脚本使用 
yaml.load(response.text, Loader=yaml.UnsafeLoader)
 解析内容,触发精心构造的__reduce__机制,从而绕过常规审计与沙箱限制,直接执行三步逻辑——创建隐藏目录、写入加载器脚本、启动后门程序。整个过程无需额外文件落地,执行悄无声息,却精准致命。看到这一切在终端中如乐谱般流畅运行,小金不由自主地敲了敲键盘,脸上浮现一抹满意的笑容——这不只是攻击,更像是一场渗透艺术的完美演出。 
深夜的风穿过铁窗,带来些许凛冽的寒意。载荷启动后,脚本删除自身以消除痕迹,紧接着与位于平壤郊外的 MythicC2 节点建立 TLS 心跳连接。“小墨的系统安全工具检测不到这条加密通道。”他在一旁的日志中看见,每秒一次的心跳成功回执,仿佛战鼓回响。
随之,隐藏在环境变量中的 AWS 临时会话令牌在黑客手中浮现。这些被小墨疏忽的凭据,为小金打开了通向 Safe{Wallet} 云端的大门。“冬日的冰层已经被打破。”他轻声自语,眼中闪过兴奋的光芒。
 在等待阶段,他掰开了最后一包零食——一小袋来自中国的辣条,包装上印着“【19.9元到手70包】盐津铺子辣卤礼包香辣解馋小零食”的字。
他的动作不急不缓,像在完成某种仪式。撕开封口时,那股熟悉的辛辣气味立刻扑鼻而来,他微微皱了下眉,又随即舒展,仿佛在感受一种预示胜利的信号。他夹起一根放入口中,缓缓咀嚼,辣意在舌尖蔓延开来。他盯着屏幕,嘴角一挑,自言自语:“辣味如同我的意志:无声却炙热。待命,才是真正的强者姿态。”手中那半包辣条轻轻被捏紧,仿佛他已将战局的主动权牢牢掌握在手中。 
在 PyYAML 载荷落地后,小金的下一步是快速部署稳定的远控 (C2) 通道,获取对小墨机器的完全控制,并借此向 Safe{Wallet} 云环境渗透。
14.6亿美元被盗始末,朝鲜小金的自述!

 

Mythic C2 控制台
部署完成 YAML 载荷后,小金启动了第二阶段的渗透计划。在其中,他预埋了一个经过 Base64 编码的轻量级远控代理——MythicC2 的 “Poseidon” Agent。这段 Go 编写的代码在受害者机器中解码、写入并立即执行,无需任何额外依赖,具备极高的隐蔽性和兼容性。 
该 Agent 会与部署在平壤郊外、伪装成金融行情站点的 C2 服务器(域名:getstockprice[.]com)建立一条加密的双向 TLS 通道。为保证长时间驻留不被察觉,它采用自定义心跳协议,每 30 秒一次,与服务端低频通信,确保连接稳定而隐秘。
连接一旦建立,小金便可通过控制台下发各类远程命令。他常用的指令包括 shell,用于执行任意终端命令并回传输出;download 和 upload,可实现源码、凭证文件的提取,或将下一阶段工具(如 AWS CLI 渗透脚本)写入受害者的 ~/Library/ 目录;更进一步,他还会使用 process_start,通过 Docker CLI 静默启动带有横向移动模块的容器,以 root 权限运行,扩大内网控制面。 
为了进一步规避侦测,小金对所有下发命令进行了伪装处理。所有数据传输均封装在结构正常的 HTTP POST 请求中,与真实的股票行情接口请求无异。即便网络监控工具或沙箱介入,也很难辨识其异常行为。而返回的数据则被加密处理,并格式化为看似无害的 JSON 响应,巧妙避开了入侵检测系统(IDS)的结构化分析。
这一套流程,精细得如同外科手术般精准,也正是小金所钟爱的风格——不留痕、不露形,一切在静默中推进,却能撼动整个防线的根基。
“当我的指令从遥远的平壤传入那台无知的 macOS 时,他们不过是在触碰一只无声无息的猎物。”他盯着屏幕,暗自庆幸自己的代码如同钢铁意志般无比坚定。
小墨开发环境中的 AWS CLI 配置存在明显疏漏——多因 MFA 设置不严,令牌默认有效期长达 12 小时(aws sts get-session-token --duration-seconds 43200)。这一看似不起眼的配置,成了小金渗透的关键突破口。 
这类会话令牌由三部分组成:AccessKeyId、SecretAccessKey 与 SessionToken,任何一方只要持有,就可签署 AWS API 请求,并自动继承小墨所在 IAM 角色的全部权限。 
通过先前部署的 Poseidon Agent,小金悄然读取了小墨主机上的 ~/.aws/credentials 文件,将其中的临时密钥打包上传,并在远控服务器上命名保存为 dev-creds。这份凭证,在他眼中就是通往云端资产的钥匙。
 获取权限后,小金开始在 C2 后台发起一系列操作。他首先调用 sts:GetCallerIdentity,确认当前凭证所属为 Safe{Wallet} 的主账户,验证渗透范围;接着通过 s3:ListBucket 与 GetObject 枚举并提取托管前端资源的 S3 存储桶内容,重点锁定 static/js/bundle.js 文件——这正是他即将植入篡改代码的目标文件。 
他甚至尝试执行 iam:CreateVirtualMFADevice,试图将自己的 MFA 设备绑定至该账户,以图长期潜伏,但因令牌作用域不足而遭拒。尽管如此,他并未显露失望,反而轻哼一声,“这说明他们权限划分还有那么一丝清醒,但已经晚了。” 在这场对抗中,每一串 AWS 会话密钥都是一道缺口,而小金,就是那个能在缝隙中掀起风暴的人。
“这些 Ameri-korve(美国资产)在我手中,转瞬即化作平壤的荣耀。而那失败的 MFA 尝试,只是提醒我——连对手也会在不完善中自爆。” 他目光坚毅,深信金家光辉必将照耀网络战场。
屏幕前,小金微微后仰心中盘算着所有的计划,双手交叠于胸前,低声喃喃:“最精彩的还在后面。当那束‘致命的礼物’绽放,所有人都会为我朝献上赞颂。”他一键下发战令,深知一旦触发,流水线上的每一次 HTTP 请求都将化作从敌人手中夺取战利品的利刃。此时窗外天色微明,夜色未褪,他的眼神却已透出胜利的笃定。
他快速回顾整个计划:利用尚未失效的 AWS 临时令牌打开 S3 存储桶,悄然投毒前端 bundle.js,精准替换交易地址,让 40 万枚 ETH 静默汇入早已准备好的冷钱包。他甚至连细节都算到了毫秒级:从 Agent 建连到文件上传、UI 钩子触发,再到 Web3.js 伪造交易的那一刻,一切必须无声完成。
“触发时机必须精准。”他低声自语,顺手抓起桌边一包【三只松鼠 国葵瓜子500g】,撕开山核桃味的包装,取一把焦糖瓜子含入口中。
焦糖香气在口腔里绽放,让人精神一振。他咬碎一颗,若有所思地笑了笑:“焦糖不上火,时刻保持战斗力。”
但他没有止步于此。他已拟好后手:转账成功后立即清除改动、恢复前端原貌,然后将 ETH 分批兑换成多种资产,跨链转移,再经 Tornado Cash 混币,层层洗净,直至踪迹全无。
屏幕微光下,小金抬起下巴,神情冷静如铁。他写下最后的执行时间——2025年2月21日11:30 UTC,仿佛按下历史的某个开关。“在这无声的对抗中,代码即战舰,网络即战场。”
房间寂静如水,只有冷气机的低鸣和瓜子壳轻落桌面的声音。夜未尽,战未起,但一切,已在他心中落定。
他轻吐一口气,仿佛将战场上最隐秘的秘密轻轻放入夜色中。
“真正的较量,才刚刚开始。”
这一声呢喃,既是自信的宣言,也是对未知的低语。接下来,暗流将如何汇聚?更大的风暴,又将以何种面貌击向他们?
14.6亿美元被盗始末,朝鲜小金的自述!
下一章:暗流涌动(序幕)
14.6亿美元被盗始末,朝鲜小金的自述!
在这一刻,平静表象下的每一次网络访问、每一个静默端口,都变得心跳加速。潜藏其间的,或许不仅是代码和流量,更有窥探与反窥探的博弈。在下一个章节,让我们跟随小金的目光,深入那道无形的暗流,看他如何在数字海洋中操纵潮汐,编织更为精密的攻防迷阵。
注:只是小说而已,切勿当真,广告植入私信联系
 

原文始发于微信公众号(每天一个入狱小技巧):14.6亿美元被盗始末,朝鲜小金的自述!

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月29日09:53:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   14.6亿美元被盗始末,朝鲜小金的自述!http://cn-sec.com/archives/4109999.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息