본문 바로가기

모바일 해킹/안드로이드

취약한 인증 메커니즘 액티비티 노출 취약점 분석 - Drozer 이용

안녕하세요 전 포스팅에 설치한 Drozer 이용해 실습을 해보겠습니다.

 

전 포스팅인 drozer을 꼭 설치하시고 오셔야 됩니다!

 

시작하겠습니다.

 

 

-취약한 인증 메커니즘 액티비티 노출 취약점 분석

 

정상적인 인증 절차를 우회하여 비정상적으로 인증 권한 획득

 

-적절하지 않은 앱 퍼미션 설정 여부

-서비스 권한 상승 행위에 대한 통제 여부

-기능에 대한 제판 또는 우회 금지 여부

-불필요하거나 사용하지 않는 액티비티 제거 여부

-인텐트 사용에 대한 안정성 여부

-마스터 키 취약점 대응 여부

 

저희가 앱의 manifest파일을 보시면 activity 관련 태그 안에 exported 속성이 있습니다.

 

exported

위 그림은 insecurebankv2.apk를 jadx 통해 열고 manifest파일 본 겁니다.

 

exported 함수는 외부에 노출이 되게 하는지 안되게 하는지 정해줍니다.

만약 true면 외부에서 그냥 들어갈 수 있고 false면 못 들어갑니다.

 

이렇게 exported가 true인 액티비티를 이용해 인증을 해야지 들어가는 액티비티를 그냥 들어갈 수 있는 게

액티비티 노출 취약점이라고 합니다.

.

.

.

.

저렇게 jadx든 다른 프로그램 이용해 뜯어보셔서 exported을 찾아볼 수 있긴 하지만 저는 drozer을 이용해 보겠습니다.

 

일단 실습해야 되니 녹스 키시고

insecure 서버 키시고

다른 터미널에 adb 연결해 주시고

녹스에 깔으신 drozer agent 서버 키시고

또 다른 터미널에 drozer을 연결합니다. (drozer sonsole connect)

 

초기단계가 더 힘드네요

 

 

전 포스팅에서 list 통해 많은 명령어 확인 가능하다고 했죠?

그리고 package.list 통해 패키지 찾을 수 있고

package.info 통해 패키지의 정보를 볼 수 있었습니다.

 

 

-a 옵션 통해 정확한 패키지의 이름을 설정해서 정보까지 볼 수 있습니다.

run app.package.info -a com.android.insecurebankv2

drozer 명령어 실행할 때 run으로 시작합니다.

 

 

 

만약 manifest의 파일을 보고 싶으시다면 

 

run app.package.manifest [패키지 명] 하시면 됩니다.

 

이렇게 보실 수 있어요

 

 

더 나아가서 여기에 있는 액티비티에 exported이  true 인 걸 찾아주는 명령어가 있습니다.

 

run app.package.attacksurface [패키지 명]

 

보시면

 

액티비티에 exported가 true이여서 악의적으로 이용 가능한 게 5개

broadcast에도 1개 conten에도 1개 있다고 하네요!

 

그래서 이걸 먼저 실행해서 exported의 취약점이 있는지 확인을 한다고 합니다.

.

.

.

.

.

.

.

그럼 이제 package 정보를 볼 수 있었으니 이번에는 activity를 찾아보겠습니다.

 

app.activity가 기본이고요. 만약 특정 액티비티 명 혹은 패키지에 있는 액티비티의 정보를 보고 싶으시면

run app.activity.info --filter [액티비티 명 또는 패키지 명] 이렇게 하시면 됩니다.

 

한 번 insecure의 액티비티 정보 봐보겠습니다.

run app.activity.info --filter insecure

이렇게 볼 수 있습니다.

 

 

이번엔 login 관련 activity의 정보를 봐보겠습니다.

run app.activity.info --filter login

나오긴 하는데..

 

모든 패키지에 있는 login 액티비티를 검색하게 될 겁니다.

 

물론 --filter [찾을 명] 대신 -a [정확한 패키지 명] 입력하셔서 찾을 수 있습니다.

 

 

 

그럼 저희가 방금 manifest 파일 통해 확인한 것 중에 exported가 true 인 것이 있었습니다.

 

post login의 노출이 true로 되어있습니다.

 

일단 기본적으로 insecurebankv2 앱은 로그인을 한 뒤에 post_login 화면이 보여야 됩니다.

근데 저렇게 exported가 true로 되어있으면 바로 저 액티비티를 실행할 수 있습니다.

 

한 번 해보겠습니다.

 

drozer에서 저희가 앱에 있는 특정 액티비티를 실행할 때 쓰는 명령어가 있습니다.

 

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

 

이렇게 쓰시면 됩니다. 저희가 방금 전에 액티비티 명을 찾았었잖아요?

post login의 액티비티 명이 com.android.insecurebankv2.PostLogin 인걸 찾았으니 이용하겠습니다.

 

 

run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin

 

실행하면?

 

