MS11-083: Страшная Правда

Ты рассказал мне просто Правду
А я Ужасную хочу
Такую, чтобы обосраться
Завыть, забиться, захрипеть
(ц) http://www.perashki.ru/piro/23274/

Буйство ламеров-паникёров на тему закрытой 8го ноября ошибки в сетевом стеке Windows выглядит достаточно утомительным, а ещё утомительнее — тщательно объяснять каждому, почему буйствовать необязательно. Более того, иногда попадаются исключительные бараны вида

Что бы ты не написал, я зажмурюсь и заплАчу, я не буду читать, весь Microsoft похакали и точка!

Как понятно, среди интеллектуальных меньшинств, в которых очень распространено Microsoft-хейтерство, наблюдается просто-таки эпидемия.

Мы вчера с хакером Васькой 150 серваков ломанули эксплойтом. Валятся как спелая картошка

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

Особенно доставил такой вот «пруф»:

http://www.youtube.com/watch?v=4aBE6o0oDlo

Эксплойт с орфографическими ошибками (там Unknow вместо Unknown) — это прекрасно.

Приступим к разбору Страшной Правды. В финале Вы сами поймёте, почему я вынес в заголовок именно такой стишок.

1. Целевой сервис

Уязвимости подвержены системы, на которых есть NDIS 6.0 и выше. Это Windows Vista/2008/Seven/2008R2/8 всех редакций. Плюс это Win7 Embedded. Всё то, что раньше — не подвержено. То есть этой уязвимости нет для пользователей XP, 2003, устройств на WinCE не-последней версии и прочих. Совсем нет. У них другая версия сетевой подсистемы.

Промежуточный итог: Уязвимости были подвержены только ОС начиная с Windows Vista и до Windows 8.

2. Firewall’ы и MS11-083

Уязвимость не блокируется встроенным Windows Advanced Firewall. Причина проста — уязвим механизм подсчёта входящих UDP-датаграмм, он работает до advfw. Стоит заметить, что у ISA Server 200x / TMG 2010 таких проблем нет — у них своя реализация firewall, для систем, закрытых ими, уязвимость так же не реализуема.

Промежуточный итог: Уязвимости были подвержены только ОС начиная с Windows Vista и до Windows 8, которые смотрят в публичные сети «напрямую», без firewall. В случае корпоративных сетей с edge-решениями от Microsoft (ISA Server, TMG) уязвимость не реализуема.

3. Настройки Firewall, необходимые для эксплуатации уязвимости

Необходимо иметь явное _закрывающее_ правило на атакуемом порту. То есть порт должен быть не просто «не открыт», а явно закрыт на Windows Advanced Firewall. Теперь вспомним, что уязвимость работает только для UDP. Откройте свой Windows Advanced Firewall и посмотрите, сколько у Вас там правил, явно закрывающих UDP-порты. Не нашли? Это нормально. Потому что их там обычно нет.

Промежуточный итог: Уязвимости были подвержены только ОС начиная с Windows Vista и до Windows 8, которые смотрят в публичные сети «напрямую», без firewall. В случае корпоративных сетей с edge-решениями от Microsoft (ISA Server, TMG) уязвимость не реализуема. Целевая система должна иметь правило в Windows Advanced Firewall, которое явно закрывает UDP-трафик на конкретный порт.

4. Сам процесс работы эксплойта

Необходимо отправить 2^32 (это 4,294,967,296) UDP-пакетов на целевой порт, принимая после каждого ICMP-ответ «ICMP Destination Unreachable». Суть в том, что именно генерация 2^32 этих ответов и переведёт систему в уязвимое состояние.

Тонкость в следующем. Система будет уязвима только в этот момент, потом счётчик пойдёт дальше. То есть образуются некие условия, делающие задачу не затруднительной а, говоря проще, не реализуемой вообще в не-лабораторных условиях. Полностью это будет выглядеть так:

1. Необходимо взять удалённый узел, подпадающий под указанные выше критерии. Если взять не ту ОС — не сработает.
2. Узел должен смотреть в Интернет напрямую и иметь в настройках локального advfw запрещающее правило на конкретном UDP-порту. Как Вы вычислите, что это правило у него есть, и на каком порту — Ваши проблемы.
3. Вам надо послать ему примерно 4 миллиарда 300 миллионов UDP-пакетов, и читать его ICMP-ответы.
3.1. Если Вы пошлёте на 1 пакет больше или меньше — Вы не сможете эксплуатировать уязвимость.
3.2. Если кто-то другой пошлёт на него хотя бы 1 любой пакет, на который узлу надо будет ответить ICMP Destination Unreachable — Вы в пролёте, счётчик-то Вами уже не предсказуем, запросить его значение Вы не можете.
3.3. За это время узел не должен делать никаких манипуляций с сетевым интерфейсом (допустим, включать его или выключать), либо перезагружаться — счётчик опять обнулится.
3.4. До начала Вашей операции узел также не должен отправить ни один ICMP Destination Unreachable, потому что всё строится на предположении, что счётчик стартует с нуля.

