Xepor (pronuncia-se /ˈzɛfə/ , zephyr) é uma estrutura de roteamento da web para engenheiros reversos e pesquisadores de segurança. Ele fornece uma API semelhante ao Flask para hackers interceptarem e modificarem solicitações HTTP e/ou respostas HTTP em um estilo de codificação amigável.
Este projeto deve ser usado com mitmproxy. Os usuários escrevem scripts com xepor
e executam o script dentro de mitmproxy com mitmproxy -s your-script.py
.
Se você quiser passar do PoC para a produção, da demonstração (por exemplo, http-reply-from-proxy.py, http-trailers.py, http-stream-modify.py) para algo que você possa tirar com seu WiFi Pineapple, então Xepor é para você!
@api.route()
, assim como o Flask! Escreva tudo em um script e if..else
mais.InterceptedAPI
.mitmproxy
/ mitmweb
+ regular
/ transparent
/ socks5
/ reverse:SPEC
/ upstream:SPEC
) são totalmente suportados. A remoção de SSL NÃO é fornecida por este projeto.
pip install xepor
Pegue o script de exemplos/httpbin como exemplo.
mitmweb -s example/httpbin/httpbin.py
Defina o proxy HTTP do navegador como http://127.0.0.1:8080
e acesse a interface da web em http://127.0.0.1:8081/.
Envie uma solicitação GET de http://httpbin.org/#/HTTP_Methods/get_get, então você poderá ver a modificação feita pelo Xepor na interface mitmweb, ferramentas de desenvolvimento do navegador ou Wireshark.
O httpbin.py
faz duas coisas.
payload=evil_param
dentro da solicitação HTTP.Authorization
das solicitações HTTP e imprimimos a senha para o invasor.Exatamente o que o mitmproxy sempre faz, mas com código escrito no modo 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 ]