הפקודה מחכה ב-banner של שרת FTP: כך שתי נוזקות חדשות מקבלות את ההוראות שלהן
קובץ קיצור דרך מגיע בהודעה בספרדית, עם הבטחה לשובר הנחה. מי שלוחץ עליו לא מוריד כלום, לפחות לא מיד: המחשב פותח חיבור FTP לשרת מרוחק, מקבל את שורת הטקסט שהשרת שולח לכל מי שדופק בדלת, וקורא משם את הפקודה הבאה שלו. בשורה הזאת, שאמורה להחזיק משפט ברכה בנוסח "ברוכים הבאים לשרת", יושבת ההוראה להוריד את המטען האמיתי.
חוקרי SOCRadar פרסמו ב-21 באוגוסט ניתוח של הטכניקה הזאת ושל מה שהיא מובילה אליו. יחידת המחקר שלהם, STRU, כותבת שהיא איתרה ניצול פעיל שלה בשטח מתחילת יולי 2026, ושהתשתית עדיין חיה. מתוך אותה תשתית נחשפו שתי נוזקות שליטה מרחוק שאיש לא תיעד קודם, שהחוקרים מכנים E4del ו-PINHOLE.
בהמשך נראה למה דווקא שורת הפתיחה של FTP, מה כל אחת מהנוזקות עושה אחרי שהיא בפנים, ולמה השנייה מהן משקיעה שישה שלבי פריקה רק כדי להגיע לקוד שלה.
הרעיון שמאחורי המחבוא
לכל נוזקה יש בעיה בסיסית: היא חייבת לדעת לאן לפנות כדי לקבל פקודות, אבל אם כתובת השרת של התוקף כתובה בתוך הקובץ עצמו, מספיק חוקר אחד שיפתח אותו כדי לשרוף את כל התשתית. הפתרון שהתוקפים אימצו מזמן הוא להשאיר את הכתובת במקום ציבורי ולגיטימי, ולתת לנוזקה ללכת לשלוף אותה משם בזמן אמת. פוסט ברשת חברתית, תיאור של סרטון, קובץ ב-GitHub. ל-MITRE יש לזה שם: Dead Drop Resolver, על שם תיבת המסירה שסוכנים משאירים בפארק.
עד כאן זה מוכר. מה שחדש כאן הוא הבחירה בפרוטוקול במקום בשירות רשת. כל שרת FTP שולח, עוד לפני שביקשתם ממנו משהו, שורת טקסט חופשית שמזהה את עצמו, וקוראים לה banner. מי שמנהל את השרת יכול לכתוב שם מה שירצה. התוקפים כותבים שם פקודה.
החוקרים מציינים בעצמם שהמחבוא הזה פחות טוב מקודמיו: חיבור FTP שיוצא ממחשב של עובד אל שרת לא מוכר הוא חריג בולט, בזמן שפנייה ל-Pinterest נבלעת ברעש. הראשון שתיעד את היכולת הזאת בקבצי קיצור דרך היה החשבון MalwareHunterTeam, וכשהחוקרים ניגשו לבדוק, התשתית מהפוסט המקורי כבר לא הייתה פעילה. אז הם סרקו את הרשת בעצמם, דרך מנוע החיפוש FOFA, וחיפשו שרתים אחרים שמחזיקים פקודות ב-banner.
E4del: נוזקה שרצה בתוך Discord חתום
השרשרת הראשונה מובילה ל-Discord. לא לגרסה מזויפת של Discord, אלא לקובץ ההרצה האמיתי, חתום דיגיטלית כמו שצריך. Discord בנויה על Electron, מסגרת שאורזת אפליקציית דפדפן שלמה יחד עם סביבת Node.js, וכל קוד האפליקציה יושב בארכיון אחד בשם app.asar. התוקפים משאירים את הבינארי החתום במקומו, מחליפים את תוכן הארכיון, ומקבלים תוצאה נוחה מאוד מבחינתם: מערכת ההפעלה רואה קובץ Discord חתום שטוען ספריות מוכרות, והקוד הזדוני יושב בדיוק במקום שאף אחד לא בודק.
הנוזקה שנטענת כך היא E4del, כתובה ב-Node.js. הדבר הראשון שהיא עושה הוא לוודא שהיא במקום הנכון. היא מצפה לקבל בשורת הפקודה את שם המשתמש של הקורבן, ואם השם שרץ במערכת לא תואם, היא נסגרת מיד. זו הגנה מול ארגזי חול אוטומטיים, שמריצים דגימות בלי הארגומנטים המקוריים. אחר כך היא מוסיפה ל-Electron מתגים כמו headless ו-disable-gpu כדי שלא ייפתח שום חלון על המסך, ורושמת את עצמה להפעלה אוטומטית בכניסת המשתמש דרך מנגנון פריטי ההתחברות של Electron עצמו.
לפני שהיא פונה לשרת של התוקף היא מייצרת לעצמה תעודת זהות: SHA256 של כתובות ה-MAC של כרטיסי הרשת יחד עם דגם המעבד. כך התוקף ממשיך לזהות את אותו מחשב גם אם הוא עובר רשת. במקביל היא מריצה שאילתת WMI או קוראת ברישום כדי לראות איזה אנטי-וירוס מותקן, ומחפשת ברשימה שמות כמו Windows Defender, ESET, CrowdStrike וקספרסקי.
התקשורת עצמה היא בקשות HTTP POST מוצפנות ב-AES-256-CBC, עם סיסמה קבועה שמוטמעת בקוד ועם User-Agent מזויף של Chrome. מה שמעניין יותר הוא הקצב. במקום מרווח קבוע בין פנייה לפנייה, שהוא בדיוק מה שמערכות זיהוי מחפשות, E4del מחליפה שלושה מצבים לפי הזמן שעבר מאז המשימה האחרונה שקיבלה: בעשרים השניות הראשונות היא פונה שוב כל 200 מילישניות עד שתי שניות, בין 20 ל-40 שניות היא מאטה לשתיים עד חמש שניות, ומעבר לזה יורדת לחמש עד תשע. אין שם קו ישר לתפוס.
הפקודות שהיא מקבלת כוללות shell הפוך, צילום מסך, שידור חי של שולחן העבודה לכתובת שהתוקף בוחר, והורדה והרצה של מטענים נוספים.
ומה השנייה עושה אחרת?
PINHOLE יושבת על אותה טכניקת מסירה ונראית אחרת לגמרי. גם היא מתחילה ב-banner של שרת FTP, אבל משם היא עוברת דרך סקריפט שכותב לדיסק גוש טקסט מקודד ועוטף אותו בכותרות של תעודה דיגיטלית, BEGIN CERTIFICATE ו-END CERTIFICATE, כדי שייראה כמו קובץ תמים. כלי מערכת סטנדרטי של Windows מפענח את "התעודה" בחזרה לארכיון, וממנו נשלף קובץ ההרצה. החוקרים מציינים שהודעות השגיאה בסקריפט כתובות בספרדית, בדיוק כמו הפיתיון של E4del.
התוקפים מתחזקים גם לוח בקרה משלהם למעקב אחרי הקמפיין, וכאן מגיע הפרט שמעמיד את הכול בפרופורציה: ברגע הניתוח הסקריפט רץ אצל קורבנות 11 פעמים בסך הכול. זו הפעלה בחיתוליה, לא מבצע רחב.
מכאן מתחיל החלק שבו PINHOLE משקיעה. את ההגדרות שלה היא שומרת במקום שרוב הכלים לא מסתכלים בו, ב-Alternate Data Streams, תוספת של מערכת הקבצים NTFS שמאפשרת להצמיד לקובץ קיים זרם נתונים נוסף שלא מופיע ברשימת הקבצים ולא משנה את הגודל המוצג. שני קבצי desktop.ini תמימים, בתיקיית ההורדות ובתיקיית המסמכים, מחזיקים ככה את מזהה הגרסה של הנוזקה, את מפתח ההצפנה שלה, ואת כתובות המחבוא שממנו היא שולפת את שרת השליטה.
והמחבוא הזה הוא Pinterest. שני pin-ים ושאלה אחת בסקר ב-SurveyMonkey מחזיקים, חבויים בתוך ה-HTML בין תוחמים מוסכמים, את הדומיין האמיתי של שרת השליטה ובקרה (C2, השרת שדרכו התוקף שולח פקודות לנוזקה) ואת כתובת ה-Cloudflare Worker שדרכו התעבורה מנותבת. הנוזקה בונה בקשה שעוברת דרך ה-Worker, ורק אם זה נכשל היא פונה ישירות. מבחינת מערכת סינון ברשת הארגונית, מה שנראה הוא פנייה ל-Pinterest ואחריה פנייה לדומיין של Cloudflare. שתיהן עוברות.
ההגנה על הקוד עצמו באותה רמה. הבינארי הראשון בודק אם הוא רץ תחת אמולטור, שולף מספרי קריאות מערכת בעקיפה של ה-hook-ים שמוצרי EDR שותלים ב-ntdll (טכניקה שנקראת Halo's Gate), ואז מוריד את השלב הבא ומפרק אותו בשש שכבות: כותרת JPEG מזויפת, shellcode מרופד בפקודות סרק, שני שלבי XOR, מבנה תצורה מוצפן של הכלי הפתוח Donut, ולבסוף דחיסת aPLib. באחד השלבים באמצע הדרך הקוד מוגן בשיטה שנקראת shellcode fluctuation: הטוען מסמן את אזור הזיכרון ככזה שאסור להריץ ממנו, תופס בכוונה את השגיאה שנוצרת, ומפענח בכל רגע רק את הדף הבודד של 4 קילובייט שהמעבד מבקש, ומצפין בחזרה את הקודם. מי שיצלם את הזיכרון של התהליך ברגע אקראי יקבל דף אחד קריא, וכ-11 קילובייט מוצפנים.
בסוף כל זה המטען מוזרק לתהליך לגיטימי של Windows בשם ApplicationFrameHost.exe, עוד לפני שהתהליך הספיק להתחיל לרוץ באמת. מה שנכנס לשם תומך ב-14 פקודות: מיפוי קבצים, העלאה והורדה, הרצת קבצים, סיום תהליכים, צילום מסך, סשן PowerShell מתמשך, ומודול ייעודי לחילוץ פרטי אימות מדפדפנים, שאותו החוקרים לא הצליחו למשוך בזמן הניתוח.
אז לאן זה הולך מכאן?
שתי הנוזקות האלה לא קשורות זו לזו. SOCRadar מתייחסים אליהן כשני אשכולות נפרדים שנשענים על אותה טכניקת מסירה, וכותבים במפורש שאין בידיהם מספיק ראיות כדי לשייך אף אחת מהן לשחקן מוכר. גם ההערכה על היקף הקמפיין מוגבלת בינתיים למה שנראה בלוח הבקרה של PINHOLE, כלומר לספירה של התוקפים עצמם.
מה שכן אפשר לומר, וזה החלק שרלוונטי לכל מי שמגן על רשת ארגונית, הוא לאן הכיוון הולך. אין כאן חולשה, אין CVE, ואין שום דבר לתקן. יש כאן שימוש בפרוטוקול ותיק ובשלושה שירותים לגיטימיים לחלוטין כדי להעביר את פיסת המידע היחידה שהתוקף באמת חייב להעביר: לאן לפנות. הזיהוי, אם הוא יקרה, יקרה ברשת ולא על הקובץ.
החוקרים מוסיפים שהטכניקה מתאימה בקלות גם לקמפיינים מסוג ClickFix, שבהם הקורבן מדביק את עצמו אחרי שמבקשים ממנו להעתיק שורה ולהריץ אותה בעצמו. שם כבר אין קובץ קיצור דרך שמישהו יכול לחסום בשער.
מה זה אומר בפועל
חיבור FTP שיוצא מתחנת עבודה רגילה אל שרת לא מוכר הוא חריגה ששווה להתריע עליה, וברוב הארגונים אין שום סיבה לגיטימית שהוא יקרה בכלל. אם יש לכם בקרת אפליקציות, בדקו שהיא מסתכלת גם על מה שרץ מתוך תיקיות המשתמש ולא רק על שמות קבצים מוכרים, כי קובץ Discord חתום שיושב בפרופיל המשתמש עובר כל בדיקת חתימה בשלום. ולמי שבודק מכונה חשודה ידנית: המנגנון שמחזיר את PINHOLE לפעולה בכל כניסת משתמש כותב ברישום ערך ישן בשם Load, תחת המפתח Windows NT\CurrentVersion\Windows, מקום שכלי בדיקה אוטומטיים לפעמים מדלגים עליו.
תגובות