【フォレンジック】 apache アクセスログから攻撃の痕跡を探ってみた
こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。
Web アプリケーションへの攻撃は終わりがありません。外部公開している間はありえるものとして対策を続けていかなければなりません。
防ぐということが前提にあるとして、それでも防御をすり抜けてしまうことはゼロにはできません。
攻撃を受けたらしいと判明した際にログから痕跡を探る方法を調べてみました。今回は httpd(apache) のアクセスログが対象です。
ウェブサイトの攻撃兆候検出ツール iLogScanner
IPA が公開しているツール iLogScanner を使います。
IPA サイトから引用するかたちでツールの紹介をします。
iLogScannerは、ウェブサーバのアクセスログから攻撃と思われる痕跡を検出するためのツールです。 ウェブサイトのログを解析することで攻撃の痕跡を確認でき、一部の痕跡については攻撃が成功した可能性を確認できます。また、SSHやFTPサーバのログに対しても、攻撃と思われる痕跡を検出することができます。
ログの解析に加えて、一部の痕跡については成功の可能性まで判断してくれる優れたツールです。
iLogScanner の実行
ダウンロード
ウェブサイトの攻撃兆候検出ツール iLogScanner 概要 にある利用許諾に同意したうえで、ZIP ファイルをダウンロードします。
執筆日時点では、対応OS が Windows 10/11、Linux になっています。OpenJDK 11 以上が必要です。
実行
それでは実行します。その前に JAVA ヒープを設定します。デフォルトヒープサイズは 64MBとのことです。大量のログを処理する場合は増やしましょう。下の例では 1GB にしています。
ZIP ファイルを解凍したなかに 1_bin/iLogScanner.sh
があります。そこに1行追記します。
export JAVA_TOOL_OPTIONS="-Xms1g -Xmx1g" # この行を追加
java -classpath $CP $MAIN_CLASS $@
exit $?
iLogScanner.sh にオプションを与えて実行します。
オプション | 指定値 | 説明 |
---|---|---|
mode | gui / cui | 今回はコマンド実行したいので cui を指定 |
logtype | apache / iis / iis_w3c / ssh / vsftpd / wu-ftpd | apache が対象なので apache |
accesslog | アクセスログファイル名 | フルパスで指定 |
outdir | レポートの出力先ディレクトリ | フルパスで指定 |
reporttye | html / text / xml / all | レポートの形式、みやすい形式で |
他のオプションや詳しい説明、最新情報は ウェブサイトの攻撃兆候検出ツール iLogScanner 概要 を参照ください。
$ iLogScanner/1_bin/iLogScanner.sh mode=cui logtype=apache accesslog=~/workdir/accesslog/access.log outdir=~/workdir/output reporttype=text
レポート
暫く待つとレポートが生成されます。オプションの outdir
で指定したディレクトリに保管されています。
以下は出力例です。一部省略したり表示を隠しています。ご了承ください。
表が判りやすいです。SQLインジェクション、OSコマンドインジェクション、ディレクトリトラバーサル、クロスサイトスクリプティングは0件でした。安心。
その他は668件検出されています。このログは10,000行だったのでそこそこの件数です。
下段には解析結果が表示されています。該当行数をログ内容、攻撃成功可能性がリストされています。攻撃成功が高い = ● のログが無かったのでこちらも安心ですが、668件は対応を検討することにします。
iLogScanner - 解析結果レポート
解析結果
■終了ステータス:完了
■解析日時:2023/08/10 04:00
■解析対象ファイル:access.log
■解析指定日付: -
■解析対象日付: -
■解析レベル:標準
■検出数: 計 668 件
検出したWebサイトへの攻撃について、下記に詳細を記述します。
検出対象脆弱性 攻撃があったと思われる件数 攻撃が成功した可能性の高い件数
--------------------------------------------------------------------------------------------------------------
SQLインジェクション 0 0
--------------------------------------------------------------------------------------------------------------
OSコマンドインジェクション 0 -
--------------------------------------------------------------------------------------------------------------
ディレクトリトラバーサル 0 -
--------------------------------------------------------------------------------------------------------------
クロスサイトスクリプティング 0 -
--------------------------------------------------------------------------------------------------------------
その他 668 -
--------------------------------------------------------------------------------------------------------------
〜〜〜中略〜〜〜
解析結果ログ
#解析結果ログの見方
#----------------------------------------------------------------
#[ログファイル名]
#[行番号] [脆弱性種別] [攻撃が成功した可能性が高い] [該当するアクセスログ] [シグネチャ対応コード]
#----------------------------------------------------------------
#※ 各項目はタブ区切りになります
#※ 攻撃が成功した可能性が高い場合、「●」がつきます
#以下、解析結果ログ
access.log
44 その他 - アクセスログの内容がここに表示されます。
SQLインジェクション検出
2023/08/14 追記
SQL インジェクションを強引に検出してみました。
アプリケーションに対してありがちなインジェクションクエリを投げます。
# ') or ('1'='1-- をエンコードして GET
$ curl "http://localhost/get.php?id=%27%29+or+%28%271%27%3D%271--"
iLogScanner で検出するときちんと SQL インジェクションが検出されていました。
access_log
16 SQLインジェクション - 127.0.0.1 - - [14/Aug/2023:05:35:26 +0000] "GET /get.php?id=%27%29+or+%28%271%27%3D%271-- HTTP/1.1" 200 - "-" "curl/8.0.1" A999
まとめ
iLogScanner 作成者に対して感謝と尊敬の意を送りたいと思います。
アクセスログに対して攻撃らしい文字列で grep かける作業は避けたいと感じていました。iLogScanner のようなツールを使うとセキュリティ専門家のナレッジを借りつつフォレンジック調査が捗ります。
他に類似ツールがあるか探してみたいと思います。
Discussion