MITM и перехват трафика
Перехват работает только тогда, когда атакующий находится на пути трафика. ARP-спуфинг и TLS stripping ставят его туда; аутентифицированный TLS с проверкой целостности превращает эту позицию в бесполезный, обнаруживаемый канал.
Всё здесь — только для лаборатории и при наличии авторизации. Встать между двумя сторонами в сети, которой вы не владеете, — снифать, перенаправлять или раздевать чужой трафик — это перехват, и в большинстве юрисдикций это преступление независимо от намерения. Урок объясняет механизм, чтобы вы могли сломать его как защитник: поднимите всё в изолированной лаборатории или на CTF-полигоне, против хостов, которыми вы управляете и на которые есть письменный scope, и никогда — на проде или в сети, где вы гость. Вся суть в том, что, поняв почему перехват работает, вы точно увидите, какое свойство защитник добавляет, чтобы он перестал работать.
К концу урока вы будете знать, чего атакующий обязан добиться, чтобы перехватить трафик, два классических способа туда попасть и единственное криптографическое свойство, которое превращает идеальную позицию на пути в бесполезную.
Что на самом деле нужно «человеку посередине»
Атака «человек посередине» (man-in-the-middle, MITM) — это атака, где атакующий находится между двумя общающимися сторонами, ретранслируя — и потенциально читая или изменяя — каждое сообщение, пока каждая сторона уверена, что говорит напрямую с другой. Фреймворк MITRE ATT&CK относит это к Lateral Movement и более широкой технике «Adversary-in-the-Middle», потому что это почти никогда не первая точка опоры — это то, что делают после того, как уже получили позицию в сети.
Именно эта рамка — ключевое понимание для защитника: перехват — это не магия, это позиция. Чтобы читать или вмешиваться в разговор, машина атакующего должна физически или логически оказаться на пути, по которому идут пакеты. Он не может дотянуться до TCP-потока с другого конца интернета. Он обязан стать хопом. Всё, что делает атакующий — ARP-спуфинг, rogue DHCP, evil-twin Wi-Fi, DNS-спуфинг, BGP-хайджек — это лишь разные способы ответить на один и тот же вопрос: как заставить пакеты жертвы идти через меня? И всё, что делает защитник, — это обратное: считать путь враждебным и сделать так, чтобы враждебный путь не имел значения.
Как только атакующий удерживает эту позицию, возможны два исхода, и они сильно различаются по тяжести:
- Пассивный перехват (прослушивание): атакующий копирует проходящий трафик. Конфиденциальность потеряна. С открытыми протоколами (HTTP, обычный SMTP, незашифрованные wire-протоколы БД) это сразу отдаёт ему учётные данные и данные.
- Активный перехват (подмена): атакующий изменяет трафик на лету — вставляя, отбрасывая или переписывая сообщения. Теперь потеряна и целостность: он может изменить банковский перевод, внедрить полезную нагрузку в HTTP-ответ или срезать апгрейд безопасности.
Как атакующий попадает на путь: ARP-спуфинг
В типичной коммутируемой LAN самый частый способ попасть на путь — ARP-спуфинг (он же ARP poisoning). ARP — Address Resolution Protocol — это то, как хост в локальной сети сопоставляет IP-адрес с MAC-адресом, чтобы реально собрать кадр для доставки. Фатальное свойство дизайна: в ARP нет аутентификации. Когда хост спрашивает «у кого 192.168.1.1?», ответить может любая машина, и хосты кешируют любой пришедший ответ — даже непрошеный (gratuitous ARP).
Поэтому атакующий, уже находящийся в LAN, шлёт поддельные ARP-ответы: он говорит жертве «MAC шлюза — мой», а шлюзу — «MAC жертвы — мой». Оба кеша теперь указывают на атакующего. Трафик, который должен идти жертва → шлюз, теперь идёт жертва → атакующий → шлюз и обратно. Атакующий пересылает пакеты, чтобы соединение продолжало работать (иначе жертва заметит обрыв), но каждый байт теперь проходит через него. Он стал хопом, не тронув ни единого провода.
Почему TLS это ломает — и как TLS stripping пытается это обойти
Вот свойство, которое решает всё. Правильно применённый TLS даёт три вещи разом: конфиденциальность (атакующий видит шифртекст, а не открытый текст), целостность (любой изменённый байт проваливает тег аутентификации записи, и соединение обрывается) и — самое важное для MITM — аутентификацию сервера. Клиент проверяет сертификат сервера по цепочке доверенного CA и сверяет, что имя совпадает. On-path атакующий может копировать шифртекст сколько угодно, но не может предъявить валидный, доверенный сертификат для bank.example, приватного ключа от которого у него нет. Если он попробует сам терминировать TLS и переустановить его, клиент получит сертификат, не выстраивающийся к доверенному корню, — и выбросит предупреждение. Так что корректное развёртывание TLS превращает идеальную on-path позицию атакующего в бесполезную: он держит провод, но не ключи.
Именно поэтому интересная атака — не взлом TLS, а уклонение от него. TLS stripping (классическая техника «sslstrip») — это активный MITM, удерживающий жертву на открытом HTTP. Пользователь набирает bank.example, и браузер сначала делает HTTP-запрос; настоящий сайт ответил бы редиректом на https://. On-path атакующий перехватывает этот редирект, сам говорит с настоящим сервером по HTTPS, а жертве отдаёт чистый HTTP — переписывая на лету ссылки https:// в http://. Браузер жертвы показывает рабочую страницу без ошибки сертификата, потому что на стороне жертвы нет TLS, на котором могла бы возникнуть ошибка. Сертификат не подделывали; шифрованию просто не дали начаться.
▸Почему это работает
Почему TLS stripping не работает против современного сайта? Потому что защита вынесла решение о доверии с сетевого пути. HSTS (HTTP Strict Transport Security) говорит браузеру через заголовок, который тот запоминает: «для этого домена больше никогда не говори по открытому HTTP — апгрейдись на HTTPS до отправки чего-либо». Как только HSTS закеширован (а лучше — домен в предзагруженном HSTS-списке, поставляемом в самом бинарнике браузера), самый первый запрос уже идёт по HTTPS, так что открытого редиректа для перехвата нет. Вся техника атакующего держалась на существовании этого единственного хопа в открытом виде. HSTS его удаляет.
Как защитник рассуждает обо всём классе
Зрелый ход — перестать думать «может ли кто-то попасть на мой путь?» (в общей LAN, враждебном Wi-Fi или скомпрометированном роутере считайте, что да) и начать думать «что on-path на самом деле даёт?». Если каждый чувствительный канал — это аутентифицированный TLS с целостностью, ответ такой: шифртекст, который не прочитать, и подмена, которая обрывает соединение, а не проходит втихую. Это защита, не зависящая от доверия к сети, — единственный вид, который выживает на враждебном пути. Сетевое усиление (dynamic ARP inspection на коммутаторах, 802.1X, DHCP snooping) поднимает стоимость попадания на путь, но это вторая линия — полезная, но вы никогда не хотите, чтобы ваши конфиденциальность и целостность держались на «чистоте» LAN.
В авторизованном внутреннем пентесте вы заняли on-path позицию через ARP-спуфинг между рабочей станцией и шлюзом. Целевое приложение отдаётся по HTTPS с предзагруженным HSTS. С какого вывода должен начинаться ваш отчёт?
ARP-спуфинг работает из-за какого свойства ARP?
Почему on-path атакующий не может прочитать корректно развёрнутую TLS-сессию даже при идеальной позиции перехвата?
Упорядочьте стадии попытки перехвата «ARP-спуфинг, затем stripping» — от попадания на путь до места, где закалённая защита его ломает:
- 1 Атакующий уже в том же сегменте LAN, что и жертва
- 2 Поддельные ARP-ответы отравляют кеши жертвы и шлюза
- 3 Трафик жертвы перенаправлен через атакующего (on-path)
- 4 Атакующий пробует TLS stripping, чтобы удержать жертву на открытом HTTP
- 5 Предзагруженный HSTS форсирует HTTPS первым — открытого хопа нет; атака проваливается
- 01Объясните, почему атаку «человек посередине» описывают как «позицию, а не силу», и проследите, как ARP-спуфинг эту позицию обеспечивает.
- 02Почему корректно развёрнутый TLS побеждает перехват, от чего пытается уклониться TLS stripping — и как HSTS его закрывает?
Перехват — это позиция, а не сила. «Человек посередине» обязан стать хопом на пути, по которому реально идут пакеты — MITRE относит это к Lateral Movement по этой причине, — и ARP-спуфинг — классический вход: в ARP нет аутентификации, поэтому поддельные ответы отравляют кеши жертвы и шлюза и перенаправляют трафик через атакующего. Оказавшись on-path, он может прослушивать (теряется конфиденциальность) или подменять (теряется целостность). Побеждает это не удержание атакующих вне LAN — считайте, что не выйдет, — а аутентифицированный TLS с целостностью: атакующий получает шифртекст, который не прочитать, а любая подмена обрывает соединение, ведь он не подделает сертификат, ключа от которого у него нет. Поэтому живая техника — TLS stripping, уклонение от TLS удержанием жертвы на открытом HTTP-хопе, — и поэтому предзагруженный HSTS её убивает, форсируя HTTPS первым, так что открытого хопа не существует. В следующий раз, рассуждая о враждебной сети, ваш первый вопрос уже не «может ли кто-то попасть на путь?», а «если попадёт — он получит открытый текст или шифртекст и разорванное соединение?».
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.