1. 기본

2. 권한

3. Integrity Level





1. 기본

  Access Token은 계정과 그룹의 SID, 계정의 권한과 관련된 정보를 갖는다. 즉 객체에 대한 주체의 접근 권한을 갖는 것이다. 여러 정보들을 가지고 있지만 여기서는 권한(Privilege) 및 Integrity Level과 관련된 내용만을 다루기로 한다.


  기본적으로 토큰의 핸들을 얻는 함수로 OpenProcessToken()OpenThreadToken()이 있다. 이 두 함수가 실질적으로 어떨때 각각 사용되는지는 잘 모르겠지만 대부분의 경우 OpenProcessToken()이 자주 사용되는것 같아서 이것만 보기로 한다. 이 함수로 핸들을 얻었다면 이제 GetTokenInformation()을 이용하여 Access Token에 관한 정보를 얻을 수 있다. 우리는 인자로 원하는 정보와 관련된 TOKEN_INFORMATION_CLASS [ https://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx ]를 설정한 후 해당 정보에 맞는 결과를 얻을 수 있다. 참고로 정보를 얻는 것과 반대라고 할 수 있는 즉 값을 설정하는 함수는 SetTokenInformation()이다.


BOOL GetTokenInformation(

    HANDLE    TokenHandle,

    TOKEN_INFORMATION_CLASS    TokenInformationClass,

    LPVOID    TokenInformation,

    DWORD    TokenInformationLength,

    PDWORD    ReturnLength

);


  TOKEN_INFORMATION_CLASS enumeration을 조금 더 살펴보기로 한다. 여기에서는 두 가지만 다룰 것이다. 하나는 TokenPrivilegs이며 다른 하나는 TokenIntegrityLevel이다. 즉 인자 TokenInformationClass에 원하는 타입을 정의하면 또 다른 인자인 TokenInformation에 결과가 반환된다.


  참고로 이것들과 관련된 함수들 중에서 추가적으로 PrivilegeCheck()라는 API도 존재하는데 이 함수는 특정한 권한이 Access Token에 활성화되었는지 여부를 알려주며, 활성화된 권한만 얻을 수 있다. Access Token의 활성화/비활성화된 모든 권한을 얻기 위해서는 GetTokenInformation()을 사용해야 한다.


  지금까지의 내용을 정리하면 다음과 같다. 프로세스의 토큰 핸들을 얻어서 정보를 조회하는 과정이며 인자에 따라 원하는 결과를 획득할 수 있다.


OpenProcessToken() / OpenThreadToken()

  - >

GetTokenInformation() / SetTokenInformation()

  또는

PrivilegeCheck()


  여기서 다룰 TOKEN_INFORMATION_CLASS 즉 TokenInformationClass는 다음과 같다.


TokenPrivilegs

TokenIntegrityLevel





2. 권한

  GetTokenInformation() 함수의 인자 TokenInformationClassTokenPrivilegs를 넣고 호출 시 인자 TokenInformationTOKEN_PRIVILEGES 구조체가 반환된다.


  LookupPrivilegeValue() 함수는 Privilege Constants [ https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx ]를 가지고 여기에 해당하는 LUID(Locally Unique IDentifier)를 돌려준다. 이 함수를 이용해 우리는 GetTokenInformation()를 통해 구한 TOKEN_PRIVILEGES 구조체에서 원하는 권한이 활성화되었는지 등의 여부를 확인할 수 있다.


  LUID는 AdjustTokenPrivileges() 함수에서도 사용된다. 이것은 명시한 권한을 활성화/비활성화 시켜주는 함수이다. 참고로 Access Token에 새로운 권한을 주지는 못하며 단지 토큰에 존재하는 권한을 활성화/비활성화 시키는 역할을 한다. 


  AdjustTokenPrivileges()는 인자로 토큰 핸들과 TOKEN_PRIVILEGES를 받는데, 이 구조체의 LUID를 LookupPrivilegeValue() 함수가 Privilege Constants를 통해 검색하여 얻은 LUID로 설정하고 Attributes를 SE_PRIVILEGE_ENABLED로 설정함으로써 원하는 권한을 활성화 시킬 수 있다. 


  예를들어 일반적으로 후킹에서 사용될 때는 LookupPrivilegeValue()의 인자 Privilege Constants를 SE_DEBUG_NAME (문자열로는 "SeDebugPrivilege") 으로 설정하여 이에 대한 LUID를 얻고 이것을 AdjustTokenPrivileges()로 활성화시키는 코드를 많이 보았을 것이다. 참고로 활성화 여부를 먼저 검사하거나 하는 위의 복잡한 과정 없이 활성화 여부에 상관없이 일단 활성화 시켜본 후 성공 여부에 따라 작업함에 따라 이 2개의 함수만 사용되는 예제도 많이 있다.


  즉 권한 활성화 및 비활성화 관련해서 사용되는 함수는 다음과 같다.


OpenProcessToken() / OpenThreadToken()

  - >

  [

    GetTokenInformation()

      - >

  ]

LookupPrivilegeValue()

  - >

AdjustTokenPrivileges()





3. Integrity Level

  다음으로 TokenIntegrityLevel 구조체 즉 Integrity Level에 대한 내용을 보겠다. GetTokenInformation() 함수의 인자 TokenInformationClassTokenIntegrityLevel를 넣고 호출 시 TOKEN_MANDATORY_LABEL 구조체가 반환된다.


  Integrity Level과 관련된 설명은 [ http://sanseolab.tistory.com/27 ]에 되어있고 여기서는 MSDN에 나와있는 예제만 소개한다. 링크 주소는 다음과 같다. [ https://msdn.microsoft.com/en-us/library/bb625966.aspx ] 이 코드는 현재 프로세스가 자신의 Integrity Level을 출력해주는 함수이다.


  간단한 예제로서 초기 루틴은 앞에서 다룬 GetTokenInformation()TokenIntegrityLevel을 인자로 넣어 TOKEN_MANDATORY_LABEL 구조체를 획득하는 과정이다. 그 다음으로는 TOKEN_MANDATORY_LABEL 구조체의 SID 관련 필드를 인자로 하여 GetSidSubAuthority()를 호출하여 Integrity Level을 구한다. 참고로 GetSidSubAuthorityCount()도 같이 사용된다.


  결과적으로 Integrity Level을 구할 때 사용되는 함수는 다음과 같다.


OpenProcessToken() / OpenThreadToken()

  - >

GetTokenInformation()

  - >

GetSidSubAuthority() 및 GetSidSubAuthorityCount()





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

Notepad++ 자동화  (0) 2019.01.31
파워셸(PowerShell)과 악성코드  (0) 2019.01.31
인스톨러들 분석  (0) 2018.12.16
악성코드 지속 메커니즘  (0) 2018.12.16
TotalCommand 자동화  (0) 2018.12.16
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

최근에 올라온 글

최근에 달린 댓글

글 보관함