Enumerando subdominios con favicon.ico

En cualquier proyecto de Red Team o Pentesting, una de las fases principales es la enumeración de activos. En este caso, nos vamos a centrar en la enumeración de subdominios. En esta entrada del blog, vamos a ver como enumerar subdominios utilizando favicon.ico.

Esta técnica puede util para enumerar sitios Web que están siendo utilizados para campañas de Phishing o de suplantación de marcas y también, puede permitir obtener la IP real de un servicio Web protegido, por ejemplo, por CloudFlare.

¿Cómo enumeramos subdominios utilizando favicon?

Lo primero que deberemos localizar es la URL del objetivo donde se encuentra alojado el favicon.ico. Para el ejemplo, vamos a utilizar el favicon.ico de GitLab.

  • https://gitlab.com/assets/favicon-72a2cad5025aa931d6ea56c3201d1f18e68a8cd39788c7c80d5b2b82aa5143ef.png
  • https://www.hackerone.com/sites/default/files/favicon_0.ico

Una vez obtenida la URL, vamos a generar el hash de este favicon que posteriormente utilizaremos para realizar las búsquedas. Para esto, podemos utilizar desde las calculadoras hasta la siguiente herramienta CLI.

import mmh3
import hashlib
import requests
import codecs

# Función para descargar el favicon y calcular los hashes MurmurHash3 y MD5
def get_favicon_hashes(favicon_url):
    try:
        # Descargamos el favicon desde la URL proporcionada
        response = requests.get(favicon_url, timeout=15)
        if response.status_code == 200:
            print("[INFO] Favicon descargado con éxito.")

            # Codificamos el contenido en base64 para el cálculo de MurmurHash3
            favicon_base64 = codecs.encode(response.content, "base64")

            # Calculamos el hash MurmurHash3 (para Shodan)
            favicon_mmh3_hash = mmh3.hash(favicon_base64)

            # Calculamos el hash MD5 (para ZoomEye)
            md5_hash = hashlib.md5(response.content).hexdigest()

            print(f"[INFO] Hash MurmurHash3 (Shodan) del favicon: {favicon_mmh3_hash}")
            print(f"[INFO] Hash MD5 (ZoomEye) del favicon: {md5_hash}")

            return favicon_mmh3_hash, md5_hash
        else:
            print(f"[ERROR] No se pudo descargar el favicon, estado HTTP: {response.status_code}")
            return None, None
    except requests.exceptions.Timeout:
        print(f"[ERROR] Tiempo de espera agotado al intentar descargar el favicon de: {favicon_url}")
    except requests.exceptions.RequestException as e:
        print(f"[ERROR] Excepción al descargar el favicon: {e}")
        return None, None

# Función para ejecutar el script desde la terminal
def main():
    favicon_url = input("Introduce la URL del favicon: ")
    get_favicon_hashes(favicon_url)

if __name__ == "__main__":
    main()

Una vez que tenemos nuestro script terminado, vamos a comenzar a obtener hashes para buscar subdominios en shodan, zoomeye…

  • Hash GitLab: 1265477436
  • Hash HackerOne: 595148549

Ahora utilizando los hashes anteriores y Shodan, vamos a buscar sitios Web, subdominios y posibles sitios maliciosos que utilicen el favicon equivalente al hash introducido.

Para esta enumeración, también podemos utilizar otras herramientas como ZoomEye. En caso de esta plataforma, no utilizaremos el mismo tipo de hash que para Shodan (MurmurHash3) sino que utilizaremos MD5.

La próxima parada será automatizar este proceso en un único script utilizando diferentes plataformas (shodan, zoomeye, censys…) para centralizar la búsqueda de subdominios utilizando esta técnica en una única herramienta.


English version

In any Red Team or Pentesting project, one of the main phases is asset enumeration. In this case, we will focus on subdomain enumeration. In this blog post, we will explore how to enumerate subdomains using favicon.ico.

This technique can be useful for enumerating websites being used for phishing campaigns or brand impersonation. Additionally, it may allow the discovery of the real IP address of a web service that is protected, for instance, by CloudFlare.

How to Enumerate Subdomains Using Favicon?

First, we need to locate the URL of the target where the favicon.ico is hosted. For this example, we will use the favicon.ico from GitLab.

Once we have the URL, we will generate the hash of this favicon, which we will later use for searches. To do this, we can use anything from calculators to the following CLI tool.

import mmh3
import hashlib
import requests
import codecs

# Función para descargar el favicon y calcular los hashes MurmurHash3 y MD5
def get_favicon_hashes(favicon_url):
    try:
        # Descargamos el favicon desde la URL proporcionada
        response = requests.get(favicon_url, timeout=15)
        if response.status_code == 200:
            print("[INFO] Favicon descargado con éxito.")

            # Codificamos el contenido en base64 para el cálculo de MurmurHash3
            favicon_base64 = codecs.encode(response.content, "base64")

            # Calculamos el hash MurmurHash3 (para Shodan)
            favicon_mmh3_hash = mmh3.hash(favicon_base64)

            # Calculamos el hash MD5 (para ZoomEye)
            md5_hash = hashlib.md5(response.content).hexdigest()

            print(f"[INFO] Hash MurmurHash3 (Shodan) del favicon: {favicon_mmh3_hash}")
            print(f"[INFO] Hash MD5 (ZoomEye) del favicon: {md5_hash}")

            return favicon_mmh3_hash, md5_hash
        else:
            print(f"[ERROR] No se pudo descargar el favicon, estado HTTP: {response.status_code}")
            return None, None
    except requests.exceptions.Timeout:
        print(f"[ERROR] Tiempo de espera agotado al intentar descargar el favicon de: {favicon_url}")
    except requests.exceptions.RequestException as e:
        print(f"[ERROR] Excepción al descargar el favicon: {e}")
        return None, None

# Función para ejecutar el script desde la terminal
def main():
    favicon_url = input("Introduce la URL del favicon: ")
    get_favicon_hashes(favicon_url)

if __name__ == "__main__":
    main()

Once our script is ready, we will begin generating hashes to search for subdomains on platforms like Shodan, ZoomEye, and others.

  • Hash GitLab: 1265477436
  • Hash HackerOne: 595148549

Now, using the previously generated hashes and Shodan, we will search for websites, subdomains, and potential malicious sites that use the favicon corresponding to the input hash.


For this enumeration, we can also use other tools such as ZoomEye. In the case of this platform, we won’t use the same type of hash as for Shodan (MurmurHash3); instead, we will use MD5.

The next step will be to automate this process in a single script using various platforms (Shodan, ZoomEye, Censys…) to centralize subdomain enumeration using this technique into one tool.

Tags:

Comments are closed