起底GoldenJackal APT組織
GoldenJackal是一家APT組織,自2019年開始活躍,通常針對中東和南亞的政府和外交機構。盡管他們早在幾年前就開始了活動,但該組織似乎沒有被詳細介紹過。
卡巴斯基實驗室的研究人員早在2020年中開始監測該組織,觀察到這是一個極其專業的組織。該組織的主要開發.NET惡意軟件、JackalControl、JackalWorm、JackalSteal、JackalPerInfo和JackalScreenWatcher等特定工具集,目的是:
· 控制受害者計算機;
· 在使用可移動驅動器的系統中傳播;
· 從受感染的系統中竊取某些文件;
· 竊取憑據;
· 收集有關本地系統的信息;
· 收集有關用戶網絡活動的信息;
· 截取桌面的屏幕截圖;
根據工具集和攻擊者的行為,研究人員認為GoldenJackal APT組織的主要動機是間諜活動。
攻擊途徑
研究人員發現攻擊者假冒Skype安裝程序,使用惡意Word文檔。
另一個已知的攻擊途徑是一個惡意文檔,它使用遠程模板注入技術下載惡意HTML頁面,該頁面利用了Follina漏洞。

這份文件被命名為 “Gallery of Officers Who Have Received National And Foreign Awards.docx”的文件似乎是合法的,旨在收集巴基斯坦政府授予勛章的官員的信息。值得注意的是,Follina漏洞是在2022年5月29日首次被公布,該文檔似乎在發布兩天后的6月1日進行了修改,并于6月2日首次被檢測到。
該文檔被配置為從合法且已被攻擊的網站加載外部對象:
hxxps://www.pak-developers[.]net/internal_data/templates/template.html!

用于加載遠程資源的代碼段
遠程網頁是公共“概念證明”的修改版本,用于利用Follina漏洞。原始PoC可在GitHub上獲得。攻擊者將IT_BrowseForFile變量值替換為以下值:

利用Follina漏洞的代碼段
解碼后的字符串為:

解碼腳本
該漏洞會下載并執行托管在合法受攻擊網站上的可執行文件,并將其存儲在以下路徑中:“%Temp%\GoogleUpdateSetup.exe”。下載的文件是JackalControl惡意軟件。
在其他情況下,研究人員沒有發現真正的攻擊途徑,他們還觀察到在橫向活動進程中系統受到攻擊。具體來說,研究人員觀察到攻擊者使用psexec實用程序啟動惡意批處理腳本。

批處理腳本執行各種操作,例如安裝 Microsoft .Net Framework 4、用JackalControl木馬感染系統并收集有關系統的信息。

JacalControl
這是一種木馬,允許攻擊者通過一組預定義和支持的命令遠程控制目標計算機。信息是通過HTTPS通信信道在惡意軟件和C2服務器之間進行接收的,并且可以指示植入進行以下任何操作:
· 使用提供的參數執行任意程序;
· 下載任意文件到本地文件系統;
· 從本地文件系統上傳任意文件;
在過去幾年中,攻擊者多次更新該工具,已出現了多種變體。接下來,我們將描述2023年1月觀察到的最新版本(8C1070F188AE87FBA1148A3D791F2523)。
該木馬是一個可執行文件,可以作為標準程序或Windows服務啟動。
它需要一個參數,該參數可以等于以下一個值:
· /0:作為標準程序運行,只與C2服務器聯系一次;
· /1:作為標準程序運行,并定期聯系C2服務器;
· /2:作為Windows服務運行;
惡意軟件參數和相關的惡意軟件行為根據變體而變化。一些變體只提供兩個參數:
· /0作為標準程序運行;
· /1作為Windows服務運行;
其他變體可以自我安裝不同的持久性機制。惡意軟件的執行流程由運行該惡意軟件的命令行中提供的參數決定。
· /h0:將通過創建Windows計劃任務使惡意軟件獲得持久性;
· /h1:將通過創建相應的注冊表運行項使惡意軟件獲得持久性;
· /h2:將通過創建Windows服務使惡意軟件獲得持久性;
· /r0:作為標準進程運行(此參數由Windows計劃任務指定);
· /r1:作為標準進程運行(此參數由生成的注冊表運行項值指定)。
· /r2:作為服務運行(此參數由創建的Windows服務指定)。
攻擊者已經將不同的變體進行了傳播:有些包括用于維護持久性的代碼,另一些則被配置為在不感染系統的情況下運行;并且感染進程通常由諸如上述批處理腳本之類的其他組件執行。
惡意軟件通過生成BOT_ID開始其活動,這是用于識別受攻擊系統的唯一值。此值源自其他幾個基于主機的值:
從以下WMI查詢中獲得的UUID值:

從以下注冊表項獲取的計算機GUID:

從另一個WMI查詢中獲得的額外驅動器的列表,這反過來允許他們確定' PHYSICALDRIVE0 '的' SerialNumber ':

收集到的信息被連接在一個字節數組中,然后用MD5哈希,MD5被用作創建BOT_ID的種子。用于生成后者的算法只是對結果MD5哈希中每兩個連續字節求和,并將所得字節(模數256)作為最終BOT_ID的單個字節。下面的代碼片段描述了這種邏輯,它取自惡意軟件。

用于生成BOT_ID的代碼段
生成的BOT_ID還用于初始化DES密鑰和IV,然后用于加密與C2的通信。
惡意軟件使用HTTP POST請求進行通信,其中數據參數將以編碼形式作為請求主體的一部分進行傳播。然后,整個請求結構將顯示如下:

一個有效的響應應該以以下方式形成:

響應使用base64進行解碼:生成的有效負載是一個字符串數組,其中使用的分隔符是標準的Windows新行序列-“\r\n”。每一行都用base64再次解碼,用DES解密,并用GZIP算法解壓縮。
每個命令都具有以下結構:

命令結構
00:執行——使用指定的參數執行任意程序。如果攻擊者將NoWait標志設置為False,則惡意軟件會重定向進程輸出,讀取數據并將其轉發給C2;
01:下載——從本地系統讀取文件并將其上傳到服務器;
02:上傳——使用攻擊者指定的文件路徑將接收到的數據保存到本地系統。
命令數據字段旨在攜帶有關命令參數的信息,并且對于每種操作類型具有不同的結構,如下所述:

命令結果通常被組成一條消息,該消息還包括底層命令類型和命令ID的值,該值唯一地標識向惡意軟件發出的命令的示例。這三個值用GZIP壓縮,用DES加密,并用base64編碼。
生成的有效負載使用“|”字符與BOT_ID連接,再次使用base64編碼,然后使用上述POST請求格式將其上傳到遠程服務器。
安裝程序模式
一些變體可以感染系統,在特定位置創建惡意軟件的副本,并保證其持久性。
惡意軟件位置是通過特定進程選擇的,它枚舉CommonApplicationData中的所有子目錄,并隨機選擇一個子目錄保存其副本。生成的文件名將以子目錄的名稱作為后綴,并附加另一個靜態值Launcher.exe,如下所示:

如果操作成功,它還會更改新的文件時間戳,并使其與所選子目錄的時間戳相同。
如果操作失敗,它會隨機選擇另一個目錄,并再次嘗試復制惡意軟件。
如果對所有子目錄的操作都失敗,它將嘗試使用硬編碼目錄名列表:
· Viber
· AdGuard
· WinZip
· WinRAR
· Adobe
· CyberLink
· Intel
如果所有嘗試都失敗了,它將嘗試在以下位置使用相同的進程:
· ApplicationData
· LocalApplicationData
· Temp
持久性能力
惡意軟件的持久性通常通過以下機制來保證:
· 服務安裝;
· 創建新的Windows注冊表項值;
· 創建新的計劃任務;
該服務通常由惡意軟件在執行Windows sc.exe實用程序時安裝。

注冊表值等于復制的惡意軟件文件名,不帶擴展名,并存儲在以下各項中:

計劃任務是使用硬編碼的XML模板創建的,該模板在運行時被修改,并使用相同的惡意軟件文件路徑在文件系統釋放,但擴展名不同,為.XML而不是.exe。
然后將生成的XML文件與Windows schtasks.exe實用程序一起使用來創建任務。
例如:

任務和服務描述會根據變體而變化。
JackalSteal
JackalSteal是另一種植入程序,通常部署在一些受感染的計算機上,用于在目標系統中查找感興趣的文件,并將其竊取至C2服務器。
此工具可用于監控目標系統中的可移動USB驅動器、遠程共享和所有邏輯驅動器。惡意軟件可以作為標準流程或服務來工作。它無法維護持久性,因此必須由另一個組件安裝。
JackalSteal通過解析參數開始執行。

