안드로이드 앱 취약점 진단

Simcurity·2023년 6월 12일
0

1. 로그캣 확인

로그캣은 안드로이드 장치에서 발생하는 로그 메시지를 화면으로 출력하거나 파일 형태로 저장해주는 기능을 합니다. 안드로이드 로깅 시스템은 시스템 디버그 출력 정보를 확인하거나 수집할 수 있는 메커니즘을 제공합니다.
로그캣 명령어는 다음과 같습니다.

adb logcat [option]

또한, 기기의 쉘 구동 후 logcat을 입력해 실행하는 방법도 있습니다.
로그캣 수행 시

이렇게 기기에서 발생하는 로그 메시지를 출력해줍니다.


전송을 하자 기기에 입력한 변수들도 출력이 됩니다.

1-1) 우선순위


표시한 부분을 보면 영어 대문자 하나가 써져있는데 이들이 의미하는 것은 우선순위로 종류는 다음과 같습니다.

V - Verbose : 일반적인 수준
D - Debug :
I - Info
W - Waring
E - Error
F - Fatal
S - Silent : 가장 높은 우선 순위

리눅스의 syslog 위험 수준과 비슷한것 같네요.

1-2) logcat 옵션

-b : 로그 내용을 선택적으로 출력 할 수 있게 해줍니다.
adb logcat -b <radio | events | main>

events로 기록 중에 위에 상태바를 열고 닫으니 notiffication_panel이 revealed, hidden됐다고 로깅되네요.

-c : 기록된 로그 메시지를 삭제하고 종료합니다.

-d : 로그 메시지를 화면에 덤프하고 종료합니다.

-f : 로그 메시지를 지정한 파일 이름으로 저장합니다.
adb -d -f /sdcard/output.txt -b radio
입력 후 해당 파일을 열어보니
로그가 저장되어 있었습니다.

-g : 선택된 버퍼의 크기를 출력하고 종료합니다.

-n : 저장되는 로그 파일의 개수를 지정합니다. 이 때 -r옵션으로 로그 파일 용량을 설정하고 -f로 파일 이름을 지정해야 합니다.

용량이 찰 때까지 기다리는 거 같습니다.

-r : 로그 메시지를 파일로 저장 시 저장되는 파일의 용량을 설정합니다. 기본 값은 16입니다.

-s : 기본 필터의 종류를 s로 변경시켜 모든 우선순위 메세지를 조용히시키는 것으로 모든 메시지를 출력하지 않도록 합니다. 뒤에 옵션을 붙임으로서 사용자가 원하는 특정 로그 메시지를 확인할 수 있습니다.

-v : 로그 메시지는 메타데이터 필드와 태그, 우선순위를 갖습니다. v옵션으로 특정 메타데이터를 출력할 수 있습니다.

  • brief : 로그 메시지의 우선순위/태그, 메시지 발생한 프로세스의 PID 출력
  • process : 로그 메시지의 발생한 PID 출력
  • tag : 로그 메시지의 우선순위/태그 출력
  • time: 로그 메시지의 날짜, 호출 시간, 우선순위/태그, PID 출력

adb logcat ActivityManager:I art:I *:S

위 명령은 ActivityManager와 art태그 중 Info나 그 이상의 우선순위를 갖는 항목을 출력해주고 나머지 로그들은 S옵션으로 출력하지 않는 명령입니다.

다음과 같이 출력되네요.

2. bugreport

bugreport 명령은 dumpsys, dumpstate, logcat 명령의 결과를 한 번에 출력해줍니다.

너무 크다보니 압축 형식으로 저장을 해주는군요.

2-1) dumpsys

현재 연결된 안드로이드 장치의 애플리케이션 및 장치 정보를 자세히 표시해줍니다
부가적인 옵션없이 사용할 경우 매우 많은 정보가 출력되어 확인하기 어려워 추가 옵션을 줍니다.

  • meminfo
  • cpuinfo
  • activity
  • account
    등의 옵션이 있습니다.

    adb shell dumpsys meminfo 명령 사용 결과

2-2) dumpstate

현재 연결된 안드로이드 장치의 모든 상태 정보를 출력해줍니다.

2-3) logcat

