Twitterに書ききれないこと

イベントや技術的なことを記したい・・・

CODE BLUE 2017

遅くなりましたが、CODE BLUE 2017への参加報告ブログです!

今回のCODE BLUEには、夏にOWASP Kansaiで発表した際に若者枠ということでチケットをいただき、参加することが出来ました! OWASP Kansaiさん、ありがとうございました! owasp-kansai.doorkeeper.jp

関西出身なのでOWASP Kansai東京支部ということで頑張ります()

CODE BLUEには過去2回学生スタッフとして参加していたので、今回が三回目でした。 毎年、募集しているので学生のみなさんは是非応募してみてください。

講演

内容はtwitterで実況している方が何人かいたのでそれをどうぞ。

#codeblue_jp

(今年だけまだTogetterなかった)

聞いていた講演の中ででてきた資料等を貼っておきます。

あと公演ごとにまとめている記事もありました。 わかりやすい。

dev.classmethod.jp

基調講演:サイバースペースにおける国家主権

ccdcoe.org

産業制御システムに対するStuxnet以来最大の脅威

www.welivesecurity.com

インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上

資料が公開されていてありがたい・・・

github.com

日本を狙うAPT攻撃の全体像 - APT攻撃インシデントSTIXデータベース

github.com

攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査-

基調講演: OSSによる自動車の自動運転化 –

ジョージ・ホッツが見たかった、それだけで満足しましたw

このslackに入れば彼らのプロジェクトに加わることが出来るらしいので、自動運転に興味ある人は参加してみては。

コンテスト

去年は企業のハッキングチャレンジだけだったのですが、今年はCODE BLUE CTFが開催されていました。 運営は日本を代表するCTFチーム、BinjaとTokyo Westernsでした。

CTFtime.org / CODE BLUE CTF 2017

出展している企業も多く、講演が見たかったので覗いただけだったのですが、5Fもだいぶ活気がありました。

コンテスト || CONTENTS || 世界トップクラスの専門家による情報セキュリティ国際会議「CODE BLUE(コードブルー)」

あと個人的に攻殻機動隊が好きなので、毎年楽しみにしている攻殻CTFも開催されていました。 女性限定イベントなので、参加はできませんがサイバーパンクな雰囲気だけ味わうことができました。

さいごに

昼は技術、夜はお酒と非常に充実した2日間でした。 あらためてチケットをいただきましたOWASP Kansaiさんに感謝します。

WannaCryに関する各組織の解析レポートまとめ

WannaCryに関する各組織の解析レポートを時系列にまとめた。 WannaCryを解析する際には公開情報を参照すると良い。

日付 組織 タイトル URL
2017/05/12(金) WannaCryの感染キャンペーンが開始
Malwarebytes Labs The worm that spreads WanaCrypt0r https://blog.malwarebytes.com/threat-analysis/2017/05/the-worm-that-spreads-wanacrypt0r/
TALOS Player 3 Has Entered the Game: Say Hello to ‘WannaCry’ https://blogs.cisco.com/security/talos/wannacry
Kaspersky WannaCry ransomware used in widespread attacks all over the world https://securelist.com/78351/wannacry-ransomware-used-in-widespread-attacks-all-over-the-world/
McAfee An Analysis of the WannaCry Ransomware Outbreak https://securingtomorrow.mcafee.com/executive-perspectives/analysis-wannacry-ransomware-outbreak/
TrendMicro Massive WannaCry/Wcry Ransomware Attack Hits Various Countries https://blog.trendmicro.com/trendlabs-security-intelligence/massive-wannacrywcry-ransomware-attack-hits-various-countries/
Symantec What you need to know about the WannaCry Ransomware https://www.symantec.com/connect/blogs/what-you-need-know-about-wannacry-ransomware
Microsoft WannaCrypt ransomware worm targets out-of-date systems https://blogs.technet.microsoft.com/mmpc/2017/05/12/wannacrypt-ransomware-worm-targets-out-of-date-systems/
EMSISOFT Global WannaCry ransomware outbreak uses known NSA exploits http://blog.emsisoft.com/2017/05/12/wcry-ransomware-outbreak/
2017/05/13(土) MalwareTechBlog How to Accidentally Stop a Global Cyber Attacks https://www.malwaretech.com/2017/05/how-to-accidentally-stop-a-global-cyber-attacks.html
juniper Rapid Response: The WannaCry Ransomware Outbreak https://forums.juniper.net/t5/Security-Now/Rapid-Response-The-WannaCry-Ransomware-Outbreak/ba-p/307835
TrendMicro 大規模な暗号化型ランサムウェア「WannaCry/Wcry」の攻撃、世界各国で影響 http://blog.trendmicro.co.jp/archives/14873
2017/05/14(日) ENDGAME WCry/WanaCry Ransomware Technical Analysis https://www.endgame.com/blog/technical-blog/wcrywanacry-ransomware-technical-analysis
McAfee Further Analysis of WannaCry Ransomware https://securingtomorrow.mcafee.com/mcafee-labs/analysis-wannacry-ransomware/
2017/05/15(月) McAfee 拡大するWannaCryランサムウェアの分析 http://blogs.mcafee.jp/mcafeeblog/2017/05/wannacry-f851.html
Kaspersky WannaCry FAQ: What you need to know today https://securelist.com/78411/wannacry-faq-what-you-need-to-know-today/
Kaspersky ランサムウェア「WannaCry」:あなたは大丈夫? https://blog.kaspersky.co.jp/wannacry-ransomware/15524/
Symantec WannaCry ランサムウェアについて知っておくべきこと https://www.symantec.com/connect/ja/blogs/wannacry-1
FireEye WannaCry Ransomware Campaign: Threat Details and Risk Management https://www.fireeye.com/blog/products-and-services/2017/05/wannacry-ransomware-campaign.html
Fortinet WannaCry: Evolving History from Beta to 2.0 http://blog.fortinet.com/2017/05/15/wannacry-evolving-history-from-beta-to-2-0
joe security Brief technical Analysis of Wannacry Ransomware Worm v2 https://www.joesecurity.org/blog/8272382563145970396
panda #WannaCryReport http://www.pandasecurity.com/mediacenter/src/uploads/2017/05/WannaCry_Report-en.pdf
Trustwave WannaCry: We Want to Cry https://www.trustwave.com/Resources/SpiderLabs-Blog/WannaCry–We-Want-to-Cry/
2017/05/16(火) BAE Systems WANACRYPT0R RANSOMWORM http://baesystemsai.blogspot.jp/2017/05/wanacrypt0r-ransomworm.html
Cisco Umbrella The Hours of WannaCry https://umbrella.cisco.com/blog/2017/05/16/the-hours-of-wannacry/
FireEye WANNACRY ランサムウェアキャンペーンの 脅威の詳細とリスク対策について https://www.fireeye.jp/company/press-releases/2017/wannacry-ransomware-campaign.html
Symantec Can files locked by WannaCry be decrypted: A technical analysis https://medium.com/threat-intel/wannacry-ransomware-decryption-821c7e3f0a2b|
McAfee ランサムウェアWannaCryに関するさらなる分析 http://blogs.mcafee.jp/mcafeeblog/2017/05/wannacry-651e.html
LogRhythm A Technical Analysis of WannaCry Ransomware https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/
2017/05/17(水) マクニカネットワークス マルウェア解析奮闘記 WannaCryの解析 http://blog.macnica.net/blog/2017/05/wanacry-8ff1.html
NSFOCUS Analysis Report on the WannaCry Sample http://blog.nsfocus.net/wannacry-sample-analysis-report/
2017/05/18(木) Kaspersky WannaCry:情報まとめ https://blog.kaspersky.co.jp/wannacry-faq-what-you-need-to-know-today/15594/
MBSD 「WannaCry 2.0」の内部構造を紐解く http://www.mbsd.jp/blog/20170518.html
TrendMicro ランサムウェア「WannaCry/Wcry」のワーム活動を解析:侵入/拡散手法に迫る http://blog.trendmicro.co.jp/archives/14920
SecureWorks WCry Ransomware Analysis https://www.secureworks.com/research/wcry-ransomware-analysis
2017/05/19(金) 360totalsecurity WannaCry Ransomware encrypted data recovery: Feasibility and Solution https://blog.360totalsecurity.com/en/wannacry-ransomware-data-recovery/
2017/05/22(月) SecureWorks SecureWorks、WCry ランサムウェア詳細解析レポート http://ja.community.dell.com/dell-blogs/direct2dell/b/direct2dell/archive/2017/05/22/secureworks-wcry
2017/05/23(火) FireEye WannaCry Malware Profile https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html
2017/05/26(金) FireEye SMB Exploited: WannaCry Use of “EternalBlue” https://www.fireeye.com/blog/threat-research/2017/05/smb-exploited-wannacry-use-of-eternalblue.html
2017/05/28(日) FireEye WANNACRY マルウェアのプロファイル https://www.fireeye.jp/company/press-releases/2017/wannacry-ransomware-campaign1.html
2017/06/02(金) TrendMicro MS-17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Drive http://blog.trendmicro.com/trendlabs-security-intelligence/ms17-010-eternalblue/
2017/06/07(水) TrendMicro 「WannaCry」を拡散させた脆弱性攻撃「EternalBlue」の仕組みを解説 http://blog.trendmicro.co.jp/archives/15154

SandPrint: Fingerprinting Malware Sandboxes to Provide Intelligence for Sandbox Evasionの紹介

この記事は情報セキュリティ系論文紹介 Advent Calendar 2016 13日目の記事である.

www.adventar.org

本記事で用いられている図表はこの論文から引用したものである.

筆者は英語に長けおらず,専門知識も乏しいので誤訳・誤解釈している場合があるので,詳細な内容は元論文を参考されたし.

SandPrint: Fingerprinting Malware Sandboxes to Provide Intelligence for Sandbox Evasion - Springer

全然要約できていおらず申し訳ない・・・ 概要,はじめに,おわりに,各章のまとめを流し読めば,だいたいの内容が理解できると思う. 有名所のサンドボックス検知手法を用いずに,サンドボックス検知しているところが面白いなと思った.

概要

増加するマルウェアに対処するため,自動的にプログラムを解析する技術が必要となる.特にマルウェアサンドボックスは,プログラムの動作を抽出するために標準的に用いられる.しかし,プログラムをサブミットできる人は,特定のサンドボックスの特性を学習してリークさせることができる.Windowsがターゲットのサンドボックスの特性を測定してリークさせるプログラムであるSandPrintを紹介する.我々は20のマルウェア分析サービスにツールをサブミットし,2666の分析レポートを収集し,76のサンドボックスクラスタ化する.次に,攻撃者が単一のサンドボックスの特性だけでなく,すべてのサンドボックスに固有の特性のサブセットを検出できるかどうかを評価する.実際に,教師付き学習技術を使用して,敵が自動的にサンドボックスと実際のシステムを区別できるクラスを自動的に生成できることを示す.最後に,3つの一般的なベンダーの市販のマルウェアセキュリティアプライアンスを同様の手法で密かに検出できることを示す.

1. はじめに

悪意のあるソフトウェアは,今日の主要なセキュリティ上の課題の1つである.さまざまな形で,マルウェアはビジネスと同様に消費者にとって脅威である.マルウェアの増加は亜種によるものだが,日常的にほぼ発見される新しい検体によっても引き起こされる.

防御側は大量のマルウェアに対処するために未知のプログラムを自動化する方法を分析するためのいくつかの補完的なアプローチを導入した.特に,Windowsベースのマルウェアサンドボックスは,学術的,業界的にも自動マルウェア分析[24]のデファクトスタンダードになっている.サンドボックスは,新種のマルウェア解析,マルウェア検出メカニズムのための入力データ,マルウェアのC&Cサーバ,バンキングトロイ,リバースエンジニアリングの手作業を支援で活用されて脅威情報を収集する.最後に,サンドボックスは動的マルウェア分析によって組織を保護することを目的の商業マルウェアセキュリティ・アプライアンスの一部として使用される.

未知のプログラムの分析を自動化すると,解析が無人であるというリスクがある. 多くの場合,サンプルを受信し,解析のためにスケジューリングして実行した後に解析結果をサンプル提出者に返すことさえも完全自動化された処理チェーンに組み込まれている.サンドボックスにサンプルを提出できる人は、特定のサンドボックスの特性をリークさせる可能性がある.通常は、自動マルウェア分析サービスにサンプルを提出し,その後サンドボックスのサンプルを再配布し,簡単にグローバルなサンドボックスの内部を洞察する大規模なソースを生成する.

本稿では,この一般的な考え方に沿ってサンドボックスの特性(正確なOS情報、ネットワーク構成、またはインストール,またはエミュレートされたハードウェアなど)を測定してリークするWindowsベースのプログラムであるSandPrintを紹介する.対象としたのは以下のマルウェア解析サービスである.これらの11のサービスから2666の分析レポートを収集した.

サンドボックスを把握しようとする試みでは,教師なし学習メカニズムを使用して,SandPrintレポートとそのさまざまな機能をグループ化し,サンドボックスを識別する. このプロセスは76のサンドボックスを暴く,それらの多くは、マルウェア解析サービスとの自動サンプル交換によってサンプルを得ることが多い.

マルウェアサンドボックスを検出することは可能か? 今のところ、多くのマルウェアファミリーは,個々のサンドボックスアーティファクトを特定する(仮想化を検出したり、特定のサンドボックス構成を回避する)手法を持っている. 我々は代わりに,攻撃者が単一のサンドボックスの特性だけでなく、すべてのサンドボックスに固有の特性を検出する可能性があるかどうかを調べる(たとえば、SandPrintのようなツールを使用して).収集された特徴に基づいた教師あり学習を活用し,サンドボックスを確実に検出する自動分類を訓練する.

最後に、一般的なベンダーのマルウェアアプライアンスを検出する可能性に着目する.これらのアプライアンスが内部的にサンドボックス技術も使用しているため,同様の回避攻撃を受ける可能性が高い. 実際には,上記のサンドボックスの上だけで分類器を訓練することによって,攻撃者がアプライアンスを回避する可能性があることを示している.

この論文の貢献を要約を以下に示す. * マルウェアサンドボックスの特性を評価するためのツールであるSandPrintを提供した.それを20のパブリックなマルウェア解析サービスに提出し,教師なし学習技術を使用して76のサンドボックスの特性を特定した. * その結果得られたSandPrintレポートを活用して,サンドボックスとユーザシステムを確実に区別することができるようになった. * マルウェアセキュリティアプライアンスサンドボックスの内部を事前に把握しなくても,それを検出するためにパブリックサンドボックスから学んだ特性を使用できることを示した.

2.背景

この論文全体で使用する用語について説明する.「サンドボックス」という用語は,未知のプログラム(サンプルと呼ぶ)を実行する動的解析環境を指す.サンドボックスは,現在のキャンペーン[19],最近のC&Cサーバーとトラッキングパターン[46,36,44]や攻撃対象[26]など,悪意のあるソフトウェア(マルウェア)に対する識見を得るために広く使用される.同様に、サンドボックスを使用して,疑わしい行動パターンをマルウェアファミリーに分類したり,特定したりすることができる[32]. Egeleらは,既知のサンドボックス実装[24]の包括的な概要を示している.

マルウェアサンドボックスを使用するのは学者だけではない.手動分析とは対照的に,サンドボックスは高度に自動化されている.そのため,アンチウイルス業界のマルウェア対策アプライアンスやセキュリティ会社は,サンドボックスに大きく依存している.

仮想化

分析の規模を拡大するために、ほとんどのサンドボックスは,何らかの形の仮想化に依存している.(ベアメタル型のサンドボックスは例外[30,31]) このためサンドボックスは,VMWare [15]やVirtualBox [10]やCPUエミュレータ[17,4]などのさまざまな仮想化技術に依存している.Cuckoo Sandbox [8]は人気のあるオープンソースサンドボックスである.しかし,多くのセキュリティ組織は商用のサンドボックスから選択するか,独自のソリューションを設計するなど,他のサンドボックスを運用している.仮想化は,多くの仮想マシンVM)を1つのシステムで並列に実行し,それぞれ1つのサンプルを解析できるという利点がある.さらに,仮想化ソフトウェアは,VMのスナップショットを取ることでVMの状態を元の状態に戻すことができる.スナップショットは、マルウェアが実行されるとシステムの状態をリセットするのに役立つ.そのためマルウェア実行の影響を受けない.

オペレーティングシステム

サンドボックスの実装に関係なく,一般的なサンドボックスは,MS Windowsなどの一般的なオペレーティングシステムでサンプルを実行する.Windowsベースのマルウェアが流行しているため,Windowsベースのサンドボックスに焦点を当てるが,本手法はAndroidベースの[37]またはLinuxベースの[39]サンドボックスにも適用できる.

