• Jailbreak Detection
   – iOS 탈옥은 샌드박스 제한을 풀어 타 회사에서 사용하는 서명되지 않은 코드를 실행할 수 있게 하는 과정

   – 탈옥된 디바이스에서 앱 실행을 어렵게 하기 위해 리버스 엔지니어링 방어 기능을 추가함

   – iOS의 전형적인 탈옥 탐지 기법 (Trustwave 발표)

      • File-based Checks

      • Checking File Permissions

      • Checking Protocol Handlers

      • Calling System APIs

 

 

• Jailbreak Detection (File-based Checks)
   – 파일 기반으로 확인하는 것으로 탈옥 여부 확인 가능
   – 탈옥과 관련된 파일 및 디렉터리를 확인

 

 

/Applications/Cydia.app 
/Applications/FakeCarrier.app 
/Applications/Icy.app 
/Applications/IntelliScreen.app 
/Applications/MxTube.app 
/Applications/RockApp.app 
/Applications/SBSettings.app 
/Applications/WinterBoard.app 
/Applications/blackra1n.app 
/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist 
/Library/MobileSubstrate/DynamicLibraries/Veency.plist
 /Library/MobileSubstrate/MobileSubstrate.dylib 
/System/Library/LaunchDaemons/com.ikey.bbot.plist
 /System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist
 /bin/bash 
/bin/sh 
/etc/apt
/etc/ssh/sshd_config 
/private/var/lib/apt 
/private/var/lib/cydia 
/private/var/mobile/Library/SBSettings/Themes 
/private/var/stash 
/private/var/tmp/cydia.log 
/usr/bin/sshd 
/usr/libexec/sftp-server 
/usr/libexec/ssh-keysign 
/usr/sbin/sshd 
/var/cache/apt 
/var/lib/apt 
/var/lib/cydia 
/usr/sbin/frida-server 
/usr/bin/cycript 
/usr/local/bin/cycript 
/usr/lib/libcycript.dylib


• Jailbreak Detection (Checking File Permissions)
   – 파일 권한을 확인하는 것으로 탈옥 여부 확인 가능

   – 애플리케이션의 샌드박스 외부에 있는 위치에 파일 생성을 시도하는 것으로 확인 가능

   – 애플리케이션이 /private 디렉터리에 파일을 생성하도록 하여 성공적으로 생성된다면 디바이스가 탈옥된 것

• Jailbreak Detection (Checking Protocol Handlers)

   – 프로토콜 핸들러를 확인하는 것으로 탈옥 여부 확인 가능

   – 프로토콜 핸들러란 특별한 URL을 처리하는 프로그램으로 cydia:// 프로토콜 핸들러를 사용하여 시디아에서 설치 가능

   – Cydia URL을 열어 프로토콜 핸들러 확인 가능

      • 거의 모든 탈옥 툴이 기본적으로 설치하는 Cydia 앱은 cydia:// 프로토콜 핸들러를 설치함

 

• Jailbreak Detection (Calling System APIs)
   – 시스템 API를 호출하는 것으로 탈옥 여부 확인 가능

   – 탈옥되지 않은 디바이스에서 NULL을 인수로 system 함수를 호출하면 0이 반환

   – 탈옥된 디바이스에서 NULL을 인수로 system 함수를 호출하면 1이 반환

   – 함수가 탈옥 디바이스에서만 /bin/sh에 대한 접근을 확인하기 때문에 위의 방식으로 확인 가능

• Local Data Storage
– iOS 애플리케이션은 임시 데이터와 영구 데이터를 저장하기 위해 로컬 시스템과 상호작용함

 – 애플리케이션이 중요한 정보를 임시/영구 형식으로 안전하지 않은 상태로 저장하면 위험이 발생함 

– DVIA 앱에서는 여덟 가지 데이터 저장소에 대해 진단 – 내부에 저장하기 위한 다양한 형식이 존재 
   • XML & Plist

   • SQLite files
   • Keychain data
   • Core data
   • NSUserDefaults class
   • Temporary File (data cache) 

 

• Plist - Local Data Storage
– Plist는 Property List의 줄임말 