Правда несложно? Давайте похрустим числами. Допустим, что атакуемый узел подключен к Интернет по всем упомянутым условиям, плюс у него, ну, к примеру, запущен локальный DNS-сервер и закрыт 53й UDP-порт (я беру DNS для примера, как известный UDP-сервис). Ну вот мазохисты там живут — подняли сервис и явно закрыли его через встроенный firewall. Допустим, Вы это угадали — ну, что там 53 UDP явно закрытый есть. Тогда считаем размеры. Вам надо отправить UDP-датаграммы, допустим они пустые (я даже не буду стебаться на тему того, что сделает любая IDS/IPS система, ну или провайдер, увидев 4 миллиарда пустых UDP-пакетов на один порт одного хоста, но не суть). Считаем — заголовок+crc от 802.3 (это 18 байт), заголовок IP (допустим, 20, берем всё по минимуму), заголовок UDP (всегда 8), в сумме имеем 46 байт. Умножаем на 2^32, имеем число 197,568,495,616. И я не считал ещё размер обратных ответов ICMP, которые Вы должны получать и проверять, иначе Вы не поймёте, что атака вообще идёт.

Итоговая схема «эксплуатации уязвимости» прекрасна. Надо найти, короче, непропатченый (патч-то неделю как вышел) Windows Server 2008 или 2008R2. Он должен глядеть в Интернет напрямую, на нём надо иметь UDP-сервис, и этот сервис должен быть явно закрыт правилом, и Вы должны знать номер этого порта.

Если собираетесь «наощупь перебором» — ха, нет ничего проще! Каждые 5 портов перебрать обойдётся Вам в терабайт трафика. Можете посчитать масштабы работы для перебора всех возможных UDP-портов на атакуемой системе.

Теперь можете приступать. Не забудьте, что если кто-то пошлёт хотя бы 1 лишний пакет — всё напрасно. Вы действуете из предположения, что знаете стартовое значение счётчика. Если целевой хост перезагрузится — тоже ничего не выйдет. Рестартанёт сетевой сервис (например, тот же Windows Advanced Firewall) — тоже.

Как понятно, не-лабораторная эксплуатация данной уязвимости — на грани фантастики. Фирма Microsoft подстраховывается, назначая этой уязвимости Critical. А допустим по критериям RedHat это вообще не уязвимость, если что. Наверное, поэтому сеть RedHat успешно ломали, а Microsoft — нет. Поэтому если Вы видите хакиров-теоретиков, рассказывающих о триллионах ломаных ими серваков, Вы можете быть уверены — они банально неграмотны в сетевых вопросах (у фанатиков СПО уровень грамотности в сетевых технологиях обычно удручающе низок) и врут. То, что выложено как PoC, даже в лабораторных условиях требует примерно 52 суток (почти 2 месяца) непрерывной работы, и это при учёте того, что никаких других хостов нет.

Абсолютно всегда не слушайте истерящих дураков, а старайтесь детально изучить матчасть. IT — это наука, а не религия.

Удачи.

Реклама
MS11-083: Страшная Правда

MS11-083: Страшная Правда: 6 комментариев

  1. Да оно всегда так. Чуть что — сразу вопли, что мол решето. Что нас всех поимели и т.п. А разобраться даже не лень, а кишка тонка. В момент когда я узнал про эту дырку, WSUS уже накатил фикс всем. При том что сеть за аппартаным маршрутизатором/фаерволом, периметром и TMG. А паники вокруг….

    Общался тут с человеком, которму их IT-шники доказывали, что фикс нужно срочно обморочно ставить (и это правильно). Но обоснование просто убило. «Хоть шлюз у нас и на FreeBSD, но через эту дырку можно легко «поиметь» любую машину внутри сети, ДАЖЕ ЗА NATом.» Допустим я тоже не знал, что для работы уязвимости нужно запрещающее правило и 4 миллиарда пакетов, но ляпнуть такую глупость — это надо постараться. Кстати эти люди «охраняют» данные, среди которых есть самая что ни на есть настоящая государственная тайна.

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

  2. xentronium:

    Как я понимаю, там образуется stale pointer при переполнении счетчика на 2^32, который продолжает использоваться между моментом получения 2^32 и пересозданием новой структуры. Соответственно, время может быть как и ноль, так и чуть больше ноля.

    Я не вижу, как это заабузить.

      1. Безусловно. Но подано было как пруф, что вызвало подозрение в адекватности утверждающего.

  3. Спасибо за детальный рассказ. Я хоть и не адепт СПО, но наличие уязвимости вызвало у меня неприятные эмоции, а разбираться так детально в каждой нет времени и желания.

    1. Пожалуйста. Я просто когда раз в 5й начал с нуля объяснять, что апокалипсиса не будет, плюнул и решил написать тут, чтобы просто давать ссылку.

Обсуждение закрыто.