- 공격자는 웹하드를 이용해 게임이나 게임 크랙 등 불법 프로그램과 함께 악성코드 유포 - 주로 RAT 악성코드를 유표(njRAT, UdpRAT, DDoS IRC Bot 등)
특징
- 최근 웹하드에 게임 설치 파일로 위장해 업로드 된 압축 파일을 통해 XMRig 모네로 코인 마이너를 유포하는 사례가 확인 * 코인 마이너 : 사용자 PC에 설치되어 시스템 리소스를 이용해 가상화폐를 채굴하는 악성코드 - 다운로드한 파일을 압축해제 시 게임 아이콘으로 위장한 raksasi.exe 프로그램이 실행 - 해당 파일은 XMRig 모네로 코인 마이너를 설치하는 악성코드 - 실제 게임 설치파일은 다른 폴더에 존재 - 컴퓨터가 재부팅할 때마다 동일 경로(‘c:\Xcrcure\’ 경로)에 존재하는 config.json 파일을 읽으며 마이닝을 수행
<동작> - 간단한 구조로 ‘c:\Xcrcure\’ 경로에 다음 파일을 설치 모네로 채굴 악성코드(xmrig.exe), XMRig 설정 파일(config.json), XMRig 런쳐 악성코드(MsDtsServer.exe) - 시작 폴더에 XMRig 런쳐 악성코드를 실행하는 바로가기를 ‘NewStartUp.lnk’라는 이름을 생성해 재부팅한 후 모네로 채굴 마이너를 동작시킴. - Resource 폴더에 존재하는 원본 게임 프로그램을 실행해 정상적으로 게임이 동작하는 것처럼 인식시킴.
대응
- 웹하드, P2P 사이트 등에서 다운한 실행 파일은 각별히 주의 - 유틸리티 및 게임 등의 프로그램은 반드시 공식 홈페이지에서 다운로드를 권장
- 브러글링 기법을 사용하려면 공격자가 이미 피해 시스템에 접근한 상태여야 함 - 즉, 최초 침투에 성공한 후 미리 훔쳐두거나 크래킹한 크리덴셜을 통해 로그인 및 즐겨찾기에 접근 - 대부분의 호스트 기반 혹은 네트워크 기반 탐지 시스템 우회가능 => 즐겨찾기 기능을 이용하므로대부분의 탐지 시스템에는 정상적인 브라우저 동기화 트래픽으로 보이기 때문
방법
- 먼저 공격자는 내부에 민감한 정보가 어디에 저장되어 있는지 확인 - 민감한 정보를 찾아낸 공격자는 base64 알고리즘 등으로 변경 후 적당한 길이로 분할 및 즐겨찾기 이름으로 등록 - 즐겨찾기 정보를 다른 장비에서 동기화시켜 민감한 정보를 탈취함
증명
- 한 기업의 연구원이 이를 실험해 보았으며 아래 내용 및 해당 공격이 가능하다는 것을 증명 - 대부분의 브라우저들이 상당히 많은 종류의 문자와 숫자로 한 개의 즐겨찾기 생성가능_즐겨찾기 이름 지정에 있어 한계가 거의 없다고 할 만한 수준 (책 한권을 브러글링 기법으로 빼돌리는데 성공함) - 한번에 동기화가 가능한 즐겨찾기의 갯수는 약 20만개
- Visual Studio에서 #include <winnt.h>를 입력->winnt.h에 마우스 우클릭->문서로이동을 통해 구조체를 확인할 수 있다.
1.1) DOS Header
- DOS 파일에 대한 호환성을 고려하여 만들어 졌으며, 총 64Byte 크기를 가짐.
[캡쳐 2] DOS Header
- 구조체 : IMAGE_DOS_HEADER
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
①e_magic : DOS signature(매직넘버)로 PE파일을 나타내는 첫 2바이트, MZ(5A4D로 고정 값)
각 파일은 고유의 signature(매직넘버)를 가짐.
[캡쳐 3] e_magic 값 5A4D(=MZ)
② e_lfanew : IMAGE_NT_HEADER의 시작 Offset 값을 가짐.
- e_flanew에 설정된 주소를 확인하면 PE로 시작하는 것을 확인할 수 있으며, 한번 더 시작점을 알려준다.
[캡쳐 4] e_lfanew 값
1.2) DOS Stub
- 구조체 형태가 아니며, DOS 환경에서 돌아갈 명령어가 16Bit 형태로, 가변 크기를 가짐.
- 일종의 옵션으로 없어도 파일 실행에 문제 없음.
- 32Bit 윈도우 플랫폼에서 실행되도록 만들어진 PE파일이 16Bit DOS 환경에서 실행되려 하는것을 방지하기위해 만들어짐.
- NT header구조체의 시작을 판별하실 수 있으며, ASCII 값으로 PE(0x00004550)를 나타낸다.
[캡쳐 6] Signature
1.3.2) FileHeader
- 파일의 개략적인 속성을 나타낸다.
- 구조체 : IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
① Machine : 이 파일이 어떤 CPU에서 동작할 수 있는지, 즉 실행될 수 있는 CPU의 타입을 나타냄
IA-32 호환 4C01, IA-64 호환 0020, AMD64 호환 시 6486
② NumberOfSections : 파일에 존재하는 색션의 개수(파일에 따라 다름)를 나타내며, 0보다 커야함
정의된 색션 개수 > 실제 색션 개수 : 에러 / 정의된 색션 개수 < 실제 색션 개수 : 정상 실행
③ TimeDateStamp : 해당 파일이 만들어진 시각, 즉 이 파일이 빌드된 날짜가 기록됨. 변조가능(신뢰할 수 있는 값 아님)
④ PointerToSymbolTable : COFF 파일의 심볼 테이블의 오프셋을 나타냄. 없는 경우가 대부분임
⑤ NumberOfSymbols : COFF 심벌 테이블 내에서의 심벌의 수를 나타냄. 없는 경우가 대부분임
⑥ SizeOfOptionalHeader : IMAGE_NT_HEADER 구조체 내 IMAGE_OPTIONAL_HEADER 구조체의 크기에 대한 정보
⑦ Characteristics : 파일의 속성을 나타내는 값으로, 실행 파일인지 DLL 파일인지 등의 정보들이 OR 연산을 통해 설정
아래 사진을 보아 메모장은 executable 형식이며, 32bit 라는 것을 알 수 있다.
[캡쳐 7] IMAGE_FILE_HEADER 값
1.3.3) OptionalHeader
- 파일 실행에 필요한 주요 정보들을 저장한다.
- 구조체 : IMAGE_OPTIONAL_HEADER
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
①Magic: 실행하는 PE파일의 구조체가 32bit(0B01)인지, 64bit(0B02)인지 알려주는 부분
② SizeOfCode : 코드영역(.text)의 크기
③ AddressOfEntryPoint : 프로그램의 실제 시작주소로, ImageBase 값에 이 값을 더해 시작 지점을 설정
④ ImageBase : PE 파일이 메모리에 로드되는 시작 주소. EXE의 경우 00400000, DLL의 경우 00000001
⑤ SectionAlignment : 메모리에서 섹션의 최소 단위, 각 섹션은 반드시 이값의 배수
⑥ FileAlignment : 파일에서 섹션의 최소 단위, 각 섹션은 반드시 이값의 배수
⑦ SizeOfImage : 메모리에 로딩될 때 가상 메모리에서 PE Image가 차지하는 크기, 즉 PE 파일의 전체 크기
⑧ SizeOfHeaders : 모든 PE Header의 크기
⑨ Subsystem : 동작환경을 정의. sys 파일 1, GUI 파일 2, CLI 파일 3의 값을 가짐
⑩ NumberOfRvaAndSizes : Data Directory의 구조체 멤버 개수
⑪ DataDirectory : IMAGE_DATA_DIRECTORY구조체의 배열로써 디렉토리별로 각각의 정보를 담음
- Export Directory : DLL등의 파일에서 외부에 함수를 공개하기 위한 정보들을 가짐 - Import Directory : 프로그램 실행을 위해 Import하는 DLL 이름과 사용할 함수 정보가 담긴 INT주소와 IAT주소 같은 정보가 담김 - TLS Directory : 스레드 지역 저장소 초기화 섹션에 대한 포인터 - IAT Directory : IAT의 시작번지를 가리킴
[캡쳐 8] IMAGE_OPTIONAL_HEADER 값
1.4) Section Header
- 각 Section의 속성을 정의한 헤더
- Section 유형
Code
.text
프로그램 실행 코드를 담고 있는 섹션
Data
.data
일고 쓰기가 가능한 테이터 섹션으로 초기화된 전역변수와 정적 변수 등이 위치
.rdata
읽기 전용 데이터 섹션으로 상수형 변수, 문자열 상수 등이 위치
.bss
초기화되지 않은 전역변수로, 초기화 시 .data 영역으로 이동
Import API
.idata
Import 할 DLL과 API에 대한 정보를 담고 있는 섹션으로 IAT 정보가 저장
.diata
Delay-Loading Import DLL 정보 (프로그램 실행 후 DLL 사용시에만 연결하며, 릴리즈 모드 시 다른 섹션에 병합)
Expoit API
.edata
Export할 API 정보를 담고 있는 섹션 (주로 DLL에서 사용되며 .text 또는 .rdata에 병합)으로 EAT 정보가 저장
- PHP 프로그래밍 언어를 위한 유닛 테스트 프레임워크 - SUnit과 함께 기원한 유닛 테스트 프레임워크를 위한 XUnit 아키텍처의 인스턴스이며 JUnit과 함께 대중화 - PHPUnit은 Sebastian Bergmann이 개발하였으며 개발 자체는 깃허브에서 호스팅되고 있음
2. CVE-2017-9841
[캡쳐 1] https://nvd.nist.gov/vuln/detail/CVE-2017-9841 번역
- 해당 취약점은 /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php에 대한 적절한 인증과정이 없어 발생되는 취약점
3. 취약점 분석
- 4.8.28 이전의 버전 및 5.6.3 이전의 5.x PHPUnit에 공격이 가능하다. - eval-stdin.php에 해당 코드에 의해 취약점이 발생한 것으로 판단된다. php://input 함수를 이용해 원시 데이터를 읽은 후 eval 함수로 해당 명령을 실행하기 때문이다.
[캡쳐 2] 취약점 유발 코드[캡처 3] 취약점 테스트
- 공격자들은 [캡쳐 3]의 php 코드를 통하여 먼저 취약점이 존재하는지 테스트 후 [캡쳐 4] 방식 등으로 공격을 진행.
[캡쳐 4] RawData
4. 대응방안
1. 최신 버전의 패치를 적용.
[캡쳐 5] 취약점이 패치된 버전의 소스코드
2. 보안 장비에 해당 패턴을 등록하여 탐지 및 차단 ( ex) /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php 경로로 요청을 탐지 및 차단 할 수 있도록 룰 설정) 3. .htaccess 파일을 /vendor 폴더에 위치 시킨 후 관련 설정을 등록. * .htacccess 파일이란 "hypertext access"의 약자로 디렉토리에 대한 접근 허용 여부 등 설정 옵션을 제공한다.