Проверить, может ли субдомен быть захвачен, поскольку он имеет:
подвешенную CNAME-запись, указывающую на CMS-провайдера (Heroku, Github, Shopify, Amazon S3, Amazon CloudFront и т.д.), которая может быть захвачена.
подвешенную CNAME-запись, указывающую на несуществующее доменное имя.
одну или несколько неверных/с опечатками NS-записей, указывающих на сервер имён, который может быть захвачен атакующим для получения контроля над DNS-записями субдомена.
Реально захватить эти субдомены, указав флаг -takeover. В настоящее время захват поддерживается только для Github Pages и Heroku Apps, и по умолчанию функция захвата отключена.
Указать собственных CMS-провайдеров и проверить их с помощью файла providers-data.csv. В этом файле вы указываете имя CMS, значение их CNAME, строку, которую хотите искать, и работает ли она только по HTTP. Ознакомьтесь с файлом для примеров.
Отказ от ответственности: НЕ БУДЬ ПРИДУРКОМ!
Излишне упоминать, но используйте этот инструмент очень осторожно. Авторы не несут ответственности за любые последствия.
По умолчанию этот инструмент не позволяет захватывать субдомены. Если вы хотите это сделать, просто укажите флаг -takeover.
Предварительные требования
Необходим установленный GO. После установки GO просто введите go get github.com/anshumanbh/tko-subs, чтобы скачать инструмент.
После загрузки инструмента введите tko-subs -h.
Далее нам нужно получить следующую информацию:
Персональный токен доступа Github — убедитесь, что этот токен имеет права на создание репозиториев, ссылок, содержимого и т.д. Вы можете создать этот токен здесь — https://github.com/settings/tokens
Имя пользователя и API key Heroku
Имя приложения Heroku — вы можете создать статическое приложение на Heroku с любым содержимым, которое хотите отображать на его главной странице, следуя инструкциям здесь — https://gist.github.com/wh1tney/2ad13aa5fbdd83f6a489. После создания приложения используйте его имя в флаге (см. ниже). Мы будем использовать это приложение для захвата домена (с подвешенной CNAME на другое приложение Heroku).
ПРИМЕЧАНИЕ — эти значения нужны только в том случае, если вы хотите захватывать субдомены. По умолчанию это не требуется.
Необходимые пакеты Go для сборки.
root@kitploit:~
go get github.com/bgentry/heroku-go
go get github.com/gocarina/gocsv
go get github.com/google/go-github/github
go get github.com/olekukonko/tablewriter
go get golang.org/x/net/publicsuffix
go get golang.org/x/oauth2
go get github.com/miekg/dns
Как запустить?
После установки всего необходимого перейдите в каталог и введите:
tko-subs -domains=domains.txt -data=providers-data.csv -output=output.csv
Если вы также хотите выполнить захват, команда будет такой:
tko-subs -domains=domains.txt -data=providers-data.csv -output=output.csv -takeover -githubtoken=<github-token> -herokuusername=<heroku-username> -herokuapikey=<heroku-api-key> -herokuappname=<heroku-app-name>
Если вы хотите проверить только один домен, введите:
tko-subs -domain <domain-name>
Если вы хотите проверить несколько доменов, введите:
tko-subs -domain <domain-name-1>,<domain-name-2>
По умолчанию:
флаг domains установлен на domains.txt
флаг data установлен на providers-data.csv
флаг output установлен на output.csv
флаг takeover не установлен, поэтому захват по умолчанию отключён
флаг domain НЕ установлен, поэтому всегда проверяются все домены из файла domains.txt. Если указан флаг domain, проверяется только этот домен, а файл domains.txt игнорируется, даже если он существует
флаг threads установлен на 5
Таким образом, простой запуск tko-subs будет использовать указанные выше значения по умолчанию.
Как отформатирован файл providers-data.csv?
name,cname,string,http
name: Имя провайдера (например, github)
cname: CNAME, используемый для сопоставления веб-сайта с содержимым провайдера (например, github.io)
string: Сообщение об ошибке, возвращаемое для незарегистрированного субдомена (например, "There isn't a GitHub Pages site here")
http: Использовать ли http (а не https, который используется по умолчанию) для подключения к сайту (true/false)
Если найдена мёртвая DNS-запись, Provider остаётся пустым.
Если найден проблемный сервер имён, Provider и CNAME остаются пустыми.
Что происходит под капотом?
Этот код перебирает все домены (конкурентно, с помощью GoRoutines) в файле subdomains.txt и:
Проверяет, есть ли у них проблемный авторитетный сервер имён; если да, помечаем домен как уязвимый.
Проверяет, есть ли у них подвешенные CNAME-записи (мёртвые DNS-записи); если да, помечаем домен как уязвимый.
Если субдомен проходит эти две проверки, он пытается выполнить curl и получить ответ, а затем проверяет, соответствует ли этот ответ какой-либо строке провайдера данных, указанного в файле providers-data.csv.
Если ответ совпадает, помечаем домен как уязвимый.
Затем, в зависимости от того, указан ли флаг takeover, он пытается захватить этот уязвимый субдомен.
Например, для захвата Github Page код:
Создаёт репозиторий
Создаёт ветку gh-pages в этом репозитории
Загружает файлы CNAME и index.html в ветку gh-pages этого репозитория. CNAME содержит домен, который нужно захватить. index.html содержит текст This domain is temporarily suspended, который будет отображаться после захвата домена.
Аналогично для приложений Heroku код:
Добавляет подвешенный домен к вашему приложению Heroku (имя которого вы укажете в файле .env)
И всё!
Планы на будущее
Взять имя CMS и регулярное выражение от пользователя или из файла .env и автоматически подключить их к инструменту для поиска. СДЕЛАНО
Добавить захваты для других CMS
Добавить больше CMS-провайдеров
Благодарности
Спасибо Luke Young (@TheBoredEng) за помощь с библиотекой go-github.
Спасибо Frans Rosen (@fransrosen) за помощь в понимании технических деталей, необходимых для некоторых захватов.
Спасибо Mohammed Diaa (@mhmdiaa) за время, потраченное на реализацию функциональности провайдеров данных и продвижение кода.
Спасибо high-stakes за столь необходимый рефакторинг кода.
Журнал изменений
27.05
Добавлен новый Dockerfile, уменьшающий размер образа
Добавлен пример файла domains.txt для тестирования
mhmdiaa добавил логику захвата мёртвых DNS. Обновлена документация. Большое спасибо!
06.11
high-stakes сделал PR с кучей нового кода, исправляющего несколько ошибок и делающего код чище
22.09
Добавлен опциональный флаг для проверки одного домена
Упрощены установка и запуск
25.06
Значительно ускорен код за счёт внедрения горутин
Вместо проверки с помощью функции LookupCNAME из пакетов net в Golang теперь используется dig, так как он также возвращает мёртвые DNS-записи. Больше поверхности атаки!!