인증서 피닝이
인증서를 피닝한 앱은 Busymate DevTools로 복호화되지 않습니다. iOS에서도, Android에서도, 프록시를 통해서도 마찬가지입니다. 각 캡처 경로가 무엇을 볼 수 있고 없는지, 피닝된 호스트를 어떻게 알아보는지, 그럼에도 무엇이 여전히 유용한지를 정확히 알려 드립니다.
HTTPS를 복호화하는 모든 캡처 도구는 같은 방식으로 동작합니다. 스스로 서명한 인증서를 클라이언트에 제시하고, 클라이언트는 서명 기관을 신뢰하므로 이를 받아들입니다. 인증서 피닝은 앱이 특정 인증서나 키 하나만 신뢰하고 그 외에는 아무것도 신뢰하지 않겠다고 선언하는 것입니다. 피닝된 앱은 대체 인증서를 만나면 그냥 연결을 거부합니다. 이것은 도구의 스위치가 아니라 앱의 속성이며, Busymate가 제공하는 어떤 캡처 경로도 이를 우회하지 않습니다.
이 사실을 조용히 넘기는 도구는 애초에 복호화될 수 없는 대상에 여러분의 리서치 세션을 낭비하게 합니다. 그래서 이 가이드는 우회법이 아니라 지도입니다. 피닝된 호스트 앞에서 iPhone 기기 내 캡처, Android 앱, 데스크톱 프록시, 루팅된 팜 휴대폰, Chrome 커넥터가 각각 무엇을 제공하는지, 피드가 이를 어떻게 표시하는지, 그리고 그럼에도 완료되는 작업은 무엇인지 다룹니다.
필요한
이 가이드는 최소 하나의 캡처 경로에서 이미 트래픽이 대시보드에 들어오고 있다고 전제합니다.
이미 페어링되어 캡처 중인 휴대폰이나 클라이언트. iPhone 또는 Android 가이드가 거기까지 안내합니다.
조사 중인 앱의 호스트 이름을 SSL 프록시 목록에 추가해 두어, 최소한 복호화가 시도되도록 합니다.
대시보드 피드를 열어 두고 검사 필터를 바로 쓸 수 있게 준비합니다.
앱을 검사할 권한. 이 기법들은 여러분이 소유하거나 디버깅을 허가받은 앱과 사이트의 트래픽을 위한 것입니다.
순서대로
경로를 순서대로 살펴보세요. 각 경로는 피닝된 호스트가 여전히 알려줄 수 있는 것을 좁혀 갑니다.
- 01
내 캡처 경로가 어떤 신뢰 저장소에 의존하는지 알기
iOS에서 복호화는 Busymate 프로파일이 설치되고 설정에서 전체 신뢰를 받았는지에 달려 있습니다. 그다음부터 휴대폰의 모든 앱이 앱이 제시하는 인증서를 신뢰하되, 피닝하는 앱은 예외입니다. Android에는 두 개의 저장소가 있습니다. Android 7.0부터 명시적으로 선택한 앱만 인정하는 사용자 저장소와, 모든 앱이 인정하지만 루팅된 기기만 쓸 수 있는 시스템 저장소입니다. 데스크톱 프록시는 클라이언트 머신이나 브라우저가 프록시의 생성된 인증 기관에 두는 신뢰를 사용합니다.
피닝은 이 셋 모두의 위에 있습니다. 피닝하는 앱은 대체 인증서가 어느 저장소에서 왔든 거부하므로, 인증서를 더 강한 저장소로 옮기는 것은 피닝된 호스트에는 절대 도움이 되지 않습니다. 사용자 저장소를 거부하던 앱에만 도움이 됩니다.
- 02
피드에서 피닝된 호스트 알아보기
복호화 목록에 넣지 않은 호스트는 호스트 이름과 요청 수만 있는 잠긴 자물쇠로 표시됩니다. 이는 설계된 동작이지 피닝이 아닙니다. 피닝된 호스트는 다르게 보입니다. 목록에 있고, 복호화가 시도되었으며, 연결이 실패했거나 앱이 재시도하다 포기했습니다. 대시보드 피드의 검사 필터에는 복호화됨만, 암호화됨만, SSL 피닝됨만의 세 가지 설정이 있으며, 마지막 설정이 정확히 그 행들을 걸러냅니다.
다른 단서는 동작입니다. 호스트가 복호화되는 순간 앱이 그 호스트에 대해 작동을 멈추고, 목록에서 호스트를 빼는 순간 다시 작동합니다. 둘 다 해당한다면 피닝된 연결을 찾은 것입니다.
- 03
iPhone 기기 내 캡처: 메타데이터뿐, 본문은 결코
iOS 앱은 Wi-Fi와 셀룰러에서 시스템 전체를 캡처하고 목록에 넣은 호스트를 복호화합니다. 피닝된 앱을 상대로도 모든 연결을 기록합니다. 호스트, 타이밍, 요청 수와 크기, 적용 중인 연결 모드까지요. 하지만 헤더나 본문은 만들어 낼 수 없고, 이를 바꾸는 토글은 없습니다. MITM All Hosts를 켜면 피닝되지 않은 모든 호스트가 복호화되지만, 피닝된 호스트에는 망가뜨리는 것 말고는 아무 효과가 없습니다.
실용적인 방법은 피닝된 호스트를 목록에서 빼서 앱이 계속 작동하게 하고, 앱의 나머지 호스트는 목록에 두고, 피닝되지 않은 엔드포인트가 드러내는 것을 읽는 것입니다. 많은 앱이 인증이나 결제 호스트만 피닝하고 나머지는 열어 둡니다.
- 04
Android: 루팅 전, 루팅 후, 그리고 피닝의 위치
루팅하지 않은 Android 휴대폰에서 앱이 생성한 인증서는 사용자 저장소에 있으므로 여러분의 디버그 빌드와 그 밖에 선택한 클라이언트만 복호화되고, 나머지 모든 앱은 메타데이터로 기록됩니다. 루팅된 기기에서는 인증서를 시스템 저장소에 설치할 수 있어 HTTPS가 시스템 전체에서 복호화됩니다. 앱별 피닝만 제외하고요. 폰 팜이 Android 기기를 바로 이 루팅 계층에서 운영하는 이유가 여기에 있습니다.
그러니 루팅은 사용자 저장소를 그저 무시하던 불투명한 앱 한 부류를 읽을 수 있게 만들 뿐, 피닝된 부류는 그대로 둡니다. Busymate는 루팅하지 않은 기기에서 시스템 전체 복호화를 주장한 적이 없고, 루팅된 기기에서 피닝을 이겼다고 주장한 적도 없습니다.
- 05
프록시: 같은 한계, 그리고 일부러 거부하는 호스트
데스크톱 프록시와 피닝의 관계는 휴대폰 앱과 같습니다. 피닝된 클라이언트는 생성된 인증서를 거부하고 연결은 실패합니다. 또한 SSL 프록시 설정과 무관하게 절대 가로채지 않는 짧은 호스트 목록이 있습니다. Apple의 자체 PKI와 폐기 엔드포인트, Apple 체인이 쓰는 인증서 상태 응답 서버, 그리고 Busymate 자체 백엔드입니다. 이들을 가로채면 기기나 대시보드의 실시간 연결이 망가지기 때문입니다. 이들은 원시 터널로 통과하며, 이는 의도된 것이지 잘못된 설정이 아닙니다.
프록시가 설계상 손대지 않고 통과시키는 호스트 text# Passed through as raw tunnels by the proxy, regardless of your SSL-proxy list: pkis.apple.com ocsp*.apple.com crl*.apple.com valid.apple.com ppq.apple.com # the DigiCert OCSP / CRL responders Apple's chain uses *.busymate.net # the dashboard's own backend + Realtime connection - 06
Chrome 커넥터: 피닝이 적용되지 않음
피닝이 무의미한 캡처 경로가 하나 있습니다. 명령줄 커넥터는 Chrome 인스턴스를 띄우고 TLS의 브라우저 쪽에서 DevTools Protocol을 통해 트래픽을 읽습니다. Chrome과 서버 사이의 암호화된 연결은 전혀 건드리지 않습니다. 거부할 대체 인증서도, 설치할 것도, 피닝이 감지할 것도 없습니다. 프록시로는 열 수 없는 피닝 인증서를 쓰는 제공자의 로그인 흐름도 리디렉션과 토큰을 포함해 처음부터 끝까지 기록됩니다.
대가는 범위입니다. 그 Chrome 안에서 실행되는 것만 다루며 네이티브 앱은 다루지 않습니다. 관심 있는 흐름에 웹 버전이 있다면, 이 경로가 그것을 온전히 봅니다.
- 07
피닝된 호스트가 그래도 주는 것을 활용하기
메타데이터는 결코 하찮지 않습니다. 앱이 피닝된 호스트와 언제, 얼마나 자주 통신하는지, 교환 크기와 소요 시간이 어떤지 여전히 볼 수 있고, 주변의 복호화된 호출과 연관 지을 수 있습니다. 차단 규칙은 암호화된 호스트에서도 호스트 수준으로 일치합니다. 경로는 보이지 않지만, 그 엔드포인트가 도달 불가능한 것처럼 앱이 동작하게 만들 수 있으며, 이는 종종 여러분이 테스트하려던 바로 그 실패 모드입니다. 일시 중지는 호스트가 프록시를 완전히 우회하게 해서, 나머지를 모두 검사하는 동안에도 앱이 계속 작동하게 합니다.
그리고 여러분이 한 모든 조치는 감사 추적에 남으므로, 리서치 세션은 무엇을 복호화했고 무엇을 차단했으며 무엇을 그대로 두었는지 기록을 남깁니다.
잘못될 수
시간을 가장 많이 잡아먹는 실수는 도구 버그처럼 보이지만 실제로는 아닌 것들입니다.
앱의 호스트를 추가하자마자 앱이 망가짐
그것이 피닝입니다. 호스트를 SSL 프록시 목록에서 빼세요. iOS에서는 그 뒤 VPN을 재시작해 터널이 변경을 반영하게 하세요. 그러면 앱이 회복됩니다. 그 앱의 다른 호스트는 목록에 남겨 두세요.
MITM All Hosts로도 앱이 열리지 않음
애초에 열릴 수 없습니다. 이 스위치는 피닝되지 않은 어떤 호스트를 복호화할지를 넓힐 뿐이며, 앱이 피닝한 호스트에는 아무 효과가 없고 휴대폰의 다른 모든 피닝된 연결까지 실패하게 만듭니다. 다시 끄세요.
Android 휴대폰을 루팅해도 도움이 안 됨
루팅은 인증서를 시스템 저장소로 옮겨 사용자 저장소를 무시하던 앱을 설득합니다. 인증서를 자체 핀과 비교하는 앱에는 영향을 주지 못합니다.
Apple 시스템 호스트가 프록시에서 절대 복호화되지 않음
복호화하면 기기가 망가지기 때문에 프록시의 절대 가로채지 않는 목록에 있습니다. 고칠 것은 없으며, 필터는 설계대로 암호화됨으로 표시합니다.
자주 묻는
Busymate가 피닝 우회 기능을 제공하나요?
아니요. 어떤 캡처 경로도 대상 앱을 수정하거나, 코드를 주입하거나, 신뢰 로직을 패치하지 않습니다. 피닝된 네이티브 앱에 대한 솔직한 답은 메타데이터와 피닝되지 않은 호스트가 드러내는 것뿐입니다.
피닝과 단순히 목록에 넣는 걸 잊은 호스트를 어떻게 구별하나요?
목록에 없는 호스트는 잠긴 자물쇠를 보여주고 앱은 계속 작동합니다. 피닝된 호스트는 목록에 있고, 복호화가 시도되었으며, 피드의 SSL 피닝됨 필터로 걸러지고, 목록에서 뺄 때까지 앱이 실패합니다.
피닝된 제공자의 인증 흐름에는 어떤 경로를 골라야 하나요?
제공자에 웹 로그인이 있다면 Chrome 커넥터로 실행하세요. TLS가 브라우저 안에서 끝나므로 리디렉션 체인 전체가 기록됩니다. 네이티브 앱에는 복호화된 경로가 없습니다. 메타데이터와 주변의 피닝되지 않은 호출을 캡처하세요.