Log of the Security

主に勉強系の記事書いてきます。

SecurityFastCTF2018のwriteupとか

おはようございます、こんにちは、こんばんは!

今日は, securityfastCTF2018に出たのでその時のwriteupを書いたり,感想を書きたいと思います。

 

まずwriteupに関しましては,githubの方に詳細を書いています。

github.com

github.co

 

感想ですが,やはり高得点の問題はレベルが高く低いポイントのflagしか取れませんでした^^;

順位は181/1023

181位でした。問題は2問しか解けませんでしたがとても面白い問題が多くとても勉強になりました。特にmicsの問題は,結構頭を使う問題が多かったです。

 

次はgoogleCTFに関して書きます。

 

今更ながらセキュリティキャンプ 全国大会2017でやったことを書きます

f:id:yottiii:20180501195622p:plain

1.introduction

 よっちです!今日は今更ながらセキュリティキャンプ2017で何をやったかというのを書きます!

 なぜ今更?wやおせーよ!と思う人も多いと思います!なぜか!それはただ単に、めんどくさくて更新しなかったのです笑 ではつらつらと書いてきたいと思います。

 

2.セキュリティキャンプとは??

 まずセキュリティキャンプ全国大会に関して知らない人も多いでしょう。説明するのが大変なので以下のURLを参照してください!

www.security-camp.org

 

そこで私は集中Zというコースを選択しました。5日間同じものを作り続けるというコースです。ま集中Zは、Linuxアンチウイルスソフトを作ろうというコースです。集中Zでも5つの分野に分かれていました。

 

・Z1: 高品質なELFマルウェアシグネチャ(yara)の作成

・ Z2: 高精度なELFマルウェア分類

Z3: yaraシグネチャマッチングの高速化

・ Z4: 圧倒的高速なIDS(パケットフィルタ)の作成

・Z5: 圧倒的高速なマルウェアスキャンクラウドストレー ジの作成

 

私はこのZ3のyaraシグネチャマッチングの高速化をやりました。

f:id:yottiii:20180501195048p:plain

ちなみに受講生は私一人だったので、生徒一人に対し、講師一人というめっちゃ濃密でした笑

またこの講師の新屋さんという方がとてもすごい人でした^^;twitteと本は最後に貼っておきます!とにかく講師とのレベルの違いに驚きました。

 

3.yaraの高速化

f:id:yottiii:20180501195622p:plain

 で何をやったかというとyaraというマルウェア検知ツールの高速化を行いました!

具体的にyaraについて説明しますと。。。。

こんな感じです。

 

次にyaraルールについて説明します!

f:id:yottiii:20180501195805p:plain

どのようなものかというと、上の文字列の$test1と$test2の取りかがマルウェアの中に入ってたらExampleRuleと表示されます。ようは自分で独自のルールを書き、マルウェアを検知できるというものです。

またパターンの記述には正規表現も書くことができます!Yara2.0からは自前の正規表現エンジンを搭載しています!

それで今回の高速化の対象はyara3.6.3です。

githubのURLを載せておきます!!!

github.com

yaraシグネチャの要は固定文字列探索にあります。現在yaraは文字列の探索に、固定文字列探索を採用しています。なので以下のようなデメリットメリットが挙げれます。

正規表現探索は表現豊かだが遅い

・固定文字列探索は文字列だけなので速い

 

ここでmiraiのyararulesを見てみます

f:id:yottiii:20180501200606p:plain

https://github.com/Yara-Rules/rules/blob/master/malware/MALW_Mirai.yar

上記のURLにマルウェアのルールがまとめてあります。

 

4.高速化の検討

 セキュリティキャンプではこのyararulesの高速化をやったというのは先ほど話しました!ではどのように高速化したのかというのを説明してきます。高速化の方針としては

 

・YARAの固定文字列探索部分を高速化

  Quick Search と呼ばれるアルゴリズムを実装

 

ここで文字列探索についての説明をしておきます

 

単純な固定文字列探索

f:id:yottiii:20180501201108p:plain

              図 1.固定文字列探索例

 

あかさかさかすからさかすを探索する場合は、図1のような手順で1文字ずつずらして探索していくわけです。

