セキュリティ雑記

自分が勉強したものと実際にやってみたものの記録です。こんなものでも誰かの参考になれば嬉しいです。

ログ分析で使うLinux関連コマンドについて

現在ハニーポットを運用してログをみたりして色々調べたりしております。
んで、なるべくKibanaのWebコンソールに頼らずにログファイルをみているのですが、やっぱりかなりみにくいですね。
JSONだと、まぁ見やすいといえば見やすいですが。。。

というわけで、あまり業務としてもやっていないログ分析を行う上でのログ整形技術を身につけるべく、Linuxのコマンド(おもにawk)との戦闘を開始しました。

ログ分析で主に使用するコマンドとオプション

まずは、ログ分析で活用されるコマンドをまとめてみようと思います。

  • awk(テキスト処理に強いプログラミング言語、ではあるがまぁシェル芸人御用達コマンドですね)
  • sed, tr(文字列置換)
  • grep(文字列探索)
  • sort, uniq(出力の整形)
  • jq(女子クォー生コマンド by USP友の会)


基本的に、bashなどのシェルで使われるコマンドとawkがあればたいていのことはできると思います。
ただ、他のコマンドを使ってやるとその方が加工が早くなるなどのメリットがあるので、使い分けは必要かと。
また、jqはJSONファイルを対象としているコマンドとなります。デフォルトでは入っていないので別途インストールが必要になります。

とまぁ、こんな感じですが、私自身もコマンドを使いこなせているかと言われれば全くと胸を張って言えてしまうため、まずはawkの基本を覚えようかと。

awkの基本

一番今後使っていくであろうコマンドについて。
まずはコマンドの基本形をちゃんと覚えておきましょう。

awk 'pattern {action} pattern {action} ......'
  • patternだけあってもいいし、actionだけあってもいい
  • デフォルトの区切り文字は空白


例として、カンマで区切られた項目のうち1番目の項目をランキングする
<コマンド>

awk -F, '{print $1}' | sort | uniq -c | sort -nr

上のコマンドについて説明をば。

  • -Fで「この区切り文字で各行の値を分割する」という意味。今回はカンマを指定
  • '{print $1}'で画面出力を行う。$Xで分割した値のうち何番目を表示するかを選択。今回は1番目
  • | sort | uniq -c | sort -nrで重複排除、同じ値をカウント、カウント数による降順ランキングを生成

特に"|sort | uniq -c | sort -nr"の一連のコマンドについてはログ分析では非常に使う機会が多いと思うので、覚えておいて損はないと思う。

で、このコマンドはログ分析における基本中の基本コマンドになると思われるのでは、と。あとは、表示したい項目をもう少し綺麗に整形したりするためにもう少しコマンドやオプションを使っていくというようになる。

で、こんな感じのログ分析に使えるコマンド関連については以下の書籍を参考にしました。


シェルプログラミング実用テクニック
https://www.amazon.co.jp/%E3%82%B7%E3%82%A7%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E7%94%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E4%B8%8A%E7%94%B0%E9%9A%86%E4%B8%80-ebook/dp/B00XKU53U4


awk実践入門
https://www.amazon.co.jp/AWK%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E4%B8%AD%E5%B3%B6%E9%9B%85%E5%BC%98-ebook/dp/B00YA3VS2C/ref=pd_sim_351_2?_encoding=UTF8&psc=1&refRID=7B28BMQKAWSD8T1S804S


そして、一番勉強になるのはシェル芸勉強会の資料です。
ぶっちゃけ上の本読むより、シェル芸勉強会の資料とtwitterの投稿を見た方が勉強になります。
変態的なコマンドもありますが、「こんな風に書くこともできるんだー!」と感動します。
昨日も勉強会があり、その資料が初心者向けであったので、ぜひこれは読むべきかと。。

www.slideshare.net



ぶっちゃけアセンブリ見ている方が私にとっては精神衛生上いいようですw

VirusTotal APIを使ってみた

皆さんご存知VirusTotalAPIを少し試してみようと思います。

他の方のブログを見ていると、ハニーポットVirusTotalを連携させてDionaeaに保全されたマルウェアを自動的に判定するようなものを作ったりしているのをみて、非常にそそられました。

なので、まずは「そもそもVirusTotal APIってなんぞ?」というところからはじめて、簡単な使い方などをまとめておこうと思います。

VirusTotalとは

まずは基本的な話として、VirusTotalとは何かという話からはじめます。

簡単にまとめるとこんな感ですね。

  • ファイルをアップロードしたり、URLやファイルのハッシュ値をサーバーに問い合わせることによって、それがマルウェアなのか判定してくれたり、URLであれば攻撃サーバ(Command and Control Server: C2, C&C)なのかを判定してくれるWebサービス
  • 有料会員になると、アップロードされたファイルを取得することも可能
  • APIを使って、他のアプリケーションとの連携を行うことができる
  • Desktopアプリケーションもあるらしい

フォレンジックとかでもよくありますが、マルウェアに感染した端末の調査をする際に、ディスクに残っているマルウェアをアップロードして、そのようなマルウェアなのかを判定してもらい、そこから調査すべきポイントを洗い出すということをやります。

動的解析を行える環境があれば、そちらで監視ツール(WireShark, Process Monitor, ProcessHackerなどのツール、もしくはCuckooなどのサンドボックス)を使ってログを取りそこから調査すべき部分を洗い出したりします。


ただ、調査の際には時間が限られているので、時間短縮の為にもまずはマルウェアと思しきファイルのハッシュ値を取り、それをVirusTotalにぶん投げるという感じですね。

で、調査の際には検体をそのままアップロードをすることはしません。というのも、もし検体内にセンシティブなデータがそのまま入っている場合(特に高度標的型攻撃になると、ターゲットとなっている企業の情報が入ってしまっている)があります。かつ、有料会員であればそれをダウンロードできてしまうので、「どこが攻撃を受けてしまったのかわかってしまう可能性」があります。なので、まずは「すでに同じ検体が解析されているか、またどのような結果が出ているか」を調べる為にハッシュ値を算出しVirusTotalに投げる、という流れになります。

個人利用ではそこまで気をつける必要はないかもしれませんが、企業の方で利用している場合には注意が必要です。

VirusTotal APIとは

今回の本題、VirusTotal APIです。

  • VirusTotal上の情報を、ブラウザを使わずにスクリプトでアクセスできるようにするためのAPI
  • json形式のレスポンスデータを取得することができる
  • 制限が色々とある(1分あたり4回のリクエストしかできないなど)

Web系の知識は乏しいのであれですが、これはいわゆるRESTful APIということなのでしょうか?
まぁそんなことはいいとして、公式サイトにある説明では、以下の項目ができるとあります。

  • Sending and scanning files
  • Rescanning already submitted files
  • Retrieving file scan reports
  • Retrieving URL scan reports
  • Retrieving domain reports


それぞれどのURLにリクエストを投げるか決まっていて、ちゃんとうまくいけばレスポンスとしてjsonデータが手に入ります。


というわけで、実際にローカル端末からPythonスクリプトVirusTotalにリクエストをしてみましょう。
今回やってみたのは「Retrieving file scan reports」の項目です。

実際にやってみた

やってみた際の環境は以下の通りです。

というわけで、ハッシュ値を投げて検索結果をもらうスクリプトは以下の通りです。
試しに検索対象のマルウェアはWannacryを選んでみました。

# -*- coding:utf-8 -*-

import json
import urllib
import urllib2

# malware hash value that is sent to VT
hash = '2f76b88b420003516f90062940ef7881'

# file scan reportを取得する際に指定するURL
url = "https://www.virustotal.com/vtapi/v2/file/report"

params = {'apikey': '自分のpublic api key',
          'resource': hash}

data = urllib.urlencode(params)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
json_response = response.read()

print json_response


上記Pythonスクリプトを実行した結果得られた結果は以下の通り

{
    "scans": {
        "Bkav": {
            "detected": false,
            "version": "1.3.0.9466",
            "result": null,
            "update": "20180310"
        },
        "MicroWorld-eScan": {
            "detected": true,
            "version": "14.0.297.0",
            "result": "Trojan.GenericKD.12015782",
            "update": "20180310"
        },
        "nProtect": {
            "detected": true,
            "version": "2018-03-10.02",
            "result": "Ransom/W32.WannaCry.5267459",
            "update": "20180310"
        },
        ...............
},
    "scan_id": "1c4a7589d26c97c38d4f826242b6740b35441e43ddd7394d399dbf94ab868483-1520716198",
    "sha1": "08b943a7b7f4d368ed0c66afa4c98087be5efd4b",
    "resource": "2f76b88b420003516f90062940ef7881",
    "response_code": 1,
    "scan_date": "2018-03-10 21:09:58",
    "permalink": "https://www.virustotal.com/file/1c4a7589d26c97c38d4f826242b6740b35441e43ddd7394d399dbf94ab868483/analysis/1520716198/",
    "verbose_msg": "Scan finished, information embedded",
    "total": 67,
    "positives": 58,
    "sha256": "1c4a7589d26c97c38d4f826242b6740b35441e43ddd7394d399dbf94ab868483",
    "md5": "2f76b88b420003516f90062940ef7881"
}


Pythonスクリプトを作成するにあたり、以下の先生方のブログを参考(というか丸写しw)にさせていただきました。
www.morihi-soc.net
qiita.com
blog.daruyanagi.jp

今回はハッシュ値を投げるだけでしたが、ファイルを投げるスクリプトも書いて試そうかと思います。
というわけで、今回はここまで。







<ちょっとだけ気になったもの>
VirusTotal API Documentationの説明の中で特に個人的に面白いものはこちら。

The API must not be used in commercial products or services, it can not be used as a substitute for antivirus products and it can not be integrated in any project that may harm the antivirus industry directly or indirectly. Noncompliance of these terms will result in immediate permanent ban of the infractor individual or organization.

どの会社に向けたものでしょうね〜w

おそらくセキュリティ界隈でお仕事をされている方であればわかるかと。

ハニーポットについて

現在ハニーポットを運用していますが、ある程度どのハニーポットがどのような情報の収集に適しているのかをまとめておこうと思います。

有名どころをいくつか以下にまとめておきます。

 

ハニーポットについて

  1. Dionaea
  2. Cowrie
  3. Glastopf
  4. honeytrap
  5. Conpot

まだまだ知識が乏しいので、現状こんな感じでしかまとめられていませんが、今後もう少し知識を増やして色々かけるようにしようと思います

また、現在運用しているT-PotはStandardの設定でインストールしたため、Conpotはインストールされていません。

なので、今年中にはConpotでの産業システムに対する攻撃観測などをおこなってみたいと考えています

今回はここまでということで。

ハニーポットはじめました。

最近流行りのハニーポットを構築して、攻撃観測をはじめました。

モチベーションと目標は以下の通り

 

モチベーション

  • 最新の攻撃動向を、サイトなどから調べること以外に自分で観測をして、動向などを自分で推測できるようになりたい
  • 業務としてマルウェア解析をやっているが、サイトに置いてあるものはだいたい古いので、やっぱり新鮮なマルウェアをとっ捕まえて解析したい
  • サーバー設定を変えることで、観測される攻撃はどのように変わるかや、適切な設定について(主にファイアウォールなど)を勉強したい

目標

  •  まずはちゃんとハニーポットの管理をできるようにする(継続的に)

  • ログ分析を行うために必要な知識を身につけ、注目すべき部分を自分で判断し、攻撃を推測できるようにする。
  • ツールの操作(Kibanaなど)を把握する
  • 可能な限り機能拡張を行う

といった感じです。

 

では早速、現在運用しているハニーポット「T-Pot」の紹介をば。

 

T-Pot

T-Potはドイツテレコムが作成したハニーポットプラットフォームです。

複数のハニーポットやツールをdocker上で動かし、攻撃観測を行います。

T-Potに含まれているツールは以下の通りです。

ハニーポット
  • Cowrie
  • Dionaea
  • Glastopf
  • Conpot
  • honeytrap
  • ElasticPot など
 

セキュリティツール

  • Suricata(IDS/IPS)
  • p0f(TCPパケットからOSのフィンガープリントを行うツール)

 

また、ELK(Elasticsearch, LogStash, Kibana)スタックを使ってログ収集、可視化、検索を行うことが可能です。

