התקנת MITM על רספברי פיי

התקנת נקודת גישה אלחוטית על הרספברי פיי וצפייה בכל מה שעובר דרכה.

אחד הדברים השימושיים והמגניבים ביותר שאפשר לעשות ברספברי פיי זה להפוך אותו לתחנת Man In The Middle. מה זה אומר? זה אומר נקודת wifi בבית, ממש כמו נתב, שמחוברת לרשת והכל. אבל כל תנועה שעוברת בה גלויה לעיניים שלכם. זה מעולה למחקרים שונים במיוחד על מכשירים שקשה לדבג. כמו למשל מכשירי IoT, טלפונים או כל מכשיר אחר שמתחבר לרשת שלכם ואתם תוהים מה בדיוק הוא מתקשר החוצה.

⚠️האזהרה המתבקשת: תקן ה-HTTPS מפחית מההתכנות של התקפת MITM על קורבנות תמימים. אבל אם בכל זאת אתם מספיק מטומטמים כדי לנסות ולהשתמש בידע הזה כדי להזיק – קחו בחשבון שזה כבר לא יעיל כמו פעם, אתם מטומטמים ואתם עושים עבירה פלילית. 🚓

איך זה עובד? לרספברי פיי 4 יש חיבור לכבל רשת (מה שנקרא ethernet) ואנטנת ויי פי מובנית. אנו נחבר ממנו כבל רשת לנתב והוויפיי שלו יהיה בעצם "נתב אלחוטי" (יותר נכון: נקודת גישה אלחוטית) לכל דבר. כל מכשיר שמתחבר לנקודת הגישה שלנו יקבל אינטרנט דרך כבל הרשת אבל תוכנה בשם mitmproxy תנטר את כל התקשורת ותציג לנו את מה שקורה שם.

מילת אזהרה: זה לא נורא מורכב, אבל זה עניין של חצי שעה עד שעה, יותר אם יש בעיות. חילקתי את המדריך לחלקים ובסוף כל חלק יש הסבר על שגיאות שיכולות לקרות והסבר.

מילת עידוד: זה נראה מסובך אבל זה לא נורא מסובך. בדרך תלמדו קצת על לינוקס, איך הוא עובד, מה זה סרוויסים וקצת על רשתות. גם אם יהיו תקלות בדרך ותפתרו אותן, זה רק יעלה לכם את הידע.

המדריך מבוסס חלקית על המדריך הנפלא של דינו פיזוטי שמומלץ לקרוא.

המצרכים

1. מחשב שמחובר לרשת הביתית שלכם שממנו תתחברו עם SSH לרספברי פיי.

2. רספברי פיי עם Raspberry Pi OS חדש דנדש שניתן להתחבר אליו בחיבור SSH מהמחשב בסעיף 1.
⚠️ מומלץ: כתבתי מערכת הפעלה שהותקנה זה הרגע והתכוונתי לכל מילה. במדריך הזה אנחנו משחקים המון עם הגדרות הרשת ואם יש כבר תוכנות או הגדרות על מערכת ההפעלה שלכם זה עלול לגרום לתקלות לא צפויות. ריכשו כרטיס זכרון חדש ב-15 ש"ח, התקינו עליו מערכת הפעלה מאפס – זה יחסוך המון צרות.

3. כבל רשת – שאותו יש לחבר מהנתב אל הרספברי פיי.

4. מכשיר טלפון שאיתו נתחבר לנקודת הגישה האלחוטית.

5. ידע במדריכים הקודמים וקצת לדעת על nano, עורך הטקסט שבא עם לינוקס.

6. מצב רוח טוב, שקט ולהכין את המשפחה בבית שאם הם חושבים שזה הזמן לרקוד סביב המחשב או להציק – זה לא הזמן. כמו כן, ידיעה שמשהו תמיד משתבש והכנה נפשית לזה.

התחברו ב-SSH לרספברי פיי שלכם ויאללה, להתחיל להריץ. כל הפקודות רצות ברספברי פיי כמובן. לא על המחשב המקומי שלכם.

