Xepor (ينطق /ˈzɛfə/ ، zephyr) هو إطار توجيه ويب للمهندسين العكسيين والباحثين الأمنيين. يوفر واجهة برمجة تطبيقات تشبه 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
خذ البرنامج النصي من الأمثلة/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 ]