
Windows PE 로더를 시뮬레이션하여 DLL 하이재킹 취약점을 식별하고, 셸코드 페이로드를 탑재한 무기화된 DLL을 생성하며, UAC 자동 승격 우회를 탐지합니다.
Siofra는 Windows 프로그램에서 DLL 하이재킹 취약점을 식별하고 악용하도록 설계된 도구입니다. Windows 로더를 시뮬레이션하여 디스크에 있는 PE 또는 활성 프로세스에 해당하는 메모리의 이미지 파일의 모든 종속성(및 해당 취약점)을 파악할 수 있습니다. 더 중요한 것은, 이 도구는 동적 셸코드 생성을 통한 PE 감염을 통해 이러한 유형의 취약점을 악용하는 DLL을 쉽게 생성할 수 있다는 것입니다. 이러한 감염된 DLL은 DLL의 코드(DllMain, 내보낸 함수)와 리소스를 유지하므로 DLL을 로드하는 응용 프로그램의 기능을 원활하게 보존하는 동시에 연구원이 실행 파일 페이로드를 별도의 프로세스로 실행하거나 대상에 모듈로 로드되도록 지정할 수 있습니다. 또한 이 도구에는 UAC 우회 취약점을 스캔하기 위해 UAC 자동 승격 기준과 앞서 언급한 기능을 결합하는 자동화된 방법이 포함되어 있습니다.
현재 이 도구가 노출하는 취약점은 매우 많습니다. 이 도구를 테스트하는 동안 테스트한 수백 개의 응용 프로그램 중 취약하지 않은 응용 프로그램은 몇 개에 불과했습니다. 이러한 취약점은 SafeDllSearchMode에도 불구하고 악용될 수 있습니다. "현재 디렉터리"(SafeDllSearchMode로 수정됨)와 "응용 프로그램 디렉터리"(.exe 자체가 포함된 폴더)를 혼동하는 데서 일반적인 오해가 발생합니다. 현재 Windows 프로그램에 존재하는 대부분의 DLL 하이재킹 취약점은 Windows 검색 순서에서 첫 번째로 오는 응용 프로그램 디렉터리에서 비롯됩니다. 몇 가지 주요 사항은 도구의 스캐너가 생성한 출력에서 아래에 나열되어 있습니다. 이러한 취약점이 마지막으로 테스트된 시기는 2017년 7월 중순입니다.
Siofra64.exe --mode file-scan -f "c:\Program Files\Internet Explorer\iexplore.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Internet Explorer\iexplore.exe [64-bit PE] ======== iexplore.exe USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-core-privateprofile-l1-1-1.dll [API set] kernel32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] msvcrt.dll [KnownDLL] api-ms-win-downlevel-shell32-l1-1-0.dll [API set] shcore.dll [KnownDLL] RPCRT4.dll [KnownDLL] combase.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] iertutil.dll [!]
[!] Module iertutil.dll vulnerable at c:\Program Files\Internet Explorer\iertutil.dll (real path: C:\WINDOWS\system32\iertutil.dll)
Siofra64.exe --mode file-scan -f "c:\Program Files\Windows Defender\MpCmdRun.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Windows Defender\MpCmdRun.exe [64-bit PE] ======== MpCmdRun.exe msvcrt.dll [KnownDLL] KERNEL32.dll [KnownDLL] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] OLE32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] SspiCli.dll [!] mpclient.dll [!] CRYPT32.dll [Base] MSASN1.dll [Base] WINTRUST.dll [Base]
[!] Module SspiCli.dll vulnerable at c:\Program Files\Windows Defender\SspiCli.dll (real path: C:\WINDOWS\system32\SspiCli.dll)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\wbem\wmiprvse.exe" --enum-dependency --dll-hijack
======== c:\WINDOWS\System32\wbem\wmiprvse.exe [64-bit PE] ======== wmiprvse.exe msvcrt.dll [KnownDLL] FastProx.dll [!] wbemcomn.dll [!] bcrypt.dll [!] WS2_32.dll [KnownDLL] api-ms-win-eventing-obsolete-l1-1-0.dll [API set] sechost.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] NCObjAPI.DLL [!]
[!] Module wbemcomn.dll vulnerable at c:\WINDOWS\System32\wbem\wbemcomn.dll (real path: C:\WINDOWS\system32\wbemcomn.dll) [!] Module bcrypt.dll vulnerable at c:\WINDOWS\System32\wbem\bcrypt.dll (real path: C:\WINDOWS\system32\bcrypt.dll) [!] Module NCObjAPI.DLL vulnerable at c:\WINDOWS\System32\wbem\NCObjAPI.DLL (real path: C:\WINDOWS\system32\NCObjAPI.DLL)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\SearchProtocolHost.exe" --enum-dependency --dll-hijack --explicit-loadlibrary
======== c:\WINDOWS\System32\SearchProtocolHost.exe [64-bit PE] ======== SearchProtocolHost.exe msvcrt.dll [KnownDLL] TQUERY.DLL [!] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] bcryptPrimitives.dll [Base] cryptdll.dll [!] api-ms-win-security-lsalookup-l2-1-1.dll [API set] advapi32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] api-ms-win-shell-namespace-l1-1-0.dll [API set] windows.storage.dll [Base] api-ms-win-shlwapi-winrt-storage-l1-1-1.dll [API set] shlwapi.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-appmodel-state-l1-2-0.dll [API set] kernel.appcore.dll [Base] api-ms-win-shcore-path-l1-1-0.dll [API set] shcore.dll [KnownDLL] api-ms-win-power-base-l1-1-0.dll [API set] powrprof.dll [Base] profapi.dll [Base] msfte.dll [Potential explicit Unicode] [!] msTracer.dll [Potential explicit Unicode] [!] Msidle.dll [Potential explicit Unicode] [!] winhttp.dll [Potential explicit Unicode] [!]
[!] Module msfte.dll vulnerable at C:\WINDOWS\system32\msfte.dll (real path: Unknown) [!] Module msTracer.dll vulnerable at C:\WINDOWS\system32\msTracer.dll (real path: Unknown)
이 도구의 기능은 도구의 실행 모드 각각에 해당하는 3개의 별도 범주로 나눌 수 있습니다.
감염 모드에서 이 도구는 32비트 및 64비트 DLL 파일의 감염된 복사본을 생성할 수 있습니다. 이러한 감염된 파일은 프로세스 초기화 중에 로드될 때 대상 응용 프로그램의 실행 흐름을 하이재킹하여 대상 응용 프로그램 진입점이 실행되기 전에 페이로드 DLL을 로드하거나 페이로드 실행 파일을 실행할 수 있습니다.
파일 스캔 모드에서 도구에는 실행 파일 경로 또는 폴더(재귀적으로 실행 파일을 검색하며, 선택적으로 재귀 사용)가 제공될 수 있으며, PE 가져오기, 지연 로드 가져오기, API set, 어셈블리 종속성 및 명시적으로 로드된 라이브러리를 재귀적으로 열거하고 처리하여 런타임 프로세스 초기화 중 각 항목이 로드될 경로를 결정합니다. 이 정보를 통해 도구는 하이재킹에 취약한 모듈을 식별할 수 있습니다. PE 처리 및 로더 시뮬레이션 중 도구는 다음을 처리할 수 있습니다. 1. 기본 PE 가져오기 섹션을 사용하여 가져온 모듈. 2. 지연 로드를 통해 가져온 모듈. 3. WinSxS 어셈블리 종속성 해결(PE 매니페스트 리소스를 구문 분석하고 어셈블리 종속성 ID를 추출하며 사용자 지정 구현을 사용하여 WinSxS 모듈 경로를 식별). 4. 런타임에 LoadLibrary를 통해 가져온 명시적으로 로드된 모듈. 5. 위의 모든 가져오기 유형의 API set 해석. 이는 ApiSetSchema.dll에 있는 문서화되지 않은 데이터 구조에 대한 사용자 지정 파서 구현을 통해 이루어집니다(버전 2, 4 및 6만 테스트되었습니다). 6. 이름으로 특정 가져온 모듈 검색. 7. UAC 우회 공격에 활용할 수 있는 Windows 구성 요소 식별(UAC 자동 승격 기준이 지정된 대상 PE에 자동으로 적용된 다음, 존재하는 경우 하이재킹 공격과 함께 사용). 8. 다음 기준에 따라 취약하지 않은 모듈 종속성을 자동으로 감지하고 필터링: * KnownDLLs * 면제("Base") DLL 상태. Kernelbase.dll, ntdll.dll 등. * 매니페스트 재정의 보안 메커니즘(sysprep.exe에서 Microsoft가 사용).
메모리 스캔 모드에서 도구는 로컬 프로세스 이름/ID를 열거하거나 스캔할 프로세스 ID를 지정받을 수 있습니다. 디스크에서 지정된 PID에 해당하는 이미지 파일을 구문 분석하는 대신 도구는 프로세스에 현재 로드된 모듈을 열거하고 그중 하이재킹에 취약한 모듈을 식별합니다. 이는 디스크의 실행 파일이 패킹/난독화되어 PE 헤더 구문 분석을 통해 가져오기를 식별할 수 없는 경우에 유용합니다.