次にQSアルゴリズムを見てみましょう!

f:id:yottiii:20180501201331p:plain

            図2.QSアルゴリズム探索

 

このアルゴリズムは図2を見てもらえばわかるように、キーワード末によって次にシフトする長さを決めています!

ちなみに計算量に関していかに示しておきます!!

 

 検索対象の文字列の長さをn、キーワードの長さをsとする

    • native な方法だと :最良O(n),最悪O(n*k)
    • オートマトン: 最良 ・最悪O(n)
    • Quick Search;最良O(n/k)最悪O(n*k) 

 

5.結果

今回全国大会では、このyara内部のアルゴリズムを高速化することをしました。では肝心の結果を見てましょう。

 

 

今回の検索対象はwikipediaの全て文字データ(1GB近くあるtextデータ)の中から

abcdefghigklmnという固定文字列を検索しました。

wikipediaデータ

https://dumps.wikimedia.org/enwiki/20170601/

 

vimeo.com

 

 

vimeo.com

 

 

このように限定的なケース(固定文字列探索で済む場合)において4倍ほどの高速化に成功しました!!!!!

※実装が不完全なため、シグネチャ正規表現などを含む場合は正しく動かない。

コードに関してはgithubに公開します!!

github.com

 

ここも参考にしてみてください!

speakerdeck.com

6.感想

・quick search アルゴリズムの理解

・膨大なソースコード読む

・書いたコードは六十行程度

・データ構造の理解

・高速化できたけどソースはまだ未完成(本家にマージできるレベルでは到底ない)

 

まずQSアルゴリズムが難しかったです!講師の新屋さんは、正規表現の研究者でもありとても計算量などに関して詳しく説明してくださいました!

二つ目に膨大なソースコードを読むのが初めてだったので、ここまで膨大5万行ほどのコードを読んだのは初めてだったので大変でした^^;またgdbというデバッカを使ってコードを読んだのですが、gdb使ったのもその時が初だったのでかなり覚えるのが大変でした。

ただそれ以上に得るものも多かったです!!このキャンプに参加して、自分もまだまだ修行が足りないので、もっともっと勉強しなくてはいけないと改めて感じることができました。またセキュリティ好きの同志もでき、今でも連絡を取り合ったりする人もいるので、とても良い機会だと思いました!!

悩んでいる人は是非とも参加するべきだと思います!!!!

 

7.最後に

セキュリティキャンプ2017で担当してくださった新屋さんはじめ、Zチームの講師のみなさん、その他講師のみなさんに深く感謝申し上げます。

 

参考文献

[1]新屋 良磨 ,鈴木 勇介,高田 謙 "正規表現技術入門 --最新エンジン実装と理論的背景",2015

twitter

新屋さん@sinya8282

 

 様子

https://pbs.twimg.com/media/DHPbSaGUAAAD8By.jpg

https://pbs.twimg.com/media/DHZVxi7VoAIM6Fl.jpg

https://pbs.twimg.com/media/DHQoizUUIAA7Apz.jpg

 

 

 

 

マルウェア解析入門2~basic static~

1.静的解析

 皆さんこんにちは。よっちです。今回は静的解析を実際に行っていこうと思います。static analysisはまずマルウェアのコードや構造を調べます。そのときマルウェアは実際に動作させない。対象にdynamic analysisは実際にマルウェアを動作させて解析を行います。dynamic analysisは今後やっていこうと思います。

実際に基本的な静的解析でやることを以下に示します。

マルウェア解析ツールを用いた静的解析

・ハッシュを使いマルウェアの識別

マルウェアのコードから必要な文字列を抜き出し、情報を集める。

 

以上をやっていきたいと思います。

 

2.マルウェアスキャン

 マルウェアの多くはパターンが決まっています。なのでマルウェアのデータベースと照合することでどのようなマルウェアなのか知ることができます。ただときどき検出できないマルウェアがあります。なぜならばシンプルにデータベースにないからです。データベースはあくまでも既存のマルウェアしか検知できません。亜種や新しく出てきたマルウェアは検知できません。しかしたいていの場合既存のデータベースで検知できます。ここで最も使われているウェブベースのデータベースを紹介したいと思います!

