ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 루트킷 - 프로세스 은닉에 이용되는 기술
    > Information Security/Windows 2014. 10. 30. 11:06

    1.3. 루트킷 - 프로세스 은닉에 이용되는 기술



    (1)  IAT 후킹(유저레벨)


    프로그램을 실행하게 되면, 하드디스크에 저장된 프로그램과 관련된 프로세스가 메모리에 적재된다.

    이 때 실행하는 프로그램은 PE(Portable Executive, 실행파일포맷) 구조로 되어있는데, 루트킷이 은닉하기 위한 기술 중 IAT Hooking에서는 프로그램 내부에 존재하는 PE구조에서도, IAT(Import Address Table)을 후킹하는 방식이다.

    이는 운영체제를 직접 후킹하는 것이 아니므로, 유저모드에서만 동작하는 후킹이다.


    가. 실행파일 구조






    < DOS HEADER>

    WORD e_magic ; 시그니처(MZ)

    LONG e_lfanew ; PE HEADER 시작점




    <PE HEADER>

    PE Signature

    PE00 (5045)

     

    IMAGE_FILE_HEADER





    IMAGE_OPTIONAL_HEADER


    STANDARD_FIELD 



    ADDITIONAL_FIELD


    -       DATA DICTIONARY ENTRY

    IMAGE_DIRECTROY_ENTRY_EXPORT

    IMAGE_DIRECTROY_ENTRY_IMPORT

    IMAGE_DIRECTROY_ENTRY_RESOURCE

    . . .

    IMAGE_DIRECTROY_ENTRY_IAT

     

    <Section Table>

    IMAGE_SECTION_HEADER


     



    나. IAT(Import Address Table)의 위치

    PE HEADET > IMAGE_OPTIONAL_HEADER > DATA_DICTIONARY > IMAGE_DIRECTORY_ENTRY > IAT






    (2) DKOM


    DKOM(Direct Kernel Object Manipulation)은 앞서 IAT Hooking과는 달리, Native API를 후킹하지 않고 커널 객체(구조체)를 변경하여 은닉하는 방식이다. 

    가장 많이 사용되는 방식은, 커널디버깅을 통해 은닉하고자 하는 프로세스의 FLINK(Forward-link)와 BLINK(Back-link)를 변경해줌으로써 프로세스 목록에서 해당 프로세스를 보이지 않게 하는 방식이다. 이는 현재 동작하는 프로세스 목록을 별도로 테이블로 유지하지않기 때문에 가능하다.


    다음은 실행중인 프로세스에서 calc.exe를 커널디버깅하여 DKOM으로 프로세스를 은닉한 것이다.


     (1) !process 0 0


    [프로세스 목록에서 calc.exe의 정보 확인 (프로세스 시작주소 : 81df07e0)]


    (2) dt _EPROCESS [주소값]



    [calc.exe의 EPROCESS 구조체]


    EPROCESS 구조체 정보에서는 _LIST_ENTRY의 영역을 살펴볼 수 있다. 시작주소인 81df07e0에서 +0x088해 준 ActiveProcessLinks의 정보를 살펴보자.


    (3) dd [주소값]+0x88


    [_LIST_ENTRY 영역]


    명령어 dd를 이용하여 81df07e0에서 0x88위치에 있는 _LIST_ENTRY에는 현재 실행중인 프로세스들의 시작 주소가 나열되어 있다. DKOM을 수행하기 위해서는 calc.exe를 기준으로 blink와 flink의 주소값을 아래와 같이 변경시켜준다.

    (4) ed [blink주소값] [flink주소값]

    (5) ed [flink주소값 +0x4] [blink주소값]

    (6) g


    [blink와 flink 변경]




    Calc.exe를 기준으로 blink와 flink를 변경시켜줌으로써 현재 실행중인 프로세스 목록에서 ‘calc.exe’가 보이지 않는 모습.


    DKOM의 한계.

    커널객체는 '객체관리자'에 의해 접근 및 변경이 가능해야 하는데, DKOM으로 권한없이 접근이 가능하다.

    하지만 커널객체는 OS버전에 따라 위치가 달라지고, 커널객체를 수정하기 위해서는 메모리에 커널객체가 존재해야 한다.


    만일 OS가 프로세스 정보를 객체로 관리하지만 , 파일정보 관리하기 위한 객체가 존재하지 않으면 => 파일은닉불가

    프로세스와 드라이버, 포트만을 은닉함으로써 프로세스 권한 상승 가능





    - EPROCESS 구조체의 주소

    1. PsGetCurrentProcess()를 이용한 방법

    (1)u ni!IoGetCurrentProcess에서

    mov eax, dword ptf fs:[0000124h]


    fs에서 가져오는 [00000xxxxh]번째 값이 ETHREAD의 구조체 주소 가짐


    (2)u nt!IoGetCurrentProcess에서

    mov eax, dword ptr[eax+44h]

    ret


    ETHREAD 구조체의 0x44번째 값 리턴. 


    (3)dt nt!_ETHREAD 구조체에서 살펴보면

    0x000 Tcb _KTHREAD ★

    0x1c0 CreateTime 

    0x44번째 값은 KTHREAD 구조체 안의 값.


    (4) dt nt!_KTHREAD


    0x34 ApcState:_KAPC_STATE★

    0x4c ContextSwitches : Uinit4B


    0x44번째 값은 KAPC_STATE 구조체 내부의 값


    (5) dt nt!_KAPC_STATE

    0x00  ApcListHead : [2] _LIST_ENTRY

    0x10 Process : Ptr32 _KPROCESS★



    2. ImageFileName 이용

    (1) !process 0 0 

    PROCESS 81fb9830과 같이 찾고자 하는 프로세스 명의 주소값으로

    구조체 확인


    (2) dt_EPROCESS 81fb9830 


    0x88 AciveProcessLinks : _LIST_ENTRY

    0x174 ImageFileName : "프로세스명"


    (3) dt _EPROCESS 0x81fb9830 ImageFileName

    으로 필드 확인


    (4) dt _EPROCSS poi(0x81fb9830 +0x88)

    지정한 프로세스 명 확인가능

    (5) dt _EPROCSS poi(0x81fb9830 +0x88)-0x88 ImageFileName

    지정한 프로세스의 전 프로세스 확인 가능


    (6) dt _EPROCSS poi(poi(0x81fb9830 +0x88)-0x88 +0x88)-0x88 ImageFileName





    (3) SSDT Hooking


    SSDT(System Service Descript Table)에서 이루어진다. 

    커널레벨에 존재하는 SSDT는 Native API를 호출하기 위해 참조하는 테이블 값이다.

    API 호출 시, 유저레벨의 SYSENTER이 커널레벨의 KiFastCallEntry를 호출하는 과정에서부터 다시 살펴보면 아래와 같다.


    KiFastCallEntry는 KiSystemService()를 통해 SSDT인 KeServiceDiscriptorTable을 참조하여 Native API의 주소를 찾아간다. 이 때, KiSystemService는 System Service Dispatcher이기도 하다.

    간단히 말해 시스템 디스패처의 역할을 하는 KiSystemService( )는 KeSerciceDiscriptorTable(SSDT, System Service Descriptor Table)를 참조하여 Native API 주소를 호출한다. 

    ◆ SSDT주소(KiServiceTable) + [eax인덱스*4] = Native API 함수 주소


     









    (4) DLL Injection


     

    - 실행중인 프로세스에 injection 하는 경우


    현재 실행중인 프로세스에 DLL injection하는 경우는 기존의 프로세스를 열거나, 새로운 프로세스를 생성하여 인젝션하는 방식이다. 주로 사용되는 API함수는 아래와 같다.


    ① OpenProcess( ) , CreateProcess( ) - 프로세스 열기/ 생성

    ② VirtualAllocEx( ), VirtualAlloc( ) - 메모리 공간 할당

    ③ WriteProcessMemory( ) - 주입할 dll을 할당된 공간에 쓰기

    ④ GetProcAddress( ) - LoadLibrary( )의 주소값 받아옴

    ⑤ CreateRemoteProcess( ) - 타겟 프로세스에 쓰레드 생성


    - 레지스트리 이용한 DLL injection



    HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs

    일반적으로 레지스트리 키 값 비어있으나, DLL injection이 시도될 때 

    이 레지스트리에 값을 넣곤 한다.


    ※AppInit_DLL user32.dll은 DLL_PROCESS_ATTACH과정에서

    LoadLibrary()를 통해 로드된다.


    MS 윈도우기반 응용프로그램이 이 dll을 통해 로드된다.



    user32.dll은 LoadLibrary()를 이용하여 AppInit_DLL안에 지정된 DLL들을

    호출해주고 이때 인자값으로 DLL_PROCESS_ATTACH를 지정해주므로

    프로세스 중간에 DLL이 들어갈 수 있다.


    ------------------------------

    ※dll injection에서 가장 첫번째 단계로 Openprocess( ) 호출함


    Openprocess: PID로 대상 프로세스의 커널오브젝트를 가리키는

    핸들 가져오는 함수

    따라서 안티바이러스에서는 자가보호를 위해 PID를 계속 변경함


    사례)

    Terminate Process 공격

    AV 프로세스에 대해 OpenProcess API를 PROCESS_TERMINATE권한으로 호출하여

    핸들 획드하고 Windows에서 제공하는 TerminateProcess API를 이용하여 AV 강제종료


    Create Abnormal Thread 공격

    CreateRemoteThread를 이용하여 AV프로세스의 시작지점을 변경하는 공격

    -> ExitProcess(호출 프로세스 자신 종료 API)로 자가종료를 유도할 수도 있다.


    Null Memory Overwrite 공격

    WriteProcessMemory(특정프로세스에 메모리를 기록하는 API)를 통해

    AV 프로세스의 모든 메모리공간에 NOP코드 기록 -> 비정상종료




    <참고>

    CodeEngn_안티바이러스 자가보호 무력화에 대한 연구- 구사무엘, 김슬기

    hi.pe.kr 날으는물고기 blog.pages.kr/448

    해커스쿨 초보자를 위한 kernel based windows rootkit 1부 - Beist

    http://hisjournal.net/doc/[KUCIS_Project]_Rootkit_Scanner_by_CERT-IS.pdf

    보안공학연구논문지 2010년 8월

    윈도우 XP 컨러기반 API후킹 탐지도구 설계 및 개발 - 김완경, 소우영

    DKOM을 이용한 은닉기법 - 이동수

    codeengn.com/archive/ReverseEnginerring/Hooking

    Debugging - 코어시큐리티

    윈도우 포렌식 실전가이드 - 고원봉

    루트킷을 이용한 악성코드 탐지 - 국가사이버안전센터

    http://sysenter.tistory.com/entry/SYSENTER

    http://ryangs.egloos.com/v/758078

    FORENSIC PROOF



    728x90
    반응형

    '> Information Security > Windows' 카테고리의 다른 글

    Windows 루트킷 원리  (0) 2017.07.16
    Win32 API 기초  (0) 2014.06.17
    악성코드 탐지 - 툴 사용법  (0) 2014.05.30
    Stealth (프로세스 은폐기법)  (2) 2012.06.11
    API Code Patch  (0) 2012.06.11
Designed by Tistory.