3.3
Pemetaan URL, Berkas JavaScript, dan Endpoint
Repository ini tidak memuat skrip pemetaan URL tersendiri. Semua langkahnya berupa one-liner shell yang dirangkai lewat pipe, dan tiap langkah memakai placeholder yang sama: HOST, URL, dan FILE.txt (README.md:10-151). Arti tiap placeholder dijelaskan di Placeholder dan Konvensi Penulisan One-liner, sedangkan pemakaiannya sebagai daftar target ada di Aset In-scope, Bruteforce, dan Wordlist.
Halaman ini menelusuri tiga artefak: daftar URL, daftar berkas JavaScript, dan daftar endpoint. Satu diagram alur memikul urutan pemanggilan, satu diagram peta memikul cabang sumbernya.
Alur dari URL ke daftar endpoint
Tidak ada satu perintah yang menjalankan seluruh rangkaian. Operator merangkai tiga one-liner terpisah: penyaring aset statis pada keluaran gau (README.md:92-972), Pure Bash Linkfinder yang menulis FILE.txt lalu memanggil linkfinder.py untuk tiap link (README.md:337-3423), dan ekstraksi path absolut dari FILE.js (README.md:99-1044). Diagram berikut menyusun ketiganya menjadi satu urutan.
sequenceDiagram
autonumber
participant OP as Operator
participant GAU as gau
participant RAW as URL mentah
participant EX as egrep -v
participant JSF as FILE.txt
participant LNK as linkfinder.py
participant GRE as grep -oh
participant EP as Daftar endpoint
OP->>GAU: assetfinder --subs-only HOST lalu gau
GAU-->>RAW: URL historis
RAW->>EX: buang css png jpeg jpg svg gif wolf
EX->>JSF: grep .js ke FILE.txt
loop while IFS= read link
JSF->>LNK: linkfinder.py -i link -o cli
LNK->>EP: grep $2 lalu grep -v $3
end
OP->>GRE: cat FILE.js
GRE->>EP: sort -u path absolut
EP-->>OP: daftar endpoint
%% fig: Urutan URL sampai daftar endpoint
%% desc: gau memasok URL, penyaring aset statis menyisakan berkas JS, lalu linkfinder.py dan grep -oh mengubah isi berkas JS menjadi daftar endpoint.Keluaran akhirnya satu daftar path. Pada jalur linkfinder.py, grep $2 dan grep -v $3 menyaring hasil per pemanggilan sebelum sort -n dan uniq (README.md:337-3423). Pada jalur grep -oh, penyaringnya hanya sort -u (README.md:99-1044).
Peta jalur pengumpulan
Enam sumber masuk dari sisi kiri, lalu bertemu di dua muara: daftar URL turunan dan daftar endpoint. Warna menandai perannya, bukan urutan eksekusi: biru untuk artefak yang disimpan, hijau untuk hasil akhir, ungu untuk data turunan, kuning untuk titik yang perlu kehati-hatian, merah untuk data yang hilang.
graph LR
H["HOST"] --> GAU["gau HOST"]
H --> WBU["waybackurls HOST"]
H --> OTX["otxapi url_list"]
H --> GETJS["getJS"]
H --> SM["HOST/sitemap.xml"]
H --> SW["HOST/v2/swagger.json"]
GAU --> RAW["URL mentah"]
WBU --> RAW
OTX --> OUT["OUT.txt"]
RAW --> EXCL["egrep -v aset statis"]
EXCL --> CURL["curl -s per URL"]
CURL --> VARS["grep -Eo var lalu =xss"]
CURL --> JSL["grep .js ke FILE.txt"]
JSL --> LOOP["while IFS= read link"]
LOOP --> LNK["linkfinder.py -i link -o cli"]
LNK --> PICK["grep $2 lalu grep -v $3"]
PICK --> EP["Daftar endpoint"]
FILEJS["FILE.js"] --> PAT["grep -oh path absolut"]
PAT --> EP
SW --> JQ["jq .paths keys"]
JQ --> EP
SM --> XM["xmllint --format lalu grep loc"]
XM --> URLOUT["Daftar URL sitemap"]
GETJS --> HX["httpx --match-regex"]
PAT -.-> MISS["path non-alfanumerik terlewat"]
style RAW fill:#336791,color:#fff
style OUT fill:#336791,color:#fff
style URLOUT fill:#336791,color:#fff
style FILEJS fill:#336791,color:#fff
style EP fill:#2d7d46,color:#fff
style JSL fill:#2d7d46,color:#fff
style VARS fill:#8b5cf6,color:#fff
style PAT fill:#8b5cf6,color:#fff
style LNK fill:#8b5cf6,color:#fff
style PICK fill:#8b5cf6,color:#fff
style JQ fill:#8b5cf6,color:#fff
style XM fill:#8b5cf6,color:#fff
style HX fill:#8b5cf6,color:#fff
style EXCL fill:#f59e0b,color:#000
style SW fill:#f59e0b,color:#000
style MISS fill:#dc2626,color:#fff
%% fig: Peta jalur pengumpulan URL dan endpoint
%% desc: Enam sumber bercabang ke penyaring aset statis, linkfinder.py, jq pada swagger, dan xmllint pada sitemap, lalu bertemu di daftar endpoint.Tabel berikut memuat perintah inti tiap jalur beserta keluarannya.
| Jalur | Perintah inti | Keluaran | Rujukan |
|---|---|---|---|
| Arsip URL | assetfinder --subs-only HOST lalu gau | URL historis ke stdout | README.md:92-972 |
| Penyaring aset statis | egrep -v '(.css|.png|.jpeg|.jpg|.svg|.gif|.wolf)' | URL non-aset, termasuk .js | README.md:92-972 |
| Berkas JS per host | getJS lalu httpx --match-regex | URL yang memuat listener message | README.md:545 |
| Daftar berkas JS | curl -s $1, grep -Eo URL, grep ".js" > FILE.txt | FILE.txt berisi URL .js | README.md:337-3423 |
| Isi JS ke endpoint | python linkfinder.py -i "$link" -o cli, grep $2, grep -v $3 | endpoint per link | README.md:337-3423 |
| Isi JS ke path | grep -oh path, sed, sort -u | path absolut unik | README.md:99-1044 |
| sitemap | xmllint --format -, grep -e 'loc', sed -r 's|</?loc>||g' | URL dari sitemap | README.md:330-3356 |
| swagger | jq '.paths | keys[]' | daftar path API | README.md:344-3497 |
| OTX | gron, egrep -wi 'url', awk '{print $2}', sort -u, tee -a OUT.txt | OUT.txt berisi URL | README.md:256-2618 |
Sumber URL dari arsip dan OTX
waybackurls HOST dan gau HOST sama-sama mencetak URL ke stdout tanpa flag tambahan, sehingga keluarannya bisa langsung masuk egrep, grep, atau gf. Di repository ini waybackurls HOST menjadi tahap pertama one-liner XSS (README.md:489); lanjutannya dibahas di XSS dan Local File Inclusion. gau HOST dipakai untuk menyusun wordlist parameter dan path (README.md:24910), yang dibahas di Aset In-scope, Bruteforce, dan Wordlist.
gau juga membaca daftar host dari stdin. One-liner Find JavaScript Files memakai assetfinder --subs-only HOST | gau, sehingga enumerasi subdomain langsung menjadi masukan URL (README.md:92-972). Enumerasi subdomain itu sendiri dibahas di Enumerasi Subdomain dan Deteksi Takeover.
Sumber ketiga adalah url_list AlienVault OTX per subdomain. Loop for sub in $(cat HOSTS.txt) memanggil otxapi/indicator/hostname/url_list/$sub?limit=100&page=1, memecah JSON dengan gron, mengambil medan url lewat egrep -wi 'url' dan awk '{print $2}', membersihkan kutip dengan sed 's/"//g', lalu menulis hasil unik ke OUT.txt (README.md:256-2618).
Menyaring URL menjadi berkas JavaScript
Filter pertama pada Find JavaScript Files adalah egrep -v '(.css|.png|.jpeg|.jpg|.svg|.gif|.wolf)'. Ekstensi .js tidak ada di daftar itu, jadi URL berkas JavaScript tetap lolos (README.md:92-972). Setelah disaring, tiap URL diambil dengan curl -s $url dan isinya digrep var [a-zA-Zo-9_]+; hasilnya nama variabel, bukan endpoint. Kelas karakter itu ditulis a-zA-Zo-9_, sehingga huruf o ikut cocok dan digit 0 tidak (README.md:92-972). Nama variabel lalu ditempeli =xss dan dicetak bersama URL-nya sebagai kandidat parameter.
Jalur kedua memakai getJS. cat HOSTS.txt | getJS | httpx --match-regex "addEventListener\((?:'|\")message(?:'|\")" mengumpulkan URL berkas JS per host, lalu httpx hanya meloloskan yang isinya memuat listener message (README.md:545).
Jalur ketiga adalah Pure Bash Linkfinder. Isi $1 diambil dengan curl -s, URL di dalamnya digrep dengan (http|https)://[a-zA-Z0-9./?=_-]*, diurutkan, lalu grep ".js" > FILE.txt. Hasilnya dibaca baris per baris dan tiap link diserahkan ke python linkfinder.py -i "$link" -o cli (README.md:337-3423).
⚠️ Pada
grep ".js"titik diperlakukan sebagai wildcard, bukan literal. String yang memuat urutanjsdi tengah kata juga ikut lolos keFILE.txt.
⚠️ Baris terakhir one-liner itu adalah
rm -rf FILE.txt. Daftar berkas JS yang baru dikumpulkan terhapus sebelum operator sempat memeriksanya; salin dulu bila daftarnya masih dibutuhkan (README.md:337-3423).
Ekstraksi endpoint dari isi JavaScript
One-liner cat FILE.js | grep -oh "\"\/[a-zA-Z0-9_/?=&]*\"" | sed -e 's/^"//' -e 's/"$//' | sort -u bekerja pada satu berkas JS yang sudah ada di disk (README.md:99-1044). grep -oh menyisakan potongan yang diapit kutip ganda dan diawali /, dua sed membuang kutip pembuka dan penutup, lalu sort -u men-dedupe hasilnya.
⚠️ Kelas karakter
[a-zA-Z0-9_/?=&]tidak memuat-,.,%,:, dan#. Endpoint dengan segmen bertanda hubung atau berparameter terenkode tidak tertangkap, demikian pula path relatif yang tidak diawali/(README.md:99-1044).
sitemap.xml dan swagger.json
Dua berkas spesifikasi memberi peta endpoint tanpa perlu menebak. Yang pertama, sitemap: curl -s http://HOST/sitemap.xml | xmllint --format - | grep -e 'loc' | sed -r 's|</?loc>||g'. xmllint merapikan XML ke satu elemen per baris, grep -e 'loc' mengambil baris lokasi, dan sed membuang tag pembuka maupun penutupnya (README.md:330-3356).
⚠️ Skema
http://dan lokasi/sitemap.xmlditulis tetap, sehingga target yang hanya melayani HTTPS atau memakaisitemap_index.xmlperlu perintah yang disunting lebih dulu.
Yang kedua, deskripsi API: curl -s https://HOST/v2/swagger.json | jq '.paths | keys[]' mencetak setiap key pada objek .paths sebagai satu path (README.md:344-3497).
⚠️ Path
/v2/swagger.jsonjuga ditulis tetap. Spesifikasi di/openapi.json,/api-docs, atau berkas ber-versiv3tidak tercakup oleh one-liner ini (README.md:344-3497).
Hasil kedua jalur itu berupa daftar path, bukan URL lengkap. Penggabungan dengan daftar host dan pemeriksaan status responsnya dibahas di IP, ASN, dan Pemindaian Port.