tmxklab

악성코드 지속메커니즘 본문

Security/07 Malware Technique

악성코드 지속메커니즘

tmxk4221 2021. 4. 18. 00:52

일반적으로 공격자는 윈도우가 재부팅되더라도 악성코드가 계속 실행되기를 바란다.

이러한 지속성을 유지하기 위해 윈도우가 시작될 때마다 악성코드를 실행할 수 있는 다양한 방법이 존재한다.

 

0. 목차


1. 레지스트리

2. 스케줄 작업

3. 시작 폴더

4. Winlogon 레지스트리 항목

5. 이미지 파일 실행 옵션(IEFO)

6. AppInit_DLLs

7. DLL 검색 순서 하이재킹

8. COM 하이재킹

9. 서비스

10. 지속성 탐지

11. 참고자료

 

1. 레지스트리


  • 가장 일반적인 지속 메커니즘 중 하나는 run 레지스트리 키에 항목을 추가하는 것이다.
  • 실행 레지스트리 키에 추가한 프로그램은 시스템 시작 시 실행된다.
  • 다음은 가장 일반적인 run 레지스트리 키 목록이다.
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

주의사항)

  • HKCU는 사용자도 수정할 수 있지만 HKLM의 경우 관리자 권한 필요
  • HKCU는 해당 사용자 부팅시에만 실행, HKLM은 전체 시스템
  • Run : 시스템 부팅 시마다 실행
  • RuncOnce : 한 번만 실행하고 프로그램 시작 이후로 바로 레지스트리 키 삭제
  • RunOnceEx : 한 번만 실행하고 프로그램 종류 이후에 레지스트리키 삭제

 

  • AutoRuns유틸리티를 사용하면 다양한 자동 실행 위치를 얻을 수 있다.
 

Autoruns for Windows - Windows Sysinternals

See what programs are configured to startup automatically when your system boots and you login.

docs.microsoft.com

 

2. 스케줄 작업


  • 지정된 시간이나 시스템이 시작하는 동안 악의적인 프로그램이 실행할 수 있도록 예약
  • schtasksat 같은 윈도우 유틸리티를 일반적으로 공격자가 원하는 날짜 또는 시간에 프로그램 또는 스크립트를 스케쥴하는 데 사용한다.
  • 이렁 유형의 지속 공격을 탐지하고자 Autoruns 또는 작업 스케쥴러 유틸리티를 사용해 현재 스케줄된 작업 목록을 출력할 수 있다.
    • 정상적인 프로그램과 관련이 없는 작업의 변화를 모니터링

 

3. 시작 폴더


  • 시스템이 시작될 때 시작 폴더를 살펴보고 이 폴더에 존재하는 파일을 실행한다.
  • OS는 다음 2가지 유형(유저 전역, 시스템 전역)에 시작 폴더를 관리한다.
C:\%AppData%\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

 

4. Winlogon 레지스트리 항목


  • winlogn.exe프로세스는 대화형 유저 logon과 logoff를 처리하는 역할을 한다. 유저가 인증되면 winlogon.exe프로세스는 userinit.exe를 실행하여 초기화를 진행한다.
  • winlogon.exe는 다음 레지스트리 값으로 인해 userinit.exe를 실행하게 되는데 만약 이 값을 수정하면 부팅 시마다 악성코드를 실행시키는데 사용될 수 있다.
MKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit

 

동일한 방법으로 userinit.exe는 다음 레지스트리 값을 참고해 기본 유저 쉘을 시작한다. 이 값은 기본적으로 explorer.exe로 설정되었으며 이 부분에 공격자는 악의적인 실행 파일의 이름을 포함하는 다른 항목으로 변경하거나 추가할 수 있다.

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

 

5. 이미지 파일 실행 옵션(IEFO)


  • 이미지 파일 실행 옵션(IFEO, Image File Execution Option)은 디버거에서 실행 파일을 직접 실행할 수 있도록 한다.
  • 이는 개발자가 실행 파일의 시작 코드에 있는 이슈를 조사할 수 있도록 소프트웨어를 디버깅할 수 있는 옵션을 제공한다.
  • 원래 프로세스 실행 시에 자동으로 디버거가 Attach시키도록 하는 방식으로 사용되며 정상적인 프로그램에다가 악성 프로그램 주소를 넣게 되면 정상 프로그램을 실행시킬 때마다 악성 프로그램이 실행된다.
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<실행 파일>

실제로 notepad.exe파일에 Debugger항목을 추가해 계산기 프로그램(calc.exe)의 주소 값을 넣으면 notepad실행시 calc.exe가 실행된다.

 

