
Native Image Cache에 있는 DLL을 하이재킹하여 UAC를 우회합니다.
사용자 계정 컨트롤(UAC)을 우회하여 상승된(관리자) 권한을 획득하고 높은 무결성 수준에서 모든 프로그램을 실행합니다.

ByeIntegrity를 훨씬 더 빠르고, 가볍고, 안정적으로 업데이트하기로 결정했습니다. 이는 상당한 개편이므로 VS 솔루션에 "ByeIntegrity2021"이라는 새 프로젝트를 만들었습니다. 이는 이 공격의 업데이트된 버전입니다. 물론 원본 버전은 여전히 존재합니다. 새 버전에 대한 자세한 내용은 아래 세부 정보를 확장하세요.
새 버전은 이제 NIC에 설치된 기존 네이티브 이미지에 의존하지 않고 NIC를 하이재킹할 수 있습니다. 이를 위해 자체 네이티브 이미지 설명자와 페이로드를 생성한 다음 NIC로 이동시켜 다음과 같은 필요성을 제거합니다:
NGEN.exe에 의해 생성된 기존 *.ni 이미지CLR은 각 항목의 재귀 디렉터리 검색을 수행한 다음 해당 *.aux 파일을 읽어 NIC에서 네이티브 이미지를 로드합니다. 이 파일에는 네이티브 이미지 및 해당 종속성에 대한 정보가 포함되어 있습니다. AUX 파일의 정보를 기반으로 CLR은 이미지를 로드하거나 거부한 후 다음 후보로 이동합니다. 실행 가능한 후보가 없으면 표준 이미지를 로드하고 jit를 사용하여 정상적으로 컴파일합니다. 실제 네이티브 이미지의 어떤 부분도 읽히지 않으며(존재 여부만 확인됨), 따라서 ByeIntegrity는 네이티브 이미지가 가질 이름과 동일한 이름으로 페이로드 DLL을 배치하기만 하면 됩니다.
업데이트된 버전의 ByeIntegrity에는 AUXGen이라는 도구가 함께 제공되며, GAC에서 어셈블리 이름을 입력받아 해당 AUX 파일을 생성합니다. AUX 파일은 CLR의 검사와 일치하도록 생성되며, CLR은 AUX 파일에 설명된 "네이티브 이미지"를 로드합니다. 참고: AUXGen은 AUX 파일 생성 시 종속성을 처리하지 않습니다. CLR이 이미지를 로드할 수 있을 만큼만 수행합니다. 나중에 AUX 파일 형식에 대한 자세한 내용을 게시하겠습니다.
ByeIntegrity는 이제 UACMe와 마찬가지로 ISecurityEditor를 사용하므로 필요한 코드가 줄어듭니다. 또한 MMCEx 어셈블리에 대한 AUX 파일을 생성하여 ByeIntegrity와 동일한 디렉터리에 배치해야 합니다. MMCEx는 로드 순서와 이름이 짧기 때문에 이제 대상 이미지입니다.
ByeIntegrity는 네이티브 이미지 캐시(NIC)에 있는 DLL을 하이재킹합니다. NIC는 .NET Framework에서 Ngen(.NET Framework 네이티브 이미지 생성기)과 같은 프로그램에서 생성된 최적화된 .NET 어셈블리를 저장하는 데 사용됩니다. Ngen은 일반적으로 작업 스케줄러를 통해 관리자 권한으로 현재 사용자 아래에서 실행되므로 NIC는 관리자 그룹의 구성원에게 수정 액세스 권한을 부여합니다.
Microsoft Management Console(MMC) Windows 방화벽 스냅인은 .NET Framework를 사용하며, 초기화 시 NIC의 모듈이 MMC 프로세스에 로드됩니다. MMC 실행 파일은 AutoElevate를 사용합니다. 이는 Windows에서 UAC 프롬프트 없이 프로세스 토큰을 자동으로 상승시키는 메커니즘입니다.
ByeIntegrity는 NIC에 있는 Accessibility.ni.dll이라는 특정 DLL을 하이재킹합니다. DLL의 .text 섹션에 있는 적절한 크기의 패딩 영역에 셸코드를 작성합니다. 그런 다음 DLL의 진입점이 셸코드를 가리키도록 업데이트됩니다. DLL 로드 시 진입점(실제로는 셸코드)이 실행됩니다. 셸코드는 kernel32!CreateProcessW의 주소를 계산하고 관리자 권한으로 실행되는 cmd.exe의 새 인스턴스를 만든 다음 단순히 TRUE를 반환합니다. 이는 DLL_PROCESS_ATTACH 이유에만 해당되며, 다른 모든 이유는 즉시 TRUE를 반환합니다.
이 공격은 UACMe에서 방법 #63으로 구현되어 있습니다. 이 공격을 시도해보고 싶다면 먼저 UACMe를 사용하세요. 공격은 동일하지만 UACMe는 NIC를 수정하는 데 다른 방법을 사용합니다. ByeIntegrity는 IFileOperation을 사용하는 반면 UACMe는 ISecurityEditor를 사용합니다. 또한 UACMe는 시스템에 맞는 올바른 Accessibility.ni.dll을 선택하고 필요한 경우 시스템 유지 관리 작업을 수행하여 NIC 구성 요소를 생성합니다. ByeIntegrity는 단순히 존재하는 첫 번째 NIC 항목을 선택하며(MMC가 사용하는 올바른 항목일 수도 있고 아닐 수도 있음) 시스템 유지 관리 작업을 실행하지 않습니다. ByeIntegrity는 UACMe보다 훨씬 더 많은 코드를 포함하므로 UACMe 구현을 읽는 것이 ByeIntegrity 코드를 읽는 것보다 이해하기 훨씬 쉬울 것입니다. 마지막으로 ByeIntegrity는 공격 중에 자식 프로세스를 실행하는 반면 UACMe는 그렇지 않습니다.
tl;dr: UACMe는 ByeIntegrity보다 간단하고 효과적이므로 먼저 UACMe를 사용하세요.
이 글을 읽고 있다면 아마 소스 코드를 컴파일하는 방법을 알고 있을 것입니다. 이 코드는 x86을 염두에 두고 전혀 테스트되거나 설계되지 않았으며 어쨌든 x86에서는 작동하지 않을 것입니다.
UACMe와 마찬가지로 컴파일된 바이너리를 이 저장소에 업로드하지 않을 것입니다. 세상을 망가뜨리려는 사람들은 항상 존재하며, 저는 그들이 다른 사람의 컴퓨터에서 이 코드를 실행하여 의도적인 피해를 입힐 수 있는 쉬운 방법을 제공하지 않을 것입니다. 또한 스크립트 키디들이 이 공격이 무엇을 하는지, 어떤 피해를 입힐 수 있는지 이해하지 못한 채 사용하는 것을 원하지 않습니다.
이 공격은 Windows 7(7600)부터 최신 Windows 버전까지 작동합니다.