שלב ראשון – הכנת ה-DHCP והכנת הנקודה האלחוטית

דין פיזוטי ממליץ לנתק את NetworkManager. אין את זה בגרסאות החדשות של Raspberry Pi OS אבל ליתר בטחון (אולי בגרסה הבאה שתצא שנה אחרי הכתיבה של הפוסט הזה יחליטו להוסיף אותו? 🤷‍♂️) הקלידו:

sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

אם הפלט הוא: "בחייאת זה לא קיים מה נפלת עלי?" לא קרה כלום. נמשיך הלאה.

DHCP זה ראשי תיבות של Dynamic Host Configuration Protocol והוא שירות (כלומר תוכנה) שאחראי לחלק את כתובת ה-IP ולנהל אותן על הרשת. כיוון שאנו מרימים רשת, הקינפוג שלו הוא קריטי. אנו עוסקים כאן בקינפוג הרשת האלחוטית, כי אנו בונים נקודת גישה אלחוטית. הרשת האלחוטית נקראת wlan0. הרשת החוטית נקראת eth0. מן הסתם ברשת החוטית לא ניגע אבל כן ניגע בהגדרות של wlan0. הדבר הראשון הוא להגדיר כתובת סטטית לנקודת הגישה האלחוטית שלכם.

רשתות פנימיות עובדות עם טווחי IP שונים מאלו החיצוניים. כתובות IP הן .*.*.192.168 למשל. אנו נבחר בטווח הכתובות *.192.168.42 – כלומר כל מכשיר שיחובר אל נקודת הגישה הפנימית שלנו יקבל את הכתובת הזו. לנקודה עצמה יש גם כתובת שאנו נגדיר אותה עכשיו.

נקליד:

sudo nano /etc/dhcpcd.conf

ונוסיף בתחתית העמוד את:

interface wlan0
static ip_address=192.168.42.1/24
nohook wpa_supplicant

אנו בעצם מצהירים שה-IP הקבוע של נקודת הגישה האלחוטית שלנו הוא 192.168.42.1.

שלב שני – התקנת isc-dhcp-server

כעת אנו צריכים להתקין את התוכנה שאחראית על יישום הנקודה האלחוטית – כלומר ממש הניהול והשידור שלה בפועל. יש שתיים כאלו: isc-dhcp-server שאחראית לתת לכל מכשיר שיתחבר לנקודת הגישה האלחוטית שלנו כתובת IP משלו. ו-hostapd שאחראית למתן הרשאה לנקודת הגישה. כל תוכנה כזו היא תוכנה ממש עם הגדרות. זה שאנו מגדירים אותה עם CLI (כלומר דרך הטרמינל) לא הופכת אותה לפחות תוכנה מהתוכנות עם ה-GUI שאנו משתמשים בהן.

נתקין אותן באמצעות:

sudo apt install hostapd isc-dhcp-server

ועכשיו אנחנו נשנה את ההגדרות של isc-dhcp-server. נכנס לקובץ ההגדרות שלו כך:

sudo nano /etc/dhcp/dhcpd.conf

חפשו את ה-authoritative והסירו את סימן ה-# שיש לפניו. זה סימן של הערה בקבצי קונפיגורציה. אגב.

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

מיד אחרי ה-authoritative הוסיפו את הטקסט הזה:

subnet 192.168.42.0 netmask 255.255.255.0 {
        range 192.168.42.10 192.168.42.250;
        option broadcast-address 192.168.42.255;
        option routers 192.168.42.1;
        option domain-name "local";
        option domain-name-servers 8.8.8.8, 8.8.4.4;
}

מה עשינו פה? פשוט הגדרנו את הנתונים השונים עבור נקודת הגישה האלחוטית שלנו. היא תספק למי שמ תחבר אליה כתובת IP מ-192.168.42.10 ועד 192.168.42.250 וכתובת נקודת הגישה היא 192.168.42.1. נחמד, נכון?

השלב הבא הוא לקבוע שההגדרות האלו יופעלו על ה-wlan0 ובפרוטוקול IPV4. איך? כך:

sudo nano /etc/default/isc-dhcp-server

ואז נוודא ש-wlan0 מופיע ב-INTERFACESv4 ויש קומנט # לפני INTERFACESv6 (אני נפלתי ושכחתי וזה עלה לי בזמן דיבאג מתישות, אגב, שימו לב!).

INTERFACESv4="wlan0"
#INTERFACESv6=""

לוודא שה-isc-dhcp-server רץ אוטומטית

עוד משהו אולטרא חשוב הוא לוודא שהתוכנה תרוץ גם אם היא תעלה לפני שכרטיס הרשת מוכן. איך? אנו צריכים לקנפג את ה-service של התוכנה שירוץ אוטומטית גם אם הוא נכשל. איך? הפעולות הבאות:

העתקת קובץ הגדרות אל הסיסטם:

sudo cp /run/systemd/generator.late/isc-dhcp-server.service /etc/systemd/system

עריכת הקובץ

sudo nano /etc/systemd/system/isc-dhcp-server.service

בחלק של ה-service צריך לשנות את Restart ל on-failure ולהוסיף RestartSec=5

Restart=on-failure
RestartSec=5

להוסיף חלק [Install] אם הוא חסר ולהוסיף אליו WantedBy=multi-user.target

[Install]
WantedBy=multi-user.target

עכשיו להריץ את השורות הבאות שפשוט מתחילות את השירות מחדש – אם יש תקלות, לא להתעלם מהן! לחפש אותן בגוגל, סביר להניח שהן בגלל טעות איות בקבצי ההגדרות שלעיל.

sudo systemctl daemon-reload
sudo systemctl disable isc-dhcp-server
sudo systemctl enable isc-dhcp-server

⚠️ שימו לב: אם כאשר אתם מתחברים לנקודת הגישה האלחוטית והמכשיר נתקע בשלב קבלת ה-IP – כלומר Obtaining IP Address מופיע המון זמן ואין לכם אינטרנט – זה השלב שאותו אתם צריכים לבדוק שוב. שגיאת כתיב באחת ההגדרות, פספוס של שלב – זה בד"כ מה שקורה. נסו שוב ולאט.

שלב שלישי – התקנת  hostapd

עכשיו צריך לבחור איך הרשת שלנו תראה בחוץ ומי יוכל להתחבר אליה. את זה אנו עושים עם תוכנת hostapd שהתקנו כבר. נעתיק את קובץ ההגדרות של ברירת המחדל:

cd /etc/hostapd/
sudo cp /usr/share/doc/hostapd/examples/hostapd.conf .

נכנס לקובץ ההגדרות שהעתקנו:

sudo nano /etc/hostapd/hostapd.conf

עכשיו, זה החלק הטריקי, יש שם לא מעט הגדרות – צריך לעבור על ההגדרות האלו אחת אחרי השניה ולוודא שכל ההגדרות האלו מופיעות, אין # לפניהן. אם יש ערך אחר – יש לשנות אותו בהתאם למה שכתוב כאן. אם יש # לפני ההגדרה יש למחוק את ה-#. אם אין את ההגדרה יש להוסיף אותה:

interface=wlan0
ssid=mitmdemo                                  
macaddr_acl=0
auth_algs=1   
wmm_enabled=0  
wpa=2
wpa_passphrase=password2600           
wpa_key_mgmt=WPA-PSK               
wpa_pairwise=TKIP
rsn_pairwise=CCMP    

שימו לב לא לטעות פה. בערך ssid אנו מגדירים את שם הרשת ובערך wpa_passphrase אנו מגדירים את הסיסמה והסיסמה צריכה להיות בין 8 ל-63 תווים. כדאי מאוד להצמד להגדרות האלו.

כדי להפוך את קובץ ההגדרות לפעיל, אנו נכנס לקובץ הזה:

sudo nano /etc/default/hostapd

ונסיר את סימן ה-# לפני השורה הזו:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

הריצו את השורות האלו כדי לוודא שהשירות יהיה unmasked:

sudo systemctl unmask hostapd.service
sudo systemctl enable hostapd.service

⚠️ שימו לב: אם אתם לא רואים את הרשת האלחוטית שלכם מסיבה מסוימת: כאן יש את נקודת הכשל. שימו לב במיוחד להגדרות! בטעות כתבתי wpa_key_mgmt=WPA-PSKE במקום wpa_key_mgmt=WPA-PSK וזה פשוט גרם לשירות לא לעבוד. אז במידה ועשיתם את הכל ובסוף אין לכם בכלל רשת אלחוטית? בידקו את כל ההגדרות שלעיל.

שלב רביעי התקנת mitmproxy ו-mitmweb

יש לנו רשת! עכשיו נתקין את הפרוקסי שיקשר בין כבל הרשת לויי פי וגם יאפשר לנו להאזין לרשת. נתחיל עם התקנת ה-mitm-proxy

sudo pip3 install mitmproxy

אחרי ההתקנה, נוודא שהכל תקין עם:

mitmproxy --version

ונקבל את המידע הזה:

Mitmproxy: 5.3.0
Python:    3.7.3
OpenSSL:   OpenSSL 1.1.1d  10 Sep 2019
Platform:  Linux-5.4.72-v7l+-armv7l-with-debian-10.6

עכשיו נתקין ממשק נאה לשליטה על mitmproxy וגם נדאג לכך שהוא יופעל תמיד מההתחלה. ניצור ונערוך את הקובץ הזה:

nano /home/pi/start_mitmweb.sh

נכניס אליו את התוכן הזה:

#!/bin/bash
mitmweb --mode transparent --web-port 9090 --web-host 0.0.0.0 &>> /var/log/mitmweb.log

ונדאג שהקובץ יהיה ניתן להרצה באמצעות הפקודה הזו:

chmod a+x /home/pi/start_mitmweb.sh

מה שהקובץ הזה עושה הוא להריץ את השירות mitmweb, שמפעיל לנו ממשק ניהול נוח דרך הרשת עם כמה אפשרויות: webport שהוא 9090 למשל.

ניצור עכשיו service כדי שהוא יופעל אוטומטית . נכתוב:

sudo nano /etc/systemd/system/mitmweb.service

ונכניס אליו את התוכן הזה:

[Unit]
Description=mitmweb service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/home/pi/start_mitmweb.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

ונפעיל את השירות

sudo systemctl daemon-reload
sudo systemctl enable mitmweb.service

שלב חמישי – חיבור האינטרנט

כעת מה שנותר לעשות הוא בעצם לבצע את הקישור בין ה-eth0 ל-wlan0. ואת זה אנו עושים עם iptables.

מה שאנו עושים זה לשנות בחי את הניתוב ואז לשמור את הניתוב הזה ולגרום לו לרוץ מההתחלה. אנו נריץ את השורות האלו אחת אחרי השניה:

sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 808

⚠️ שימו לב: אם הקלדה פה יוצרת לכם שגיאה, פשוט תעשו ריסטארט לרספברי פיי ותקלידו שוב את השורות שלעיל.

נשמור את ההגדרות:

sudo sh -c "iptables-save > /etc/iptables.up.rules"

ועכשיו נכנס לקובץ הזה:

sudo nano /etc/rc.local

ונכניס לתוכו את הערך הזה לפני ה-exit 0.

iptables-restore < /etc/iptables.up.rules

כברירת מחדל מערכת ההפעלה לא מעבירה נתונים מחיבור הרשת הקווי אל ה-wifi אז אנו צריכים לומר לה לעשות את זה כך:

sudo sysctl -w net.ipv4.ip_forward=1

ולגרום לזה לעבוד גם אחרי הריבוט:

sudo nano /etc/sysctl.conf

ולהוריד את # מלפני השורה: net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

⚠️ שימו לב: אם הרשת תקינה, המכשיר שלכם מקבל IP אבל כתוב לכם שנקודת הגישה האלחוטית מנותקת מהאינטרנט – סביר להניח שטעיתם בצעדים האלו. הקפידו לבצע אותם שוב אחרי הפעלה מחדש של הרספברי פיי.

