בפוסט זה נספר לכם כיצד קבוצת הסייבר OceanLotus (APT32 ו-APT-C-00) השתמשה לאחרונה באחד מהניצולים הזמינים לציבור עבור , פגיעויות של שחיתות זיכרון ב-Microsoft Office, וכיצד התוכנה הזדונית של הקבוצה משיגה התמדה במערכות שנפגעו מבלי להשאיר עקבות. לאחר מכן, נתאר כיצד, מאז תחילת 2019, הקבוצה משתמשת בארכיונים לחילוץ עצמי כדי להפעיל קוד.
OceanLotus מתמחה בריגול סייבר, כאשר יעדי העדיפות הם מדינות בדרום מזרח אסיה. התוקפים מזייפים מסמכים שמושכים את תשומת לבם של קורבנות פוטנציאליים כדי לשכנע אותם לבצע את הדלת האחורית, ועובדים גם על פיתוח כלים. השיטות המשמשות ליצירת עציצי דבש משתנות בין התקפות, מקבצי "סיומת כפולה", ארכיונים לחילוץ עצמי, מסמכים עם פקודות מאקרו ועד לניצול ידוע.

שימוש ב-exploit ב-Microsoft Equation Editor
באמצע 2018, OceanLotus ערכה קמפיין המנצל את הפגיעות של CVE-2017-11882. אחד המסמכים הזדוניים של קבוצת הסייבר נותח על ידי מומחים ממרכז 360 Threat Intelligence (), כולל תיאור מפורט של הניצול. הפוסט למטה מכיל סקירה כללית של מסמך זדוני שכזה.
השלב הראשון
המסמך FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3) דומה לזה שהוזכר במחקר למעלה. זה מעניין כי הוא מיועד למשתמשים המתעניינים בפוליטיקה קמבודית (CNRP - מפלגת ההצלה הלאומית של קמבודיה, פורקה בסוף 2017). למרות סיומת doc, המסמך הוא בפורמט RTF (ראה תמונה למטה), מכיל קוד זבל וגם מעוות.

איור 1. "זבל" ב-RTF
למרות שיש אלמנטים משובשים, Word פותח את קובץ ה-RTF הזה בהצלחה. כפי שניתן לראות באיור 2, יש מבנה EQNOLEFILEHDR בהיסט 0xC00, ואחריו כותרת MTEF, ולאחר מכן ערך MTEF (איור 3) עבור הגופן.

איור 2. ערכי הזנת גופן

האיור 3.
הצפה אפשרית בשטח שם, כי הגודל שלו לא נבדק לפני ההעתקה. שם ארוך מדי גורם לפגיעות. כפי שניתן לראות מתוכן קובץ ה-RTF (היסט 0xC26 באיור 2), המאגר מלא בקוד מעטפת ואחריו פקודת דמה (0x90) וכתובת החזרה 0x402114. הכתובת היא רכיב דו-שיח ב EQNEDT32.exe, המציין הוראות RET. זה גורם ל-EIP להצביע על תחילת השדה שםהמכיל את קוד המעטפת.

איור 4. תחילת קוד ה-exploit shell
כתובת 0x45BD3C מאחסן משתנה שיוצא מההפניה עד שהוא מגיע למצביע למבנה שנטען כעת MTEFData. שאר קוד המעטפת נמצא כאן.
מטרת ה- shellcode היא לבצע את הקטע השני של shellcode המוטמע במסמך הפתוח. קוד המעטפת המקורי מנסה תחילה למצוא את מתאר הקובץ של המסמך הפתוח על ידי איטרציה על כל מתארי המערכת (NtQuerySystemInformation עם טיעון SystemExtendedHandleInformation) ובודק אם הם תואמים מח"ש מתאר ו מח"ש תהליך WinWord והאם המסמך נפתח עם מסיכת גישה - 0x12019F.
כדי לוודא שנמצאה הידית הנכונה (ולא הידית למסמך פתוח אחר), תוכן הקובץ מוצג באמצעות הפונקציה CreateFileMapping, וקוד המעטפת בודק אם ארבעת הבייטים האחרונים של המסמך תואמים "yyyy"(שיטת ציד ביצים). ברגע שנמצא התאמה, המסמך מועתק לתיקיה זמנית (GetTempPath) איך ole.dll. לאחר מכן קוראים את 12 הבייטים האחרונים של המסמך.
![]()
איור 5. סמני סוף מסמך
ערך 32 סיביות בין סמנים AABBCCDD и yyyy הוא ההיסט של קוד המעטפת הבא. זה נקרא שימוש בפונקציה CreateThread. חולץ את אותו קוד מעטפת ששימש את קבוצת OceanLotus קודם לכן. , ששחררנו במרץ 2018, עדיין עובד עבור dump השלב השני.
השלב השני
הסרת רכיבים
שמות קבצים וספריות נבחרים באופן דינמי. הקוד בוחר באקראי את השם של קובץ ההפעלה או ה-DLL ב C:Windowssystem32. לאחר מכן הוא מגיש בקשה למשאבים שלו ומחזיר את השדה FileDescription לשימוש כשם התיקיה. אם זה לא עובד, הקוד בוחר באקראי שם תיקיה מהספריות %ProgramFiles% או C:Windows (из GetWindowsDirectoryW). Он избегает использования имени, которое может конфликтовать с существующими файлами, и следит за тем, чтобы оно не содержало следующие слова: windows, Microsoft, desktop, system, system32 או syswow64. אם הספרייה כבר קיימת, "NLS_{6 תווים}" מצורף לשם.
משאב 0x102 מנותח וקבצים מושלכים לתוך %ProgramFiles% או %AppData%, לתיקיה שנבחרה באקראי. שינה את זמן היצירה כדי לקבל את אותם ערכים כמו kernel32.dll.
לדוגמה, הנה התיקיה ורשימת הקבצים שנוצרו על ידי בחירת קובץ ההפעלה C:Windowssystem32TCPSVCS.exe כמקור נתונים.

