Xepor (prononcé /ˈzɛfə/ , zephyr) est un framework de routage Web destiné à l'ingénierie inverse et aux chercheurs en sécurité. Il fournit une API de type Flask permettant aux pirates informatiques d'intercepter et de modifier les requêtes HTTP et/ou les réponses HTTP dans un style de codage convivial.
Ce projet est destiné à être utilisé avec mitmproxy. Les utilisateurs écrivent des scripts avec xepor
et exécutent le script dans mitmproxy avec mitmproxy -s your-script.py
.
Si vous souhaitez passer du PoC à la production, de la démo (par exemple http-reply-from-proxy.py, http-trailers.py, http-stream-modify.py) à quelque chose que vous pourriez retirer avec votre WiFi Pineapple, alors Xépor est fait pour vous !
@api.route()
, tout comme Flask ! Écrivez tout dans un seul script et non if..else
plus.InterceptedAPI
.mitmproxy
/ mitmweb
+ regular
/ transparent
/ socks5
/ reverse:SPEC
/ upstream:SPEC
) sont entièrement pris en charge. La suppression SSL n'est PAS fournie par ce projet.
pip install xepor
Prenez le script de examples/httpbin comme exemple.
mitmweb -s example/httpbin/httpbin.py
Définissez le proxy HTTP de votre navigateur sur http://127.0.0.1:8080
et accédez à l'interface Web à l'adresse http://127.0.0.1:8081/.
Envoyez une requête GET depuis http://httpbin.org/#/HTTP_Methods/get_get , vous pourrez alors voir la modification apportée par Xepor dans l'interface mitmweb, les outils de développement du navigateur ou Wireshark.
Le httpbin.py
fait deux choses.
payload=evil_param
dans la requête HTTP.Authorization
des requêtes HTTP et imprimez le mot de passe à l'attaquant.Exactement ce que mitmproxy fait toujours, mais avec du code écrit à la manière xepor .
# 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 ]