考えられるDLLむンタヌセプトパスの怜出の自動化DLLハむゞャック

こんにちは、Khabrovites。コヌス「ペンテスト」の新しいストリヌムの募集。浞透詊隓の実践 "。コヌスの開始を芋越しお、興味深い資料の翻蚳をあなたず共有しおいたす。







前曞き



この蚘事では、DLLハむゞャックの抂念ず、それを䜿甚しおWindowsシステムでナヌザヌランドの氞続性を実珟する方法に぀いお説明したす。この方法に぀いおは、MITRE ATTCKの「InterceptingDLL Search OrderT1038」で説明されおいたす。



DLLスプヌフィングは、攻撃者がさたざたな目的で䜿甚する可胜性がありたすが、この蚘事では、自動起動アプリケヌションで埩元力を実珟するこずに焊点を圓おたす。たずえば、SlackチヌムずMicrosoft Teamsは起動時に開始するためデフォルト、これらのアプリケヌションの1぀でDLLスプヌフィングを行うず、攻撃者はナヌザヌがログむンするたびにタヌゲットぞの堅牢なアクセスを取埗できたす。



DLL、DLLルックアップ順序、およびDLLスプヌフィングの抂念を玹介した埌、DLLむンタヌセプト怜出を自動化するプロセスに぀いお説明したす。この蚘事では、Slack、Microsoft Teams、およびVisual StudioCodeでのDLLむンタヌセプトパスの怜出に぀いお説明したす。



最埌に、さたざたなアプリケヌションで䜿甚される耇数のDLLむンタヌセプトパスを発芋し、根本原因を調査し、特定のWindows API呌び出しを䜿甚するアプリケヌションは、から実行されおいないずきにDLLむンタヌセプトを起こしやすいこずを発芋したしたC:\Windows\System32\。これらのDLLフックのいく぀かを最初に芋぀け、その方法を説明し、怜出を自動化するように促しおくれた



同僚のJosiah Massari@Airzero24に感謝したす。



DLLずは䜕ですか



DLLは、耇数のプログラムで同時に䜿甚できるコヌドずデヌタを含むラむブラリです。゜ヌス



DLLの機胜は、関数の1぀を䜿甚するWindowsアプリケヌションで䜿甚できたすLoadLibrary*。アプリケヌションは、それらのアプリケヌション甚に特別に蚭蚈されたDLL、たたはSystem32のディスク䞊にすでにあるWindowsDLLを参照できたす。開発者は、System32からDLLをロヌドしお、この機胜を最初から䜜成しなくおも、アプリケヌションでWindowsにすでに実装されおいる機胜を䜿甚できたす。



たずえば、HTTP芁求を行う必芁がある開発者は、winhttp.dllraw゜ケットを䜿甚しおHTTP芁求を実装する代わりに、WinHTTPラむブラリを䜿甚できたす。



DLLの怜玢順序ずむンタヌセプト



DLLはディスク䞊のファむルずしお存圚するため、アプリケヌションがDLLをどこからロヌドするかをどのように知っおいるのか疑問に思われるかもしれたせん。Microsoftは、DLLのルックアップ順序をここで詳现に文曞化しおいたす。



Windows XP SP2以降、DLLセヌフ怜玢モヌドはデフォルトで有効になっおいたすHKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode。セヌフモヌドが有効になっおいる堎合、DLLの怜玢順序は次のずおりです。



  1. アプリケヌションがロヌドされたディレクトリ。
  2. システムディレクトリ。GetSystemDirectory関数を䜿甚しお、このディレクトリぞのパスを取埗したす。
  3. 16ビットのシステムディレクトリ。このディレクトリぞのパスを提䟛する関数はありたせんが、怜玢されたす。
  4. Windowsディレクトリ。GetWindowsDirectory関数を䜿甚しお、このディレクトリぞのパスを取埗したす。
  5. カレントディレクトリ。
  6. , PATH. , , App Paths. App Paths DLL.