איור 6. חילוץ רכיבים שונים
מבנה משאבים 0x102 בטפטפת זה די מורכב. בקיצור, הוא מכיל:
- שמות קבצים
- גודל קובץ ותוכן
- פורמט דחיסה (COMPRESSION_FORMAT_LZNT1, המשמש את הפונקציה RtlDecompressBuffer)
הקובץ הראשון מאופס כ TCPSVCS.exe, וזה לגיטימי AcroTranscoder.exe (לפי FileDescription, SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).
אולי שמתם לב שחלק מקובצי ה-DLL גדולים מ-11 מגה-בייט. הסיבה לכך היא שמאגר רציף גדול של נתונים אקראיים ממוקם בתוך קובץ ההפעלה. ייתכן שזו דרך להימנע מזיהוי על ידי חלק ממוצרי אבטחה.
הבטחת התמדה
משאב 0x101 ב-dropper מכיל שני מספרים שלמים של 32 סיביות המציינים כיצד יש לספק התמדה. הערך של הראשון מציין כיצד התוכנה הזדונית תימשך ללא זכויות מנהל.

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

טבלה 2. מנגנון התמדה עם זכויות מנהל
שם השירות הוא שם הקובץ ללא סיומת; שם התצוגה הוא שם התיקיה, אך אם היא כבר קיימת, המחרוזת "מצורף אליהRevision 1” (המספר גדל עד שנמצא שם שאינו בשימוש). המפעילים דאגו שההתמדה בשירות תהיה חזקה - במקרה של כשל, יש להפעיל את השירות מחדש לאחר שנייה אחת. ואז הערך WOW64 מפתח הרישום של השירות החדש מוגדר ל-4, מה שמציין שמדובר בשירות של 32 סיביות.
משימה מתוזמנת נוצרת באמצעות מספר ממשקי COM: ITaskScheduler, ITask, ITaskTrigger, IPersistFile и ITaskScheduler. בעיקרו של דבר, התוכנה הזדונית יוצרת משימה נסתרת, מגדירה את פרטי החשבון יחד עם המידע הנוכחי של המשתמש או המנהל, ולאחר מכן מגדירה את הטריגר.
מדובר במשימה יומית באורך של 24 שעות ומרווחים בין שתי ביצועים של 10 דקות, כלומר היא תפעל ברציפות.
קצת זדוני
בדוגמה שלנו, קובץ ההפעלה TCPSVCS.exe (AcroTranscoder.exe) היא תוכנה לגיטימית שטוענת קובצי DLL שמתאפסים יחד איתה. במקרה זה, זה מעניין Flash Video Extension.dll.
הפונקציה שלו DLLMain פשוט קורא לפונקציה אחרת. ישנם כמה פרדיקטים מטושטשים:

איור 7. פרדיקטים מטושטשים
לאחר הבדיקות המטעות הללו, הקוד מקבל קטע .text файла TCPSVCS.exe, משנה את ההגנה שלו ל PAGE_EXECUTE_READWRITE ומשכתב אותו מחדש על ידי הוספת הוראות דמה:

