Demostración en vídeo de este post

Existen muchas librerías y proyectos desarrollados en Python que ayudan en la automatización de pruebas para pentesting así como la creación de exploits o pruebas de concepto que vienen bien en una auditoría. Una de las librerías más potentes que existen en el pentesting en entornos de red es Impacket. Se trata de un proyecto que contiene múltiples clases y scripts que soportan los principales protocolos de red disponibles actualmente, especialmente aquellos utilizados en redes con sistemas Windows. A diferencia de otras librerías como Scapy, en el caso de Impacket el objetivo es la manipulación de los paquetes a bajo nivel, lo que significa que pueden ser construidos desde cero utilizando los elementos disponibles en la librería. Por otro lado, una de las características que llaman la atención de Impacket es que cuenta con varias pruebas de concepto en forma de scripts que facilitan enormemente su uso y  representan una forma estupenda de aprender sobre la jerarquía de clases y utilidades disponibles, esto por supuesto si se cuenta con un poco de tiempo para leer y entender dichos scripts.

La instalación de Impacket se puede llevar a cabo utilizando PIP, partiendo del código fuente disponible en GitHub y ejecutando el fichero “setup.py” o creando un contenedor en Docker. Cualquiera de las alternativas indicadas permite utilizar Impacket y los scripts disponibles en el proyecto sin mayores dificultades, además se encuentran documentadas en el repositorio. Instalar Impacket normalmente no supone ninguna dificultad.
Una de las mejores formas de explorar el proyecto consiste precisamente en ejecutar las herramientas que se encuentran disponibles en el directorio “examples” que tal como se ha comentado anteriormente, son scripts que utilizan las clases disponibles en la librería para realizar diferentes tipos de pruebas. A continuación se explican un par de estos scripts para la ejecución de comandos de forma remota.

 

Ejecución mediante WMI.

Si el sistema objetivo tiene WMI habilitado es posible utilizar el script “wmiexec.py” el cual permite realizar una conexión y obtener una shell en dicho sistema. Su uso es sencillo, basta con indicar una cuenta de usuario y contraseña validos así como la IP/nombre de la máquina y el script hará el resto.

Hay que tener en cuenta que para ejecutar el comando y establecer la conexión es necesario que el usuario tenga permisos de Administrador (no es necesario que sea SYSTEM). Tal como se aprecia en la imagen anterior, se realizan un par de pruebas con un usuario que está en el Active Directory (juan) y no es posible generar una shell con la estación de trabajo por falta de permisos ya que ese usuario en concreto, no se encuentra incluido en ningún grupo especial, GPO ni tampoco es administrador local en el sistema objetivo. Posteriormente, tal como se puede apreciar en la imagen, se utiliza otro usuario (pedro) el cual es un usuario de dominio y hace parte de un grupo especial sobre el que se ha creado una GPO para que todos los miembros de dicho grupo tengan permisos de administradores locales en las estaciones de trabajo, por ese motivo a la hora de ejecutar el script se puede apreciar que se lleva a cabo correctamente el proceso de autenticación y posteriormente se genera una shell en el sistema utilizando WMI.

Ejecución mediante SMB.

Impacket cuenta con algunos scripts para aprovechar las características del protocolo SMB, uno de dichos scripts es “smbexec.py“. Este script en concreto se encarga de crear un servicio Windows para ejecutar instrucciones contra el sistema, sin embargo su modo de operar depende de si encuentra algún directorio compartido en el que el usuario indicado tenga permisos de escritura. En el caso de que no sea capaz de encontrar un directorio compartido, levanta un servidor SMB en la máquina del atacante (se deben tener permisos de root para abrir y vincular el puerto 445) y crea un directorio compartido localmente en donde se escribirán los resultados de los comandos ejecutados por parte del servicio en la máquina remota.

Nuevamente, como ocurre con el script “wmiexec.py” en el caso de “smbexec.py” son necesarios permisos de administrador en la máquina remota, en este caso para poder crear el servicio Windows. Una de las principales diferencias entre ambos scripts a efectos prácticos, es que “smbexec.py” genera más eventos en el sistema remoto que el “wmiexec.py“, además como ya se ha comentado, “smbexec.py” necesita realizar operaciones tan delicadas como la creación de un nuevo servicio en el sistema, aunque cabe anotar que al finalizar el script dicho servicio se elimina.

Ambas utilidades representan el poder de la librería y cómo utilizando correctamente las clases disponibles en Impacket se pueden crear herramientas muy interesantes de cara a ejecutar pruebas de pentesting/post-explotación en entornos de red. En los próximos posts se detallará aún más el uso de otras herramientas y se explicará cómo utilizar algunas clases de Impacket para crear scripts.

Un saludo y Happy Hack!
Adastra.