
أداة اختبار تهريب طلبات HTTP وعدم التزامن مبنية على بايثون، تكتشف ثغرات CL.TE و TE.CL باستخدام حمولات تحوير قابلة للتكوين ومسح تلقائي.
______ _
/ _____) | |
( (____ ____ _ _ ____ ____| | _____ ____
\____ \| \| | | |/ _ |/ _ | || ___ |/ ___)
_____) ) | | | |_| ( (_| ( (_| | || ____| |
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|
(_____(_____|
@defparam
أداة اختبار تهريب طلبات HTTP / عدم التزامن مكتوبة بلغة Python 3
شكر خاص لـ James Kettle على أبحاثه وطرقه في مجال عدم التزامن HTTP
وشكر خاص أيضًا لـ Ben Sadeghipour على اختبار Smuggler في المرحلة التجريبية وعلى السماح لي بعرض عملي في Nahamcon 2020
لا تضمن هذه الأداة عدم وجود نتائج إيجابية خاطئة أو سلبية خاطئة. مجرد أن طفرة ما تُظهر نتيجة "موافق" لا يعني عدم وجود مشكلة عدم التزامن، ولكن الأهم من ذلك، مجرد أن الأداة تشير إلى وجود مشكلة عدم التزامن محتملة لا يعني بالضرورة وجودها بالفعل. قد يواجه السكريبت معالجات طلبات من جهات كبيرة (مثل Google/AWS/Yahoo/Akamai/إلخ) قد تظهر نتائج إيجابية خاطئة.
مضيف واحد:
python3 smuggler.py -u <URL>
قائمة بالمضيفين:
cat list_of_hosts.txt | python3 smuggler.py
usage: smuggler.py [-h] [-u URL] [-v VHOST] [-x] [-m METHOD] [-l LOG] [-q]
[-t TIMEOUT] [--no-color] [-c CONFIGFILE]
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Target URL with Endpoint
-v VHOST, --vhost VHOST
Specify a virtual host
-x, --exit_early Exit scan on first finding
-m METHOD, --method METHOD
HTTP method to use (e.g GET, POST) Default: POST
-l LOG, --log LOG Specify a log file
-q, --quiet Quiet mode will only log issues found
-t TIMEOUT, --timeout TIMEOUT
Socket timeout value Default: 5
--no-color Suppress color codes
-c CONFIGFILE, --configfile CONFIGFILE
Filepath to the configuration file of payloads
يتطلب Smuggler كحد أدنى إما عنوان URL عبر الوسيط -u/--url أو قائمة عناوين URL يتم إدخالها عبر stdin. إذا كان عنوان URL يحدد https://، فسيتصل Smuggler بالمضيف:المنفذ باستخدام SSL/TLS. وإذا كان عنوان URL يحدد http://، فلن يتم استخدام SSL/TLS على الإطلاق. إذا تم تحديد المضيف فقط، فسيعود السكريبت إلى https:// كإعداد افتراضي.
استخدم -v/--vhost <host> لتحديد رأس مضيف مختلف عن عنوان الخادم
استخدم -x/--exit_early للخروج من فحص خادم معين عند العثور على مشكلة محتملة. في وضع الأنابيب (piped mode)، سيواصل Smuggler إلى المضيف التالي في القائمة
استخدم -m/--method <method> لتحديد فعل HTTP مختلف عن POST (مثل GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD/إلخ)
استخدم -l/--log <file> لكتابة المخرجات إلى ملف بالإضافة إلى stdout
استخدم -q/--quiet لتقليل الإسهاب وتسجيل المشكلات التي تم العثور عليها فقط
استخدم -t/--timeout <value> لتحديد مهلة socket. يجب أن تكون القيمة عالية بما يكفي لاستنتاج أن socket معلقة، ولكن منخفضة بما يكفي لتسريع الاختبار (الافتراضي: 5)
استخدم --no-color لقمع رموز الألوان المطبوعة على stdout (السجلات لا تتضمن رموز ألوان بشكل افتراضي)
استخدم -c/--configfile <configfile> لتحديد ملف تكوين طفرات Smuggler الخاص بك (الافتراضي: default.py)
ملفات التكوين هي ملفات بايثون موجودة في دليل ./config الخاص بـ Smuggler. تصف هذه الملفات محتوى طلبات HTTP والطفرات في ترميز النقل (transfer-encoding) المراد اختبارها.
فيما يلي المحتوى النموذجي لـ default.py:
def render_template(gadget):
RN = "\r\n"
p = Payload()
p.header = "__METHOD__ __ENDPOINT__?cb=__RANDOM__ HTTP/1.1" + RN
# p.header += "Transfer-Encoding: chunked" +RN
p.header += gadget + RN
p.header += "Host: __HOST__" + RN
p.header += "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" + RN
p.header += "Content-type: application/x-www-form-urlencoded; charset=UTF-8" + RN
p.header += "Content-Length: __REPLACE_CL__" + RN
return p
mutations["nameprefix1"] = render_template(" Transfer-Encoding: chunked")
mutations["tabprefix1"] = render_template("Transfer-Encoding:\tchunked")
mutations["tabprefix2"] = render_template("Transfer-Encoding\t:\tchunked")
mutations["space1"] = render_template("Transfer-Encoding : chunked")
for i in [0x1,0x4,0x8,0x9,0xa,0xb,0xc,0xd,0x1F,0x20,0x7f,0xA0,0xFF]:
mutations["midspace-%02x"%i] = render_template("Transfer-Encoding:%cchunked"%(i))
mutations["postspace-%02x"%i] = render_template("Transfer-Encoding%c: chunked"%(i))
mutations["prespace-%02x"%i] = render_template("%cTransfer-Encoding: chunked"%(i))
mutations["endspace-%02x"%i] = render_template("Transfer-Encoding: chunked%c"%(i))
mutations["xprespace-%02x"%i] = render_template("X: X%cTransfer-Encoding: chunked"%(i))
mutations["endspacex-%02x"%i] = render_template("Transfer-Encoding: chunked%cX: X"%(i))
mutations["rxprespace-%02x"%i] = render_template("X: X\r%cTransfer-Encoding: chunked"%(i))
mutations["xnprespace-%02x"%i] = render_template("X: X%c\nTransfer-Encoding: chunked"%(i))
mutations["endspacerx-%02x"%i] = render_template("Transfer-Encoding: chunked\r%cX: X"%(i))
mutations["endspacexn-%02x"%i] = render_template("Transfer-Encoding: chunked%c\nX: X"%(i))
لا توجد وسائط إدخال بعد لتحديد رؤوس ووكلاء مستخدم مخصصين. يُوصى بإنشاء ملف التكوين الخاص بك بناءً على default.py وتعديله حسب رغبتك.
يأتي Smuggler مزودًا بـ 3 ملفات تكوين: default.py (سريع)، doubles.py (متخصص، بطيء)، exhaustive.py (بطيء جدًا) default.py هو الأسرع لأنه يحتوي على طفرات أقل.
حدد ملفات التكوين باستخدام وسيط سطر الأوامر -c/--configfile <configfile>
يوجد داخل دليل Smuggler دليل payloads. عندما يجد Smuggler مشكلة CLTE أو TECL محتملة، فإنه يقوم تلقائيًا بإيداع ملف نصي ثنائي للحمولة المشكلة في دليل payloads. جميع أسماء ملفات الحمولات مُعلَّقة باسم المضيف ونوع عدم التزامن ونوع الطفرة. استخدم هذه الحمولات للاتصال المباشر بالخادم باستخدام netcat أو لاستيرادها إلى أدوات تحليل أخرى.
بعد العثور على مشكلة عدم التزامن، لا تتردد في استخدام البرامج النصية لـ Turbo Intruder الخاصة بي والموجودة هنا: https://github.com/defparam/tiscripts
يُعد DesyncAttack_CLTE.py و DesyncAttack_TECL.py برامج نصية ممتازة للمساعدة في إعداد هجوم عدم التزامن
هذه البرامج النصية مُصدَرة بموجب رخصة MIT. راجع LICENSE.