איור 8. רצף ההוראות
בסוף לכתובת הפונקציה FLVCore::Uninitialize(void), מיוצא Flash Video Extension.dll, מתווספת הוראה CALL. המשמעות היא שאחרי טעינת ה-DLL הזדוני, כאשר זמן הריצה מתקשר WinMain в TCPSVCS.exe, מצביע ההוראות יצביע על NOP, מה שגורם FLVCore::Uninitialize(void), שלב הבא.
הפונקציה פשוט יוצרת mutex שמתחיל ב {181C8480-A975-411C-AB0A-630DB8B0A221}ואחריו שם המשתמש הנוכחי. לאחר מכן, הוא קורא את קובץ *.db3 שנזרק, המכיל קוד בלתי תלוי במיקום, ומשתמש CreateThread לבצע את התוכן.
התוכן של קובץ *.db3 הוא קוד המעטפת שקבוצת OceanLotus משתמשת בו בדרך כלל. שוב פירקנו בהצלחה את המטען שלו באמצעות סקריפט האמולטור שפרסמנו .
התסריט מחלץ את השלב האחרון. רכיב זה הוא דלת אחורית, שכבר ניתחנו בה . ניתן לקבוע זאת על ידי ה-GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} קובץ בינארי. תצורת התוכנה הזדונית עדיין מוצפנת במשאב ה-PE. יש לו בערך אותה תצורה, אבל שרתי C&C שונים מהקודמים:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
צוות OceanLotus שוב מדגים שילוב של טכניקות שונות כדי להימנע מגילוי. הם חזרו עם תרשים "מעודן" של תהליך ההדבקה. על ידי בחירת שמות אקראיים ומילוי קובצי הפעלה בנתונים אקראיים, הם מפחיתים את מספר IoCs אמינים (בהתבסס על hashes ושמות קבצים). יתרה מכך, הודות לשימוש בטעינת DLL של צד שלישי, התוקפים צריכים להסיר רק את הבינארי הלגיטימי AcroTranscoder.
ארכיונים לחילוץ עצמי
לאחר קבצי RTF, הקבוצה עברה לארכיונים לחילוץ עצמי (SFX) עם סמלי מסמכים נפוצים כדי לבלבל עוד יותר את המשתמש. ספר האיום כתב על זה (). עם ההשקה, קבצי RAR לחילוץ עצמי נשמטים ומבוצעים קובצי DLL עם סיומת .ocx, שהעומס הסופי שלהם תועד בעבר {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. מאז אמצע ינואר 2019, OceanLotus עושה שימוש חוזר בטכניקה זו, אך משנה כמה תצורות לאורך זמן. בחלק זה נדבר על הטכניקה והשינויים.
יצירת פיתוי
המסמך THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) נמצא לראשונה ב-2018. קובץ SFX זה נוצר בחוכמה - בתיאור (פרטי גרסה) הוא אומר שזו תמונת JPEG. סקריפט SFX נראה כך:

איור 9. פקודות SFX
התוכנה הזדונית מתאפסת {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC), כמו גם תמונה 2018 thich thong lac.jpg.
תמונת ההטעיה נראית כך:

איור 10. תמונת פיתוי
אולי שמתם לב ששתי השורות הראשונות בסקריפט SFX קוראים לקובץ OCX פעמיים, אבל זו לא שגיאה.
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)
זרימת הבקרה של קובץ OCX דומה מאוד לרכיבים אחרים של OceanLotus - רצפי פקודות רבים JZ/JNZ и PUSH/RET, לסירוגין עם קוד זבל.

איור 11. קוד מעורפל
לאחר סינון קוד זבל, ייצא DllRegisterServer, שקוראים לו regsvr32.exe, נראה כך:

איור 12. קוד מתקין בסיסי
בעצם, בשיחה הראשונה DllRegisterServer ערך הרישום של ערכות ייצוא HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model עבור היסט מוצפן ב-DLL (0x10001DE0).
כאשר הפונקציה נקראת פעם שנייה, היא קוראת את אותו הערך ופועלת בכתובת זו. מכאן קוראים ומבוצעות המשאב ופעולות רבות ב-RAM.
קוד המעטפת הוא אותו מטעין PE ששימש בקמפיינים קודמים של OceanLotus. ניתן לחקות אותו באמצעות . בסוף הוא מתאפס db293b825dcc419ba7dc2c49fa2757ee.dll, טוען אותו לזיכרון ומבצע DllEntry.
ה-DLL מחלץ את תוכן המשאב שלו, מפענח (AES-256-CBC) ומפרק (LZMA) אותו. למשאב יש פורמט ספציפי שקל לפרק אותו.

