מי שחיפש בברזיל אפליקציה להימורי ספורט בחודשים האחרונים יכול היה לקבל תוצאה שנראית אמינה יותר מכל השאר: כתובת שמסתיימת ב-gov.br, אתר של עירייה או של רשות ציבורית, ובתוכו נתיב בשם /jogos. הדף שנפתח שם מחקה את חנות Google Play, על הדירוגים, מספר הביקורות והלוגו במקום. הוא גם לא מתארח על השרת הממשלתי בכלל.

החוקר אמית ירדני מ-Check Point Research פרסם ב-2 בספטמבר ניתוח של הקמפיין שמאחורי הדפים האלה. הקבוצה, שצ'ק פוינט מכנה Gambling Goblin, פועלת נגד ארגונים בברזיל מאמצע 2025, ורוב הקורבנות שלה הם גופים ממשלתיים ומוסדות חינוך. בהמשך נראה איך התוקפים הופכים שרת אינטרנט חטוף לחזית של עצמם, למה דווקא דומיינים ממשלתיים, ומה עוד מותקן על אותם שרתים מלבד הפרוקסי.

למה שווה לפרוץ לשרת של עירייה בשביל דף הימורים

מנועי חיפוש לא סופרים קישורים, הם משקללים אותם: קישור שמגיע מדומיין ותיק ואמין שווה הרבה יותר מקישור מאתר שהוקם אתמול. Gambling Goblin לא טרחה לבנות מוניטין משלה. היא לקחה בהשאלה את זה של אחרים, ושרשרה עשרות דומיינים ברזילאיים אמיתיים, רובם ממשלתיים, שכל אחד מהם מגיש את דפי ההימורים שלה תחת נתיבים כמו /jogos ו-/nova ומקשר לאחרים.

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

מודול Apache שאף אחד לא מסתכל עליו

ההשתלטות עצמה לא מתחילה בחולשה מרהיבה. החוקרים לא צפו ישירות בשלב הכניסה, אבל מצאו על אחד משרתי הקבוצה תיקייה פתוחה עם סוכן סריקה בשם cam-agent שמריץ כלי קוד פתוח מוכרים כמודולים, בהם subfinder לאיתור תת-דומיינים, naabu לסריקת פורטים, httpx ו-whatweb לזיהוי הטכנולוגיה שרצה על השרת ו-nuclei לבדיקות לפי תבניות. זו מכונת מיפוי של שטח תקיפה, לא כלי לחולשה אחת.

מה שקורה אחרי הכניסה מעניין יותר. סקריפט Bash מוודא שהוא רץ עם הרשאות root, מזהה אם השרת הוא Debian/Ubuntu או CentOS/RedHat, מוריד את חבילות הפיתוח המתאימות של Apache, מושך קובץ מקור ב-C בשם opsproxy.c משרת ביניים, ומוסיף לו בזמן אמת הגדרת מאקרו חסרה כדי שיתקמפל נקי. ההידור וההתקנה נעשים בפקודה אחת דרך apxs, כלי הבנייה של Apache עצמו. אחר כך הסקריפט מוחק את המקור ואת שאריות הבנייה, מזייף את חותמות הזמן של קובץ ה-so ושל קובצי הטעינה שלו כך שיתאימו למודולים ותיקים ולגיטימיים כמו mod_ssl או mod_suexec, מפעיל את מודולי ה-proxy, ה-headers וה-rewrite הסטנדרטיים שהמודול שלו נשען עליהם, ומפעיל מחדש את השרת.

התוצאה היא קובץ שנראה כאילו הוא חלק מההתקנה המקורית. הודעות הסטטוס של הסקריפט, אגב, כתובות בסינית ומקושטות באימוג'י, סגנון שלדעת צ'ק פוינט עשוי להצביע על פיתוח בסיוע AI.

