안드로이드 누가(Nougat, Android 7.0) 이후 부터는 사용자가 사설 인증서를 등록하면 루트 인증서로 설치가 되지 않고 사용자 인증서로 설치가 되서 신뢰할 수 있는 인증서로 인식을 하지 않아 SSL Connection 오류가 난다. 

안드로이드 OS 자체적으로 SSL-Pinning을 하고 있다고 생각하면 된다.

 

IOS도 동일한 현상이 일어나서 확인할 결과 IOS는 자체적으로 사설 인증서를 루트 인증서로 신뢰할 수 있도록 만드는 기능을 만들어 놓았었다(간편함...** IOS 10 이상에서 SSL 인증서 등록이 필요한 경우는 아래 포스팅 참고)

https://securitynote.tistory.com/44?category=788948

 

[iOS] ios 버전 10+ Burp SSL 인증서 등록

SSL 통신 프록시 연결 오류 최근 IOS 10 이상 버전에서 BURP 인증서 등록 후, SSL 통신을 잡는데 에러가 일어나서 무슨 새로운 솔루션이 생겨난줄 알았다... 그런데 그런게 아니었나 보다...!! 일단 지금 상태는..

securitynote.tistory.com

하지만 안드로이드는 그런 기능을 지원하지 않으므로 Frida를 이용해 SSL-Pinning을 우회해야 한다.

 

0. 환경

  - Python 3.8 

  - 루팅된 Android 10 (Android 7 이상 모두 사용가능)

1. 환경 세팅(frida 세팅)

 

1) PC 파이썬 설치 후 pip install을 통해 frida와 frida-tools를 설치한다.

pip install frida
pip install frida-tools

2) MOBILE adb 연결 후 모바일 기기의 Bit 및 Type 확인

첫번째 명령어만으로도 확인 가능

Bit > adb shell getprop ro.product.cpu.abi
Type > adb shell getprop ro.product.cpu.abi2

 

3) frida-server 다운로드

아래 링크 접속 후 기기 버전에 맞는 frida-server 다운로드 

https://github.com/frida/frida/releases

 

frida/frida

Clone this repo to build Frida. Contribute to frida/frida development by creating an account on GitHub.

github.com

단, 녹스를 사용할 경우, arm이 아닌 32bit로 다운받아야한다!!

 

4) 기에 frida-server 이동

 - PC 다운받은 압축 파일을 푼다.

 - PC 압축 해제한 파일 내 위치한 바이너리 파일명을 "frida-server"로 변경한다. 

    -> 굳이 안바꿔도 되지만 실행하기 훨씬편함

 - MOBILE adb 명령어를 통해 "frida-server" 파일을 모바일 기기의 /data/local/tmp 파일로 옮긴다.

adb push frida-server /data/local/tmp

 - MOBILE /data/local/tmp로 옮겨진 "frida-server" 파일에 실행권한을 준다.

# chmod 777 /data/local/tmp/frida-server

 - MOBILE frida-server 실행

# ./frida-server &

 

2. Android용 SSL-Pinning 우회 코드 저장

이제 frida 환경 세팅은 끝났다. 아래 링크로 접속하여 Android용 SSL-Pinning 코드를 다운받고 원하는 경로에 .js 확장자로 저장한다. 나는 frida-ssl-and.js로 저장했다.

https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/

 

Frida CodeShare

 

codeshare.frida.re

3.PC 후킹하고 싶은 앱의 PID 혹은 패키지명 확인

frida-ps -U

4.PC 후킹

frida -U -l frida-ssl-and.js --no-pause -f [패키지명]  //패키지명을 통한 후킹

5. 끝!

이제 SSL 패킷도 잘~ 잡힐 것이다~!!

 


첨부된 사진이 없어 진행에 어려움이 있으신 분들은 댓글 남겨주세요ㅠㅠ 

APKTOOL을 이용해 디컴파일이나 재컴파일 시 프레임워크 관련 에러가 뜨는 경우가 있다.

id:2를 가진 패키지의 프레임워크 리소스를 찾을 수 없단다... 뭘까???

더보기

Can't find framework resources for package of id:2. You must install proper framework files, see project website for more info.

 ID 넘버는 애플리케이션의 pkgid와 상응하며 1~30까지 사용 가능함. 어떤 제조사의 기기를 사용하느냐에 따라 id 값이 상이함.


1. Framework파일이란?

Android 앱은 Android OS에서 제공하는 코드와 리소스를 활용하는데 이를 Framework (resources)라고 한다. 

