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-გრაფი: არა უბრალოდ აღმოჩენილი აქტივების სია, არამედ საიდან და როგორ მივადექით თითოეულ მათგანს.
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 — „ამ ფაილში რა დევს". ერთმანეთს კვებავენ რეკურსიულად, სანამ ახალი აქტივები აღარ გამოჩნდება.
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-ები — ასე იზრდება გრაფი კონტროლირებად სიღრმემდე.
Scope
auto-build registrable domains (eTLD+1) from seeds.seed-ებიდან registrable-დომენების (eTLD+1) ავტომატური აგება.
auto_scopeCrawl
JS-aware crawling — known-files, forms, JS snippets.JS-aware ქროულინგი — known-files, ფორმები, JS-ჩანართები.
katanaRuntime capture
real fetch/XHR requests from the browser.რეალური fetch/XHR მოთხოვნები ბრაუზერიდან.
playwright · mitmExtract
extract-domains' 40+ stages on every file.extract-domains-ის 40+ სტადია ყველა ფაილზე.
extract-domainsPassive
wayback/commoncrawl/otx/urlscan — scope-only.wayback/commoncrawl/otx/urlscan — scope-only.
gauValidate
check signals on the discovered surface.აღმოჩენილი ზედაპირის სიგნალების შემოწმება.
jaeles · nucleiGraph + score
build the provenance DAG and score risk.provenance-DAG-ის აგება და რისკის დათვლა.
supply_chain_graphReport
interactive graph + SARIF/TSV/JSON.ინტერაქტიული გრაფი + SARIF/TSV/JSON.
report bundleRecursion: 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).
What it usesრას იყენებს
The framework is built on Python and wires proven recon tools into one orchestrated flow.ფრეიმვორქი დგას Python-ზე და აკავშირებს დადასტურებულ recon-ინსტრუმენტებს ერთ ორკესტრირებულ ნაკადში.
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-ზე მეტი სპეციალიზებული სტადია მუშაობს — თითოეული ჰოსტების დამალვის სხვა გზას ფარავს.
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კვანძის ტიპები
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-იანი მიწოდების ვექტორები.
× takeover_likelihood
× confidence × path_importance
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-გრაფი ზუსტად აჩვენებს, რას დააზიანებდა თითოეული და რომელი ჯაჭვით.
What it producesშედეგს როგორ იძლევა
At the end of a run it writes an analyst-facing bundle — from one interactive graph to machine formats.რანის ბოლოს იწერება ანალიტიკოსისთვის განკუთვნილი პაკეტი — ერთი ინტერაქტიული გრაფიდან მანქანურ ფორმატებამდე.
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 მოქმედებებს. გამოიყენეთ მხოლოდ ავტორიზებულ სამიზნეებზე.