– Plist 파일 

   • 애플리케이션 데이터 및 설정 정보를 저장하는 데 사용되는 XML 파일

   • 저장된 정보는 암호화가 되지 않아 중요한 정보를 저장하면 안됨

   • Info.plist에는 버전 정보, 실행가능한 바이너리 이름, 지원되는 iOS 버전 및 디바이스 모델 등의 정보가 저장

      #  /var/containers/Bundle/Application/$uuid/DVIA-v2.app/Info.plist

   • 이 외에도 plist 형식을 사용하여 앱에서 필요한 데이터를 내부 저장소에 저장 

      # 앱과 사용자 데이터를 저장하는 Data Container에서 확인 가능

      # /private/var/mobile/Containers/Data/Application/$uuid/

– 확인 방법

   • SSH & 3uTools & plist Editor(List View 기능) 등

 

• Plist 

   - Local Data Storage

      – DVIA-v2 앱의 [Local Data Storage > Plist] 항목에서 테스트 가능

      – 사용자가 입력한 Username과 Password가 평문으로 노출

      – /private/var/mobile/Containers/Data/Application/$uuid/Documents/userInfo.plist

 

 

• UserDefault 

   - Local Data Storage

      – DVIA-v2 앱의 [Local Data Storage > UserDefaults] 항목에서 테스트 가능

      – 사용자가 입력한 정보가 평문으로 노출

      – /private/var/mobile/Containers/Data/Application/$uuid/Library/Preferences/com.highaltitudehacks.DVI Aswiftv2.plist

 

• Keychain 

   - Local Data Storage
      – iOS 키체인은 암호화 키와 세션 토큰과 같은 짧고 민감한 데이터 비트를 안전하게 저장할 수 있는 암호화된 데이터베이스

      – 키체인은 API를 통해 접속할 수 있고 SQLite 데이터베이스로 구현됨

      – macOS에서는 모든 애플리케이션이 원하는 만큼 키체인을 만들 수 있으며, 로그인 계정마다 키체인이 존재 하지만, iOS의 키체인은 모든 앱에서 하나의 키체인만 사용할 수 있음

      – kSecAttrAccessGroup 속성의 접근 그룹 기능을 통해 동일한 개발자가 서명한 앱 간 항목에 대한 접근 공유 가능

      – 키체인에 대한 접근은 securityd 데몬에 의해 관리됨 • 앱의 키체인 액세스 그룹, 애플리케이션 식별자 및 애플리케이션 그룹 사용 권한에 따라 관리됨

 

• Keychain - Local Data Storage
   – DVIA-v2 앱의 [Local Data Storage > Keychain] 항목에서 테스트 가능

   – /private/var/Keychains/keychain-2.db 에 키체인 데이터가 저장됨

   – 키체인 항목을 확인하기 위해 keychain_dumper 도구 사용 (키체인은 암호화된 데이터베이스)

   – Keychain_dumper 도구를 사용하면 탈옥된 디바이스의 키체인 내용을 덤프 가능

      • https://github.com/ptoomey3/Keychain-Dumper/

 

 

 

'개발 > Frida' 카테고리의 다른 글

FridaLab  (0) 2021.08.06
[IOS] Fairplay DRM 복호화  (1) 2020.10.08
[Frida_IOS] 앱분석_(1)  (0) 2020.09.28
[Frida_IOS] 환경 구축  (0) 2020.09.28

 

A. IOS  Architecture

[iOS Architecture]    https://www.dotnettricks.com/learn/xamarin/understanding-xamarin-ios-build-native-ios-app

 

 - Kernel and Device Driver

  •  커널 및 디바이스 드라이버를 포함한 계층
  •  고성능 네트워킹 기능과 여러 통합 파일 시스템을 지원 

 - Core OS

  • 하드웨어 및 네트워크와 관련된 서비스를 제공하는 기술과프레임워크로 구성됨
  • 커널 및 디바이스 드라이버 계층의 기능을 기반으로 함

 - Core Service

  • 앱의 필수 기능을 제공하는 계층
  • 네트워크, 위치, iCloud, Gyroscope, 주소록, 보안

 - Media

  • 그래픽, 오디오 및 비디오 기능을 모바일 앱에 통합

 -  Application

  • 주로 앱 인터페이스를 담당
  •  카메라, 연락처, 터치 입력 등 주요 시스템 기능에 대한 접근 제공

 

B. IOS  Secure Boot chain

