1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

cowrie(ハニーポット)をpythonのpandasを使って分析してみた

Last updated at Posted at 2020-12-20

はじめに

今回は,pythonのpandasを使ってハニーポットのログを分析してみたという記事になります.なお,これは個人の遊びになります.

cowrieってなに?

cowrieとは,SSHやTelnetのセキュリティー的脆弱性をあえて作ってクラッカにあえて攻撃をさせるものです.(低対話側パニーポット)
導入記事は前記事にありますのでもしよろしければご覧ください.
https://qiita.com/asmg07/items/73808eee7c960707da2b

分析する前段階(jaonログについて)

ログを分析する前にログの中身について理解する必要があります.
ここでは,全てではなくとりあえず必要なものだけをピックアップして
紹介します.

eventidの種類について(自分が分析する上で使ったもののみを紹介)

eventid 意味
cowrie.login.success ログインに成功した
cowrie.login.failed ログインに失敗した
cowrie.command.input コマンド実行に成功した
cowrie.command.failed コマンド実行に失敗した
参考サイト

pandasを使って実際にログの分析

前置き

環境は,vscodeにjupterのプラグインを導入してvscode上に対話型でプログラムを実行しています.
####①全体像の把握

#2020-12-13 cowrieログ分析について
import pandas as pd #ライブラリのインポート
import datetime #ライブラリのインポート
fname = 'cowrie.json' #ファイルの読み込み
access = pd.read_json(fname,lines=True) #pandasに通す
df=pd.DataFrame(access)
df['timestamp']=pd.to_datetime(df['timestamp'])#timeを時間形式に変換
df #表示

実行結果
スクリーンショット 2020-12-20 21.42.02.png

②取りたいデータごとに分析を開始

(1)アクセスに成功しているログを抽出

#ログインに成功したログの抽出
df2=df.query('eventid == "cowrie.login.success"') #cowrie.login.successのログのみを抽出
print("ログイン成功回数:"+str(len(df2))) #行数を表示(行数=ログインに成功した数)
password=df2['password'].value_counts() #どのパスワードでログインしているかを可視化
password1=df2['password'].value_counts(normalize=True) #最頻値を可視化
print(password)
print("パスワード頻度")
print(password1)

実行結果(一部抜粋)
スクリーンショット 2020-12-20 21.50.54.png
スクリーンショット 2020-12-20 21.51.28.png
※IDに関しては,初期設定でrootやadminなどのデフォルト名でログインされることを想定しています.
(1)アクセスに成功しているログを抽出
※IDに関しては,初期設定でrootやadminなどのデフォルト名でログインされることを想定しています.

#ログインに成功したログの抽出
df2=df.query('eventid == "cowrie.login.success"') #cowrie.login.successのログのみを抽出
print("ログイン成功回数:"+str(len(df2))) #行数を表示(行数=ログインに成功した数)
password=df2['password'].value_counts() #どのパスワードでログインしているかを可視化
password1=df2['password'].value_counts(normalize=True) #最頻値を可視化
print(password)
print("パスワード頻度")
print(password1)

実行結果(一部抜粋)
スクリーンショット 2020-12-20 21.50.54.png
スクリーンショット 2020-12-20 21.51.28.png

(2)アクセスに失敗しているログを抽出

#ログインに失敗したログの抽出
df2=df.query('eventid == "cowrie.login.failed"')
print("ログイン失敗回数:"+str(len(df2)))
nopassword=df2['password'].value_counts()
nopassword1=df2['password'].value_counts(normalize=True)
print(nopassword)
print("パスワード頻度")
print(nopassword1)

実行結果(一部抜粋)
スクリーンショット 2020-12-20 21.55.22.png
スクリーンショット 2020-12-20 21.56.24.png

(3)実行されているコマンドを抽出する

#実行に成功したコマンド
df1=df.query('eventid == "cowrie.command.input"')
print(df1['input'])

実行結果
スクリーンショット 2020-12-20 21.58.09.png

まとめと考察

まとめ:
今まで,pythonを使ったcowrieのログ分析の記事があまりネット上になかったので実際にやってみて記事にしてみました.
考察:
①サーバのIDをデフォルトのrootやadminを使うのは絶対にやめましょう
・実際に今回アクセス自体は,失敗,成功合わせて1日で22,111回アクセスされていることがわかります.port22番でrootやadminのIDをそのまま使うということはそれだけで攻撃の標的にされやすいということがわかります.
②簡単なパスワードの設定はとても危険です
・今回抽出したパスワードも比較的簡単なパスワードを入力してログインされていることがわかります!危険なのでやめましょう.
また,ネットの記事を見てサーバやシステムを導入する際になにも考えずに導入してしまうと標的にされてサーバに簡単にアクセスされてしまう危険があることを認識しましょう.
今回は失敗していますが,自作iotを比較的簡単に作れるラズパイは攻撃の標的にされやすいというのがログインに失敗しているパスワードをみて一目瞭然でわかります.
③実行されているコマンドを見て...
今回のログでは,全てを表示していませんが,何かをダウンロードしているのがわかります.これもしかするとマルウェアかも...

最後に

今回は簡単なログの分析に留まりましたが,持続的に分析できるツールを今後作れればいいなと思っています.
ありがとうございました.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?