המודול עצמו נרשם לשלב שבו Apache מתרגם כתובת URL לנתיב בקובץ, ובודק בכל בקשה נכנסת אם היא מתחילה באחת מקומץ קידומות שקבועות בקוד. בדגימות שנותחו אלה היו /wps, /bmw ו-/card. כשיש התאמה, המודול מנתב את הבקשה לשרת של התוקף ומחזיר לגולש את מה שקיבל משם, בעודו מעביר הלאה את כותרת ה-Host המקורית ואת כותרות הפרוקסי המקובלות. מבחוץ, כולל בעיני סורקי מנועי החיפוש, התוכן הזה מתארח על הדומיין הממשלתי.

אז למה הדפדפן לא חוסם את הסקריפטים הזרים שנטענים לתוך הדף? כאן נכנס לתמונה החלק שהופך את התרגיל לשמיש. שרת אינטרנט יכול לשלוח לדפדפן רשימה שמגדירה מאילו מקורות מותר לטעון סקריפטים ותוכן, והדפדפן אוכף אותה. לרשימה הזאת קוראים Content-Security-Policy. אתר ממשלתי מוגדר היטב שולח מדיניות הדוקה, ומדיניות כזאת הייתה חוסמת בדיוק את הסקריפטים החיצוניים שהתוקף רוצה להריץ.

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

מודול שני שהקבוצה מפעילה מתחזה למודול סינון תמים ורושם ווים גם לבקשה וגם לתשובה. הוא נושא הגדרות מוצפנות ב-RC4, מפרסר אותן לשני סוגי כללים, ואז מאתר בעזרת ביטוי רגולרי את פתיחת תגית ה-body בתשובה, מושך תוכן משרת מרוחק דרך libcurl ותוחב אותו לתוך התשובה שהשרת מחזיר. מכיוון שהכללים מתייחסים גם לנתיב, גם למפנה וגם ל-User-Agent, אפשר להגיש לסורק של מנוע החיפוש דף אחד ולגולש אנושי דף אחר. זו התנהגות של הסוואת תוכן מול סורקים.

מי הקורבנות

כשהחוקרים בדקו לאן מפנה אחד הדומיינים שבהגדרות המודול השני, הם הגיעו לדף בשם playfootball[.]info שטוען נכסים אמיתיים של גוגל: את חבילת ה-CSS של חנות Play מ-gstatic.com, את גופני Material Icons ואת הלוגו המקורי. אריחי האפליקציות בדף לא הצביעו על שרת אחד אלא על עשרות דומיינים ברזילאיים אמיתיים, רובם gov.br.

רשימת הנפגעים חוצה את כל רבדי השלטון בברזיל. ברמה הפדרלית מדובר במשרד ממשלתי וברשות ציבורית ארצית, ברמת המדינה באסיפה מחוקקת, בבתי דין לביקורת חשבונות ובחברת תשתיות ממשלתית, והנתח הגדול ביותר הוא עיריות בערים ובמדינות שונות. לצדם נמצאו גם אתרי com.br מסחריים, בהם אתרי חדשות מקומיים, מרפאות ואיגודים עסקיים. צ'ק פוינט לא נוקבת במספר כולל של אתרים שנפגעו ולא מזהה אף גוף בשמו.

דפי הפישינג עצמם מתאמצים להיראות אמיתיים לשני קהלים בבת אחת. הם מתורגמים לפורטוגזית ברזילאית, ממציאים דירוגים ומספרי ביקורות, ומטמיעים מטא-דאטה מובנית של schema.org שסורקי חיפוש קוראים. חלקם שואבים תמונות משירות התמונות הממוזערות של Bing ומתייגים את כרטיסי הרשתות החברתיות שלהם בחשבונות @GooglePlay ו-@microsoftstore. בקוד ה-CSS שלהם, לעומת זאת, נשארו הערות בסינית.

מה עוד יושב על אותם שרתים

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

המוריד DownPro, שכתוב ב-Go ודגלי העזרה שלו מופיעים באנגלית ובסינית, מקבל את כתובות המטענים כשהן מוצפנות מראש ב-AES-GCM ומקודדות ב-Base64, כדי שלא יישארו גלויות בשורת הפקודה. הוא בוחר את יעד ההשתלה לפי ההרשאות שיש לו: כ-root הוא כותב לשמות שנועדו להיבלע בסביבת שרת לינוקס, כמו /usr/local/bin/systemd-udevd או /usr/local/bin/nftables-init, ובלי root הוא מייצר קובץ שנראה כמו קובץ סשן של PHP בתיקיית /tmp.

