Check Vulnerability/Mobile

Application 취약점[브로드캐스트]

D4tai1 2019. 4. 8.

1. 어플리케이션 취약점 점검

▶ 먼저 [insecurebankv2]를 다운로드 받고 이 어플리케이션의 취약점 중 하나인 브로드캐스트의 취약점을 점검해보려고 한다.

▶ 안드로이드의 취약점점검은 대부분 화이트박스(소스를 보면서) 테스트이다.

 + 이유는? 이전 장에서 다룬 것과 같이 원본소스로 거의 복원이 가능하기 때문이다.

 

(1) 환경구축

 [1] 취약점을 점검할 수 있는 환경(OS)

  ▶ 필자는 Ubuntu_18.04로 진행했다.

  ▶ 이 환경을 점검PC라고 명명하려고 한다.

  ▶ JD-GUI, Bytecode-Viewer, apk-tools 정도의 점검 툴을 설치했다.

  ▶ 설치하는 방법 :

 

 [2] 점검 당할 환경(Android)

  ▶ 실제로 안드로이드 장비를 연결해서 하면 더욱 좋겠지만...

  ▶ 환경이 되지않아 안드로이드 가상머신을 이용하였습니다.  

 

(2) 점검 툴 실행방법

  ▶ 점검 툴을 실행하는 것부터 불편하다..

 [1] apktool_2.4.0.jar 실행방법

  ▶ 디컴파일 : $ java -jar apktool_2.4.0.jar d [apk명]

  ▶ 빌드 : $ java -jar apktool_2.4.0.jar b [apk명]

   + 이미 알고 있겠지만 매번 apktool_2.4.0.jar가 설치된 경로에 가서 해야 실행된다.

 

 [2] Bytecode-Viewer-2.9.11.jar 실행방법

  ▶ $ java -jar Bytecode-Viewer-2.9.11.jar

 

 [3] 툴을 사용하기 위한 환경구축

  ▶ 매번 프로그램 킬 때마다 귀차니즘이 터지므로..

  ※ 모든 툴을 하나의 디렉터리에 모아두고, 어디서나 실행할 수 있도록 이 디렉터리를 path에 추가한다.

     이후 더 편하기 위해 shellscript를 제작한다. ~시작!!!!

  ▶ [~/바탕화면] 에 [apps]라는 디렉터리를 하나 생성하고 이 경로를 path설정에 추가한다.

 

  ▶ ~/.bashrc에 120라인을 추가한다.

  ▶ 필자는 119라인의 Android의 Sdk도 사용하기 위해 path에 추가했다.

  ▶ 안드로이드 스튜디오 다운로드 : https://developer.android.com/studio#downloads

 

  ▶ 위 사진과 같이 apktool와 bytecode의 스크립트 파일을 만들었다.

  ▶ 사용방법은 적힌 것과 같이 어느경로에서든 스크립트명을 적어 사용할 수 있다.

 

(3) broadcast receiver

▶ 브로드캐스트 리시버는 외부에서 보낸 것과 시스템에서 보낸 것을 구별하지 못한다.

 

(4) adb(Android Debug Bridge)

▶ command로 android device를 조작할 수 있다.

▶ 보통 File transfer, Application install, Device Status, Shell, logcat 등의 기능을 한다.

▶ adb가 Application을 실행하거나, Broadcast receiver를 전송하는 것도 가능하다.

 

(5) 점검PC

 [1] insecurebankv2 다운로드

  ▶ $ git clone https://github.com/dineshshetty/Android-InsecureBankv2.git

 

 [2] 설치 경로

 

  ▶ 설치 경로 내에서 [Android-InsecureBankv2/InsecureBankv2/app] 경로에 이동한다.

  ▶ 어플리케이션을 분석할 디렉터리를 바탕화면에 오늘 날짜[0405]로 생성한다.

  ▶ 분석할 [app-debug.apk] 파일을 [~/바탕화면/0405]에 복사한다.

   + debug와 release는 C언어로 실행파일 만들때와 동일하게 생각하면 된다.

 

 [3] 압축해제

  ▶ 이전 장에서 설명했지만 apk파일은 zip파일과 동일하다.

 

  ▶ 그래서 확장자를 zip으로 변경한다.

 

  ▶ 그리고 압축을 푼다.

 

(6) Bytecode-Viewer 실행

 [1] 프로그램 실행

  ▶ $ bytecode

 

 [2] dex올리기

  ▶ [~/바탕화면/0405] 디렉터리에서 app-debug.zip 압축을 푼 결과로 나온 classes.dex를 바이트코드뷰어의 마우스 위치에 드래그한다.

 

 

(7) 안드로이드에 InsecureBankv2 설치준비

 [1] [~/바탕화면]에 [0405_2]디렉터리를 생성

 [2] [~/바탕화면/Android-InsecureBankv2]에 있는 Insecurebankv2.apk를 [~/바탕화면/0405_2]디렉터리로 복사한다.

 