選項說明
· -n:配置文件的唯一標識符值;
· -p:要檢查的目錄路徑;
· -s:請求文件的最大大小;
· -d:自上次寫入請求文件以來的天數;
· -m:使用正則表達式在配置的目錄中查找以逗號分隔的字符串掩碼列表;
· -w:配置Profile的連續目錄掃描之間的時間間隔(以秒為單位);
· -e:從掃描活動中排除路徑;
· /0:作為標準進程運行;
· /1:作為服務運行;
這些選項允許攻擊者指定“概要文件”,該文件定義了攻擊者感興趣的文件。該配置文件由一個ID和一個模式列表組成。每個模式都包含一個具有以下屬性的選項列表:
· Path:目標路徑;
· Credentials:用于訪問遠程共享的憑據用戶和密碼;
· Masks:包含通配符和掩碼字符的掩碼字符串,可用于使用正則表達式匹配任何一組文件;
· MaxSize:文件的最大大小;
· Days:自上次寫入文件以來的天數;
· Interval:兩次連續路徑掃描之間的時間間隔
· Exclude:掃描活動期間必須排除的路徑;
用于配置JackalSteal組件的命令如下:

唯一標識符“-n”通常與JackalControl木馬程序生成的BOT_ID相同。
在參數處理之后,惡意軟件將數據序列化為XML,使用由帶有“-n”選項傳遞的ID生成的密鑰用DES加密它們,并將生成的有效負載存儲在以下位置:“%ApplicationData%\SNMP\cache\%Filename]”,其中%Filename%是由攻擊者指定的唯一標識符的MD5生成的GUID。
惡意軟件通常使用“/0”或“/1”選項和“-n”選項執行,該選項用于加載獲得的配置文件ID。在第二種情況下,它從前面提到的位置加載配置文件,并啟動 ‘Watchers’。
Watcher是在具有相同名稱的類中定義的對象,該對象在不同的線程中運行,并根據指定的選項掃描位置。該模式可以表示:
· 本地文件系統中的簡單路徑;
· 遠程共享上的路徑;
· 常量字符串all;
· 常量字符串usb。
當模式等于“all”時,惡意軟件會枚舉所有邏輯驅動器,并為每個驅動器創建一個新的Watcher對象。當模式為“usb”時,它會偵聽與在系統上創建新的可移動驅動器的操作相對應的系統事件。當檢測到新的驅動器時,它會創建一個新的Watcher對象。
每次添加新的Watcher時,惡意軟件都會通知日志該事件,并使用HTTP Post請求將信息發送到遠程C2。
該日志是使用以下字符串作為模板創建的:

并上傳到包含以下信息的加密有效負載中:

為每個請求生成AES_Key和AES_IV,嵌入在代碼中的密鑰使用RSA算法進行加密。生成的有效負載也使用GZIP算法進行壓縮。
“Agent_id\\Log_path.log”和“Log”內容數據采用AES算法加密,并使用GZIP壓縮。
Watcher對象負責掃描活動,當Watcher啟動時,它會枚舉目錄及其子目錄中的所有文件。掃描儀還可以解析.lnk鏈接。當掃描程序檢測到與定義的屬性(掩碼、天數、最大大小)匹配的文件時,它會計算文件內容哈希,檢查結果值是否存在于存儲在本地緩存目錄中的哈希表中,如果不存在,則添加該值。當檢測到新文件時,惡意軟件會使用上述相同的邏輯將該文件和相關的文件路徑上傳到加密有效負載中。
在這種情況下,加密的有效負載包含以下信息:

“Agent_id\\Local_file_path”和“File”內容數據采用AES算法加密,并使用GZIP壓縮。
JackalWorm
這種蠕蟲是為了傳播和感染使用可移動USB驅動器的系統而開發的。該程序被設計為一種靈活的工具,可以用來感染任何惡意軟件的系統。
它的行為會隨著父進程而變化。
· 當惡意軟件在被感染的系統上工作,并且父進程是taskeng.exe或services.exe時:
· 監控可移動USB驅動器;
· 連接設備后,將隱藏最后修改的目錄,并將其替換為蠕蟲的副本;
用于監控可移動USB驅動器的代碼與JackalSteal中觀察到的代碼相同。它創建了一個ManagementEventWatcher對象,允許它訂閱與給定WQL查詢相對應的事件通知,并在攔截時發出回調。惡意軟件使用的查詢指示系統每五秒鐘檢查一次邏輯可移動磁盤創建事件:

當惡意軟件檢測到一個可移動的USB存儲設備時,它會自我復制到該設備。它將復制到的路徑是通過列出所有目錄并選擇最后修改的目錄來確定的。它將使用相同的目錄名在驅動器根目錄上創建自己的副本,并將目錄的屬性更改為“hidden”。這將導致實際目錄被隱藏,并替換為具有目錄名的惡意軟件副本。此外,JackalWorm使用一個模仿Windows目錄的圖標,誘使用戶在試圖訪問目錄時執行惡意軟件。
在以下示例中,可移動驅動器“E:”被惡意軟件感染,它將自我復制為Folder1.exe,并更改Folder1的屬性以將其隱藏:

受感染的設備
當惡意軟件在干凈的系統上啟動時,父進程是explorer.exe,文件位于可移動驅動器中,其行為如下:
· 打開隱藏目錄;
· 執行配置文件中指定的操作;
· 蠕蟲感染系統;
配置文件是包含XML數據的嵌入式資源,可用于命令蠕蟲執行一些操作:
· 釋放程序并保證它與計劃任務的持久性;
· 釋放程序并使用指定的參數執行它;
· 使用指定的參數執行現有程序;
有效的配置文件如下所示:

在這種情況下,蠕蟲被配置為安裝存儲在另一個資源“rcdata02”中的PE文件,并將其保存為擴展名.exe,最后創建一個計劃任務,每隔15分鐘運行一次。
其他示例有:

釋放存儲在“%TEMP%\test.exe”中的另一個資源“rcdata02”中的PE文件并執行它。

使用參數“1.1.1.1”執行程序“%WINDIR%\system32\ping.exe”。
目前研究人員只觀察到第一個示例,該惡意軟件被配置為安裝JackalControl木馬。
安裝進程選擇惡意軟件位置的方式與上述的進程大致相同。它與另一個不同,因為它只枚舉CommonAppData中的子目錄,并使用與另一靜態值upd.exe連接的子目錄名稱復制文件。
如果失敗,它會嘗試使用一個硬編碼的目錄名列表,這與上述的進程有點不同。
· Mozilla
· Adobe
· Intel
· [Random GUID]
蠕蟲通過使用在運行時動態修改的硬編碼XML模板創建計劃任務來保持其持久性。安裝后,蠕蟲會使用批處理腳本從可移動驅動器中自我刪除。該腳本將以隨機名稱放入本地Temp目錄:

連接的可移動驅動器將再次感染JackalWorm
同樣值得一提的是,這個工具似乎正在開發中。研究人員通過分析文件5DE309466B2163958C2E12C7B02D8384的嵌入式.NET資源來推斷這一點。它們的大小為193973字節,比實際內容大得多:
· Rcdata01–XML配置–大小:67字節;
· Rcdata02–JackalControl木馬程序–大小:27136字節;
這意味著有166770字節的未知數據。其中大多數是合法的notepad.exe Windows實用程序的一部分,特別是第一個0x6A30字節被覆蓋。在合法的notepad.exe映像之后,我們還發現了以下XML配置:

第一個XML顯示了一個新的類型值:“scheduler”,該值未在代碼中指定。第二個XML顯示此特定資源用于測試目的,攻擊者試圖運行cmd.exe在桌面的文本文件%USERPROFILE%\desktop\TEST.txt中寫入單詞“TEST”。
JackalPerInfo
該惡意軟件的開發目的是收集有關受攻擊系統的信息,以及一組特定的文件,這些文件可能用于檢索存儲的憑據和用戶的網絡活動。攻擊者將其命名為“perinfo”,這是程序主類名PersonalInfoContainer的縮寫。
它的行為會根據執行進程中提供的參數數量而變化。具體來說,當只使用一個參數執行時,惡意軟件會收集一組預定義的信息,并將其存儲在用GZIP壓縮的二進制文件中。文件名是在提供的參數中指定的。當使用兩個參數執行時,惡意軟件使用第一個參數加載先前生成的二進制文件,并將所有信息提取到第二個參數指定的目錄中。
默認情況下,該程序應使用一個參數執行。一旦執行,惡意軟件就會開始使用特定函數GetSysInfo收集有關系統的信息:

在第一個JackalControl變體中也觀察到了這種特定函數,但從較新的變體中刪除了。
惡意軟件通過枚舉系統上的邏輯驅動器來繼續其操作,對于每個文件,它都枚舉根路徑中的文件。收集的信息包括最后一次寫入時間、文件名和文件大小。
然后,它枚舉系統驅動器中的用戶目錄,通常為C:\Users\,它列舉了以下目錄的內容:
· 桌面;
· 文件;
· 下載;
AppData\Roaming\Microsoft\Windows\Recent;
它還嘗試獲取以下文件:

該惡意軟件試圖竊取受害者瀏覽器數據庫中存儲的憑據,以及其他信息,如可用于訪問網絡服務的cookie。
最后,它將收集的信息序列化為二進制格式,使用GZIP算法壓縮所有數據,并將所有內容存儲在攻擊者提供的第一個參數指定的文件中。
JackalScreenWatcher
該工具用于收集受害者桌面的截圖,并將圖片發送到遠程硬編碼的C2服務器:
hxxps://tahaherbal[.]ir/wp-includes/class-wp-http-iwr-client.php
這個特定的網頁也被用作JackalSteal組件的C2,這表明這些工具可能是一個獨特框架的一部分。
惡意軟件可以處理一些可選的參數,并且可以作為輸入提供:
· -r分辨率(默認值為1.0);
· -i間隔(默認為10秒)
· -n指定自定義代理id。默認情況下,此值等于%Hostname%\%Username%;
該程序的主要功能包括運行一個線程,該掃描系統上的所有顯示器,檢查它們的尺寸。然后,它啟動一個無限循環,定期檢查用戶是否在系統上處于活動狀態。每當惡意軟件檢測到用戶活動時,它就會捕獲屏幕截圖并將其發送到遠程服務器。
通過監控光標的位置并檢查其自上次記錄的位置以來是否發生了變化來檢測用戶活動。上傳屏幕截圖后,它會等待指定的時間間隔,然后再重新啟動循環。
屏幕截圖使用HTTP Post請求上傳到加密的有效負載中。
加密的有效負載與JackalSteal使用的有效負載相似,包含以下信息:

AES_Key和AES_IV使用RSA算法使用嵌入在代碼中的密鑰進行加密,生成的有效負載也使用GZIP算法進行壓縮。
遠程文件名和屏幕截圖數據使用AES算法加密,并使用GZIP壓縮。RSA密鑰與在其他JackalSteal組件中觀察到的密鑰相同。
基礎設施
GoldenJackal活動的特點是使用受攻擊的WordPress網站作為托管C2相關邏輯的方法。研究人員認為攻擊者上傳了一個惡意的PHP文件,該文件被用作將web請求轉發到另一個C2服務器的中繼。
目前,還沒有任何證據表明這些網站存在漏洞。然而,我們確實觀察到,許多網站都在使用過時版本的WordPress,有些網站也被之前上傳的web shell感染,這可能是由于低調的黑客活動或網絡犯罪活動。遠程網頁通常會回復一個虛假的“未找到”頁面。HTTP響應狀態代碼為“200”,但HTTP正文顯示“未找到”網頁。

在特定情況下,攻擊者會提供帶有命令列表的有效響應。在這些情況下,前面的正文后面是一長串標準Windows新行序列—“\r\n”,最后是前面提到的分隔符:

研究人員目前無法將GoldenJackal與任何已知的演員聯系起來。
研究人員觀察到GoldenJackal和Turla之間有一些相似之處,除此之外,研究人員還發現受害者UID生成算法中的代碼相似性與Kazuar使用的算法有些重疊。
具體來說,Kazuar獲取預定義字符串的MD5哈希值,然后將其與計算機中的四字節唯一“種子”進行異或。種子是通過獲取安裝操作系統的卷的序列號來獲得的。

JackalControl使用MD5+SHIFT算法。它從計算機中收集一組信息,包括安裝操作系統的卷的序列號,以使用MD5算法生成唯一的種子。然后,它使用生成的字節數組,從生成的MD5哈希中每兩個連續字節求和,并將生成的字節(模數256)作為構建最終BOT_ID的序列。

用于生成BOT_ID的代碼段
此外,使用.NET開發的工具和受攻擊的WordPress網站作為C2是一種常見的Turla TTP。
這兩個組織對相同的目標有共同的興趣,在一個特定的示例中,研究人員觀察到一臺受害者計算機在GoldenJackal感染前兩個月感染了Turla開發的惡意軟件。
盡管有這些相似之處,但GoldenJackal和Turla之間還是不一定存在聯系,因為這兩者都不是Turla獨有的。使用受攻擊的WordPress網站并不是唯一的TTP。其他組織也在活動中觀察到這種技術,例如BlackShadow,另一個活躍在中東的使用.NET惡意軟件的APT。代碼的相似性與.NET程序中的單個函數有關,該函數可以通過反編譯器輕松復制。GoldenJackal可能將該算法用作錯誤標識。另一種假設是JackalControl背后的開發人員受到Turla的啟發,決定復制UID生成算法。最后,對同一目標的共同興趣很容易解釋為受害者是備受矚目的目標,不同的攻擊者可能會認為這些目標很有趣。
總結
GoldenJackal是一個少為人知的APT組織,盡管其于2019年6月就已經被發現,但知道該組織的人并不多。
該組織可能試圖通過限制受害者人數來降低其影響力,目標數量非常少,其中大多數與政府或外交機構有關。