Setiap kampanye phishing yang meniru bank, marketplace, instansi pemerintah, atau perusahaan Anda hampir selalu dimulai dari satu hal sederhana: sebuah domain baru. Di Indonesia, pertumbuhan domain .id yang pesat (dilaporkan mencapai sekitar 1,43 juta domain pada akhir 2025 oleh PANDI) membawa peluang bisnis sekaligus permukaan penyalahgunaan: pemberitaan Bisnis.com pada awal September 2026 melaporkan puluhan ribu domain .id terkait aktivitas judi online dan phishing yang ditangani PANDI melalui IDADX. Kabar baiknya, ada sinyal awal yang bisa dipantau secara legal dan gratis oleh tim keamanan mana pun: Certificate Transparency (CT). Tutorial ini menunjukkan cara memanfaatkannya sebagai teknik OSINT defensif untuk memburu domain tiruan merek Anda sebelum korban pertama berjatuhan.
Apa Itu Certificate Transparency dan Mengapa Berguna
Certificate Transparency adalah kerangka kerja terbuka yang mewajibkan Certificate Authority (CA) mencatat sertifikat TLS yang mereka terbitkan ke dalam log publik yang bersifat append-only dan dapat diaudit. Spesifikasi awalnya adalah RFC 6962 (2013), dan penerusnya RFC 9162 (CT versi 2.0). Browser utama seperti Chrome dan Safari mensyaratkan bukti pencatatan CT (Signed Certificate Timestamp, SCT) agar sertifikat dipercaya, sehingga praktis semua sertifikat publik modern muncul di log CT.
Implikasinya bagi pembela sangat menarik. Penyerang yang ingin membuat situs phishing dengan gembok HTTPS harus meminta sertifikat, dan permintaan itu tercatat secara publik, sering kali dalam hitungan menit hingga jam setelah domain dikonfigurasi, bahkan sebelum tautan phishing disebarkan. Dengan kata lain, CT adalah "radar" gratis untuk melihat nama domain baru yang memuat merek Anda.
Batasan yang Perlu Dipahami
- Tidak semua phishing memakai HTTPS. Sebagian penyerang tetap memakai HTTP atau halaman sementara; CT tidak melihatnya.
- Sertifikat wildcard dan subdomain. Penyerang sering memakai subdomain seperti
login.merek.contoh-lain.com; pencocokan kata kunci harus mencakup seluruh nama, bukan hanya domain induk. - Kecocokan bukan bukti. Domain yang mengandung nama merek bisa saja milik mitra, reseller, atau penggemar sah. Hasil CT adalah petunjuk untuk diverifikasi, bukan vonis.
- Layanan pihak ketiga tidak dijamin stabil. Antarmuka publik seperti crt.sh dikelola secara sukarela, kadang lambat atau menolak permintaan; untuk produksi pertimbangkan layanan streaming CT atau menjalankan monitor sendiri.
Arsitektur Monitor Sederhana
Alur kerja yang akan kita bangun terdiri dari empat tahap:
- Mengambil entri sertifikat yang memuat kata kunci merek dari crt.sh (format JSON).
- Mengekstrak nama domain, lalu menormalkan menjadi domain terdaftar (registrable domain).
- Menyaring domain milik sendiri (allowlist) dan menilai kemiripan terhadap merek.
- Menyimpan status "sudah dilihat" agar hanya temuan baru yang dilaporkan, lalu mengirim ringkasan ke tim.
Langkah 1: Menyiapkan Lingkungan
Skrip ini hanya memakai pustaka standar Python 3.9+, sehingga mudah dijalankan di server mana pun atau dijadwalkan lewat cron.
python3 -m venv .venv
source .venv/bin/activate
mkdir ct-monitor && cd ct-monitor
touch ct_monitor.py seen.json
Langkah 2: Mengambil Data dari Log CT
crt.sh menyediakan parameter output=json. Tanda persen (%) adalah wildcard pencarian dan harus dikodekan sebagai %25 di URL. Kita membatasi hanya sertifikat yang terbit dalam beberapa hari terakhir agar hasil fokus pada ancaman baru.
import json
import time
import urllib.parse
import urllib.request
from datetime import datetime, timedelta, timezone
from difflib import SequenceMatcher
from pathlib import Path
BRAND = "siberindo" # kata kunci merek (huruf kecil)
OWN_DOMAINS = {"siberindo.io"} # domain sah milik Anda
LOOKBACK_DAYS = 7
SEEN_FILE = Path("seen.json")
SECOND_LEVEL = {"co.id", "go.id", "or.id", "ac.id", "web.id",
"my.id", "sch.id", "biz.id", "ponpes.id"}
def fetch_ct(keyword: str, retries: int = 3):
query = urllib.parse.quote("%" + keyword + "%", safe="")
url = "https://crt.sh/?q=" + query + "&output=json"
req = urllib.request.Request(
url, headers={"User-Agent": "brand-monitor/1.0 (tim-keamanan)"}
)
for attempt in range(retries):
try:
with urllib.request.urlopen(req, timeout=60) as resp:
return json.load(resp)
except Exception as exc:
print("percobaan", attempt + 1, "gagal:", exc)
time.sleep(5 * (attempt + 1))
return []
Langkah 3: Menormalkan Domain dan Menilai Kemiripan
Satu sertifikat dapat memuat banyak nama (kolom name_value dipisahkan baris baru). Kita pecah, buang awalan *., lalu ambil domain terdaftar. Karena Indonesia banyak memakai tingkat kedua seperti co.id, kita tangani secara khusus; untuk akurasi penuh di produksi, gunakan Public Suffix List (misalnya lewat pustaka tldextract).
def registrable(name: str) -> str:
parts = name.lower().lstrip("*.").split(".")
if len(parts) >= 3 and ".".join(parts[-2:]) in SECOND_LEVEL:
return ".".join(parts[-3:])
return ".".join(parts[-2:])
def label_of(domain: str) -> str:
parts = domain.split(".")
if ".".join(parts[-2:]) in SECOND_LEVEL and len(parts) >= 3:
return parts[-3]
return parts[-2] if len(parts) >= 2 else domain
HOMOGLYPH = str.maketrans({"0": "o", "1": "l", "3": "e", "5": "s", "$": "s"})
def score(domain: str) -> float:
label = label_of(domain).translate(HOMOGLYPH).replace("-", "")
ratio = SequenceMatcher(None, BRAND, label).ratio()
if BRAND in label:
ratio = max(ratio, 0.9)
return round(ratio, 2)
Fungsi score memberi nilai 0 sampai 1. Penggantian karakter (misalnya angka 0 menjadi o) menangkap teknik typosquatting sederhana, sedangkan pengecekan BRAND in label menangkap pola kombinasi seperti siberindo-login atau verifikasi-siberindo.
Langkah 4: Menyaring, Menyimpan Status, dan Melaporkan
def load_seen() -> set:
try:
return set(json.loads(SEEN_FILE.read_text()))
except Exception:
return set()
def main():
cutoff = datetime.now(timezone.utc) - timedelta(days=LOOKBACK_DAYS)
seen = load_seen()
findings = {}
for row in fetch_ct(BRAND):
issued = row.get("not_before", "")
try:
issued_dt = datetime.fromisoformat(issued).replace(tzinfo=timezone.utc)
except ValueError:
continue
if issued_dt < cutoff:
continue
for name in row.get("name_value", "").splitlines():
dom = registrable(name)
if dom in OWN_DOMAINS or dom in seen:
continue
s = score(dom)
if s >= 0.75:
findings.setdefault(dom, {"score": s, "names": set(),
"issuer": row.get("issuer_name", "")})
findings[dom]["names"].add(name.lower())
for dom, info in sorted(findings.items(), key=lambda kv: -kv[1]["score"]):
print(info["score"], dom, "| penerbit:", info["issuer"])
for n in sorted(info["names"])[:5]:
print(" ", n)
seen.add(dom)
SEEN_FILE.write_text(json.dumps(sorted(seen), indent=2))
if not findings:
print("Tidak ada domain baru yang mencurigakan.")
if __name__ == "__main__":
main()
Langkah 5: Menjadwalkan dan Mengirim Notifikasi
Jalankan skrip setiap beberapa jam lewat cron. Hindari frekuensi berlebihan agar tidak membebani layanan publik.
# crontab -e (setiap 4 jam)
0 */4 * * * cd /opt/ct-monitor && /opt/ct-monitor/.venv/bin/python ct_monitor.py >> ct.log 2>&1
Untuk notifikasi, ganti bagian print dengan pengiriman ke webhook Slack, Microsoft Teams, atau email tim SOC. Pastikan pesan memuat domain, skor, dan penerbit sertifikat agar analis dapat langsung bertindak.
Dari Temuan ke Tindakan: Alur Triase
Skrip hanyalah pemicu; nilai sebenarnya ada pada proses triase. Untuk setiap domain yang muncul, pertimbangkan langkah berikut secara berurutan:
- Verifikasi kepemilikan. Periksa data registrasi (RDAP/WHOIS), tanggal pembuatan domain, dan apakah domain itu milik mitra resmi. Domain yang baru dibuat beberapa hari lalu dan menyembunyikan identitas pemilik patut dicurigai.
- Periksa konten secara aman. Gunakan lingkungan terisolasi atau layanan pemindai URL; jangan membuka situs mencurigakan dari laptop kerja biasa. Catat tangkapan layar, hash, dan waktu sebagai bukti.
- Periksa infrastruktur. Lihat alamat IP, penyedia hosting, dan domain lain yang berbagi infrastruktur yang sama; sering kali satu aktor membuat puluhan domain serupa.
- Blokir internal. Masukkan domain ke daftar blokir DNS, secure web gateway, dan gerbang email perusahaan.
- Laporkan untuk penurunan. Kirim laporan penyalahgunaan ke registrar dan penyedia hosting. Untuk domain .id, PANDI mengoperasikan IDADX yang mengklaim dapat menonaktifkan domain bermasalah paling lama 24 jam selama domain masih berada di bawah pengelolaan .id. Anda juga dapat melaporkan insiden ke ID-SIRTII/CC atau kanal pelaporan BSSN.
- Peringatkan pengguna. Bila ada indikasi kampanye aktif, sampaikan imbauan kepada pelanggan dan karyawan melalui kanal resmi.
Pengayaan: Menangkap Variasi yang Tidak Mengandung Nama Merek
Penyerang yang canggih tidak selalu memakai nama merek utuh. Beberapa perluasan yang layak dipertimbangkan: memantau juga nama produk, singkatan internal, dan nama eksekutif yang kerap ditiru; membangkitkan variasi otomatis (penghilangan huruf, huruf tertukar, penambahan tanda hubung, TLD berbeda) lalu mengecek keberadaannya di DNS; serta mendeteksi karakter IDN yang tampak serupa (homograf Unicode) lewat konversi punycode. Anda juga dapat memperkaya hasil dengan data pemindaian pasif seperti riwayat DNS untuk melihat kapan domain mulai beresolusi.
Rambu Etika dan Hukum di Indonesia
Teknik ini bersifat pasif: Anda hanya membaca data yang memang dipublikasikan oleh ekosistem sertifikat. Meski demikian, beberapa batasan perlu dijaga:
- Pantau merek dan aset milik organisasi Anda sendiri atau klien yang memberi mandat tertulis. Jangan memakai teknik ini untuk menguntit individu.
- Jangan melakukan pemindaian agresif, uji penetrasi, atau upaya masuk ke situs pihak ketiga yang mencurigakan tanpa izin; hal ini dapat bersinggungan dengan ketentuan akses ilegal dalam UU ITE.
- Bila data hasil investigasi memuat data pribadi (misalnya data pemilik domain atau korban), perlakukan sesuai UU Pelindungan Data Pribadi (UU No. 27 Tahun 2022): kumpulkan seperlunya, simpan aman, dan batasi aksesnya.
- Jaga rantai bukti (tangkapan layar, log, hash, waktu) bila laporan akan dilanjutkan ke penegak hukum atau proses forensik digital.
Menyatukan dengan Program Keamanan yang Lebih Luas
Pemantauan CT paling efektif bila menjadi satu bagian dari program perlindungan merek dan cyber intelligence. Kombinasikan dengan penerapan DMARC, SPF, dan DKIM agar domain asli Anda sulit dipalsukan dalam email; HSTS dan pencatatan CAA pada DNS untuk membatasi CA yang boleh menerbitkan sertifikat bagi domain Anda; serta pelatihan kewaspadaan phishing bagi karyawan dan pelanggan. Monitor CT yang sama juga berguna untuk mendeteksi penerbitan sertifikat tak sah atas domain sah Anda, misalnya akibat subdomain takeover atau CA yang salah menerbitkan. Cukup ubah kata kunci menjadi domain Anda dan bandingkan dengan inventaris sertifikat internal.
Penutup
Pertahanan terhadap phishing sering dibayangkan sebagai urusan filter email dan edukasi pengguna, padahal sebagian sinyal paling dini justru tersedia di luar jaringan Anda, dalam log publik yang bisa dibaca siapa saja. Dengan puluhan baris Python, tim kecil sekalipun dapat membangun radar domain tiruan yang memberi selisih waktu berharga antara pendaftaran domain oleh penyerang dan jatuhnya korban pertama. Mulailah dari satu merek, tuning ambang skor untuk menekan false positive, tetapkan prosedur triase yang jelas, dan hubungkan hasilnya ke jalur takedown seperti IDADX. Siberindo membantu organisasi Indonesia membangun kapabilitas cyber intelligence, pemantauan ancaman, dan respons insiden; hubungi kami bila Anda ingin menyusun program pemantauan merek yang terukur.