(8) InsecureBankv2 서버 열기

 [1] [~/바탕화면/AndroLabServer] 경로로 이동한다.

 [2] $ python app.py 를 입력해서 서버를 오픈한다.

 

(9) 안드로이드 연결

 [1] IP주소 확인

  ▶ 안드로이드 장비를 킨 후 IP를 확인한다.

 

 [2] $ adb devices

  ▶ 연결된 장비 확인한다.

 

 [3] $ adb connect [안드로이드 장비 IP주소] : [5555](포트)

  ▶ 연결을 시도한다.

 

 [4] $ adb shell

  ▶ 안드로이드의 터미널을 실행한다.

 

 

 [5] $ adb logcat

  ▶ 안드로이드에서 발생한 로그를 가져온다.

 

 [6] $ adb install ~/바탕화면/0405_2/InsecureBankv2.apk

  ▶ 안드로이드에 InsecureBankv2.apk를 설치한다.

 

(10) 브로드캐스트를 전송준비

 [1] 바이트코드 뷰어에서 브로드캐스트리시버 확인

 

  ▶ com.android.insecurebankv2.MybroadCastReceiver.class를 확인한다.

  ▶ 보면 phonenumber와 newpass를 받는 것이 보인다.

 

  ▶ 그래서 adb shell을 열고 아래 명령어를 넣어준다.(am은 activity managing의 약자)

  ▶ am broadcast a theBroadcast n com.android.insecurebankv2/.MyBroadCastReceiver --es phonenumber 5555 es newpass test

 

 [2] 명령어에 대한 결과

  ▶ 아까 켜 놓은 logcat의 내용을 확인한다.

 

  ▶ 보면 알겠지만 기존정보가 전송한 브로드캐스트내용으로 변경되었다.

  ※ 이로서 브로드캐스트 취약점이 발견되었다.

   + 그렇다면 패치는 어떻게 할까?

 

 

2. 안드로이드 취약점 패치

(1) 디컴파일

 [1] apktool

  ▶ [~/바탕화면/0405_2] 경로로 이동한다.

  ▶ $ apktool d InsecureBankv2.apk  를 입력하면 InsecureBankv2 디렉터리에 디컴파일된다.

 

 [2] AndroidManifest.xml

  ▶ [~/바탕화면/0405_2/InsecureBankv2] 경로에 AndroidManifest.xml 파일을 연다.

  ▶ 설정파일을 확인해보면...

 

  ▶ 29라인을 보면 exported가 true로 되어있다.

  ▶ 외부로부터 들어오는 브로드캐스트를 수신하지 못하도록 false로 변경한다.

  ▶ 원래라면 화이트박스테스트를 하기 때문에 리얼 소스에서 변경하지만 디컴파일된 소스에서 변경 후 리패키징하려고 한다.

 

(2) 리패키징

 [1] $ apktool b InsecureBankv2 와 같이 [~/바탕화면/0405_2] 경로에서 리패키징할 디렉터리를 적어준다.

 

 [2] 리패키징한 InsecureBankv2.apk는 리패키징한 디렉터리 내에 dist에 들어있다.

 

 [3] [~/바탕화면/0405_2/InsecureBankv2/dist] 경로의 InsecureBankv2.apk를 안드로이드에 보내려고 한다.

 

(3) 안드로이드에 삭제 후 재설치

 [1] 삭제

  ▶ $ adb uninstall com.android.insecurebankv2 를 입력하여 제거한다. (경로는 바이트코드 뷰어를 보면 확인할 수 있다.)

 

 [2] 재설치

  ▶ $ adb install InsecureBankv2.apk 를 입력하여 설치한다.

  ▶ 그러나 수집된 증명서가 아닌 결국 파일에 서명이 제대로 되지 않아 설치할 수 없다.

 

(4) 공개키 서명

 [1] sign 설치

  ▶ $ git clone https://github.com/appium/sign.git 명령어를 사용하여 서명 툴을 설치한다.

  ▶ 경로는 [~/바탕화면/apps]에 설치하길 바란다.

 

 [2] 서명

  ▶ [~/바탕화면/apps/sign] 경로에 있는 signapk.jar, testkey.pk8, testkey.x509.pem 파일 3개를 [~/바탕화면/0405_2/InsecureBankv2/dist] 경로에 복사한다.

 

  ▶ $ java jar signapk.jar 공개키.pem 개인.pk8 리패키징.apk 서명후생성할.apk 양식으로 넣어준다.

 

  ▶ inok.apk가 생성된 것을 확인할 수 있다.

 

 

(5) 서명 후 재설치

 [1] 설치

  ▶ $ adb install inok.apk 명령어로 설치한다.

 

 

(6) 패치 후 점검

 [1] 브로드캐스트 전송

 

 [2] $ adb logcat 확인

  ▶ 이전과 같이 변경된 내용은 없다.

  ▶ 이로써 취약점이 패치된 것을 확인할 수 있다.

 

※ 실제로는 원본소스를 가지고 패치를 하기 때문에 이렇게 번거롭게 하지 않아도 된다

 

 

댓글