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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Triple_fetch — 이것은 CVE-2017-7047에 대한 익스플로잇이며, 10.3.2 및 그 이하에서 작동합니다. | Kitploit
도구/GitHubGitHub/q1f3/triple_fetch
Privilege EscalationiOS SecurityExploitationDebuggersPost-ExploitationMobile SecurityRemote Access ToolPayload DevelopmentBinary Exploitation
GitHubq1f3/triple_fetch

Triple_fetch

이것은 CVE-2017-7047에 대한 익스플로잇이며, 10.3.2 및 그 이하에서 작동합니다.

29년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

triple_fetch - ianbeer [https://bugs.chromium.org/p/project-zero/issues/detail?id=1247]

이것은 CVE-2017-7047에 대한 익스플로잇입니다. libxpc의 논리 오류로 인해 악의적인 메시지 발신자가 공유 메모리로 백업된 xpc_data 객체를 보낼 수 있었습니다. xpc 메시지의 소비자들은 xpc_data 객체의 백업 버퍼가 수신자에 의해 처리되는 동안 발신자에 의해 수정될 수 있다고 예상하지 못한 것으로 보입니다.

이 프로젝트는 CVE-2017-7047을 악용하여 iOS의 모든 사용자 공간 프로세스에 원격으로 디버깅을 연결하고 허용할 수 있는 개념 증명 원격 lldb debugserver 스텁을 구축합니다.

이는 익스플로잇의 높은 수준의 개요이며, 심층적인 분석은 나중에 작성될 수 있습니다. 자세한 내용은 현재 코드를 참조하십시오 :)

Part I

이 익스플로잇은 많은 iOS 서비스에서 사용되는 Objective-C 원격 프로시저 호출 구현인 NSXPC를 대상으로 합니다(1). NSXPC 메시지는 mach 메시지 내의 xpc 직렬화된 xpc_data 객체 안에 있는 bplist16 직렬화된 객체로 구성됩니다.

다른 것들 중에서 bplist16 객체는 CoreFoundation의 ___NSMS1 함수에 의해 파싱될 Objective-C 타입 인코딩 문자열(2)을 포함합니다. 이 함수는 파싱하는 문자열의 내용이 변경될 것으로 예상하지 않으며, 이 익스플로잇은 문자열의 특정 부분이 메모리에서 세 번 가져와진다는 사실을 이용하여 힙 오버플로우 프리미티브를 구성합니다. 세 가지 다른, 신중하게 선택된 값 사이를 전환함으로써 임의의 바이트로 선택된 힙 할당 크기를 넘어 오버플로우할 수 있습니다.

minibplist16.c는 bplist 직렬화의 최소 구현과 그것이 어떻게 작동하는지에 대한 논의를 포함합니다.

외부 xpc 메시지는 힙 그룸을 포함합니다. XPC 직렬화 프로토콜의 사용자 정의 구현을 사용하여 충돌하는 키를 가진 xpc 사전을 조작하여 할당 및 해제 프리미티브를 구축함으로써 힙을 그룸합니다. 외부 xpc 메시지는 또한 힙 스프레이(공유 메모리 객체의 여러 복사본을 사용하여 메모리 사용량을 낮게 유지)와 mach 포트 전송 권한 이름 스프레이를 포함합니다.

오버플로우는 Objective-C 객체의 isa Class 포인터를 힙 스프레이된 가짜 객체로 가리키게 하여, 그 가짜 객체에 메서드가 호출될 때 스택이 작은 ROP 스택으로 피벗되도록 합니다. ROP는 스프레이된 mach 포트 전송 권한 이름을 무차별 대입(brute-force)하여 대상의 전송 권한을 자체 태스크 포트로 전송하려고 시도합니다. 익스플로잇은 스프레이된 모든 포트에서 수신 대기하고, 성공하면 대상의 태스크 포트에 대한 전송 권한을 수신하며, 그 시점에서 대상 태스크를 완전히 제어할 수 있습니다.

Interlude

이 익스플로잇은 루트로 실행되는 coreauthd 데몬이 호스팅하는 com.apple.CoreAuthentication.daemon 서비스를 대상으로 합니다. 이 서비스는 앱 샌드박스에서 도달할 수 있습니다. 초기에 익스플로잇을 작동시킨 후 약간의 실험을 통해 coreauthd의 컨텍스트에서 processor_set_tasks API가 장치에서 실행 중인 모든 사용자 공간 프로세스의 태스크 포트에 대한 전송 권한을 얻을 수 있다는 것이 밝혀졌습니다. 이는 적어도 2012년부터 공개된 지식이었으며, 저명한 iOS 내부 연구자인 Jonathan Levin이 자신의 사이트에서 그 역사를 깊이 다루었습니다(3). Levin이 2015년에 업로드한 코드는 오늘날에도 여전히 작동합니다. 탈옥된 장치가 필요하지 않으며, 재고 장치에서 루트 권한만 있으면 됩니다.

