이번 포스팅에선 Insecure Bank 앱을 통해 브로드캐스트 리시버 결함 취약점을 살펴보는 실습을 담아낼 것 입니다! 우선 브로드 캐스트 리시버란 무엇일까요? BroadCast 라는 이름에 걸맞게 앱과 앱간에 알림역할을 합니다. 서로가 지금 어떤 상황이 일어나고 있는지 알림을 통해 공유하는 것이죠!
예를들어 최근에 배달의 민족에서 신한은행 적금을 들면 5000포인트를 준다는 이벤트를 하고있습니다. 배달의 민족어플에서 이 이벤트를 클릭하면 저희 핸드폰에 설치된 신한은행 어플이 켜지게 됩니다. 배민어플이 신한어플에게 "야 너 켜져야해" 라면서 알림을 주게 되고 신한어플은 이 알림에 맞춰서 동작을 시작하게 되는것이죠! 이런식으로 다른 앱들간에 상호작용을 가능하게 만드는것이 브로드캐스트 리시버 입니다!
1. 취약점 개요
브로드 캐스트는 안드로이드 시스템의 중요한 요소 중 하나로 이벤트 발생시 브로드 캐스트 신호를 안드로이드에서 받은후 대상 어플들에게 전달을 합니다. 이 신호를 받기 위하여 앱들은 각각 브로드 캐스트 리시버라는 것이 설정되어야 하는데 , 주로 AndroidManifest.xml 파일의 <receiver></receiver> 태그로 설정되어 있습니다.
브로드 캐스트 리시버의 설정중 export 설정을 ture 로 설정하게 되면 외부 어플리케이션으로 부터 intent 를 받을수 있게 되는데 , 이 점을 통해 외부에서 악의적인 intent 를 보내 정보를 유출하거나 민감한 동작을 시도하는것이 가능해집니다.
2. Insecure Bank 앱 실습
1. 우선 Jadx로 Insecure Bank APK 를 열어봅니다.
2. AndroidManfest.xml 파일을 확인해보시면 <receiver> 태그가 사용된 곳은 두곳으로 확인이 됩니다. 위에있는것은 exported="true" 설정이 되어있고 아래에 있는것은 "false" 로 설정이 되어있네요. 그러면 위에 있는 MyBroadCastReceiver란 이름의 컴포넌트를 리시버를 통하여 외부에서 해당 <receiver> 태그안에 있는 intent action인 theBroadcast 라는 동작으로 활성화 시킬수 있을것같습니다.
이렇게 판단한 근거는 <receiver>태그안에 theBroadcast란 action을 하기위한 아무런 권한설정이 안되어있는것을 확인했기에 권한이 필요없는 action이구나 라고 생각을 하여 시도해봐야겠다고 생각이 들었습니다.
3. 일단 저희가 실행하려는 MyBroadCast 컴포넌트가 무슨동작을 하는지 살펴볼 필요가 있습니다. 보시면 intent를 통해 "phoneumber","newpass" 라는 이름의 변수를 받아주면 phonenumber에 해당하는 password 를 바꿔주는 action 인것같습니다. 변수값이 잘 전달되었을시 "For the changepassword - phonenumber......." 라는 내용이 콘솔창에 출력이 되고 , 변수값이 전달이 안되었을시 "Phone number is null" 이라는 내용이 콘솔창에 출력이 되는것 같습니다.
4. 그러면 이 내용을 토대로 adb를 활용하여 해당 컴포넌트에 대한 액션을 진행해보도록 하겠습니다. 다음과 같은 명령어를 cmd 창에서 작성합니다. 명령어 내용은 "broadcast 알림을 전달할건데 theBroadcast 라는 액션을 MyBroadCastReceiver 라는 컴포넌트를 타겟으로 실행해라" 입니다.
사실 theBroadcast라는 액션을 취하면 자동으로 MyBroadCastReceiver 컴포넌트가 동작하긴 해서 -n com.android.insecurebankv2/.MyBroadCastReceiver를 쓸 필요는 없는데 종종 써야하는 경우도 있기때문에 저는 그냥 습관적으로 라도 적어주는편입니다..
> nox_adb shell am broadcast -a theBroadcast -n com.android.insecurebankv2/.MyBroadCastReceiver
5. 이후 nox_adb logcat 명령어를 사용하여 log 를 살펴보면 Pthone number is null 이라는 메세지가 뜬것을 확인하실 수 있습니다. 이는 저희가 방금 BroadCast로 Intent는 전달했지만 , 안에 파라미터값을 아무것도 넣지않아서 이런 메세지가 뜬것입니다. 그러니 이번엔 Intent 에 위에서 언급한 두가지 파라미터를 삽입해준 후 다시 시도해보겠습니다.
6. 아래와 같은 명령어를 통해 이번엔 Intent 변수값으로 "phonenumber":5555 , "newpass":test 라는 두개의 값을 포함시켜서 action을 진행해보겠습니다.
> nox_adb shell am broadcast -a theBroadcast -n com.android.insecurebankv2/.MyBroadCastReceiver --es phonenumber 5555 --es newpass test
7. 다시 logcat 을 보시면 방금 실행한 액션이 동작하여 password 를 변경했다는 메시지와 변경한 패스워드 , 그리고 이전의 패스워드 까지 평문으로 확인하실 수 있습니다. 만약 공격자가 이 취약점을 이용하여 악의적으로 패스워드를 변경후 이전 패스워드까지 얻어낸다면 다른 사이트에 얻은정보를 시도해봄으로써 브루트포스 공격을 가할수도 있기에 매우 위험한 상황을 초래할 수 있습니다.
3. 대응방안
1. exported="false" 설정
> Intent Fitler를 사용시 기본적으로 exported="true" 설정이 되기때문에 의도적으로 false로 바꿔줄 필요가 있습니다. 그러면 apktool 도구를 사용하여 디컴파일 이후 설정을 false 로 바꿔준 후 리패키징 하여 다시 시도해보겠습니다. 우선 디컴파일 및 리패키징은 아래 링크 내용을 따라하시면 손쉽게 하실 수 있습니다!
https://ejxousiva.tistory.com/30
1. 우선 디컴파일하여 추출한 폴더에서 AndroidManifest.xml 파일을 메모장으로 열어줍니다.
2. 내용중 저희가 바꿔야할 exported 설정을 false 로 바꿔준 후 저장합니다.
3. 이후 서명까지 완료하신 리패키징한 APK 를 NOX에 드래그 앤 드롭 하여 다운로드 합니다. 여기서 기존의 Insecure Bank 앱을 삭제하시고 진행하셔야 합니다!
4. 리패키징한 APK 파일을 Jadx 로 열어보니 무사히 exported:"false" 설정이 된 것을 확인하실 수 있습니다!
5. 이전과 마찬가지로 theBroadcast 라는 액션을 파라미터값이 포함된 Intent 와 함께 외부에서 동작시켜봅니다.
6. 이전과는 다르게 정상적으로 동작을 안하시는것을 확인하실 수 있습니다.
2. 커스텀 권한 설정
만약 exported:"true" 로 설정해야 하는 상황이라면 커스텀 권한을 설정할 수 있다. 커스텀 권한이란 개발자가 임의로 만든 권한으로써 만약 Broadcast 메시지를 수신했는데 발신지의 어플이 Mooner(개발자가 임의로 지은 이름)라는 권한이 없다면 동작을 하지않도록 만드는 것입니다. 이런 권한 설정은 앱을 설치할때 사용자에게 권한을 허용할 것인지 물어볼 수 있기때문에 사용자가 주의만 한다면 안전하게 exported:"true" 설정을 사용할 수 있게됩니다.
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Insecure Bank' 카테고리의 다른 글
[Insecure Bank] 루팅 탐지 및 우회 (0) | 2024.12.02 |
---|---|
[Insecure Bank] 액티비티 컴포넌트 취약점 (0) | 2024.11.29 |
[Insecure Bank] 로컬 암호화 이슈 취약점 (0) | 2024.11.26 |
[Insecure Bank] 취약한 인증 메커니즘 취약점 (0) | 2024.11.23 |
[Insecure Bank] 앱 모의해킹용 어플 '인시큐어 뱅크' 설치방법(feat. Miniconda) (0) | 2024.11.10 |