WatchBird如何实现内网转发?

7 人参与

AWD攻防赛中,防守方常常面临一个棘手的问题:如何在不暴露自身IP地址的情况下,向同网段的其他靶机发起探测或攻击?常规的代理或VPN方案往往过于笨重或引入新的风险。WatchBird给出的答案,是其最核心的“内网转发”功能,而这一功能的实现基石,是一项听起来简单却异常复杂的操作:在纯PHP环境中,完整地、准确地“拼凑”出原始的HTTP请求数据包

从零开始的请求“复现”

内网转发的本质,是让运行WatchBird的A服务器,能够将攻击者发来的恶意请求,原封不动地转发给内网的B服务器。这听起来像是代理服务器的工作,但关键在于,WatchBird本身是一个单文件的PHP Web应用防火墙(WAF),它没有像Nginx或Apache那样底层的网络处理能力。它拿到的是一个已经被Web服务器(如Apache/PHP-FPM)解析和预处理过的请求环境。

PHP的$_GET$_POST$_SERVER等超全局变量,是经过“烹饪”后的数据。原始的HTTP报文——包括请求行、请求头、请求体以及至关重要的分隔符和编码信息——在到达PHP脚本前就已经被“拆解”了。而内网转发,恰恰需要那份原始的、未被加工的“生肉”。

技术攻坚:那些被忽略的“魔鬼细节”

WatchBird的开发者leohearts等人,面临的是一系列教科书上不会写的难题。他们需要从零开始,逆向工程出原始请求包。这个过程,充满了“坑”。

  • BOM头陷阱:如果请求体是文件上传,且文件中包含UTF-8 BOM头(EF BB BF),PHP在解析时会自动处理,但拼凑原始包时必须将其精确还原,否则接收方(无论是自检服务器还是目标靶机)解析时就会出错。
  • “分块传输”的挑战:当客户端使用HTTP/1.1的Transfer-Encoding: chunked方式发送请求时,原始请求体是经过编码的。PHP环境已经自动将其解码为连续的数据流。WatchBird必须有能力识别并重新编码成chunked格式,否则转发出去的包协议就不合规。
  • 最难啃的骨头:multipart/form-data:这是文件上传的标准格式。其请求体由复杂的边界字符串(boundary)分隔。PHP已经将各部分解析成$_FILES$_POST。如何仅凭这些信息,反推出原始的边界字符串,并重新构造出与原始请求字节级一致的multipart数据?这需要极其精确地处理每个字段的头部、内容、换行符和结束符。

“拼凑”之后:转发的实现路径

当WatchBird成功在内存中重构出与攻击者发来的一模一样的HTTP请求原始数据后,内网转发就变成了一个相对标准的网络操作。它主要提供两种模式:

  • 本地自检:这是默认模式。将重构的请求包,通过PHP的cURL或socket函数,发送给自身服务器的另一个端口(例如一个专门用于检测的后端服务)。这样做的好处是,可以在一个隔离的环境里安全地执行请求,分析响应内容中是否包含flag或恶意行为,而不会真正影响线上服务。如果检测到异常(如响应中出现flag关键字),WatchBird会拦截本次请求,并可能返回一个虚假的flag给攻击者。
  • 内网代理转发:这才是真正意义上的“内网转发”。在控制台配置好目标内网IP和端口后,WatchBird会将重构的原始请求包,直接发送给指定的内网靶机。攻击者打过来的一个SQL注入payload,会通过你的服务器,悄无声息地“反弹”到隔壁队伍的服务器上。这个功能在AWD赛中极具战术价值,可以实现隐蔽的横向探测和攻击。

这里有个精妙之处:由于转发的是原始请求包,它完美继承了原请求的所有特征,包括Cookie、Session ID、特定的Content-Type头等。这使得转发过去的请求,在目标服务器看来,几乎和直接发过来的没有区别,极大提高了转发的成功率和隐蔽性。

安全与风险的孪生体

强大的能力往往伴随同等的风险。内网转发,尤其是自检模式,在安全上是一把双刃剑。

开发者自己也坦言,自检可能带来安全问题。因为自检过程需要在服务器上再次执行这个可能恶意的请求。虽然通常发送到本地一个受控的、无状态的检测端点,但如果这个端点的隔离没做好,或者PHP环境存在某些诡异的配置,理论上存在“被自己的检测机制打穿”的风险。这要求部署者必须对自检环境有清晰的认识和严格的管控。

不过,在AWD那种分秒必争、以攻促防的极限环境下,这种为了极致功能而接受的微小风险,往往被认为是值得的。毕竟,它的主要对手是其他攻击队,而不是追求绝对安全的商业环境。WatchBird的内网转发,本质上是一种在特定战场规则下诞生的、极具创造性的战术工具,它展示了在受限环境(纯PHP)中,通过深度理解协议细节所能爆发出的惊人能量。

参与讨论

7 条评论
  • 梦的剪影

    这玩意太硬核了吧,纯PHP搞HTTP包拼接?🤯

    回复
  • StarDustNomad

    multipart这块真头疼,之前自己写解析直接崩了

    回复
  • 铁杵成针

    BOM头还能这么玩?学到了(不是)

    回复
  • 星际矿工

    chunked编码转发后目标服务器会兼容吗?求问

    回复
  • 像素狙击手

    感觉还行

    回复
  • 乖乖兔

    要是自检环境被反打穿了咋办,有点慌啊

    回复
  • 声音的拓扑学家

    文件上传那块确实坑多,我也踩过

    回复