6. AppInit_DLLs


  • 윈도우의 AppInit_DLLs기능은 모든 대화형 애플리케이션의 주소 공간에 유저 정의 DLL을 로드할 수 있는 방법을 제공한다.
  • DLL이 프로세스의 주소 공간에 로드되면 해당 프로세스의 콘텍스트 내에서 실행될 수 있고, 잘 알려진 API를 가로채어 대체 기능을 수행할 수 있다.
  • 공격자는 다음 레지스트리 키에 AppInit_DLLs값을 설정해 악의적인 DLL에 대한 지속성을 성취할 수 있다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
  • 이 값은 일반적으로 공백 또는 쉼표로 구분된 DLL 목록을 포함한다. 여기에 지정된 모든 DLL은 User32.dll을 로드하는 모든 프로세스에 로드된다.
  • User32.dll은 거의 모든 프로세스에서 로드하기 때문에 이 기술은 공격자가 악의적인 DLL을 대부분의 프로세스에 로드한 후 해당 프로세스의 콘텍스트에서 악성코드를 실행할 수 있게 한다.

  • AppInit_DLLs 값을 설정하는 것 외에도 공격자는 LoadAppInit_DLLs레지스트리 값을 1로 설정해 AppInit_DLLs함수를 활성화할 수 있다.
  • User32.dll을 로드한 새로운 프로세스가 시작할 때 악의적인 DLL이 주소 공간에 로드되며 시스템 재부팅 후 악의적인 DLL을 로드한 OS프로세스는 대부분 높은 무결성 수준에서 실행되므로 공격자가 상승된 권한으로 악성코드를 실행할 수 있다.

 

7. DLL 검색 순서 하이재킹


  • 공격자는 OS가 DLL을 검색하는 방법을 악용해 권한을 상승시키고 지속성을 달성할 수 있다.
  • 윈도우는 사전 정의된 위치 순서대로 dll을 검색해 로드한다.

검색 순서는 다음 링크를 참고하자

 

Dynamic-Link Library Search Order - Win32 apps

Applications can control the location from which a DLL is loaded by specifying a full path or using another mechanism such as a manifest. If these methods are not used, the system searches for the DLL at load time as described in this topic.

docs.microsoft.com

 

  • dll을 로드해야 하는 경우 OS는 먼저 dll이 메모리에 로드되어 있는지 확인하고 로드된 경우 로드된 dll을 사용한다. 하지만, 로드되지 않았다면 KnownDLLS 레지스트리 키에 정의된 dll인지 확인한다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
  • 여기에 리스트된 dll은 시스템 dll(System32디렉터리)이며, 윈도우 파일 보호를 통해 OS의 업데이트를 제외하고 삭제 또는 수정되지 않도록 한다.
  • 로드한 dll이 KnownDLLs 목록에 있다면 dll은 항상 System32 디렉터리에서 로드한다. 하지만, 이 조건이 만족하지 않으면 OS는 다음과 같이 순서대로 DLL을 찾는다.
1) 실행한 애플리케이션이 존재하는 디렉터리
2) 시스템 디렉터리(C:\Windows\System32)
3) 16비트 시스템 디렉터리(C:\Windows\System)
4) 윈도우 디렉터리(C:\Windows)
5) 현재 디렉터리
6) PATH 변수에 정의된 디렉터리
  • 예를 들어, samlib.dll이름을 가지는 악성 dll을 윈도우 디렉터리(C:\Windows)에 드롭했다고 가정해보자. 사실 samlib.dll은 이미 C:\Windows\System32에 존재하는 정상 dll이며 explorer.exe에서 로드된다.
  • 하지만, explorer.exe는 악성 dll인 samlib.dll과 동일한 위치(C:\Windows)에 존재하며, explorer.exe를 실행시키면 검색 순서에 따라 정상 dll인 samlib.dll(C:\Windows\System32)이 로드되는 것이 아니라 악성 dll인 samlib.dll(C:\Windows)이 먼저 로드된다.
  • DLL 검색 순서 하이재킹 기술은 포렌식 분석을 훨씬 어렵게 하고, 전통적인 방어를 우회할 수 있다. 이런 공격을 탐지하려면 DLL의 생성, 이름 변경, 대체, 또는 삭제를 모니터링하고 프로세스가 비정상 경로에서 모듈(DLLs)을 찾아야 한다.

 

