본문 바로가기

security/reverse engineering

[악성 앱 분석] InsecureBankv2 분석 과정

분석 대상 : InsecureBankv2

분석 툴 : Drozer, Frida, adb

 

-취약점 찾기

-앱 설명에 있는 리스트 하나씩 항목화해서

-각각에 대해 코드 및 설명을 잘 쓰면 됨

-간단한 것들도 많음

-모르는 것들은 남겨두고, 할 수 있는 것 위주로 한다

 

0. 분석 대상 앱에 대한 간단한 정보

back-end server component is written in python

 

1. 앱의 기본 동작

동작 방법

앱 설치 → AndroLab 서버 구동 → 방화벽 해제, netcat 열기, 에뮬레이터에 adb → 기본으로 주어진 계정(dinish/Dinesh@123$이나 jack/Jack@123$)을 이용해서 로그인 → 앱 사용

 

AndroLab 서버 구동

AndroLab 폴더에 진입하여 app.py 파일을 실행해준다. (cmd창 관리자 모드로 실행함.)

우리의 친구인 오류 발생^^ 계속 app.py 실행할 때마다 없다고 하는 모듈들을 전부 설치해주니 최종적으로 서버 구동 성공.

 

방화벽 해제, netcat 열기, 에뮬레이터에 adb

Netcat열기는 이거(안경잡이개발자 :: 네트워크 통신을 위한 넷캣(Netcat) 설치 및 사용법 (tistory.com))대로 설치만 해줬는데, 갑자기 됐다.. 

 

네트워크 설정을 해줘야 한다. ipconfig해서 내 ip주소로 Server IP를 수정해준다.

이렇게 한 번 해주니까 이후에는 따로 설정 안해줘도 되더라.(근데 다시 이 설정을 확인해보면 기본인 10.0.2.2로 되어있고, 심지어 되다 안되다가 하긴 하지만.. 뭐 일단은..^^)

 

그럼 주어진 계정으로 로그인 성공

 

 

언제나 감격스러운 셋팅 완료

 

지저분한 로그들이지만 감격스러워서^^

2. 

기능은 보면 Transfer, View Statement, Change Password이다. 각각 예금 전송, 전송 내역 확인, 패스워드 수정 기능을 갖고 있다. 

ViewStatement에는 Transfer에서 실패한 내역도 기록되어있다.

 

매우 간단한 앱인 듯 하다. 이제 분석을 시작해보자!!

 

분석은 다음의 과정대로 하자.

Drozer 분석 → (java코드 분석+)Frida 분석 → adb

 

1. Drozer 분석

전에 깔아준 drozer~

에뮬레이터(이번에 사용하는건 Nox)에 drozer-agent-2.3.4.apk를 설치해준다.

 

drozer Agent앱을 실행해보면, 원래 서버가 꺼져있는데, 이걸 켜준다. 

 

이제 연결

NOX환경(기본환경이 127.0.01:62001)에 연결 -> (drozer Agent를 디바이스에서 실행한 후 Enbedded Server를 On으로 설정해준 상태) 포트 포워딩 -> drozer console connect 명령어로 드로저 실행

 

우선 안드로이드 기기 내에서 분석할 앱(InsecureBankv2)을 찾아준다. 안드로이드 기기에 설치된 앱들은 그들의 패키지 이름으로 구분되므로 이를 이용하여 drozer에게 여러 분석을 요청할 수 있다. app.package.list명령어를 사용하여 con.android.insecurebankv2임을 알아내었다.

저번에 분석했던 seive와 다르다. 

 

con.android.insecurebankv2패키지 정보를 확인해보았다.

앱의 버전 : 1.0

앱이 기기 내에 데이터를 저장하는 위치 : /data/user/0/com.android.insecurebankv2

설치된 위치 : /data/app/com.android.insecurebankv2-1/base.apk

권한 설정 : 무엇을 의미하는 것인지 잘 모르겠다

*막간 지식 - 안드로이드에서 권한 부여는 AndroidManifest.xml에 기술한다. 그래서 방금의 drozer 명령어로 Manifest파일을 읽기 때문에 권한 정보를 알 수 있는 것이다.

 

insecurebankv2의 공격면을 drozer에게 요청했다. 공격벡터로 작용 가능한 구간이 Activity, broadcast receiver, content provider 이므로, 이것들을 각각 분석한다.

공격 벡터 가능한 것들: 5개의 액티비티(화면),1개의 broadcast receiver, 1개의 content provider(database objects), 1개의 서비스(backgroud worker)

is debuggable 출력: 제시된 벡터들은 디버깅이 가능하므로, 디버거가 해당 프로세스에 접근해서 adb를 통해 code를 진행해볼 수 있다. (*앱의 코드에 임의로 코드를 주입 및 변조해서 공격 가능)

 

[1] Activity 분석

접근 가능한 Activity들을 확인해보았다.

앱 파악을 위해 실행해 봤을 때 접근 가능했던 대부분의 액티비티가 기본으로 접근 가능한 것으로 설정되어있었다.

문제는 LoginActivity를 제외한 액티비티들은 로그인 성공 후 접근 가능한  액티비티들이라는 점이다. 

접근 가능한 Activity 목록
LoginActivity 처음에 열리는 화면으로 당연히 항상 포함된다.
PostLogin 로그인 성공 후의 화면
DoTransfer insecurebankv2 앱에서 로그인 성공한 뒤 선택할 수 있는 기능들
ViewStatement
ChangePassword

 

이 명령어는 적절한 Intent를 백그라운드에서 만들어서 startActivity를 통해 시스템에 전달하기 때문에 실행되는 것이다.

원래 인증과정 이후에 접근가능한 액티비티에, 인증을 우회하여 접근가능하다.  

물론 Username은 수정 불가능하게 설정되어있어서 Username정보만으로 패스워드 변경은 불가능하다. 

다른 액티비티들에 대해서도 가능하다.

[2] broadcast receiver 정보 확인

insecurebankv2앱의 broadcast receiver명이 MyBroadCastReceiver라는 것을 알 수 있다. 

 

[3] content provider 정보 확인

한개의 content provider 공격 면을 확인 가능. 

*content provider: 응용 프로그램들 사이에서 데이터를 공유하는 유일한 방법. 데이터 베이스에 있는 정보를  URI로 공유하므로, 데이터베이스에 접근하기 위해 URI정보가 반드시 필요하다.

 

content provider가 사용하는 URI 정보를 검색해보았다.(아래의 명령어와의 차이는? 이건 전체고, 아래꺼는 그 중에서도 상세하게 쿼리가  가능한 여부를 구분해준다.)

접근 가능한 uri들. Data Leackage발생. 2개니까 다 해보자.

사용자 name을 확인가능한 것 같다.

'로 쿼리를 날려보니, 위에서 출력된 것들이 name이라는 것을 정확히 알 수 있었다. 

해당 테이블에 있는 내용을 모두 출력해보았으나, id와 name이라는 columns만 존재하는 테이블이었다.

 

위에서 확인한 URI로 접근 가능한 주소 목록을 출력해보았다. 

 

SQL injection과  directory traversal에 취약한 여부를 확인해보았다.

위에서 확인 했던 접근가능한 URI에 SQL injection이 가능하다고 출력해준다. 

 

디버깅 가능

 

 

2. Frida를 이용한 후킹