virustotal(www.virustotal.com)

f:id:yottiii:20180430130930p:plain

ここでマルウェアと思われるソフトをアップロードすれば自動で調べてくれます!実際にアンドロイドのマルウェアを検知させて見ます!

f:id:yottiii:20180430131237p:plain

こんな感じで検知してくれました!

ちなみに私は研究目的でマルウェアを保持しているので、皆さんはマルウェアを保持していると逮捕されるので気をつけてください^^;;

このデータベースは非常に優秀で数十種類のアンチウイルスソフトの結果を出してくれます。たいていのウイルスはここで引っかかるでしょう!

 

 

3.ハッシュを用いたマルウェアの検知

 ハッシュ関数というのはご存知でしょうか?初心者の方にわかりやすく説明すると、ハッシュというのはマルウェアをはじめとしたすべてのアプリケーション、オブジェクトの識別番号を振るための関数です。

f:id:yottiii:20180430132548j:plain

一方向性関数とも呼ばれます。データをハッシュ関数を通すことで、512ビットの文字列にすることができます。この文字列からデータを割り出すことはできません。いわゆる不可逆です。もっと詳しく知りたい方はggってみてください。

 

これからわかるように、各アプリケーションにもハッシュが割り振られているわけです。

ここで実際にwindowsの電卓のハッシュ値を調べてみます。

f:id:yottiii:20180430133608p:plain

ハッシュが以上のようになったことがわかります。

ここでプログラムの内部を1ビットでも変えるとまったく違うハッシュ値になります。

そこで照合を行い、改ざんされていると知ることができます。

これがハッシュを用いたマルウェアの検知です。

 

3.文字列を探す

 アプリケーションから特定の文字列を探したいと思うこともあるでしょう。文字列というのは基本的にASCIIとUnicodeが使われています。皆さんも一度は聞いたことがあるのではないでしょうか?ここでASCIIとUnicodeの仕組みについてふれておきましょう。

f:id:yottiii:20180430140636p:plain

このようにunicodeは一文字に対してnullがあるということがわかります。実際文字列を探索するときは、この属性や形式は無視します。しかし実際に文字列は間違った文字列を検知してしまう。たとえば"VP3"という文字列は,0x56,0x50,0x33,0x00である。しかし実際にこれはメモリーのアドレスだったり、プログラムを使用するときのCPUの割り振りの可能性がある。

しかし幸いにもそのような無効な文字列は明らかである。なぜならば、それらの文字列は正当な文字列ではないからである。

文字列の検知する例のプログラムは

・bit.ly/ic4plLからダウンローできる。

このプログラムで実際のアプリケーションの例をみてみよう!

f:id:yottiii:20180430143125p:plain

長いのでかなり省略したが、これらの文字列はlibrary等のコードであることがわかる。DLLの説明に関しては、また次回以降で行っていきたいとおもう。

 

 

Penetration Test~Intelligence Gathering~

1.はじめに

今日はペネトレーションテストのインテリジェンスギャザリングについてまとめて意向と思います。そもそもインテリジェンスギャザリングとは、ターゲットとなるサーバー等を調査する作業になります。

 

2.色々なインテリジェンスギャザリング

基本的なインテリジェンスギャザリングについてまとめてみました。

 -whois 

f:id:yottiii:20180429101401p:plain

whoisドメインの情報などをまとめて表示してくれるコマンドです。

 

-Netcraft

これはウェブサイトのDNSサーバー等を探すことができるものです。

サイトURLは

Netcraft | Internet Research, Anti-Phishing and PCI Security Servicesです。

 

 

nmap

これは非常にインテリジェンスギャザリングでよく使われるcmdです。

ためしに自分のipをスキャンしてみましょう!

f:id:yottiii:20180429102103p:plain

このように開いてるポートを表示してくれます。

ここでオプションの説明をします。

-sSはTCPステルススキャンと呼ばれ、tcpポートが開いているかどうかチェックしてくれます。

-Pnは接続確認にpingを使わない方法です。

