Brobot & Klynt
Привет, Клинт, ты когда-нибудь копался в странностях старого протокола Telnet? Говорят, в нём ещё остались интересные баги, которые могут много рассказать о том, как в ранних сетях решали вопросы безопасности. Хотелось бы узнать твоё мнение на этот счёт.
Привет, слушай, Telnet – это просто кладбище протоколов, и его особенности вызывают у меня мурашки по спине. Самое очевидное – передача паролей в открытом виде, вопиющая ошибка, которую когда-то терпели, потому что интернет тогда был закрытой детской площадкой. Но настоящие проблемы в том, как он договаривается об опциях. IAC, DO, DONT, WILL, WON’T – все это пляшет в каком-то бесконечном цикле, который можно использовать, чтобы злоумышленник перехватил сессию или завалил клиента мусором. Еще и факт, что некоторые реализации неправильно обрабатывали байт IAC, и один-единственный "255" мог сломать логику парсинга у клиента. И не говори мне про отсутствие аутентификации и сколько систем оставили Telnet слушать на стандартном порту без файрвола – кошмар современного разработчика. Короче говоря, каждая строчка кода Telnet – это урок того, что делать *нельзя*, и мне нравится разбираться, откуда все эти нарывы взялись.
Ого, ты глубоко нырнул в внутренности Telnet! Мне нравится, как ты находишь в каждой недоработке урок — почти как поиски сокровищ, только в плане безопасности. С каким багом тебе интереснее всего экспериментировать, или, может, какой-то конкретный урок он преподал современным протоколам?
Всякий раз возвращаюсь к этой ошибке с IAC-эскейпом. Она самая простая для воспроизведения: отправляешь "сырую" 255-ю, а клиент принимает это за команду. И тут можно уже что угодно вставить или даже менять настройки на ходу. Это заставило нас понять, что даже один байт может стать точкой атаки. Современные протоколы решают это либо экранированием, либо вообще не отправляют сырые данные. Вывод? Относись к протоколу как к могиле: не оставляй ни одной лазейки, через которую любопытный сможет пробраться.
Ну, это же классика! Удивительно, как один байт может открыть столько возможностей. Заставляет по-новому взглянуть на все эти обходные пути и шифрование, которые мы сейчас используем. Давай, есть какие-нибудь интересные эксперименты или проекты, где ты применяешь этот опыт на практике?
Сейчас немного играюсь с песочницей – запустил старый Telnet-сервер в виртуальной машине с минималистичным клиентом, к которому можно подключить скрипт. Я подсовываю ему случайные последовательности IAC и наблюдаю, как клиент падает или неправильно интерпретирует опции. Это как путешествие во времени, наблюдаешь, как ранние разработчики упускали этот единственный escape-байт. Параллельно веду список последних C-библиотек, которые ещё компилируются, просто чтобы проверить, как они обрабатывают 255, и журнал всех перехваченных опционных переговоров. Вся суть в том, чтобы помнить, что один байт может стать проходной дверью, и чтобы не забывать об этом уроке, когда берусь за любой новый протокол.
Звучит как что-то из прошлого, но с современным взглядом – здорово, что тебе интересно! Как продвигается работа над отчетом? Наткнулся на что-нибудь интересное в старых архивах? Отлично! Очень интересно узнать, какие странности ты выудил. Были какие-нибудь забавные истории, из-за которых клиент пришел в восторг?
Журнал забит полусобранными запросами, которые в итоге включают клиента в режим отладки, где на экран выводится каждый символ. Однажды я отправил строку из 255 нулей, и клиент начал выдавать "DO" и "WILL", как будто это чат-бот. Экран заполнился "DO 0", "WILL 1" бесконечно, пока весь терминал не завис. Пришлось перезагружать ВМ, чтобы вернуть всё в нормальное состояние. Вот к чему приводит такая нестабильность старой логики парсинга.