8. COM 하이재킹


  • COM 하이재킹의 경우 공격자는 정상 COM 객체의 레지스트리 항목을 수정하고, 이를 공격자의 악의적인 DLL과 연결한다. 이를 통해 정상 프로그램이 하이재킹된 객체를 사용하면 악성 DLL을 해당 정상 프로그램의 주소 공간에 로드한다.
  • 컴포넌트 객체 모델(COM, Component Object Model)은 소프트웨어 컴포넌트가 서로의 코드에 대해 알지 못하더라도 서로 상호작용하고 통신할 수 있는 시스템이다.
    • COM은 서버/클라이언트 구조로 구현되었으며 COM클라이언트는 COM객체의 인스턴스를 생성하고 인터페이스의 포인터를 가져와 해당 인터페이스가 구현한 메서드를 호출해 COM 서버가 제공해주는 서비스를 활용할 수 있다.
    • COM 객체는 클래스 식별자(CLSIDs)라 불리는 고유 번호로 식별하며, 레지스트리 키 HKEY_CLASSES_ROOT\CLSID\<고유 clsid>에서 찾을 수 있다.

 

COM 하이재킹 공격 예시)

  • 악의적인 DLL(~.dl)을 다음 위치에 드롭한다.
  • %WinDir%\system\api-ms-win-downlevel-qgwo-l1-1-0._dl
  • 다음과 같이 레지스트리 값을 설정하여 악의적인 DLL(~.dl)을 연결
    • HKCU\Software\Classes\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}\InprocServer32\(Default) = C:\Windows\system\api-ms-win-downlevel-qgwo-l1-1-0._dl

  • 여기까지 정리해보면 원래 MMDeviceEnumerator클래스의 COM객체 {BCDE0395-E52F-467C-8E3D-C4579291692E}는 정상 DLL인 MMDevApi.dll과 연결되어 있고 레지스트리 항목은 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}\에 발견할 수 있지만 앞서 악의적인 DLL path값을 HKCU\Software\Classes\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}\에 설정해 두었다.
  • 따라서, HKCU\Software\Classes\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}\의 유저 객체가 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}\에 위치한 머신 객체보다 먼저 로드되기 때문에 악의적인 DLL이 먼저 로드되고 그 결과 MMDEviceEnumerator의 COM객체를 하이재킹한다. 최종적으로 MMDEviceEnumerator객체를 사용하는 프로세스는 악의적인 DLL을 로드한다.

 

9. 서비스


  • 서비스(Service)는 유저 인터페이스 없이 백그라운드에서 실행되는 프로그램이며 이벤트 로깅, 프린트, 에러 레포팅 등과 같은 핵심 운영 시스템 기능을 제공한다.
  • 관리자 권한을 가진 공격자는 악성 프로그램을 서비스로 설치하거나 기존 서비스를 수정해 시스템에서 지속성을 유지한다.

 

서비스를 이용한 지속 메커니즘 이점)

① 부팅 시 자동적으로 실행할 수 있음

② SYSTEM과 같은 상승된 계정으로 대부분 실행

③ 은닉과 관련된 특징 존재

 

일반적으로 사용되는 서비스 유형)

① Win32OProcess

  • 서비스를 위한 코드는 실행파일로 구현되었고 개별 프로세스로 실행

② Win32ShareProcess

  • 서비스를 위한 코드는 DLL로 구현되었고 공유 호스트 프로세스(svchost.exe)로 실행

③ Kernel Driver Service

  • 서비스를 위한 코드는 드라이버(.sys)로 구현되었고 커널 공간에 있는 코드를 실행할 때 사용

 

1) Win32OProcess

윈도우는 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services 키 아래에 있는 레지스트리에 설치한 서비스 목록과 그 설정을 저장한다. 각 서비스는 방법, 시기, 서비스가 EXE, DLL, 또는 커널 드라이버로 구현됐는지를 지정하는 값으로 구성된 개별 하위 키를 가진다.

 

ex) 윈도우 설치 서비스 msiserver

  • Imagepath : 해당 서비스를 위한 코드가 msiexec.exe로 구현됨
  • Type : service type으로 0x10(Win32OwnProcess)로 설정됨
  • Start : 서비스가 언제 시작되는지 정하는 값으로 0x3(SERVICE_DEMAND_START)로 설정됨

 

각 파라미터 값에 대한 자세한 정보는 아래 링크를 참고하자

 

CreateServiceA function (winsvc.h) - Win32 apps

Creates a service object and adds it to the specified service control manager database.

docs.microsoft.com

따라서, 위 키에 서비스를 등록하여 악성코드의 경로를 등록하면 부팅 시 위 레지스트리를 참고하여 등록된 서비스를 실행할 수 있다.

 

