
Ein leistungsfähiges Zielaufklärungs-Framework, das auf Graphentheorie basiert.
Das Projekt wurde in ein Monorepo umgezogen. Weitere Informationen finden Sie unter https://github.com/pownjs/pown.
Recon ist ein Aufklärungs-Framework für Zielobjekte, das auf Wissensgraphen basiert. Die Verwendung von Wissensgraphen anstelle von flachen Tabellendarstellungen erleichtert das Auffinden von Beziehungen zwischen verschiedenen Informationstypen, was in vielen Situationen sehr nützlich ist. Algorithmen für Wissensgraphen helfen auch beim Diffing, bei der Suche, beim Finden des kürzesten Pfades und bei vielen anderen hilfreichen Aufgaben zur Informationsermittlung und Nachrichtenbeschaffung.
Dieses Tool ist Teil der Open-Source-Initiative von secapps.com.```
/ | / | /_\ | _ \ _ / |
_ \ | ( / _ | / /_
|/__// __| || |___/
https://secapps.com
> **Hinweis**: Recon ist das Ergebnis einer nahezu direkten Kopie von SecApps' hervorragendem [Recon](https://recon.secapps.com)-Tool.
## Schnellstart
Dieses Tool ist dafür gedacht, als Teil von [Pown.js](https://github.com/pownjs/pown) verwendet zu werden, kann aber auch separat als eigenständiges Werkzeug aufgerufen werden.
Installieren Sie Pown zuerst wie üblich:```sh
$ npm install -g pown@latest
Installiere recon:```sh $ pown modules install @pown/recon
Direkt von Pown aus aufrufen:```sh
$ pown recon
Installieren Sie dieses Modul lokal im Stammverzeichnis Ihres Projekts:```sh $ npm install @pown/recon --save
Sobald fertig, rufe pown cli auf:```sh
$ POWN_ROOT=. ./node_modules/.bin/pown-cli recon
Sie können auch das globale pown verwenden, um das Tool lokal aufzurufen:```sh $ POWN_ROOT=. pown recon
## Bibliotheksnutzung
Das Modul ist auch eine Bibliothek. Schauen Sie sich den Code und die Beispiele an, um Ideen zur Nutzung zu erhalten. Die Dokumentation folgt in Kürze.
## Verwendung
> **WARNUNG**: Dieses Pown-Kommando befindet sich derzeit in der Entwicklung und unterliegt daher unvorhersehbaren Änderungen.```
pown-cli recon <command>
Target recon
Commands:
pown-cli recon transform <transform> Perform inline transformation [aliases: t]
pown-cli recon template <command> Recon template commands [aliases: p, templates]
pown-cli recon select <expressions...> Select nodes [aliases: s]
pown-cli recon traverse <expressions...> Traverse nodes [aliases: v]
pown-cli recon options <command> Manage options [aliases: option]
pown-cli recon cache <command> Manage cache
pown-cli recon add <nodes...> Add nodes [aliases: a]
pown-cli recon remove <expressions...> Remove nodes [aliases: r]
pown-cli recon edit <expressions...> Edit nodes [aliases: e]
pown-cli recon merge <files...> Perform a merge between at least two recon files [aliases: m]
pown-cli recon diff <fileA> <fileB> Perform a diff between two recon files [aliases: d]
pown-cli recon group <name> <expressions...> Group nodes [aliases: g]
pown-cli recon ungroup <expressions...> Ungroup nodes [aliases: u]
pown-cli recon load <file> Load a file [aliases: l]
pown-cli recon save <file> Save to file [aliases: o]
pown-cli recon import <file> Import file [aliases: i]
pown-cli recon export <file> Export to file [aliases: x]
pown-cli recon remote <command> Remote managment [aliases: remotes, f]
pown-cli recon layout <name> Layout the graph [aliases: k]
pown-cli recon summary [options] Create a summary [aliases: y]
pown-cli recon exec <files...> Execute js file [aliases: c]
Options:
--version Show version number [boolean]
--help Show help [boolean]
pown-cli recon transform <transform>
Perform inline transformation
Commands:
pown-cli recon transform bitbucketlistrepos [options] <nodes...> List Bitbucket repositories [aliases: bitbucket_list_repos, bblr]
pown-cli recon transform bitbucketlistsnippets [options] <nodes...> List Bitbucket snippets [aliases: bitbucket_list_snippets, bbls]
pown-cli recon transform bitbucketlistteamrepos [options] <nodes...> List Bitbucket team repos [aliases: bitbucket_list_team_repos, bbltr]
pown-cli recon transform bitbucketlistteammembers [options] <nodes...> List Bitbucket team members [aliases: bitbucket_list_team_members, bbltm]
pown-cli recon transform bufferoverrunsubdomainsearch [options] <nodes...> Obtain a list of subdomains using bufferover.run DNS service [aliases: bufferoverrun_subdomain_search, brss]
pown-cli recon transform certspotterissuances [options] <nodes...> Obtain issuances from Certspotter [aliases: certspotter_issuances, csi]
pown-cli recon transform cloudflarednsquery [options] <nodes...> Query CloudFlare DNS API [aliases: cloudflare_dns_query, cfdq]
pown-cli recon transform crtshcndomainreport [options] <nodes...> Obtain crt.sh domain report which helps enumerating potential target subdomains [aliases: crtsh_cn_domain_report, crtshcdr]
pown-cli recon transform crtshsandomainreport [options] <nodes...> Obtain crt.sh domain report which helps enumerating potential target subdomains [aliases: crtsh_san_domain_report, crtshsdr]
pown-cli recon transform dnsresolve [options] <nodes...> Performs DNS resolution [aliases: dns_resolve, dr, dns]
pown-cli recon transform dockerhublistrepos [options] <nodes...> List DockerHub repositories for a given member or org [aliases: dockerhub_list_repos, dhlr]
pown-cli recon transform gravatar [options] <nodes...> Get gravatar
pown-cli recon transform hackertargetreverseiplookup [options] <nodes...> Obtain reverse IP information from hackertarget.com [aliases: hackertarget_reverse_ip_lookup, htril]
pown-cli recon transform hackertargetonlineportscan [options] <nodes...> Obtain port information from hackertarget.com [aliases: hackertarget_online_port_scan, htps]
pown-cli recon transform httpfingerprint [options] <nodes...> Performs a fingerprint on the HTTP server and application [aliases: http_fingerprint, hf]
pown-cli recon transform ipinfoiowidgetsearch [options] <nodes...> Obtain ipinfo.io whois report via the web widget [aliases: ipinfoio_widget_search, iiiows]
pown-cli recon transform omnisintsubdomainreport [options] <nodes...> Obtain omnisint domain report which helps enumerating target subdomains [aliases: omnisint_subdomain_report]
pown-cli recon transform pkslookupkeys [options] <nodes...> Look the the PKS database at pool.sks-keyservers.net which pgp.mit.edu is part of [aliases: pks_lookup_keys, pkslk]
pown-cli recon transform pwndbsearch [options] <nodes...> Searching the PwnDB database [aliases: pwndb_search, pds]
pown-cli recon transform riddleripsearch [options] <nodes...> Searches for IP references using F-Secure riddler.io [aliases: riddler_ip_search, rdis]
pown-cli recon transform riddlerdomainsearch [options] <nodes...> Searches for Domain references using F-Secure riddler.io [aliases: riddler_domain_search, rdds]
pown-cli recon transform script [options] <nodes...> Perform transformation with external script [aliases: script]
pown-cli recon transform scyllasearch [options] <nodes...> Searching the Scylla database [aliases: scylla_search, scys]
pown-cli recon transform securitytrailssuggestions [options] <nodes...> Get a list of domain suggestions from securitytrails.com [aliases: securitytrails_domain_suggestions, stds]
pown-cli recon transform shodanorgsearch [options] <nodes...> Performs search using ORG filter [aliases: shodan_org_search, sos]
pown-cli recon transform shodansslsearch [options] <nodes...> Performs search using SSL filter [aliases: shodan_ssl_search, sss]
pown-cli recon transform spysesubdomains [options] <nodes...> Performs subdomain searching with Spyse [aliases: spyse_subdomains, ssds]
pown-cli recon transform tcpportscan [options] <nodes...> Simple, full-handshake TCP port scanner (very slow and sometimes inaccurate) [aliases: tcp_port_scan, tps]
pown-cli recon transform threatcrowddomainreport [options] <nodes...> Obtain threatcrowd domain report which helps enumerating potential target subdomains and email addresses [aliases: threatcrowd_domain_report, tcdr]
pown-cli recon transform threatcrowdipreport [options] <nodes...> Obtain threatcrowd ip report which helps enumerating virtual hosts [aliases: threatcrowd_ip_report, tcir]
pown-cli recon transform urlscanliveshot [options] <nodes...> Generates a liveshot of any public site via urlscan [aliases: urlscan_liveshot, usls]
pown-cli recon transform urlscansubdomains [options] <nodes...> Find subdomains via urlscan [aliases: urlscan_subdomains, uss]
pown-cli recon transform noop [options] <nodes...> Does not do anything [aliases: nop]
pown-cli recon transform sleep [options] <nodes...> Sleeps for predefined time [aliases: sleep, wait]
pown-cli recon transform duplicate [options] <nodes...> Duplicate node [aliases: dup]
pown-cli recon transform extract [options] <nodes...> Extract property [aliases: excavate]
pown-cli recon transform prefix [options] <nodes...> Creates a new node with a prefix [aliases: prepand]
pown-cli recon transform suffix [options] <nodes...> Creates a new node with a suffix [aliases: append]
pown-cli recon transform augment [options] <nodes...> Update node with prefix or suffix
pown-cli recon transform splitemail [options] <nodes...> Split email at the @ sign [aliases: split_email]
pown-cli recon transform buildemail [options] <nodes...> Build email from node label [aliases: build_email]
pown-cli recon transform splitdomain [options] <nodes...> Split domain at the first dot [aliases: split_domain]
pown-cli recon transform builddomain [options] <nodes...> Build domain from node label [aliases: build_domain]
pown-cli recon transform splituri [options] <nodes...> Split URI to corresponding parts [aliases: split_uri]
pown-cli recon transform builduri [options] <nodes...> Build URI from node label [aliases: build_uri]
pown-cli recon transform bakeimages [options] <nodes...> Convert external image into data URIs for self-embedding purposes [aliases: bake_images, bes]
pown-cli recon transform virustotalsubdomains [options] <nodes...> Obtain subdomains from Virustotal [aliases: virustotal_subdomains, vtsd]
pown-cli recon transform vulnerssearch [options] <nodes...> Obtain vulnerability information via vulners.com [aliases: vulners_search, vs]
pown-cli recon transform wappalyzerprofile [options] <nodes...> Enumerate technologies with api.wappalyzer.com [aliases: wappalyzer_profile, wzp]
pown-cli recon transform worker [options] <nodes...> Perform transformation with external worker [aliases: worker]
pown-cli recon transform zonecrunchersubdomains [options] <nodes...> Performs subdomain searching with Zonecruncher [aliases: zonecruncher_subdomains, zcss]
pown-cli recon transform auto [options] <nodes...> Select the most appropriate methods of transformation
Options:
--version Show version number [boolean]
--help Show help [boolean]
-r, --read Read file [string]
-w, --write Write file [string]
Generierte Graphen können zur Bequemlichkeit in SecApps Recon vorschauert werden, auf dem dieses Tool basiert. Sie können auf SecApps Recon über Ihren Browser zugreifen, es aber auch über die Befehlszeile aufrufen.
Zuerst benötigen Sie @pown/apps installiert:```sh
$ pown modules install @pown/apps
Dies installiert das optionale Paket für den Befehl "apps".
Erstellen Sie Ihr Diagramm mit den Schreiboptionen:```sh
$ pown recon transform auto -w path/to/file.network --node-type brand target
Sobald die Aufklärung abgeschlossen ist, öffnen Sie den Graphen zur Vorschau in SecApps Recon:```sh $ pown apps recon < path/to/file.network
## Skripterstellung
Pown recon ist für die Skripterstellung entweder über Ihre bevorzugte Shell-Umgebung, [Pown Script](https://github.com/pownjs/script), [Pown Engine Templates](https://github.com/pownjs/engine) und JavaScript konzipiert. Skripte profitieren von einem erhaltenen Kontext zwischen jeder Befehlsausführung. Das bedeutet, dass Sie einen Graphen erstellen können, ohne ihn in Zwischendateien speichern und wiederherstellen zu müssen.
Erstellen Sie mit Ihrem bevorzugten Editor eine Datei namens `example.pown` mit folgendem Inhalt:```sh
echo This is script
recon add --node-type brand target
recon t auto
Führen Sie das Skript von pown aus:```sh $ pown script path/to/example.pown
Für weitere Informationen finden Sie im `./examples`-Verzeichnis weitere Ideen zur Nutzung von Skripten.
## Selektoren
> Manche Befehle erwarten Graph-Selektoren. Der Rest der Dokumentation ist eine Kopie des cytoscape.js-Selektoren-Handbuchs mit einigen geringfügigen Unterschieden.
Ein Selektor funktioniert ähnlich wie ein CSS-Selektor auf DOM-Elementen, aber Selektoren in Recon arbeiten stattdessen auf Sammlungen von Graph-Elementen. Dieser Mechanismus wird von der leistungsstarken cytoscape.js bereitgestellt.
Die Selektoren können miteinander kombiniert werden, um leistungsfähige Abfragen zu erstellen, zum Beispiel:```
pown select 'node[weight >= 50][height < 180]'
Selektoren können mit Kommas zusammengefügt werden (um effektiv ein logisches ODER zu bilden):``` pown select 'node#j, edge[source = "j"]'
Es ist wichtig zu beachten, dass Zeichenketten in Anführungszeichen eingeschlossen werden müssen:```
pown select 'node[type = "domain"]'
Beachten Sie, dass Metazeichen ( ^ $ \ / ( ) | ? + * [ ] { } , . ) maskiert werden müssen:
pown select '#some\$funky\@id'
node, edge oder * (Gruppenselektor) Matcht Elemente basierend auf der Gruppe (node für Knoten, edge für Kanten, * für alle)..className Matcht Elemente, die die angegebene Klasse haben (z. B. verwenden Sie .foo für eine Klasse namens "foo").#id Matcht Elemente mit der passenden ID (z. B. ist #foo dasselbe wie [id = 'foo'])[name] Matcht Elemente, wenn das angegebene Datenattribut definiert ist, d.h. nicht undefined (z. B. [foo] für ein Attribut namens "foo"). Hier wird null als definierter Wert betrachtet.[^name] Matcht Elemente, wenn das angegebene Datenattribut nicht definiert ist, d.h. undefined (z. B. [^foo]). Hier wird null als definierter Wert betrachtet.[?name] Matcht Elemente, wenn das angegebene Datenattribut einen truthy-Wert hat (z. B. [?foo]).[!name] Matcht Elemente, wenn das angegebene Datenattribut einen falsey-Wert hat (z. B. [!foo]).[name = value] Matcht Elemente, wenn ihr Datenattribut mit einem angegebenen Wert übereinstimmt (z. B. [foo = 'bar'] oder [num = 2]).[name != value] Matcht Elemente, wenn ihr Datenattribut nicht mit einem angegebenen Wert übereinstimmt (z. B. oder ).> (Kind-Selektor) Matcht direkte Kinder des Elternknotens (z. B. node > node). (Nachfahren-Selektor) Matcht Nachfahren des Elternknotens (z. B. node node).$ (Subjekt-Selektor) Legt das Subjekt des Selektors fest (z. B. $node > node, um die Elternknoten anstelle der Kinder auszuwählen).Ein komplexer Auswahltyp ist als Durchlauf bekannt.
Hier sind einige der in Recon verfügbaren Transformationen. Zusätzliche Transformationen sind in optionalen pown-Modulen verfügbar.
Um die Leistungsfähigkeit von Recon und graph-basiertem OSINT (Open Source Intelligence) zu demonstrieren, werfen wir einen Blick auf das folgende triviale Beispiel.
Beginnen wir damit, jeden abzufragen, der Mitglied des Google-Engineering-Teams ist und zu seinem GitHub-Konto beiträgt.```sh pown recon t -w google.network ghlm google
Dieser Befehl wird eine Tabelle ähnlich dieser generieren:```
github:member
┌─────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┐
│ uri │ login │ avatar │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/3rf │ 3rf │ https://avatars1.githubusercontent.com/u/1242478?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/aaroey │ aaroey │ https://avatars0.githubusercontent.com/u/31743510?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/aarongable │ aarongable │ https://avatars3.githubusercontent.com/u/2474926?v=4 │
...
...
...
│ https://github.com/alexpennace │ alexpennace │ https://avatars1.githubusercontent.com/u/2506548?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/alexv │ alexv │ https://avatars0.githubusercontent.com/u/30807372?v=4 │
├─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ https://github.com/alexwhouse │ alexwhouse │ https://avatars3.githubusercontent.com/u/1448490?v=4 │
└─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┘
Du hast gerade dein erstes Netzwerk erstellt!
Die Darstellung ist tabellarisch der Einfachheit halber, aber darunter haben wir ein Modell, das aus Knoten und Kanten besteht.
Wenn du wissen möchtest, wie das aussieht, kannst du SecApps Recon verwenden. Die Kommandozeile hat nicht die nötige Interaktivität, um die Komplexität von Graphen darzustellen.
Die Kommandozeilenoption -w google.network hat das Netzwerk in eine Datei exportiert. Du kannst die Datei direkt in SecApps Recon mit der Funktion zum Öffnen von Dateien laden. Das Ergebnis sieht dann so aus:
Stellen wir uns nun vor, dass wir abfragen möchten, an welchen Repositories diese Google-Ingenieure arbeiten. Das ist einfach. Zuerst müssen wir die Knoten im Graphen auswählen und sie dann mit der Transformation "GitHub List Repositories" transformieren. So machen wir das von der Kommandozeile aus:```sh pown recon t ghlr -r google.network -w google2.nework -s 'node[type="github:member"]'
Wenn Sie die Ratenbegrenzung der GitHub-API nicht erreichen, wird Ihnen Folgendes angezeigt:```
github:repo
┌──────────────────────────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────┐
│ uri │ fullName │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/3rf/2015-talks │ 3rf/2015-talks │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/3rf/codecoroner │ 3rf/codecoroner │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/3rf/DefinitelyTyped │ 3rf/DefinitelyTyped │
...
...
...
│ https://github.com/agau4779/ultimate-tic-tac-toe │ agau4779/ultimate-tic-tac-toe │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/agau4779/worm_scraper │ agau4779/worm_scraper │
├──────────────────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ https://github.com/agau4779/zsearch │ agau4779/zsearch │
└──────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────┘
Da wir jetzt zwei Dateien google.network und google2.network haben, fragst du dich vielleicht, was der Unterschied zwischen ihnen ist. Nun, wir haben ein Werkzeug genau dafür.```sh
pown recon diff google.network google2.network
Jetzt wissen wir es! Diese Funktion ist sehr nützlich, wenn Sie große Recon-Karten erstellen und wissen möchten, was die wichtigsten Unterschiede sind. Stellen Sie sich vor, Ihr Cron-Job führt jeden Tag dieselbe Recon durch und Sie möchten wissen, ob etwas Neues aufgetaucht ist, das näher untersucht werden könnte. Hallo, Bug-Bounty-Jäger!
[foo != 'bar'][num != 2][name > value] Matcht Elemente, wenn ihr Datenattribut größer als ein angegebener Wert ist (z. B. [foo > 'bar'] oder [num > 2]).[name >= value] Matcht Elemente, wenn ihr Datenattribut größer oder gleich einem angegebenen Wert ist (z. B. [foo >= 'bar'] oder [num >= 2]).[name < value] Matcht Elemente, wenn ihr Datenattribut kleiner als ein angegebener Wert ist (z. B. [foo < 'bar'] oder [num < 2]).[name <= value] Matcht Elemente, wenn ihr Datenattribut kleiner oder gleich einem angegebenen Wert ist (z. B. [foo <= 'bar'] oder [num <= 2]).[name *= value] Matcht Elemente, wenn ihr Datenattribut den angegebenen Wert als Teilstring enthält (z. B. [foo *= 'bar']).[name ^= value] Matcht Elemente, wenn ihr Datenattribut mit dem angegebenen Wert beginnt (z. B. [foo ^= 'bar']).[name $= value] Matcht Elemente, wenn ihr Datenattribut mit dem angegebenen Wert endet (z. B. [foo $= 'bar']).@ (Modifikator des Datenattribut-Operators) Wird einem Operator vorangestellt, sodass dieser case-insensitive ist (z. B. [foo @$= 'ar'], [foo @>= 'a'], [foo @= 'bar'])! (Modifikator des Datenattribut-Operators) Wird einem Operator vorangestellt, sodass dieser negiert wird (z. B. [foo !$= 'ar'], [foo !>= 'a'])[[]] (Metadaten-Klammern) Verwenden Sie doppelte eckige Klammern anstelle von einfachen, um gegen Metadaten statt Daten zu matchen (z. B. matcht [[degree > 2]] Elemente mit einem Grad größer als 2). Die unterstützten Eigenschaften umfassen degree, indegree und outdegree.