Application 취약점[브로드캐스트]
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 확인