一环扣一环的求职骗局,从简历投递到内网隧道完整入侵
原创
黑鸟
黑鸟
黑鸟
2026年10月7日 23:29
广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
2026年3月,伊拉克某关键基础设施行业的一位软件工程师收到一封来自“迪拜机场IT部门”的邮件。对方语气正式,说看中了他的背景,邀请他参加一个在家完成的编程测试,题目是一个用C#写的航班管理系统。
这听起来再正常不过。求职者用Visual Studio打开工程,点一下生成,顺手修一个故意写错的for循环。整个过程顺理成章,没有人会想到,就在工程被加载进IDE的那一刻,一段恶意代码已经在后台悄悄跑起来了。
这个攻击活动被unit42安全团队命名为Blinder Tunnel行动,组织名为CL-STA-1178/The Shelby Strategy。它不是普通的黑客骚扰,而是一次有国家背景、横跨中东、精心伪装长达数月的定向攻击。攻击者给自己的整套工具起了一串共同的名字,全部来自英剧《浴血黑帮》(Peaky Blinders),连片头曲都被塞进了恶意软件里。
攻击全貌:从假招聘页到内网隧道
图1:Blinder Tunnel行动整体脉络,入口伪装成机场Wi-Fi登录,三步执行链落地ShelbyLoader V2,C2流量绕道GitHub
整张图勾勒出这次行动的骨架。入口是一个伪装成机场招聘的社会工程陷阱,接着是三步执行链,最后落地到一个叫ShelbyLoader V2的加载器。命令与控制(C2,Command and Control)流量不直连自己的服务器,而是绕道GitHub。图的下方还能看到,并行的另一条钓鱼线复用了同一批IP。
Blinder Tunnel是该组织在2026年的一次升级,换了全新的免杀手法,目标也直接对准了伊拉克的关键基础设施。基础设施搭建最早在2025年11月就开始了,一直蛰伏到2026年3月才正式激活。
第一步:假招聘门户网站
图2:伪造的“Dubai Airports Careers”登录页,配色、Logo、阿拉伯语一应俱全
攻击者伪装成迪拜机场HR,先让目标下载一个叫Dubai Airport Careers的安装包。这是个Inno Setup安装程序,装完弹出一个本地离线网页,用户名、密码输入框、金色登录按钮做得有模有样,右上角还配了阿拉伯语。目标要用“招聘方”给的账号密码登录,体验完全模拟真实门户。
图3:登录后是一份十道题的HR问卷,问求职动机、相关经验、抗压能力
登录进去是一份十道题的HR问卷,问你为什么对这个职位感兴趣、相关经验、优缺点、怎么应对截止日期。目标认认真真填完提交。
关键在于,这一步什么坏事都没干。不回连服务器,不外发数据,不执行任何恶意代码。它的唯一目的就是建立信任,让受害者觉得“这就是个正经招聘流程”,从而放下戒心,等着下一步的笔试。没有网络活动、没有后台通信,恰恰是这个阶段最“安全”的地方。
这里要说明一点:迪拜机场本身并没有被攻破,系统里也不存在漏洞,攻击者只是冒用了它的招牌。
第二步:编程题本身就是武器
图4:Readme.md开头直接称呼目标全名,自称迪拜机场IT高级经理,布置15到20分钟的在家测试
到了4月,同一条线索带来了第二阶段。这次发来的不是恶意链接或文档,而是一个Visual Studio工程压缩包,名字叫DubaiAirport\_Carrers\_IT\_Test.zip。注意Carrers拼错了,正确拼写应该是Careers,但这种小瑕疵在匆忙的求职季里很容易被忽略。
包里的Readme.md直接称呼目标的全名,自称是迪拜机场IT部门的高级经理,让对方在IDE里打开这个C
Flight Management System工程。理由冠冕堂皇:考察你的问题排查和调试能力,在家做,预计15到20分钟。
图5:恶意压缩包内的工程结构,Resources文件夹里藏着真正的载荷
工程里真的埋了一个bug,后端某个C#方法的for循环跳过了最后一个元素。一个有经验的工程师看一眼就能修。问题在于,你根本不需要等到“编译运行”那一步。
三步感染链:你打开工程的瞬间,后门已经落地
这是整个行动最值得技术人玩味的部分。攻击不靠宏、不靠钓鱼附件,而是借微软开发者自己的合法工具完成。一旦.csproj被加载,链条立刻推进到AppDomainManager劫持,最后以DLL侧加载收尾。
第一击:被篡改的.csproj文件
图6:恶意.csproj里的XML,红框依次是建目录、复制Resources文件、启动RuntimeBroker.exe
.csproj是C#工程的配置文件,Visual Studio一打开工程就会读它。攻击者在里面写了一段自定义XML,名字叫GetFrameworkPaths。
这招非常巧妙。开发者打开工程时,Visual Studio会在后台做一次设计时构建(design-time build),用来解析依赖、激活各种功能。在这个初始化阶段,它会原生执行一个叫GetFrameworkPaths的命令。攻击者把自己的恶意Target也命名成这个,于是msbuild.exe这个微软官方生成工具,在受害者完全不知情的情况下顺理成章地跑了那段XML。
图里红框标出的就是干的三件事:建一个目录%LOCALAPPDATA%\Microsoft\RuntimeBrokers,把Resources文件夹里藏着的恶意文件复制进去,然后启动RuntimeBroker.exe。等受害者还在对着Readme.md读题目要求时,加载器已经在后台跑起来了。MITRE把这类手法归类为Trusted Developer Utilities Proxy Execution,用大白话讲就是“借可信开发者工具的壳干活”。
第二击:劫持AppDomainManager,顺手关掉监控
图7:RuntimeBroker.exe.config内容,嵌入的恶意行包括etwEnable设为false和appDomainManagerType
msbuild启动的是一个带微软签名的合法进程vshost.exe,攻击者把它改名成RuntimeBroker.exe。程序一跑,AppDomainManager劫持就开始了。
做法是改旁边那个RuntimeBroker.exe.config配置文件。.NET程序启动时会读这个config,里面指定了用哪个AppDomainManager。攻击者把默认启动管理器换成自己的恶意版本,等于在宿主程序还没真正跑起来之前,就把完整执行权抢到了手里。ShelbyLoader V2这个后门就这样藏在一个带签名的可信进程里运行。
更阴的是config里加了一行。ETW(Event Tracing for Windows,Windows事件跟踪)是安全产品监控程序执行、发现内存里恶意行为的关键传感器。关掉它,等于进屋之前先把监控摄像头掰歪。
图8:Resources文件夹里的恶意文件清单,红框注释标明了各自与ShelbyLoader V2、ShelbyC2 V2的关系
第三击:DLL侧加载
图9:Cortex XDR把触发DLL侧加载的.slnx文件标成高危,在用户交互之前就拦下
最后一步是DLL sideloading(DLL侧加载)。RuntimeBroker.exe是从微软正常二进制改名来的,它在加载DLL时有固定的搜索顺序。攻击者把一个恶意DLL叫RuntimeBroker.dll放在它旁边,程序启动时就会顺手把这个恶意DLL加载进内存。
这类攻击的防御思路其实不复杂:盯住那些在系统目录之外加载了陌生DLL的进程。图里就是XDR在用户还没做任何操作之前,就把那个触发DLL侧加载的根.slnx文件标成高危并拦下。
图10:完整执行链被XDR记录并阻断,五个进程依次拉起,从zip文件到RuntimeBroker.exe加载DLL
攻击者的工具箱:模块化、多阶段、活在云上
这一套东西不是单个木马,而是一个模块化的多阶段架构,为持久化、远程命令执行和内网横向移动而设计。核心组件四个:
- ShelbyLoader V2:主加载器,用GitHub Issues当C2备用通道
- PsProxy.dll:PowerShell执行引擎
- ShelbyC2 V2:主后门
- Blackwood:跑在内存里的Chisel隧道加载器
所有.NET二进制都用开源混淆器Obfuscar加过壳,靠运行时字符串解密和不可打印的Unicode字符做类名、方法名,专门对抗逆向分析和自动化静态扫描。
ShelbyLoader V2:两个定时器撑起来的持久化
图11:攻击者2026年4月16日在GitHub留下的评论,正则用于定位评论,后面跟着加密的备份C2数据
RuntimeBroker.dll就是ShelbyLoader V2,是更早版本ShelbyLoader的升级版。它干四件事:当加载器、建持久化、给被感染主机做指纹、和C2通信。它是整个战役的入口,先跑一遍反分析检查,再建立通信,然后下载并解密第二阶段载荷。
它内部有两个定时器。一个每120秒跑一次持久化,在注册表CurrentVersion\Run下面建一个叫MicrosoftRuntime的键,指向那个RuntimeBroker.exe,实现开机自启。这个状态会回报给C2,一共四种:已持久化、新持久化、注册表键没找到、可执行文件没找到。另一个每63秒跑一次beacon(信标),这是主C2循环。
信标逻辑很有意思。它拿着一个写死的GitHub Personal Access Token(PAT,个人访问令牌),去peakyblinders-tm/myLic这个仓库,把一台机器的指纹Base64编码后上传到/{machineId}/Lic.txt。machineId是怎么算的呢?把字符串“Peaky Blinders 2.1”拼上机器指纹,做SHA-256哈希,取前16位小写十六进制。
注册成功后,它就轮询同一目录下的Inf.txt,下载里面Base64编码的命令,解码执行,干完再回传一个带SHA-256的回执并清空仓库文件。万一GitHub API返回403限流,它就乖乖睡一小时。为了防沙箱,它还会查WMI、跑着的进程、注册表、文件痕迹,核对CPU、内存、磁盘,甚至要求自己必须是explorer.exe生出来的才干活。
GitHub Issues当备用C2:被删了也能活
万一那个PAT被吊销,或者主通道返回401未授权,加载器会启动备用方案:dead-drop resolver(死投解析器)。
它用当天日期yyyyymmdd拼上仓库ID,去搜GitHub Issues,把匹配issue的评论全拉下来,从HTML注释标记之间抠出加密内容。这段密文用AES-256-CBC解密,密钥是当天日期字符串拼上machineId做MD5,IV也由这个密钥的MD5派生,再迭代五轮。解出来之后用三条正则更新C2:Owner、LicRepo、LicToken。
换句话说,哪怕GitHub把主仓库端了,攻击者只要在某个不起眼的issue评论里留一段加密文字,被攻陷的机器就能自己找到新的指挥位置。而且这段密文离开目标机器独有的machineId根本解不开,研究人员只能根据时间线推测,2026年4月16日那条评论就是一枚备用C2。
PsProxy.dll:不碰powershell.exe也能跑PowerShell
图12:PsProxy.dll在攻击链中的位置,作为ShelbyC2 V2的内存内执行模块,劫持PowerShell核心引擎
安全产品盯PowerShell,主要是盯着powershell.exe这个进程。PsProxy.dll的思路就是绕开它。
它不去启动powershell.exe,而是直接hook进PowerShell的核心引擎System.Management.Automation.dll,在被劫持的宿主进程里起一个看不见的runspace(运行空间,一个自包含的执行上下文)。脚本直接在内存里跑,不落盘,不起可疑进程,还和主C2隔离开,脚本崩了不影响后门。服务器发来命令,主载荷把原始脚本丢给这个代理执行,结果再传回去。它自己不带网络、不带持久化,就是个无状态的执行引擎。
ShelbyC2 V2:真正的主后门
等和GitHub的C2通道稳定下来,加载器从同目录读一个AES-CBC加密的RuntimeBrokerApi.dll,这就是ShelbyC2 V2,名字沿用它上一代ShelbyC2。解密密钥来自运行时从GitHub拉的那段Lic.txt内容,做完整SHA-256,前16字节当IV。解出来的字节直接当.NET程序集反射加载进内存。
它负责真正的命令执行,调用的就是上面那个PsProxy.dll,同时负责把Blackwood隧道工具部署进内网。
Blackwood:零落地的Chisel隧道
图13:攻击者新开的pubs公开仓库,里面就一个Client.zip
2026年5月1日,攻击者在peakyblinders-tm账号下新开了个叫pubs的公开仓库,里面就一个Client.zip。这个Blackwood其实2025年5月就被提交到过VirusTotal。
图14:解压Client.zip后的内容,恶意文件名为Blackwood.dll
解压出来,那个恶意文件叫Blackwood.dll。它的部署套路和主加载器一模一样:AppDomainManager劫持加DLL侧加载。包里放一个微软签名的合法vshost32.exe,配一个config文件,程序一跑,.NET运行时就把Blackwood.dll侧加载进内存。
图15:用写死的密钥成功解密Blackwood配置,右侧露出Chisel客户端配置
Blackwood.dll本身是个加载器,真正干活的是开源隧道工具Chisel。Chisel是Go编译的DLL,8.4MB,被当成一个叫Blackwood.Cheese.xml的manifest资源嵌在加载器里,AES-256-CBC加密。解密密钥是一句写死的ASCII口令y0Da+QH#pwSg38E?=8R;71-jQu8Tqq。
配的外部文件Blackwood.dll.conf也有讲究:如果加载器后缀是.dll,它就把配置当Base64读,用RC4、密钥“My name is Blackwood !”解出来;后缀要是被改了,它就当明文读,直接解密失败。这是一个简单但有效的条件性免杀。
解出来的配置指向一个IP 91.107.156[.]29,让被感染机器主动连过去,建一个反向SOCKS代理(R:0.0.0.0:10999:socks)。有了这条跑在HTTP之上、带SOCKS5的加密TCP隧道,攻击者就能绕过边界防御,像踩在自己内网一样在受害者网络里横向移动。
两条鱼,同一个池塘
图20:仿Google Drive的错误提示页,诱导下载WarUnPublishedDocuments.zip
顺着Blackwood配置里的IP往下挖,研究人员发现了另一条线。65.109.214[.]145这台服务器,5到6月间同时干两件事:跑Blackwood的后端,以及撑一套针对以色列实体的钓鱼站。
那批钓鱼域名全是Google Drive的拼写高仿:cloud.g-drive[.]cam、googeldrive[.]cam、drivegoogel[.]cam、googelmeet[.]online、meetonline[.]cam。落地页做得像Google Drive的错误提示,说文件预览不了、你可能离线了,让你下载一个叫WarUnPublishedDocuments.zip的压缩包。点下载就跳到一个仿Google登录页,输入账号密码即被收割。
Google方面确认过,他们自己的系统和基础设施没有被波及,攻击全是靠外部高仿域名完成的,Safe Browsing和Chrome已经在主动拦截这批域名。再往下挖还发现一个更早的测试域名asdfafadafg[.]online,指向另一台38.180.136[.]127,是攻击者5月初搭建、后来才迁到主服务器的预演环境。
尽管用了云基础设施和代码混淆,攻击者还是留下了几处硬证据归属伊朗背景。
图21:攻击者公开GitHub仓库的README,嵌着《浴血黑帮》片头曲Peaky Blinders Team.mp3
图22:音频文件元数据,COMMENT字段保留着MusicDel[.]ir
最有意思的一条来自他们自己的GitHub公开仓库。peakyblinders-tm这个账号的README里嵌了一首MP3,就是《浴血黑帮》的片头曲Red Right Hand,原唱Nick Cave & The Bad Seeds。研究人员一看文件元数据,COMMENT字段赫然写着MusicDel[.]ir。这是伊朗国内一个流行的音乐下载站。也就是说,攻击者是从伊朗本土网站下了这首歌,连标签都没清就传上了GitHub。
网络层面,Blackwood早期样本连的87.248.129[.]239就是伊朗ISP TOSE'EH ERTEBATAT NOVIN ARIA的地址。另一台挂在德国Hetzner的服务器,被动DNS记录指向ns1.soroshpasargad[.]com。Sorosh在波斯语里是信使、天使的意思,Pasargad是波斯帝国第一个都城。结合同注册商下的其他波斯语域名,这台服务器很可能是通过伊朗分销商转手买到的。
受害者画像也对得上:伊拉克电信和航空、阿联酋沙迦机场相关子域名、以色列实体,全部集中在中东。手法上,用航空招聘当诱饵、用AppDomainManager劫持关ETW、用GitHub dead-drop、用内存里的.NET PowerShell包装器,这些和已知的伊朗活动集群Screening Serpens、Agent Serpens(即APT35,别名Charming Kitten、Phosphorus)都有重叠。
攻击者给整套基础设施起的名字更是一张自拍照:GitHub账号peakyblinders-tm、ArthurShelby、JohnShelllby,仓库叫GreenBeret0,全是这部剧里的人名和装束。
图18:最早的一条GitHub评论,日期2025年11月18日,证明搭建早在半年前就开始
图19:标题叫“asasas”的测试issue,里面有手敲的测试串、假连接数据和自动告警
值得一提的是,攻击者从2025年11月就开始测试这套C2机制了。
最早的GitHub评论日期是2025年11月18日,2026年4月24日,他们还在自己仓库里开了个标题叫“asasas”的issue当测试日志板,里面手动编了一条伊拉克IP(138.256.21[.]23,注意.256超过IPv4单段最大值255,明显是编的测试数据),国家代码标着IQ,还有“New device Found”“Login detected”之类的模拟告警。
从搭台、测试到正式出手,前前后后磨了小半年。
参考:《Blinder Tunnel Campaign Targets Iraqi Infrastructure》
More⬇️
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论