티스토리 뷰

Windows 보호기법의 우회

MS 는 SetProcessValidCallTargets 라는 API를 process 에 있는 arbitrary address 를 화이트리스팅하기 위해서 사용한다. SetProcessValidCallTargets 는 내부적으로 ntdll!NtSetInformationVirtualMemory 를 VmInformationClass=VmCfgCallTargetInformation 으로 실행한다. 

1
2
3
4
5
6
7
//Whitelisting an arbitrary address
HANDLE p = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION, FLASE, process_id)
MEMORY_BASIC_INFORMATION meminfo;
VirtualQueryEx(p, target, &meminfo, sizeof(meminfo));
CFG_CALL_TARGET_INFO cfg;
cfg.Offset = ((DWORD64)target) - (DWORD64)meminfo.AllcationBase;
cfg.Flags =  CFG_CALL_TARGET_VALID;
SetProcessValidCallTargets(p, meminfo.allocationBase, meminfo.RegionSize, 1&cfg)
cs

 

우리는 Windows 10 version 1803 에서 CFG 이외의 윈도우즈 보호기법을 비활성하는 방법을 찾았다. MS 는 SetProcessMitigationPolicy 라는 API를 제공하는데 이를 통해 프로세스의 보호기법을 ON/OFF 가능하다. 이 함수는 타겟 프로세스에서 실행이되야하고 3가지 인자 값이 필요하다. 이 인자 값을 맞춰주고 ntdll!NtQueueApcThread를 사용해서 타겟프로세스에서 SetProcessMitigationPolicy를 실행한다. 

1
2
3
//NtQueueApcthread를 이용한 우회
HANDLE th = OpenThread(THREAD_SET_CONTEXT, FALSE, thread_id);
ntdll!NtQueueApcThread(th, SetProcessMitigationPolicy, (void*)ProcessDynamicCodePolicy, ((char*)GetModuleHandle("ntdll")) + 0x20sizeof(PROCESS_MITIGATION_DYNAMIC_CODE_POLICY));
 
cs

이 기법은 Windows 10 version 1809 에서 막혔다. 위와 같은 방식을 사용하면 ERROR_ACCESS_DENIED 를 반환한다. 

 

process Injection 과정 

일반적인 프로세스 인젝션은 다음 3 단계로 이루어진다.

 

1. 메모리 할당

2. 할당한 메모리에 원하는 코드 쓰기

3. 쓴 코드를 실행

 

가끔 메모리 할당과 쓰기가 같은 단계에 이루어지는 경우도 있다. ( 같은 API에서 두 가지를 전부 하는 경우)

 

메모리 할당

메모리에 쓰려면 그 전에 메모리 할당이 필요하며 이 과정은 다음 두 가지 방법으로 이루어질 수 있다. 

 

1. Injector 프로세스가 VirtualAllocEx 를 호출해서 새로운 메모리 영역을 타겟 프로세스에 생성한다.

2. Injector 프로세스가 이미 존재하는 메모리 영역을 덮어쓴다. 덮어쓰는 영역에는 다음과 같은 선택지가 있다.

  • Stack - stack 은  RW 이다. 하지만 stack에 쓰는 것은 프로세스에서 해당 메모리를 덮어써버릴 수 있기 때문에 유의해야한다. 
  • Image - 몇몇 DLL은 여분의 Data Section을 남겨놓는데 이 부분을 RW 권한 이기 때문에 쓰기가 가능하다.
  • Heap - 이 부분도 RW 이기 때문에 쓰기가 가능하다. 

VirtualProtectEx 는 메모리 영역의 권한 변경을 위해서 사용될 수 있다. 

 

 

참고자료 : Windows Process Injection in 2019 - Amit Klein, Itzik Kotler Safebreach Labs

 

 

'시스템 보안 > 취약점' 카테고리의 다른 글

Windows Process Injection - Introduction(Part1)  (0) 2020.06.18
Heap Chunk  (0) 2018.02.27
powershell empire 설치법(ubuntu)  (0) 2017.02.10
유형별 정리  (0) 2017.02.05
Format String Bug(포멧 스트링 버그)  (0) 2017.01.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함