Как найти транзитные BGP маршрутизаторы в сети.

В предыдущей статье мы уже затрагивали тему сканирования сетей и подмене трафика на BGP маршрутизаторах. Сегодня мы рассмотрим также не маловажный вопрос — как просканировать сеть и найти транзитные BGP маршрутизаторы в сети интернет.

Классификаций маршрутизаторов очень много и по большому счету они зависят от рассматриваемого контекста, так относительно протокола OSPF мы можем определить магистральные маршрутизаторы, зональные и тд. В этой статье будут затрагиваться так называемые транзитные маршрутизаторы — это просто условное обозначение их в определенном контексте (а именно в передаче пакетов по сетям).


Чтобы было более понятно — транзитными можно считать маршрутизаторы, через которые проходит трафик из «внешних» сетей, то есть которые имеют свой (не частный) IP-адрес и учавствуют в непосредственном обмене пакетами между другими маршратизаторами, другими словами, они передают трафик от множества разных (под)сетей другим различным (под)сетям.

Остальные же маршрутизаторы, если разделять по этому принципу, будут «пограничными», то есть соединять локальные сети с глобальными и при этом будут передавать пакеты только из одной сети (или подсети) в другие через сеть провайдера, у них, обычно есть интерфейс с частным IP адресов типа 198.0.0.1. К таким маршрутизаторам в основном относятся домашние точки WiFi (или SOHO роутеры), которые являются одновременно еще и коммутаторами и маршрутизаторами (хотя в неокторых случаях эти пограничные маршрутизаторы могут быть и транизтными, если поставить на них нужный софт и включить IP Forwarding).

Также следуем заметить, что понятие роутер = маршрутизатор, то есть это два одинаковых термина, как файрвол (firewall) и межсетевой экран.

Цель.
Итак задача состоит в том, чтобы «выцепить» из общего адресного пространства как можно больше адресов, которые будут являться адресами именно маршрутизаторов, а не конечных хостов (то есть клиентов или серверов, не выполняющих функции маршрутизации по сетям).

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

То есть идея будет заключаться в том, чтобы посылать запросы на разные хосты и мониторить промежуточные звенья, через которые проходят пакеты. Для этой задачи и была разрботана специальная утилита traceroute, которую и можно исопльзовать. Еще следует заметить, что начало маршрута будет постоянно (или почти постоянно) совпадать, так как пакет сначала будет идти через сеть нашего провайдера, топология и таблицы маршрутизации которого меняются через достаточно большие промежутки времени.

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

Эту проблему можно решить следующими путями:

  • traceroute на слабо «похожие» айпишники, разных местоположений (которые могут быть распарсены из разныз GeoIP баз);
  • traceroute на разных провайдеров;

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

Теперь про реализацию второго способа.

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

Поэтому идея заключается в роутинге IP-адресов из разных AS. И самое удобное для нас свойство, что маршруты в разные AS одного провайдера могут различаться, как маршруты к разным провайдерам. Хотя можно даже роутить через traceroute в одну и ту же AS, но в разные (под)сети, иногда маршруты будут также различаться, как при роутинге в разные AS.

Данные о том, какие диопазоны IP-адресов к каким AS (то есть к AS с какими номерами) можно взять из публичных баз данных регистраторов номеров AS и пулов IP-адресов, я использовал сервис ipinfo.io. На данный момент существует более 50000 AS, то есть мы можем брать AS с номерами от AS1 до AS50000 мы можем брать смело, тем более в этот диопазон не входят частные номера AS (64512-65534) и зарезервированные (0 и 65535)

Практика.
Теперь про конкретный алгоритм действий:

  • берем определенный диопазон номеров AS;
  • получаем диопазоны IP-адресов для кажой из этих AS;
  • для каждого из диопазонов выбираем один IP, на который потом будем роутить через traceroute;
  • через traceroute получаем списки промежуточных узлов и сохраняем их;

Автоматизация.
Для гибкой автоматизации всего этого был написан скрипт (будет прикреплен). Запускать скрипт надо под 3 питоном и также заранее придется установить пару нестандартных модулей (если при запуске ошибок не будет, то модули уже стоят).

Как пользоваться скриптом и как он работает.

Для начала стоит заметить, что все данные скрипт сохраняет в MySQL. То есть перед запуском надо в его начале в соответствуюих переменных указать нужные данные для MySQL сервера. Скрипт сам создаст базу данных и таблицы в ней, которые будут исопльзованы. Также должна быть установлена утилита traceroute (и nmap, если потом будет использоваться опция сканирования).

[ad name=»Responbl»]

Описание таблиц: subnets — тут сохраняются диопазоны IP-адресов, выцепленные из различных AS, routers — тут храняться IP адреса, к которым потом будут строиться маршруты через traceroute и добываться уже реальные IP маршрутизаторов, ibgp, ebgp — по этим двум таблицам рассортировываются адреса транзитных маршрутизаторов в конечном итоге, в таблице ibgp храняться адреса маршрутизаторов, которые являются внутринними маршрутизаторами одной AS, то есть маршрутизируют трафик только по ней, в ebgp находятся адреса роутеров, которые являются пограничными, то есть находятся на границах AS и соединяются с AS соседей. Это разделение было обусловлено возможными будущими необходимостями в определениях функций маршрутизаторов.

Для вывода всех опций можно использовать ключ —help.
Для выбора действий надо использовать ключ —action, который принимает 3 значения:
grab для граббинга AS, то есть диопазонов IP из разных AS и выбирая по одному конкретному адресу из каждого диопазона;
check для чека через traceroute каждого IP, полученного из предыдущего шага, то есть получение IP-адресов транзитных маршрутизаторов;
scan для сканирования полученных роутеров на открытые порты и пр (результаты сканирования появляются в текстовом файлв в папке со скриптом);

Вместе с ключом grab надо использовать ключ range, чтобы через запятую указать с какого по какой номера AS будет происходить отбор диопазонов IP адресов, и конкретных IP, на которые потом будут проводиться маршруты через traceroute. Также можно использовать ключ gmode для указания режима, в котором будут выдергиваться IP из AS, если через этот ключ указать значение min, то из каждой AS будет браться только по 1 IP, если значение будет max (по умолчанию), то из для каждой AS будет браться набор диопазоно ее IP и из кадого диопазона браться по 1 IP.

Вместе с ключом check можно использовать ключ tnum, который устанавливает количество потоков (то есть количество одновременных запусков traceroute) во время проверки маршрутов. Это сделано для улучшения скорости выдергивания айпишников из цепочки, так как один сеанс traceroute работает пару десятков секунд. Но слишком много потоков ставить не надо, иначе из-за нагрузки на сеть очень много будут уходить в холостую и отдача будет слишком маленькой, для меня оптимальным числом оказалось 15 потоков. Также с этим ключом можно использовать ключ rnum, который указывает, сколько еще на «опробованных» адресов из таблицы routers можно использовать при построении цепочек через traceroute.

Вместе с ключом scan можно исопльзовать ключ ports, в котором указать через запятую порты для скана, ключ skeys можно использовать для указания дополнительных параметров сканирования для Nmap’a (через него в принципе можно тоже задать порты), и ключ rnum — сколько сканировать роутеров из таблиц ibgp и ebgp.

Функцию сканирования пришлось сделать, так как все резульаты работы скрипта храняться в MySQL, поэтому чтобы их использовать для Nmap’a придется сначала как-то экспортировать, а если в этом нет необходимости, то как раз понадобиться такая функция.

Но функцию экспортирования IP адресов (при чем из любой таблицы, а не только ibgp и ebgp), можно осуществить через ключ export, в котором указать через запятую имена таблиц, откуда будут экспортироваться адреса. После в папке со скриптом появиться файл с адресами, который потом можно также загрузить в тот же Nmap.

Для очистки результатов или какой-либо из таблиц можно воспользоваться ключом clear, в который подать имя (имена через запятую) таблицы, которую нужно очистить, для очистки всех таблиц можно просто в этом ключе прописать «all».

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

[ad name=»Responbl»]

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

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

Возьмем для начала автономные системы с AS10000 по AS11000 и выцепим из них дипоазоны IP, а из них уже конкретные адреса, на которые позже будет проводить маршруты:

python3 routerget.py --action=grab --range=10000,11000

После завершения работы этой операции переходим непосредственно вытягиванию IP-адресов роутеров из маршрутов к полученным на первом шаге адресам (запустим это в 15 потоков и попробуем сначало чекнуть только 1000 IP из различных AS):

python3 routerget.py --action=check --rnum=1000 --tnum=15

После завершения работы можно уже либо экспортировать полученные результаты:

python3 routerget.py --export=ibgp,ebgp

Либо сразу же их просканировать (например, просканируем 10 роутеров на откртые 80 и 22 порты, c детектом ОС):

python3 routerget.py --action=scan --rnum=10 --ports=80,22 --skeys=-O

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

Скачать скрипт можно здесь

Click to rate this post!
[Total: 4 Average: 2.8]

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

Leave a reply:

Your email address will not be published.