보안개구리
5. Access Control Issues(액세스 제어 이슈) 본문
[Part 1]
1) 9.Access Control Issues - Part1에 접속합니다.
목표: 버튼을 클릭하면 API Credentials 액세스 가능. 앱 외부에서 API Credentials 자격 증명 액세스 시도
힌트: 앱의 구성 요소는 적절히 보호되지 않으면 다른 앱이나 사용자에 의해 액세스 될 수 있음
화면 중단을 보면 VIEW API CREDENTIALS 라는 버튼이 보이며 클릭 시 API 키값과 유저명 그리고 비밀번호가 출력됩니다. 여기서 출력되는 정보를 취약 정보라고 가정했을 때 현재 우리는 Diva앱을 접속하여 Diva앱 내 취약정보를 확인하였지만 문제가 원하는 것은 앱 외부에서 해당 취약정보를 확인하라는 것으로 추측됩니다.
2) 먼저 취약정보가 노출되었던 액티비티에 대하여 이름을 확인해야 합니다. 확인하는 방법은 여러 가지가 있으나 문자열 검색을 통해 jadx에서 검색해 보도록 하겠습니다. 검색을 통해 액티비티의 이름이 APICredsActivity 인 것을 확인하였고 AndroidManifest.xml 내 해당 액티비티의 이름을 검색해 보겠습니다.
3) 해당 액태비티는 intent-filter를 선언했는데 내부적으로만 사용되는 액티비티의 경우 intent-filter를 정의할 필요가 없으며 설령 사용한다고 해도 외부에 노출되지 않게 exported 속성을 'false'값으로 변경해야 합니다.
4) drozer라는 툴을 이용하여 diva 앱에서 외부로 노출되는 액티비티 확인 시 아래와 같은 액티비티들이 노출되는 것을 확인하였습니다.
5) diva앱을 종료 후 drozer를 통해 노출된 액티비티를 호출해 보겠습니다. 호출 시 우리가 처음 버튼을 클릭했던 것처럼 취약한 정보가 들어있는 액티비티가 호출되었습니다.
[Part 2]
1) 10.Access Control Issues - Part2에 접속합니다.
목표: TVEETER API 자격 증명에 액세스 할 수 있습니다. TVEETER API 자격 증명은 Tweeter에 등록한 후에 접근할 수 있습니다. 앱은 온라인 등록을 요청하고, 제공자는 앱에 등록할 수 있도록 핀 번호를 제공합니다. 이제 이 핀 번호를 모르고도 앱 외부에서 API 자격 증명에 접근해 보세요. 이는 비즈니스 로직 문제이므로 코드를 확인해야 할 수도 있습니다.
힌트: 앱의 구성 요소는 적절히 보호되지 않으면 다른 앱이나 사용자에 의해 접근될 수 있으며, 일부는 외부 입력도 받을 수 있습니다. 액티비티, 서비스, 콘텐츠 제공자와 같은 구성 요소는 이러한 문제에 취약합니다.
액티비티 접속 시 두 가지 체크 버튼이 존재하는데 'Register Now'를 체크 후 VIEW 버튼을 클릭하면 PIN 번호를 받기 위해서는 등록을 해야 하며 등록 후 해당 PIN 번호로 로그인하라는 메시지가 나오며 어떤 값을 입력해도 PIN 번호가 일치하지 않다고 출력됩니다.
2) Already Registered를 체크 후 VIEW 버튼을 클릭하면 Part1과 동일하게 키/이름/비밀번호 값이 출력됩니다.
3) 먼저 Part1 방식과 마찬가지로 drozer를 통하여 키/이름/비밀번호 값이 출력되는 액티비티를 호출해 보도록 하겠습니다.
액티비티 호출 시 ' Register Now'를 체크한 후 VIEW 버튼을 누른 것처럼 PIN번호를 입력하라고 나옵니다. 정확한 분석을 위해 소스코드를 확인해 보도록 하겠습니다.
4) 코드를 보면 boolean chk_pin = rbregnow.isChecked()를 통하여 chk_pin 변수에 'rbregnow'가 선택되었는지 여부가 저장되며 그 정보를 Intent 객체에 추가하여 다른 액티비티(APICreds2 Activity)로 전달합니다. 해당 액티비티를 확인해 보도록 하겠습니다.
5) boolean bcheck = i.getBooleanExtra(getString(R.string.chk_pin), true);를 통해 앞서 AccessControl2 Activity에 chk_pin값을 가져와 사용하는데 이때 bhceck가 false이면 API키와 사용자 정보를 표시합니다. 따라서 drozer를 통해서 chk_pin의 값을 false로 설정한 후 액티비티를 호출해 보도록 하겠습니다.
6) run app.activity.start --component jakhar.aseem.diva jakhar.aseem.diva.APICreds2Activity --extra boolean chk_pin false 명령어를 입력하여 chk_pin의 값을 false로 설정했음에도 불구하고 PIN번호를 입력하라는 화면이 나옵니다.
7) chk_pin의 값을 fasle로 설정했음에도 불구하고 우리가 원했던 화면이 나오지 않은 이유는 getString(R.string.chk_pin)이 반환하는 값이 아래 사진에서 알 수 있듯이 check_pin이기 때문입니다. 명령어를 chk_pin -> check_pin으로 수정한 후 다시 한번 액티비티를 호출해 보겠습니다.
8) 명령어를 우리가 원했던 화면의 액티비티가 출력됨을 확인하였습니다.
[Part 3]
1) 11.Access Control Issues - Part3에 접속합니다.
목표: 이것은 개인 메모 애플리케이션입니다. 사용자는 한 번 PIN을 생성한 후, 올바른 PIN을 입력하여 메모에 접근할 수 있습니다. 이제 PIN을 모르는 상태에서 앱 외부에서 개인 메모에 접근해 보세요.
힌트: 애플리케이션의 구성 요소는 적절하게 보호되지 않으면 다른 애플리케이션이나 사용자가 접근할 수 있으며, 일부는 외부 입력을 수락할 수도 있습니다. 액티비티, 서비스, 콘텐츠 제공자와 같은 구성 요소가 이러한 문제에 취약할 수 있습니다.
먼저 임의의 번호(0915)를 입력한 후 CREATE/CHANGE PIN 버튼을 클릭해 보도록 하겠습니다. 입력 시 Pin번호가 정상적으로 생성되었다는 메시지가 출력되며 화면 하단에 GO TO PRIVATE NOTES라는 버튼이 생긴 것을 확인하였습니다.
2) 해당 버튼 클릭 PIN 번호를 입력하라는 화면이 나오는데 위에서 생성한 Pin 번호(0915) 클릭 시 메모된 정보들이 출력됩니다. Pin 번호 불일치 시에는 일치하지 않다는 메시지가 출력됩니다.
3) 또한 해당 버튼을 통해 기존에 있던 PIN 번호도 변경할 수 있습니다. 우선 drozer를 사용하여 메모정보가 노출되던 액티비티(AccessControl3NotesActivity)에 접속 해도보록 하겠습니다.
4) run app.activity.start --component jakhar.aseem.diva jakhar.aseem.diva.AccessControl3NotesActivity 명령어를 사용하여 해당 액티비티에 접속을 하려 했지만 접속이 불가함을 확인하였습니다. 기존 노출된 액티비티를 검색하는 과정에서 확인했지만 현재 diva앱에서 외부로 노출된 액티비티는 APICredsActivity, APICreds2Activity 이 2개이기 때문에 그 외 액티비티들은 외부에서 접속이 불가능합니다. 다른 방법을 찾기 위해 AndroidManifest.xml 파일을 확인해 보도록 하겠습니다.
5) 해당 코드는 AndoirdManifest.xml 파일 내 'Contetn Provider'를 정의한 부분으로 여기서 'Contetn Provider' 란 애플리케이션 간 데이터를 공유할 수 있도록 해줍니다. jakhar.aseem.diva.NotesProvider라는 콘텐츠프로바이더를 정의하였으며 외부에서 이 콘텐츠 프로바이더를 통해 접근이 가능하기 때문에 우리는 해당 방식을 이용하여 접근을 시도해 볼 겁니다.
6) 아래 코드를 보게 되면 콘텐츠 프로바이더에 접근하기 위한 URL이 존재하는데 해당 URL을 통하여 접근해보도록 하겟습니다. 참고로 drozer를 통해서도 더 쉽게 노출된 콘텐츠 프로바이더 정보에 대해서 확인할 수 있습니다.
7) drozer를 통하여 획득한 URL에 대해 쿼리를 진행 시 앞서 확인했던 것처럼 메모된 기록들을 확인하였습니다.
'앱 진단(Android) > Diva 실습' 카테고리의 다른 글
4. Input Validation Issues(입력 검증 이슈) (0) | 2024.07.25 |
---|---|
3. Insecure Data Storage(안전하지 않은 데이터 저장소) (0) | 2024.07.23 |
2. Hardcoding Issues(하드코딩 이슈) (0) | 2024.07.18 |
1. Insecure Logging(불안전한 로깅) (0) | 2024.07.18 |