import http.server import json import re import socketserver import sys import threading from urllib.parse import urlparse import time import traceback import requests import os class NewHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): if self.path == '/': self.path = 'webroot/index.html' return http.server.SimpleHTTPRequestHandler.do_GET(self) class ThreadedHTTPServer(object): handler = NewHandler def __init__(self, host, port): self.server = socketserver.TCPServer((host, port), self.handler) self.server_thread = threading.Thread(target=self.server.serve_forever) self.server_thread.daemon = True def start(self): self.server_thread.start() def stop(self): self.server.shutdown() self.server.server_close() class Bluecoat: def __init__(self, url, clonesite): self.url = url self.clonesite = clonesite self.server = '' def clone(self): print("[-] Cloning " + self.clonesite) headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)'} webContent = requests.get(self.clonesite, headers=headers).content if not os.path.exists('webroot'): os.makedirs('webroot') try: if webContent.lower().index(b")", b"\g<0>\n", webContent, count=1, flags=re.IGNORECASE) with open('webroot/index.html', 'wb') as indexFile: indexFile.write(webContent) indexFile.close() def check_category(self): # Category checking lifted from CatMyFish # https://github.com/Mr-Un1k0d3r/CatMyFish/blob/master/CatMyFish.py print("[-] Checking category for " + self.url) session = requests.session() url = "https://sitereview.bluecoat.com/resource/lookup" cookies = {"XSRF-TOKEN": "028e5984-50bf-4c00-ad38-87d19957201a"} headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0", "Accept": "application/json, text/plain, */*", "Accept-Language": "en_US", "Accept-Encoding": "gzip, deflate", "Referer": "https://sitereview.bluecoat.com/", "X-XSRF-TOKEN": "028e5984-50bf-4c00-ad38-87d19957201a", "Content-Type": "application/json; charset=utf-8", "Connection": "close"} data = {"captcha": "", "key": "", "phrase": "RXZlbiBpZiB5b3UgYXJlIG5vdCBwYXJ0IG9mIGEgY29tbWVyY2lhbCBvcmdhbml6YXRpb24sIHNjcmlwdGluZyBhZ2FpbnN0IFNpdGUgUmV2aWV3IGlzIHN0aWxsIGFnYWluc3QgdGhlIFRlcm1zIG9mIFNlcnZpY2U=", "source": "new lookup", "url": self.url} response = session.post(url, headers=headers, cookies=cookies, json=data) try: json_data = json.loads(response.content) if "errorType" in json_data: if json_data["errorType"] == "captcha": print("[-] BlueCoat blocked us :(") return("Blocked by BlueCoat") sys.exit(0) category = [] for entry in json_data["categorization"]: category.append(entry["name"]) cat = ', '.join(category) print("\033[1;32m[-] Your site is categorised as: " + cat + "\033[0;0m") return(cat) except Exception as e: traceback.print_exc() print("[-] An error occurred") def serve_content(self): print("[-] Serving content over HTTP server") self.server = ThreadedHTTPServer("0.0.0.0", 8000) try: self.server.start() except: pass def shutdown_server(self): print("[-] Shutting down HTTP server") self.server.stop() def run(self): self.clone() self.serve_content() time.sleep(10) self.check_category() self.shutdown_server() if __name__ == "__main__": url = sys.argv[1] clonesite = sys.argv[2] b = Bluecoat(url, clonesite) b.clone() b.serve_content() time.sleep(10) b.check_category() b.shutdown_server()