Принцип адресации в интернет и взлом на его основе


Макаров Тихон

подмена DNSПоскольку для того чтобы запоминать IP-адреса компьютеров сети, надо тратить много усилий, были созданы домены. Но передавать адреса доменов нельзя. Итак, нужно где-то хранить список IP-адресов и их доменов, чтобы легко можно было обратиться к какому-то компьютеру. Если на каждом компьютере хранить такой список, то понадобилось бы с десяток гигабайт места. Тогда была создана служба DNS. У нас на компьютере хранится IP-адрес компьютера под названием "." Когда мы обращаемся какому-то компьютеру, мы отсылаем на этот "сервер интернет" запрос с доменом нашего компьютера в поле данных. Он получает наш запрос, отсылает наш запрос на сервер, содержащий адреса второго домена, находящиеся в том же домене первого уровня, что и затребованный нами. Тот связывается с интересующим нас компьютером и дает ему адрес следующего компьютера цепи. Такая цепь передач нашего запроса будет происходить пока он не дойдет до интересующего нас компьютера. Этот компьютер отправит нам ответ, что получил наш запрос. После чего наш компьютер кэширует полученные данные "Домен-его IP", чтобы в следующий раз не проводить опять такую цепочку запросов. Однако помимо DNS еще до сих пор есть файл hosts, в который можно сделать такую же запись. При обращении к какому-то компьютеру, наш компьютер будет искать запись сначала в этом файле, потом в кэше, а потом будет посылать такой запрос.

Итак, теперь, зная принцип адресации в интернет, можно легко придумать несколько способов взлома. Первый и самый простой: надо подменить на каком-то компьютере такую запись. Например: www.mail.ru-178.56.58.19, где 178.56.58.19 - IP адрес злоумышленника. Теперь злоумышленнику достаточно поставить себе на компьютер веб-сервер и создать сайт, похожий на mail.ru. После чего ему просто останется собирать пароли. Однако как это сделать? Если злоумышленник взломает компьютер, ему легко будет добавить такую запись. Но для этого надо сначала взломать! А это не всегда легко. Был придуман другой способ подмены: компьютер 1 посылает запрос компьютеру 2, который передается через компьютер 3. Тогда компьютер 3 может этот запрос не отсылать компьютеру 2, а компьютеру 1 передать ответ от лица компьютера 3, что получил запрос компьютера 1 на соединение и готов его провести. После этого компьютер 3 сможет оборвать соединение, ведь компьютер 1 уже закэширует домен компьютера 2 с IP компьютера 3. Итак, небезопасность этого очевидна.

Однако что если компьютер 3 не находится на пути передачи пакета? Тогда компьютер 3 должен угадать данные запроса от компьютера 1 к компьютеру 3, а так же время, когда произошел этот запрос. Угадать это все невозможно. Есть одно решение: нужно отправить ответ от компьютера 3 на компьютер 1 на запрос компьютера 1 компьютеру 2, который компьютер 1 на самом деле не отправлял. Тогда компьютер 1 опять же закэширует фальсифицированные данные. Однако есть одна небольшая проблема: если компьютер один запоминает запросы, которые он отправлял и следит, чтобы ответ приходил только от компьютера, запрос которому он отправлял. Такое решение называется запретом рекурсивных запросов и выполняется в настройках Bind (пользовательский интерфейс для DNS):

recursion no; // запрет рекурсивных запросов для всех адресов
allow-recursion {198.155.12.13}; // разрешение рекурсивных запросов компьютеру
198.155.12.13 fetch-glue no; // при некоторых запросах наш компьютер сам может начать
// рекурсивный запрос, что запрещает наличие данного параметра
use-id-pool yes // параметры типа ID-DNS выбираются случайным образом,
// что повышает безопасность (относительно угадывания
// передаваемых параметров)

И здесь была найдена щель. DNS-преобразование: необходимо заставить интересующий нас сервер отправить запрос на поддомен ns (ns.example.ru). Интернет-сервисы, получая запрос на соединение, проводят такое преобразование, то есть запрашивают доменное имя для IP-адреса отправителя, а потом запрашивают IP-адрес для полученного доменного имени. Именно второй запрос и создает брешь. 3-ий компьютер должен всего лишь отправить запрос от имени компьютера 2 (с настоящим его IP адресом) на какой-нибудь сервер компьютера 1, производящий такое преобразование. Найти такую службу не так уж и сложно, обычно достаточно всего лишь прочесть ее ответ при соединении. Однако это еще не все. После этого компьютер-жертва отошлет ответ по тому адресу, что был указан (компьютера 2), а мы должны отослать ему ответ. Надо узнать параметры, которые передаст компьютер-жертва в своем запросе. Это достаточно сложно. Для этого предварительно надо попытаться связаться с компьютером-жертвой, исследовать его поведение, узнать с какого порта он отправляет ответы и многое др.

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

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

Только помните, что вряд ли найдется хоть 0,01% пользователей Рунета, пользующихся ею. Если Вы не хотите быть взломанным злоумышленником, надо входить в число этих пользователей.