Cowrieのログをハッシュ化して管理する

2018年3月30日

ハニーポットを運用している中で,ハニーポットならではの壁というかハードルを感じることがあります.ハニーポットに興味はあるけど運用していないという人が多い理由に,少なからずこのハードルが関係しているのではないかと感じています.

おそらく誰もが最初にぶつかるであろうハードルはハニーポットの構築の難しさだと思います.ハニーポットは様々な環境やライブラリに依存していることが多く,ドキュメントも大半が英語のため慣れるまでは構築に手間がかかりました.私はこの構築のハードルを乗り越えた後に,さらに大きなハードルを感じました.

そのハードルとは圧倒的なログの分量です.せっかくハニーポットの導入に成功し貴重なログを収集し始めたのに,そのログの量が多すぎて何から目を通せばいいのかわからず,ログの分析をせずに放置してしまうといった状態に陥りました.もちろん統計的なデータを出力することで,どの国からの攻撃が多いのかといったことや,どのサービスに対する攻撃が多いのかといったことが分かるだけでも勉強にはなりましたが,せっかく生のログに実際の攻撃手法が記されているのにそれを分析しないのはもったいないですよね.

そこで先人ハニーポッターの方に相談したところ,Cowrieのようにログの量が多いハニーポットにおいてどのようなログを優先して見るべきか,どのように取捨選択を行うといいのかといったことについてアドバイスをいただきました.今回はその手法を実際に導入したので,その方法の解説と考察を行いたいと思います.

具体的なことは以下の発表資料に載っています.今回はこの方法を参考に自分の環境に置き換えて導入しました.

目を通すべきログの優先度

まずどのようなログを分析すべきなのか,その優先度についてです.もしもログ分析が業務であれば,定められたすべてのログに目を通す必要があります.個人のハニーポットのログであってもすべてのログを分析することができればそれが一番理想的ではあるのですが,Cowrieのようなハニーポットはログの量が多く私の場合は現実的ではありませんでした.

そこで目を通すべきログの優先度を設けることにしました.

優先的に目を通すべきログ

  • まだ見たことがない攻撃
  • 人間の手によって行われた攻撃

時間に余裕があるときに見るログ

  • 過去に分析を行ったことがある攻撃
  • Botによって行われた攻撃

この基準を元に,最低限優先度の高いログのチェックは行うようにしたいと思います.

ログのハッシュ値による管理

では具体的にどのように優先度の高いログと低いログに分けるのかということについてです.今回はセッションごとの一連の攻撃コマンドを連結して,ハッシュ化して管理するという手法を用いたいと思います.これによりまだ見たことのないユニークな攻撃手法だけを抜き出してチェックすることができます.

ちなみに上記に示す参考資料では,攻撃ログのハッシュ値が2つ以上存在するものをBotによる攻撃と判断し取捨選択していましたが,私はBotによる攻撃であっても過去に分析したことがない場合はチェックしておきたかったので,2回以上同様の攻撃が存在していても一度はチェックするようにしています.

セッションごとに攻撃コマンドの連結

まずはCowrieのjsonログから,jqコマンドを用いてセッションごとに攻撃コマンドを抜き出します.jqコマンドがインストールされていない場合はインストールを行ってください.

$ sudo yum install epel-release
$ sudo yum install jq
$ cat cowrie.json.20XX-XX-XX | jq .session | sort | uniq
"01122cf986ee"
"0123c7d9e4b3"
"01bfa773abac"
"022861d5613e"
"025c6f5397c6"
【省略】

$ cat cowrie.json.20XX-XX-XX | jq -r "select((.session == "01122cf986ee") and (.eventid == "cowrie.command.input")) | .input" > command.txt

コマンドのハッシュ化

コマンドのハッシュ化は以下のように行います.

$ cat command.txt | md5sum | sed -e 's/  -//g'
58b1e43c10def44f14dff6762771f35a

これらの手法を元にして,セッション別攻撃コマンドを記録したファイルを網羅的に作成し,そのファイル名をコマンドに基づくハッシュ値とすることで,ユニークな攻撃手法として記録していくことができます.

ハッシュ値による管理を行うシェルスクリプト

$ vim /home/cowrie/cowrie/bin/cowrie-hash.sh
#!/bin/bash

# Argument arror checking.
if [ ! "$#" -eq "1" ]; then
        echo "Error, Please designate a date."
        exit 2
fi

# Variable definition.
DATE=$1
SH_PATH='/home/cowrie/cowrie/bin/'
DATA_PATH='/home/cowrie/data/'
JSON_PATH='/home/cowrie/cowrie/log/'

# Attack techniques analysis.
SESSIONS=`cat ${JSON_PATH}cowrie.json.${DATE} | jq .session | sort | uniq`
while read x; do
        cat ${JSON_PATH}cowrie.json.${YESTERDAY} | grep "${x}" > ${SH_PATH}tmp.txt
        DATA=`cat ${JSON_PATH}cowrie.json.${DATE} | jq -r "select(.eventid == \"cowrie.command.input\") | .input"`
        HASH=`echo ${DATA} | md5sum | sed -e 's/  -//g'`
        cat ${DATA_PATH}cowrie-hash.json | grep "${HASH}" > /dev/null 2>&1
        if [ ! $? = 0 ]; then
                echo "{\"hash\": \"${HASH}\", \"type\": \"unknown\", \"check\": false}" >> ${DATA_PATH}cowrie-hash.json
                echo "${DATA}" > "${DATA_PATH}${HASH}.txt"
        fi
done <<END
${SESSIONS}
END

rm ${SH_PATH}tmp.txt

exit 0

$ chmod 744 /home/cowrie/cowrie/bin/cowrie-hash.sh

生成されるcowrie-hash.jsonファイルにはハッシュ値,タイプ,チェックフラグの3つの値を持ったjson形式のハッシュ値一覧表が保存されます.まだ改善の余地はありますが,攻撃コマンドについて分析を行ったらチェックフラグをtrueにしたり,攻撃の内容がmiraiだったらタイプをmiraiにするなど管理を行うことで分析に活かせればいいな~と考えています.

ハッシュ値による管理の考察

3/23~3/25の3日間においてこの手法を試した結果,総セッション数9,751回に対して攻撃パターンは362パターンでした.この時点で約96%のログを削減することができました.このことからこの手法で攻撃パターンを管理することで,ログを分析する時間を大きく減らすことができると考えられます.実際にこの3日間は短時間ですべての攻撃パターンに目を通すことができました.

今のところ1日あたり120件ほど新しい攻撃手法を観測しています.しかしこのほとんどがBotによる攻撃で,ある一部分の文字列がランダムに生成されていることからハッシュ値が異なり,別の攻撃手法と判定されているものです.

この中からさらにBotの特徴を持つ攻撃パターンを省くことで,人間による攻撃や新しい攻撃をいち早く見つけることができそうです.

おわりに

今回はハニーポットで観測した攻撃手法をハッシュ化し管理することで,ログ分析時間の短縮を行いました.

ハニーポットのログは様々な情報が記録されるため,色々なアプローチができるところが非常に楽しいです.今回行ったように攻撃内容に焦点を当てることで攻撃者の攻撃手法を知ることができますし,以前行ったようにELKを用いて可視化することで攻撃元の国の変化や,時間経過による攻撃の変化を分析することもできます.

まだまだ色々なアプリーチでハニーポットのログ分析を行っていきたいです^^v

参考文献

https://speakerdeck.com/morihi_soc/hanihotutototiyurinkutesuto