[목차]

 

0. 개요

1. Network Layer Security 문제 확인

2. 프록시 환경 설정(Burp Suite)

3. SSL Pinning 우회

4. ATS

5. 대응 방안

 

 


 

 

 

0. 개요

 

웹 진단 시 버프 등의 프록시 도구로

네트워크 트래픽을 분석하거나

파라미터 값 변조 등의 작업을 하는 것처럼

앱 진단 또한 동일한데

 

버프와 아이폰 단말기를 연결하여

iOS 애플리케이션과 백엔드 API 간의

트래픽을 모니터링하며 취약점을

진단하는 방법을 배워본다.

 

 

 

 

 

1. Network Layer Security

: 네트워크를 통해 데이터를 전송하는

세 가지 방법과 ATS 설정 확인

- HTTP, HTTPs, SSL/Cert PINNING, ATS

 

 

: DVIA 앱 Network Layer Security tasks 확인

 


 

 

2. 프록시 환경 설정

 

2-1) 네트워크 설정

아이폰 단말기와 버프가 설치된 컴퓨터를

동일한 대역의 네트워크로 설정해 준다.

 

동일한 와이파이를 잡아 사용하면 편한데

진단을 위한 컴퓨터가 데스크 탑인데

wifi 지원을 안 하는 보드를 사용하는 경우

IpTime-A3000U 같은 별도의 랜카드를

달아야 하니 참고!

 

본 실습은 노트북으로 진행.

 

 

 

2-2) 버프 설정

노트북 와이파이 아이피 확인 후

버프 설정

 

 

 

2-3) 아이폰 설정

설정 > Wi-Fi > 연결된 항목 옆 (i) 클릭 >

맨 하단 프록시 구성 > 수동 선택 >

서버 : 버프 주소와 통일

포트 : 버프 포트와 통일

 

설정 완료!

 

 

 

# 테스트

버프 Intercept 켜놓고

DVIA 앱에서 SEND OVER HTTP 요청 보내면,

 

정상 동작!

 

 

 

 

2-4) 버프 인증서 설정

HTTPS 통신을 위해 버프 인증서를 설치해 준다.

 

사파리 들어가서 http://burp/ 입력 후

화면 우측 CA Certificate 선택

허용!

 

 

# 설정 > 일반 > 프로파일 > 버프 인증서 설치

 

 

 

# 설정 > 일반 > 정보 > 인증서 신뢰 설정 > 인증서 활성화

 

 

 

# HTTPS 테스트

버프 Intercept 켜놓고

DVIA 앱에서 SEND OVER HTTPS 요청 보내면,

정상 동작하고

 

당연히

웹 통신 패킷도 정상적으로 잡는다.

 

 

설정 끝

 

 

 

 

 

3. SSL Pinning 우회

 

금융권의 앱 등 몇몇 특정 앱들은

통신할 때 필요한 인증서가

특정 인증서로 따로 고정되어 있어

 

그러한 앱을 진단하기 위해선

관련 인증서를 제공받거나

고정된(pinning) 인증서를

우회해야 한다.

 

 

 

3-1) 프리다를 통한 우회

pinning 우회 기법은 iOS 버전별로

조금씩 다른데 진단 단말기 버전에

맞는 우회 코드를 받아 돌려주면 된다.

 

https://codeshare.frida.re/

위 경로에 들어가 보면

Android, iOS 진단에 도움이 되는

유용한 코드가 많은데

 

원하는 것을 찾기가 쉽지 않을 때,

구글에

Project:iOS13-ssl-bypass

등과 같이 키워드를 검색하면 된다.

 

위 명령어대로 실행해도 되고

(-f 는 spawn, 앱을 실행하면서 해당 코드를 삽입)

아니면 코드를 따로 저장 후 실행시켜도 된다.

/* Description: iOS 13 SSL Bypass based on https://codeshare.frida.re/@machoreverser/ios12-ssl-bypass/ and https://github.com/nabla-c0d3/ssl-kill-switch2
 *  Author: 	@apps3c
 */

try {
	Module.ensureInitialized("libboringssl.dylib");
} catch(err) {
	console.log("libboringssl.dylib module not loaded. Trying to manually load it.")
	Module.load("libboringssl.dylib");	
}

var SSL_VERIFY_NONE = 0;
var ssl_set_custom_verify;
var ssl_get_psk_identity;	

ssl_set_custom_verify = new NativeFunction(   // 변조 지점
	Module.findExportByName("libboringssl.dylib", "SSL_set_custom_verify"),
	'void', ['pointer', 'int', 'pointer']
);

/* Create SSL_get_psk_identity NativeFunction 
* Function signature https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#SSL_get_psk_identity
*/
ssl_get_psk_identity = new NativeFunction(
	Module.findExportByName("libboringssl.dylib", "SSL_get_psk_identity"),
	'pointer', ['pointer']
);

/** Custom callback passed to SSL_CTX_set_custom_verify */
function custom_verify_callback_that_does_not_validate(ssl, out_alert){
	return SSL_VERIFY_NONE;
}

/** Wrap callback in NativeCallback for frida */
var ssl_verify_result_t = new NativeCallback(function (ssl, out_alert){
	custom_verify_callback_that_does_not_validate(ssl, out_alert);
},'int',['pointer','pointer']);

Interceptor.replace(ssl_set_custom_verify, new NativeCallback(function(ssl, mode, callback) {
	//  |callback| performs the certificate verification. Replace this with our custom callback
	ssl_set_custom_verify(ssl, mode, ssl_verify_result_t);
}, 'void', ['pointer', 'int', 'pointer']));

Interceptor.replace(ssl_get_psk_identity, new NativeCallback(function(ssl) {
	return "notarealPSKidentity";
}, 'pointer', ['pointer']));
	
console.log("[+] Bypass successfully loaded ");	
 

 

파일로 저장 후

 

 

 

프리다로 돌려주면

정상적으로 pinning 우회가 되며

 

 

앱 내 PINNING 관련 기능을 누르면

 

정상적으로 패킷이 요청된다!

 

 

 


 

 

4. ATS (App Transport Security)

 

 

info.plist 파일 내

NSAppTransportSecurity

항목의 속성 값 확인!

 

 

4-1) 현재 설정 확인

<key>NSAllowsArbitraryLoads</key>

> 위 설정은 HTTP 통신을 허용하는 경우 값

 

 

4-2) 설정값 바꾸기

HTTPS 통신만 허용하는 경우 값인

<key>NSExceptionAllowsInsecureHTTPLoads</key>

로 바꾼 후

 

info.plist 파일을 업데이트해주면

HTTP 요청 패킷은 안 잡히고

HTTPS만 잡히게 된다.

 

 

# 기타 속성 값은 하단의 경로 참고!

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

 

 

 

 


 

 

5. 대응 방안

 

– HTTPs 통신 필수 (중요한 데이터는 암호화를 통해 HTTPs 통신으로 전송)

– HTTP 통신을 사용하지 않는다면, ATS에 NSExceptionAllowsInsecureHTTPLoads 키 설정

 

 

 

 

 


 

 [도움 출처]

: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의

 

728x90

'APP 진단 > iOS' 카테고리의 다른 글

22. Application Patching 2  (0) 2022.11.27
21. Application Patching 1  (0) 2022.11.26
19. WebView Issues  (0) 2022.11.24
18. IPC Issues  (0) 2022.11.23
17. Side Channel Data Leakage  (0) 2022.11.22

+ Recent posts