ここで-Aというオプションを追加してみます。

f:id:yottiii:20180429102742p:plain

このように詳細が確認できます。

たとえばSQLサーバーを立てていた場合、どのソフトを使ってSQLサーバーを立てているかなどが詳細としてわかります。

 

 

高度なtpcスキャニング

-TPCアイドルスキャン

f:id:yottiii:20180429110329j:plain

アイドルスキャンは別のホストをスプーフィングしてターゲットにスキャンを仕掛ける。この方法により、ステルススキャンを可能にする。

ここでnmapを使うときに-sIオプションを指定する

nmap -Pn -sI OtherHostIP targetIP

でステルススキャンを行える。

 

 

マルウェア解析入門1〜概要とか〜

f:id:yottiii:20180427172014p:plain

1.introduction

こんにちは!yottiです!

今回からマルウェアの解析入門ということでマルェア解析の基礎を勉強がてら行っていこうと思います!

おそらく不定期ですが.....

ソースコード

github.com

こちらのgithubに公開していきまーす。

 

2.Background

 みなさんもこの記事を読んでいるということは、少なくともセキュリティに興味があるということだと思います。またセキュリティに興味がある人は、外国の映画などに影響され、いわゆるハッカーと呼ばれる人たちが、何を打ってるかわからないPC画面上の前でカタカタとコードを書いて、企業のサーバや、個人の情報を抜き取ったりするというのに憧れてセキュリティの世界に足を踏み入れた人も少なくないはずです。

 ですがそのような夢を見ている人は即刻この分野には合わないかもしれません。実際は大量のアセンブリ言語を読まなくてはならなかったり、地味な作業をひたすらやり続ける、その苦痛に耐えられなくなり、途中で辞める人も多いです。

 ここでそのようなことにならないためにも初心者向けにマルウェア解析の概要と実際のマルウェアの解析方法をわかりやすく知ってもらいたいと思い作成しました。

 

3.What is malware analysis?

 マルウェア解析とは、いわゆる不正な動きをするプログラムを調査しその挙動や目的などを明らかにすることです。以下のようなことが挙げられます。

 ・感染拡大を防ぐ

 ・感染動作を見極める

例えばあるマルウェアがあったとして、どのように感染するのかわかりません。自分で知らない間に、他の人にマルウェアをばらまいている可能性もあるわけです。またマルウェアに感染したことで、自分にとってどのような不利益があるのか?情報を抜き取られているのか?バックドアにされているのか?などを知る必要があります。

 

ここでマルウェア解析においていくつかポイントを意識しながら解析をするめる必要があります。以下にまとめると・・・・

 ・感染手段に注目

 ・バックドアのありなし

 ・感染端末

 ・目的に注目

が挙げられます。これらを意識しながら解析する必要があるわけです。

例えばバックドアがあれば、コード上にbind,listen,acceptなどといったバックドア特有の文字列が含まれているでしょう。

 

3.Process of Malware Analysis

マルウェアの解析には2種類あります。

動的解析(DinamicAnalysis)と静的解析(StaticAnalysis)。ではStaticAnalysisとDinamicAnalysisは何が違うのでしょうか?

まずStaticAnalysis後々説明するデバッカと呼ばれるものを使用してコードレベルでマルウェアを解析します。ただ重要な動作を見逃す可能性も高いです。

DinamicAnalysisというのは実際にマルウェアを仮想環境などに実際に感染させ、その動作や感染経路を記録します。実際に感染させるので使用しているPCがマルウェアに感染してしまうリスクも増えます。

 

双方メリットデメリットがあります。

ですので基本的に動的解析、静的解析のどちらも行うのケースが多いです。

それからマルウェアはパックと呼ばれる、静的解析を防ぐために暗号化や圧縮されているケースがあります。静的解析を行う場合はのパッカーを解凍してから行わなくてはいけません。これをアンパッカーと言います。

これらの動作を経てマルウェアの解析を行います。

 

4.Malware Types

今やマルウェアは世界に数百億もあると言われていますが。ある種類の亜種(派生)、があり実際は数種類〜数十種類のマルウェアが元となっています。そこで代表的なマルウェアのTypeをここで説明します。

