본문 바로가기
Programming/System Programming

[WIN32 / C] 권한상승 코드

by Winduck 2017. 5. 3.
반응형

 bool levelup_privileges()
{
 HANDLE hProc = NULL;
 HANDLE hToken = NULL;
 LUID luid;
 TOKEN_PRIVILEGES tp;

 if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))

 {

   if (LookupPrivilegeValue(NULL, "SeDebugPrivilege", &luid)) 

   {  

       tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

       tp.Privileges[0].Luid = luid;

       tp.PrivilegeCount = 1;  

       AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); 

       return true; 

     } 

   }

 return false;

 }


※OpenProcessToken : 프로세스의 토큰핸들값을 획득한다. (획득한 토큰을 통하여 권한을 변경한다.)

 BOOL WINAPI OpenProcessToken(
  _In_  HANDLE  ProcessHandle,
  _In_  DWORD   DesiredAccess,
  _Out_ PHANDLE TokenHandle
);

 - ProcessHandle : 접근하고자하는 프로세스 핸들
 - DesiredAccess : 토큰을 접근을 위한 접근권한
 - TokenHandle : 토큰핸들


※LookupPrivilegeValue : 명시된 권한을  표현할 LUID를 검색 (LUID : 특정권한을 표현하는 구조체)

BOOL WINAPI LookupPrivilegeValue(
  _In_opt_ LPCTSTR lpSystemName,
  _In_     LPCTSTR lpName,
  _Out_    PLUID   lpLuid
); 

- lpSystemName : 명시된 특권을 찾기위한 시스템이름
lpName : 특권이름
- lpLuid : 검색된 LUID


 =>SeDebugPrivilege : 시스템 레벨 디버깅을 위한 권한. 로컬관리자 계정에만 주어지는 권한


※AdjustTokenPrivileges : 권한을 조정한다.

BOOL WINAPI AdjustTokenPrivileges(
  _In_      HANDLE            TokenHandle,
  _In_      BOOL              DisableAllPrivileges,
  _In_opt_  PTOKEN_PRIVILEGES NewState,
  _In_      DWORD             BufferLength,
  _Out_opt_ PTOKEN_PRIVILEGES PreviousState,
  _Out_opt_ PDWORD            ReturnLength
);

- TokenHandle : 토큰핸들
- DisableAllPrivileges : 명시된 특권을 enable/disable를 결정(1 : disable, 0 : enable)
- NewState : 새로 설정할 권한
- BufferLength : PreviousState의 버퍼사이즈
- PreviousState : 이전 권한을 저장
- ReturnLength : 이전 권한의 사이즈를 저장

반응형

댓글