Favicon Hash & Page Similarity Fingerprinting
Teknik identifikasi cepat untuk memetakan aset web—etis, terukur, dan relevan di 2025
Dua teknik—favicon hash dan page similarity fingerprinting—mempercepat pemetaan aset (asset discovery), pengelompokan sistem serupa, hingga deteksi klon brand. Keduanya minim intrusif, hemat bandwidth, dan efektif saat dipadukan dengan recon pasif lain. Artikel ini merangkum konsep, alat, contoh kode, pitfall, serta langkah aman agar bisa langsung dipakai dalam pentest berizin atau operasi threat hunting tim biru (BlueTeam).
1) Intuisi & kegunaan
- Pemetaan cepat: menemukan layanan/host yang kemungkinan dikelola tim yang sama (ikon & tampilan serupa).
- Prioritisasi: kelompokkan target look-alike untuk efisiensi uji lebih lanjut.
- Brand protection: deteksi domain phishing/typosquatting yang meniru tampilan.
- Kontrol perubahan: pantau perubahan besar UI/ikon di estate produksi.
2) Favicon Hash: konsep & cara kerja
Ide dasar: ambil
favicon.ico
(atau ikon yang dideklarasikan), hitung hash tertentu (umumnya mmh3 untuk pencarian cepat atau SHA-256 untuk integritas), lalu cocokkan terhadap indeks internalmu atau mesin pencarian keamanan.Sumber ikon
- Tag HTML:
<link rel="icon">
,<link rel="shortcut icon">
,<link rel="apple-touch-icon">
Jalur default:
/<site-root>/favicon.ico
Variasi tema/dark-mode atau per-path favicon (beberapa framework)
Alur ringkas
- Request halaman utama → parse tag
<link ... rel="icon">
. - Ambil setiap kandidat ikon (absolute/relative URL).
- Normalisasi: content-type, redirect, kompresi.
- Hash: mmh3 (khas untuk pencarian), simpan juga sha256.
- Simpan:
host, path, size, mmh3, sha256, last-seen
.
Contoh perintah (alat baris perintah):
# ProjectDiscovery httpx (mencari favicon & hash)
httpx -l hosts.txt -silent -favicon -hash -threads 50 -random-agent -retries 2 -timeout 10
Contoh Python (mmh3 + fallback favicon):
import requests, mmh3, base64, hashlib
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def find_favicons(base_url):
r = requests.get(base_url, timeout=10, headers={"User-Agent":"Mozilla/5.0"})
r.raise_for_status()
soup = BeautifulSoup(r.text, "html.parser")
hrefs = [lnk.get("href") for lnk in soup.find_all("link") if lnk.get("rel") and "icon" in ",".join(lnk.get("rel")).lower()]
cand = [urljoin(base_url, h) for h in hrefs if h] + [urljoin(base_url, "/favicon.ico")]
seen = []
for u in dict.fromkeys(cand):
try:
fr = requests.get(u, timeout=10, headers={"User-Agent":"Mozilla/5.0"})
if fr.ok and fr.content:
b64 = base64.b64encode(fr.content)
mmh3_hash = mmh3.hash(b64)
sha256 = hashlib.sha256(fr.content).hexdigest()
seen.append({"url": u, "mmh3": mmh3_hash, "sha256": sha256, "bytes": len(fr.content)})
except requests.RequestException:
pass
return seen
Penerapan praktis
- Clustering: grupkan host dengan mmh3 sama → kandidat satu stack atau template.
- Pivoting: query ke platform intel (mis. indeks internalmu) berdasarkan hash untuk menemukan host lain yang identik.
- Anomali: perubahan tiba-tiba hash favicon di host kritikal → alert perubahan UI/tampilan.
Pitfall umum
- Ikon bawaan framework/CDN dipakai banyak situs → false positive.
- Favicon dynamic (dihasilkan JS atau berdasar tema) → hasil tidak konsisten.
- Beberapa situs menaruh ikon per-subpath → cocokkan host+path agar akurat.
- Soft 404 / halaman blok WAF yang mengembalikan ikon generik → verifikasi content-length & header.
3) Page Similarity Fingerprinting: teks, struktur, dan visual
Tujuan: menilai kemiripan halaman untuk mendeteksi domain kembar/klon UI, cluster aplikasi sejenis, atau watering hole.
3.1 Teks (SimHash / Jaccard)
- SimHash: robust terhadap perubahan kecil; cocok untuk near-duplicate detection.
- Jaccard n-gram: bandingkan shingle 3–5 kata dari teks yang sudah dibersihkan (hapus HTML/JS/CSS).
import re, requests
from bs4 import BeautifulSoup
from simhash import Simhash
def page_text_fingerprint(url):
r = requests.get(url, timeout=10, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(r.text, "html.parser")
for tag in soup(["script","style","noscript"]): tag.extract()
text = re.sub(r"\s+"," ", soup.get_text(" ", strip=True)).lower()
return Simhash(text).value # integer 64-bit
def hamming_distance(a,b): return bin(a ^ b).count("1")
3.2 Fuzzy hash HTML (ssdeep/TLSH)
- ssdeep: cepat, tetapi sensitif terhadap re-chunking.
- TLSH: lebih stabil pada perubahan kecil; bagus untuk clustering halaman HTML.
3.3 Visual (pHash/aHash) dari screenshot
- Ambil screenshot (mis.
gowitness
,aquatone
) → hitung pHash. - Kuat untuk mendeteksi look-alike meski teks/DOM berubah tetapi tata letak/ikon konsisten.
Workflow kombinasi
- Ambil HTML & teks → SimHash.
- Ambil favicon → mmh3/sha256.
- Jika borderline, ambil screenshot → pHash.
- Skor total = w1·(SimHash) + w2·(favicon match) + w3·(pHash). Tetapkan ambang.
4) Alur kerja
- Kumpulan target: hasil subdomain enum / ASN / passive DNS.
- Pengayaan pasif: jalankan
httpx
untuk favicon & header (rate-limit ketat). - Fingerprint teks: jalankan crawler ringan → SimHash/TLSH.
- Clustering: gabungkan (favicon, SimHash, pHash) → kelompok kandidat.
- Triase: pilih kluster bernilai (login portal, admin UI, unknown brand usage).
- Validasi: cek ulang false positive, perhatikan CDN & template populer.
- Dokumentasi: catat bukti, jelaskan dampak bisnis, dan saran mitigasi.
5) Triase, kualitas data, dan kesalahan umum
- CDN/template: favicon sama ≠ sistem sama. Cek title, server banner, wappalyzer hasil.
- Variasi bahasa/tema: SimHash tetap mirip; gunakan ambang konservatif dan gabungkan fitur lain.
- Halaman login generik: pHash mirip lintas produk; tambahkan sinyal unik (logo, teks legal).
- Caching: set cache-busting saat validasi agar tidak memutuskan dari artefak lama.
6) Rekomendasi mitigasi (untuk pemilik layanan)
- Gunakan favicon unik per produk/lingkungan untuk mengurangi korelasi tak diinginkan.
- Terapkan brand monitoring terhadap domain look-alike (typosquatting).
- Versikan UI/branding internal dengan pengendalian distribusi agar tidak “bocor” ke publik.
- Harden halaman login: rate-limit, bot challenge, dan generic error.
7) Contoh hasil & pelaporan
Sajikan minimal: host, URL ikon, ukuran konten, hash (mmh3, sha256), fingerprint teks (SimHash/TLSH), cap waktu, dan screenshot ringkas.
Nilai dampak: korelasi aset yang membuka peta serangan lebih luas (mis. temuan serangkaian panel admin serupa di beberapa subdomain).
Rekomendasi: perubahan ikon/tema, segmentasi, serta brand takedown bila ditemukan domain peniru.
Baca Juga Tentang Content Discovery + 403 Check