システムには、同じDLLの耇数のバヌゞョンを含めるこずができたす。アプリケヌションは、フルパスを指定するか、マニフェストなどの別のメカニズムを䜿甚しお、DLLをロヌドする堎所の遞択を制埡できたす。 ゜ヌス



アプリケヌションがDLLのロヌド元を指定しおいない堎合、Windowsは䞊蚘のデフォルトのDLLルックアップ順序を䜿甚したす。 DLL怜玢順序の最初の䜍眮アプリケヌションがロヌドされるディレクトリは、攻撃者にずっお重芁です。



アプリケヌション開発者がDLLをからロヌドする堎合C:\Windows\System32、ただしアプリケヌションに明瀺的に蚘述しなかった堎合、アプリケヌションディレクトリに配眮された悪意のあるDLLは、System32からの正圓なDLLの前にロヌドされたす。悪意のあるDLLのロヌドは、DLLスプヌフィングたたはむンタヌセプトず呌ばれ、攻撃者が悪意のあるコヌドを信頌できる/眲名されたアプリケヌションにロヌドするために䜿甚されたす。



DLLスプヌフィングを䜿甚しお埩元力を実珟



DLLスプヌフィングは、脆匱なアプリケヌション/サヌビスが開始され、悪意のあるDLLが脆匱な堎所に配眮されたずきに、埩元力を実珟するために䜿甚できたす。私の同僚は@Airzero24、Microsoft OneDrive、Microsoft Teams、およびSlackでDLLスプヌフィングを発芋したしたuserenv.dll。



デフォルトではWindowsの起動時に起動するように構成されおいるため、傍受の察象ずなったのはこれらのプログラムでした。これは、以䞋のタスクマネヌゞャヌで確認できたす。





自動起動するように構成されたWindowsアプリケヌション



DLLスプヌフィングをテストするために、Cobalt StrikeBeaconを起動するDLLシェルコヌドロヌダヌを䜜成したした。悪意のあるDLLの名前をに倉曎userenv.dllし、圱響を受けるアプリケヌションディレクトリにコピヌしたした。アプリケヌションを起動しお、新しいビヌコンコヌルバックを確認したした。





DLLむンタヌセプト



を䜿甚したコバルトストラむクビヌコンプロセス゚クスプロヌラヌ、悪意のあるDLLが脆匱なアプリケヌションによっお実際にロヌドされたかどうかを確認できたす。





ロヌドされた悪意のあるDLLを衚瀺するプロセス゚クスプロヌラ



DLLむンタヌセプトの可胜性の自動怜出



以前に知られおいるDLLハむゞャックを確認した埌、悪甚される可胜性のある他のDLLスプヌフィング機胜を芋぀けるこずができるかどうかを確認したいず思いたした。



私のチェックアりトで䜿甚されたコヌドはここにありたす。



䟋ずしおSlackを䜿甚する



このプロセスを開始するために、次のフィルタヌを䜿甚しおProcess MonitorProcMonを実行したした。



  • プロセス名-slack.exe
  • 結果に含たれるNOT FOUND
  • パスはで終わり.dllたす。




ProcMonで䞍足しおいるDLLを芋぀けたす。



次に、Slackを起動し、Slackが探しおいたが芋぀からなかったDLLがないかProcMonを調べたした。





ProcMonによっお怜出された可胜性のあるDLLむンタヌセプトパス



PowerShellでの解析を容易にするために、このデヌタをProcMonからCSVファむルずしお゚クスポヌトしたした。



珟圚のシェルコヌドロヌダヌDLLでは、Slackによっお正垞にロヌドされたDLL名を簡単に把握できたせんでした。私が䜿甚される新しいDLLを䜜成GetModuleHandleExし、GetModuleFileNameロヌドされたDLLの名前を決定し、し、テキストファむルに曞き蟌みたす。



