Lompat ke konten
dokumentasi.id
Commit 89c41b0
v1
Star3,2 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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-15). 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-97), Pure Bash Linkfinder yang menulis FILE.txt lalu memanggil linkfinder.py untuk tiap link (README.md:337-342), dan ekstraksi path absolut dari FILE.js (README.md:99-104). 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.
Fig. 1: Urutan URL sampai daftar endpointgau 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-342). Pada jalur grep -oh, penyaringnya hanya sort -u (README.md:99-104).

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.
Fig. 2: Peta jalur pengumpulan URL dan endpointEnam 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.

JalurPerintah intiKeluaranRujukan
Arsip URLassetfinder --subs-only HOST lalu gauURL historis ke stdoutREADME.md:92-97
Penyaring aset statisegrep -v '(.css|.png|.jpeg|.jpg|.svg|.gif|.wolf)'URL non-aset, termasuk .jsREADME.md:92-97
Berkas JS per hostgetJS lalu httpx --match-regexURL yang memuat listener messageREADME.md:54
Daftar berkas JScurl -s $1, grep -Eo URL, grep ".js" > FILE.txtFILE.txt berisi URL .jsREADME.md:337-342
Isi JS ke endpointpython linkfinder.py -i "$link" -o cli, grep $2, grep -v $3endpoint per linkREADME.md:337-342
Isi JS ke pathgrep -oh path, sed, sort -upath absolut unikREADME.md:99-104
sitemapxmllint --format -, grep -e 'loc', sed -r 's|</?loc>||g'URL dari sitemapREADME.md:330-335
swaggerjq '.paths | keys[]'daftar path APIREADME.md:344-349
OTXgron, egrep -wi 'url', awk '{print $2}', sort -u, tee -a OUT.txtOUT.txt berisi URLREADME.md:256-261

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:48); lanjutannya dibahas di XSS dan Local File Inclusion. gau HOST dipakai untuk menyusun wordlist parameter dan path (README.md:249), 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-97). 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-261).

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-97). 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-97). 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:54).

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-342).

⚠️ Pada grep ".js" titik diperlakukan sebagai wildcard, bukan literal. String yang memuat urutan js di tengah kata juga ikut lolos ke FILE.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-342).

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-104). 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-104).

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-335).

⚠️ Skema http:// dan lokasi /sitemap.xml ditulis tetap, sehingga target yang hanya melayani HTTPS atau memakai sitemap_index.xml perlu 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-349).

⚠️ Path /v2/swagger.json juga ditulis tetap. Spesifikasi di /openapi.json, /api-docs, atau berkas ber-versi v3 tidak tercakup oleh one-liner ini (README.md:344-349).

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.