収集されたログや攻撃者によって配置されたマルウェアなどは、docker volumeというところに格納されるらしいです(あまりdockerについては知識がないので、これから勉強しようと思います。

保存期間は約30日とのこと。なので、保存期間が過ぎないうちにFTPクライアントなどを使用してローカルに落とすなど対処が必要になります。

 

詳しい内容については公式ページを見てください。

github.com

 

T-Pot選定理由

今回、攻撃観測にT-Potを使用する理由としては以下の通り

  • インストールが簡単
  • ELKスタックを使用した可視化、ログ検索が可能
  • 有名どころのハニーポットてんこ盛り
  • Webで検索して見ても、日本語のブログなどたくさんあって自分のものと比較しやすそう

もちろん自分で特定のハニーポットをインストールすることも考えました(最初はDionaea単体を運用する予定でした)が、「やるんだったら色々やってみたい」という欲がまさってしまいこちらを選択しました。

 

インストール対象の環境ですが、VPSをお借りしてそこでおこないました。

現在、観測20日目ぐらいを迎えております。

いい感じにログが溜まっておりますし、マルウェアも大量に置かれているためかなりワクワクしています。

 

この後は、攻撃観測を定期的に報告するのと、抽出したマルウェアの解析報告を行いたいと思います。

かなり放置していました。。。

色々仕事で疲れていて記事を書く気力が湧かなかったのですが、環境が変わってだいぶ調子がいいので、これからちゃんと記事を書いていこうと思います。

 

仕事ではフォレンジックマルウェア解析をやっているのですが、最近流行りのハニーポットの運用をはじめました。

なので、基本的にはフォレンジックマルウェア解析の話をしようと思いますが、定期的にハニーポットの観測結果を公表しようと思います。

 

というわけで、頑張っていこうと思います。

機械学習始めました

こんにちは。

今回は、今後の方針に追加予定の機械学習に関して書こうと思います。

 

現在は機械学習とかディープラーニングとか、AIとかなんやらってのがトレンドになっていますよね。

特に、マルウェア解析とかインシデントレスポンス関連の製品(EDR:Endpoint Detection And Response)でも、「機械学習を利用した~」なんて言葉を使った宣伝が非常に多いです(本当に機械学習が使われているかは別としてw)

 

というわけで、私もそこらへん気になってきたので勉強会なり自分で勉強しています。

 

勉強会については以下のものに参加しました。

「第24回北海道情報セキュリティ勉強会

secpolo.connpass.com

 

北海道でおそらく一番活発に活動していらっしゃるセキュリティ勉強会です。

講師の方も毎度豪華なのですが、今回はトレンドマイクロの方でした。

話の内容はどちらも面白く、加唐さんのほうでは標的型攻撃について、ウクライナなどで行われたインフラに対するサイバー攻撃などについてとても興味深い話をきけました。

また、マルウェア解析方面では知らない人はいない新井さんの講義では、マルウェアの自動分類にチャレンジするという形で、機械学習を使っていろいろ試してみようということでした。

 

で、ちょっとこのあたりから機械学習について興味を持ち始めたので、まずは環境を整えるところの説明をば。

環境設定

上の講義でもやったものをそのまま使っております。

アプリケーションとしては、「Anaconda Navigator」を使用しています。

https://docs.continuum.io/anaconda/navigator/

これをインストールすると、自動的にpythonもインストールされます。

主に、Pythonを使っていろいろやっていきますので、まとめていろいろ入れてくれるのは結構ありがたいです。

また、実際にソースコードを書いて実行させるときも、Anaconda Navigator内にある「jupyter notebook」を使ってやっていきます。

このjupyter notebookは結構高性能なので、私は頻繁に使っています。

 

私が参考にしている書籍

で、環境を整えるのと並行して、どんな本をベースとしていくかで結構悩みました。

私のスペックは以下の感じです。

  • 文系大学卒で数学にはあまり抵抗はない(趣味でいろいろ数学を勉強中)
  • 行列式はほとんど勉強していない。確率は統計学金融工学である程度勉強
  • プログラミング(C, Python, C#)に関してはある程度できる
  • 仕事はセキュリティ系

そんな中で私が選択した本がこちら

Pythonによる機械学習入門」

https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%88%E7%94%BB%E7%A0%94%E7%A9%B6%E6%89%80-ebook/dp/B01N7TP7GJ

 

今のところ方針としては、基礎づくりを第一として

  • 機械学習って何?という点をまず理解
  • どういったデータが必要なのかなど、考え方をある程度身につける
  • 必要となるライブラリとかおおざっぱに把握

という感じです。

いきなり数学がちがちとか、細かいところまでやると途中でとん挫しそうなので、まずはおおざっぱに。

今後少しずつ勉強のまとめとかやっていこうと思います。

書いていく記事予定

ほとんど放置気味でしたが、時間を割いて記録を残していきたいと思います。

 

一応、各内容についてですが、

フォレンジックwindows, Linux

マルウェア解析(動的、静的、サンドボックス関連)

・その他CTF関連(ツールの使い方やCTFのwriteupなど)

 

メインとしてはフォレンジックが中心になるかなと。

マルウェア解析については、デバッガの使い方等も載せていこうと思います。

名目は自分の勉強メモですが、それが皆さんの役に立てばいいなと思っています。