본문 바로가기
프로그래밍 놀이터/안드로이드, Java

#2 취약점 진단 및 분석 도구 part 1. - 안드로이드 모바일 앱 모의해킹

by 돼지왕 왕돼지 2020. 11. 18.
반응형


안드로이드 취약점 진단 및 분석 도구

2.1. ADB 살펴보기


-

ADB 는 Android Debug Bridge.

안드로이드 에뮬레이터나 PC 에 실제 연결된 장치를 제어하기 위한 안드로이드 디버깅 도구 중 하나이다.



-

ADB 는 클라이언트, 서버, 데몬의 세 요소를 포함하는 클라이언트-서버 프로그램이다.


ADB 클라이언트는 ADB 명령을 입력하는 개발 PC 이다.

ADB 서버는 안드로이드 개발 시스템의 백그라운드 프로세서로, 장치의 ADB 데몬 사이의 통신을 관리한다.

ADB 데몬은 장치의 백그라운드 프로세서로 동작하는 인스턴스다.



-

ADB 클라이언트가 시작되면 가장 먼저 ADB 서버 프로세서가 실행 중인지 점검한다.

실행 상태가 아니면 서버 프로세스를 구동하며, TCP 5037 포트에 바인드 시키고, 모든 클라이언트는 5037 포트를 통해 ADB 서버와 통신한다.



-

서버가 동작 중인 모든 장치 인스턴스에 대한 연결을 설정하면 포트 번호 5555 에서 5585 까지의 범위에서 홀수 번호의 포트를 스캐닝한다.

이 스캐닝을 통해 ADB 데몬이 발견되면 해당 포트 번호에 연결한다.




2.1.1. 디바이스 장치 선택


-

실제 device 와 emulator device 가 붙어있는 경우 -d, -e 로 분기하여 명령어를 전달할 수 있다.

device : adb -d <명령어> 

emulator : adb -e <명령어>



-

단말이나 에뮬레이터가 여러개일 경우 -s 옵션과 함께 장치명을 지정해주면 된다.




2.1.2. 일반 기능




2.1.3. 디버그 기능


* 로그켓을 이용한 로그 분석


-

adb logcat [<option>] … [<filter-spec>]



-

-b <buffer>

    안드로이드 로그 시스템은 다양한 유형(radio, events, main)의 로그 버퍼를 갖고 있다.

    -b 옵션을 사용하여 출력되는 로그 내용을 선택적으로 확인할 수 있으며, 각 버퍼는 다음과 같은 내용을 포함하고 있다.


    radio : radio/telephony 관련 메시지

    events : 이벤트와 관련된 메시지

    main : 메인 로그 버퍼(기본값)


    ex) 

    > adb logcat -b <radio | events | main>



-

-c

    기록된 로그 메시지를 삭제하고 종료한다.



-

-d

    로그 메시지를 화면에 덤프하고 종료한다.



-

-f <filename>

    로그 메시지를 지정한 파일 이름으로 저장한다.


    ex) 

    > adb logact -d -f /sdcard/output.txt -b radio



-

-g

    선택된 버퍼의 크기를 출력하고 종료한다.

    기본값으로 main 이 선택되어 있다.


    ex) 

    > adb logcat -g -b <radio | events | main>



-

-n <count>

    저장되는 로그 파일의 개수를 지정한다.

    이 때 -r 옵션을 포함하여 로그 파일 용량을 설정(kb)하고 파일 이름을 -f 옵션으로 설정해야 한다.

    -n 옵션을 포함하지 않는 경우에는 기본값으로 4개가 설정되며, 파일 이름은 filename, filename.1, filename.2 와 같이 저장된다.

    저장되는 파일은 숫자가 낮을수록 최신 로그를 저장한다.


    ex) 

    > adb logcat -n 5 -r 1024 -f /sdcard/filename



-

-r <kbytes>

    로그 메시지를 저장하는 경우, 저장되는 파일의 용량을 설정하기 위해 사용되는 옵션으로, -f 옵션과 함께 사용한다.

    기본값으로 16이 설정되어 있다.



-

-s

    기본 필터의 종류를 S(Silent)로 변경하도록 설정한다.

    이 옵션은 모든 우선순위 메시지를 조용히 시키는 것으로, 모든 메시지를 출력하지 않도록 한다.

    그 대신 이 옵션 뒤에 필터(태그:우선순위)를 입력하면 사용자가 확인하고 싶은 특정 로그 메시지를 확인할 수 있다.


    ex) 

    > adb logcat -s ActivityManager:I



-

