Ящик Пандоры: разбираем эксплуатацию уязвимости WinRAR на примере задания NeoQUEST-2019

qubnxgfwaq7yovzl4iv997lmb4o.jpeg


Как часто нам на помощь приходит старый добрый WinRAR! Из раза в раз он заботливо и бескорыстно распаковывает наши архивы, и запаковывает их обратно. Но мы стали старше, и теперь хочется попробовать что-то поинтереснее, правда? А тут как раз нашли 19-летнюю уязвимость, позволяющую сохранять извлеченное из архива вредоносное ПО в произвольное место. Посмотрим, каким образом это можно осуществить, на примере задания №9 из online-этапа NeoQUEST-2019.
По легенде у нас есть два сервера. Первый сервер (http://213.170.100.213:800/) позволяет отправить подарок Пандоре, которая обожает распаковывать все неопознанные предметы, попавшиеся ей на глаза. Формат «подарка» известен: сервер загружает только rar-архивы. Загружаем произвольный rar-архив. В ответ видим следующее:

qiymw3i5kq5_ctj0syemqmd5zdo.png


Пока не очень похоже, чтобы Пандору наш архив заинтересовал. Попробуем узнать чуть больше о сервере с помощью nmap:

e1vb8hxyos7bn9ek3wvwsujcan4.png


Теперь нам известно, что первый сервер:

  • позволяет загружать rar-архивы;
  • поднят на ОС Windows.


Win + rar = WinRar! Вероятно, архивы обрабатываются именно этим архиватором, в котором (точнее — в библиотеке UNACEV2.DLL) нашли уязвимость, существующую уже 19 лет. Эта «дырка» позволяет распаковать содержимое архива в произвольную директорию, независимо от того, куда извлекает файлы пользователь. Находим подробное описание механизма эксплуатации уязвимости здесь. Приступаем к изготовлению архива, который гуляет сам по себе решает сам, куда ему распаковаться.

Первым делом обзаводимся утилитой WinAceArchiver. По инструкции, приведенной по ссылке выше, создаем примитивный архив, содержащий файл hello.txt. В WinAceArchiver нажимаем на кнопку «Create», на вкладке «Options» выставляем «Compression» в значение «Store», затем возвращаемся на вкладку «Selection», выбираем файл hello.txt, указываем путь сохранения нашего архива и — самое главное! — выставляем опцию «store full path»:

1gndj-8msl8xmuzc1r0fzh-cgwa.png


Далее нажимаем на кнопку «Add» и получаем архив Hello.ace. Осталось немного подкорректировать путь и подправить контрольную сумму. В этом нам поможет любой бинарный редактор и скрипт acefile.py, который услужливо сам посчитает актуальные значения.

Чтобы проэксплуатировать уязвимость, необходимо перед абсолютным путем файла добавить метку тома, которая будет отброшена архиватором. Тогда остальной путь будет принят за «безопасный» относительный. Итак, открываем редактор и модифицируем путь таким образом, чтобы он начинался с C:\C:\.

Было:

fn2xvqtmdamayxr_nitrtt_nrdu.png


Стало:

lua0qmuxalmey-s7jglopgqzuk8.png


Теперь сверим контрольные суммы с помощью скрипта acefile.py:

l8xig2pzzgidr4uuor76tlwyera.png


Исправим значение на актуальное:

qrgz5dhz3lo5bnfb52mwq0fyj2m.png


Осталось только переименовать наш архив в Hello.rar. Готово. Проверим, как Пандоре такой подарок?

p_xcem5xsxrdng0r7xg9sahapiw.png


Отлично! Ожидания совпали с действительностью, и WinRar обработал архив именно так, как нам нужно. Осталось выяснить одно: какой именно путь нам необходим?

По легенде мы знаем, что сокровища можно «посмотреть» на втором сервере (http://213.170.100.213:900/). Каким образом это сделать легче всего? Конечно, запустив свой php-скрипт, который произведет, например, листинг корневой директории сервера. Подтверждаем свою догадку:

ktvghquulflkpex7tukpzr0s6-0.png


Прекрасно, сервер готов исполнить наш php-скрипт! Пришло время разбираться, куда именно необходимо этот скрипт положить. Пока мы знаем, что сервер поднят на Windows — следовательно, скорее всего путь начинается с C:\. А дальше? Узнаем немного больше про сервер с сокровищами.

oggo2gsso6jknykjwqoccccbm-m.png


На сервере поднят nginx. Наверняка окружение Пандоры следует последнему слову технического прогресса (во всем, что не касается архиваторов) и использует последнюю версию nginx, то есть 1.15.9 (проверить можно здесь). Осталось добавить рутовую директорию сервера, указанную в дефолтном конфигурационном файле nginx:

z7ls2ezqjeqbe-bev0zjypkc8la.png


Результат выглядит следующим образом: C:\nginx-1.15.9\html. Что ответит Пандора в этот раз?

Доступ к директории запрещен… Но ведь мы не могли ошибиться! Мы точно на верном пути, так как доступ запрещен, но директория-то существует. Вероятно, есть что-то, о чем мы пока не знаем. Продолжим собирать информацию о сервере с помощью сканера директорий:

54-1kyzwef-cl2sgxrpgh4dqlfy.png


Ага, вот оно. Директория admin/ звучит многообещающе. Попробуем отправить Пандоре ace-архив, в котором в роли абсолютного пути выступает C:\nginx-1.15.9\html\admin:

rprhibojzmdln-5gjuxri62s64y.png


Успех! Наконец-то исполняем наш скрипт, в котором осуществляется листинг корневой директории сервера: 213.170.100.213:800/admin/ test34852ED2–8996–4F81-A919–30B6FE9F03AB.php. Скрипт может иметь примерно такой вид:

";
        }
    }
    closedir($handle);
}
?>


Результат выглядит следующим образом:

ft-ymohxr9ufjozlokf3hykcsto.png


Эврика! Пандорика! Аналогичным образом посмотрим, какое «сокровище» таит в себе pandorica/ и увидим долгожданный key.txt, прочитать который уже не составляет никакого труда. Done!

В ближайшем будущем выйдут статьи с разборами оставшихся нескольких заданий. А еще совсем скоро состоится «Очная ставка» NeoQUEST 2019! Все новости — на сайте мероприятия https://neoconf.ru/, не пропустите!

© Habrahabr.ru