31 jul 2018

Extraer claves privadas SSH en Windows 10

La fase de post-explotaciónes una de las más amplias, ya que las posibilidades son infinitas. En Windows 10 se introduce OpenSSHy las posibilidades de utilizar SSH Agentpara las conexiones a través del protocolo SSH. En este artículo mostraré como se puede, con el privilegio adecuado, extraer las claves privadas que estén almacenadas en el registro de Windows 10. Para ello, solamente hay que hacer uso de Powershelly un poco de conceptos básicos de .NET

Sobre la temática de extracción de claves privadas de SSH en Windows se puede leer un artículo muy interesante aquí. Existe un artículo más antiguo sobre la extracción de claves SSH de memoria que también es muy recomendable. Lo primero es entender cómo trabaja el SSH Agenty de dónde recoge las claves privadas. Si se utiliza ProcMonpara monitorizar las acciones que realiza el binario ssh-agent.exe, se puede descubrir fácilmente las operaciones que realiza el binario en el registro. En este caso, parece sencillo, se hace una serie de consultas a una ruta que se encuentra en HKCU. La ruta es HKCU:\Software\OpenSSH\Agent\Keys.

Lo curioso es que para poder manipular la ruta de OpenSSHno se tiene permiso. Es decir, se requiere tener un mayor privilegio que el del usuario normal. Cuando uno utiliza el binario ssh-add.exey le pasa como argumento una clave privada, dicha identidad queda almacenada en el registro. En la ruta anteriormente comentada. Si se accede al registro, podemos ver algo similar a esto: 


La clave con el nombre ‘comment’indica el nombre del fichero desde el que se importó la clave privada. Además, el valor del campo ‘comment’está en ASCII directamente, por lo que es trivial obtener esa información. La clave ‘(Default)’es nuestro objetivo. Ésta es distinta, no está en ASCII, está cifrada. El binario SSH-Agentutiliza la protección de datos de Microsofttambién conocida como DPAPIDPAPIes parte de la CryptoAPI

Para sacar el valor del commentse puede utilizar la clase [System.Text.Encoding]de .NET. Al final, como se comentaba anteriormente, es solo ASCII. Tal y como se puede ver en la imagen, se obtiene el nombre del fichero original desde el que se importó la clave privada.  


El abuso de DPAPIha sido constante a lo largo de los años. El objetivo en la post-explotación siempre ha sido obtener credenciales y secretos. Este es de nuevo un ejemplo de ello. 

Para desproteger la clave se podía hacer uso de la clase ProtectionDataen Security.Cryptography.ProtectedDatay el método Unprotect. En la imagen se puede ver el proceso seguido en Powershell, como se puede ver con pocas líneas se puede hacer un gran trabajo. 


En la variable $keyse almacena el valor de la clave ‘(Default)’que es la clave privada protegida. Después, gracias a System.Security, se puede desproteger la clave y se almacena en $bytesUnProtect. Por último, se convierte a base64.

Si decodificamos el base64podemos observar una especie de binario que comienza con un texto claro ssh-rsa. Para poder observar esto, se puede hacer uso de las instrucciones que se ejecutan en la consola, como se puede ver en la imagen. En resumen, primero se convierte los bytes desprotegidos anteriormente en base64. Posteriormente, se muestran en ASCII. En el binario se puede ver el “ssh-rsa”.


Ahora toca hacer uso del script parse_mem.py, el cual se puede encontrar en el siguiente repositorio de Github. Este scriptpermite parsearde un binario una clave privada de SSH. Por ello, hay que coger la salida binaria anterior y almacenar en un fichero. Es muy importante que siempre se haya respetado en encoding en ASCII. 


Ahora almacenamos el base64 en un fichero y lo subimos a la máquina Kali Linux. Una vez tenemos el fichero en la máquina Kali Linuxpodemos decodificar el base64y obtener el binario y hacer uso del scriptparse_mem.py

La instrucción en Powershell para almacenar el base64en un fichero es $base | Out-File –Encoding ASCII –FilePath [ruta]. Hay que tener en cuenta que la variable $basedispone del contenido en base64

