|
2260| 45
|
[分享] 【全网首发】Weax与Sorry勒索病毒席卷全国中小企业,深度还原全链路攻击,疑似黑客... |
|
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子! 病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途! 禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
线索全部指向同一个东西:那个开着的 211 端口。它不是 Web 端口、不是数据库端口,它是管家婆客户端连服务端用的应用层 socket 端口。在 1433 不暴露的前提下,唯一能让
目标地址211端口可达性确认 研究方向由此明确:搞清楚211端口背后这个程序是什么、协议是什么、能不能在无凭据的情况下执行任意操作。 二、管家婆是什么,211端口又是什么2.1 下载管家婆安装包,本地搭建为了可控地复现,我们在本地下载了一份管家婆辉煌ⅡTOP+15的安装包,并在一台干净的Windows Server上完成安装(服务端+数据库+客户端)。
安装完成后, 安装完毕后,用客户端 靶场拓扑如下:
2.2 211 端口的真身:
|
| 签名首字节 | 含义 |
|---|---|
| 04 da | 握手/连接(载荷 = record_id=8 + CLSID) |
| 03 da | GetIDsOfNames(按方法名查 dispid) |
| 02 da | Invoke(载荷 = 6 个变体 + 参数,无前导字节) |
| 04/01 db | 服务器响应(04 db=正常,01 db=错误) |
我们之前一直把 02(Invoke 动作)放进载荷里发,服务器却把它当成了握手(action 4)来解析,所以一直报 Invalid class string,差一个字节的位置,卡了好久。抓包一对照,豁然开朗。
用配套的解析脚本 parse_mitm.py 把 midas_mitm.log 整个解一遍,真实客户端登录一次的过程清清楚楚:
[0] 握手 CLSID={69C419F0-...} → 服务器回 cookie=0
[2] ACT3 查方法名 "ConnectDb" → 回 dispid 0x60030000
[4] INVOKE dispid=0x60030000 (ConnectDb) → 注册客户端
[6] ACT3 "ChangeDb" → 回 dispid 6
[8] INVOKE dispid=6 (ChangeDb) arg="hherpmaster" → 选择账套(主账套)
...
[34] INVOKE dispid=5 (OpenSQL) arg="Select SubValue From Sysdata ..." → 设置SQL
[36] INVOKE dispid=0x1312d01 (AS_GetRecords) arg="pv_qry_Open" → 执行SQL并取数
parse_mitm.py的解析输出,展示上述方法调用序列(每条含dispid、参数)
这条序列给了我们最后两块拼图:
OpenSQL + AS_GetRecords 这一对组合,OpenSQL 只是"设置 SQL 文本",AS_GetRecords 才"执行 + 取数"。至此,逆向 + 抓包两条路汇合,协议的每一个细节都清楚了。下面,我们用它构造完整的攻击 PoC,在靶场上跑通。
把前面还原出的协议,写成最小可用 Python 脚本(仅标准库),就是我们的 PoC。完整脚本见配套文件,下面把关键步骤一步步拆开。
按前面字节布局,构造握手包发出去:
PoC脚本运行,输出"握手成功"——无任何凭据,直接建立连接
握手成功后,我们最初直接发 OpenSQL(SQL) + AS_GetRecords,结果服务器一直回 Provider not exported(provider 未导出),SQL 根本发不到数据库(计划缓存里查无此 SQL)。
对照 脚本结果里真实客户端的序列才明白:客户端在查询前,必然先调用 ConnectDb 注册客户端、再调用 ChangeDb 选择一个账套。不选账套,provider 就不会被"导出"。 这是协议状态机的一个隐藏前提。
补上这两步:
INVOKE(dispid=ConnectDb, args=[客户端IP, 主机名]) # 注册客户端
INVOKE(dispid=ChangeDb, args=["hherpmaster"]) # 选择账套 ← 关键!
这里有个让攻击"零先验知识"的关键点:ChangeDb 选的账套名 hherpmaster,是管家婆默认的系统/主账套,每一套管家婆装好就有、名字固定,攻击者根本不需要事先知道受害者的业务账套叫什么。而且 xp_cmdshell 是 SQL Server 服务器级的功能,不依赖具体业务账套,从 hherpmaster 一样能执行。
如果攻击者还想精准打击某个业务账套,甚至可以连上后直接
select name from master.sys.databases自己把所有账套列出来,我们在靶场上实测,一条 SQL 就把gjp20260702 / hherpmaster / ...全列出来了。
会话初始化完成后,方法调用链就和真实客户端一模一样了:
INVOKE(dispid=OpenSQL, args=["exec master..xp_cmdshell 'echo PWNED > c:\\pwned.txt'"])
INVOKE(dispid=AS_GetRecords, args=[..., "pv_qry_Open"]) # 触发执行
完整PoC执行后的终端输出与靶场验证截图
AS_GetRecords 一旦触发,GraspSvr 就以 sa 身份把这条 SQL 送进了 SQL Server;xp_cmdshell 把命令交给了操作系统。
完整PoC执行后的终端输出与靶场验证截图
光说"能执行"不够,必须在靶场上把"执行结果"落成看得见、摸得着的物证。
我们用PoC 经 xp_cmdshell 在靶机 C:\ 写下标记文件 solar.txt。我们接着去验证:
靶机C:\solar.txt文件存在性验证截图
攻击者拿到的是 Windows 上最高权限的本地账户之一(NT AUTHORITY\SYSTEM,权限等同甚至略高于本地 Administrator,属用户态最高)。这是因为 xp_cmdshell 以 SQL Server 服务进程的身份执行命令,在我们这台靶机上,SQL Server 服务实测以 LocalSystem 运行,于是命令落地文件的 权限 就是 NT AUTHORITY\SYSTEM,攻击者由此掌控本机几乎所有资源:装勒索、停服务、清日志都可以直接做;横向移动到其它主机则通常还需进一步窃取/复用凭据(非一步到位)。
注意:并非所有管家婆部署的 SQL 服务都是 LocalSystem,不同版本/安装方式可能使用更低权限的服务账户(如 NETWORK SERVICE、虚拟服务账户 NT SERVICE\MSSQLSERVER 或域账号),那种情况下 xp_cmdshell 的本机权限会相应降低;但无论服务账户是什么,"未授权以 sa 执行任意 SQL"这个核心漏洞都成立,区别只在于落地 OS 命令时的权限高低。
为了进一步证明"未授权就能以 sa 执行任意 SQL",我们经同一条无凭据链路建了一张表:
create table grasp_rce_poc_211_4(id int, src varchar(80), ts varchar(30));
insert grasp_rce_poc_211 values(1,'PWNED-VIA-UNAUTH-MIDAS-211_4', cast(getdate() as varchar(30)));
select * from grasp_rce_poc_211_4;
执行后去查:
查询grasp_rce_poc_211_4表,确认记录存在
这张表持久存在于受害者数据库里,是"未授权 → sa 任意 SQL"的铁证。
到这里,最开始的悖论彻底解开:
所以受害者环境看起来没有痕迹,不是没被打,是这条管道天生不留常规脚印。
研究过程中,有两个发现让我们意识到:把这事局限在"管家婆"上,是低估了。
回到第一章案例 A(.sorry,制造业务系统),我们解压它的服务端包 XXXserver.rar,里面赫然也有一个 ScktSrvr.exe(680960 字节,版本 11.0.2804.9245,"CodeGear Socket Server"),和管家婆同源、同一个 Borland Socket Server。
XXXserver\ScktSrvr.exe的文件属性:产品名"CodeGear Socket Server",版本11.0.2804.9245
进一步分析它的业务程序 ,XXXServerZz.exe发现它实现的是标准的 Delphi IAppServer(二进制里含标准 IAppServer 类型库 GUID {1AEFCC20-...}、AS_Execute、AS_GetProviderNames,以及一个关键属性 poAllowCommandText,允许 provider 直接执行调用方传入的 SQL)。
差别在于:管家婆用的是自己定制的 AppServer(有"账套"概念,方法名 ConnectDb/ChangeDb/OpenSQL);而 XXXServer 用的是标准 IAppServer,没有账套,攻击路径是 AS_Execute(provider, CommandText=任意SQL) 直接执行 SQL。但底层入口完全一样:都是 211 端口、都是 scktsrvr、都无认证。
我们对靶机所在网段做了 211 端口扫描,一次就扫到 4 台开放 211 的主机。用我们的工具去连,全部返回同一个错误:
Object not available: {69XXX-XXX-XXX-XXX-A92A}
这个错误的意思是:这些机器上没注册管家婆的 GraspSvr 这个类:它们是别的 Delphi MIDAS 应用(不同的 AppServer、不同的 CLSID)。我们手里这把"管家婆钥匙"开不了它们的锁。
这就回答了一个读者可能早就想问的问题:既然每个应用 CLSID 不同,攻击者怎么知道该用哪个 CLSID 去连?
答案是:攻击者手里有一本 CLSID 字典。他们逆向了多种 Delphi MIDAS 应用的客户端,提取出各自 AppServer 的 CLSID(管家婆 {69C419F0-...}、XXXServer 的、还有别的……),攒成字典。扫描器先用 04 da 探针确认"这是台 scktsrvr/MIDAS",然后逐个试字典里的 CLSID,命中哪个,就知道对方是什么应用,再套对应的方法集打。
结论:这是一类漏洞,不是一个产品的漏洞。 任何"Delphi MIDAS socket 应用 + scktsrvr 无认证 + AppServer 有 SQL/命令执行能力"的组合都中招。管家婆只是其中最常见、暴露量最大的一类。
既然 211 上跑的是个解析私有协议的程序,那除了"经数据库 RCE"这条应用层路径,协议解析层本身有没有内存破坏漏洞(缓冲区溢出),能不经过数据库直接打? 我们也深入挖了一下。
我们在案例 A 受害者的 Application.evtx 里发现:ScktSrvr.exe 有大量崩溃记录(30 条 Application Error,两组不同 WER 哈希),其中一条:
受害者Application.evtx中ScktSrvr.exe的AppCrash 1000事件详情
受害者崩溃点 0x4041d9 经反汇编确认落在 Delphi 运行时的 SEH 链链代码(mov fs:[0], eax),这是 SEH 链被破坏的强签名(栈溢出覆盖 SEH 后,异常处理二次崩溃的典型落点)。严格来讲,要坐实"可控 SEH 覆盖(可改写 handler 跳转 → RCE)"还需要一份崩溃转储来观察被覆盖的 SEH 记录;目前受害者侧只留存了崩溃日志,未取得 dump,故此处为"高度可疑的栈/SEH 破坏",而非"已证实的可控覆盖"。补全这一步需在 Wine 上复现 11.0 崩溃并抓 dump(后续工作)。
我们把目光转回管家婆辉煌ⅡTOP+15所用的 7.0(靶场同款),重点审计前面3.4 节那个变体读取器的 default 分支:
default:
read(v4, a4+4, word_491354[v16 & 0xFFF]); // 按大小表读 N 字节到栈缓冲
大小表 word_491354(IDA 地址 0x491354)只有 20 个有效条目(type 0–19);当变体类型 ≥0x14(越界)时,会读到表后面的指针碎片(如 type 0x14 → 31180),然后往只有 12 字节的栈缓冲里写 31180 字节,这是确凿的栈溢出代码模式。
IDA查看word_491354大小表的内容,展示20个有效条目后的越界风险
但在 7.0 上实测打不死:发 type 0x14(带各种长度 payload),服务器全部优雅返回 Invalid variant type,进程始终存活(PID 不变)。
原因:所有能触发 default 分支的 type 都是"非法 type",Delphi 在用到被破坏的返回地址/SEH 之前,就先抛了 EVariantError,被外层分发器(sub_48B820,其栈帧未被破坏)的 SEH 兜住,清除了。内存写确实发生了,但崩不出来、控不了执行流。
Fuzz脚本对7.0发多种畸形变体,全部未成功,PID始终不变的终端截图
| 版本 | 结论 |
|---|---|
| 管家婆辉煌ⅡTOP+15 | 有内存安全缺陷代码模式(latent),但不可利用(Delphi 异常机制中和,不崩、不可控执行) |
| scktsrvr 11.0(XXXServer) | 有崩溃证明(c0000005 @ SEH、c00000fd),属另一版本的独立问题 |
所以诚实地讲:真正被勒索利用的、我们已经闭环的,是前面那条"未授权 MIDAS → SQL → RCE"的应用层路径,不是缓冲区溢出。
InterceptGUID 鉴权拦截器(若产品支持),或在 211 前置 VPN / 反向代理做强制认证,目前管家婆官方已在内部发布修复版本的Scktsrvr.exe程序。xp_cmdshell、Ole Automation Procedures;AppServer 不应以 sa 连库,改用最小权限账号,即使被未授权调用,也执行不了 OS 命令。04 da / 04 db MIDAS 握手、异常 ACT3/Invoke),因为传统 Web/登录日志对它无效;SQL 默认 trace / 扩展事件重点盯 sp_configure、sp_OACreate、xp_cmdshell。| 样本 | 大小 | 版本 | 厂商 / 产品 | MD5 | SHA256 |
|---|---|---|---|---|---|
| scktsrvr.exe(管家婆辉煌ⅡTOP+15版本 scktsrvr.exe所用7.0,逆向主样本/靶场同款) | 680448 | 7.0.4.453 | Borland Software Corporation / Borland Socket Server | bd48bdba38bc4d925e080183cb2dc8c1 |
f2b1ab212b0f02ab1da4b1e93a6d54e19f853b99b5aa4fa7b56d8d3946362978 |
| ScktSrvr.exe(XXXServer 11.0,sorry 受害者同款,有崩溃铁证) | 680960 | 11.0.2804.9245 | CodeGear / CodeGear Socket Server | 3aa210de0269010e6169f8736471ecf0 |
9a736ac6c1f359be7e2e44287581974ea84982d4416e72b84e3104f4dea7367e |
| GraspSvr.exe(管家婆 AppServer,COM 组件) | 4430336 | 15.0.0.68 | 任我行软件有限公司 / 管家婆辉煌服务器 | 424317c15260bf7ebc92516cb90a7de4 |
8d169f57a7ab9399ea46a1cc30687b2bd23d3ee153d0a71a78f78b98e8b37808 |
| midas.dll(Delphi MIDAS 客户端库) | 264192 | — | Borland / MIDAS | 7f63290fddec173fd009bf3e7ffe6d6b |
b0d8a36a5cd4923517186b2f7a7e8820ff21691b8896c554eeb6764bbaaf3e4b |
| 参与人数 20 | 吾爱币 +17 | 热心值 +19 | 收起 理由 |
|---|---|---|---|
|
| + 1 | + 1 | 我很赞同! |
|
| + 1 | + 1 | 鼓励转贴优秀软件安全工具和文档! |
|
| + 1 | + 1 | 我很赞同! |
|
| + 1 | 鼓励转贴优秀软件安全工具和文档! | |
|
| + 1 | + 1 | 用心讨论,共获提升! |
|
| + 1 | + 1 | 我很赞同! |
|
| + 1 | 我很赞同! | |
|
| + 1 | + 1 | 谢谢@Thanks! |
|
| + 1 | + 1 | 分析得很精彩,一开始的漫画风图解好评!! |
|
| + 1 | + 1 | 谢谢@Thanks! |
|
| + 1 | + 1 | 热心回复! |
|
| + 1 | + 1 | 热心回复! |
|
| + 1 | + 1 | 热心回复! |
|
| + 1 | + 1 | 二次中招后我就察觉是211套接字的问题了,一,我2111端口改成五位数了,二 ... |
|
| + 1 | 欢迎分析讨论交流,吾爱破解论坛有你更精彩! | |
|
| + 1 | 我很赞同! | |
|
| + 1 | + 1 | 热心回复! |
|
| + 1 | + 1 | 牛人 |
|
| + 1 | + 1 | 我很赞同! |
|
| + 1 | + 1 | 用心讨论,共获提升! |
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。
|
推荐
|
发表于 2026-7-7 10:35
|楼主
| ||
|
推荐
发表于 2026-7-8 23:17
| ||
|
沙发
发表于 2026-7-7 05:40
| ||
|
3#
发表于 2026-7-7 07:35
| ||
|
6#
发表于 2026-7-7 08:34
| ||
RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )
GMT+8, 2026-7-15 11:01
Powered by Discuz!
Copyright © 2001-2020, Tencent Cloud.