משם מגיעים הרכיבים הקבועים. ChUser הוא דלת אחורית שמותקנת בנתיב /usr/bin/chuser עם ביט setuid ומריצה פקודות רק אחרי מעבר בדיקת הפעלה, מקומית או מרחוק. PasswordHarvester, שמבוסס על הכלי הפתוח 3snake, מתחבר בעזרת ptrace לתהליכי אימות ברגע שהם עולים, בהם sshd, sudo, su ו-passwd, וקורא מהם את פרטי האימות לפני שהם מוצפנים. הוא מסתיר את עצמו מאחורי אחד מכ-29 שמות תהליך מזויפים שנראים כמו תהליכי ליבה, למשל [kworker/1:2] או [ksoftirqd/0].

הדלת האחורית המרכזית, AlphaAgent, מקפידה במיוחד על השקט. היא מתחזה לתהליך מערכת לפי פרופיל שנבחר בזמן הבנייה, ישנה פרק זמן אקראי מספיק ארוך כדי לשרוד ריצה קצרה בארגז חול, ואם המדינה שבה היא רצה נמצאת ברשימת החסימה של המפעילים, ובדגימות שנותחו זו הייתה סין, היא פשוט יוצאת. את התקשורת שלה היא מעבירה ב-gRPC מעל HTTPS, ומזייפת את טביעת האצבע של לחיצת היד המוצפנת כך שכלי זיהוי יראו דפדפן Chrome רגיל ולא תוכנית ב-Go. הרכיב הנוסף, oRAT, נשאר על השרת דרך שירות systemd בשם xtables-addons, מכבה את SELinux ומסתיר את עצמו מרשימת התהליכים בעזרת bind mount על הרשומה שלו ב-proc.

מה מקשר את זה לקבוצה מוכרת

צ'ק פוינט מעריכה ברמת ודאות בינונית עד גבוהה, ולא יותר מזה, ש-Gambling Goblin קשורה ל-Earth Berberoka, אשכול דובר סינית ש-טרנד מיקרו תיעדה לראשונה ב-2022 כמי שתוקף אתרי הימורים המשרתים קהל דובר סינית. ההערכה נשענת על שלוש חפיפות נפרדות: אותו בסיס קוד של oRAT שיוחס לקבוצה ב-2022, דגימה של AlphaAgent שהועלתה באותה ארכיון עם כלים שכבר יוחסו לה, ודומיינים מתחזים באותו דפוס, github[.]la ו-gitlab[.]bet מול ה-github[.]wiki שטרנד מיקרו דיווחה עליו בזמנו, שמתארחים על אותו ASN של אמזון.

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

מה זה אומר בפועל

שום שלב בשרשרת הזאת לא נשען על חולשת יום-אפס. לפי הדוח היא רצה על שירותים חשופים לאינטרנט שלא עודכנו, על פרטי SSH חלשים, ועל מודולי Apache שאף אחד לא בודק. מי שמפעיל שרת Apache שנגיש מבחוץ יעשה טוב אם ישווה את רשימת המודולים הטעונים בפועל מול מה שהותקן ביודעין, ויזכור שתאריכי הקבצים לא יעזרו כאן כי הם זויפו במכוון. סימנים נוספים ששווה לחפש הם פערים בין שם התהליך לנתיב הקובץ שהוא באמת מריץ, קבצים בנתיבים /usr/sbin/unix_updates ו-/usr/bin/chuser, ושירות systemd בשם xtables-addons שאיש לא התקין.

והערה אחרונה על מה שעלול לבוא: הדפים האלה כבר מחקים חנויות אפליקציות. "אותה תשתית שמנפחת היום דירוגי חיפוש רחוקה שינוי הגדרה אחד מהגשת נוזקה מחר", כותבים בצ'ק פוינט. מי שכבר מפעיל פרוקסי חבוי על שרת ממשלתי לא צריך לפרוץ שוב כדי להחליף את מה שהוא מגיש.