・Backdoor・・・攻撃者がコンピュータにあなたの端末にアクセスするためにインストールされるマルウェアバックドアは通常、攻撃者とコンピュータをコネクトしており、認証なしでアプリケーションを動かしたりコマンドラインを操作したりする。

 

・Botnet・・・バックドアに似ているが、コネクトしているのはC&Cサーバと呼ばれるサーバで、そのサーバには他にも感染したPCがつながっている。攻撃者がC&Cサーバに指示を出すと一斉に感染しているPCがその動作をする。その感染しているネットワークをBotNetと呼んでおり、最近ではIoT機器に感染するしDDOSattackを仕掛けるマルウェアが流行している。(mirai)

 

・Downloader・・・downlodaderは通常、初めてシステムにアクセスするときにインストールされる。このマルウェアに感染すると攻撃者の意思で、他のマルウェアをインストールしたりする。

 

・Inrformation-stealing malware・・・このマルウェアは情報をぬきとる。感染したPCは、オンラインバンキングのパスワードやlogなどを収集され、その情報を攻撃者へ送信される。

 

・Launcher・・・正規のランチャーに悪意のあるランチャーが偽造する。そしてあたかも正規のランチャーのように振る舞い、知らぬ間に悪意のあるマルェアなどをインストトールしたりする。

 

Rootkit・・・個人的にexploittoolを作ったりするものだと思ってましたが、practical malware analysisには"" Malware code designed to conceal the existence of other code""と書かれているので他のマルェアを隠すためのkitですね。基本的に単体では動作せず、他のマルェアとペアになります。

 

・Scareware・・・これはマルウエアに感染していなくても、あたかもそのデバイスが感染しているかのように振る舞うマルウェアです。そのマルウェアは、このソフトを入れるとマルウェアをremoveできますと言いますが、実際はそんなことはありません。だってマルウェアには感染していないのですから。。。はい

 

Spam-sending maiware・・・このマルウェアに感染すると、他のユーザーにスパムメールを送る。そこからまた感染した人が他の人にメールを送るという。

 

・Worm or Virus・・・Malicious code that can copy itself and infect additional computers.

 

4.Getting for malware 

 マルウェアを解析したい!!!と思っても解析するマルウェアの検体がなくては話になりません。そこでここではいくつかマルウェアの検体を入手できるサイトを紹介します。

 ・VX heavens

 ・Offensive Computing

    ・Shadowsever

 

5.Bibliography

[1]Michael Sikorski and Andrew Honig, "Pratical Malware Analysis~The hands-on to            Dissecting Malicious Software",2012

[2]Arai etc,"Analysing Malware",2010

 

正規表現の勉強! その1

■1.はじめに

セキュリティキャンプ全国大会に参加にあたり

正規表現を用いたパターンマッチングエンジンの高速化をするので、その勉強もかねて正規表現に関しての記事を書いていきます。

 正規表現に触れるのは初なのでミス等あるかもですが、ご了承ください^^;

f:id:yottiii:20170720231501j:plain

■2.正規表現とは??

正規表現とは式です。

プログラマにとっての式は||(or)や&&(and),!(not)などの論理式を使って

プログラムを作成しています。式は演算子や数の組み合わせで構成されています。

正規表現は文字列のパターンで表現が可能である。

あ|い|う|え|お

という正規表現あ~おまでの1文字でというパターンで表現されている。

記号|(or)という複数の可能性を表す表現の演算子である。

 例えば

私は p(erl | ython | hp)が好きです。

といえば perl,python,phpのどれかが好きということを表現している。

この場合、c++はマッチしない。

 

 

■3.基本メタ文字

またメタ文字について少し触れておきます。

メタ文字とは正規表現において、特別な意味を持った文字のことです。

また、特別な意味を持たないものをリテラルと呼びます。

簡単に言うと、正規表現はこのメタ文字とリテラルで構成されています。

 基礎的なメタ文字について以下に示しておきます。

名称 演算子
選択
量指定子 * + ? {}
グループ化 () (?:)
先読み等 (?=) (?!)(?<=)(?<!)

 これらのメタ文字に関してはのちのち説明します。

 