Una vez se tiene el fichero en la máquina Kali Linuxse puede hacer lo siguiente cat [fichero] | base64 –d > binary. Después, simplemenete, ejecutar python parse_mem.py binary [nombreClaveRSA]


Para el pentestingy la fase de post-explotación es una técnica a tener en cuenta, ya que puede permitirnos acceder a otras máquinas gracias al uso de esa clave privada exfiltrada de la máquina Windows 10. Pronto más novedades con esta técnica.

24 jul 2018

Creando un módulo para la extracción de claves privadas en Windows 10 con ibombshell

La semana pasada hablamos sobre la extracción de claves privadas SSH en Windows 10. Hoy quería enseñar lo sencillo que es crear un módulo de ibombshell, el cual será liberado este mes en cuanto Álvaro Nuñez y yo terminemos unos detalles. Recordando que ibombshell tiene dos modos de ejecución, uno el denominado everywhere con Powershell y el denominado silentlygracias a un C2 escrito en Python

Cuando hablamos de módulos hablamos de la posibilidad de incorporar funcionalidad al C2 de Python. En el caso de querer crear una nueva funcionalidad para el modo everywherese debe añadir en el Githubcorrespondiente, en nuestro caso será el de ElevenPaths, la función de Powershell necesaria. Como se explicó en el artículo dedicado a ibombshelles necesario tener clara la estructura de directorios y ficheros en el Github, ya que la consola hará uso de dicha estructura. 

Primera parte. Creación de la función

En primer lugar, vamos a crear una función para extraer las claves privadas SSH en Windows 10. Esta función se obtiene del conocimiento de esta técnica y tiene un requisito importante y es que el proceso dónde se ejecute dicha función se esté ejecutando con integridad alta. Es lógico aplicar una serie de comentarios en la función o en la ayuda de la función sobre este tema. 

El aspecto de la función puede ser algo parecido a lo que se puede ver en la imagen. La función extract-sshprivatekeycomprueba en primer lugar si existe el pathHKCU:\Software\OpenSSH\Agent\Keys. En caso de existir, recorre el número de claves almacenadas en la ruta. Por cada clave, se lista el valor de Commentque es el nombre de la clave en ASCII. Por último, se recupera el valor de clave en binario y se codifica en base64. Aquí acaba la función.

Hay que recordar que, posteriormente, habría que hacer uso del script parse_mem.pypara obtener el valor ASCII de la clave privada. Lo importante sería poder utilizar esta información en una vía remota, pero cabe la posibilidad de utilizar en el modo everywherede ibombshell


Si listamos las funciones disponibles en la shellcon el comando showcommandsnos aparece la siguiente ruta post/extract-sshprivatekey. Esto es gracias al mapeo que se puede encontrar en la raíz del repositorio, en el fichero functions.txt, en el que se relaciona las funciones con las rutas del repositorio. 

Una vez descargada a memoria la función, ésta se queda en el providerde funciones con el nombre sshprivatekey. Como he comentado anteriormente, si el entorno dónde se ejecuta la función tiene privilegios podremos ejecutarla, si no nos devolverá un error, tal y como se puede visualizar en la imagen. 


Ahora, vamos a suponer que tenemos privilegio en el proceso. Realizando el mismo proceso comentado anteriormente, el resultado es distinto, la función ejecutada en ibombshelldevuelve los nombres de las claves y el base64del binario de la clave privada. Con ese base64 se debe ejecutar parse_mem.pypara obtener la clave privada en ASCII. La función extract-sshprivatekeyes una versión nuestra que se ha realizado para este artículo y que queda dentro del repositorio para su uso en auditoría o pentesting. 


Segunda parte. Creando el módulo para nuestro panel en Python

Lo primero es entender el formato que tiene un módulo de ibombshellen Python. La idea es sencilla, que cuando el pentesterejecute el módulo en Pythonéste genere la función de Powershelly la instrucción para invocarla. Esta información es almacenada en un fichero que el warrior, o proceso que ejecutaibombshellen remoto, leerá mediante una petición HTTP.

