woonadz :)

[지속 기법] DLL Search Order Hijacking/COM 하이재킹/서비스 본문

IT/악성코드

[지속 기법] DLL Search Order Hijacking/COM 하이재킹/서비스

C_scorch 2024. 3. 8. 23:56
반응형

해당 포스팅은 악성코드 분석 시작하기 책을 바탕으로 작성하였습니다.


 

DLL 검색 순서 하이재킹

 

[그림 1] KnownDLLs 경로
[그림 2] KnownDLLs의 레지스터 값

프로그램이 실행되면 import 테이블 또는 LoadLibrary() API 호출한 프로세스의 결과로 관련 DLL이 프로세스 메모리에 로드됩니다.

윈도우 운영 체제는 사전 정의된 위치 순서대로 DLL을 검색해 로드합니다.

Dynamic-link library search order - Win32 apps

DLL을 로드해야 하는 경우 운영 시스템은 먼저 DLL이 메모리에 이미 로드되 있는지를 확인하고 로드되어있지 않다면 KnownDLLs 레지스트리 키에 정의된 DLL인지를 확인합니다.

사진에 보이는 DLL은 시스템 DLL이고, 윈도우 파일 보호를 통해 운영 시스템의 업데이트를 제외하고 삭제 또는 업데이트되지 않도록 합니다.

로드한 DLL이 KnownDLLs 목록에 있다면 DLL은 항상 System32 디렉터리에서 로드되며, 이 조건이 만족되지 않으면 다음과 같은 순서로 DLL을 찾습니다.

  1. 실행한 애플리케이션이 존재하는 디렉터리
  2. 시스템 디렉터리(C:\Windows\System32)
  3. 윈도우 디렉터리(C:\Windows\System)
  4. 현재 디렉터리
  5. PATH 변수에 정의된 디렉터리

공격자는 운영체제가 DLL을 검색하는 방법을 악용해 권한을 상승시키고 지속성을 유지할 수 있습니다.

 

 

COM 하이재킹

 

[그림 3] KnownDLLs의 레지스터 값

COM(Component Object Model)은 소프트웨어 컴포넌트가 서로의 코드에 대해 알지 못하더라도 서로 상호작용하고 통신할 수 있도록 하는 시스템입니다.

https://learn.microsoft.com/ko-kr/windows/win32/com/the-component-object-model

 

구성 요소 개체 모델 - Win32 apps

구성 요소 개체 모델

learn.microsoft.com

COM은 사진과 같이 클라이언트/서버 프레임워크로 구현됩니다.

COM의 클라이언트와 서버의 역할은 다음과 같습니다.

  • 클라이언트
    • COM 클라이언트는 COM 서버가 제공하는 객체 또는 컴포넌트를 사용하는 소프트웨어입니다.
    • 클라이언트는 COM 객체를 생성하고 해당 객체의 메서드를 호출하여 작업을 수행할 수 있습니다.
    • COM 클라이언트는 COM 객체를 식별하는 데 사용되는 클래스 ID(CLSID)를 통해 클라이언트는 해당 객체를 인스턴스화하고 사용할 수 있습니다.
  • 서버
    • COM 서버는 COM 컴포넌트의 실제 구현을 나타내며, 이 컴포넌트는 다른 프로그램이나 프로세스에서 사용할 수 있는 기능 또는 객체를 제공합니다.
    • COM 서버는 COM 컴포넌트를 등록하고 관리하는 역할을 합니다. 등록은 COM 객체의 클래스 식별자(CLSID)와 프로그램에서 사용할 수 있는 인터페이스를 시스템 레지스트리에 등록하는 과정을 의미합니다.
    • COM 서버는 COM 객체를 생성하고 관리하기 위한 기능을 제공합니다. 객체는 클라이언트가 요청할 때 생성되고, 클라이언트와 상호 작용합니다.

 

COM 하이재킹

 

[그림 4] CLSID 경로
[그림 5] CLSID 레지스트리 값

COM 객체는 클래스 식별자(CLSIDs)라 불리는 고유 번호로 식별하며, 사진과 같은 경로에서 찾을 수 있습니다.

필자의 컴퓨터를 예로 들어, 컴퓨터의 COM 객체는 {20D04FE0-3AEA-1069-A2D8-08002B30309D}로 확인할 수 있습니다.

 

 

COM 하이재킹 실습

 

[그림 6] InProcServer 32 레지스트리 값

각 CLSID 키에 대해 COM 서버 기능을 구현하는 DLL 파일명을 저장한 InProcServer32 라는 하위키를 가집니다.

사진을 통해 windows.storage.dll이 컴퓨터와 관련이 있음을 볼 수 있습니다.

정상 프로그램(COM 클라이언트)이 특정 COM 객체(CLSICD)에서 서비스를 사용하면 관련 DLL이 클라이언트 프로그램의 프로세스 주소 공간에 로드됩니다.

 

COM 하이재킹 실습

 

[그림 7] COM 객체의 레지스트리 항목
[그림 8] COM 하이재킹 실습 결과

COM 하이재킹의 경우 공격자는 정상 COM 객체의 레지스트리 항목을 수정하고, 이를 공격자의 악의적인 DLL과 연결합니다.

공격자가 시스템에 존재하며, 정상 프로그램이 하이재킹 된 객체를 사용하면 악성 DLL을 정상 프로그램의 주소 중간에 로드한다는 점을 악용한 것입니다.

위 실습은 HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\mscfile\\shell\\open\\command 의 기본값을 powershell.exe로 변경해주었습니다. Powershell을 가리키는 지점으로 하이재킹했기 때문에 Event Viewer를 시작할 때 Powershell이 대신 호출되는 것을 확인할 수 있었습니다.

