안녕하세요 전 포스팅에 설치한 Drozer 이용해 실습을 해보겠습니다.
전 포스팅인 drozer을 꼭 설치하시고 오셔야 됩니다!
시작하겠습니다.
-취약한 인증 메커니즘 액티비티 노출 취약점 분석
정상적인 인증 절차를 우회하여 비정상적으로 인증 권한 획득
-적절하지 않은 앱 퍼미션 설정 여부
-서비스 권한 상승 행위에 대한 통제 여부
-기능에 대한 제판 또는 우회 금지 여부
-불필요하거나 사용하지 않는 액티비티 제거 여부
-인텐트 사용에 대한 안정성 여부
-마스터 키 취약점 대응 여부
저희가 앱의 manifest파일을 보시면 activity 관련 태그 안에 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

만약 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 인 것이 있었습니다.

일단 기본적으로 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 들어가려고 하면 로그인 안 해서 기록이 없어서 안 될 겁니다.

그럼 이때 Change Password 들어가 보겠습니다.
Change Password에도 exported가 true로 되어 있어서 들어 가질 겁니다.

로그인을 안 해서 원래 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 통해 어느 로그가 가는지까지 확인해보겠습니다.



logcat 통해 확인했는데 패스워드가 잘 바뀐 것을 확인했습니다.
그럼 한 번 로그 아웃을 하고 jack와 제가 비정상적으로 접근해 바꾼 비밀번호로 로그인해보겠습니다.


이번엔 버프 스위트 이용해 보겠습니다.
이번엔 changepassword 액티비티만 열어보겠습니다.
run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.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(권한) 이용해 접근을 제어합니다.
'모바일 해킹 > 안드로이드' 카테고리의 다른 글
취약한 콘텐츠 프로바이더 접근 (0) | 2023.09.22 |
---|---|
Drozer (설치) (0) | 2023.09.22 |
파라미터 조작 - 버프스위트 (0) | 2023.09.20 |
암호화 통신 여부 확인 - 버프 스위트, 와이어샤크 (0) | 2023.09.18 |
취약한 로깅 메커니즘 - 로그캣(logcat) (0) | 2023.09.18 |