2) Win32ShareProcess

Dnsclient 서비스는 Dnscache의 서비스 이름이고, 서비스 코드는 dll로 구현되었다. 서비스가 dll로 구현되면 ImagePath 레지스트리 값은 일반적으로 svchost.exe의 경로가 된다.(서비스 dll을 로드하는 프로세스이기 때문)

 

서비스와 관련된 dll을 파악하려면 ServiceDLL을 살펴봐야 한다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<서비스명>\Parameters 하위키

 

ex) Dnsclient 서비스

  • 해당 dll은 svchost.exe에서 로드한다. Dnsclient 서비스와 연관된 dll은 dnsrslvr.dll이다.

공격자는 다양한 방식으로 서비스를 생성할 수 있는데 다음은 일반적으로 사용되는 방법이다.

 

① sc 유틸리티 사용

  • 악성코드는 cmd를 통해 sc create와 sc start를 사용하여 서비스를 생성 및 실행한다.

② 배치 스크립트(.bat)

  • 악성코드는 배치 스크립트를 드롭하여 앞서 sc를 사용한 명령어를 실행해 서비스 생성 및 실행할 수 있다.
  • 관련 악성코드 : Trojan:Win32/Skeeyah

③ 윈도우 API

  • 악성코드는 CreateService()와 StartService()와 같은 윈도우 API를 사용해 서비스를 생성하고 시작할 수 있다.
  • OpenScManager()를 통해 서비스 제어 관리자 핸들을 얻고 CreateService()를 호출해 Win32ShareProcess유형의 서비스를 생성, 이후에 서비스 이름 지정 시 드롭한 악성 dll로 연결
  • 관련 악성코드 : NetTraveler

④ 파워쉘 & WMI

 

 

결과적으로 Win32ShareProcess 서비스를 생성한 결과로 시스템 부팅할 때마다 서비스 제어 관리자(service.exe)는 svchost.exe 프로세스를 실행하고 악성 dll을 로드할 수 있다.

 

3) Kernel Driver Service

새로운 서비스를 생성하지 않고 공격자는 기존 서비스를 수정(하이재킹)할 수 있다. 일반적으로 공격자는 사용하지 않거나 비활성화된 서비스를 하이재킹함으로 탐지를 좀 더 힘들게 한다. (비표준 또는 낯선 서비스만 찾는다면 이런 유형의 공격은 놓치기 때문)

 

관련 악성코드 : BlackEnergy

 

Blackout - Memory Analysis of BlackEnergy Big dropper - Cysinfo

In late December a cyber attack caused power outage for few hours in the Ivano-Frankivsk region in Ukraine as mentioned here. Threat researchers from ESET linked this attack to a malware called “BlackEnergy” which attacked electricity distribution comp

cysinfo.com

BlackEnergy 드로퍼의 예로 실행 시 system32\\drivers 디렉터리에 있는 aliide.sys라는 정상 드라이버를 악의적인 aliide.sys 드라이버로 대체하고 aliide서비스와 관련된 레지스트리 항목을 수정하고 마지막으로 자동시작되도록 설정한다.

 

10. 지속성 탐지


  • 정상 프로그램과 관련되지 않은 서비스 레지스트리 항목의 변화를 모니터링
  • 서비스와 관련된 바이너리 수정과 서비스 시작 유형의 변화 확인
  • 서비스와 상호작용하는데 사용할 수 있는 sc, 파워쉘, WMI와 같은 도구의 사용을 모니터링하고 로깅
  • AutoRuns 유틸리티를 통해 서비스 사용을 검사

 

11. 참고자료


다양한 지속 전략

 

Persistence, Tactic TA0003 - Enterprise | MITRE ATT&CK®

 

attack.mitre.org

 

 

악성코드 지속 메커니즘

0. 개요 1. File Infection 2. DLL 로딩 순서 하이재킹 3. 레지스트리 4. 서비스 5. 작업 스케줄러 6. COM Object Hijacking 7. 루트킷 8. etc 0. 개요 여기서는 윈도우 시스템에서의 악성코드 지속 메커니즘(Pers..

sanseolab.tistory.com

 

'Security > 07 Malware Technique' 카테고리의 다른 글

APC Injection  (4) 2021.04.19
악성코드 기능  (0) 2021.04.18
파일리스(Fileless)기법 설명  (0) 2021.01.16
UAC bypass(레지스트리 어뷰징) 분석  (0) 2021.01.09
Reflective DLL Injection  (4) 2021.01.07
Comments