mekvle·extract-domains
Supply-Chain Reconnaissance Framework

It maps a web application's entire supply chain — and shows where every link, domain and IP came from.ვებ-აპლიკაციის მთელ მიწოდების ჯაჭვს რუკავს — და აჩვენებს თითოეული ლინკი, დომენი თუ IP საიდან მოვიდა.

Two components — mekvle (a recursive orchestrator) and extract-domains (a static extraction engine) — as one framework. The result is an evidence-backed provenance graph: not just a list of discovered assets, but where and how each one was reached. ორი კომპონენტი — mekvle (რეკურსიული ორკესტრატორი) და extract-domains (სტატიკური ამომღები ძრავა) — ერთ ფრეიმვორქად. შედეგი არის მტკიცებულებებით გამყარებული provenance-გრაფი: არა უბრალოდ აღმოჩენილი აქტივების სია, არამედ საიდან და როგორ მივადექით თითოეულ მათგანს.

live output · report_graph.html — depth 0 → 5
in-scope + subdomainsscope + სუბდომენები domain ip js api package sourcemap takeover / dep-confusion candidatetakeover / dep-confusion კანდიდატი
Left → right is discovery depth 0 → 5. The red ring marks a claimable node: re-registering cdn.polyfill-mirror.io runs attacker code back along the highlighted chain into shop.acme.com. @acme/ui is flagged for dependency confusion.მარცხნიდან მარჯვნივ — აღმოჩენის სიღრმე 0 → 5. წითელი რგოლი ნიშნავს ხელახლა რეგისტრირებად კვანძს: cdn.polyfill-mirror.io-ის ხელახალი რეგისტრაცია გამოკვეთილი ჯაჭვით ასრულებს თავდამსხმელის კოდს shop.acme.com-ში. @acme/ui მონიშნულია dependency confusion-ისთვის.
571
Python modulesPython მოდული
~96K
lines of codeხაზი კოდი
4,000+
automated testsავტომატური ტესტი
40+
extraction stagesამოღების სტადია

01

What it is and whyრა არის და რა მიზანი აქვს

A modern web app pulls most of its code and data from other parties: CDNs, npm/PyPI packages, analytics, SDKs, webhooks. The real attack surface is no longer one site — it is that dependency chain. The framework's goal is to map that chain to the end: find as many related domains, subdomains, links, IPs and packages as possible — and attach a provenance to each one. თანამედროვე ვებ-აპლიკაცია თავისი კოდის და მონაცემების დიდ ნაწილს სხვა მხარეებისგან იღებს: CDN-ები, npm/PyPI პაკეტები, ანალიტიკა, SDK-ები, webhook-ები. რეალური თავდასხმის ზედაპირი აღარ არის ერთი საიტი — ის არის ამ დამოკიდებულებების ჯაჭვი. ფრეიმვორქის მიზანია ეს ჯაჭვი ბოლომდე ამოხაზოს: იპოვოს რაც შეიძლება მეტი დაკავშირებული დომენი, სუბდომენი, ლინკი, IP და პაკეტი — და თითოეულს მიაწეროს წარმომავლობა (provenance).

orchestrator mekvle

A recursive recon engine that builds scope itself from the seeds' registrable domains and expands discovery level by level (level_0 → level_1 → …).რეკურსიული recon-ძრავა, რომელიც scope-ს თავად აგებს seed-ების registrable-დომენებიდან და დონე-დონე (level_0 → level_1 → …) აფართოებს აღმოჩენას.

  • crawl: Katana (JS-aware) + runtime captureKatana (JS-aware) + runtime capture
  • passive: gau — only on in-scope hostsgau — მხოლოდ scope-ში მყოფ ჰოსტებზე
  • validate: Jaeles / Nuclei validationJaeles / Nuclei ვალიდაცია
  • merge + dedup: unify results across every levelყველა დონის შედეგის გაერთიანება

extraction engine extract-domains