עכשיו אנו נעשה ריבוט לרספברי פיי עם

sudo reboot

שלב אחרון – לבדוק!

ניקח את הטלפון ונתחבר לווי פיי ששמו הוא mitmdemo עם הסיסמה password2600. אחרי שנתחבר בהצלחה, נכנס אל http://example.com. שימו לב להכניס http בפירוש כי בשלב זה אנו לא יכולים לעקוב אחר תשדורות ב-https.

יש לוודא את כתובת ה-IP של הרספברי פיי באמצעות הקלדת ip a מה-SSH של הרספברי פיי ולראות מה הכתובת שלו ב eth0 או באמצעות ping raspberrypi.local מהמחשב השני ברשת כדי לראות מה הכתובת שלו. להכנס באמצעות הדפדפן מהמחשב השני אל כתובת ה-ip ועם 9090: בסוף. למשל http://192.168.1.188:9090 אם כתובת הרספברי פיי היא 192.168.1.188. ולצפות בהנאה רבה בכל התשדורת. במקרה הזה הבקשה ל example.com.

ככה?!? שיומי שולחת מידע על חיבור לויי פיי בכל כניסה לטלפון לשרתים סיניים?!? מי היה מאמין!!!!1

מעקב גם אחר https

אם תכנסו אל https כאשר אתם מחוברים אל נקודת הגישה שלכם, אתם תקבלו אזהרה שהחיבור לא מאובטח. למה? כי ככה בדיוק HTTPS עובדת ומגינה עליכם מניסיונות רחרוח כאלו. אבל כיוון שיש לנו שליטה ביחידת הקצה, אנו יכולים להתקין תעודת אבטחה ראשית על הטלפון שלנו כדי לאפשר את הרחרוח הזה. איך? עם הטלפון נכנס אל http://mitm.it ושם כבר יש הוראות לכל מכשיר שהוא. עובד כמו קסם.

אבל זה לא עובד!

הסיכוי שהכל ילך חלק הוא 0 אחוז. תמיד יש בעיות. לפעמים בעיות הקלדה, לפעמים בעיות אחרות.

זה הזמן לחפש את סמן ה ⚠️ במדריך הזה שלא קראתם הרי במלואו כי רצתם להעתיק את שורות הקוד ולראות מה השתבש. ליד כל שימו לב והסימן ⚠️ יש תיאור של התקלה והסבר לאיפה טעיתם ואיך לתקן. 99% שברוב המקרים פשוט הקלדה לא נכונה או פספוס של הגדרה פה או שם יכולה לעורר בעיה. אם עדיין יש תקלה, בידקו את הסטטוס של כל סרוויס. יש לנו כאן כמה כאלו ובדיקה של כל אחד מהם עלולה לתת מידע שאפשר לגגל ולחפש:

systemctl status isc-dhcp-server.service
systemctl status dhcpcd
systemctl status mitmweb.service
systemctl status hostapd.service
בדיקה של סרוויס שעובד היטב – שימו לב שהוא active – כך זה צריך להראות. זה לא נראה כך? יש הודעת שגיאה וצריך לגגל אותה.
בדיקה של סרוויס שלא יצאה טוב. אפשר לראות שיש לי בעיה בסרוויס הזה. במקרה הזה אני פשוט אחזור על הצעדים בהתקנה והפעלה של הסרוויס הזה. במקרה הזה hostapd

פוסטים נוספים שכדאי לקרוא

פיתוח ב-JavaScript

Axios interceptors

תכנון נכון של קריאות AJAX באפליקציה ריאקטית וניהול השגיאות או ההצלחות עם פיצ׳ר נחמד של axios

מיקרו בקרים

הפעלת מסך oled קטנטן עם esp32

יצירת מערכת מולטימדיה שלמה בגודל של בול דואר עם מיקרובקר ובעלות של דולרים בודדים. וגם על הדרך נלמד על ת׳רדים

גלילה לראש העמוד