Xepor (произносится /ˈzɛfə/ , zephyr) — это платформа веб-маршрутизации для реверс-инженеров и исследователей безопасности. Он предоставляет хакерам API-интерфейс Flask для перехвата и изменения HTTP-запросов и/или HTTP-ответов в удобном для человека стиле кодирования.
Этот проект предназначен для использования с mitmproxy. Пользователи пишут сценарии с помощью xepor и запускают сценарий внутри mitmproxy с помощью mitmproxy -s your-script.py .
Если вы хотите перейти от PoC к производству, от демонстрации (например, http-reply-from-proxy.py, http-trailers.py, http-stream-modify.py) к чему-то, что вы можете использовать с помощью WiFi Pineapple, тогда Ксепор для вас!
@api.route() , как во Flask! Напишите все в одном скрипте и больше никаких if..else .InterceptedAPI .mitmproxy / mitmweb + regular / transparent / socks5 / reverse:SPEC / upstream:SPEC ) полностью поддерживаются. Удаление SSL НЕ предусмотрено этим проектом.
pip install xeporВ качестве примера возьмите скрипт из example/httpbin.
mitmweb -s example/httpbin/httpbin.py Установите HTTP-прокси браузера на http://127.0.0.1:8080 и получите доступ к веб-интерфейсу по адресу http://127.0.0.1:8081/.
Отправьте запрос GET с http://httpbin.org/#/HTTP_Methods/get_get. Затем вы сможете увидеть изменения, внесенные Xepor в интерфейсе mitmweb, инструментах разработки браузера или Wireshark.
httpbin.py делает две вещи.
payload=evil_param внутри HTTP-запроса.Authorization из HTTP-запросов и выводим пароль злоумышленнику.Именно то, что всегда делает mitmproxy, но с кодом, написанным в стиле 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 ]