A static extractor that mines URLs, hosts, IPs and packages from a file's bytes — with a thick deobfuscation layer so hidden references surface too.სტატიკური ამომღები, რომელიც ფაილის ბაიტებიდან იღებს URL-ებს, ჰოსტებს, IP-ებს და პაკეტებს — deobfuscation-ის სქელი ფენით, რომ დამალული რეფერენსებიც ამოვიდეს.

  • 40+ stages:სტადია: from regex to WASM and source mapsregex-დან WASM-მდე და source map-ებამდე
  • deobfuscation: base64/base64url, exotic IP, concatbase64/base64url, exotic IP, concat
  • SPA-aware: JSON hydration, importmap, data: URIJSON hydration, importmap, data: URI
  • provenance: every hit carries a tag + its sourceყოველ ნაპოვანს აქვს tag + წყარო

One framework: mekvle answers "where to look next", extract-domains answers "what's inside this file". They feed each other recursively until no new assets appear.ერთი ფრეიმვორქი: mekvle პასუხს აგებს „სად ვეძებოთ შემდეგ", extract-domains — „ამ ფაილში რა დევს". ერთმანეთს კვებავენ რეკურსიულად, სანამ ახალი აქტივები აღარ გამოჩნდება.


02

How it works — the pipelineროგორ მუშაობს — პაიპლაინი

Each seed runs through the stages below. Newly discovered hosts become the seeds for the next level — that is how the graph grows to a controlled depth. თითოეული seed გადის ქვემოთ მოცემულ ეტაპებს. ახალი აღმოჩენილი ჰოსტები ხდება მომდევნო დონის seed-ები — ასე იზრდება გრაფი კონტროლირებად სიღრმემდე.

→ 01

Scope

auto-build registrable domains (eTLD+1) from seeds.seed-ებიდან registrable-დომენების (eTLD+1) ავტომატური აგება.

auto_scope
→ 02

Crawl

JS-aware crawling — known-files, forms, JS snippets.JS-aware ქროულინგი — known-files, ფორმები, JS-ჩანართები.

katana
→ 03

Runtime capture

real fetch/XHR requests from the browser.რეალური fetch/XHR მოთხოვნები ბრაუზერიდან.

playwright · mitm
→ 04

Extract

extract-domains' 40+ stages on every file.extract-domains-ის 40+ სტადია ყველა ფაილზე.

extract-domains
→ 05

Passive

wayback/commoncrawl/otx/urlscan — scope-only.wayback/commoncrawl/otx/urlscan — scope-only.

gau
→ 06

Validate

check signals on the discovered surface.აღმოჩენილი ზედაპირის სიგნალების შემოწმება.

jaeles · nuclei
→ 07

Graph + score

build the provenance DAG and score risk.provenance-DAG-ის აგება და რისკის დათვლა.

supply_chain_graph
→ 08

Report

interactive graph + SARIF/TSV/JSON.ინტერაქტიული გრაფი + SARIF/TSV/JSON.

report bundle

Recursion: new in-scope hosts found in 04 become seeds for 01 at the next level (level_0 → level_N).რეკურსია: 04-ში ნაპოვანი ახალი in-scope ჰოსტები → 01-ის seed-ებად მომდევნო დონეზე (level_0 → level_N).


03

What it usesრას იყენებს

The framework is built on Python and wires proven recon tools into one orchestrated flow.ფრეიმვორქი დგას Python-ზე და აკავშირებს დადასტურებულ recon-ინსტრუმენტებს ერთ ორკესტრირებულ ნაკადში.

crawl: katana passive: gau runtime: playwright · chromium proxy: mitmproxy validate: jaeles · nuclei core: python 3.12+ report viz: cytoscape.js 3.30 exports: SARIF 2.1 · TSV · JSON tests: pytest · 4,000+

04

Extraction depth — extract-domainsამოღების სიღრმე — extract-domains

Where ordinary recon runs a single regex, here 40+ specialized stages work — each covering a different way hosts get hidden. სადაც ჩვეულებრივი recon ერთ regex-ს უშვებს, აქ 40-ზე მეტი სპეციალიზებული სტადია მუშაობს — თითოეული ჰოსტების დამალვის სხვა გზას ფარავს.

