본문 바로가기

IT Security

[보안] Flutter 환경에서의 HTTP 프록시 연결

이 포스트에서는 Flutter 환경의 모바일 애플리케이션에서의 Burp Suite(프록시) 연결 시 패킷(HTTP/HTTPS)이 잡히지 않을 경우 연결이 되는 방법을 포스팅 합니다.

일반적인 경우 Burp 인증서를 단말 또는 브라우저에 설치해서 HTTP/HTTPS 통신을 수행한다.

하지만 Flutter는 CA 저장소를 사용하지 않는 Dart를 사용하며 애플리케이션 자체에 포함된 CA 목록을 사용하므로 일반적인 Proxy 툴에서는 이를 인식하지 못합니다. 그렇기에 Proxy 툴에서 Flutter 패킷을 잡기 위해서는 우회 방법을 통해 패킷을 잡아야합니다.

 

 

우선 Flutter 가 무엇인지 알아야겠죠??

 

1. Flutter란?

: 구글이 개발한 오픈 소스 모바일(Android/IOS) 애플리케이션 개발 프레임워크이며, Dart 언어로 개발이 되어있습니다. 주요 구성요소로는 Dart Platform, Flutter Engine, Foundation Library, Design-specific widgets 등 4개가 존재합니다.

(*) 다트(Dart) : 구글이 개발한 웹 프로그래밍 언어이다.

Flutter 로고

 

 

2. 어떻게 패킷을 잡을 것인가???

 

방법은 크게 2가지가 있다.

 

a. 애플리케이션 내 프록시 서버 지정

: 애플리케이션 코드 내 프록시 서버를 지정해 HTTP/HTTPS 통신을 가능하게 해준다.

https://api.dart.dev/stable/2.4.0/dart-io/HttpClient/findProxyFromEnvironment.html

 

b. iptables를 이용한 패킷 리다이렉션

: Flutter 앱의 경우 기본적으로 프록시를 인식하지 않기 때문에 모바일 단말을 iptables,Proxydroid 등의 툴을 활용하여 사용하여 트래픽을 리다이렉션해야합니다.

 

Android의 경우 내장된 iptables를 통해 패킷 리다이렉션을 하거나 ProxyDroid 툴을 활용해 패킷을 볼수 있으며,

IOS의 경우 iptables가 없기 때문에 별도 iptables가 설치된 리눅스 서버를 구축해 연동 시켜주어야합니다.

 

- Android 

: 추후 업데이트 예정

 

- IOS

: IOS의 경우 칼리리눅스 환경에서의 OpenVPN을 설치해 iptables를 활용하여 프록시 툴로 패킷을 리다이렉션 시켜 패킷이 패킷을 볼수 있도록 합니다.

 

1) 칼리 리눅스를 설치 한 후 다음의 명령어를 입력한다.

wget https://git.io/vpn -O openvpn-install.sh
sed -i "$(($(grep -ni "debian is too old" openvpn-install.sh | cut  -d : -f 1)+1))d" ./openvpn-install.sh
chmod +x openvpn-install.sh
sudo ./openvpn-install.sh

 

2) git에서 다운로드 받은 OpenVPN 스크립트를 실행한 뒤 아래와 같이 설정을 해준다.

설정 항목 : [VPN 서버가 돌아가는 IP주소, 프로토콜, 포트, DNS 서버, VPN Client 명]

 

Open VPN 설정
VPN 설치 및 설정 완료

3) 아래 명령을 통해 tun0 인터페이스가 추가 되어있는 것을 확인한 후 설치된 OpenVPN을 실행한다.

# 인터페이스 추가 확인
sudo ifconfig

# OpenVPN(Server) 실행
sudo service openvpn start
sudo ps -ef|grep openvpn

VPN 설치 후 서비스 시작 및 프로세스 확인

4) 단말(iPhone) 내 OpenVPN 설치

AppStore를 통해 OpenVPN을 IOS 단말에 설치 해준다.

 

5) OpenVPN 클라이언트 연결 설정 파일(.ovpn) iPhone 전달

OpenVPN 설치 시 생성된 클라이언트 파일(xxxxxx.ovpn)을 IOS 단말(iPhone)에 넣어 준다.

이때, python을 통한 간단한 웹서버를 구현해 파일을 넣어 주도록 한다.

 

sudo python3 -m http.server 7777 --directory [ovpn이 설치된 경로]

연결하려는 모바일 단말 내 OpenVPN 설치

6) OpenVPN 연결

iPhone Safari에서 <칼리 리눅스 ip>:7777로 이동하여 ovpn 설정 파일 다운로드 및 서버 연결

OpenVPN 앱 내 웹서버에서 다운받은 VPN Client 설정파일(.ovpn) 추가
iPhone 단말과 VPN 서버 정상 연결 성공

7) iptables 설정

: 패킷 리다이렉트를 위한 서버 내 iptables 설정을 해준다.

# 인터페이스 tun0으로 들어오는 80포트를 가진 TCP 프로토콜의 패킷을 프록시 툴(Burp Suite) 내 8080 포트로 리다이렉트 해준다.
  sudo iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 80 -j REDIRECT --to-port 8080
  
# 인터페이스 tun0으로 들어오는 443포트를 가진 TCP 프로토콜의 패킷을 프록시 툴(Burp Suite) 내 8080 포트로 리다이렉트 해준다.  
  sudo iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 443 -j REDIRECT --to-port 8080
  
# 인터페이스 eth0로 192.168.1.0/24 대역의 시작 주소로 나가는 패킷에 대해 인터넷통신이 가능하게 해준다.
  sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

 

8) 프록시 연결 (Burp Suite)

: 모바일 단말과 VPN 서버의 정상 연결 후 패킷 인터셉트를 위해 프록시 설정

칼리 리눅스 내 프록시 툴 실행

프록시 설정 ①

 

프록시 설정 ②

9) iPhone 단말과 VPN 서버 사이에서의 패킷 정상 캡처 확인

[flutter 통신하는 테스트 앱 버프 패킷 캡처 화면 추가]

 

 

참고

: https://blog.funwith.app/posts/proxy-flutter-apps/

: https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9F%AC%ED%84%B0

: https://blog.nviso.eu/2020/06/12/intercepting-flutter-traffic-on-ios/