Xepor (ausgesprochen /ˈzɛfə/ , zephyr) ist ein Web-Routing-Framework für Reverse Engineers und Sicherheitsforscher. Es stellt eine Flask-ähnliche API bereit, mit der Hacker HTTP-Anfragen und/oder HTTP-Antworten in einem benutzerfreundlichen Codierungsstil abfangen und ändern können.
Dieses Projekt soll mit mitmproxy verwendet werden. Benutzer schreiben Skripte mit xepor
und führen das Skript in mitmproxy mit mitmproxy -s your-script.py
aus.
Wenn Sie vom PoC zur Produktion übergehen möchten, von der Demo (z. B. http-reply-from-proxy.py, http-trailers.py, http-stream-modify.py) zu etwas, das Sie mit Ihrem WiFi Pineapple herausnehmen können, dann Xepor ist für Sie!
@api.route()
, genau wie Flask! Schreiben Sie alles in ein Skript und kein if..else
sonst“ mehr.InterceptedAPI
Instanz.mitmproxy
/ mitmweb
+ regular
/ transparent
/ socks5
/ reverse:SPEC
/ upstream:SPEC
) werden vollständig unterstützt. SSL-Stripping wird von diesem Projekt NICHT bereitgestellt.
pip install xepor
Nehmen Sie als Beispiel das Skript aus examples/httpbin.
mitmweb -s example/httpbin/httpbin.py
Stellen Sie Ihren Browser-HTTP-Proxy auf http://127.0.0.1:8080
ein und greifen Sie unter http://127.0.0.1:8081/ auf die Weboberfläche zu.
Senden Sie eine GET-Anfrage von http://httpbin.org/#/HTTP_Methods/get_get. Dann können Sie die von Xepor vorgenommene Änderung in der Mitmweb-Schnittstelle, den Browser-Entwicklungstools oder Wireshark sehen.
Die httpbin.py
macht zwei Dinge.
payload=evil_param
in die HTTP-Anfrage ein.Authorization
von HTTP-Anfragen aus und geben Sie dem Angreifer das Passwort aus.Genau das, was mitmproxy immer tut, aber mit Code, der auf xepor -Art geschrieben ist.
# https://github.com/xepor/xepor-examples/tree/main/httpbin/httpbin.py
from mitmproxy . http import HTTPFlow
from xepor import InterceptedAPI , RouteType
HOST_HTTPBIN = "httpbin.org"
api = InterceptedAPI ( HOST_HTTPBIN )
@ api . route ( "/get" )
def change_your_request ( flow : HTTPFlow ):
"""
Modify URL query param.
Test at:
http://httpbin.org/#/HTTP_Methods/get_get
"""
flow . request . query [ "payload" ] = "evil_param"
@ api . route ( "/basic-auth/{usr}/{pwd}" , rtype = RouteType . RESPONSE )
def capture_auth ( flow : HTTPFlow , usr = None , pwd = None ):
"""
Sniffing password.
Test at:
http://httpbin.org/#/Auth/get_basic_auth__user___passwd_
"""
print (
f"auth @ { usr } + { pwd } :" ,
f"Captured { 'successful' if flow . response . status_code < 300 else 'unsuccessful' } login:" ,
flow . request . headers . get ( "Authorization" , "" ),
)
addons = [ api ]