לא מעט פעמים אנו שומעים על תוקפים שמצליחים להשיג גישה לרשת ארגונית ומסתובבים בה כדי לחפש דברים ולראות אם יש כל מיני חולשות שונות ומשונות או דברים מעניינים. לא מעט פעמים זה נשמע מאד סייבר-סייברי ומאד לא מובן אז אני אנסה להסביר איך זה נראה מהצד של התוקף.
נניח ואני גולש ב-shodan, מנוע חיפוש שבמקום כתובות של אתרים מביא לי כתובות IP פתוחות. אני אדגים עם תוצאה אמיתית שחיפשתי עכשיו בישראל:
מדובר בתוצאות של מחשבים שמחוברים מרחוק – אולי מחשבי עבודה, אולי מחשבים בבית, אולי כל דבר אחר. הם אמורים להיות מוגנים בסיסמה, אבל מה קורה אם אני פותח תוכנה מרחוק לחיבור של חלונות – למשל Remote Desktop של מיקרוסופט, מכניס את כתובת ה-IP של אחד מהם ונכנס? אם אני מצליח לנחש את הסיסמה, יש לי גישה מלאה למחשב.
כך תוקפים מצליחים להשיג גישה למחשבים או ליחידות קצה. זה יכול להיות מחשב ממש, יכול להיות יחידה קצת יותר מאתגרת כמו שואב אבק חכם, דוד חכם, סטרימר ועוד דברים. אבל בואו ונצמד שניה למחשב.
מי שמצליח לגשת למחשב יכול לחטט ולראות מה יש במחשב. אם יש קבצים מעניינים על המחשב, תמונות מעניינות או כל דבר אחר. לפעמים זה ג׳ק פוט אבל הרבה פעמים מדובר במחשב לא מעניין. אולי שרת קבצים ישן שיש עליו סטרימר שעוזר לילדים לראות כל מיני סרטים, אולי מחשב שמשרת את מצלמות האבטחה, אולי סתם מחשב משחקים. אז התוקף בעצם פותח טרמינל ובודק איזה כתובות IP אחרות יש ברשת הפנימית. כל מחשב שנמצא ברשת הפנימית יכול ליצור קשר עם מחשבים באותה רשת (כאן יש פוסט מסודר שמסביר את עניין הרשת הפנימית מול הרשת החיצונית – מומלץ לקרוא אותו אבל לא חובה). נניח ומצאתי כתובת ip אחרת, אני יכול לבדוק מה יש בה. האם היא שואב אבק חכם? אז זה משעמם. או שמא היא שרת הקבצים והתמונות של הבית או של העסק? שאז זה סופר מעניין כי אפשר לשתות את המידע הזה. או לבצע התקפה על המחשב הזה ספציפית שהוא הרבה יותר קריטי מאשר שרת המשחקים הישן עם הסרטים של הילדים. אולי מדובר במצלמה חכמה שמכוונת לסלון, ואז אפשר להתחבר אליה ולהציץ (זו הסיבה שבחיים אני לא אתקין מצלמה חכמה בתוך הבית).
כך או כך, לא מעט תוקפים שמשיגים גישה – מתחילים להסתובב בתוך הרשת ולרחרח. זה לאו דווקא תוקפים אנושיים כמובן. לא מעט סקריפטים של תקיפה עושים את זה אוטומטית.
בנקודה הזו יש ״קנרית״. קנרית היא ציפור שיר חמודה מאד שכורי פחם באנגליה היו מורידים איתם למכרה. היא רגישה מאד לפחמן חד חמצני שהוא גם רעיל לבני האדם ואם הם היו רואים שהכנרית מתה או מתעלפת, הם היו בורחים מהמכרה (אגב, היו מכשירים להחייאת קנריות שהתעלפו). מפה מגיע השם ״קנרית״ למגוון מכשירים ותוכנות להתראה מוקדמת. זה יכול להיות בתחום הפיתוח – למשל תוכנה בגרסה ״קנרית״ שהיא תוכנה בגרסה ראשונית לנסיינים ונועדה למצוא טעויות. או בתחום האבטחה – מחשב שיושב ברשת הפנימית ומתריע אם מישהו מתחיל לרחרח. אותו מחשב יכיל כמה וכמה פורטים פתוחים למגוון תוכנות כדי לגרות את התוקף בסריקה.
OpenCanary היא תוכנה שמיועדת להתקנה על כל מחשב שיושב ברשת שלכם ותשלח התראה – במייל, סמס או כל דרך אחרת, אם מישהו מסתובב לכם ברשת. כך למשל, היא פותחת פורט ל-FTP או למסד נתונים. אם מישהו מנסה להתחבר אליה – סימן שמישהו זדוני הצליח להכנס לרשת. זו דרך מעולה לגלות הפתעות. הרי המכשיר יושב ברשת הפנימית ולא יוצא החוצה, מדוע שיהיה מישהו שינסה להכנס למסד נתונים מהרשת שלכם שהוא לא אתם?
לפעמים הסורק הוא ״תוכנה לגיטימית״ ממקור סיני זה או אחר של איזה IoT שהבאתם הביתה. לפעמים זה דווקא אותו IoT שהוא מקור לפורצים ולשאר מרעין בישין.
למרות שאפשר להתקין את OpenCanary על כל מחשב, מאד נוח וקל להתקין אותה על רספברי פיי שיושב בנחת בפינה של הבית, בד״כ ליד ה-pihole שהוא אחלה של דבר גם להתקין על רספברי פיי. והוא פשוט עוד שכבה של הגנה.
התקנת OpenCanary על רספברי פיי
אפשר להתקין את התוכנה על כל רספברי פיי שהוא. אני מניח שאתם יודעים כיצד להתקין רספברי פיי ולהתחבר אליו עם SSH. אם לא – אל דאגה, זה קל מאד. הכנסו לקישורים האלו של פוסטים שכתבתי:
רספברי פיי – מבוא והתקנה ראשונית
רספברי פיי – חיבור מרחוק עם SSH
תלמדו ותחזרו כשיש לכם רספברי פיי נקי שמחובר לרשת ואתם מחוברים אליו כמו שצריך. אנא הקפידו שה-hostname שלכם לא יהיה raspberrypi אלא משהו אחר. ניתן לקבוע את זה במהלך צריבת כרטיס הזכרון או אחר כך.
עדכון והכנת המערכת
עדכנו ליתר בטחון את המערכת שלכם באמצעות הפקודות:
sudo apt-get update
sudo apt-get upgrade -y
אחרי כמה דקות, הכל יסתיים. יש להתקין את החבילות הבאות:
sudo apt-get install git python3-virtualenv python3-dev libssl-dev libffi-dev -y
גם זה יקח קצת זמן. החבילות האלו הן חבילות פייתון שיעזרו ל-OpenCanary לעבוד.
אחרי שהכל הותקן. אנו ניצור תיקיה בשם open-canary מתיקית הבית שלנו ונכנס אליה.
mkdir open-canary
cd open-canary
ניצור virtualenv. למי שלא יודע מה זה – מדובר בסביבה פייתונית. אפשר ללמוד עליה בפוסט על pip שכתבתי אבל אפשר גם לא לדעת, זה לא קריטי במקרה הזה.
virtualenv .
הסביבה הוירטואלית הזו היא לא מחשב וירטואלית אלא תיקית פרויקט שמכילה את קבצי התלויות של הפרויקט. אחרי שיצרנו אותה, אנו נכנס אליה באמצעות
. ./bin/activate
שימו לב לנקודה בהתחלה של הקוד! אחרי שהקלדנו את זה, אנו נראה שיש סוגריים או אינדיקציה כלשהי שאנחנו בסביבה וירטואלית. למשל, כך זה נראה אצלי:
זה שלב קריטי רק כשאנו בתוך הסביבה הוירטואלית של פייתון אנו יכולים לבצע התקנות ולהריץ פעולות.
השלב הבא הוא להתקין סוף סוף את OpenCanary! נקליד:
pip install opencanary
נמתין מעט זמן ו… אם אין בעיות (בד״כ הבעיות קורות בגלל שאנחנו לא בסביבה הוירטואלית – אז שימו לב לזה) הכל יותקן. נקליד opencanaryd –version על מנת לוודא את זה. יש מספר גרסה? אפשר להתחיל לעבוד. ניצור עותק של קובץ הקונפיגורציה עם:
opencanaryd --copyconfig
הפקודה יוצרת עותק של קובץ הקונפיגורציה. אבל לא חייבים ליצור עותק אלא אפשר לעבוד עליו ישירות דרך:
sudo nano /etc/opencanaryd/opencanary.conf
אני מעדיף לעבוד עם עותק מסודר ואעתיק אותו אל התיקיה שלי:
cp /etc/opencanaryd/opencanary.conf .
נריץ את opencanary עם הפקודה:
opencanaryd --start
ו… נקבל קצת פלט אבל – זה עובד!
הערה: כפי שציינתי קוד אפשר לשנות ישירות את /etc/opencanaryd/opencanary.conf וממליצים על זה גם, אבל אפשר כדי להתנסות לשנות את קובץ ההגדרות מקומית ורק כשסגורים על עצמנו לשנות ב-/etc/opencanaryd/opencanary.conf.
תפעול ראשוני
בואו ונראה איך זה עובד. אם תבדקו את קובץ הקונפיגורציה, תראו שיש לנו logger ששומר את המידע בלוג בכתובת:
/var/tmp/opencanary.log
הנה קובץ הקונפיגורציה הראשוני שלי יש:
{
"device.node_id": "opencanary-1",
"ip.ignorelist": [ ],
"logtype.ignorelist": [ ],
"git.enabled": false,
"git.port" : 9418,
"ftp.enabled": true,
"ftp.port": 21,
"ftp.banner": "FTP server ready",
"http.banner": "Apache/2.2.22 (Ubuntu)",
"http.enabled": false,
"http.port": 80,
"http.skin": "nasLogin",
"https.enabled": false,
"https.port": 443,
"https.skin": "nasLogin",
"https.certificate": "/etc/ssl/opencanary/opencanary.pem",
"https.key": "/etc/ssl/opencanary/opencanary.key",
"httpproxy.enabled" : false,
"httpproxy.port": 8080,
"httpproxy.skin": "squid",
"logger": {
"class": "PyLogger",
"kwargs": {
"formatters": {
"plain": {
"format": "%(message)s"
},
"syslog_rfc": {
"format": "opencanaryd[%(process)-5s:%(thread)d]: %(name)s %(levelname)-5s %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout"
},
"file": {
"class": "logging.FileHandler",
"filename": "/var/tmp/opencanary.log"
}
}
}
},
"portscan.enabled": false,
"portscan.ignore_localhost": false,
"portscan.logfile":"/var/log/kern.log",
"portscan.synrate": 5,
"portscan.nmaposrate": 5,
"portscan.lorate": 3,
"portscan.ignore_ports": [ ],
"smb.auditfile": "/var/log/samba-audit.log",
"smb.enabled": false,
"mysql.enabled": false,
"mysql.port": 3306,
"mysql.banner": "5.5.43-0ubuntu0.14.04.1",
"ssh.enabled": false,
"ssh.port": 22,
"ssh.version": "SSH-2.0-OpenSSH_5.1p1 Debian-4",
"redis.enabled": false,
"redis.port": 6379,
"rdp.enabled": false,
"rdp.port": 3389,
"sip.enabled": false,
"sip.port": 5060,
"snmp.enabled": false,
"snmp.port": 161,
"ntp.enabled": false,
"ntp.port": 123,
"tftp.enabled": false,
"tftp.port": 69,
"tcpbanner.maxnum":10,
"tcpbanner.enabled": false,
"tcpbanner_1.enabled": false,
"tcpbanner_1.port": 8001,
"tcpbanner_1.datareceivedbanner": "",
"tcpbanner_1.initbanner": "",
"tcpbanner_1.alertstring.enabled": false,
"tcpbanner_1.alertstring": "",
"tcpbanner_1.keep_alive.enabled": false,
"tcpbanner_1.keep_alive_secret": "",
"tcpbanner_1.keep_alive_probes": 11,
"tcpbanner_1.keep_alive_interval":300,
"tcpbanner_1.keep_alive_idle": 300,
"telnet.enabled": false,
"telnet.port": 23,
"telnet.banner": "",
"telnet.honeycreds": [
{
"username": "admin",
"password": "$pbkdf2-sha512$19000$bG1NaY3xvjdGyBlj7N37Xw$dGrmBqqWa1okTCpN3QEmeo9j5DuV2u1EuVFD8Di0GxNiM64To5O/Y66f7UASvnQr8.LCzqTm6awC8Kj/aGKvwA"
},
{
"username": "admin",
"password": "admin1"
}
],
"mssql.enabled": false,
"mssql.version": "2012",
"mssql.port":1433,
"vnc.enabled": false,
"vnc.port":5000
}
הבה ונפתח את הלוג ונראה! נכתוב את פקודת tail שמציגה ב״שידור חי״ את כל השינויים הטקסטואליים שיש בלוג:
tail -f /var/tmp/opencanary.log
נוכל לראות שיש שם משהו בסגנון:
{"dst_host": "", "dst_port": -1, "local_time": "2024-09-07 09:15:58.535097", "local_time_adjusted": "2024-09-07 12:15:58.535200", "logdata": {"msg": {"logdata": "Canary running!!!"}}, "logtype": 1001, "node_id": "ran-barzik-secrets", "src_host": "", "src_port": -1, "utc_time": "2024-09-07 09:15:58.535184"}
שזה אומר שיש לנו canary פועל.
בואו ונראה התרעה חיה בשידור חי. נפתח טרמינל נוסף ברספברי פיי או ברספברי פיי אחר שיש לנו ונתקין את תוכנת FTP. למי שלא מכיר – תוכנה להעברת קבצים שעובדת בפרוטוקול מיוחד ובפורט 21.
sudo apt-get install ftp
ננסה להתחבר עם ה-ftp למכונה שלנו. אם אתם מריצים את ה-ftp ברספברי פיי שיש בו את ה-OpenCanary עשו זאת באמצעות:
ftp localhost
אחרי כמה אנטרים של בקשת החיבור וניסיון החיבור, תוכלו לראות שיש אכן התראה בלוג!
{"dst_host": "127.0.0.1", "dst_port": 21, "local_time": "2024-09-07 09:39:46.852010", "local_time_adjusted": "2024-09-07 12:39:46.852203", "logdata": {"PASSWORD": "", "USERNAME": "barzik"}, "logtype": 2000, "node_id": "ran-barzik-secrets-2", "src_host": "127.0.0.1", "src_port": 54478, "utc_time": "2024-09-07 09:39:46.852162"}
מישהו ניסה לחטט במכונה שלכם וקיבלתם התראה! טוב, סוג של התראה. בואו ונראה איך אפשר לעשות שההתראה הזו תעבוד יותר טוב.
שינוי הקונפיגורציה ושליחת מייל
אז יש כמה דרכים לשלוח התראות בימינו. אפשר לעשות את זה עם מייל, בדרך כלל זה עובד מעולה עם ג׳ימייל. הרשת מלאה בדוגמאות עם שם משתמש וסיסמה, אבל כיוון שיש לכם אימות דו שלבי (אם אין לכם, עשו עכשיו אימות דו שלבי ואז תחזרו לפה) – זה אפילו יותר קל. צריכים לייצר סיסמה עבור ה-OpenCanary. איך? נכנסים להגדרות גוגל באמצעות הקלדה על הפנים שלנו באחד מהאתרים של גוגל או כניסה לכתובת https://myaccount.google.com
נלחץ על לשונית ה- Security ונבחר ב-2-steps verification.
במסך הבא, נגלול עד הסוף למטה.
ניכנס וניצור App password. זו סיסמה שנוכל להשתמש בה במקום הסיסמה ל-Gmail שבאמת עדיף שלא תדלוף.
כל מה שצריך זה להכניס את ההגדרות של חשבון הג׳ימייל, הסיסמה הזו שקיבלנו ל-Logger כך שברגע שתהיה התראה לא רק ללוג עצמו של המכונה אלא נקבל מייל התראה מסודרת.
איך עושים את זה? בגדול יש שתי דרכים – הראשונה פשוט לשנות את ה-opencanary.conf למשהו בסגנון הזה:
"handlers": {
"console": {
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout"
},
"file": {
"class": "logging.FileHandler",
"filename": "/var/tmp/opencanary.log"
},
"email": {
"class": "logging.handlers.SMTPHandler",
"mailhost": ["smtp.gmail.com", 587],
"fromaddr": "[email protected]",
"toaddrs": ["[email protected]"],
"subject": "OpenCanary Alert",
"credentials": ["[email protected]", "kaka lebn abcd aged"],
"secure": []
}
}
}
},
השניה, שזה מה שסביר להניח שתעשו – זה להעתיק את opencanary.conf ל-ChatGPT או LLM אחר ולהעביר לו את סיסמת דמו של ה-App (לא את הסיסמה האמיתית אבל משהו שיהיה לכם קל להחליף אליו), החשבון שלכם בג׳ימייל והחשבונות שאתם רוצים לשלוח אליהם והוא יבצע את התיקונים. כל מה שאני צריך לעשות זה למחוק את opencanary.conf הישן ולהכניס את opencanary.conf החדש שה-LLM נותן לי.
אחרי שנעשה את זה, נוכל לבדוק ולראות שבאמת מקבלים מייל מסודר אם אנחנו למשל שולחים FTP.
שינוי Mac Address
אני מאמין שאתם מכירים, אבל מי שלא – מדובר בכתובת הפיזית של כרטיס הרשת (קווי או אלחוטי) של המכשיר במקרה הזה רספברי פיי. הכתובת הזו יכולה להסגיר שהקנארי שלנו היא קנארי מתחזה ולא איזה אוצר בלום של מידע. למה? כי כל יצרן מקבל תחילית משלו. למשל התחילית של רספברי פיי היא C4:85:08 בדרך כלל. אם תוקף (או יותר נכון סקריפט) מסתובב ומתחיל לרחרח, הוא יכול לראות שמדובר ברספברי פיי ולא להכנס. על מנת לראות את ה-MAC Address של החיבור הפעיל שלכם, יש להקליד:
ip link show
ולראות את התוצאה – יש לנו שני חיבורים ברספברי פיי – eth0 שהוא החיבור הקווי ו-wlan0 שהוא החיבור של הוויפיי. החיבור הפעיל יוצג:
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT group default qlen 1000
link/ether C4:85:08:42:22:01 brd ff:ff:ff:ff:ff:ff permaddr dc:a6:32:c5:25:06
פה אפשר לראות את ה-MAC address של היחידה: C4:85:08:42:22:01
איך אני משנה אותו? יש כמה שיטות, אני מעדיף להשתמש בשיטה בדוקה וקצת איטית אבל כזו שלא תעשה נזקים ובלגנים וגם תעבוד תמיד. החלק הכי חשוב הוא לבחור MAC Address אחר, אני בחרתי ב-00:11:32:42:22:01 שהוא של שרת קבצים. אפשר וצריך להעזר פה ב-ChatGPT ועוזריהם.
בגדול אנו נתקין כלי לשינוי ה-Mac Adress וניצור שירות שיפעיל אותו בכל פעם שהרספברי פיי עולה.
אם אתם בסביבה הוירטואלית של פייתון, צאו ממנה באמצעות deactivate.
נתקין את macchanger
sudo apt-get install macchanger
אחרי ההתקנה נשאל אם אנו רוצים להחליף MAC. סמנו כ-״לא״
אחרי ההתקנה, ניצור קובץ שמפעיל אותו. נקליד:
sudo nano /etc/network/if-up.d/macchange
ונכניס את התוכן הבא – אם אתם מחוברים עם אינטרנט קוי, החליפו את wlan0 ב eth0 וכמובן החליפו את 00:11:32:42:22:01 ב-MAC Address שלכם.
#!/bin/sh
if [ "$IFACE" = lo]; then
exit 0
fi
sudo /usr/bin/macchanger -m 00:11:32:42:22:01 wlan0
נאפשר הרצה של הקובץ:
sudo chmod 755 /etc/network/if-up.d/macchange
ונתחיל ביצירת ה-service. נקליד:
sudo nano /lib/systemd/system/macchange.service
ונכניס את הטקסט הזה:
[Unit]
Description=MAC Address change
After=multi-user.target
After=syslog.target
After=network.target
[Service]
Restart=always
ExecStart=/etc/network/if-up.d/macchange
[Install]
WantedBy=mutli-user.target
זהו! ה-service מוכן. עכשיו נפעיל אותו ונדאג שהוא יעלה בכל פעם שהרספברי פיי עולה:
sudo chmod 644 /lib/systemd/system/macchange.service
sudo systemctl daemon-reload
sudo systemctl enable macchange.service
הפעלה של OpenCanary באופן אוטומטי
עם כל ה-rebootים האלו, אפשר לראות שה-OpenCanary שלנו לא מתרומם כל פעם וצריך להפעיל אותו ידנית. אנו רוצים שהוא יעלה אוטומטית גם לאחר ריסטארט אז בדיוק כמו ה-MacChanger, אנו ניצור לו service. אבל יש פה קצת catch. למה? כיוון ש-OpenCanary מאזין לפורט 22 ויהיו לנו התנגשויות אם ננסה להעלות אותו באופן אוטומטי. אנו נצטרך לשנות את פורט ה-SSH שלנו לפורט אחר. אפשר משהו רנדומלי כמו 2523 למשל.
איך עושים את זה?
הקלידו את הפקודה:
sudo nano /etc/ssh/sshd_config
הורידו את ה-# לפני ה-22 ומשנים את 22 למה שרוצים. למשל ל-2523 ואז שומרים ומקלידים:
sudo service ssh restart
מהנקודה הזו, אנו נכנס לרספברי פיי עם ssh -p 2523 HOSTNAME ולא עם ssh רגיל שמקונפג לפורט 22.
השלב הבא הוא להפעיל את
sudo nano /lib/systemd/system/opencanary.service
ונכניס את הקוד שלעיל – שימו לב היטב לשורה המודגשת שמכילה את הנתיב המדויק של ההתקנה – אצלכם זה יהיה שונה, אלא אם כן שם המשתמש שלכם הוא barzik 😂
[Unit]
Description=OpenCanary Service
After=network.target
[Service]
ExecStart=/home/barzik/open-canary/env/bin/opencanaryd --dev
StandardOutput=journal
StandardError=journal
Restart=on-failure
User=root
[Install]
WantedBy=multi-user.target
אחרי שהכנסתם את הטקסט הזה, נשמור ונצא.
נפעיל את שלוש הפקודות האלו:
sudo chmod 644 /lib/systemd/system/opencanary.service
sudo systemctl daemon-reload
sudo systemctl enable opencanary.service
ו… זהו! נפעיל מחדש את הרספברי פיי ונראה שיש גם בלוג וגם במייל התראה על זה שהוא הופעל.
שימו לב שכאן הוא לוקח את ההגדרות ישירות מ-etc.
סיכום
זה היה די ארוך ויש עוד המון מה לעשות, ראשית אפשר וצריך להעזר ב-LLM זה או אחר כדי לשנות את הקונפיגורציה כדי להתאים אותה. פשוט הזינו את הקונפיגורציה של OpenCanary ותבקשו הצעות לשיפור ותנסו. אפשר גם להפוך את ההתראות ליותר ידידותיות, לחבר התראות לטלגרם או לאפליקציה בטלפון הנייד.
מבחינה תפעולית, אפשר גם לשנות את ה-Fingerprinting של מערכת ההפעלה כדי להפוך את הרספברי פיי שלנו ליותר מסתורי ואפלולי. אם תהיה דרישה, אני אכתוב מאמר המשך.
6 תגובות
אחלה פוסט! רץ לנסות את זה.
רק דבר אחד חסר – נגיד שבאמת קיבלתי התרעה שמישהו מרחרח לי את הרשת הפנימית, מה אני עושה עם זה חוץ מלבכות ?
אחלה מדריך, לא ידעתי שזה קיים ולגמרי שווה להוסיף את זה לרשת.
אין מה לחשוש משינוי הmac של הrpi? לא כלול להיות בעייתי לתוכנה אחרת או לdhcp של הראוטר?
וגם שינוי של הפורט ssh מ22, לא הייתי באותו אופן?
מעבר לזה אשמח שתכתוב את מדריך ההמשך, מעניין מאוד
נתקל בקשיים שנראה לי נובעים מהרשאות יוזר על ספריות.
יש לי פירוט במסמך גוגל. לאן לשלוח שייר?
מאוד מעניין. אשמח לפוסט המשך.
ממש מעניין – תודה רבה
אנסה ונראה איך זה הולך
It should be:
"SMTP"
Instead of :
"email"
when configuring