
프로세스 권한 상승을 위한 커널 모드 드라이버
EPROCESS의 프로세스 토큰을 시스템 토큰으로 교체하여 프로세스의 권한을 효과적으로 상승시키는 커널 모드 드라이버 프로젝트입니다. 이 드라이버는 사용자 모드 애플리케이션과 함께 사용되도록 설계되었으며, 애플리케이션은 IOCTL을 통해 프로세스 ID를 드라이버에 전송합니다.프로세스가 생성될 때, 해당 프로세스는 생성한 사용자의 토큰을 상속받습니다. 시스템은 이 토큰을 사용하여 프로세스가 수행할 수 있는 작업을 결정합니다. 토큰에는 사용자의 보안 식별자(SID), 그룹 멤버십 및 권한에 대한 정보가 포함됩니다.

Token 멤버는 프로세스 객체를 나타내는 데이터 구조인 _EPROCESS 구조체의 오프셋 0x4b8에 위치합니다. Token 멤버는 _EX_FAST_REF 구조체로 정의되며, 이 구조체는 포인터 크기에 따라 커널 객체에 대한 포인터나 참조 카운트를 저장할 수 있는 공용체(union) 유형입니다. _EPROCESS 내 _EX_FAST_REF 구조체의 오프셋은 사용 중인 Windows의 특정 버전에 따라 다르지만, 최신 Windows 버전에서는 일반적으로 오프셋 0x4b8에 위치합니다.
x64 및 x86 아키텍처에 대한 Windows 빌드 번호 토큰 오프셋
Windows의 _EX_FAST_REF 구조체에는 Object, RefCount, Value의 세 가지 멤버가 포함됩니다.

_EX_FAST_REF에 있는 프로세스 토큰을 표시하려면, 토큰을 포함하는 _EX_FAST_REF 구조체의 주소를 전달합니다. 이 구조체는 일반적으로 _EPROCESS 구조체의 오프셋 0x4b8에 위치합니다.

권한 있는 프로세스를 생성하거나 이미 존재하는 프로세스 ID의 권한을 상승시킬 수 있습니다.

설명을 위해 두 번째 옵션에 초점을 맞추고 CMD를 예로 사용하겠습니다.

상속된 토큰

IOCTL을 통해 드라이버에 프로세스 ID 전송

사용자 모드 애플리케이션으로부터 PID를 수신한 후, 드라이버는 이를 사용하여 대상 프로세스의 _EPROCESS 구조체에 대한 포인터를 얻습니다. 그런 다음 드라이버는 _EPROCESS 구조체의 Token 멤버에 접근하여 프로세스 토큰에 대한 포인터를 얻고, 이를 시스템 토큰으로 교체하여 프로세스의 보안 컨텍스트를 시스템의 보안 컨텍스트로 효과적으로 변경합니다. 그러나 드라이버가 _EPROCESS 구조체 내에서 Token 멤버를 올바르게 찾지 못하거나 Token의 오프셋이 0x4b8이 아닌 경우, 드라이버가 시스템이나 대상 프로세스를 충돌시킬 수 있습니다. 이 문제는 다음 업데이트에서 수정될 예정입니다.

cmd 토큰 이후

프로세스 권한, 그룹, 권리

| x64 offsets | x86 offsets |
|---|
| 0x0160 (late 5.2) | 0x0150 (3.10) |
| 0x0168 (6.0) | 0x0108 (3.50 to 4.0) |
| 0x0208 (6.1) | 0x012C (5.0) |
| 0x0348 (6.2 to 6.3) | 0xC8 (5.1 to early 5.2) |
| 0x0358 (10.0 to 1809) | 0xD8 (late 5.2) |
| 0x0360 (1903) | 0xE0 (6.0) |
| 0x04B8 | 0xF8 (6.1) |
| 0xEC (6.2 to 6.3) | |
| 0xF4 (10.0 to 1607) | |
| 0xFC (1703 to 1903) | |
| 0x012C |