url_regex + idn
schemed URLs, IDN→ASCII normalizationსქემიანი URL-ები, IDN→ASCII ნორმალიზაცია
bare_host
schemeless hosts with path/queryსქემის გარეშე ჰოსტები path/query-ით
exotic_ips
decimal / octal / hex IP literalsdecimal / octal / hex IP ლიტერალები
deobfuscation
base64 · base64url · concat · templatebase64 · base64url · concat · template
json_hydration
SPA state — __NEXT_DATA__ and similarSPA state — __NEXT_DATA__ და მსგავსი
data_uri
base64/percent-encoded data: blobsbase64/percent-encoded data: ბლობები
import_map
importmap imports/scopes · modulepreloadimportmap imports/scopes · modulepreload
sourcemap
//# sourceMappingURL + sources[]//# sourceMappingURL + sources[]
wasm_scan
URLs embedded in WebAssembly binariesWebAssembly ბინარში ჩაშენებული URL
webpack_stats
publicPath + asset reconstructionpublicPath + asset რეკონსტრუქცია
lockfiles · npmrc
package registries from config filesპაკეტ-რეესტრები კონფიგებიდან
package scanners
npm · PyPI · go · maven · cargo · nugetnpm · PyPI · go · maven · cargo · nuget

05

Provenance graph & risk modelProvenance-გრაფი და რისკის მოდელი

Every asset becomes a typed node, every discovery a directed edge from its source. So you see not only "what we found", but "from which file, through which link". ყოველი აქტივი ხდება ტიპიზებული კვანძი, ყოველი აღმოჩენა — მიმართული წიბო წყაროდან. ასე ჩანს არა მხოლოდ „რა ვიპოვეთ", არამედ „რომელი ფაილიდან, რომელი ლინკის გავლით".

Node typesკვანძის ტიპები

domain ip js_asset api_endpoint package sourcemap source_file runtime_request

Edges store edge_type (parent_of, discovered_in, fetches, redirects_to, sourcemap_of…), the source file and crawl depth.წიბოები ინახავს edge_type-ს (parent_of, discovered_in, fetches, redirects_to, sourcemap_of…), წყარო-ფაილს და crawl-სიღრმეს.

Risk propagationრისკის პროპაგაცია

Risk is not scored in isolation — it propagates along the chain, so multi-hop supply vectors surface.რისკი არ ითვლება იზოლირებულად — ის ვრცელდება ჯაჭვის გასწვრივ, ასე ზედაპირზე ამოდის მრავალ-hop-იანი მიწოდების ვექტორები.

risk = asset_impact × exploitability
     × takeover_likelihood
     × confidence × path_importance

06

Takeover & dependency confusionTakeover და dependency confusion

A core goal: find a domain or package in the chain that is expired, dangling or unclaimed — one whose re-registration lets an attacker break the chain's trust. Because every reference is captured with its provenance, the graph shows not just the weak node but its exact blast radius. ერთ-ერთი მთავარი მიზანი: ჯაჭვში იპოვოს დომენი ან პაკეტი, რომელიც ვადაგასულია, dangling-ია ან დაურეგისტრირებელია — ისეთი, რომლის ხელახალი რეგისტრაციაც თავდამსხმელს ჯაჭვის ნდობის დარღვევის საშუალებას აძლევს. რადგან ყოველი რეფერენსი წარმომავლობით ფიქსირდება, გრაფი აჩვენებს არა მხოლოდ სუსტ კვანძს, არამედ მის ზუსტ blast radius-ს.

re-register → RCE Dangling / expired domainDangling / ვადაგასული დომენი

A script, CDN or API host is still referenced in the code, but its domain has expired or no longer resolves. Whoever re-registers it serves arbitrary JavaScript that runs in the victim's origin — remote code execution across every site still loading it (the polyfill.io pattern). In the diagram, cdn.polyfill-mirror.io is flagged: re-registering that one depth-4 domain runs attacker code back along the highlighted chain into shop.acme.com.სკრიპტი, CDN ან API-ჰოსტი ისევ რეფერენსირებულია კოდში, მაგრამ მისი დომენი ვადაგასულია ან აღარ resolve-დება. ვინც მას ხელახლა დაარეგისტრირებს, მიწოდებს ნებისმიერ JavaScript-ს, რომელიც მსხვერპლის origin-ში სრულდება — remote code execution ყველა საიტზე, რომელიც მას ისევ იტვირთავს (polyfill.io-ს შემთხვევა). დიაგრამაზე cdn.polyfill-mirror.io მონიშნულია: ამ ერთი depth-4 დომენის ხელახალი რეგისტრაცია გამოკვეთილი ჯაჭვით ასრულებს თავდამსხმელის კოდს shop.acme.com-ში.