Apktool을 이용해서 Android 앱을 디컴파일하거나 재컴파일할때 이런 framework 파일을 사용하는데 일반적인 앱의 경우 AOSP(Android Open Source Project) 프레임워크를 사용하며 다음 경로에 1.apk로 저장된다.

1.apk는 따로 다운받을 필요없으며, apktool 사용 시 자동으로 다운로드 된다. 

[사용자 경로]\AppData\Local\apktool\framework\1.apk

* 단, 오래된 apktool을 사용하거나 apktool을 사용한지 오래된 경우 다음 명령어를 사용하거나 해당 위치에 접근하여 직접 파일을 지워주고 실행하면 된다.

apktool empty-framework-dir

 

하지만 삼성, LG 등의 폰에 처음부터 빌트인되어 있는 앱(메모, 카메라, 인터넷 등)들을 디컴파일하거나 재컴파일할 때 처음에 언급한것과 같은 에러가 뜬다. 2.apk는 어디서 구하는 것일까??

 

2. Framework 파일 가져오기

대부분 기기의 /system/framework 폴더에 프레임워크 파일이 위치하며, 보통 resources.apk, res.apk, framework.apk 등의 이름으로 저장되어 있다. 

해당 위치에 원하는 파일이 없는 경우, /data/system-framework, /system/app, /system/priv-app 등의 경로에 숨어있는 경우도 있으니 확인하면 된다.

 

내가 테스트한 LG 핸드폰의 경우 /system/framework/lge-res/lge-res.apk이름으로 저장되어 있었다. 

adb pull 명령어를 사용해 해당 apk를 로컬 컴퓨터로 가져와 다음 경로에 위치시키면 된다. 

adb pull /system/framework/lge-res/lge-res.apk [사용자 경로]\AppData\Local\apktool\framework\2.apk

//apk 파일명의 경우 에러에서 표기된 id와 동일하게 저장하면 된다. 

 

3. APKTOOL 사용

올바른 위치에 2.apk가 저장된 것을 확인한 후 다시 apktool을 사용하면 문제없이 디컴파일하거나 재컴파일 할 수 있을것이다!!

 

https://ibotpeaches.github.io/Apktool/documentation/

 

Apktool - Documentation

Introduction Basic First lets take a lesson into apk files. Apks are nothing more than a zip file containing resources and assembled java code. If you were to simply unzip an apk like so, you would be left with files such as classes.dex and resources.arsc.

ibotpeaches.github.io

 

#1. 드로저(drozer) 설치

https://labs.f-secure.com/tools/drozer/

  • drozer (Agent .apk only) - 안드로이드폰에 설치
  • drozer (msi) - 윈도우 설치 파일
  • Python2 버전 사용 

#2. 드로저 실행

1) 모바일: drozer agent 앱 실행 후 우측 하단의 [ON] 버튼 클릭

    -> 디폴트로 31415 포트를 사용

2) PC: ADB로 단말기와 PC의 포트를 동일하게 설정

 ※ 다음 명령어 실행 전 adb와 모바일이 정상적으로 연결되는지 확인한다. 

adb forward tcp:31415 tcp:31415

정상적으로 포트포워딩이 되었는지 확인하면 31415 포트가 LISTENING 상태인 것을 확인할 수 있다.

netstat -an | findstr 31415 

 

3) PC: 드로저가 설치된 폴더로 이동 후 드로저 실행

drozer.bat console connect

위 명령어 실행 시 다음과 같은 에러가 나는 경우 pip install 명령어를 통해 필요한 모듈을 설치한다.

더보기

C:\Users\Administrator>drozer.bat console connect
Traceback (most recent call last):
  File "C:\Python27\Scripts\drozer", line 30, in 
    __import__("drozer.cli.%s" % (sys.argv[1]))
  File "C:\Python27\lib\site-packages\drozer\cli\console.py", line 8, in 
    from drozer.console import Console
  File "C:\Python27\lib\site-packages\drozer\console\__init__.py", line 4, in 
    from drozer.console.console import Console
  File "C:\Python27\lib\site-packages\drozer\console\console.py", line 5, in 
    from pydiesel.api.protobuf_pb2 import Message
  File "C:\Python27\lib\site-packages\pydiesel\api\__init__.py", line 9, in 
    from pydiesel.api.frame import Frame
  File "C:\Python27\lib\site-packages\pydiesel\api\frame.py", line 3, in 
    from pydiesel.api.protobuf_pb2 import Message
  File "C:\Python27\lib\site-packages\pydiesel\api\protobuf_pb2.py", line 3, in 
    from google.protobuf import descriptor