マルウェア解析サービス

マルウェア解析サービス(以下、単に「サービス」)は,サンドボックスとは対照的にサンプルの提出を(例えば、ウェブインターフェースを介して)受け取り,提出されたサンプルを様々な方法で解析し,解析結果をユーザに提供する.これらのサービスは通常,サンプルを分析するために1つまたは複数のサンドボックスを使用する.さらに、VirusTotal [14]やJottiのマルウェアスキャン[28]などのサービスは、アンチウイルススキャンを提供する.また,サービスが他のサンドボックスとサンプルを共有することは一般的である.実際、一部のサービスでは,サンプルのハッシュ値アンチウイルスラベルなどのさまざまなキーワードを使用して他のユーザーの提出物を検索することや,有料のAPIを使用して検索とダウンロードを自動化することができる.表2は、各サービスが提供する分析結果をまとめたものである.サンプルの提出を受け入れるが、分析結果をユーザーに提供しない9つのサービスがある.ベンダーからのフィードバックに従って,提出されたサンプルは,インターネットアクセスなしの隔離された環境で手動で解析した.

表2: 論文から引用 論文から引用

マルウェアセキュリティアプライアンス

サンドボックスは、市販のマルウェアセキュリティアプライアンス(または単に以下のアプライアンス)の不可欠な部分となってる.アプライアンスは,未知のプログラムを動的に解析し,疑わしい動作の動作を検査することによってエンドポイントを保護する.アプライアンスは,しばしばネットワーク層で展開され,悪意のある電子メールの添付ファイルや悪意のあるファイルのダウンロードをエンドポイントから保護するなどウイルス対策に使用される.アプライアンスは内部的はサンドボックス技術を使用してプログラムの動作を解析する.

3. サンドボックスのフィンガープリンティング

このセクションでは,インターネットに接続されたサンドボックスの状況を調査するために,サンドボックスを掘り下げます.フィンガープリントは個々のサンドボックスに特有のアーティファクトを示す.3.1節ではサンドボックスの特定の特性を明らかにする属性(24個の機能)について説明する.次に、サンドボックスから特性を抽出するツールであるSandPrintを紹介する. 3.2節では,このツールを使用して20の一般的なマルウェア分析サービスに送信してフィンガープリントを収集し,取得したデータセットについて説明する.

3.1サンドボックスフィンガープリントの特徴

個々のサンドボックスの特性を記述するために,サンドボックスを区別するために使用するフィンガープリンティング機能を紹介する.表1に示すように、24の機能のリスト(非網羅的)を提案する.これらの特性を次の5つのカテゴリに分類する.

1. インストールされたシステム

サンドボックスでは,サンプルを実行するためにオペレーティングシステム(OS)が必要である.通常,マニュアル操作を最小限に抑えるために,サンドボックスオペレータはOSを一度インストールして設定後,システムのスナップショットを作成する.サンドボックス(例えばVM)のすべての並列インスタンスが同じシステムスナップショットを使用すると仮定すると,これは実行の中に多くの特徴をもたらす.

2. ハードウェア

エミュレートされているかどうかにかかわらず,基本となるハードウェアはサンドボックスの固有の特性を明らかにすることができる. すべての特徴はハードウェアがエミュレートされているか、実際に物理的に存在しているかには依存しない.

3. ネットワーク構成

サンドボックスは、典型的には、サンプルがインターネット(例えば、C&Cサーバ)と通信できるように構成されている.つまり,ネットワークの特徴とローカルの設定を収集することができる.

4.アクティビティ

システムスナップショットは,過去に(すなわち、インストール時に)発生した特定のイベントを明らかにする. 一般に,これらの特徴はシステムがデフォルト設定に近いかどうかを測定できる.

5. 実行開始

新しく感染していないサンドボックスが開始されると,アナリストが解析したいサンプルを配置する必要がある. このプロセスを自動化する方法は複数存在する.

このリストは、他の特徴でも簡単に拡張できる.我々は,潜在的に高いエントロピーを示し,特定のサンドボックスに特化した特徴を優先させる.選択された特徴のほとんどは決定論的であり,その値は離散的で信頼性がある.ステルス・サンドボックスは,特徴の値を多様化しようとする可能性があることに注意する必要がある.

3.2 SandPrintによるサンドボックスのフィンガープリントの抽出

上記のすべての特徴をシステムから抽出するためのツールSandPrintを実装した.SandPrintは、Cで書かれたWindows 32ビットPEバイナリであり,Windows APIとカスタム関数を使用してその特徴を明らかにする.Sand-Printが実行されると、HTTPを使用してSandPrintサーバーと通信する.各SandPrintサンプルに一意の識別子が割り当てられ,HTTPセッションが確立されるとHTTP POST要求に埋め込まれたこのIDがサーバーに送信される.IDが送信された後,要求を検出するためにチャレンジ・レスポンス認証が行われる.この最初のハンドシェイクの後,,SandPrintはシステムの特徴の収集を開始します.特徴抽出の実装にはsysteminfo,netstat,ipconfigなどのコマンドを使用していない.これらは,しばしばシステムの機能を収集するために使用されるので,実際にはいくつかのサンドボックスが制限していると考えている.さらに(例えば、遅いディスクI / Oのために)個々の特徴を収集することによって生じる潜在的デッドロックを回避するため,特徴収集関数を複数のスレッドに渡って分散させた.加えて実行時間全体を見積もるために,ハートビートスレッドが,SandPrintが実行中であることをサーバに定期的に通知する.各スレッドは,特徴収集処理が完了した後にサーバに特徴を送信する.すべてのSandPrintはHTTPプロトコルを模倣しているため,Webサーバーと通信しているように見える.

我々は20種類のマルウェア解析サービスにSandPrintを提出し,フィンガープリントを収集した.表2にパブリックサービスをまとめた.これには,一般的な学術的サービスと非学術的サービスを含んでいる. 2016年1月5日から2016年1月18日まで,SandPrintを定期的に提出した.

各サービスについて,どこのファイルがどこにアップロードされたかをマップできるように,独自のSandPrintインスタンスを作成した.つまりセマンティクス機能は変更されていないが,その結果のハッシュは区別できる.さらに,実行時に計算される一意の識別子をサーバに報告し,そのサービスが生成する公開分析レポートと対応付ける.分析レポートの対応する識別子と後で一致させることで,レポートが特定のサービスによって生成されたことがわかる.合計で,440回の提出のちの221回から2666個の SandPrintレポートを収集した.平均して1提出ごとに6件のレポートが作成できた.レポートは33カ国を含む395のIPアドレスから送信された.後で説明するように、これは、(i)同じサンプルを複数回(同じサンドボックスまたはわずかに異なるサンドボックスで)再実行し、(ii)サンドボックス/サービス全体でサンプルを共有する傾向が強いことを示している.この観察をより詳細に研究し,さらなる分析のために同様のSandPrintレポートをグループ化する.

4サンドボックスクラスタリング

フィンガープリントの収集は2500以上のレポートから行った.しかし,本当に多くのサンドボックスが存在するのか?複数のレポートを返すサンドボックスがあるか?この質問に答えるために、このセクションでは,類似のレポートをグループ化し,どのレポートがどのサンドボックスによって送信されたかを識別するクラスタリング手法を紹介する.

4.1 クラスタリング

最初の観測では,レポートのリスト全体のサブセットが実際に同様の特性を共有していることが示されている.サンドボックスがすぐに複数のレポートを送信すると,2つのサンプルの実行全体に変わらない可能性が高い特徴が存在する.どちらのレポートにも同じ特徴が含まれているかどうかを確認することができる.しかし,実際には(意図的にでもそうでなくても)サンドボックスの特徴の一部が多様化することがわかった.我々は,同様のレポートをまとめるために教師なし学習技術を使用することを提案する.サンドボックスのラベルや根拠がないため、ここでは古典的な教師なし問題に直面している.集約的な階層的クラスタリングを使用してレポートをグループ化することを選択した.階層的クラスタリングは、カスタム距離関数を指定することができ,事前に予想されるクラスタの数を決定する必要がないという利点がある.距離関数は,2つのレポートがどのように異なるかを決定する.表1のすべての"クラスタリング"特徴(「チェックマーク」を参照)に対応する距離関数を定義する.すなわち,一対のレポートR1とR2について,すべての対の特徴の距離を合計し,平均距離を達成するために特徴の数で割る. 公式で表すとR1とR2との間の距離関数は以下のようになる.

distkは特定の特徴kの値の間の距離である.2つのレポート間で特徴を比較すると等価(EQ)が予想され,そうでない場合は最大相違点が仮定される.すなわち,両方のレポートにおいて特徴kが等しい場合にはdistk(R1; R2)はゼロであり,そうでない場合には1となる.個々のサンドボックスで変化することが観察された選択された特徴に対して,我々は平等になること期待しない・つまり,正規化編集距離(ED)を使用してホスト名を比較し,ユークリッド距離(EU)を展開してディスク名とサンプル名の長さを比較し,Jaccard距離(JD)を使用して最近開いたファイルを比較する.表1に,それに応じて分類した特徴比較方法を示す.すべての距離関数は,範囲[0; 1]を使用して,単一の特徴が偏りを生じさせないようにする. 場合によっては,比較対象のレポートに特徴が存在しない場合がある.この場合は,サンドボックスの解析時間が短すぎてすべての測定を完了できなかった場合など,SandPrintはいくつかの特徴を収集できなかった可能性がある.(たとえば,プログラムディレクトリ内のすべてのファイルを追跡するのに時間がかかる場合がある).疎な特徴に取り組むために,表1のチェックマークで示されているほとんどのレポートに含まれている特徴に焦点を当てる.レポートに残りのフィーチャの特徴がない場合は,2つの特徴が似ているかどうかを判断できない.この問題に対象するため,両方のレポートには存在しない特徴を無視し,それに応じてN(特徴の数)を減らし,平均を取ることで偏りを回避する. 次に,すべてのレポート間の距離を計算し,最も類似したものをグループ化し,凝集単一リンククラスタリングを使用する.このプロセスにより,樹状図(樹状図)が生成され,レポートがどれと一緒にクラスタ化されているかを表すことができる.クラスタリングの後,0.5未満の距離を有するグループをクラスタとみなす.このしきい値は,特徴の少なくとも半分が単一のサンドボックスのレポートで似ていると予想してつけた.

4.2 クラスタリングの結果と検証

クラスタリングは、2666のレポートを76クラスタに減らすのに役立った.これらのうち16個はシングルトンクラスタであり,データセットに1つのレポートのみを提供するサンドボックスである.最大のクラスタは233のレポートにまたがっており,カバレッジクラスタは44のレポートで構成される.シングルトンクラスタを除外すると35のレポートで構成される. クラスタリング出力を検証するために,私たちの研究チームを2つの別々のグループに分けた.1つのグループが独立して自動クラスタリングを設計し実行していた間に,もう1つのグループがクラスタリング出力を検証した.この目的のために,特定のサンドボックスに対して識別された独自の特性に基づいて,同様のサンドボックスを手動でグループ化した.このような優れた特徴ごとに,サンドボックスのすべてのレポートに一致する正規表現を定義した.エントロピーが偶然の衝突を回避するのに十分な大きさの特徴を選択し,サンドボックスごとに少なくとも2つの特徴を定義した. 次に、クラスタリングの結果を、検証グループによって行われた手動の「クラスタリング」の結果と比較した.手動による割り当ての結果は,クラスタ化の結果と同じだったが,自動のクラスタリングでは,手動でグループ化しなかった2つのサンドボックスがマージされていた.このケースでは,ユーザー名,ワーキンググループ名,およびホスト名は似ていたが,OSのインストール日は3年以上離れていた.それ以外は、それ以上の矛盾はなかったため,クラスタリング手法がSandPrintレポート(およびその特徴)を少数のサンドボックスに正確にマッピングできることを示していると言える.

4.3 サンドボックス vs サービス

表2は20のマルウェア解析サービスに対するSandPrintの提出の結果をまとめたものである.9つのサービスからのレポートはなかった.これは,これらのサービスによってデプロイされたサンドボックスにインターネット接続がないこと,または提出されたサンプルに対して動的解析を行わなかったことを意味する.SandPrintは,特徴を収集する前にまずサーバに報告するように実装されている.9つのサービスの初期接続も存在しないためレポートの欠如がフィンガープリントを避けようとしているからではないことが言える.データがないため,これらの9つのサービスを除外し,残りの11つのサービスに焦点を当てる.

4.4 マルウェア解析サービスとサンドボックスマッピング

次に,SandPrintレポートをマルウェア解析サービスにマップすることを目指す.サンドボックスをサービスにマッピングする方法は2つある. 1つ目は,サービスによって返された分析レポート(すなわちSandPrintではなくサービスによって提供されるもの)を調査する.これらのレポートには,提出されたサンプルの挙動が含まれる.そして,それぞれのSandPrintサブミッションに一意の識別子をエンコードした.これが解析レポートに表示される.サービス#2、#11、#13、#20の解析レポートでは,この識別子が見つかった. 2つ目に,残りのサービスをマップするため,サンプルを特定のサービスに提出したときに,一部のサンドボックスが排他的に使用されたかどうかを解析した.つまり,特定のサービスが利用するサンドボックスを特定する.図3(付録参照)は,11個のマルウェア分析サービス(y軸)に提出されたすべてのサンプルとレポートクラスタリング(x軸)に従って76個のサンドボックス間のマッピングを示している.いくつかのマッピングは,解析レポートによって確認することができた.一部のサンドボックスは同じサービスで頻繁に排他的に使用されていることがわかる.たとえば,Sandbox 69はService#11では常に使用され,他のサービスは使用されていない.そのような場合,サービス専用のサンドボックスだと結論づけることができる.合計で、11のサービスのうちの4つの専用サンドボックスを明らかにした. サービスにサンドボックスにマップした後,サービスに1つも属さない71個のサンドボックスが残った.これは図3にも示されているが,さまざまなサービスのサンプルを解析するために一般的に使用される多くのサンドボックスがリストされている.サンプルがサービス間で積極的に共有されることを強調する.

4.5 実証的サンドボックス分析

まず,システムのインストール時の特徴を調べた.これらのサンドボックスでOSが特定できた71個のサンドボックスのうち37個がWindows XPで,29のサンドボックスWindows 7であった.他の5つのサンドボックスWindows 8を実行する.インストール日は,サンドボックスの年齢に近似できる.インストール日が偽装されていないと仮定すると,取得されたOSのインストール日はすべて2008年から2016年の間であった.また,サンドボックスの半分以上が少なくとも3歳以上である.2014年に10のサンドボックスがインストールされていた.2015年または2016年にはすでに18のサンドボックスがインストールされていた.41のサンドボックスWindowsプロダクトIDは静的であり,18のサンドボックスはこの値を変更する.マルウェアWindows製品IDをサンドボックス識別の特徴として使用することが確認されているため,これは多様な目的に役立つ. サンドボックスのホスト名と所有者名の分布は,多様化しているか,完全に静的か2つの極端なケースに分類される.これは,サンドボックス開発者のが偽造されないようにする対策を講じるからだと推測する.ほとんどのホスト名と所有者名を多様化するサンドボックスのランダム化された名前は,一般的なプレフィックスや文字列の固定長などの共通パターンを示す. 場合によっては,サンドボックスの実装を推論することもできる.Cuckoo Sandboxには,サンプルの解析時に動作していなければならないagent.pyという特定のファイルが含まれる.最近の実行したファイルリストにagent.pyが含まれているかどうかを確認することで,Cuckoo Sandboxがインストールされ実行されているかを推測できる.サンドボックスが同じテクノロジを使用していても一緒にクラスタ化されていないことに注意する必要がある.これは主に,Cuckooなどの共通のフレームワークを使用しているかどうかにかかわらず,サンドボックスオペレータが独自のVMイメージを設定する必要があるためである.サンドボックスの中には同じ仮想化テクノロジを使用するものもありますが,これらのサンドボックスはインストール機能(OSのインストール日や製品IDなど)に基づいて区別される. 次に,サンドボックスで使用されているインターネットアップリンクを調べた.64のサンドボックスは,GeoIPに従う単一の国の外部IPアドレスを使用する.その中で1位は米国で22のサンドボックス,ドイツが6つのサンドボックスで2位,中国は5つのサンドボックスで3位,アイルランドは4つのサンドボックスで4位となった.スウェーデン,ロシア,韓国には3つのサンドボックスルーマニア,日本,イギリスには2つのサンドボックスがある.私たちは,外部IPアドレスの多様性が高く地理的位置を特定できない2つのサンドボックスが存在することに気付いた.これらのサンドボックスはTorを使用してIPアドレスを多様化している.また,29のサンドボックスでは固定IPアドレスが1つしか使用されていないため,サーバ側からの検出が容易である.たとえば,マルウェアサンプルがC&Cサーバーにコマンドを送信した場合,IPアドレスはそのサーバ上のブラックリストと照合され,そのサーバーは実行を停止するようにクライアントに指示できる. MACアドレスは,収集したすべての特徴の中で最高の多様性を示す.複数のSandPrintレポートで考慮されるように,単一の固定MACアドレスを使用するのは12のサンドボックスだけであった.大部分のMACアドレスは、少なくとも部分的に多様化されている(例えば、最初の3オクテット,すなわちベンダーIDは,しばしば固定されるが,残りは多様化される). これは,サンドボックスが複数のVMを並列に実行し,同じVMイメージを共有しているが,すべてが一意のMACアドレスを持ち,イーサネットレイヤ上での衝突を避けるためであると考えられる.ベンダーのプレフィックスを隠していないサンドボックスのうち,6つのVMwareベース(pre x:00-50-56)および21のVirtualBoxベース(pre x:08-00-27)のサンドボックスであることが明らかになった.

5. サンドボックス分類

フィンガープリントを使用して,特定のレポートが同じサンドボックスに属することを発見することができた.ここで,抽出した特徴を利用して,システムがサンドボックスであるかどうかを判断できるかどうかを検討する.直観的に,ハードウェアの制約、スナップショットベースの操作,ユーザーの操作不足からサンドボックス固有の特徴を探索する.これらの固有の特徴を使用して,教師あり機械学習技術を使用してサンドボックスを検出する方法を示す.まず,SVMSupport Vector Machine)[21]を使用したサンドボックスの分類と評価について述べる.

5.1 特徴選択

特徴選択の背後にある重要なアイデアは,人間の制御下にあるマシンではほとんど起こらないサンドボックス操作に特徴的なパターンを探すことである.特定のサンドボックスの特定のフィンガープリントを特定するのではなく,すべてのサンドボックスに共通のサンドボックス固有の機能を探す.

特徴選択プロセス

特徴選択のために,サンドボックスとしては使用されておらず,人間の管理下にある50の汎用WindowsワークステーションでSandPrintを実行する,次に,レポートを手動で調べ,サンドボックスレポートで確認した固有の意味のあるパターンを調査したが,ユーザーレポートではそれほど特徴が存在しなかった.表3はに,ハードウェア,履歴,実行の3つのカテゴリに分けて選択した特徴をまとめる.

2番目の列は特徴名,3番目はサンドボックスレポートからの観測値,最後の列は特徴値をSVMに渡す前に特徴値を整数に変換する方法を示している(5.2節で述べる). 従来の方法では,4:3の表示解像度といった具体的なサンドボックスシグネチャ値でレポートを検索していた.しかし,具体的な値を選択する際にはいくつかの問題がある.具体的な特徴値は必ず正確ではない.このため,このタスクをSVMクラスのトレーニングプロセスに任せる. 同様に,仮想化技術の検出も控え,サンドボックス固有の特徴に焦点を当てう.仮想化はサンドボックスの存在を示唆するが,保証でもない. たとえば,VMWare仮想マシンを示す1つのユーザーレポートが見つかった場合,このマシンをサンドボックスではなくユーザマシンとして分類する必要がある.逆に,サンドボックスたとえば,ベアメタルのサンドボックスの場合など,必ずしも仮想化を使用するとは限らない.私たちのクラスは,サンドボックスがスナップショットを使用し,リソースが制限されていて,ユーザーとのやり取りが乏しいという観察に基づいているため,仮想化が存在に依存せずシステムをサンドボックスとして分類できる.

特徴説明

これらの特徴について,より詳細に説明する.

  • ハードウェア特徴

    • CPUコア数
    • RAM容量
    • PS/2マウスの有無
    • ディスプレイ解像度

    サンドボックスオペレーターが並列化を活用するためにリソースを制限するという事実に基づく.したがって、サンドボックスはシングルコアであり,RAMをほとんど使用せず,ディスクのサイズが小さいのが一般的である.しかし平均的なユーザーPCではこれらの量がはるかに大きい.第2に,サンドボックスは通常人間によってインタラクティブに使用されないため,オペレータはしばしばハードウェア構成をカスタマイズしない.PS/2マウスや小さなディスプレイサイズ,珍しいディスプレイ解像度は,すべてサンドボックスの指標として利用できる.サンドボックスのこれらの構成は通常はデフォルトと同様である.ユーザは自分のVMを対話的に使用し,画面の解像度をカスタマイズし,より多くのコアとRAMを使用して計算能力を向上させる可能性が高い.

  • 履歴特徴

    • ログイン履歴
    • IEのアクセス履歴
    • システムの稼働時間

    サンドボックスがスナップショットテクノロジを活用するという観点に基づく.マルウェアサンプルを分析する前に,サンドボックスはシステム状態を以前にキャプチャされたクリーン状態(スナップショットと呼ばれる)に復元する.スナップショットは,通常サンドボックスの設定時に一度取得され,サンドボックスで使用される(更新されない限り).よって,履歴アーチファクトを示す可能性が高い.たとえば,スナップショットが数か月前に取得された場合,スナップショットが復元されるたびに,ログイン履歴によって最後のログインがその時点であったことがわかる.同様にIEのアクセス履歴も用いることができる.さらに,多くのサンドボックスがユーザーPCは通常より長い稼働時間を持つ.サンドボックスのレポートでは,システムの稼働時間が数秒で表示されることがよくあるが,アップタイムが大きいと感染している脆弱なシステム(たとえば、ドライブバイダウンロードによる)の可能性はかなり高くなる.

  • 実行特徴

    まれな実行パターンを示すサンドボックスが存在することに基づく.たとえば,サンドボックスはイメージの実行ファイル名を自動化の観点から扱いやすいものに変更する傾向があることがある.サンドボックスではMD5ハッシュやvirus.exeなどの総称名を使用するのが一般的であるが,ユーザーの報告によるとそのような名前変更は起こりにくい.また,サンドボックスクリップボードは空であるかランダムではない文字列が含まれていましたが,ユーザーのクリップボードはリンク,テキスト,またはオブジェクトなどの意味のある値を含む傾向がある. 最後に,サンドボックスはシステム製造元の値をユーザレポートでは確認できなかった空の文字列やランダムな文字列など,実際の名前を隠す可能性がある.

5.2 分類

前述の特徴を使用して,未知の特徴レポートがサンドボックスまたはユーザーPCのものかをどうかを予測するためのモデルを自動的に学習できる分類器を訓練する.このために,50のユーザーレポートすべてと,各サンドボックスクラスタからの選択した3つのランダムサンプルで構成されるトレーニングデータセットを構築した.合計で,202レポートのトレーニングセットを提供する.そのうちの50レポートはユーザーレポートで,152レポートはサンドボックスレポートである. 分類器を構築するために,ラジアル基底関数カーネルを持つSVMを使用する.SVMに渡す特徴ベクトルを正規化するには,特徴値を数値に変換する必要がある.この方法は表3の最後の列に示す.idは単純に数値を取ることを意味し,lenは特徴文字列の長さを考慮することを意味し,[0,1]はブール値である(PS / 2マウスがあるかないか).同様に、イメージ名の特徴については,イメージ名が変更されているかどうかをチェックする.4章で説明した理由により,すべての特徴がすべてのレポートで使用できるわけではないため,欠損値を推定するために平均代用を使用することにした.最後に値を[0; 1]の範囲で最小 - 最小スケーリングして使用する. クラスを構築するには,SVM正規化定数Cとカーネルパラメータの有効な組み合わせを指定する必要がある.この目的のために,グリッド検索と10-fold cross validationによるハイパーパラメータチューニングを使用して,クラスの精度を計算する.最初のステップでは,個々の特徴の強さを評価するために,個々の特徴ごとにクラスを作成した.この実験の結果は図1に示す.単一の特徴であっても,トップのRAM特徴で98:06%の精度でサンドボックスを検出することができた.

ただし,1つの特徴は,複数の特徴よりもサンドボックスオペレーターが簡単に修正できる. 我々はまた、すべての機能を訓練するクラスを作成しました。 図1の右端のグラフは,この分類器が100%の完全精度(偽陽性0および偽陰性0)を有し,複数の検出特徴を組み合わせる強度を示している.

5.3 既存のソリューションとの比較

私たちの分類器の評価ために,提案手法と既存の研究と比較する. 評価のためにマルウェアによって使用されているよく知られたサンドボックス検出技術のコレクションからなる人気のあるフレームワークParanoid Fish(Pafish)を使用した. PafishがSandPrintで使用した45の検出手法をエンコードし,実行した.これらの45件の検出結果を使用し,以前と同じ方法で分類器を構築した.各検出結果は1つのクラスを構築するための特徴であると考えており,45種類のすべての機能を組み合わせたクラスも作成した.これらの分類器の精度結果を図2に示す.明るい色の各グラフは単一の特徴の精度を示し,黒いバーはすべての特徴を組み合わせた分類器の精度を示す.単一の特徴の精度は推測より良くない.2つの機能は80%以上の精度を持ち,最も優れた単一特徴(仮想化を検出するためのrdtsc時間測定[18])は93%の精度である.組み合わせたバージョンの精度は97.8%であった.

より良い精度を持つことに加えて,提案手法がPafishよりも2つの理由で優れている.一つ目は,Pafishが主に仮想化の成果物をチェックしている点である.これは前述の理由から控えるべきである.2つ目は,Pafishのチェックの大半は,レジストリネットワークアダプタなどの情報である.こらはサンドボックスによって監視される可能性が高い.このため,Pafishはマルウェアとして検出される危険性がある.対照的に提案手法で用いる情報の抽出はよりステルスである.

5.4 まとめ

これまでに述べたように、サンドボックス固有の機能に基づいて,サンドボックスとユーザーマシンを確実に区別することができる. フィーチャの数は非常に少ないように見えるが,これらの特徴を非表示にすると,サンドボックスオペレーターに多くの苦労がある.画面サイズを変更し,USBエミュレートされたマウスに切り替えることは可能ですが,並列計算アーティファクトを取り除くことは簡単ではない.コアの数とメモリの量を増やすことは,サンドボックスの生産性を低下させるので,オペレータの選択肢ではない可能性がある.これはサンドボックスに多くのリソースを与えることで解決できる.同様に,スナップショットによって導入された履歴アーティファクトを回避するのにも苦労する.サンドボックスオペレータは、システム上のすべての関連する履歴情報が正常であるかどうかを確認できる.解決策は,サンドボックススナップショットをカスタマイズし,非サンドボックスシステムのように最新の状態に保つことである.残念ながらこれカスタマイズは労力が多く,エラーが発生しやすくなり,解析中のすべてのオペレーティングシステムを再実装する必要がある.サンドボックスオペレータが適用できる他の対策については,7.1節で述べる.そこでは,この側面と作業の倫理的な議論を組み合わせて議論する.

6. マルウェアアプライアンスの検出

アプライアンスは,マルウェアの完全な動作を分析するのではなく,機密性の高いインフラストラクチャをサイバー攻撃から保護するためにマルウェアを検出することが主な目的であるという点でサンドボックスとは異なります.高度な攻撃者は,アプライアンスを検出する技術に興味を持つかもしれない.攻撃者がアプライアンスを検出できた場合,アプライアンス内のアラートをトリガーしないように,プログラムの悪意ある動作を隠すことができる.5章の特徴選択を見ると,アプライアンスサンドボックスと同じ特徴特性を持っている可能性があることがわかる.これを検証するため,我々は有名なベンダーの人気のある3つのアプライアンスでSandPrintを実行した(個々のアプライアンスの弱点を突き止めないようにベンダー名を省略).この目的のために、アプライアンスのさまざまなインスタンスWindows 7Windows XP,32/64ビット,さまざまなサービスパックなど)に導入した.各インスタンスでSandPrintを4回実行し,40のレポートを収集した.アプライアンスはネットワーク通信を許可していないため,公開されているサンドボックスと同様に,特徴を取得するのは簡単ではなかった.この問題を解決するため,SandPrintを実行後,アプライアンスが作成した解析レポートに抽出された特徴をエンコードした.特徴レポートを手動で調べると,特徴の特性に関する仮定が正しいことがわかった.サンドボックスと同様に、アプライアンスは全ての特徴を持つ.いくつかの特徴はサンドボックスの場合よりもさらに強力であった.たとえば、すべての40のレポートには,画面幅が小さく,画面解像度が4:3であった. 次に,アプライアンスごとにサンドボックスおよびユーザーレポートでトレーニングした分類器がアプライアンスレポートをどれくらい正確に判定できるかを測定した.100%の精度で,分類器はすべてのアプライアンスを非ユーザーマシンとして検出した.しかし,重要なのは検出方法を隠蔽することである.アプライアンスが作成したレポートを確認すると,SandPrintがマザーボード情報,BIOS情報,シリアル番号などの情報を読み取ることで,多くのセキュリティ警告を作成していることがわかった.次に,Sandprintに使用された特徴がアラートのリストにも含まれているかどうかを確認した.Pafishがチェックがする多くの項目は,アプライアンスによって検出された.大部分のサンドボックス固有の特徴はアプライアンスのアラートにならなかったが,あるアプライアンスではディスク情報の読み取りを疑わしい動作とみなされた.これに対処するために,特徴ベクトルからディスク特徴を除去し,アプライアンスのレポートでクラスを再度評価し,ステルス回避について考慮した上で精度100%にした. 要約すると,攻撃者は公開されているサンドボックスの特性を明らかにし,収集した情報を使用して,ユーザーのPCとアプライアンスを完全に区別できるクラスを構築できる.セキュリティアプライアンスについての知識があれば,攻撃者は微調整することで,アプライアンスで検出されないようにすることができる.

7. 議論と制限

私たちの研究の倫理的側面と潜在的な限界について述べる.

7.1 倫理的な考慮事項

省略

7.2 責任ある開示

省略

7.3 独立したサンドボックス

ほとんどのサンドボックスは解析中のプログラムをインターネット上で通信することができましたが,9つのサービスと3つのアプライアンスは通信することができなかった.解析レポートのイベントに特徴をエンコードすることで分離されたサンドボックスアプライアンス)の特徴をある程度抽出することができる.ただし,これには分離されたサンドボックスにアクセスする必要があるため,攻撃者にとって特徴を入手しにくい可能性がある.提案するサンドボックス分類はネットワーク構成に依存する特徴を使用しなかったことに注意する必要がある.原則として,分類結果は非接続サンドボックスにも一般化する必要がある.提案する分類器では不十分な非接続のサンドボックスがある可能性を除外することはできないが,アプライアンスの検出に成功している.インターネットに接続されたサンドボックスが想定されているため実際のサンドボックスの数は,クラスタリング結果の示唆よりも高くなる可能性がある.しかし,分析は最も一般的な解析サービスサービス,統計的に重要なサンドボックスを対象に行っている.

8. 関連研究

省略

9. おわりに

現実のマルウェアサンドボックスの調査において,マルウェアサンドボックスであるかを把握することは非常に簡単である.調査用のバイナリを20のサービスにアップロードすることで,76のサンドボックスを識別しました.これらのサービスは,サンドボックス固有の特性に基づいて検出され回避された.マルウェアアプライアンスの検出と回避が同様に可能であることを示唆した.これは,今後のサンドボックス回避の脅威から,どのように保護することができるのかという疑問を呼び起こした.また,サンドボックスオペレータがマルウェアによって悪用されている可能性のある脅威について知らせるためのヘッドアップとして役立つ.

エンジニアが友利奈緒になるべき10の理由

本記事は「友利奈緒 Advent Calendar 2016」の1日目の記事です.

www.adventar.org

某日に発表したエンジニアが友利奈緒になるべき10の理由です.
さあみんなで友利奈緒になろうぜ!

www.slideshare.net

エクストリームCTFはつらい(Open xINTのWriteup?)

AVTOKYO内で開催されているOpen xINTに参加した。 初エクストリームCTFだったのでその記録。

Challenge1

ハッカーが運営しているWebサイトは、http://pinja.xyz だ。
そこからハッカーのメールアドレスを探し、入力せよ。

whoisしたらメールアドレスがあった。

Challenge2

ハッカーはFacebookのアカウントを持っているようだ。
そのアカウントのアドレスを入手し、入力せよ。
アドレスは https:// を含む形で入力すること。

Challenge1のメールアドレスをFacebookで検索したらでた.

Challenge3

ハッカーのFacebookを見ていると、食事の写真が投稿されている。どうやら誰かと食事をしているようだ。その人物から何か情報を引き出せるかもしれない。
まずは、その写真の飲食店を特定し、飲食店の座標を「Nxx xx xx:Exxx xx xx」の形式で入力せよ。
例. N35°41′35″E135°0′11″の場合、回答は「N35 41 35 E135 0 11」

これは、ExifとかstringsとかCTFっぽいことしてみたけどだめ・・・ わからんかったので諦め・・・

解法はこちら

Challenge4

どうやらハッカーと一緒に食事をしている人物は、私たちと同じくハッカーを調査しているようだ。その人物のFacebookアカウントを探し、アドレスを入手し、入力せよ。
アドレスは https:// を含む形で入力せよ。

共通の友達がどんどん増えてるアカウントがあったからそれを解答した. 申請送るのはやはりスパイとしてだめか・・・

Challenge5

Facebookに投稿された情報から推測される人物に接触し、うまく信用させて情報を引き出せ。
その情報を入力せよ。

Challenge4の人物と接触する必要がある。 プロフィール写真と"背中で語る"とあったのでそれっぽいシャツを着ている人を探す必要がある。 "同じくハッカーを調査しているようだ"とあったのでメッセージで協力を要請してみたが既読無視辛い。 メタを読んで中の人が頼みそうな人でそれっぽいシャツを着てた相戸さんに声をかけた。 どうやら一人っぽい

こんな紙をもらった

よく考えると高嶺ってことで一人に絞れたな・・・

Challenge6

もらった情報から推測される「モノ」を回収して調査、得られる適切な情報を入力せよ。

ここから地獄・・・ ターゲットの投稿を見ると

代々木公園駅つきました。

途中で、資料の入ったメモリを落としたらしい。

MAMORIOつけているから大丈夫かな。

ここでまたメタると,エクストリームCTFか・・・
AVTOKYO中に会場の外行かせるってまじかーーー

とりあえずMAMORIOをインストールして,代々木公園駅へ行く。
この時点で17:30くらい・・・MAMORIOの仕様がわからなかったり、駅から会場までの道のどちら側にあるかわからずに苦戦。

行きと逆の方向でMAMORIOに反応があった! きたーーーーーーーーーーーーーーーってなったものの周りにそれらしきものはなかった。

一時間経過したころ。 Facebookに新しい投稿があった・

こういうときは専用アプリで見つけられると思う。駅から会場までの間に落としたのかも。ずっと右側通行できたから、帰りに見つけられるかな。

おせえよ・・・反応あったけどみつからないよ・・・どんな形のものとこか、色とか教えてくれ・・・

とりあえず私有地はありえんだろうということで草をかき分け、空き缶を拾い、ピーポくんのストラップを拾い、電話ボックスの中に入り、捨ててあるゴミ袋を開いたり・・・完全に不審者。

結局見つからずもうすぐAVTOKYOも終わるということで帰った・・・

MAMORIOには反応があったのにな・・・

Challenge7

モノ」を調査した結果、闇サイト運営者のハッカーの正体が分かる。早速その「モノ」に罠ファイル(リンク貼る)を仕掛けろ。その後、ハッカーに接触して、不審に思われないよう「モノ」を渡せ。
その人物から渡された「ご褒美ワード」を入力せよ。

ダメ

結果

5位だった・・・お部屋にいて講演聞いている人に負けた。 いろいろ探し回ってる間に抜かれてた・・・ つらいな・・・

あと@luminさんと回収に行ったら探してたとこにあった。 まじか・・・ USBメモリがそのまま置いてあったので、暗かったし見つけれなかったんだろうか・・・ 辛い。

いつもみたいにミンティアに入ってるだろーって予想して細かく見れてなかったのが敗因かもしれない。

エクストリームCTFはつらい。

SECCON2016 大阪大会参加してきた・・・(だめ)

SECCON2016 大阪大会に参加してきた。
集まれバイナリアンとか書いてあって不安だった。

結果はたぶん8位
自分は全然だめだった・・・
自動化まで完成させて点を取ってくれたチームメイトに感謝。

しかし面白い形式のCTFだったので楽しめた。
せっかくなのでもっと解ければよかった。

以下問題と反省

(追記) チームメイトの記事

SECCON2016 大阪大会(アツマレバイナリアン)ひとり反省会 - ヾノ*>ㅅ<)ノシ帳

問題

問題数は多いが形式は4つ。

とりあえずバックドアを探す簡単なやつをみた。 バイナリを読むと特定のバイナリ列をある値で一文字ずつxorしてその値と一致するればsecretを読み込んで出力していることがわかった。 このロジックはバイナリが変更されても変わらず、バイナリ列とxorのキーが変更されるだけだった。

angrで書くとこんな感じ f:id:pinksawtooth:20161002220814p:plain こいつの出力をbase64してバイナリに渡すとフラグが出る。

ほんとうは競技中angr使えてません・・・手動でやった。

(追記) せっかくだからangrに必要なアドレスの取得まで自動化までしてみようということで書いたスクリプトと簡単な説明。

サーバとの接続,バイナリのダウンロードは岩村さんがサンプルとしてくれてたのでそれを利用する。

いくつかのバイナリを解析するとこんな感じのフラグ出力の前後で命令列が共通していることがわかる。

  40015b:       75 ed                   jne    0x40014a
  40015d:       e8 1e 00 00 00          call   0x400180
  400162:       6a 00                   push   0x0
  400164:       e8 b8 00 00 00          call   0x400221

call 0x400180ではsecretをopen,read,writeしている 。 小さいバイナリなのでpush 0x0の"6a 00"で該当箇所を絞り、さらにjneの直後で現れるという条件を足すとangrに必要なアドレスを求めることができた。 テストケースは手元にあった10個くらいなのでほんとうに全部いけるかわからない。

import commands, angr, base64


bin_file = "bin_213a7d9cd94ce0a17e8a821875f3046f.elf"
cmd = "objdump -d  -Mintel %s | grep -B 2  -A 1 '6a 00' | grep 'jne' -A 1 | awk 'NR==2' | awk -F: '{print $1}'" % bin_file
#print cmd

def main():
    str = commands.getoutput(cmd)
    addr = str.strip()
    #print addr
    p = angr.Project(bin_file, load_options={'auto_load_libs': False})
    ex = p.surveyors.Explorer(find=(int(addr,16)))
    ex.run()

    return ex.found[0].state.posix.dumps(0).strip('\0\n')

if __name__ == '__main__':
    print base64.b64encode(main())

反省

”実行ファイルを解析するのはもう普通!これからの時代は、いかに速く解析できるかだ!!” とHPにあったとおり,今回の競技はいかにはやく自動化するかが勝負を分けた。

手動解析でロジックを特定したが,自動化に手間取ってしまったため出遅れたかなと思う。 とくに自分自身をインポートするという頭付いてないことしてて競技中に動かなかった・・・ひどいミスをしてangrを使えなかったのが無限につらい・・・

WinDbgでシステムコールをフックして引数を確認する

今回はWinDbgシステムコールをフックして,システムコール呼び出し時の引数を確認する.

環境構築は前のブログを参照.

pinksawtooth.hatenablog.com

まずはNtCreateUserProcessのアドレスの確認する.

u nt!NtCreateUserProcess:
fffff803`d04cce1c 4c8bdc          mov     r11,rsp
fffff803`d04cce1f 53              push    rbx
fffff803`d04cce20 56              push    rsi
fffff803`d04cce21 57              push    rdi
fffff803`d04cce22 4154            push    r12
fffff803`d04cce24 4155            push    r13
fffff803`d04cce26 4156            push    r14
fffff803`d04cce28 4157            push    r15

ブレークポイントを設定する.

bp fffff803`d04cce1c

再開して,プロセスを実行する. 今回はcmd.exeからnotepad.exeを起動した.

kd> g
Breakpoint 0 hit
nt!NtCreateUserProcess:
fffff803`d04cce1c 4c8bdc          mov     r11,rsp

スタックトレースを確認する. cmdからCreateProcessWが呼ばれて最終的にNtCreateUserProcessに到達したことがわかる.

kkd> kb
 # RetAddr           : Args to Child                                                           : Call Site
00 fffff802`139e2263 : fffff6fb`5fff2c80 fffff6bf`fe590250 fffff920`7bec5a65 00000000`00000000 : nt!NtCreateUserProcess
01 00007ffc`b20840ea : 00007ffc`af4473ab 00000000`00000008 000000c1`4807e5a0 00000000`00000001 : nt!KiSystemServiceCopyEnd+0x13
02 00007ffc`af4473ab : 00000000`00000008 000000c1`4807e5a0 00000000`00000001 00000000`00000000 : ntdll!NtCreateUserProcess+0xa
03 00007ffc`af484c06 : 00000000`00000012 00000000`00000020 000000c1`480c0318 000000c1`4807ede8 : KERNELBASE!CreateProcessInternalW+0xc5b
04 00007ffc`b1e8df33 : 00000000`00000000 00007ff6`665f80e8 000000c1`480cd2ee 00007ff6`00000003 : KERNELBASE!CreateProcessW+0x66
*** ERROR: Module load completed but symbols could not be loaded for cmd.exe
05 00007ff6`665d630c : 00000000`00000001 000000c1`4807f870 000000c1`480ca860 00000002`fffffa56 : KERNEL32!CreateProcessWStub+0x53
06 00000000`00000001 : 000000c1`4807f870 000000c1`480ca860 00000002`fffffa56 00000000`00000001 : cmd+0x630c
07 000000c1`4807f870 : 000000c1`480ca860 00000002`fffffa56 00000000`00000001 00000000`00080000 : 0x1
08 000000c1`480ca860 : 00000002`fffffa56 00000000`00000001 00000000`00080000 00000000`00000000 : 0x000000c1`4807f870
09 00000002`fffffa56 : 00000000`00000001 00000000`00080000 00000000`00000000 00007ff6`66610920 : 0x000000c1`480ca860
0a 00000000`00000001 : 00000000`00080000 00000000`00000000 00007ff6`66610920 000000c1`4807eed0 : 0x00000002`fffffa56
0b 00000000`00080000 : 00000000`00000000 00007ff6`66610920 000000c1`4807eed0 000000c1`4807eeb8 : 0x1
0c 00000000`00000000 : 00007ff6`66610920 000000c1`4807eed0 000000c1`4807eeb8 000000c1`c80005cd : 0x80000

引数を確認するためにスタックとレジスタを表示する.

kd> r
rax=0000000002000000 rbx=0000000000000008 rcx=0000006582ede970
rdx=0000006582ede9d8 rsi=0000000000000001 rdi=0000000000000000
rip=00007ffafbe140e0 rsp=0000006582ede888 rbp=0000006582edfdf0
 r8=0000000002000000  r9=0000000002000000 r10=0000000000000200
r11=0000006582ede860 r12=0000000000000008 r13=00000065830c9230
r14=00000065830cda90 r15=0000000000000204
iopl=0         nv up ei pl nz na pe nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
ntdll!NtCreateUserProcess:
0033:00007ffa`fbe140e0 4c8bd1          mov     r10,rcx
kd> dq rsp
00000065`82ede888  00007ffa`f92973ab 00000000`00000008
00000065`82ede898  00000065`82edeb20 00000000`00000001
00000065`82ede8a8  00000000`00000000 00000000`00000000
00000065`82ede8b8  00000000`00000000 00000000`00000204
00000065`82ede8c8  00000065`00000001 00000065`830cda90
00000065`82ede8d8  00000065`82edebc0 00000065`82edee50
00000065`82ede8e8  00000000`00000000 00000065`82edec00
00000065`82ede8f8  00000000`00000000 00000000`00000000

x64呼び出し規約では,第1引数から第4引数まではRCX,RDX,R8,R9に格納される.第5引数以降はスタックに格納される. スタックには戻りアドレスの後,第1引数から第4引数のHome領域が確保される.このためrspから40バイト目以降が引数となる. (00000065`82ede8a8の2つめの値からが引数)

NtCreateUserProcessの引数は以下の様に定義されている.

NtCreateUserProcess(
    PHANDLE ProcessHandle,
    PHANDLE ThreadHandle,
    ACCESS_MASK ProcessDesiredAccess,
    ACCESS_MASK ThreadDesiredAccess,
    POBJECT_ATTRIBUTES ProcessObjectAttributes,
    POBJECT_ATTRIBUTES ThreadObjectAttributes,
    ULONG ProcessFlags,
    ULONG ThreadFlags,
    PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
    PPROCESS_CREATE_INFO CreateInfo,
    PPROCESS_ATTRIBUTE_LIST AttributeList
    );

つまり

1  PHANDLE ProcessHandle = rcx = 0000006582ede970 
2  PHANDLE ThreadHandle = rdx = 0000006582ede9d8
3  ACCESS_MASK ProcessDesiredAccess = r8  = 0000000002000000
4  ACCESS_MASK ThreadDesiredAccess = r9  = 0000000002000000
5  POBJECT_ATTRIBUTES ProcessObjectAttributes = 00000000`00000000
6  POBJECT_ATTRIBUTES ThreadObjectAttributes = 00000000`00000000
7  ULONG ProcessFlags = 00000204
8  ULONG ThreadFlags = 00000001
9  PRTL_USER_PROCESS_PARAMETERS ProcessParameters = 00000065`830cda90
10 PPROCESS_CREATE_INFO CreateInfo = 00000065`82edebc0
11 PPROCESS_ATTRIBUTE_LIST AttributeList = 00000065`82edee50

となる.

Pというプレフィックスがついているのはポインタとなっているため値を確認するためには,そのアドレスの値を見る必要がある.

PRTL_USER_PROCESS_PARAMETERS ProcessParameters の詳細を確認する. ProcessParametersはRTL_USER_PROCESS_PARAMETERS構造体へのポインタとなっている. RTL_USER_PROCESS_PARAMETERS構造体はWindows Vista以降で変更されている模様.

kd> dt _RTL_USER_PROCESS_PARAMETERS
ntdll!_RTL_USER_PROCESS_PARAMETERS
   +0x000 MaximumLength    : Uint4B
   +0x004 Length           : Uint4B
   +0x008 Flags            : Uint4B
   +0x00c DebugFlags       : Uint4B
   +0x010 ConsoleHandle    : Ptr64 Void
   +0x018 ConsoleFlags     : Uint4B
   +0x020 StandardInput    : Ptr64 Void
   +0x028 StandardOutput   : Ptr64 Void
   +0x030 StandardError    : Ptr64 Void
   +0x038 CurrentDirectory : _CURDIR
   +0x050 DllPath          : _UNICODE_STRING
   +0x060 ImagePathName    : _UNICODE_STRING
   +0x070 CommandLine      : _UNICODE_STRING
   +0x080 Environment      : Ptr64 Void
   +0x088 StartingX        : Uint4B
   +0x08c StartingY        : Uint4B
   +0x090 CountX           : Uint4B
   +0x094 CountY           : Uint4B
   +0x098 CountCharsX      : Uint4B
   +0x09c CountCharsY      : Uint4B
   +0x0a0 FillAttribute    : Uint4B
   +0x0a4 WindowFlags      : Uint4B
   +0x0a8 ShowWindowFlags  : Uint4B
   +0x0b0 WindowTitle      : _UNICODE_STRING
   +0x0c0 DesktopInfo      : _UNICODE_STRING
   +0x0d0 ShellInfo        : _UNICODE_STRING
   +0x0e0 RuntimeData      : _UNICODE_STRING
   +0x0f0 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
   +0x3f0 EnvironmentSize  : Uint8B
   +0x3f8 EnvironmentVersion : Uint8B
   +0x400 PackageDependencyData : Ptr64 Void
   +0x408 ProcessGroupId   : Uint4B
   +0x40c LoaderThreads    : Uint4B
   +0x060 ImagePathName    : _UNICODE_STRING
   +0x070 CommandLine      : _UNICODE_STRING

には実行されたプロセスのフルパスとコマンドライン引数が格納されている.

ImagePathNameの値を確認するため

00000065`830cda90+0x060

のメモリを見る. ImagepathNameは,UNICODE_STRING型となっている.UNICODE_STRING型は

kd> dt _UNICODE_STRING
ntdll!_UNICODE_STRING
   +0x000 Length           : Uint2B
   +0x002 MaximumLength    : Uint2B
   +0x008 Buffer           : Ptr64 Uint2B

と定義されている.

00000065`830cda90+0x060+0x008

のメモリ上にbufferのアドレスが格納されている.

バッファのアドレスにはフルパスの文字列が格納されている.

同様にコマンドライン引数も格納されている.

00000065`830cda90+0x070+0x008