
Мощный фреймворк для разведки целей, основанный на теории графов.
Проект переехал в монорепозиторий. Подробнее см. https://github.com/pownjs/pown.
Recon — это фреймворк для разведки целей, основанный на графах знаний. Использование графов знаний вместо плоских таблиц упрощает поиск взаимосвязей между различными типами информации, что оказывается весьма удобным во многих ситуациях. Алгоритмы графов знаний также помогают в сравнении, поиске, нахождении кратчайшего пути и выполнении многих других полезных задач, способствующих обнаружению информации и сбору разведывательных данных.
Этот инструмент является частью инициативы с открытым исходным кодом secapps.com.```
/ | / | /_\ | _ \ _ / |
_ \ | ( / _ | / /_
|/__// __| || |___/
https://secapps.com
> **Примечание**: Recon является результатом почти прямой копии отличного инструмента [Recon](https://recon.secapps.com) от SecApps.
## Быстрый старт
Этот инструмент предназначен для использования в составе [Pown.js](https://github.com/pownjs/pown), но его можно вызывать отдельно как самостоятельный инструмент.
Установите Pown сначала как обычно:
```bash
npm install -g pown
``````sh
$ npm install -g pown@latest
Установка recon:```sh $ pown modules install @pown/recon
Вызов напрямую из Pown:```sh
$ pown recon
Установите этот модуль локально из корня вашего проекта:```sh $ npm install @pown/recon --save
После завершения выполните pown cli:```sh
$ POWN_ROOT=. ./node_modules/.bin/pown-cli recon
Вы также можете использовать глобальный pown для локального вызова инструмента:```sh $ POWN_ROOT=. pown recon
## Library Use
Модуль также является библиотекой. Ознакомьтесь с кодом и примерами, чтобы понять, как его использовать. Документация будет доступна в ближайшее время.
## Usage
> **ПРЕДУПРЕЖДЕНИЕ**: Эта команда pown в настоящее время находится в разработке, и поэтому в ней могут происходить критические изменения.```
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]
Сгенерированные графы можно предварительно просмотреть в SecApps Recon для удобства, на котором основан этот инструмент. Вы можете получить доступ к SecApps Recon из браузера, но также можете вызвать его из командной строки.
Сначала вам нужно установить @pown/apps:```sh
$ pown modules install @pown/apps
Это установит пакет команд дополнительных приложений.
Создайте свой график с помощью опций записи:```sh
$ pown recon transform auto -w path/to/file.network --node-type brand target
Как только рекогносцировка завершена, откройте граф для предварительного просмотра в SecApps Recon:```sh $ pown apps recon < path/to/file.network
## Scripting
Pown recon разработан для автоматизации с помощью вашей любимой среды оболочки, [Pown Script](https://github.com/pownjs/script), [Pown Engine Templates](https://github.com/pownjs/engine) и JavaScript. Скрипты выигрывают от сохранения контекста между выполнениями команд. Это означает, что вы можете строить граф без необходимости сохранять и восстанавливать данные через промежуточные файлы.
Используя ваш любимый редактор, создайте файл с именем `example.pown` со следующим содержимым:```sh
echo This is script
recon add --node-type brand target
recon t auto
Выполните скрипт из pown:```sh $ pown script path/to/example.pown
Для получения дополнительной информации см. `./examples` для большего количества идей по использованию скриптов.
## Селекторы
> Некоторые команды ожидают селекторы графов. Остальная часть документации является копией руководства по селекторам cytoscape.js с некоторыми незначительными отличиями.
Селектор работает аналогично CSS-селектору для DOM-элементов, но селекторы в Recon вместо этого работают с коллекциями элементов графа. Этот механизм предоставляется мощной библиотекой cytoscape.js.
Селекторы можно комбинировать для создания мощных запросов, например:```
pown select 'node[weight >= 50][height < 180]'
Селекторы можно объединять (фактически создавая логическое ИЛИ) с помощью запятых:``` pown select 'node#j, edge[source = "j"]'
Важно отметить, что строки должны быть заключены в кавычки:```
pown select 'node[type = "domain"]'
Обратите внимание, что метасимволы ( ^ $ \ / ( ) | ? + * [ ] { } , . ) нужно экранировать:
pown select '#some\$funky\@id'
node, edge или * (селектор группы) Выбирает элементы на основе группы (node для узлов, edge для рёбер, * для всех)..className Выбирает элементы, у которых указанный класс (например, используйте .foo для класса с именем "foo").#id Выбирает элемент с соответствующим ID (например, #foo равнозначно [id = 'foo'])[name] Выбирает элементы, если у них определён указанный атрибут данных, то есть не undefined (например, [foo] для атрибута с именем "foo"). Здесь null считается определённым значением.[^name] Выбирает элементы, если указанный атрибут данных не определён, то есть undefined (например, [^foo]). Здесь null считается определённым значением.[?name] Выбирает элементы, если указанный атрибут данных является truthy-значением (например, [?foo]).[!name] Выбирает элементы, если указанный атрибут данных является falsey-значением (например, [!foo]).[name = value] Выбирает элементы, если их атрибут данных соответствует указанному значению (например, [foo = 'bar'] или [num = 2]).[name != value] Выбирает элементы, если их атрибут данных не соответствует указанному значению (например, или ).> (селектор дочерних элементов) Выбирает прямых потомков родительского узла (например, node > node). (селектор потомков) Выбирает всех потомков родительского узла (например, node node).$ (селектор субъекта) Устанавливает субъект селектора (например, $node > node для выбора родительских узлов вместо дочерних).Сложный тип выборки, известный как обход.
Вот некоторые из трансформаций, доступных в Recon. Дополнительные трансформации доступны в опциональных модулях pown.
Чтобы продемонстрировать возможности Recon и графовой OSINT (разведки по открытым источникам), давайте рассмотрим следующий тривиальный пример.
Начнём с запроса всех, кто является членом инженерной команды Google и вносит вклад в их учётную запись GitHub.```sh pown recon t -w google.network ghlm google
Эта команда создаст таблицу, похожую на эту:```
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 │
└─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┘
Вы только что создали свою первую сеть!
Для удобства представление является табличным, но под ним у нас есть модель, состоящая из узлов, соединенных ребрами.
Если вам интересно, как это выглядит, вы можете воспользоваться SecApps Recon. Командная строка не имеет необходимого уровня интерактивности, чтобы отобразить сложность графов.
Параметр командной строки -w google.network экспортировал сеть в файл. Вы можете загрузить файл непосредственно в SecApps Recon с помощью функции открытия файла. Результат будет выглядеть так:
Теперь представьте, что мы хотим запросить, над какими репозиториями работают эти инженеры Google. Это просто. Сначала нам нужно выбрать узлы в графе, а затем применить к ним трансформацию "GitHub List Repositories". Вот как это делается из командной строки:```sh pown recon t ghlr -r google.network -w google2.nework -s 'node[type="github:member"]'
Если вы не превышаете лимиты запросов GitHub API, вам будет представлено следующее:```
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 │
└──────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────┘
Так как теперь у нас есть два файла google.network и google2.network, вы, возможно, задаетесь вопросом, в чем разница между ними. Что ж, у нас есть инструмент, который делает именно это.```sh
pown recon diff google.network google2.network
Теперь мы знаем! Эта функция довольно полезна, если вы строите большие разведывательные карты и хотите знать, в чём ключевые различия. Представьте, что ваша задача cron каждый день выполняет одну и ту же разведку, и вы хотите знать, не появилось ли что-то новое, что стоит изучить подробнее. Привет, охотники за багами!
[foo != 'bar'][num != 2][name > value] Выбирает элементы, если их атрибут данных больше указанного значения (например, [foo > 'bar'] или [num > 2]).[name >= value] Выбирает элементы, если их атрибут данных больше или равен указанному значению (например, [foo >= 'bar'] или [num >= 2]).[name < value] Выбирает элементы, если их атрибут данных меньше указанного значения (например, [foo < 'bar'] или [num < 2]).[name <= value] Выбирает элементы, если их атрибут данных меньше или равен указанному значению (например, [foo <= 'bar'] или [num <= 2]).[name *= value] Выбирает элементы, если их атрибут данных содержит указанное значение в качестве подстроки (например, [foo *= 'bar']).[name ^= value] Выбирает элементы, если их атрибут данных начинается с указанного значения (например, [foo ^= 'bar']).[name $= value] Выбирает элементы, если их атрибут данных заканчивается указанным значением (например, [foo $= 'bar']).@ (модификатор оператора атрибута данных) Добавляется перед оператором для регистронезависимого сравнения (например, [foo @$= 'ar'], [foo @>= 'a'], [foo @= 'bar'])! (модификатор оператора атрибута данных) Добавляется перед оператором для его отрицания (например, [foo !$= 'ar'], [foo !>= 'a'])[[]] (скобки метаданных) Используйте двойные квадратные скобки вместо одинарных для сопоставления с метаданными, а не с данными (например, [[degree > 2]] выбирает элементы со степенью больше 2). Поддерживаемые свойства: degree, indegree и outdegree.