안드로이드 시스템에서 발생하는 로그 정보를 출력해줍니다.

3. jdwp

jdwp 명령은 연결된 안드로이드 장치에서 사용할 수 있는 jdwp 프로세스의 목록을 출력합니다.
명령 입력 시 특정 애플리케이션의 프로세스 번호도 출력이 되는데 이를 이용해 디버깅에 사용할 수 있습니다.
애플리케이션의 디버깅을 수행한다는 가정하에 jdwp 프로세스 번호를 알아보겠습니다.
처음엔 아무것도 안뜨다가 인시큐어뱅크를 실행하고 명령어를 쳐보니

다음과 같이 하나의 프로세스가 나타났습니다.

4. install/uninstall, pull/push

4-1) install

install 명령으로 특정 애플리케이션을 설치할 수 있습니다.
하지만, 이미 설치된 경우 다음과 같이 오류가 발생합니다.

-r 옵션을 사용하면 기존 데이터의 삭제 없이 애플리케이션이 재설치됩니다.

4-2) uninstall

uninstall 명령으로 설치된 애플리케이션을 삭제할 수 있습니다.

adb uninstall <설치된 패키지 이름>

형식으로 입력을 해야하는데 설치된 패키지 이름을 알기 위해 다음 명령을 쓸 수 있습니다.

adb shell pm list packages -f

여기서 pm은 package manager로 패키지 목록을 보여줍니다.

인시큐어뱅크의 패키지 파일을 찾았습니다.
com.android.insecurebankv2입니다.


uninstall 명령으로 삭제했다가

다시 설치해보았습니다.

4-3) pull

pull 명령은 연결된 에뮬레이터나 장치에 저장된 파일을 PC로 복사하는 기능을 수행합니다.

adb pull <장치 경로/파일> <저장할 위치>

형식으로 명령합니다.

PC로 파일을 저장했습니다.

4-4) push

push 명령은 반대로 PC에서 안드로이드 에뮬레이터로 파일을 저장시키는 명령어입니다.

adb push <파일 위치> <저장할 위치>


파일이 저장되었습니다.

5. forward

forward 명령은 특정 로컬 포트를 안드로이드 장치의 틀정 포트와 소켓 통신이 가능하도록 포워딩해주는 기능을 합니다.

forward <로컬 포트> <원격지 포트>

형식으로 작성하며 이 명령을 사용하기 위해선 대상 장치에서 USB 디버깅 옵션이 활성화되어야 합니다.
인시큐어 뱅크를 jdwp와 forward를 이용해 디버깅 환경을 구성해보겠습니다.

인시큐어뱅크의 PID입니다.

이제 안드로이드의 jdwp 7075에 포워딩 상태입니다.

다음으로 jdb를 통해 애플리케이션에 대한 디버깅이 가능한 상태로 만들어주면 디버깅이 가능합니다.

6. 스크립팅 기능

스크립트 범주는 사용자에 의해 제작되는 스크립트에 연결된 장치 시리얼 번호나 기기 정보와 같은 특정한 정보 등을 출력하는 데 사용할 수 있습니다.

6-1) get-serialno

연결된 장치의 시리얼 번호를 문자열로 출력합니다.

6-2) get-state

연결된 안드로이드 에뮬레이터나 장치의 상태를 문자열로 출력합니다.

6-3) wait-for-device

연결되는 에뮬레이터나 장치가 구동될 때까지 adb를 통한 명령 실행을 멈춰 놓고 장치가 device 상태가 되면 명령과 함게 설정된 명령어를 실행합니다.

adb wait-for-device <명령어>

형식으로 구성됩니다.

7. 서버 기능

현재 ADB 서버의 상태를 확인하고 통신에 문제가 발생 시 서버를 재시작하는 등의 역할을 수행합니다.

7-1) start-server

ADB 서버 프로세스가 동작하는지의 여부를 확인한 후 결과를 표시합니다.
만약 서버가 동작하지 않는 상태라면 서버를 구동시킵니다.

7-2) kill-server

ADB 이용 도중 서버에 문제가 발생하거나 상태가 이상한 경우 서버를 종료시키는 역할을 합니다. 후에 다른 adb 명령 입력 시 서버를 다시 시작합니다.

0개의 댓글