[IOS secure boot chain]

 

 - secure boot chain 매커니즘을 사용 부팅과정에서 부터 보안을 제공.,

 - 부팅수준에서 루트킷 및 멀웨어에 의한 해킹 공격을 할 수 있다. 

 -  Boot ROM

  •  가장 신뢰성 있는 초기단계 이다. 
  • 프로세서에 코드가 포함되어 있어, 업데이트 및 변경이 불가능
  •  Apple root certificate(애플 루트 인증서)가 포함되어 있어 다음 단계인 LLB가 올바르게 서명되어 있는지 검증
  •  LLB가 검증되지 않거나 로드하지 못하면 DFU 모드로 진입
      : DFU 모드 : Device Firmware Upgrade의 약자 모든 자료를 지우며 공장 초기화할 때 자주 이용함

 -  LLB

  • Boot ROM 단계에서 LLB 서명이 유효하면 실행되는 단계
  • 업데이트할 수 있는 가장 하드웨어와 가까운 코드 
  • iBoot를 로드하기 전에 펌웨어 서명 검증
  • iBoot가 검증되지 않거나 로드하지 못하면 Recovery 모드로 진입 
       : Recovery 모드  - 저장된 파일과 애플리케이션은 유지됨 iOS 업그레이드 혹은 재설치에 자주 이용함

 -  iBoot 

  •  LLB 단계에서 iBoot 서명이 유효하면 실행되는 단계 
  • iOS Kernel을 시작하기 전에 서명 검증
  • iOS Kernel이 검증되지 않거나 로드하지 못하면 Recovery 모드로 진입

C. IOS SandBox 

 -  SandBox 

  • 샌드박스는 iOS 접근 제어 기술로 커널 레벨에서 실행됨
  • 앱 손상 시 발생할 수 있는 시스템과 사용자 데이터 손상을 방지하는 목적 
  • 애플리케이션이 다른 애플리케이션의 데이터 또는 파일에 접근하는 것을 방지함. 

 

l[SandBox]

https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AboutAppSandbox/AboutAppSandbox.html#//apple_ref/doc/uid/TP40011183-CH1-SW1

 

 A. Frida란?

  • 다이나믹 코드 instrumentation 툴킷 ( scriptable DBI framework )
  • 자바스크립트 인젝션을 이용해 윈도우, 맥, 리눅스, iOS, 안드로이드, QNK 기반의 네이티브 앱 후킹을 지원

 

[Frida Architecture]

 

B. Binary Instrumentation

Static vs Dynamic

 

C. Frida 환경 구축  (Windows 기준)

conda create -n py371_15.1.28  python=3.7.1 -y
conda activate py371_15.1.28
python --version
pip install frida==15.1.28
pip install frida-tools
frida --version

 

 

Releases · frida/frida

Clone this repo to build Frida. Contribute to frida/frida development by creating an account on GitHub.

github.com

 

  • Frida-Gadget 설치 
분석 하고자 하는 apk decompile
	
    apktool d app-debug.apk
    java –jar apktool.jar d app-debug.apk
    entry point 에 so파일 로드 하도록 코드 추가 
    
    const-string v0, "frida-gadget"
    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
    
    lib/아키텍쳐 위치에 so파일 복사 
    frida 는 소켓통신을 하므로, AndroidManifest.xml 파일에 인터넷 권한 추가
    <uses-permission android:name="android.permission.INTERNET" />
  •  Frida 동작 확인
       -  adb shell
       -  netstat -ln grep "27042"     : 27042는 기본 포트 
  • app에 연결 
       - frida -U Gadget

 

 

D. Smaill Code 

Java VS Android Compile

 

 

 

D. adb nox 연결

adb connect 127.0.0.1:62001

 

 

 

1. Ptrace 

    - 앱에 연결되는것을 방지 하기 위해 PT_DENY_ATTACH 옵션 설정

    - ptace 는 Store 에서 거부 될 수 있다. 함수를 직접 가져와서 사용. 

 

       #import  <dlfcn.h>

          #import <sys/types.h>

          #import <stdio.h>

          

          typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);

          

          void anti_debug()

          {

               ptrace_ptr_t ptrace_ptr = (ptrace_ptr_t)dlsym(RTLD_SELF, "ptrace");

               ptrace_ptr(31,0,0,0)  ; // 31 =PTRACE_DENY_ATTACH

          }

 

2. sysctl 

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <stdlib.h>
  