COM 하이재킹 기술을 탐지하기 위해서는 다음과 같이 확인할 수 있습니다.

  • HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID 에 있는 객체의 존재 여부를 확인합니다.
  • HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID 의 기존 항목에서 레지스트리 키에 알려지지 않은 바이너리를 가리키는 값을 확인합니다.

 

서비스

 

서비스는 유저 인터페이스 없이 백그라운드에서 실행되는 프로그램이며, 이벤트 로깅, 프린트, 에러 리포팅 등의 기능을 제공합니다.

관리자 권한을 가진 공격자는 악성 프로그램을 서비스로 설치하거나 기존 서비스를 수정해 시스템에서 지속성을 유지할 수 있습니다.

공격자가 서비스를 사용함으로써 권한을 상승할 수 있습니다.

  • 운영 체제가 시작할 때 자동적으로 실행되도록 설정 가능
  • 일반적으로 SYSTEM과 같은 상승된 계정으로 실행 가능

악성프로그램에서 사용하는 일반적인 서비스는 다음과 같습니다.

  1. 커널 모드 드라이버 (Kernel-Mode Drivers): 악성 코드는 커널 모드 드라이버를 설치하여 시스템의 커널 영역에서 동작하거나 수정할 수 있습니다. 이를 통해 시스템의 핵심 기능을 조작할 수 있습니다.
  2. 서비스 서비스 (Service Services): Windows 서비스는 백그라운드에서 실행되는 프로그램이며 시스템 부팅 시 자동으로 시작될 수 있습니다. 악성 프로그램은 서비스를 이용하여 시스템에 계속해서 존재하고 액세스할 수 있습니다.
  3. RPC 서버 (Remote Procedure Call Server): 원격 프로시저 호출(RPC) 서버는 원격 컴퓨터와의 통신을 관리하고 원격 명령을 수행합니다. 악성 코드는 원격에서 시스템에 접근하고 제어하기 위해 RPC 서버를 악용할 수 있습니다.
  4. 필터 드라이버 (Filter Drivers): 필터 드라이버는 파일 시스템 및 네트워크 트래픽과 같은 데이터 스트림을 필터링하고 수정하는 데 사용됩니다. 악성 코드는 데이터 흐름을 조작하거나 중간에 개입하여 정보를 탈취하거나 수정할 수 있습니다.
  5. 프록시 서비스 (Proxy Services): 프록시 서비스는 인터넷 트래픽을 중개하고 필터링하는 데 사용됩니다. 악성 코드는 프록시 서버를 통해 웹 트래픽을 중간에서 가로채거나 조작할 수 있습니다.
  6. DCOM 서버 (Distributed Component Object Model Server): DCOM 서버는 다른 컴퓨터와의 분산된 객체 통신을 관리하는 데 사용됩니다. 악성 코드는 DCOM 서버를 이용하여 원격 시스템과 상호 작용하거나 제어할 수 있습니다.

 

서비스

[그림 9] Services 경로
[그림 10] Services 레지스트리 값

윈도우는 사진과 같은 경로의 키 아래에 있는 레지스트리에 설치한 서비스 목록과 그 설정을 저장합니다.

각 서비스는 방법, 시기, 서비스가 어떻게 구현되었는지 등의 값으로 구성된 개별 하위키를 가집니다.

다음 장에서 커널 드라이버 서비스 중 하나를 함께 살펴보겠습니다.

 

Tcpip 서비스 속성

 

[그림 11] Tcpip 서비스 레지스트리 값

tcpip.sys는 TCP/IP 스택 드라이버로, 네트워크 통신을 관리하고 TCP/IP 프로토콜을 지원한다.

  • 커널 드라이버 서비스의 서비스 이름은 tcpip.sys입니다.
  • ImagePath : 이 서비스를 위한 코드가 “System32\drivers\tcpip.sys”에 구현됐음을 지정합니다.
  • Type = 1 (KERNEL_DRIVER) : 이 유형은 서비스가 커널 모드 드라이버로 동작함을 나타냅니다.
  • Start = 0 (Boot Start) : 이 값은 서비스가 시스템이 부팅될 때 자동으로 시작되어야 함을 나타냅니다.

속성값들은 아래 MSND 문서에서 더 자세하게 공부할 수 있습니다.

https://learn.microsoft.com/ko-kr/windows/win32/api/winsvc/nf-winsvc-createservicea

 

CreateServiceA 함수(winsvc.h) - Win32 apps

서비스 개체를 만들고 지정된 서비스 제어 관리자 데이터베이스에 추가합니다. (ANSI)

learn.microsoft.com

 

 

서비스 설정 정보 검색 실습

 

sc qc "서비스 이름"

[그림 12] Tcpip 서비스 검색 결과

sc 유틸리티에 서비스 이름을 전달하여 서비스 설정을 질의 할 수 있습니다.

사진을 보면 레지스트리 하위 키에서 발견한 것과 유사한 정보를 표시한다는 것을 알 수 있습니다.

 

 

서비스 생성 실습

sc create [서비스_이름] binPath= [실행_파일_경로] start auto && sc start [서비스_이름]

공격자는 다음과 같은 방법을 통해 서비스를 생성할 수 있습니다.

  1. sc 유틸리티 : 악성코드는 cmd.exe를 통해 [서비스_이름]을 생성하고 시작할 수 있습니다.
  2. 배치 스크립트 : 악성코드는 배치 스크립트를 드롭하고 sc 유틸리티를 사용하여 [서비스_이름]을 생성하고 시작할 수 있습니다.
  3. 윈도우 API : 악성코드는 CreateService()와 StartService()와 같은 윈도우 API를 사용해 서비스를 생성하고 시작할 수 있습니다.
반응형