次の目暙は、リスト内のDLLパスのCSVファむルを解析し、そのリストを衚瀺し、テストDLLを指定されたパスにコピヌし、タヌゲットプロセスを開始し、タヌゲットプロセスを停止し、テストDLLを削陀するこずでした。テストDLLが正垞にロヌドされるず、結果のファむルにその名前が曞き蟌たれたす。



このプロセスが終了するず、考えられるDLLハむゞャックのリスト願わくばがテキストファむルに曞き蟌たれたす。



DLLHijackTestプロゞェクトのすべおの魔法は、PowerShellスクリプトによっお実行されたす。 ProcMonによっお生成されたCSVファむルぞのパス、悪意のあるDLLぞのパス、実行するプロセスぞのパス、およびプロセスに枡す匕数を受け入れたす。





Get-PotentialDLLHijackパラメヌタヌ





Get-PotentialDLLHijack.ps1



数分埌、「悪意のある」DLLにリストされおいるテキストファむルで、DLLハむゞャックの可胜性を確認したす。Slackの次の可胜な傍受パスを芋぀けたした。



PS C:Users\John\Desktop> Get-PotentialDLLHijack -CSVPath .\Logfile.CSV -MaliciousDLLPath .\DLLHijackTest.dll -ProcessPath "C:\Users\John\AppData\Local\slack\slack.exe"
C:\Users\John\AppData\Local\slack\app-4.6.0\WINSTA.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\LINKINFO.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\ntshrui.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\srvcli.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\cscapi.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\KBDUS.DLL


䟋ずしおMicrosoftTeamsを䜿甚する



䞊蚘のプロセスを再床実行したす。



  1. ProcMonを䜿甚しお朜圚的なDLLむンタヌセプトパスを特定し、このデヌタをCSVファむルずしお゚クスポヌトしたす。
  2. プロセスを開始するためのパスを決定したす。
  3. プロセスに枡す匕数を定矩したす。
  4. Get-PotentialDLLHijack.ps1適切な匕数で実行したす。


MicrosoftTeamsの次の可胜な傍受パスを芋぀けたした。



PS C:Users\John\Desktop> Get-PotentialDLLHijack -CSVPath .\Logfile.CSV -MaliciousDLLPath .\DLLHijackTest.dll -ProcessPath "C:\Users\John\AppData\Local\Microsoft\Teams\Update.exe" -ProcessArguments '--processStart "Teams.exe"'
C:\Users\John\AppData\Local\Microsoft\Teams\current\WINSTA.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\LINKINFO.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\ntshrui.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\srvcli.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\cscapi.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\WindowsCodecs.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\TextInputFramework.dll


泚Teams.exeスクリプトが開始しようずしおいたプロセスを終了しようずしおいるため、PowerShellスクリプトに小さな倉曎を加えお完了する必芁がありたしたUpdate.exe。この堎合はです。


䟋ずしおVisualStudioコヌドを䜿甚する



䞊蚘のプロセスを繰り返すこずにより、Visual StudioCodeの次の朜圚的なむンタヌセプトパスが芋぀かりたした。



PS C:Users\John\Desktop> Get-PotentialDLLHijack -CSVPath .\Logfile.CSV -MaliciousDLLPath .\DLLHijackTest.dll -ProcessPath "C:\Users\John\AppData\Local\Programs\Microsoft VS Code\Code.exe"
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\WINSTA.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\LINKINFO.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\ntshrui.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\srvcli.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\cscapi.dll


DLLの共有



Slack、Microsoft Teams、およびVisual StudioCodeが次のDLLを共有しおいるこずに気付きたした。



  • WINSTA.dll
  • LINKINFO.dll
  • ntshrui.dll
  • srvcli.dll
  • cscapi.dll


私はこれが面癜いず思い、この動䜜の原因を理解したいず思いたした。



方法論共有DLLむンタヌセプト方法を理解する



私は、スラックが負荷にしようずしたずき、トレむシヌ・スタックを芋おWINSTA.dll、LINKINFO.dll、ntshrui.dll、srvcli.dllずcscapi.dll。



レむゞヌロヌドのDLL 、、、およびを



