gnosis@kim:~#

gnosis@kim:~ # cat blog/mitm-ssl-tls-pinning.md

# MITM(중간자) 공격 , SSL/TLS Pinning & Bypass

[Analysis]10 min read[ko]

#MITM#Mobile

🌐 MITM, SSL/TLS Pinning & Bypass - 한눈에 정리


🧭 인트로: "🔒 표시가 뜨니 안전하겠지?"

카페 Wi-Fi에서 로그인했을 뿐인데, 일주일 뒤 불법 결제 알림이 뜬 적이 있으신가요?
모바일 앱은 HTTPS 아이콘을 보여주지만 Burp Suite에서는 평문 JSON이 잡힙니다.
MITM(Man-in-the-Middle) 공격은 "패킷이 목적지까지 그대로 도착한다"는 우리의 믿음을 깨뜨립니다.

이 글은 다음 여섯 단계로 MITM → TLS → Pinning → Bypass를 총정리합니다.

목차
1️⃣ MITM이란?
2️⃣ MITM 실전 사례 & PoC 코드
3️⃣ SSL/TLS (+HTTPS) 기초
4️⃣ SSL/TLS Pinning이란?
5️⃣ Pinning Bypass 사례 & 코드
6️⃣ 결론: 방어 체크리스트


1️⃣ MITM이란? - 공격자 "가로채기" 시나리오

MITM(Man-In-The-Middle)이란 공격자가 사용자와 서버(또는 두 사람) 사이의 통신에 몰래 끼어들어 데이터를 도청하거나 조작하는 공격입니다.

로그인 정보, 금융 데이터 등 민감한 정보가 탈취되거나 메시지가 변조될 수 있습니다.

출처: https://powerdmarc.com/ko/what-is-a-mitm-attack/

출처: https://powerdmarc.com/ko/what-is-a-mitm-attack/

단계설명대표 도구
위치 선점피해자-서버 사이 트래픽 경로를 장악ARP Spoofing (arpspoof), Evil-Twin AP, DNS Poisoning
세션 가로채기TLS 핸드셰이크에 공격자가 가짜(사설) 인증서 주입 → 클라이언트가 신뢰 시 암·복호화 가능Burp Suite, mitmproxy
스니핑·변조평문 데이터 탈취·조작 후 다시 암호화해 서버 전달Burp Rewrite, BetterCAP modules

❗ 결정적 포인트


2️⃣ MITM 실전 사례 & 코드

분류시나리오PoC 스니펫
LAN 내부회의실 공유 LAN에서 ARP Spoof → 임직원 로그인 쿠키 탈취# Kali
echo 1 > /proc/sys/net/ipv4/ip_forward
sudo arpspoof -i wlan0 -t <victimIP> <gatewayIP>
공용 Wi-FiEvil-Twin AP 이름만 동일 → 강제 연결 → HTTPS 다운그레이드 시도Wi-Fi Pineapple / airgeddon fake AP
모바일 앱Android 앱 Pinning 미설정 → Burp CA 주입 → 토큰·카드정보 수집Burp CA install → 앱 실행 → Intercept

실전 보고서


3️⃣ SSL/TLS (+HTTPS) 기초 3분 요약

SSL/TLS는 안전한 데이터 암호화와 신원 인증을 위한 프로토콜이고, HTTPS는 그것을 웹에 적용한 것입니다.

요소역할핵심
TLS전송 계층 암호화 프로토콜대칭키 교환 + 인증서를 통한 서버/클라 신원 검증
X.509 인증서공개키·서명·만료·CN 포함브라우저/OS는 신뢰 루트 CA 체인을 검증
HTTPSHTTP + TLS443 포트, TLS 세션 위에 HTTP 요청/응답 전달

TLS의 작동 원리 (출처: https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/)

TLS의 작동 원리 (출처: https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/)

TLS 1.3 이후 "Perfect Forward Secrecy"가 기본 → 키 탈취돼도 과거 트래픽 복호 불가
단, 클라이언트가 잘못된 CA를 신뢰하면 아무 소용없음


4️⃣ SSL/TLS Pinning이란?

모바일 앱, 웹앱에서 MITM을 막기 위해 서버의 인증서나 공개키를 앱에 직접 저장해 두고, 서버와 통신할 때 실제로 받은 인증서가 이와 일치하는지 검사하는 보안 기법입니다.

신뢰할 수 있는 CA(인증기관)만 믿는 것이 아니라, 특정 서버의 인증서/공개키만 신뢰하여 공격자가 위조 인증서를 써도 통신을 차단합니다.

출처: https://www.indusface.com/learning/what-is-ssl-pinning-a-quick-walk-through/

출처: https://www.indusface.com/learning/what-is-ssl-pinning-a-quick-walk-through/

Pinning 유형구현 방법장점운영상 주의
Static Pinning앱 binary에 SPKI SHA-256 해시 하드코딩MITM 우회 난도 ↑인증서 갱신 시 앱 업데이트 필수
Dynamic Pinning서버가 Public-Key-Pins 헤더 or TrustKit SDK교체 유연헤더 변조 위험, 구현 복잡
Cert Directory Pinning (iOS ATS)NSAppTransportSecurity + PinnedDomains시스템 정책으로 거부도메인·서브도메인 관리 필요

=> SMB/스타트업 추천: "현재 키 + 백업 키" 2개를 Static Pinning → 만료/교체 시 무중단


5️⃣ Pinning Bypass 사례 & 코드

5-1. Android – Frida 런타임 패치

// ssl-bypass.js
Java.perform(function() {
  var TrustManager = Java.use('javax.net.ssl.X509TrustManager');
  TrustManager.checkServerTrusted.implementation = function(chain, authType) {
    console.log('[+] bypassed checkServerTrusted');
    return;   // 무조건 통과
  };
});
frida -U -f com.vuln.app -l ssl-bypass.js

5-2. iOS – SSL-Kill-Switch-2

git clone https://github.com/nabla-c0d3/ssl-kill-switch2
make
# Jailbreak 디바이스에 dylib 탑재 후 리스프링

5-3. React-Native 앱 코드 우회

// Before (security.js)
if (!CertificatePinning.verify(serverCert)) throw Error('Pin failure');

// After (repack)
if (false) throw Error('Pin failure');

6️⃣ 결론 – 실전 방어 체크리스트

  1. 앱 NetworkSecurityConfig
    base-config trust-anchors → user CA 제외
  2. 다중 Pin + 백업 Key (만료 전 롤링 대비)
  3. 루팅·Frida·Xposed 탐지 라이브러리 적용 ⬌ 무결성 검사
  4. API 레이어 - 요청마다 timestamp/nonce/HMAC → MITM 변조 탐지
  5. 서버 측 CT Log 모니터링 & ACME Webhook → 미승인 인증서 발급 감지
  6. 내부 테스트·Debug 빌드에는 Pinning OFF → 운영 빌드 ENABLE 스위치
  7. 레거시 시스템(업무 포탈 등)에는 HSTS + TLS1.2 이상 강제

✍️ 나의 생각

네트워크 공부를 열심히 해야 함을 다시 깨닫습니다..


참고 자료