Part II

이 익스플로잇으로 구축하고 싶었던 디버거의 주요 목표는 임의의 프로세스에 연결하고, 중단점을 설정하고, 중단점이 적중될 때 레지스터 및 메모리 상태를 검사하고 변경할 수 있는 것이었습니다. gdb 또는 lldb 원격 프로토콜을 처음부터 구현하는 대신, lldb debugserver 프로젝트에 필요한 변경을 수행한 다음 익스플로잇을 사용하여 실행하기로 결정했습니다.

코드 서명을 비활성화하거나 우회해야 하는 소프트웨어 중단점 대신, debugserver는 하드웨어 중단점만 사용하도록 패치됩니다. ARM64에는 16개의 하드웨어 중단점 레지스터가 있으므로 최대 16개의 활성 중단점만 가질 수 있습니다.

ARM 하드웨어 중단점에 대한 프로토타입 지원은 lldb debugserver 코드에 존재했지만 작동하려면 약간의 해킹이 필요했습니다. 예를 들어, 디버기의 pthread_introspection_hook 함수 포인터를 항상 충돌하도록 패치하는 코드를 추가해야 했습니다. 이렇게 하면 새 스레드 생성을 감지하고 하드웨어 중단점 상태를 새로 생성된 스레드에 전파한 후 충돌이 없었던 것처럼 계속 실행할 수 있습니다.

또한 ptrace 및 신호를 사용하는 대신 태스크 포트를 통해 직접 태스크를 일시 중단 및 재개하도록 연결 및 계속 코드를 패치했습니다.

Build tips

모든 것은 iOS 10.0 ~ 10.3.2를 실행하는 모든 iOS 기기에서 작동해야 합니다. 다음에서 테스트했습니다:

iPhone 7 + 10.3.2 iPod Touch + 10.1.1 iPad Mini 2 + 10.2

미리 빌드된 debugserver 바이너리를 포함했으며, 사용을 권장합니다. 하지만 lldb의 debugserver 패치는 debugserver.diff에도 포함되어 있습니다.

debugserver를 빌드하는 것은 그리 어렵지 않습니다. 저는 다음 git 리비전에서 작업했습니다: lldb: 0db640c4cd1ec4e4c2580336fa5f53be029c5bc7 llvm: ec48fd127774a4b67c72ea7c3057b5c964375e77 clang: b6e778e0bfa2fc32f8821c6b33762f5cb6724659

제공된 debugserver.diff를 적용하십시오.

빌드하려면 (최신) cmake와 ninja가 필요합니다. 이들은 소스 또는 선호하는 Mac 패키지 관리자의 바이너리에서 얻을 수 있습니다.

(4)에는 MacOS에서 일반 llvm 빌드를 설정하는 방법에 대한 가이드가 있으며, 도움이 될 수 있습니다.

다음 헤더 파일들을 iOS SDK에 심볼릭 링크해야 합니다. 최소한:

xpc/ launchd.h libproc.h sys/proc_info.h sys/kern_control.h net/route.h mach/mach_vm.h mach/shared_region.h sys/ptrace.h crt_externs.h

다음 cmake 명령어는 필요한 모든 힌트를 제공해야 합니다:

cmake -G "Ninja" -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64" -DCMAKE_TOOLCHAIN_FILE=../cmake/platforms/iOS.cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off ../

ninja debugserver

그런 다음 debugserver 바이너리에 서명하거나 fakesign하고 제공된 xcode 프로젝트에 있는 바이너리를 교체해야 합니다.

Codesigning

기본적으로 익스플로잇 프로젝트는 mach_portal amfid 후크의 개선된 버전을 설치합니다(이번에는 fat 파일에 대한 지원이 작동하고 하드코딩된 오프셋이 없습니다 :) )

디버깅만 원한다면 debugserver 바이너리에 자신의 인증서로 서명하고 amfid 후크를 비활성화할 수 있습니다.

amfid 후크를 사용하는 경우, 앱이 실행되는 앱이 여전히 백그라운드 코드 실행 제한을 받는다는 점을 명심하십시오. 앱은 beginBackgroundTaskWithName을 통해 더 많은 시간을 요청합니다.

Usage:

호스트와 대상 iDevice를 동일한 무선 네트워크에 연결하고 iDevice의 IP 주소를 기록해 둡니다.

익스플로잇 앱을 빌드하고 실행합니다. xcode 내에서 실행하는 것이 좋지만 독립 실행형으로도 작동합니다.

잠시 기다립니다. 몇 분 후에도 작동하지 않으면 장치를 하드 리부팅하고 잠시 기다린 후 다시 시도하십시오.

작동하면 "patched debugserver listening on port 1234"를 출력해야 합니다.

"get process listing" 버튼을 클릭하면 ps의 출력이 표시되어야 합니다.

(xcode를 사용하면 출력을 더 쉽게 볼 수 있지만 익스플로잇도 출력을 표시합니다)