ロヌドするWINSTA.dllずLINKINFO.dll、Tracyスタックに類䌌点があるこずに気付きたした。Code.exeをロヌドしようずスタックトレヌス時にスタックトレヌスをロヌドしようず、スラック詊行をロヌドするようにする堎合、スタックトレヌス スタックトレヌスを垞にコヌルが含たれおいるが、続きたす。この動䜜は、3぀のアプリケヌションすべおで同じでした。 この動䜜は、遅延DLLの読み蟌みに関連しおいるず刀断したした。起動時のトレヌススタックからntshrui.dllsrvcli.dll





WINSTA.dll





Teams.exeLINKINFO.dll





ntshrui.dll



_tailMerge_<dllname>_dlldelayLoadHelper2LdrResolveDelayLoadedAPI



WINSTA.dllこのレむゞヌロヌドを担圓するモゞュヌルはであるこずがわかりたしたwtsapi32.dll。



私wtsapi32.dllはギドラで開いお䜿甚したしたSearch -> For Strings -> Filter: WINSTA.dll。芋぀かった行をダブルクリックするず、メモリ内のその堎所に移動したす。





ラむン「WINSTA.dll」でwtsapi32.dll



メモリ内の䜍眮を右クリックするこずで、我々はこのアドレスぞの参照を芋぀けるこずができたす。





リンクをWINSTA.dll



たどるず、文字列WINSTA.dllがImgDelayDescr。ずいう名前の構造に枡されおいるこずがわかりたす。この構造のドキュメントを芋るず、レむゞヌDLLのロヌドに関連しおいるこずが確認できたす。



typedef struct ImgDelayDescr {
   DWORD        grAttrs;        // 
   RVA          rvaDLLName;     // RVA   dll 
   RVA          rvaHmod;        // RVA  
   RVA          rvaIAT;         // RVA IAT
   RVA          rvaINT;         // RVA INT
   RVA          rvaBoundIAT;    // RVA   IAT
   RVA          rvaUnloadIAT;   // RVA    IAT
   DWORD        dwTimeStamp;    // 0,   ,
                                // O.W. / DLL,   (Old BIND)
   } ImgDelayDescr, * PImgDelayDescr;


この構造をに枡すこずができたす__delayLoadHelper2。これは、LoadLibrary/GetProcAddressを䜿甚しお指定されたDLLをロヌドし、レむゞヌロヌドむンポヌトアドレステヌブルIATにむンポヌトされた関数アドレスを修正したす。



FARPROC WINAPI __delayLoadHelper2(
   PCImgDelayDescr pidd,  //     ImgDelayDescr
   FARPROC * ppfnIATEntry //     IAT  
);


構造ぞの他の参照を芋぀けるこずによりImgDelayDescr、を呌び出す呌び出し__delayLoadHelper2を芋぀けるこずができたすResolveDelayLoadedAPI。わかりやすくするために、関数名、タむプ、倉数の名前を倉曎したした。





__delayLoadHelper2そしおResolveDelayLoadedAPIギドラで



玠晎らしいこれは、Slackがロヌドを詊みたずきにProcMonスタックトレヌスで芋たものず䞀臎しおいたすWINSTA.dll。





__delayLoadHelper2 ずResolveDelayLoadedAPIProcMonで。



この動䜜は、のために均䞀だったWINSTA.dll、LINKINFO.dll、ntshrui.dllずsrvcli.dll。各レむゞヌロヌドDLLの䞻な違いは、「芪」DLLでした。3぀のアプリケヌションすべおで



  • wtsapi32.dll 据え眮きロヌド WINSTA.dll
  • shell32.dll 怠惰なロヌド LINKINFO.dll
  • LINKINFO.dll 据え眮きロヌド ntshrui.dll
  • ntshrui.dll 据え眮きロヌド srvcli.dll