איור 13. מבנה תצורת המתקין (KaitaiStruct Visualizer)
התצורה מוגדרת במפורש - בהתאם לרמת ההרשאה, ייכתבו נתונים בינאריים %appdata%IntellogsBackgroundUploadTask.cpl או %windir%System32BackgroundUploadTask.cpl (או SysWOW64 עבור מערכות 64 סיביות).
התמדה נוספת מובטחת על ידי יצירת משימה עם השם BackgroundUploadTask[junk].jobאיפה [junk] מייצג קבוצה של בתים 0x9D и 0xA0.
שם יישום משימה %windir%System32control.exe, וערך הפרמטר הוא הנתיב לקובץ הבינארי שהורד. המשימה הנסתרת פועלת כל יום.
מבחינה מבנית, קובץ CPL הוא DLL עם שם פנימי ac8e06de0a6c4483af9837d96504127e.dll, שמייצא פונקציה CPlApplet. קובץ זה מפענח את המשאב היחיד שלו {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, ואז טוען את ה-DLL הזה וקורא לייצוא היחיד שלו DllEntry.
קובץ תצורה של דלת אחורית
תצורת הדלת האחורית מוצפנת ומוטבעת במשאבים שלה. המבנה של קובץ התצורה דומה מאוד למבנה הקודם.

איור 14. מבנה תצורת הדלת האחורית (KaitaiStruct Visualizer)
למרות שהמבנה דומה, רבים מערכי השדה עודכנו מאלה המוצגים ב .
האלמנט הראשון של המערך הבינארי מכיל DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759), . אבל מכיוון ששם הייצוא הוסר מהקובץ הבינארי, הגיבובים אינם תואמים.
מחקר נוסף
במהלך איסוף הדגימות, שמנו לב לכמה מאפיינים. הדגימה שתוארה זה עתה הופיעה בסביבות יולי 2018, ואחרות דומות לה הופיעו ממש מאמצע ינואר עד תחילת פברואר 2019. ארכיון SFX שימש כווקטור זיהום, והפיל מסמך פתיל לגיטימי וקובץ OSX זדוני.
למרות ש-OceanLotus משתמש בחותמות זמן מזויפות, שמנו לב שחותמות הזמן של קבצי SFX ו-OCX תמיד זהות (0x57B0C36A (08/14/2016 בשעה 7:15 UTC) ו 0x498BE80F (02/06/2009 @ 7:34 UTC) בהתאמה). זה כנראה מצביע על כך שלכותבים יש סוג של "מעצב" שמשתמש באותן תבניות ופשוט משנה כמה מאפיינים.
בין המסמכים שלמדנו מתחילת 2018, ישנם שמות שונים המציינים את המדינות המעניין את התוקפים:
- פרטי הקשר החדשים של Cambodia Media(New).xls.exe
— 李建香 (个人简历).exe (מסמך PDF מזויף של קורות חיים)
- משוב, ראלי בארה"ב בין התאריכים 28-29 ביולי, 2018.exe
מאז התגלתה הדלת האחורית {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll ופרסום הניתוח שלו על ידי מספר חוקרים, ראינו כמה שינויים בנתוני התצורה של תוכנות זדוניות.
ראשית, המחברים החלו להסיר שמות מ-DLL עוזרים (DNSprov.dll ושתי גרסאות HttpProv.dll). המפעילים הפסיקו לארוז את ה-DLL השלישי (הגרסה השנייה HttpProv.dll), בוחרת להטמיע רק אחד.
שנית, שדות תצורה של דלת אחורית רבים שונו, ככל הנראה לחמוק מזיהוי ככל שהרבה IoCs הפכו לזמינים. שדות חשובים ששונו על ידי המחברים כוללים:
- מפתח הרישום של AppX השתנה (ראה IoCs)
- מחרוזת קידוד mutex ("def", "abc", "ghi")
- מספר יציאה
לבסוף, לכל הגרסאות החדשות שנותחו יש C&Cs חדשים המפורטים בסעיף IoCs.
ממצאים
OceanLotus ממשיך להתפתח. קבוצת הסייבר מתמקדת בחידוד והרחבת הכלים והפיתולים. מחברים מסווים מטענים זדוניים באמצעות מסמכים מושכי תשומת לב שהנושא שלהם רלוונטי לקורבנות המיועדים. הם מפתחים תוכניות חדשות ומשתמשים גם בכלים זמינים לציבור, כמו ה-Equation Editor exploit. יתרה מכך, הם משפרים כלים להפחתת מספר החפצים שנותרו במכונות של הקורבנות, ובכך מפחיתים את הסיכוי לזיהוי באמצעות תוכנת אנטי-וירוס.
אינדיקטורים של פשרה
אינדיקטורים של פשרה כמו גם תכונות MITER ATT&CK זמינים и .
מקור: www.habr.com