디버깅하려는 대상 프로세스를 찾아 pid를 기록해 둡니다.

호스트에서 명령줄로 lldb를 실행합니다: $ lldb (lldb)

플랫폼을 ios remote로 설정합니다: (lldb) platform select remote-ios

debugserver 스텁에 연결합니다: (lldb) process connect connect://192.168.0.172:1234

(192.168.0.172는 iDevice의 IP 주소입니다)

관심 있는 프로세스에 연결합니다: (lldb) attach 55

...잠시 기다리십시오. debugserver가 verbose 모드로 실행 중입니다...

Process 55 stopped

Executable module set to "/usr/libexec/backboardd".

연결되었습니다 :)

중단점 설정: (lldb) break set --name malloc Breakpoint 1: 4 locations.

계속: (lldb) c Process 55 resuming Process 55 stopped

  • thread #11, stop reason = breakpoint 1.3 frame #0: 0x00000001936161e0 libsystem_malloc.dylibmalloc libsystem_malloc.dylibmalloc: -> 0x1936161e0 <+0>: stp x20, x19, [sp, #-0x20]! 0x1936161e4 <+4>: stp x29, x30, [sp, #0x10] 0x1936161e8 <+8>: add x29, sp, #0x10 ; =0x10

백트레이스 가져오기: (lldb) bt

  • thread #11, stop reason = breakpoint 1.3
  • frame #0: 0x00000001936161e0 libsystem_malloc.dylibmalloc frame #1: 0x0000000100099648 backboardd_mh_execute_header + 71240 frame #2: 0x00000001945bf218 CoreFoundation__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 frame #3: 0x00000001945be9cc CoreFoundation__CFRunLoopDoSource1 + 436 frame #4: 0x00000001945bc4b0 CoreFoundation__CFRunLoopRun + 1840 frame #5: 0x00000001944ea2b8 CoreFoundationCFRunLoopRunSpecific + 444 frame #6: 0x0000000194537b44 CoreFoundationCFRunLoopRun + 112 frame #7: 0x00000001000a5ba8 backboardd_mh_execute_header + 121768 frame #8: 0x00000001000a5bec backboardd_mh_execute_header + 121836 frame #9: 0x00000001936a5850 libsystem_pthread.dylib_pthread_body + 240 frame #10: 0x00000001936a5760 libsystem_pthread.dylib_pthread_start + 284 frame #11: 0x00000001936a2d94 libsystem_pthread.dylibthread_start + 4

Troubleshooting:

최신 버전의 XCode를 설치하십시오(8.3.3으로 개발 및 테스트됨) lldb 연결이 실패하면 대상 iOS 버전용 SDK가 설치되어 있는지 확인하십시오.

Caveats:

  • 16개의 주소에만 중단점을 설정할 수 있습니다
  • detach는 아직 작동하지 않습니다
  • attach는 pid로만 작동합니다
  • 64비트 대상만 가능합니다
  • launchd의 태스크 포트를 얻고 메모리를 읽고 쓸 수 있지만 attach는 현재 중단됩니다
  • amfid 후크를 사용하는 경우 amfid를 디버깅할 수 없습니다!

이 문제를 해결하고 싶지만 현재 매우 바빠서 죄송합니다!

다른 PoC 실행:

이 프로젝트의 pocs 폴더에 바이너리를 넣으면 장치의 UI에서 선택하고 "exec bundle binary"를 클릭하여 익스플로잇이 해당 바이너리를 실행하도록 할 수 있습니다.

그래도 앱 샌드박스 내에서 실행되지만, 앱에 privileged_task_port라는 심볼이 있으면 launchd의 태스크 포트에 대한 전송 권한이 부여됩니다. triple_fetch_sdk 폴더에는 이를 사용하여 PoC를 빌드하는 방법을 보여주는 샘플 프로젝트가 포함되어 있습니다. 예를 들어, 흥미로운 프로세스에서 동작을 트리거한 다음 debugserver를 사용하여 디버깅할 수 있습니다.

또한 원격 호출/포트/파일/메모리 API가 포함되어 있어 다른 프로세스의 함수를 쉽게 호출하고 파일 디스크립터, mach 포트 및 메모리를 이동할 수 있습니다.

(1) [https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html] (2) [https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html] (3) [http://newosxbook.com/articles/PST2.html] (4) [https://gist.github.com/thlorenz/a068c202f2487ec13809]

이 프로젝트에는 lldb를 기반으로 하는 코드(debugserver.diff)와 바이너리(debugserver)가 포함되어 있으며, 다음 라이선스가 적용됩니다:

University of Illinois/NCSA Open Source License

Copyright (c) 2010 Apple Inc. All rights reserved.

Developed by:

LLDB Team

http://lldb.llvm.org/

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution.

  • Neither the names of the LLDB Team, copyright holders, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.

도구 다운로드