SocialPwned Release v2.0 – Nobody gets hacked

Es bien sabido que durante un Red Team o la ejecución de un ataque real, la primera fase consiste en la recolección de información (Information Gathering) de un objetivo, ya bien sea una persona individual o una organización. A mayor nivel de exposición de información, la probabilidad de trazar un vector de ataque efectivo basado en ingeniería social aumenta, es por ello que las herramientas OSINT (Open Source INTelligence) juegan un papel fundamental en esta fase.

Existen diferentes herramientas que permiten obtener correos electrónicos de una organización o persona individual, la mayoría basadas únicamente en LinkedIn o Google Dorks. También existen muchos leaks públicos donde se pueden obtener contraseñas o nombres de usuarios, pero esto requiere de bastante tiempo y de una buena depuración para conocer el espectro real que abarca la información obtenida.

Es en este punto donde entra SocialPwned, una herramienta OSINT que he desarrollado en Python y podéis encontrar en mi perfil de GitHub, y cuya finalidad principal es obtener los correos electrónicos que se encuentran publicados en redes sociales como Instagram, LinkedIn y Twitter. Además, de forma automatizada se pueden consultar bases de datos como PwnDB o Dehashed, para obtener contraseñas que se han visto relacionadas con los correos obtenidos.

Ilustración 1: SocialPwned.

SocialPwned se compone de diferentes módulos independientes que pueden interactuar de forma conjunta, cada uno de ellos disponible a través de repositorios públicos en GitHub o desarrollado de forma propia. A continuación se explican los diferentes módulos:

  • LinkedIn: Hace uso de la API no oficial desarrollada por el usuario de GitHub @tomquirk. SocialPwned utiliza los métodos de esta API para obtener la información de contacto de los usuarios de una organización. También se ha implementado la funcionalidad de enviar solicitudes de contacto, con la finalidad de tener acceso a la red del usuario y por tanto a mayor información en el perfil. Además, es posible buscar un usuario concreto u obtener los contactos de un usuario si tiene permitido su visualización. Por último, cuando se obtienen todos los usuarios de una organización, independientemente de si se ha obtenido información de contacto, se genera un fichero con todos los nombres y posibles combinaciones de usuarios nominales para un futuro password spraying o phishing masivo. Para poder ejecutar este módulo se necesitan credenciales de una cuenta de LinkedIn.
  • Instagram: A partir de la API no oficial de Instagram que publicó el usuario de GitHub @LevPasha, se ha implementado la funcionalidad de extraer el correo electrónico de los usuarios que lo publican en la información de contacto del perfil o como texto en la biografía. Además, en el caso de los usuarios públicos o que se tengan agregados como seguidos, es posible obtener todos los seguidores y seguidos con la finalidad de obtener más correos electrónicos públicos. Por otro lado, se han añadido funcionalidades que permiten obtener correos electrónicos públicos de cuentas que han publicado bajo un hashtag o en una localización determinada. Para poder ejecutar este módulo se necesitan credenciales de una cuenta de Instagram.
  • Twitter: Hace uso del módulo de Python Twint. Sin necesidad de credenciales de una cuenta de Twitter es posible obtener todos los tweets de un usuario y filtrar si en alguno se ha publicado un correo electrónico. También es posible hacer esto a partir de un hashtag.
  • GHunt: Esta herramienta ha sido desarrollada por @mxrch y se ha implementado como novedad en la versión 2.0 de SocialPwned. Permite extraer información de una cuenta relacionada con los correos de Google, por ejemplo, reseñas, foto de perfil, posible ubicación o eventos del calendario público. Es decir, si una cuenta aunque no tenga el dominio gmail.com utiliza GSuite o está vinculada algún servicio de Google, se podría extraer la información anteriormente mencionada en caso de ser pública.
  • PwnDB: Inspirado en el repositorio de @davidtavarez, una vez SocialPwned ha finalizado la recolección de información en alguno de los anteriores módulos, comienza a realizar consultas a PwnDB por cada uno de los correos electrónicos obtenidos. Además, mediante web scraping se realizan peticiones a HaveIBeenPwned para obtener las posibles fuentes de los leaks.
  • Dehashed: Como alternativa a PwnDB, debido a su inestabilidad en relación a la disponibilidad del servicio, se ha implementado en la versión 2.0 de SocialPwned una API que realiza consultas a Dehashed. Esta base de datos no solo proporciona las contraseñas sin cifrar de los correos electrónicos obtenidos, sino que también en caso de existir, los hashes que aún no han sido posible romper. El uso de Dehashed requiere realizar un pago por cada petición que se realiza, por tanto, es algo a tener en cuenta en caso de que se requieran hacer muchas consultas.

