20. Network Layer Security (feat. 버프 프록시 설정)
[목차]
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 버전별로
조금씩 다른데 진단 단말기 버전에
맞는 우회 코드를 받아 돌려주면 된다.
위 경로에 들어가 보면
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만 잡히게 된다.
# 기타 속성 값은 하단의 경로 참고!
끝
5. 대응 방안
– HTTPs 통신 필수 (중요한 데이터는 암호화를 통해 HTTPs 통신으로 전송)
– HTTP 통신을 사용하지 않는다면, ATS에 NSExceptionAllowsInsecureHTTPLoads 키 설정

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