ImportError: No module named google.protobuf

pip install protobuf
pip install pyopenssl  // ERROR: drozer 2.4.4 requires pyopenssl>=16.2, which is not installed.
pip install pyyaml  // ERROR: drozer 2.4.4 requires pyyaml>=3.11, which is not installed.

pip install twisted
// drozer Server requires Twisted to run. Run 'pip install twisted' to fetch this dependency.

#3. 드로저를 이용한 취약점 분석

1) 앱 취약점 분석

run app.package.attacksurface -h // 옵션 설명
run app.package.attacksurface [패키지명] //패키지 취약점 확인

-> exported 설정된 것이 있는지, 디버깅 설정이 되어 있는지 등을 보여줌

 

2) 액티비티 분석

run app.activity.info -a [패키지명]

-> exported 설정된 액티비티의 권한 확인

 

run app.activity.start --component [패키지명] [액티비티명]

-> ADB로 am start -n [패키지명/액티비티명] 하는 것과 동일

-> 액티비티 무단 접근

 

3) 브로드캐스트 리시버 분석

 

run app.broadcast.info -a [패키지명]

run app.broadcast.info -f [검색하고자 하는 단어] //검색하고자 하는 단어가 포함된 패키지의 브로드캐스트 리비저 정보 검색

run app.broadcast.info -u [-a/-f] [패키지명/검색하고자하는 단어]  //숨겨진 리시버 정보 확인

 

 


안드로이드 APK 취약점 점검 환경 구성

안드로이드 APK 취약점 점검을 하려면 일단 내 호스트 PC에 환경 설정을 해야한다. 

  1. 안드로이드폰을 루팅
            일단, 대부분의 취약점 점검이 루팅된 환경에서 진행되므로 안드로이드폰을 루팅해야한다. 

            - 루팅 방법에 대해서는 가지고 있는 핸드폰의 안드로이드 버전 및 비트(32/64bit)를 확인 후에 진행하도록 한다. 
            - 검색하면 루팅툴들이 많이 존재하므로 각 핸드폰에 맞는 툴을 이용하는 것을 추천
            - 나는 KingRoot라는 앱을 이용해서 루팅을 진행했는데 여전히 많이 사용하고 있는 툴인것 같다. 
        • 루팅 확인 :  플레이 스토어에 검색하면 여러 툴이 나오므로 다운로드 후 사용 

  1. 단말기 제조사 드라이브 설치
            단말기를 컴퓨터에 제대로 연결하기 위해 각 제조사의 통합 드라이버를 설치한다.
            ex) LG USB 통합 드라이버, SAMSUNG 통합 드라이버 등...

  3. Android SDK 설치
            이클립스, 안드로이드 스튜디오 등 여러 SDK 툴이 존재하지만 안드로이드 스튜디오 설치시 추후에 필요한 
            개별 실행파일, adb 등이 같이 설치되므로 안드로이드 스튜디오를 추천
            
            - 자세한 설치 과정은 설명하지 않는다.

  1. adb 환경변수 설정
            단말기를 PC에 연결하기 위해서 SDK의 adb라는 프로그램이 사용된다.

            1) 안드로이드 SDK 설치  경로에 platform-tools폴더 내 adb.exe파일이 있는 것을 확인 후 해당 경로 복사
                ex) C:\Users\Users\AppData\Local\Android\Sdk\platform-tools
            2) 위의 경로를 환경변수의 Path에 저장
            3) cmd 창 열고 "adb" 명령어 실행 시 정상 실행 확인

  5.  단말기 개발자 옵션 및 디버깅모드 켜기
            해당 설정을 하지 않으면 adb shell로 PC에 연결이 불가능하다.

            - 환경설정 > 개발자 옵션 켜기 > USB 디버깅 체크
                ** 개발자 옵션이 없는 경우, 디바이스 정보 > 소프트웨어 정보 > 빌드 번호를 7번 터치하면 생성됨

            



            
       6. 단말기와 PC 연결 및 확인
           이제 USB 케이블을 이용하여 단말기와 PC를 연결한다.
           
            - USB 케이블이 정상적으로 연결되면 "USB 디버깅을 허용할까요?" 라는 경고창이 뜨는데 [확인]을 클릭한다.
            - 이제 cmd창을 켜서 adb 명령어를 실행한다.
            


            ** adb devices :  연결된 device 목록 확인
            ** adb shell : 연결된 디바이스의 리모트 쉘 실행
            ** adb 명령어에 대해서는 추후 포스팅할 예정임.



+ Recent posts