בניית רשת אלחוטית עם ESP32 ופייתון

בניית Access point עם מיקרובקר ופייתון במספר שורות קוד וגם תעלולים מעניינים שאפשר לעשות עם זה.

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

כרטיס הרשת של ESP32 מאפשר לנו להתחבר לכל WiFi בלי בעיה אבל גם ליצור רשת אלחוטית עם איזה SSID שאנו רוצים וכל זה עם סקריפט פייתון פשוט. למשל, אם אני רוצה ליצור רשת אלחוטית פשוטה – אני צריך להריץ את הקוד הזה שמשתמש ב-network module כדי לתקשר עם כרטיס הרשת ולפתוח Access point. אם תכניסו את הקוד הזה ל-Thonny הנאמן שלכם ותצרבו אותו ל-ESP32 שלכם, תוכלו לראות מייד רשת כזו.

import network

ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid='MyESP32AP')
ap.config(authmode=network.AUTH_WPA_WPA2_PSK, password='myPassword')
ap.ifconfig(('10.0.0.1', '255.255.255.0', '10.0.0.1', '10.0.0.1'))

print('Network established:', ap.ifconfig())

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

ap.ifconfig(('10.0.0.1', '255.255.255.0', '10.0.0.1', '10.0.0.1'))

בגדול היא מגדירה את טווח כתובת ה-IP של מי שמתחבר אל הרשת – מ 10.0.0.1 ואת הכתובת של ה-ESP32.

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

רשת אלחוטית בשם MyESP32AP

הקוד הזה אגב, מגדיר את ה-IP של ה ESP32 כ 10.0.0.1. זה שימושי אם רוצים להתחבר אליו. למשל בקוד הזה אני יוצר שרת אינטרנט שמראה את כתובת ה-IP של מי שהתחבר אליו. אם אני אקח את הטלפון שלי ואתחבר אל הרשת ואז אכנס אל 10.0.0.1 – אני אראה את האתר שיציג לי את כתובת ה-IP הפנימית שלי.

אתר פנימי של ESP32 שמראה את כתובת ה-IP של מי שהתחבר לכתובתו: 10.0.0.1
import network
import socket

ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid='MyESP32AP')
ap.config(authmode=network.AUTH_WPA_WPA2_PSK, password='myPassword')
ap.ifconfig(('10.0.0.1', '255.255.255.0', '10.0.0.1', '10.0.0.1'))

webpage = """
<!DOCTYPE html>
<html>
<head>
<title>ESP32 Access Point</title>
</head>
<body>
<h1>Welcome to ESP32 Access Point!</h1>
<p>Your IP address is {}.</p>
</body>
</html>
"""

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
    conn, addr = s.accept()
    request = conn.recv(1024)
    response = webpage.format(addr[0])
    conn.send('HTTP/1.1 200 OK\n')
    conn.send('Content-Type: text/html\n')
    conn.send('Connection: close\n\n')
    conn.sendall(response)
    conn.close()

אפשר לעשות ריפיטר של אינטרנט אגב, אבל עם פייתון זה קשה יותר. אני אכתוב על כך בפוסט אחר.

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

משפט ותיק אומר: ״Home is where your WiFi is״ – ואכן, ביתו של אדם הוא מבצרו ובמבצר יש את רשת ה-WiFi הביתית שלנו שאליה אנו מתחברים אוטומטית. איך הטלפון שלנו או הלפטופ מזהה את הרשת? לפי השם. כמובן שאנחנו בד״כ לא מתחברים רק לרשת הביתית שלנו אלא לרשתות אחרות – המרכזית היא זו של נמל התעופה בן גוריון, אבל גם זו של הרכבת, בתי קפה פופולריים (ארומה, קפהקפה ועוד מקומות שמשמשים לעבודה).

מה יקרה אם אני אצור רשת אלחוטית שיש לה שם כמו נמל התעופה ובלי סיסמה? מה שיקרה הוא שטלפונים שזוכרים את השם, בהנחה והם נמצאים במקום בלי רשת אחרת מוכרת, ינסו להתחבר אליה. הם יתנתקו כמובן אם אין חיבור אינטרנט תקין (בחלק מהטלפונים) אבל חיבור יהיה! ואם יש חיבור… אפשר לתעד את מי שהתחבר או יותר נכון את ה mac address (הכתובת הפיזית) של כרטיס הרשת שלו!

רשת אלחוטית מזויפת של נמל התעופה בביתי.

עושים את זה עם קוד הפייתון הזה:

import network
import time
import ubinascii

# Setup the Access Point
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid='WIFI_BEN_GURION_AIRPORT')  # No password

# Access Point IP, Subnet
ap.ifconfig(('192.168.4.1', '255.255.255.0', '192.168.4.1', '8.8.8.8'))

# Keep track of MAC addresses that tried to connect
logged_mac_addresses = set()

while True:
    # Get list of connected stations
    stations = ap.status('stations')
    
    # Loop through all connected stations
    for station in stations:
        mac_address = ubinascii.hexlify(station[0], ':').decode()
        if mac_address not in logged_mac_addresses:
            logged_mac_addresses.add(mac_address)
            print("New station connected:", mac_address)
    
    # Sleep for 5 seconds
    time.sleep(5)

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

זהו. עד כאן מאמר קצר שלפי דעתי יעשה לכם חשק לתעלולים כיפיים 🙂

המאמר הבא הוא יותר מעשי – בניית WiFi Extender והדגמה גם על איך צורבים קושחה יעודית (עם מק)

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

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

פתרונות ומאמרים על פיתוח אינטרנט

נגישות טכנית – פודקאסט ומבוא

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

תמונה מצוירת של רובוט שמנקה HTML
יסודות בתכנות

סניטציה – למה זה חשוב

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

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