Recuperando el esquema con el que jugamos en nuestro panel en Pythony la interacción con el warrior de ibombshellvemos la siguiente imagen. En esta imagen, se puede ver que es el warriorel que, cuando es ejecutado en la máquina remota, realiza una petición hacia nuestro C2 registrando la dirección IP y el nombre o ID. Esto es a través de una petición HTTP, a través de un GET. Posteriormente, tras el registro, el warrior realiza una petición HTTP para verificar si hay algún tipo de función o funciones que deba, primero cargar en memoria y posteriormente ejecutar. 


El usuario del C2 al configurar un módulo y ejecutar el run, lo que está haciendo es almacenar en un fichero la función correspondiente y las instrucciones que se deben ejecutar en el warrior de ibombshellen Powershell. Cuando el warriorlee el fichero, ya carga la función y las instrucciones las ejecuta. Posteriormente, el warriorenvía los resultados a través de un POST que se realiza al mismo recurso en el panel de Python

Ahora, entendamos qué partes tiene un módulo de ibombshellen Python. Se proporcionará una clase denominada CustomModule. El cual tiene el constructor y un método run_module. Como se puede ver, un módulo no será algo complejo. 

En el constructor tenemos una variable information, la cual es un diccionario que proporciona varios atributos y varios valores. Suele ser tema informativo, nombre del módulo, autor, descripción, etcétera. Por otro lado, se tiene la variable options. Esta variable es un diccionario que tiene los atributos del módulo. Por cada atributo se tiene una lista en el que se indica si el atributo tendrá algún valor, su descripción y si es obligatorio. 


El método run_module implementará lo que se va a ejecutar cuando el pentester haga ‘run’, una vez configurado el módulo. Lo primero que se hace en esta función es verificar si el warrior configurado por el usuario existe. Para ello se comprueban los ficheros creados por ibombshell sobre los que se comunicará el warrior ejecutado en remoto. El ID de dicho warrior debe existir en forma de fichero. 


Por último, se añade a la variable functionla instrucción que hará que el warriorremoto ejecute la función cargada. No es más que el propio nombre de la función. En este caso, depende de la configuración del módulo, ya que una función puede tener N formas de ser ejecutada. Es decir, una función puede ser ejecutada con varios parámetros o argumentos, por lo que utilizaremos selectores o bifurcaciones para los diferentes casos y acabaremos agregando a la variable functionla instrucción necesaria, en función de la configuración del módulo. 


A continuación, os dejo un video dónde se puede ver el funcionamiento del nuevo módulo y los resultados que éste proporciona. El repositorio de Github de ibombshell.


23 jul 2018

Recursos de hacking

Buenos días comunidad. En primer lugar quiero agradecer a Juan Antonio Calles y a Pablo González, por publicar este articulo en Flu Project.