이렇게!

 

로그인 인증을 안 했는데도 불구하고 들어 가졌습니다.

 

exported가 true 되어 있으면 이렇게 접속이 가능합니다.

그럼 Transfer 들어가서 get account 하셔도 로그인 정보가 없으니 계정 정보가 안 나오고 View Statement 들어가려고 하면 로그인 안 해서 기록이 없어서 안 될 겁니다.

 

View Statement 클릭했을 때

 

그럼 이때 Change Password 들어가 보겠습니다.

Change Password에도 exported가 true로 되어 있어서 들어 가질 겁니다.

 

username에 아무 것도 없죠

 

로그인을 안 해서 원래 username에 로그인한 id가 들어가 있어야 되는데 안 들어 가진 것을 알 수 있습니다.

 

 

 

--그럼 change password 기능 이용 못 하잖아요!

 

가능합니다! drozer을 이용해 가능하고요 버프스위트를 이용해도 가능합니다.

우선 drozer을 이용해 보겠습니다.

 

drozer에 --extra라는 기능이 있습니다. extra는 소스 코드에 쓰이는 변수 있잖아요? 예를 들어 string name 이라던가

string number 이런 거

 

거기에다가 값을 넣어 주는 기능입니다.

쓰는 방법은 저희가 방금 전에 이용한 것처럼 작성하고 끝에 --extra 붙이고 실행하면 됩니다.

 

run app.activity.start --component [패키지 명] [액티비티 명] --extra [변수와 변수 명] [넣을 값]

 

그럼 저희는 변수와 변수 명을 알아야 되겠죠?

 

찾았습니다

 

string uname이네요. 그럼 ChangePassword 액티비티 열 때 extra 이용해 uname에 jack을 넣고 열어보겠습니다.

 

 

run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword --extra string uname jack

 

 

이렇게

 

새로 액티비티가 열어지면서 jack이 들어가졌죠? 이 상태에서 패스워드를 제 마음대로 넣고 실행해 보겠습니다.

실행하기 전에 저는 또 다른 터미널 열고 logcat 통해 어느 로그가 가는지까지 확인해보겠습니다.

 

 

실행!

 

 

성공했다고 나오고
log 정보

 

logcat 통해 확인했는데 패스워드가 잘 바뀐 것을 확인했습니다.

그럼 한 번 로그 아웃을 하고 jack와 제가 비정상적으로 접근해 바꾼 비밀번호로 로그인해보겠습니다.

 

되면 큰 취약점이죠

 

정상적으로 인증이 되었습니다.

 

 

 

 

이번엔 버프 스위트 이용해 보겠습니다.

 

이번엔 changepassword 액티비티만 열어보겠습니다.

 

run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword

 

 

그리고 ChangePassword

 

패스워드에 형식 맞게 작성하고 Change Password을 누르겠습니다.

 

아무런 반응이 없는데.. 버프 스위트 통해 확인을 해보니

 

요청은 가진 게 보입니다.

 

그럼 보낼 때 username에 jack이라 바꾸면 jack의 비밀번호가 변경되겠죠?

 

intercept on 키거나 이 요청을 ctrl + r 눌러서 Repeater에 보내겠습니다.

 

repeater은 그냥 요청을 가지고 있는 상태로 수정을 하고 보낼 수 있게 해주는 편한 기능입니다.

 

intercept on 키셨다면 app에서 change password 누르면 요청이 붙잡혀 있을 거고요

ctrl + r 눌렀으면 Repeater 메뉴에 요청이 가 있을 겁니다.

 

이렇게요

 

그럼 username에 jack이라고 입력하고 send 눌러서 요청을 보내보겠습니다.

 

됬네요!

 

저건 실제로 요청을 보내는 거라 응답에서 Change Password Successful 나왔으니 분명 비밀번호가 바뀌었을 겁니다.

 

한 번 앱으로 돌아가 로그인해보겠습니다.

 

로그인!

 

손 쉽게 성공

 

 

저는 개인적으로 버프스위트가 더 편한 거 같네요! 만약 저렇게 중간에서 정보를 수정할 일이 있으면

버프 스위트를 종종 이용하겠습니다. 액티비티를 열 땐 drozer을 이용하구요.

.

.

.

.

.

이렇게 이번 포스팅은 액티비티 노출 취약점을 이용해서 인증을 우회하고 타 아이디의 비밀번호 변경해 보았습니다.

그리고 그 타아이디로 로그인까지 됐죠.

 

-대응방법

 

일단 exported의 true를 주는 걸 매우 매우 신중하게 생각해야 합니다.

물론 공지사항 같은 중요한 정보가 안 담긴 액티비티에는 상관없습니다.

 

근데 저렇게 패스워드 변경처럼 중요한 데이터 다루는 곳에 exported:true 주면 큰일 나게 됩니다.

 

그러므로 exported:false 유지한다. 만약 주고 싶다면 별도의 permission(권한) 이용해 접근을 제어합니다.