Cuando la ejecución de SocialPwned finaliza genera un directorio con toda la información obtenida distribuida en diferentes directorios y ficheros con extensión .txt y .json:

Ilustración 2: Output SocialPwned.

A continuación, se va a realizar una explicación de cómo se llevaría a cabo una recolección de información utilizando SocialPwned. Lo primero es saber que módulos se desean utilizar, en caso de que únicamente se vayan a ejecutar los módulos de LinkedIn, Instagram o PwnDB se puede realizar la instalación manual de SocialPwned con los pasos que se indican en Github. Pero si se quiere asegurar que la instalación se realiza correctamente y utilizar todos los módulos disponibles se recomienda instalarlo mediante la imagen de Docker creada desde la segunda versión de SocialPwned.

$ service docker start
$ docker pull mrtuxx/socialpwned 

Posteriormente, es necesario crear un fichero en formato JSON con las credenciales de las cuentas que se utilizarán para LinkedIn, Instagram y Dehashed. Además, para usar GHunt se deben añadir las cookies de la cuenta de Google que se usará, esto se explica muy bien en la documentación de GHunt. El fichero debe tener la siguiente estructura:

{
“instagram”:{
“username”:”username”,
“password”:”password”
},
“linkedin”:{
“email”:”email”,
“password”:”password”
},
“ghunt”:{
“SID”:”SID”,
“SSID”:”SSID”,
“APISID”:”APISID”,
“SAPISID”:”SAPISID”,
“HSID”:”HSID”
},
“dehashed”:{
“email”:”email”,
“apikey”:”apikey”
}
}

Con la instalación realizada y el fichero de credenciales creado ya se puede ejecutar el help de SocialPwned. Como se observa en el siguiente comando, cuando se ejecuta mediante Docker se hace uso de dos volúmenes, el primero utiliza el fichero de credenciales creado con anterioridad y el segundo genera un directorio denominado output donde se almacenará la información obtenida.

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –help

El primer paso, para que la obtención de información sea efectiva, es dedicar tiempo y cuidado a las cuenta de redes sociales que se usa, se deben visitar perfiles de empleados, enviar solicitudes de contacto de forma manual, generar tráfico dando likes o recomendaciones y visitar perfiles para ampliar el alcance de la red de la cual queremos obtener información. Este paso es muy importante porque es habitual que muchos usuarios no permitan la visibilidad de su información si no formas parte de su red.

Para evitar posibles bloqueos o resolver captchas que vayan saliendo se recomiendo mantener un navegador con las cuentas de LinkedIn, Google e Instagram abiertas, y realizar búsquedas como un usuario normal mientras se ejecuta SocialPwned.

Con cuentas que no llamen excesivamente la atención y con el nombre de la empresa se puede comenzar realizando una búsqueda en LinkedIn, para ello se ejecuta:

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –linkedin –search-companies “My Target”
Ilustración 3: Resultado de una búsqueda ende empresa en LinkedIn.

Cabe destacar que puede existir la posibilidad de que la empresa no tenga perfil en LinkedIn pero sus empleados hayan puesto el nombre de la compañía en la experiencia laboral de su perfil. En este caso SocialPwned solo podría recabar información de usuarios de forma individual y no vinculados a una organización.

El identificador obtenido (company ID) es el que se usará en el resto de comandos del módulo de LinkedIn para identificar la organización objetivo.

SocialPwned también da la posibilidad de enviar solicitudes automáticas a todos los empleados y empleadas de una organización.

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –linkedin –company 123456789 –employees –add-contacts
Ilustración 4: Ejemplo de solicitudes automáticas en LinkedIn.

