목록AOS/DIVA (11)
Self-Improvement
Launch Code를 입력하라고 되어있다. InputValidation3Activity 클래스를 확인해보면 DivaJni 클래스로 djni 객체를 생성한 후 initiateLaunchSequence() 메소드를 수행하여 return 값이 0이 아니면 "Launching in T - 10 ..." 메시지가 출력된다. DivaJni 클래스를 확인해보면 divajni 라이브러리를 로드하고 있고 initiateLaunchSequence() 메소드는 네이티브로 작성되어 있는 것을 확인할 수 있다. divajni 라이브러리의 initiateLaunchSequence() 함수를 보면 궁극적으로 return 하는 곳에서 strncmp() API로 ".dotdot" 문자열과 비교를 하고 있다. 중요한 것은 입력한 값을..
소스코드 내에 vendor key 값을 알아내는게 목적이다. Hardcode2Activity 클래스를 보자면 DivaJni 클래스의 djni 객체를 생성한 후 access() 메소드를 호출하여 입력한 값과 비교한 후 같으면 Access granted!가 출력된다. DivaJni 클래스를 보면 divajni 라이브러리가 로드되고 access() 메소드가 네이티브 함수로 작성되어 있다. divanjni 라이브러리의 access() 함수를 확인해보면 strncmp() API로 "olsdfgad;lh" 값과 비교하게 된다. 해당 값을 입력하면 맞다고 출력하게 된다.
DIVA diva의 10. Access Control Issues Part2를 확인해보면 두가지 선택지가 있다. Register Now를 체크한 후 버튼을 누르면 아래와 같이 PIN을 입력하라는 화면으로 넘어가진다. Already Registered를 체크한 후 버튼을 누르면 API 정보를 볼 수 있는 화면으로 넘어가진다. 디컴파일 AccessControl2Activity 클래스의 소스코드를 확인해보면 intent를 선언해주고 aci2rbregnow의 값이 체크되어 있으면 chk_pin 변수는 true를 가지게 된다. 그리고 jakhar.aseem.diva.action.VIEW_CREDS2 로 선언된 액티비티로 전환하고 있으며 chk_pin의 값을 함께 전달하고 있다. activity_access_con..
DIVA diva의 8.Input Validation Issues Part 2이며 URL을 입력하면 보여주는 기능이 존재한다. 디컴파일 소스코드를 확인해보면 InputValidation2URISchemeActivity 클래스의 get 메소드에서 입력한 URL 값에 대한 검증이 존재하지 않는 것을 알 수 있다. 그리하여 URL에 내부 파일을 요청할 수 있는 file:// 형식으로 요청하게 되면 그대로 실행되어 파일 내용을 볼 수 있다. file:///etc/hosts
DIVA diva 어플리케이션의 7. Input Validation Issues이며 user name을 입력하여 검색할 수 있는 폼이 존재한다. admin을 입력하면 관련 정보가 출력되어진다. 디컴파일 소스코드를 확인해보면 SQLite 데이터베이스를 사용하며 sqliuser 테이블에 입력받은 값을 그대로 쿼리로 사용되어 진다. Sqli 입력 폼에 아래의 페이로드를 수행할 시 sqliuser 테이블에 있는 모든 사용자 정보가 출력된다. ' or '1
DIVA DIVA의 앱중 Insecure Logging 부분을 확인해보면 credit card number을 입력하는 곳이 있다. 주제 자체가 안전하지 않은 로깅임으로 입력을 해보고 로그를 확인해 보자. ADB adb logcat을 이용하여 확인하는데 이때 필터링을 diva로 하여 확인하면 더욱 좋다. 디컴파일 DIVA앱을 디컴파일하여 직접 확인하면 LogActivity 클래스에서 Log.e()를 사용하여 출력되는 것을 알 수 있다.
안드로이드 앱 manifest.xml에서 디폴트로 exported=false로 설정되어 있으나, 해당 컴포넌트에 인텐트 필터를 설정할 경우 exported 설정이 true로 변경됩니다. 따라서 intent-filter가 설정된 activity에 exported=false설정이 없을 경우 am 명령어를 통해 실행시킬 수 있습니다. 아래는 실습이 대상이될 앱의 manifest.xml 일부입니다. https://boanit.github.io/pen/android_exported_true exported=true 설정 취약점 exported=true 설정 취약점 안드로이드 애플리케이션에서 manifest.xml 파일에 android:exported=“true”로 설정되어 있는 컴포넌트는 외부에서 해당 컴포넌트에..
분석 Part3도 역시나 앞서 봤던 것과 동일하다. 자바 코드를 확인해보면 임시 createTempFile()을 이용하여 임시 폴더를 생성하고 있는 것을 확인할 수 있다. createTempFile() 임시 파일을 생성하는 함수로 파일명의 가운데 숫자는 랜덤으로 정해지게 된다. 그리고 프로그램이 종료되도 임시 파일은 삭제되지 않고 남아있게 됨으로 deleteOnExit()을 통해 지워줘야 한다. ADB adb에 접근하여 확인해보면 uinfo1782302958tmp라는 임시 파일이 생성된 것을 알 수 있다. 평문 저장 확인 cat 명령어로 확인해보면 입력했던 값이 그대로 저장되어져 있다. FIND FIND 명령어로 최근에 생성된 파일들을 판별할 수 있는 명령어이다. // 10분내에 변경된 파일 찾기(변경된..
분석 Part2도 역시나 아이디랑 비밀번호를 입력하여 저장하면 "3rd party ~~" 문자열이 출력된다. 자바 소스코드를 확인해보면 SQLiteDatabase로 mDB 객체를 생성해준 후 ids2 라는 DB를 생성해주는 것을 알 수 있다. 그리고 입력한 값을 생성한 DB에 저장해준다. ADB ADB에 접근하여 /data 폴더를 확인하면 databases 폴더가 있으며 거기에서 ids2 라는 소스코드에서 봤던 DB 파일이 존재하였다. adb pull 명령어로 해당 파일을 추출하여 파일 내용을 확인하기 위해서는 Sqlite3를 설치해줘야 한다. Sqlite3 설치 아래의 링크에서 다운로드 가능하며 Magisk에서 모듈로 바이너리 명령어 설치 가능하다. https://www.sqlite.org/downlo..
분석 아래의 파트에서 username과 password를 입력하여 SAVE 버튼을 눌러본다. 아래와 같이 저장을 눌르게 되면 "3rd party credentials ~~ "라고 문구가 출력되는 것을 확인할 수 있다. 해당 문자열을 증거로 디컴파일하여 찾아본다. 자바 소스 코드를 확인해보면 입력한 값을 SharedPreferences 형식으로 저장하는 것을 알 수 있다. SharedPreferences 란 개발을 진행하다 보면, 앱의 데이터들을 저장하여 관리해야 할 상황에 직면하게 되는데. 데이터의 양이 많거나 중요한 데이터라면 서버나 DB, 파일의 형태로 저장을 하면 되겠지만, 간단한 설정 값이나 문자열 같은 데이터들은 DB에 저장하기에는 부담스럽고 애매한 경우가 있다. 이런 경우 안드로이드에서 기본적..