-v <format>

    로그 메시지를 메타데이터 필드와 태그, 우선순위를 갖는다.

    -v 옵션으로 특정 메타데이터 필드를 선택하면 로그 메시지를 출력할 수 있다.

    메타데이터 항목은 다음과 같다.


    brief : 로그 메시지의 우선순위/태그와 메시지가 발생한 프로세스의 PID 를 출력(기본값)

    process :  로그 메시지에서 메시지가 발생한 PID 를 출력한다.

    tag : 로그 메시지의 우선순위/태그를 출력한다.

    raw : 원본 메시지만을 출력한다. 다른 메타데이터는 포함되지 않는다.

    time : 날짜, 호출시간, 우선순위/태그와 메시지가 발생한 PID 를 출력한다.

    threadtime : 날짜, 호출시간, 우선순위, 태그와 메시지가 발생한 PID, TID 를 출력한다.

    long : 모든 메타데이터 필드와 메시지를 표시해준다. 이 옵션은 각 메시지당 한 줄씩 공백을 만들어주어 가독성이 좋다.


    ex) 

    > adb logcat -v <brief | process | tag | raw | time | threadtime | long>



-

filter expressions(필터링 구문)의 형식은 tag:priority 로 구성되어 있다.


아래 명령은 ActivityManager 와 art 태그 중 I(info)나 그 이상의 우선순위를 갖는 항목을 출력한다.

> adb logcat ActivityManager:I art:I *:S

    



* bugreport 를 이용한 버그 보고서 확인


-

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

bugreport 를 통해 출력되는 내용은 별도의 명령을 통해 출력할 수 있다.

(돼왕 : 결과가 zip 파일로 떨어진다.)

> adb bugreport



-

dumpsys

    앱 및 장치 정보를 자세히 표시한다.

    하위 명령에는 meminfo, cpuinfo, account, activity, window, wifi, power 등이 있다.

    ex) 

    > adb shell dumpsys meminfo



-

dumpstate

    모든 상태 정보를 출력한다.

    ( 돼왕 : 작동하지 않는 단말들이 있으며, android 10 이상에서는 공식 지원하지 않는다. bugreport 를 쓰란다. )

    ex) 

    > adb shell dumpstate




* Jdwp 를 이용한 프로세스 정보 확인


-

jdwp 명령은 jdwp 프로세스의 목록을 출력한다.

jdwp 는 Java Debug Wire Protocol 로 자바 앱의 디버깅에 사용한다.

jdwp 를 이용해 특정 앱의 프로세스 번호를 알아내고, 이를 디버거에 연결하면 디버깅을 수행할 수 있다.



-

> adb jwdp


이를 수행하면 프로세스 번호들이 출력된다.

이를 이용하는 방법은 forward 명령부분에서 설명될 것이다.




2.1.4. 데이터 기능


* install 명령어




* uninstall 명령어


-

> adb shell pm list packages -f 


pm list packages 는 package 목록을 보여주며 다음 option 들이 있다.

-f : 관련된 파일정보도 보여준다.

-d : disabled package 만 보여준다.

-e : enabled package 만 보여준다.

-s : system package 만 보여준다.

-3 : 3rd party package 만 보여준다.

-u : uninstalled package 도 보여준다.



-

앱을 삭제할 때 -k 옵션을 추가하면 해당 앱 데이터는 삭제도지 않고, 앱만 삭제된다.




* pull/push 명령어




2.1.5. 포트와 네트워킹 기능


* Forward 명령어


-

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

이 명령을 사용하기 위해서는 대상 장치에서 USB 디버깅 옵션이 활성화되어야 한다.



-

아래의 명령어는 호스트의 7777 포트가 안드로이드 장치의 8888로 전달되도록 한다.

> adb forward tcp:7777 tcp:8888


호스트의 7888 과 PID 1824 인 앱과 연결하려면 

> adb forward tcp:7888 jdwp:1824



-

forward 에 설정할 수 있는 항목은..

    tcp:<portnum>

    local:<UNIX domain socket name>

    dev:<character device name>

    jdwp:<pid>



-

디버깅 연결은 다음과 같이 한다.

> jdb -sourcepath .\src -connect com.sunjdi.SocketAttach:hostname=localhost.port=7888




2.1.6. 스크립팅 기능


-

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

이에 해당하는 명령어는 get-serialno, get-state, wait-for-device 를 들 수 있다.




* get-serialno 명령어


-

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

이 결과는 adb devices 명령을 수행했을 때 출력되는 연결된 장치의 이름이다.

> adb get-serialno




* get-state 명령어


-

연결된 장치의 상태를 문자열로 출력한다.

adb devices 명령을 수행했을 때 출력되는 장치 상태와 같다.

> adb get-state




* wait-for-device 명령어


-

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


syntax)

adb wait-for-device <명렁어>


ex)

> adb wait-for-device shell getprop




2.1.7. 서버 기능


-

서버 범주에 속하는 명령은 현재 adb 서버의 상태를 확인하고 adb 와의 통신에 문제가 발생하면 서버를 재시작하는 등과 같은 역할을 수행한다.

해당 명령으로는 start-server, kill-server 등이 있다.




2.1.8. 쉘 기능


-

shell 명령은 연결된 장치의 원격 쉘을 사용할 수 있도록 하는 기능을 제공한다.




반응형

댓글