Fundamentos de Impacket
Cuando se utiliza Impacket exec, como por ejemplo los módulos wmiexec.py
, smbexec.py
o atexec.py
, para ejecutar comandos en un sistema remoto, hay una serie de interacciones a bajo nivel que tienen lugar entre el sistema del atacante y la máquina objetivo. Vamos a desglosar este proceso a un nivel más detallado:
1. Autenticación y Conexión
El primer paso es la autenticación. Impacket puede utilizar varios métodos para autenticarse en la máquina remota:
Credenciales válidas (usuario/contraseña).
Hash NTLM para ataques de Pass-the-Hash.
Tickets Kerberos en ataques como Pass-the-Ticket o Kerberoasting.
Dependiendo del método de autenticación elegido, Python hace uso de las bibliotecas y funciones de Impacket para encapsular las credenciales y presentarlas al sistema remoto a través de los protocolos SMB o WMI, de una manera que el servidor objetivo pueda procesarlas. Una vez que la autenticación es exitosa, el atacante puede proceder a ejecutar comandos.
2. No se Crea Ningún Binario en la Máquina Remota
A diferencia de otras técnicas, como el uso de metasploit o PSExec, Impacket no sube ni crea ningún binario en la máquina remota. Esto es un aspecto crucial de su funcionamiento, ya que ayuda a evadir ciertos sistemas de detección que podrían monitorear la creación de archivos ejecutables en el sistema objetivo.
Impacket aprovecha las funcionalidades administrativas de Windows que ya existen para ejecutar comandos sin necesidad de dejar rastros evidentes en el sistema de archivos. Esto lo convierte en una herramienta más sigilosa.
3. No se Inicia Ningún Servicio Permanente
Otra diferencia importante es que Impacket no crea ni inicia servicios permanentes en el sistema remoto. Esto es diferente de herramientas como PSExec, que generalmente crean un servicio de administración de Windows (Service Control Manager) temporal para ejecutar comandos y luego lo eliminan. En el caso de wmiexec.py
o atexec.py
, el sistema operativo Windows es utilizado tal como está, sin la necesidad de instalar o iniciar servicios adicionales.
4. Ejecución de Comandos a Través de WMI o SMB
Dependiendo del módulo que se utilice, el mecanismo de ejecución cambia:
WMIExec (
wmiexec.py
): Utiliza WMI para ejecutar comandos de forma remota. Windows Management Instrumentation (WMI) es una interfaz de administración que permite la ejecución de scripts y comandos en sistemas Windows sin la necesidad de interacción física o archivos temporales en el sistema. WMI proporciona un canal de administración ya presente en la infraestructura de Windows, lo que hace que sea más difícil de detectar por sistemas de defensa, ya que es una herramienta legítima.Cuando se ejecuta un comando a través de
wmiexec.py
, WMI crea un proceso en el sistema remoto que ejecuta el comando enviado, y devuelve la salida a través de la conexión establecida. Python, mediante Impacket, se encarga de enviar estos comandos utilizando las bibliotecas de WMI a través del protocolo DCOM (Distributed Component Object Model). Este protocolo permite la comunicación remota entre aplicaciones distribuidas, que es lo que WMI utiliza para ejecutar comandos sin crear servicios adicionales ni escribir binarios en disco.SMBExec (
smbexec.py
): Utiliza el protocolo SMB para ejecutar comandos en el sistema remoto. SMB es un protocolo que facilita el intercambio de archivos y la comunicación entre equipos.smbexec.py
aprovecha la capacidad del protocolo SMB para acceder a funciones administrativas del sistema operativo Windows.En este caso, Python realiza llamadas al sistema mediante SMB para ejecutar comandos remotos a través de la interfaz del sistema operativo. SMB también permite a Impacket ejecutar comandos con privilegios administrativos sin la necesidad de crear archivos o servicios persistentes. Todo se realiza a través de comandos que son interpretados por el sistema operativo y ejecutados en el contexto administrativo.
ATExec (
atexec.py
): Utiliza la funcionalidad de Tareas Programadas de Windows (AT) para ejecutar comandos de forma remota. En este caso, el comando se programa en el sistema remoto como una tarea que se ejecuta inmediatamente. Aunque las tareas se registran en el sistema, no se crea ningún binario ni servicio adicional, ya que Windows simplemente ejecuta el comando directamente.
5. Comunicación y Salida de Comandos
Los comandos ejecutados en la máquina remota, ya sea a través de WMI, SMB o AT, son procesados en el contexto del usuario o los privilegios administrados por las credenciales proporcionadas. Los resultados de estos comandos (como las salidas de shell) son enviados de vuelta al sistema del atacante utilizando el mismo canal de comunicación que se utilizó para ejecutarlos.
La salida es capturada por Impacket, que la presenta al atacante a través de la consola. Esto puede incluir resultados de comandos como
ipconfig
,whoami
, o cualquier otro comando que el atacante desee ejecutar remotamente.
6. Shells Inversas o Persistentes
En cuanto a las shells inversas, Impacket no proporciona automáticamente una shell inversa persistente como lo haría un exploit tradicional de Metasploit. Sin embargo, un atacante puede ejecutar comandos como nc.exe
(Netcat) para abrir una reverse shell, ya que Impacket le proporciona la capacidad de ejecutar cualquier comando válido en el sistema objetivo.
Por ejemplo, un atacante podría utilizar wmiexec.py
para ejecutar un comando de PowerShell que abra una conexión de reverse shell hacia el sistema atacante. En este caso, el comando sería enviado a través de WMI o SMB, y la reverse shell sería creada a partir de ese comando específico, no de la propia herramienta Impacket.
7. Python y las Llamadas Internas
Impacket está desarrollado en Python y hace uso de varias librerías subyacentes para interactuar con los protocolos de Windows, como SMB, WMI, y DCOM. Python realiza estas tareas a través de:
Sockets y Conexiones de Red: Python utiliza las bibliotecas estándar de red para abrir conexiones a los puertos SMB y WMI de los sistemas remotos.
Autenticación de Bajo Nivel: Las bibliotecas de Impacket implementan las capas necesarias para encapsular y enviar credenciales en el formato correcto (por ejemplo, NTLM o Kerberos) para la autenticación en sistemas Windows.
Interacción con los Protocolos Windows: Una vez autenticado, Python ejecuta llamadas específicas de SMB, WMI o Tareas Programadas, dependiendo del módulo utilizado, para ejecutar comandos en el sistema remoto.
Last updated