Esta opción únicamente se aconseja cuando no es relevante que se produzca un bloqueo temporal por parte de LinkedIn, también se debe mencionar que si se utiliza en muchas ocasiones la cuenta puede quedar desactivada definitivamente.

Una vez se tenga una red lo suficientemente amplia se puede comenzar el proceso de recabar y obtener leaks de información. Con el siguiente comando se obtienen todos los miembros que actualmente forman parte de una organización determinada en LinkedIn, posibles combinaciones de nombres de usuario y contraseñas sin cifrar de bases de datos como PwnDB y Dehashed.

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –linkedin –company 123456789 –employees –pwndb –dehashed

En la Ilustración 5 se puede observar cómo se han obtenido algunos correos electrónicos, cuentas de Twitter y números de teléfono.

Ilustración 5: Ejemplo de obtención de información de contacto en LinkedIn.

Con los correos electrónicos recolectados se ha logrado obtener contraseñas de usuarios y sus posibles fuentes de información.

Ilustración 6: Información mostrada por el módulo PwnDB.
Ilustración 7: Información mostrada por el módulo Dehashed.

Por otro lado, cuando finaliza la ejecución de SocialPwned se tiene toda la información obtenida distribuida en el árbol de directorios y ficheros que se muestra en la Ilustración 2. Un ejemplo de diccionario con formato nombre.apellido generado sería el siguiente:

Ilustración 8: Ficheros con nombres de usuario generados.

Las organizaciones también suelen tener otro tipo de redes sociales que usan para campañas de marketing o darse a conocer en el sector, esto implica que pueden divulgar información o seguir en sus cuentas a directivos o empleados conocidos. Lo ideal es que no se obtengan correos corporativos públicos en redes sociales personales de empleados, aunque siempre cabe la posibilidad, pero en caso de que únicamente se obtenga información de leaks relacionadas con cuentas de correo electrónico personales, la reutilización de contraseñas o conocer que patrón sigue un usuario a la hora de generar una clave, puede ser un factor determinante dentro de un ejercicio de Hacking Ético o Red Team.

Si la compañía utiliza hashtags para dar visibilidad a sus publicaciones se puede utilizar el módulo de Instagram de SocialPwned para obtener los usuarios y correos electrónicos públicos de las publicaciones bajo dicho hashtag.

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –instagram –hashtag-ig someHashtag -–pwndb –ghunt
Ilustración 9: Usuarios y correos electrónicos obtenidos en Instagram con SocialPwned.

Además, si se hace uso de GHunt es posible conocer la información pública de las cuentas de Google, lo que podría permitir conocer una ubicación estimada en base a las reseñas de los sitios que ha comentado o eventos del calendario que sean públicos.

Ilustración 10: Ejemplo de información de una cuenta de Google con GHunt.

Con el módulo de Twitter también se puede obtener información relacionada con el mismo hashtag.

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –twitter –hashtag-tw someHashtag –pwndb –limit 200

Por último, si se prefiere es posible buscar correos electrónicos en los tweets que haya publicado un usuario en concreto.

$ docker run -v $(pwd)/credentials.json:/socialpwned/credentials.json -v $(pwd)/output:/socialpwned/output -it mrtuxx/socialpwned socialpwned.py –credentials credentials.json –twitter –target-tw username –all-tw –pwndb –dehashed –ghunt
Ilustración 11: Búsqueda de correos electrónicos en los tweets de un Hashtag.

SocialPwned permite múltiples combinaciones de módulos y funcionalidades que no han sido recogidas en este artículo pero que se explican en la documentación del repositorio. Además, también se proporciona un vídeo con algunos ejemplos.

Como desventaja de la herramienta se puede mencionar que no es extremadamente rápida, puesto que de forma intencionada se han añadido algunos delays en el código para que no se produzcan bloqueos de forma inmediata. Pero como conclusión general se podría decir que es una utilidad que va un paso más allá en la recolección de información estándar y facilita, a la vez que automatiza, muchas acciones claves en la obtención de información para un Hacking Ético o Red Team.

Referencias.