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 확인
![](https://blog.kakaocdn.net/dn/t7aJa/btrR5yXFtqO/dAF11x8Xcc3KIdxR2cKeKk/img.png)
2. 프록시 환경 설정
2-1) 네트워크 설정
아이폰 단말기와 버프가 설치된 컴퓨터를
동일한 대역의 네트워크로 설정해 준다.
동일한 와이파이를 잡아 사용하면 편한데
진단을 위한 컴퓨터가 데스크 탑인데
wifi 지원을 안 하는 보드를 사용하는 경우
IpTime-A3000U 같은 별도의 랜카드를
달아야 하니 참고!
본 실습은 노트북으로 진행.
2-2) 버프 설정
노트북 와이파이 아이피 확인 후
![](https://blog.kakaocdn.net/dn/3Mbmn/btrR5xYKpTl/316oruEGlhbUKfz1Kl6Lk0/img.png)
버프 설정
![](https://blog.kakaocdn.net/dn/bdhMgl/btrR3b3xhjB/cLcBtrlDvmNut1Y4IaSW01/img.png)
2-3) 아이폰 설정
설정 > Wi-Fi > 연결된 항목 옆 (i) 클릭 >
맨 하단 프록시 구성 > 수동 선택 >
서버 : 버프 주소와 통일
포트 : 버프 포트와 통일
![](https://blog.kakaocdn.net/dn/HMlod/btrR3G3c0ZA/fy26b4WmkYuH5FAFXnIaKk/img.png)
설정 완료!
# 테스트
버프 Intercept 켜놓고
DVIA 앱에서 SEND OVER HTTP 요청 보내면,
![](https://blog.kakaocdn.net/dn/DuLHc/btrR2HV5z2L/V6RkOPV9mwJkzckNkB5S2k/img.png)
![](https://blog.kakaocdn.net/dn/lHB72/btrR4x5RF3G/mM7fnUk10Aw5ap7pnWkn51/img.png)
정상 동작!
2-4) 버프 인증서 설정
HTTPS 통신을 위해 버프 인증서를 설치해 준다.
사파리 들어가서 http://burp/ 입력 후
화면 우측 CA Certificate 선택
![](https://blog.kakaocdn.net/dn/Uu9bW/btrR2E6da8k/IrzUn9KoboYoXpdmZGFId0/img.png)
![](https://blog.kakaocdn.net/dn/rdGl6/btrR2TvgXyG/6ktfanPMzchLXRywE48POk/img.png)
![](https://blog.kakaocdn.net/dn/vpHqV/btrR4FCJCye/C3JPQIDnE1pju4PKP148f0/img.png)
허용!
# 설정 > 일반 > 프로파일 > 버프 인증서 설치
![](https://blog.kakaocdn.net/dn/ctLuBr/btrR2FxgzPJ/4jIJdPfjTanY7AWbYq1hdk/img.png)
![](https://blog.kakaocdn.net/dn/bc8Vxi/btrR5gW6Gza/0R4C7A9SZglK8b5Wcw78YK/img.png)
# 설정 > 일반 > 정보 > 인증서 신뢰 설정 > 인증서 활성화
![](https://blog.kakaocdn.net/dn/cBlr7m/btrR1gY8Mif/iZFUqjdeuPL4iUxurPgTEK/img.png)
# HTTPS 테스트
버프 Intercept 켜놓고
DVIA 앱에서 SEND OVER HTTPS 요청 보내면,
![](https://blog.kakaocdn.net/dn/cnZPlU/btrR3GhRsEi/YWWsRGfduASFbPGdGwXgyK/img.png)
![](https://blog.kakaocdn.net/dn/JcZYO/btrR20A4pZg/jRAhu9KLEnMEvwOm0OSA01/img.png)
정상 동작하고
당연히
![](https://blog.kakaocdn.net/dn/bBYcbw/btrR2Gv8Xip/w9lDgIE0tWHOmXbj7Wh07K/img.png)
![](https://blog.kakaocdn.net/dn/exaPRf/btrR2xGc9O3/AipqphPoY1KxuDHT9qP0rk/img.png)
웹 통신 패킷도 정상적으로 잡는다.
설정 끝
3. SSL Pinning 우회
금융권의 앱 등 몇몇 특정 앱들은
통신할 때 필요한 인증서가
특정 인증서로 따로 고정되어 있어
그러한 앱을 진단하기 위해선
관련 인증서를 제공받거나
고정된(pinning) 인증서를
우회해야 한다.
![](https://blog.kakaocdn.net/dn/Lbor1/btrR3CmiFf5/8yitdG2aPPeeMnSJqCcgn0/img.png)
3-1) 프리다를 통한 우회
pinning 우회 기법은 iOS 버전별로
조금씩 다른데 진단 단말기 버전에
맞는 우회 코드를 받아 돌려주면 된다.
위 경로에 들어가 보면
Android, iOS 진단에 도움이 되는
유용한 코드가 많은데
원하는 것을 찾기가 쉽지 않을 때,
구글에
Project:iOS13-ssl-bypass
등과 같이 키워드를 검색하면 된다.
![](https://blog.kakaocdn.net/dn/dwi6rS/btrR6eLvrWA/x3kDRjKtBBbrMO6GVOgMo0/img.png)
![](https://blog.kakaocdn.net/dn/HvlSm/btrR5gJxPES/yBtHoWqwyYiCvraj0pxkXK/img.png)
위 명령어대로 실행해도 되고
(-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 ");
파일로 저장 후
![](https://blog.kakaocdn.net/dn/qLsMK/btrR3DrXt8t/AGEQA0fH5HFoz6mU8KlIm1/img.png)
프리다로 돌려주면
![](https://blog.kakaocdn.net/dn/cB191c/btrR5h9y1LW/nYIHbihGycPpdfRkp6M2O0/img.png)
정상적으로 pinning 우회가 되며
앱 내 PINNING 관련 기능을 누르면
![](https://blog.kakaocdn.net/dn/dhNLem/btrR2tcOM1Y/VnEAOPaGLMmlQHNGMxArn1/img.png)
정상적으로 패킷이 요청된다!
![](https://blog.kakaocdn.net/dn/L4oSs/btrR2rTBvSw/aqHu9E4uqINzHkXGHKHFc1/img.png)
4. ATS (App Transport Security)
![](https://blog.kakaocdn.net/dn/Xv6F4/btrR3Z2BHiM/DQehWleOMNXJIbYlG0aIKk/img.png)
info.plist 파일 내
NSAppTransportSecurity
항목의 속성 값 확인!
4-1) 현재 설정 확인
<key>NSAllowsArbitraryLoads</key>
![](https://blog.kakaocdn.net/dn/bJxAyO/btrR1pBD5sp/Pv68lbmCoS7kKwkaGj9CH1/img.png)
> 위 설정은 HTTP 통신을 허용하는 경우 값
4-2) 설정값 바꾸기
HTTPS 통신만 허용하는 경우 값인
<key>NSExceptionAllowsInsecureHTTPLoads</key>
로 바꾼 후
![](https://blog.kakaocdn.net/dn/KAJXY/btrR3eTo146/BVU6ajeG4nKVAurCkHWKOk/img.png)
info.plist 파일을 업데이트해주면
HTTP 요청 패킷은 안 잡히고
HTTPS만 잡히게 된다.
# 기타 속성 값은 하단의 경로 참고!
끝
5. 대응 방안
– HTTPs 통신 필수 (중요한 데이터는 암호화를 통해 HTTPs 통신으로 전송)
– HTTP 통신을 사용하지 않는다면, ATS에 NSExceptionAllowsInsecureHTTPLoads 키 설정
![](https://blog.kakaocdn.net/dn/byjGJc/btrR3ey606m/ebGFAoHt2S2IVuKp33uvX1/img.png)
[도움 출처]
: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의