publish → build RCE Dependency confusionDependency confusion

An internal or private package name (an npm scope, a PyPI name) appears in lockfiles, .npmrc or import maps, but was never claimed on the public registry. Publishing a malicious public package under that exact name gets it pulled into the build — code execution in CI and on developer machines. In the diagram, the internal scope @acme/ui is flagged as unclaimed.შიდა ან პრივატული პაკეტის სახელი (npm scope, PyPI name) ჩანს lockfile-ებში, .npmrc-ში ან import map-ებში, მაგრამ არასდროს ყოფილა დარეგისტრირებული public რეესტრში. იმავე სახელით მავნე public პაკეტის გამოქვეყნება მას build-ში შეიყვანს — code execution CI-სა და დეველოპერის მანქანაზე. დიაგრამაზე შიდა scope @acme/ui მონიშნულია დაურეგისტრირებლად.

How it finds them: every referenced domain, host and package is already extracted with full provenance. Cross-checking each against DNS resolvability and public-registry presence surfaces the claimable ones — and the provenance graph shows exactly what each one would compromise, and through which chain.როგორ პოულობს: ყოველი რეფერენსირებული დომენი, ჰოსტი და პაკეტი უკვე ამოღებულია სრული provenance-ით. თითოეულის DNS-resolvability-სა და public-რეესტრში არსებობაზე გადამოწმება ზედაპირზე ამოიტანს ხელახლა რეგისტრირებადებს — და provenance-გრაფი ზუსტად აჩვენებს, რას დააზიანებდა თითოეული და რომელი ჯაჭვით.


07

What it producesშედეგს როგორ იძლევა

At the end of a run it writes an analyst-facing bundle — from one interactive graph to machine formats.რანის ბოლოს იწერება ანალიტიკოსისთვის განკუთვნილი პაკეტი — ერთი ინტერაქტიული გრაფიდან მანქანურ ფორმატებამდე.

report_graph.html
interactive provenance graph — offline, filters, vectorsინტერაქტიული provenance-გრაფი — offline, ფილტრებით, ვექტორებით
flagship
graph.json
full DAG — nodes + edges, machine-readableსრული DAG — nodes + edges, მანქანურად წასაკითხი
findings.sarif
SARIF 2.1 — for CI/CD and IDE integrationSARIF 2.1 — CI/CD და IDE ინტეგრაციისთვის
multi_hop_paths.tsv
multi-hop risk vectors, rankedმრავალ-hop რისკ-ვექტორები, დარანჟირებული
all_discovered_links.txt
every discovered link — raw feedყველა აღმოჩენილი ლინკი — ნედლი feed
report.html + summary.md
human-readable findings reportადამიანისთვის წასაკითხი findings-ანგარიში

08

Where the result is usedრაში გამოიყენება შედეგი

Bug bounty / pentestBug bounty / pentest

Broad, graph-based attack-surface mapping — on authorized engagements.ფართო, გრაფზე-დაფუძნებული attack-surface mapping — ავტორიზებულ engagement-ებზე.

Supply-chain monitoringSupply-chain მონიტორინგი

Track third-party dependencies and their provenance over time.მესამე-მხარის დამოკიდებულებების და მათი წარმომავლობის თვალყურის დევნება დროში.

Asset inventoryAsset inventory

Inventory an organization's real external surface — domains, IPs, packages.ორგანიზაციის რეალური გარე ზედაპირის — დომენები, IP, პაკეტები — ინვენტარიზაცია.

Subdomain-takeover triageSubdomain-takeover triage

Spot dangling references along the provenance chain.dangling რეფერენსების გამოვლენა provenance-ჯაჭვის მიხედვით.

The framework is discovery-first: it maps and confirms surface — it performs no destructive or weaponized actions. Use only on authorized targets.ფრეიმვორქი არის discovery-first: ის რუკავს და ადასტურებს ზედაპირს — არ აწარმოებს დესტრუქციულ ან weaponized მოქმედებებს. გამოიყენეთ მხოლოდ ავტორიზებულ სამიზნეებზე.