В этой статье я покажу, как на Python мож­но сде­лать инъ­екцию лож­ных мар­шру­тов в домен EIGRP. При некото­ром везении такая инъ­екция поз­волит зло­умыш­ленни­ку про­вес­ти ата­ку типа MITM или на некото­рое вре­мя устро­ить хаос в домене мар­шру­тиза­ции. Мы в деталях раз­берем про­цесс уста­нов­ления соседс­тва с мар­шру­тиза­тором и обмен мар­шрут­ной информа­цией, а в качес­тве бонуса смас­терим нес­ложный гра­фичес­кий интерфейс.
 

Краткий ликбез по EIGRP

EIGRP — это про­токол динами­чес­кой мар­шру­тиза­ции, по клас­сифика­ции отно­сящий­ся к дис­танци­онно‑век­торным про­токо­лам (Distance Vector) внут­ренне­го шлю­за (IGP). Ниже — схе­ма стро­ения EIGRP.

Каж­дый пакет EIGRP содер­жит 20-бай­товый заголо­вок со сле­дующи­ми полями.

  1. Version — вер­сия про­токо­ла никог­да не изме­нялась и име­ет зна­чение 2.
  2. Opcode (Operation Code) — поле, опре­деля­ющее тип пакета. Нам инте­рес­ны толь­ко два зна­чения это­го поля: 1 и 5. Зна­чение 5 опре­деля­ет Hello-пакет, а зна­чение 1 — Update-пакет. Про типы пакетов погово­рим чуть поз­же.
  3. Сhecksum — кон­троль­ная сум­ма.
  4. Flags — это поле при­нима­ет все­го четыре зна­чения: 0x1, 0x2, 0x4 и 0x8. Нам будут инте­рес­ны толь­ко пер­вое и пос­леднее зна­чения.
  5. Sequence Number (SEQ) и Acknowledgment Number (ACK) — это поряд­ковый номер пакета и номер под­твержде­ния соот­ветс­твен­но (пря­мо как в TCP и UDP). Эти поля обес­печива­ют надеж­ную дос­тавку EIGRP-пакетов.
  6. Virtual Router ID — вир­туаль­ный иден­тифика­тор роуте­ра.
  7. Autonomous System Number — номер авто­ном­ной сис­темы (AS), в которой работа­ет мар­шру­тиза­тор.

За этим заголов­ком сле­дует TLV (Type, Length, Value) — гру­бо говоря, это вто­рой заголо­вок перемен­ного зна­чения, который может содер­жать информа­цию о мар­шру­тах, парамет­рах роуте­ра, вер­сии про­шив­ки, аутен­тифика­ции и так далее. Это похоже на стро­ение DHCP, где пос­ле IP-заголов­ка сле­дует DHCP, а за ним — заголо­вок BOOTP.

Те­перь погово­рим про сооб­щения EIGRP. В про­цес­се мар­шру­тиза­ции EIGRP опе­риру­ет сле­дующи­ми типами пакетов (сооб­щени­ями):

  • Hello. Сооб­щения при­ветс­твия отправ­ляют­ся на муль­тикас­товый адрес 224.0.0.10 и име­ют код опе­рации (opcode), рав­ный 5. По умол­чанию интервал отправ­ки Hello-пакетов сос­тавля­ет 5 секунд.
  • Update. При помощи Update-пакетов мар­шру­тиза­торы сооб­щают друг дру­гу информа­цию обо всех извес­тных им сетях (при пер­вичном уста­нов­лении соседс­тва), информа­цию о кон­крет­ных сетях, в слу­чае перес­тро­ения мар­шру­та до них или ког­да сеть наз­начения боль­ше не дос­тупна. Такие сооб­щения могут отправ­лять­ся как на юни­кас­товый, так и на муль­тикас­товый адре­са. В теле Update-пакета содер­жится сле­дующая информа­ция: адрес сети наз­начения, пре­фикс мас­ки сети, адрес сле­дующе­го перехо­да, количес­тво перехо­дов, про­пус­кная спо­соб­ность, задер­жка, надеж­ность, заг­рузка и MTU. Получе­ние Update-пакета под­твержда­ется отправ­кой ACK.
  • ACK. Этот тип сооб­щения отправ­ляет­ся как ответ на успешное получе­ние всех осталь­ных типов сооб­щений, кро­ме Hello. В поле ACK заголов­ка EIGRP записы­вает­ся чис­ловое зна­чение: берет­ся поле SEQ того сооб­щения, на которое отправ­ляет­ся под­твержде­ние, и при­бав­ляет­ся еди­ница.

info

И в сооб­щении Hello, и в сооб­щении ACK поле opcode всег­да рав­но 5. Что это зна­чит? Получа­ется, что, к при­меру, в ответ на сооб­щение Update отправ­ляет­ся, по сути, Hello-пакет? Отчасти да, но это не сов­сем так. Ненуле­вое зна­чение поля ACK прев­раща­ет сооб­щение Hello в сооб­щение ACK. Таким обра­зом, нес­мотря на оди­нако­вое зна­чение поля opcode, сооб­щения отли­чает зна­чение поля ACK.

Так­же EIGRP опе­риру­ет еще нес­коль­кими сооб­щени­ями: Query, Reply, SIA-Query и SIA-Reply. Но они нам неин­терес­ны, поэто­му про­пус­каем их.

Пе­ред тем как мы будем уста­нав­ливать соседс­тво, перечис­лю необ­ходимые для него усло­вия:

  • па­рамет­ры аутен­тифика­ции дол­жны быть оди­нако­выми (при наличии самой аутен­тифика­ции);
  • зна­чения K-коэф­фици­ентов так­же дол­жны быть оди­нако­выми;
  • мар­шру­тиза­торы дол­жны находить­ся в одной авто­ном­ной сис­теме (AS).

По умол­чанию Hello- и Dead-интерва­лы сос­тавля­ют 5 и 15 секунд соот­ветс­твен­но. В отли­чие от OSPF эти интерва­лы не обя­заны сов­падать на мар­шру­тиза­торах для уста­нов­ления соседс­тва. Но мы уста­новим иден­тичные зна­чения тай­меров.

 

Графический интерфейс. Узнаём необходимые параметры маршрутизатора

Как ты уже понял, писать код я буду на Python. Для фор­мирова­ния сетевых пакетов нам понадо­бит­ся биб­лиоте­ка Scapy. Связ­ка из Scapy и Python прос­та, удоб­на и прак­тична.

По ходу дела нам не при­дет­ся искать роутер, под­держи­вающий EIGRP, или нас­тра­ивать вир­туаль­ный. Дос­таточ­но иметь дос­туп к сети с доменом EIGRP.

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

Для уста­нов­ления соседс­тва на мар­шру­тиза­торах дол­жны сов­падать нес­коль­ко парамет­ров, к тому же для отправ­ки EIGRP-пакетов кон­крет­ному роуте­ру нам нуж­но знать его каналь­ный и сетевой адре­са. Поэто­му не хотелось бы выс­матри­вать тра­фик в Wireshark и искать парамет­ры мар­шру­тиза­тора, с которым мы захотим «под­ружить­ся». Будет куда удоб­нее прос­то запус­тить прос­лушива­ние и зах­ват пакетов EIGRP, а затем записать парамет­ры (IP-адрес, MAC-адрес, номер AS, Hold-тай­мер и зна­чения K-коэф­фици­ентов) в удоб­ные для нас перемен­ные, что­бы даль­ше ими опе­риро­вать при краф­тинге пакетов.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии