内角540°

セキュリティ。SIEMとかIPSとか統計とかクラウドとか。数学以外で。

SSRF

SSRF(サーバサイドリクエストフォージェリ)について、情報を集めて自分用に整理した。

以前からある攻撃ですが、最近話題になることが多い。
影響の割に、十分な認識がされていない脆弱性と感じる。
今回は、テストの方法を調べてみた。

SSRFの典型的な攻撃

攻撃環境

攻撃者から接続可能なWebサーバがあり、その後ろに攻撃対象のサーバが存在する。
攻撃対象のサーバは攻撃者から直接アクセスすることはできないが、SSRFではWebサーバを踏み台にすることで攻撃対象へ間接的にアクセス可能となる。

f:id:gokaxtukei:20190126183107p:plain

攻撃の流れ

①攻撃者からWebサーバへ、SSRFの脆弱性を悪用するリクエス
②Webサーバは攻撃対象サーバへリクエス
③攻撃対象サーバは、Webサーバは信頼できるのでWebサーバへ応答
④Webサーバから、③の応答が転送される

f:id:gokaxtukei:20190126184528p:plain

この攻撃でできること
  1. 攻撃対象サーバに実装されていたアクセス制御の回避したアクセス(FWやACL、ホストベース認証などの回避)
  2. 外部からアクセスできないリソースの読み取り[1]
  3. リバースプロキシ環境では、背後の環境(IPアドレスなど)を取得
  4. 内部環境のスキャンや、ファイルの読み取り[2]

[1]例
AWSの場合、「アクセスキー」などの情報を表示するURLへアクセスできる。

&url=http://169.254.169.254/latest/meta-data/ami-id
パスは他にも、
("/latest/meta-data/iam/security-credentials/")
("/latest/user-data/")

参考
Abusing the AWS metadata service using SSRF vulnerabilities - Christophe Tafani-Dereeper
インスタンスメタデータとユーザーデータ - Amazon Elastic Compute Cloud
Server Side Request Forgery - OWASP

[2]例:スキャン
https:// victim.com/image.php?url=127.0.0.1:3306 の応答の違いで判定

参考
Server Side Request Forgery - OWASP
The Server Side Request Forgery Vulnerability and How to Prevent It - DZone Security

SSRFのテスト

OWASP Testing Guideのテスト

テストガイドに何が書いてあるか確認。

v4には項目がない?
OWASP Testing Guide v4 Table of Contents - OWASP

v5はまだ記載がない?
OWASP-Testing-Guide-v5/Testing for Server-Side Request Forgery (SSRF) at master · OWASP/OWASP-Testing-Guide-v5 · GitHub

テストの組み立て

URLを直接指定したパラメータや、それに準ずるパラメータについて、
値を書き換えて送信する。

[例]ローカルのポート番号1000へスキャン。
変更前:https ://victim.com/hoge?url=http://example.com/index.html
変更後:https ://victim.com/hoge?url=http://127.0.0.1:1000


テストの実施
SSRF - Server Side Request Forgery

リクエストの組み立て例
GitHub - cujanovic/SSRF-Testing: SSRF (Server Side Request Forgery) testing resources

クラウドメタデータ置き場
Cloud Metadata Dictionary useful for SSRF Testing · GitHub

SSRFの対策

今回の目的から外れるが、見つけた対策記事を記載。

完全ではないが、緩和策が記載されている。
The Server Side Request Forgery Vulnerability and How to Prevent It - DZone Security


先生の記事を参考にさせていただく。
SSRF(Server Side Request Forgery)徹底入門 | 徳丸浩の日記

任意のURLを受け付ける機能は可能な限りなくすべき。(オープンリダイレクト問題もあるし)
そのほか、緩和策を書いてくださっております。

cookie

#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import tkinter
import urllib.request ,urllib.parse
import re

root = tkinter.Tk()
v = tkinter.IntVar()
v.set(1)

def create_widgets(self):

	self.useProxyCheck = tkinter.Checkbutton(text=u'Proxyを使用(未実装)')
	self.useProxyCheck.grid(column=0, row=1)
	self.proxyAddress = tkinter.Entry(self)
	self.proxyAddress.grid(column=1, row=1)
	self.msgTargetURL = tkinter.Label(text=u'宛先URL').grid(column=0, row=2)
	self.TargetURL = tkinter.Entry(self)
	self.TargetURL.insert(tkinter.END,"https://**.jp/")
	self.TargetURL.grid(column=1, row=2)

	self.radio1 = tkinter.Radiobutton(text = u"機能1:GetHeader", variable = v, value = 1)
	self.radio1.grid(column=0, row=3)
	self.radio2 = tkinter.Radiobutton(text = u"機能2:GetCookie(未実装)", variable = v, value = 2)
	self.radio2.grid(column=1, row=3)
	self.cookieName = tkinter.Entry(self)
	self.cookieName.insert(tkinter.END,"Cookie名")
	self.cookieName.grid(column=2, row=3)

	self.msgTargetURL = tkinter.Label(text=u'grep:').grid(column=0, row=4)
	self.grepBox = tkinter.Entry(self, width=60)
	self.grepBox.grid(column=1, columnspan=3,row=4)

	self.resultBox = tkinter.Text()
	self.resultBox.grid(columnspan=4)

	self.buttonRun = tkinter.Button(text=u'Run', width=60)
	self.buttonRun.bind("<Button-1>",ShowURLHeader) 
	self.buttonRun.grid(columnspan=4)

	self.buttonClear = tkinter.Button(text=u'Clear', width=60)
	self.buttonClear.bind("<Button-1>",resultClear) 
	self.buttonClear.grid(columnspan=4)

def resultClear(event):
	root.resultBox.delete(1.0,tkinter.END)

def GetURLHeader(url):
	print(url)
	return urllib.request.urlopen(url)

def ShowURLHeader(event):
	if root.TargetURL.get() and not root.grepBox.get():
		response = GetURLHeader(root.TargetURL.get()).info()
		root.resultBox.insert(tkinter.END,response)
		root.resultBox.place()
		print(type(GetURLHeader(root.TargetURL.get())))

	elif root.TargetURL.get() and root.grepBox.get():
		pattern = re.compile(root.grepBox.get(), re.IGNORECASE)
		for line in GetURLHeader(root.TargetURL.get()).getheaders():
			line = ": ".join(line)
			if re.search(pattern,line):
				print(re.search(pattern,":".join(line)))
				root.resultBox.insert(tkinter.END,line + '\n')
				root.resultBox.place()

create_widgets(root)





root.mainloop()

Windows プリフェッチの分析

Prefetchとは

Windowsで、アプリケーションの起動時間を短縮するためのデータキャッシュ。
アプリケーションが起動してから10秒間の情報を記録している。

ファイルの実行痕跡だけでなく、
・実行ファイルの場所
・過去に何回実行されたか
などなど…記載されるため、マルウェアの挙動解析として活用できる。

配置場所

プリフェッチファイルは下記のパスに拡張子[.pf]として作成される。

%Systemroot%\prefetch

f:id:gokaxtukei:20180203184037p:plain

最大128個のプリフェッチファイルが作成される
https://blogs.msdn.microsoft.com/ryanmy/2005/05/25/misinformation-and-the-the-prefetch-flag/

記述フォーマット

内部は専用のフォーマットで記載されており、容易に読み取れない。
f:id:gokaxtukei:20180203184116p:plain
http://forensicswiki.org/wiki/Windows_Prefetch_File_Format

分析時にはツールを使用し、情報を確認する。

プリフェッチの設定

regeditでロギング対象を設定できる。

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters

EnablePrefetcherに以下を設定する。

value* ロギング対象*
0 停止
1 アプリケーション起動
2 システム起動
3 すべての起動

f:id:gokaxtukei:20180203184150p:plain

※3に設定しても、最大128ファイルまでしか作成されない

命名規則

プリフェッチファイルの名前は実行ファイル名と、ハッシュ値で決定する。

[アプリケーション名]-[ファイルパスをベースにしたハッシュ値].pf

e.g.
WIRESHARK.EXE-76B1D076.pf

異なるパスから実行された同一名の実行ファイルは、別々のプリフェッチファイル名となる。
そのため、ファイル名だけ正規を模した不審なファイルは、これで判別がつけられる。

Prefetch hash
http://forensicswiki.org/wiki/Prefetch

解析

プリフェッチファイルにはフォレンジックに欠かせない情報がいろいろはいっている。

  • 「どこのパスから実行されたか(Process Path)
  • 「初めての実行はいつか(Created Time)」
  • 「最新の実行はいつか(Last Run Time)」
  • 「何回実行されたか(Run Counter)」
  • 「何のファイルをロードしたか」

マルウェアであり、大量に実行されている場合はタスクスケジュールなどに登録されているかもしれない。
→(追加でjobファイル等も参照する)
プロキシで大量通信イベントが発生しているタイミングでの実行ログであれば、目的実行のマルウェアとも推測できるかも。

ファイルが消されていても推測可能で、解析の足がかりになる。

強力なツール化を活用することで、情報整理しながら解析を行うのがよい。

CLI(Windows-Prefetch-Parser)

使ったこと無いが…CLIツールも複数あり。
https://github.com/PoorBillionaire/Windows-Prefetch-Parser

f:id:gokaxtukei:20180203184246p:plain

おわりに

プリフェッチはWindowsフォレンジックにおいて、解析の足がかりになる。
闇雲に不審ファイルを探すのは楽しいが、時間がかかり、イケてないので
強力なツールと残された痕跡で効率よく追跡する。

forensicswiki.org はなんでも載ってる、偉大。

SIEM相関ルール成熟までのプロセス

Gartnerさんに掲載された記事。
問題は何か、明確にすることが大前提であり、
SIEMやSIEMによる相関ルールが目的にはならないことを強く推している。

SIEM Use Case Implementation and Tuning Process
blogs.gartner.com

続きを読む

SIEMの活用と成熟過程(SIEM Use Cases and Process Maturity)

McAfeeに掲載されたGrant Babbさんの"SIEMの活用"に関する記事。
とても良い記事でした(・o・)

SIEM Use Cases and Process Maturity
https://community.mcafee.com/community/business/siem/blog/2012/12/24/siem-use-cases-and-process-maturity--the-plays-to-run

続きを読む