static int is_debugger_present(void)
{
	int ret =0;
    int name[4];
    struct kinfo_proc info;
    size_t info_size = sizeof(info);
  
    info.kp_proc.p_flag = 0;
  
    name[0] = CTL_KERN;
    name[1] = KERN_PROC;
    name[2] = KERN_PROC_PID;
    name[3] = getpid();
  
   return = sysctl(name, 4, &info, &info_size, NULL, 0);
   
   if (ret != 0) ret = 0;
   else
	  ret = info.kp_proc.p_flag & P_TRACED);
	
	return ret;
 }

3. 프리다 탐지 방법 

    -  서버프로세스 포트 확인 (기본 : TCP 27047)

    - 라이브러러 확인 : frida-gadget*.so, frida-agent*.so 

    - D-bus 프로토콜 사용 확인. 

[dumpsys]  

// Current Focus Activity and App infomation
adb shell dumpsys activity activities | grep -E "mCurrentFocus|mFocusedApp"

// 현재 최상위 Activity 최상위 PID 
adb shell "dumpsys activity | grep top-activity"



(특정 Activity)
adb shell dumpsys activity activities | grep -E "Activities|BackgroundScanActivity"

//Sleep 20초
    
.line 32
    const-wide/16 v0, 0x4e20

    :try_start_0
    invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V
    :try_end_0
    .catch Ljava/lang/InterruptedException; {:try_start_0 .. :try_end_0} :catch_0

    .line 35
    goto :goto_0

    .line 33
    :catch_0
    move-exception v0

    .line 34
    .local v0, "e":Ljava/lang/InterruptedException;
    invoke-virtual {v0}, Ljava/lang/InterruptedException;->printStackTrace()V

 

 

FridaLab - Ross Marks

 

FridaLab

I was struggling with a recent test using frida, knowing it could do what I want but unsure how. After lots of googling and trial and error I eventually got it working. So I decided

rossmarks.uk

 

 

 

//1
setImmediate(function(){
Java.perform(function(){
var chall01 = Java.use("uk.rossmarks.fridalab.challenge_01");
chall01.chall01.value = 1;
console.log("\nlevel01 Success");

// 2
var chall02 = Java.choose("uk.rossmarks.fridalab.MainActivity",{
onMatch : function(chall02){
chall02.chall02();
},
onComplete : function()
{
console.log("\nlevel02 success");
}
})


//3
var chall03 = Java.use("uk.rossmarks.fridalab.MainActivity");
chall03.chall03.implementation = function(){
console.log("\nlevel03 success");
return true;
}

//4

var chall04 = Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(chall04){
chall04.chall04("frida");
},
onComplete : function(){
console.log("\nlevel04 success");
}
})

//5

var chall05 = Java.use("uk.rossmarks.fridalab.MainActivity");
chall05.chall05.overload("java.lang.String").implementation = function(arg){
this.chall05("frida");
console.log("\nlevel05 success");
}

//7

var cahll07 = Java.use("uk.rossmarks.fridalab.challenge_07");
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
for (var i = 1000; i < 10000; i++)
{
console.log("\nlevel07 attach value : " + i);
var tmpStr = String(i);
if (cahll07.check07Pin(tmpStr))
{
instance.chall07(tmpStr);
break;
}
}
},
onComplete : function(){
console.log("\nlevel07 success");
}
})


Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
var klass = Java.use("android.widget.Button");
var checkId = instance.findViewById(2131165231);
var checkBnt = Java.cast(checkId, klass);
var strConfirm = Java.use("java.lang.String");
checkBnt.setText(strConfirm.$new("Confirm"));
},
onComplete : function(){
console.log("\nlevel08 success");
}
})

})
})

//6

setTimeout(function(){
console.log("\n After 10 sec!");
setImmediate(function(){
Java.perform(function(){
var chall06 = Java.use("uk.rossmarks.fridalab.challenge_06");
chall06.addChall06.overload("int").implementation = function(arg){
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
instance.chall06(chall06.chall06.value);
},
onComplete : function(){
console.log("\nlevel06 success");
}
})
}
})
})

}, 10000)


 

 

 

'개발 > Frida' 카테고리의 다른 글

[DIVA2] 1. Local DAta Storage  (0) 2022.09.29
[IOS] Fairplay DRM 복호화  (1) 2020.10.08
[Frida_IOS] 앱분석_(1)  (0) 2020.09.28
[Frida_IOS] 환경 구축  (0) 2020.09.28

+ Recent posts