¿Cual ha sido mi proyecto esta vez?, ademas del anterior de Osint Social que lo he ampliado con varias fuentes mas (https://www.flu-project.com/2018/04/osint-social.html), pues bien, en esta ocasión he decidido diseñar una plataforma educativa en materia de hacking y pentesting, con un buscador diseñado mediante CSE (Google custom engine), lo cual podrá ser de utilidad tanto al newbie, como al avanzado en materia de seguridad.

Podréis acceder al buscador desde el link: 




Este buscador contiene más de 30 fuentes de seguridad de la información. Os compartimos algunos ejemplos de búsqueda:

"Conferencias de Defcon en pdf"
  • busqueda " defcon ext:pdf"


Búsqueda de habla hispana
  • "Hacking en buscadores".

  • Hacking GSM


También se pueden encontrar noticias de hacking y filtraciones:
  • "Hacking news" o "Hacking team" o "shadow brockers"


Para ir cerrando, podemos ver vulnerabilidades y exploits jeje
  • "exploit apache vulners"


  • "exploit iis exploit-db"



Podría seguir, pero espero que la prueben, con términos sencillos de lo que quieran aprender de seguridad.

Un Saludo y ¡disfruten el buscador!.
A.k.a Rootkit Pentester.

16 jul 2018

TakeTV: Descubriendo dispositivos DLNA/UPnP y utilizándolos

Hace unos meses estuve jugando con ChromeCast e hice un pequeño script llamado ChromeCrash. Era realmente sencillo poder meter mano a un dispositivo ChromeCrash, por defecto, si se tenía acceso a la red. Incluso, si no se tenía acceso a la red, se podía realizar un ataque Rickmote remoto, tal y como se puede ver en el video del artículo. Hace unos pocos días, llegué a un Github que me llamó la atención. La aplicación se llamaba TakeTV y permite descubrir dispositivos DLNA/UPnP y lanzarles comandos para reproducir imágenes, videos, música y poder interactuar con las Smart TV

La herramienta está escrita por @svelizdonoso y es muy vistosa e intuitiva. Para poder utilizarla hay que instalar, mediante apt-get install youtube-dl, una serie de dependencias, las cuales se utilizarán para descargar los videos, las canciones o las imágenes que se quieran tener en el servidor web que la herramienta monta. 


Funcionamiento

El funcionamiento es muy sencillo, TakeTVdispone de dos partes escritas en Python: 

·     La primera parte es la herramienta en sí que hace el descubrimiento de dispositivos y la que también enviará las órdenes a los dispositivos. El script se llama taketv.py.
·     La segunda parte es el script llamado assistent.py, el cual puede utilizarse para descargar los contenidos audiovisuales de diferentes rutas de Youtubeo de otras fuentes. Este script también es el encargado de listar las direcciones URL de los contenidos y de lanzar el servidor web en el que se debería apoyar taketv.py para que la televisión reproduzca el contenido. 


Si miramos la ayuda de la herramienta taketv.pyse puede encontrar diferentes opciones como son las siguientes:

·     El parámetro ip. Aquí se indicará la dirección IP de la televisión.
·     El parámetro all. Se realiza el descubrimiento de equipos por UPnP
·     Parámetros play, stop, mute, unmute, pause, volume, seekpermiten jugar con los contenidos y enviarlos a los dispositivos. 
·     El parámetro timeouttrabaja el tiempo de espera en la fase de descubrimiento. Es recomendable cubrir un timeoutalto, para que se puedan descubrir correctamente los dispositivos. 


Para poder descubrir dispositivos se puede utilizar la instrucción python taketv.py –all –timeout 7. Como se puede ver en la imagen, se obtiene un listado de dipsositivos, entre los que destaca una televisión. En el caso de ChromeCasttambién podríamos obtenerlo y manipularlo, como se vio con el ChromeCrash

Para poder preparar las URL dónde se encuentren los contenidos que enviar a los dispositivos o televisiones, se debe hacer uso del script assistent.py. Gracias a este script se puede realizar la descarga de contenido mp3, mp4, mkv, jpg. 


Además, se puede hacer un listado de los contenidos disponibles que luego se servirán con el script assistent.py, con el objetivo de que la televisión lo ejecute. La instrucción python assistent.py –listserverdevuelve el listado de contenidos disponibles. Es importante, ya que luego con python taketv.py –ip [dirección IP TV] –play [hay que indicar URL del servidor assistent.py].


Por último, hay que arrancar el servidor. Para ello, se ejecuta python assistent.py –httpserver –port 8000. Nos vuelven a listar las URL de los contenidos audiovisuales. 


Los dispositivos compatibles con la herramienta o sobre las que el autor ha comprobado son: Samsung, LG, Android TV, Recco AOC. Una vez se tiene listo todo, se puede enviar el contenido de la siguiente manera: taketv.py –ip [dirección IP TV] [opción: --play –stop –volume –pause, etc] [URL del recurso a reproducir en la televisión]

Sin duda, una herramienta interesante y es que la seguridad en el hogar es un campo que debemos seguir estudiando, ya que tenemos muchos ejemplos de posibilidades con los protocolos actuales. ¿Tienes una Smart TV? Pruébalo!

9 jul 2018

Primeros pasos con la impresora 3D Prusa i3

Muy buenas a todos, ¿qué tal estáis? Hace ya bastantes semanas que no me veis por estos lares debido al meteórico comienzo de Zerolynx. Hemos crecido tanto y en tan poco tiempo, que estamos dedicando cada minuto del día para que este nuevo proyecto sea sólido y esté construido sobre un buen armazón de hormigón, por lo que el poco tiempo que tenemos, lo intentamos dedicar a la familia y a cubrir esos hobbies tan necesarios para poder desconectar de vez en cuando. Hoy, precisamente, venía a hablaros de uno de ellos, porque recientemente me compré mi primera impresora 3D.

Aunque ya había hecho mis primeros pinitos con el 3D, con algo de programación de videojuegos, hasta ahora no me había dado por trastear en este mundo tan heterogéneo que es el de la impresión 3D. Para comenzar, y tras otear el mercado, me decidí por adquirir una Prusa i3 mk2. Es de las impresoras más vendidas, con más repuestos, con más manuales y sobretodo con muchas versiones a precios bajos. Ya sabía que este mundillo es como el de las motos, que empiezas con una de 250cc y acabas con una de 1.100cc con alforjas, pero por algo había que empezar, ¿no? Y por ello me decanté por la Prusa i3 del fabricante chino CTC, por un precio de 136 €:


Este modelo de impresora se encontraba 20-30 € más barato en otras tiendas online. Pero entre los costes de envío que al final igualaban casi el precio y la confianza de Amazon, preferí no arriesgar.

La recibí en 24h, perfectamente embalada, y sin ninguna pieza rota. Además venía con tornillería de sobra, y un par de escuadras de repuesto. Por lo que en ese aspecto, buena satisfacción.

Cuando sacas todo de la caja, te encuentras al principio de un duro día de Bricomanía, con más de 50 piezas que en principio deberían encajar.., hasta que recuerdas que lo has comprado en China, no en Ikea, y te fijas en que las varillas son "más o menos rectas", que para que encaje algún tornillo hay que limar un poco..., pero bueno, ¡al menos te incluyen la lima! ¿qué más se puede pedir?

No trae manual en papel (crítica negativa), sino que viene en CD y que en mi caso, que ya no tenía una unidad de DVD a mano para leerlo, pues se convierte en algo incómodo. De todas maneras el manual habría servido de poco, porque es el de la primera versión de la Prusa i3. En este modelo han quitado el ventilador, la placa base es algo más pequeña, la fuente de alimentación se monta invertida y por tanto, los cables también. 

Por suerte, stop-dramas, en la página web del fabricante hay un video-tutorial, mucho mejor que el PDF en chino mal traducido al inglés. No tiene voz, pero no hace falta, la nitidez es bastante buena y es difícil equivocarse en el montaje:


Con este vídeo reduciréis el tiempo de montaje de 5 o 6 horas que me llevó a mí, a 1 hora más o menos.

Una vez montada, llega el momento más importante, el de la calibración. Mi consejo es que seáis cuidadosos, ya que esto influirá en que la calidad de impresión sea la óptima, y no acabe una varilla clavada en el ojo de nadie :) Si todo está bien conectado, debería calentar a la temperatura correcta, moverse con libertad en los ejes X, Y y Z, e imprimir delgados "spaguetti". Este vídeo, aunque es de otro modelo, os servirá perfectamente porque se trata del mismo firmware:



Manuales hay 100.000 en Internet, por lo que os recomiendo trastear mucho, que al final es como se aprende.

Las primeras impresiones veréis que no son 100% buenas, pero es cuestión de seguir calibrando poco a poco. Por ejemplo, os comparto cómo me quedó a mí una varita de Voldemort (la tengo que lijar aún) y un Ford Mustang (con un acabado algo basto):



Para buscar modelos 3D que impremir yo suelo utilizar el siguiente sitio web:


De esta web os podréis bajar los modelos STL, los cuales tendréis que convertir a GCODE, que es el formato que interpreta esta impresora. Para la conversión, y calibración pertinente de la impresión, os recomiendo Slic3r. Es gratuita y muy simple de utilizar:


Y eso es todo por hoy. Si tenéis alguna duda podéis escribirme al correo de Flu Project, y si queréis darme algún consejo para mejorar las impresiones y compartirlo por aquí o queréis compartir otras herramientas, se agradece mucho.

Saludos!