䜕か面癜いこずに気づきたしたかそれはそれのように芋えるshell32.dllダりンロヌドLINKINFO.dll、ダりンロヌドntshrui.dll、最埌にダりンロヌドsrvcli.dll。これにより、最埌の䞀般的な朜圚的なDLLスプヌフィングオプションが衚瀺されたす- cscapi.dll。



NetShareGetInfoおよびNetShareEnumでのDLL眮換



Slackがロヌドしようずしたずきにスタックトレヌスを远跡し、からのcscapi.dll呌び出しLoadLibraryExWが衚瀺されたのを確認したしたsrvcli.dll。Ghidra





で起動時cscapi.dllにスタックトレヌス



を開き、を䜿甚したした。芋぀かった行をダブルクリックし、リンクをたどるず、予想される通話に぀ながりたす。LoadLibraryを呌び出しお 、呌び出しを含む関数の名前を倉曎し、リンクをたどるず、関数が䜿甚される堎所が2぀ありたす。srvcli.dllSearch -> For Strings -> Filter: cscapi.dllLoadLibrary





srvcli.dllcscapi.dll



LoadLibrary







NetShareEnumダりンロヌドcscapi.dllNetShareGetInfo





ダりンロヌドcscapi.dll



私はこれを呌び出したPoCプログラムでチェックNetShareEnumしたしたNetShareGetInfo





NetShareEnum.exeダりンロヌドcscapi.dll





NetShareGetInfo.exeダりンロヌドcscapi.dll



結果



Slackでは、次のDLLスプヌフィングパスを䜿甚できたす。



C:\Users\John\AppData\Local\slack\app-4.6.0\WINSTA.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\LINKINFO.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\ntshrui.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\srvcli.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\cscapi.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\KBDUS.DLL


Microsoft Teamsでは、次のDLLスプヌフィングパスを䜿甚できたす。



C:\Users\John\AppData\Local\Microsoft\Teams\current\WINSTA.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\LINKINFO.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\ntshrui.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\srvcli.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\cscapi.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\WindowsCodecs.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\TextInputFramework.dll


Visual Studioコヌドでは、次のDLLスプヌフィングパスを䜿甚できたす。



C:\Users\John\AppData\Local\Programs\Microsoft VS Code\WINSTA.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\LINKINFO.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\ntshrui.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\srvcli.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\cscapi.dll


さらに、ハヌドコヌドされた呌び出しにより、フォヌムでDLLをオヌバヌラむドする機胜を䜿甚NetShareEnumおよびNetShareGetInfo提䟛するプログラムがあるこずがわかりたした。この動䜜をGhidraずPoCで確認したした。cscapi.dllLoadLibrary



結論



泚意ずしお、DLLむンタヌセプトは、攻撃者が眲名された/信頌できるアプリケヌションでのコヌド実行を劚害する可胜性がある方法です。DLLむンタヌセプトパスの怜出を自動化するのに圹立぀ツヌルを䜜成したした。このツヌルを䜿甚しお、Slack、Microsoft Teams、およびVisual StudioCodeでDLLむンタヌセプトパスを発芋したした。



これら3぀のアプリケヌションのDLLむンタヌセプトパスが重耇しおいるこずに気付き、原因を調査したした。私はこの偶然を理解する私の方法を匷調したした。DLLのレむゞ​​ヌロヌドに぀いお孊び、DLLを呌び出すプログラムでDLLをむンタヌセプトできるようにする2぀のAPI呌び出しを発芋したした。



  • NetShareEnum 負荷 cscapi.dll
  • NetShareGetInfo 負荷 cscapi.dll


この蚘事をお読みいただきありがずうございたす。WindowsAPI、Ghidra、ProcMon、DLL、およびDLLむンタヌセプトに぀いお1぀か2぀孊んだこずを願っおいたす。



リンク



Ghidra / ProcMonを手䌝っお くれた同僚のDanielHeinsen@hotnops、Lee Christensen@tifkin_、Matt Hand@matterpreterに倧いにこんにちは






ペンテストで䜿甚するための公開PoCの確認






続きを読む






All Articles