사전 조건:

1. 루팅된 폰

2. 폰 내 tcpdump 바이너리 필요

 

1. 모바일 디바이스 쉘 접속 후 wireless 네트워크 인터페이스 명을 확인한다.

 

2. cmd 창에서 -i 에 네트워크 인터페이스만 수정한 후 입력 시 정상 디바이스에서 출력되는 tcpdump 출력값을 내 PC의 와이어 샤크로 가져올 수 있다. (powershell 아니다. cmd 이다.)

adb exec-out "su -c 'tcpdump -i wlan0 -s 0 -U -w -' 2>/dev/null" | "C:\Program Files\Wireshark\wireshark.exe" -k -i -

 

 

3. PCAPdroid 를 이용해 애플리케이션 단위 트래픽 캡쳐도 가능하다. 그러나 나의 경우 디바이스 전체 네트워크 단의 트래픽이 필요했기에, tcpdump를 이용했다.

 

4. adb exec-out "su -c 'tcpdump -i wlan0 -s 0 -U -w -' 2>/dev/null" | "C:\Program Files\Wireshark\wireshark.exe" -k -i -  명령어 설명은 다음과 같다.

1) adb exec-out: adb shell은 tty 모드로 동작해 출력값이 일부 변조된다. 이로 인해 와이어샤크에서 잘못된 패킷으로 판단한다.  exec-out는 이용해 있는 그대로의 순수 출력값을 얻을 수 있다.

2) su -c: 슈퍼유저로 커맨드(command) 실행

3) -i wlan0: 네트워크 인터페이스 지정, -i any로 할 시 왠지는 모르겠지만 패킷이 안잡힘.

4) -s: 패킷 앞부분을 짜르지 않음. (혹시 몰라서 넣음)

5) -U: 패킷 실시간 전송 가능하게끔 설정 (없어도 됨. 없으면 버퍼에 어느정도 쌓이고 전달되는데, 해봤자 2~3초 뒤 전달되는 정도의 차이)

6) -w -: 표준 출력으로 패킷 처리 (패킷 출력한 뒤 파이프로 넘겨야 하니..)

7) 2>/dev/null: 에러는 버림

8) -k(와이어샤크 쪽): 별다른 설정없이 와이어샤크를 바로 시작

9) -i(와이어샤크 쪽): 표준 입력으로 패킷 수신

 

5. 다음 문제는 SSL 트래픽 복호화이다. 와이어샤크로 덤프한 SSL 패킷은 세션키로 암호화되어 있다.

 

이를 복호화하는 방법은 2가지가 있다.

 

하나는 프리다를 이용해 애플리케이션을 후킹해 세션키를 확보하는 것이다.

 

이 세션키는 애플리케이션 단위로 확보 가능하다. 예를 들어, 토스 앱 내에 SSL/TLS 인증서가 피닝되어 있고, 애플리케이션 단위로 이 피닝된 인증서를 이용해 서버/클라이언트 간 통신을 위한 세션키를 생성한다. SSL 핸드쉐이크를 한다는 것이다.

 

SSL 핸드쉐이크 과정 내용을 확보하기 위한 방법은 프리다를 이용해 해당 애플리케이션에서  콜하는 네이티브 SSL 라이브러리(libssl)를 후킹하는 것이다. 

 

두번째 방법은 eBPF를 이용해 커널 단에서 SSL 라이브러리를 감시하여 SSL 세션키를 확보하는 방법이 있다. 해당 방법의 장점은 애플리케이션 단위가 아니여서 모바일 디바이스 내 모든 HTTPS 패킷을 볼 수 있다. 그러나 단점은 안드로이드 커널 버전이 5.5 이상이여야 한다(aarch64 기준). 갤럭시 S9 기준 커널 버전은 4.9.337 이라 사용이 불가하다. 사용 가능한 스마트폰은 갤럭시 S22 이상, Pixel 6 이상이다.

https://github.com/gojue/ecapture

 

GitHub - gojue/ecapture: Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for

Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for amd64/arm64. - gojue/ecapture

github.com

 

 

그러나 나의 목적은 특정 애플리케이션 프로세스의 HTTPS 패킷만 보면 된다. 문제는 프로세스가 죽고 살아나는 경우가 빈번하다는 것이다. 이를 해결하기 위한 방법은 2가지가 있다.

 

1. 프로세스 현황을 지속 모니터링하여 프로세스가 생길 때 마다 SSL 언피닝하는 방법.

2. SSL 언피닝이 불가능한 상황이라면 SSL 라이브러리만 후킹하여 세션키를 확보해 HTTPS 패킷을 보는 방법. 이 또한 프로세스 지속 추적이 필요함.

 

요약하면 프로세스 현황을 지속 추적하여 후킹을 할건데 SSL 언피닝을 할 것이냐 아니면 세션키만 확보해 패킷을 볼 것이냐 이다.

 

 

 

 

+ Recent posts