■4. 初歩的な正規表現プログラムを書いてみる

ではさっそくこれらを用いてパターンマッチングエンジンのプログラムを書いていきます。今回はpythonを使って書きたいと思います。python正規表現のライブラリはreモジュールという名前で出てます。

f:id:yottiii:20170720231413j:plain

import re

test1="foo "
test2="foo bar"
test3="test foo bar"
regexp=re.compile(r"[fb]oo")

for str in(test1, test2,test3):
print u"[%sのマッチ結果]"% test1
if regexp.match(str):print u"matchでマッチ"
if regexp.search(str):print u"searchでマッチ"



//実行結果
[fooのマッチ結果]
matchでマッチ
searchでマッチ
[fooのマッチ結果]
matchでマッチ
searchでマッチ
[fooのマッチ結果]
serchでマッチ
//

 pythonの正規表現オブジェクトにはmatch()とsearch()という2種類のマッチングメソッドがある。

match()は部分文字列によるマッチの判定、

search()は前方一致によるマッチしているの上記の結果から言える。

 

またpythonのreモジュール以外に、dfaregという前文一致が出来る、モジュールがあるので使ってみる。

import dfareg

regexp = dfareg.compile(r"(p(erl | ython | php ) | ruby)")
if regexp.matches("python"): print u"pythonがマッチ"
if regexp.matches("ruby"): print u"rubyがマッチ"
if regexp.matches("c"): print u"cがマッチ"

 dfareg.compileを呼ぶと、コンパイルされた正規表現が返ってきます。この正規表現に対して、matchesメソッドによって、文字列がマッチするかしないかを判別できます。

 

■5.NFAとDFAについて

NFAとDFAについての説明の前に、有限オートマンについての説明をします。有限オートマンとは、文字を入力すると真偽値を出力するものです。

有限の状態を持っており、入力ごとにその状態を変化させます。最後の入力で、出力が決定されます。

有限オートマンにはNFAやDFAがあり、それを示すには状態遷移図を利用します。円は状態を示し、矢印は文字の入力により変化を示します。

εは空文字('')を表します空文字とはその名の通り空っぽの文字であり、他の文字列と繋げても文字列を変化させません。例えば、'a'+''+'c'は'ac'となります。

詳しい説明はまたしたいと思います。

 

NFAとDFAの違いに関して簡単に説明します。

NFAは入力により状態が一意には決まりません。またε(または '') での状態遷移を許可します。例えば "abc" と言う文字列は、 'a'、'b'、'c' と入力してもいいし、''、''、'a'、''、''、''、'b'、''、''、'c' 等にしても大丈夫です。

 

対する DFA は入力により遷移する先の状態は一つになることが保障されています。

先ほどのNFAのεも許可されていません。

 

NFAエンジンとDFAエンジン

みなさんはバックトラックという方式をご存知ですか?

私はグラフ理論系の研究室なので、嫌というほどやっています(笑)

深さ優先探索とも呼ばれます。深さ優先探索アルゴリズムに関しては、わかりやすいものがネットにあったのでこちらを参照してください。

http://www.hongo.wide.ad.jp/~jo2lxq/dm/lecture/07.pdf#search=%27%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2+%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%27

NFAエンジンはこの深さ優先探索というアルゴリズムを使用しています。

簡単にいうと、選択肢を適当に選んで失敗するまで進み、失敗したら戻り、別の選択肢をやるというアルゴリズムです。

一方DFAエンジンは幅優先探索というアルゴリズムを使っており、これは全ての可能性をマッチするまで広げていくというアルゴリズムです。

 

■6.最後に

今後としては、セキュリティキャンプまでにDFAとNFAをPythonで実装まで行いたいです。まずはDFAエンジンの作成を行いたいです。

またこの勉強をした上で、参考にした資料等を以下に示します。

正規表現技術入門 最新エンジン実装と理論的背景

著者:新屋良磨、鈴木勇介、高田鎌

http://yara.readthedocs.io/en/v3.6.0/writingrules.html

Regular Expression Matching: the Virtual Machine Approach