ipsw에서 평문커널 얻기
ipsw
아이폰을 초기화할때 사용하는 iOS 펌웨어 패키지이며, zip으로 압축되어 있다.
ipsw 라는 도구를 사용하거나 ipsw-diffs 레포에서 코드를 직접 확인해도 되지만, 여기에서는 직접 추출하는 과정을 적는다.
# powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
scoop bucket add blacktop https://github.com/blacktop/scoop-bucket.git
scoop install blacktop/ipsw
1. 중요파일 추출
ipsw는 zip 으로 압축되어 있기 때문에 간단하게 압축 해제가 된다.
BuildManifest.plist
이 파일은 펌웨어에 어떤 정보, 파일들이 저장되어 있는지 알려주는 딕셔너리 형태 메타데이터 파일이다. 플래시 과정에서 필요한 모든 정보들이 담겨있다.
kernelcache.release.v57
iOS XNU(커널)와 KEXT(커널 확장) 바이너리를 합쳐서 담아둔 이미지이다.
대부분의 권한상승, 샌드박스 우회 취약점이 여기에서 발생하기 때문에 확인해봐야 한다.
커널캐시는 압축되어있고(iOS11 이후부터 LZFSE 알고리즘 사용), 압축을 해제하면 각각의 KEXT 바이너리들이 합쳐져 있는 것을 볼 수 있다.
> ipsw kernel dec .\kernelcache.release.v57
• Decompressing kernelcache
• Created kernelcache.release.v57.decompressed
> ipsw kernel kexts .\kernelcache.release.v57.decompressed
• Kexts count=314
0x7fffffffffffffff: com.apple.driver.AppleBSDKextStarterTMPFS (1)
0x7fffffffffffffff: com.apple.driver.AppleBSDKextStarterVPN (3)
0x7fffffffffffffff: com.apple.driver.AppleHIDKeyboardEmbedded (1.2.0a3)
0x7fffffffffffffff: com.apple.driver.AppleStorageDrivers (557)
...
> ipsw kernel symbolsets .\kernelcache.release.v57.decompressed
Symbol Sets
===========
com.apple.kpi.bsd: (25.1.0)
---------------------------
_VNOP_BWRITE
_VNOP_FSYNC
_VNOP_IOCTL
...
com.apple.kpi.private: (25.1.0)
-------------------------------
_Block_size
_IOBSDLowSpaceUnlinkKernelCore
_IOBSDMountChange
_IOCPURunPlatformActiveActions
...
최신 버전의 kernelcache (MH_FILESET 타입)만 추출이 가능하다. 추출하고나면 Mach-O 타입의 파일들이 아주 많이나온다.
com.apple.kernel: XNU 커널 메인 바이너리com.apple.kec.corecrypto,com.apple.kec.Compression,com.apple.kec.Libm,com.apple.kec.pthread
커널에서 쓰는 코어 crypto/math/threading 라이브러리 kext. 키 파생로직 등이 포함되어 있다.
> ipsw kernel extract .\kernelcache.release.iphone10b.decompressed KEXT --output .\tmp
⨯ kernelcache type is not MH_FILESET (KEXT-xtraction not supported yet)
> ipsw kernel extract --all .\kernelcache.release.v57.decompressed --output .\tmp
• Extracting all KEXTs...
• Created tmp\com.apple.kernel
• Created tmp\com.apple.AGXFirmwareKextG18PRTBuddy
*.im4p
IMG4 페이로드 포맷이고, iBoot, LLB(low level bootloader), DeviceTree, SEP firmware(Secure Enclave OS) 등이 있다.
일부 im4p 파일은 암호화가 되어있지만, applewiki에 공개된 키를 사용하여 복호화할 수 있다.
checkm8은 iBoot 부터 시작되는 취약점을 사용하기 때문에 중요하고, SEP에는 FaceID TouchID 같은 암호화 키가 저장되어 있기 때문에 중요하다.
BootROM은 efuse에 저장된 GID, UID 키를 사용하여 IMG4 파일들의 KBAG 영역을 BootROM 코드 내에서 복호화하고, 그 키로 파일 본체를 복호화한다.
복호화된 파일 중 iBoot, LLB 는 로드돼서 다음 부팅 체인으로 실행된다.
Comments