Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
NotSecDrv — CVE-2018-7249에 대한 PoC | Kitploit
도구/GitHubGitHub/alonhr/notsecdrv
Memory ForensicsVulnerability AnalysisExploitationReverse EngineeringLearning & EducationBinary Exploitation
GitHubalonhr/notsecdrv

NotSecDrv

CVE-2018-7249에 대한 PoC

저장소 보기
15331년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

NotSecDrv - CVE-2018-7249용 PoC 코드

일반 설명

secdrv.sys에서 발견된 문제로, Microsoft Windows Vista, Windows 7, Windows 8, KB3086255 이전의 Windows 8.1 및 Macrovision SafeDisc에 포함된 버전에 영향을 미칩니다. IOCTL 0xCA002813에 대한 두 번의 정밀한 타이밍 호출은 use-after-free로 이어지는 경쟁 조건을 유발할 수 있습니다. 악용될 경우, 권한이 없는 공격자가 커널에서 임의 코드를 실행할 수 있습니다.

이 취약점은 Microsoft에 보고되었지만, 최신 Windows 시스템(KB3086255 이전 버전만 해당)에는 영향을 미치지 않으므로 Microsoft는 어떤 조치도 취하지 않을 것입니다. Windows 7 x86에서 테스트 및 악용에 성공했습니다.

또한 CVE-2018-7250과 관련이 있습니다.

스크린샷

Alt text

세부 정보

이 문서는 secdrv.sys 드라이버에 대한 저의 작은 연구를 기록한 것입니다. 설명된 드라이버의 모든 동작은 리버스 엔지니어링된 것이며 부정확하거나 틀릴 수 있습니다.

IOCTL (0x0CA002813) 입력 버퍼의 오프셋 0x4에는 TYPE이라고 부를 숫자가 포함되어 있습니다. 이 IOCTL (0x0CA002813)의 기본 처리 함수인 sub_11A88은 0x96, 0x97, 0x98의 세 가지 유형을 받습니다.

  • 0x96은 PagedPool 청크를 할당하고, 크기 0x64의 배열에 저장한 다음 초기화하고(대충 :)), 그 일부를 오프셋 0x10에 있는 사용자 제공 버퍼에 복사합니다.
  • 0x97은 0x96으로 할당된 이전에 할당된 청크를 사용합니다(언급된 배열에서 태그로 올바른 청크를 찾습니다). 이 청크를 사용하여 사용자 입력 버퍼를 일종의 변형된 xor 암호화 루틴으로 암호화합니다. 그런 다음 할당된 청크의 한 필드가 가리키는 다른 구조체에 저장된 함수를 호출합니다.
  • 0x98은 0x96으로 할당된 청크를 해제합니다. 할당 과정에서 주어진 태그를 검색하여 올바른 청크를 찾습니다.

정보 유출 (CVE-2018-7250)

IOCTL 유형 0x96이 새 청크를 할당하고 완전히는 아니지만 초기화한 후, 해당 청크를 사용자 모드에 복사합니다. 새로 할당된 청크의 16비트는 초기화되지 않은 채로 남아 있으며 이전 PagedPool 할당의 데이터를 포함합니다. 그런 다음 초기화되지 않은 비트는 REP MOVSD 명령에 의해 .text:00011BE9에서 사용자 모드로 복사됩니다. PoC 코드는 여기에 있습니다.

임의 코드 실행 (CVE-2018-7249)

IOCTL 유형 0x97이 호출되면, 태그를 통해 이전에 유형 0x96으로 할당된 필요한 청크를 찾습니다. 할당이 이미 IOCTL 유형 0x97에 의해 해제된 경우 DeviceIoControl은 오류를 반환합니다. 여기서의 취약점은 유형 0x97이 사용하는 할당이 작업 중에 해제될 수 있다는 것입니다(동기화 메커니즘이 사용되지 않으므로). 따라서 경쟁에서 이기면 use-after-free가 발생합니다.

공격자가 IOCTL 유형 0x97의 작업 중에(유형 0x98을 사용하여) 청크를 해제하고, 정확히 동일한 메모리 위치에 자신이 제어하는 새 청크를 할당할 수 있다면, 다른 구조체를 가리키는 포인터를 덮어쓸 수 있습니다. 해당 구조체에는 함수 포인터가 포함되어 있으며, 이를 사용하여 궁극적으로 드라이버의 실행 흐름을 가로채고 ring 0에서 임의 코드를 실행할 수 있습니다.

암호화 루틴은 크기가 매우 클 수 있는 사용자 제공 버퍼에 대해 수행되므로 암호화 실행에 오랜 시간이 걸릴 수 있습니다. 이는 IOCTL 유형 0x98이 청크가 아직 사용 중일 때 해제할 수 있는 완벽한 시간 창을 제공합니다. 이 시간 창은 매우 길어질 수 있으므로(1초 이상!) 첫 시도에서도 확실하게 경쟁에서 이길 수 있습니다. use-after-free는 .text:00011B68에서 시작되며, 셸코드로 점프하도록 가로채질 실제 호출은 .text:00011B86에서 발생합니다.

이 취약점을 성공적으로 악용하기 위해 수행되는 단계는 다음과 같습니다:

  • 나중에 사용할 태그가 있는 모든 이전 청크를 해제하여 모든 IOCTL이 동일한 PagedPool 청크에서 작동하도록 합니다.
  • PagedPool을 스프레이하여 IOCTL 유형 0x96의 할당 크기(0x30바이트)와 일치하는 구멍을 만듭니다. 이는 나중에 해제된 청크 대신 가짜 대체 청크를 안정적으로 할당하기 위해 필요합니다.
  • IOCTL 유형 0x96으로 청크를 할당합니다. 이 청크는 이전에 만든 구멍 중 하나에 할당됩니다.
  • 대용량의 사용자 공간 메모리 영역을 할당하고 IOCTL 유형 0x97을 호출합니다. 대용량 메모리 영역은 할당을 해제하는 스레드가 경쟁에서 이길 수 있는 충분한 시간을 확보하도록 보장합니다.
  • IOCTL 유형 0x98을 호출하고 다른 스레드가 작업 중인 청크를 해제할 새 스레드를 시작합니다.
  • 해제된 청크를 공격자가 제어하는 할당으로 대체하기 위해 새 스레드에서(청크가 해제된 후) 풀을 다시 스프레이합니다. 이 가짜 청크에는 필요한 구조체에 대한 유효한 포인터가 포함되어야 합니다.
  • 생성한 가짜 구조체의 함수 포인터 오프셋에 셸코드의 주소를 배치하고 호출되기를 기다립니다(암호화를 마친 후 IOCTL 유형 0x97에서 호출됩니다).
  • 즐기세요!

테스트 환경

OS: Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible Built by: 7600.16385.x86fre.win7_rtm.090713-1255 VM: 4GB RAM, 1 CPU 하드웨어: Windows 10 Pro 64 bit, 메인보드 Gigabyte Z370 HD3, 16GB RAM, Intel i5-8400 2.80GHz (6 CPUs)

도구 다운로드