Android Hacking


안드로이드 패킷 포워딩(burp 등으로)용 iptables 명령어 정리. 


보통 proxydroid, autoproxy 등 자동 설정 apk 를 이용하면 되지만 80, 8080, 443이 아닌 경우 


리다이렉트가 안되는 경우가 있다. 그런 경우 직접 아래와 같이 iptables 로 세팅해줄 수 있다.





# iptables -F    // 전체 삭제


# iptables -L -t nat  // nat 리스트




아래는 proxydroid 포트로 리다이렉트 하는 경우.


# iptables -A OUTPUT -t nat -p tcp --dport 10443 -j REDIRECT --to-port 8124


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

REDIRECT   udp  --  anywhere             anywhere             udp dpt:domain redir ports 54358

RETURN     tcp  --  anywhere             192.168.43.187

REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8123

REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https redir ports 8124

REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:5228 redir ports 8124

REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:10443 redir ports 8124




Frida 권한 오류 해결

2018. 9. 11. 15:17


간만에 점검용 폰을 새로 세팅해야 할 일이 있어서 간략히 정리. 




# 세팅 순서


- custom recovery 설치, custom rom 설치

- magisk, su 설치(루팅)

- gdb, frida... (점검용 툴들)


다 잘 되다가.. frida 에서 뜬금없이 오류가 떠서 당황..




$ frida-ps -Uai

Failed to enumerate applications: failed to execute child process “/data/local/tmp/re.frida.server/frida-helper-64” (Permission denied)





검색해보니 동일한 오류를 겪은 선구자(?) 들이 있었고 검색 후 해결할 수 있었다.

(삼성계열 폰에서 selinux policy 와 관련해 자식프로세스 생성 시 발생하는 문제라고 하나 정확히 알아보진 않음.)


몇번의 시도 후 성공했는데, 결론적으로 아래와 같이 /system/priv-app 폴더로 복사해주면 해결된다.






$ frida-ps -Uai


  PID  Name                                            Identifier

-----  ----------------------------------------------  -------------------------------------------------

11267  AhnLab V3 Mobile Plus 2.0                       com.ahnlab.v3mobileplus

 4398  Android Services Library                        com.google.android.ext.services

 6857  BadgeProvider                                   com.sec.android.provider.badge

21975  CMHProvider                                     com.samsung.cmh

 4158  CSC                                             com.samsung.sec.android.application.csc 

        ...




잘 됩니다.

bypass proxy check using frida

2017. 8. 8. 15:12



모바일 앱중 proxy 체크를 할때, frida 를 이용해서 우회하기.

bypass proxy check on android device(using frida hooking)



var System = Java.use("java.lang.System"); if (System.getProperty){ System.getProperty.overloads[0].implementation = function(prop){ send("[S] called : system.getProperty("+ prop.toString() +")") if (prop.toString().toLowerCase().indexOf("proxy") > -1){ send("[W] bypass proxy check : " + prop); return; } var ret = this.getProperty(prop); send("[W] ret value : " + ret.toString()); return ret; } }




자주 느끼는 거지만 프리다 참 좋다.

frida is awesome!


최근에는 주로 모바일 앱 후킹시 frida 를 이용하고 있는데, 안드로이드 느린 앱을 후킹하려고 하다 보면 가끔 아래처럼 


타임아웃 메시지가 나오며 죽어버리는 경우가 있다.


이 경우 해결방법.



 hyunmini:02.dbi $ python dbi.py

Traceback (most recent call last):

  File "dbi.py", line 73, in <module>

    main(target_process)

  File "dbi.py", line 54, in main

    pid = frida.get_usb_device().spawn([target_process])

  File "/Library/Python/2.7/site-packages/frida/core.py", line 85, in spawn

    return self._impl.spawn(argv)

frida.TimedOutError: unexpectedly timed out while waiting for app to launch




...

pid = frida.get_usb_device().spawn([target_process])

...



앱 실행하는 위 코드에 timeout 인자값을 주면 됨(;;)



...

pid = frida.get_usb_device(timeout=10).spawn([target_process])

...



이제 잘 된다.


 hyunmini:02.dbi $ python dbi.py


>>>> Start Native Hooking <<<<

[+] find open() address: 0xf6fda1af

[+] find fopen() address: 0xf6ff658d

[+] find access() address: 0xf6fd7d65

[+] find stat() address: 0xf6fdb125

[+] find strcasecmp() address: 0xf6ffd39d

[+] find strcmp() address: 0xf6fd66dc

[!!] Starting Java Hooking...

Runtime.loadLibrary: soundpool

Runtime.loadLibrary: authmanager

Runtime.loadLibrary: webviewchromium

Runtime.loadLibrary: webviewchromium_plat_support

Runtime.loadLibrary: NS*****

Runtime.loadLibrary: ap1.7.8

Runtime.loadLibrary: a****

[+] Hooking /data/app/com.*****-1/lib/arm/lib****.so!****1


[*]  bypass rooting check : called - *****()









DBI on Android - ADBI(Android Dynamic Binary Instrumentation)







  • DBI(Dynamic Binary Instrumentation)
   동적으로 바이너리에 코드를 삽입하여 실행하는 것을 말한다. 이를 통해 소스코드를 수정하지 않고도 API Trace, 인자값 조작 및 리턴값 조작,
    이외에도 다양한 동적 조작을 할 수 있다. DBI를 구현하는 방법은 여러가지가 있겠지만 내가 알고 있는 방법은(혹은 본 것은) 후킹과 에뮬레이션이다.
    후킹이든 에뮬레이션이든 조사 혹은 조작하길 바라는 시점에서 코드 흐름을 변경하여 원하는 조사 혹은 조작을 한 뒤 원래 코드 흐름으로 돌려주는 것이다.
    리버싱을 할 때 쉽게 분석을 할 수 있도록 도와주며, 취약점 분석 측면에서도 큰 도움을 줄 수 있다. 이번 포스팅에서는 분석(Trace)를 위주로 할 것이다.
  


  • ADBI(the Android Dynamic Binary Instrumentation toolkit)


     안드로이드 환경에서 DBI를 하기 위한 툴킷으로, crmulliner 라는 사람이 만들었으며 github 에 공개해 놓았다. 코드를 살펴보니, 

     후킹을 통해 구현해 놓았고, 예제 소스를 보고 직접 라이브러리(.so)를 만들어서 타겟 프로그램에 인젝션 하는 방식으로 동작한다. 

     조사 혹은 조작할 함수의 앞 뒤에서 직접 C언어로 프로그래밍을 하면 된다. 후킹 방식은 대상 함수의 첫줄을 변조하여 후킹함수로

     점프하여 조작을 수행하는 방식으로 되어있다. 사용자는 후킹함수 내에서 조작을 하거나 값을 조사한 뒤 대상 원본 함수를 후킹할

     수도, 아예 호출을 하지 않고 임의의 값을 리턴할 수도 있다. 





 1. 설치


  adbi 를 사용하기 위해서는 먼저 ndk 가 필요하다. ARM 크로스 컴파일 시 ndk 를 이용하기 때문이다.



1) ndk 설치


  아래 다운로드 페이지에서 자신의 OS 환경에 맞는 버전을 다운로드 하도록 하자. 


  http://developer.android.com/intl/ko/ndk/downloads/index.html

  

 


    설명에도 나와있듯이 다운로드한 파일에 실행권한을 주고 실행만 해 주면 설치는 끝이 난다.






2) adbi 설치


   # git clone https://github.com/crmulliner/adbi


  



 


2. 예제 소스코드 분석


  본격적으로 adbi 를 사용해보기 전에 먼저 소스코드를 분석해 보면서 원리를 파악해 보도록 하자.



hyunmini$ tree ./

./

├── README.md

├── build.sh                               // 컴파일 스크립트

├── clean.sh                               // 초기화(컴파일 이전으로 복구)

├── hijack

│   ├── hijack.c                         // 라이브러리 인젝션 소스

│   └── jni

│       └── Android.mk

└── instruments

    ├── base

    │   ├── base.c

    │   ├── base.h

    │   ├── hook.c                     // 후킹 소스

    │   ├── hook.h

    │   ├── jni

    │   │   ├── Android.mk

    │   │   └── Application.mk

    │   ├── util.c

    │   └── util.h

    └── example

        ├── epoll.c                          // instrument 예제 소스

        ├── epoll_arm.c                  // instrument 예제 소스

        └── jni

            └── Android.mk




  

1) hijack.c   -  라이브러리 인젝션 소스



윈도우 운영체제에서는 DLL 인젝션을 통해 주로 타 프로세스를 조작했는데, 마찬가지 개념으로 *nix 계열 운영체제에서는 so 인젝션을 통해 

타 프로세스를 조작할 수 있다. hijack.c 소스코드는 바로 이러한 라이브러리 인젝션을 수행해 주는 코드이다.


라이브러리 인젝션을 위해서 hijack.c 에서는 아래와 같은 방법을 사용한다. 윈도우 DLL 인젝션과 거의 동일하다.



    (1)  PTRACE 를 이용하여 현재 컨텍스트(레지스트리 등의 정보)를 구한다. 이후 대부분의 과정에서 PTRACE API 를 이용한다.


    (2)  인젝션 하려는 라이브러리 이름을 스택 메모리에 쓴다.


    (3)  쉘코드(dlopen() 함수를 실행하는)를 스택메모리에 쓴다.


    (4)  mprotect() 를 호출하여 스택에 실행권한을 부여한다.


    (5)  pc 레지스터를  스택의 쉘코드의 주소로 변경하여 dlopen() 함수를 강제로 호출한다. 


    (6)  라이브러리가 대상 프로세스에 강제로 로드되며 후킹 코드가 실행된다.




코드 중 중요한 부분만 살펴 보도록 하자.  조금 내려가다 보면 쉘코드가 보인다. 단순히 레지스터에 스택의 값을 넣어 주는 역할만 한다.



[그림] dlopen 을 실행해 주는 간단한 쉘코드



nop 로 비어있는 부분에는 호출에 필요한 인자값에 맞춰 각각의 값을 넣어주게 된다. 이때도 PTRACE 를 이용하게 된다. 


아래로 조금만 더 내려가 보면 메인함수가 시작되고, 아래와 같이 dlopen() 함수의 주소를 구하는 부분이 나온다.



[그림] 동적으로 dlopen 주소 얻기


 linker 프로세스에서 


(작성중)











root@zerofltektt:/sdcard/test # ./hijack                                       

error: only position independent executables (PIE) are supported.


안드로이드에서(아마도 롤리팝 이상인 경우 ELF로더가 PIE를 확인하는 듯) 위와 같이 PIE로 컴파일 되지 않으면 실행되지 않는다는 에러 메시지가 발생한 경우


Android.mk 파일에 아래와 같이 두줄을 간단히 추가해주면 해결된다.


LOCAL_CFLAGS += -fPIE

LOCAL_LDFLAGS += -fPIE -pie


# vi Android.mk

=============================================

  1 # Copyright (C) 2009 The Android Open Source Project

  2 #

  3 # Licensed under the Apache License, Version 2.0 (the "License");

  4 # you may not use this file except in compliance with the License.

  5 # You may obtain a copy of the License at

  6 #

  7 #      http://www.apache.org/licenses/LICENSE-2.0

  8 #

  9 # Unless required by applicable law or agreed to in writing, software

 10 # distributed under the License is distributed on an "AS IS" BASIS,

 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 12 # See the License for the specific language governing permissions and

 13 # limitations under the License.

 14 #

 15 LOCAL_PATH := $(call my-dir)

 16 

 17 include $(CLEAR_VARS)

 18 LOCAL_MODULE := base

 19 LOCAL_SRC_FILES := ../../base/obj/local/armeabi/libbase.a

 20 LOCAL_EXPORT_C_INCLUDES := ../../base

 21 include $(PREBUILT_STATIC_LIBRARY)

 22 

 23 

 24 include $(CLEAR_VARS)

 25 LOCAL_MODULE    := libexample

 26 LOCAL_SRC_FILES := ../epoll.c  ../epoll_arm.c.arm

 27 LOCAL_CFLAGS := -g

 28 LOCAL_SHARED_LIBRARIES := dl

 29 LOCAL_STATIC_LIBRARIES := base

 30 LOCAL_CFLAGS += -fPIE

 31 LOCAL_LDFLAGS += -fPIE -pie

 32 

 33 include $(BUILD_SHARED_LIBRARY)


# make


해결~


안드로이드 루팅 탐지 우회






안드로이드 앱중 보안성을 중요시 하는 일부 앱들의 경우 루팅 및 무결성을 탐지하여 사용을 제한하고 있다. 


이러한 경우 탐지 기법에 따라 몇가지 우회 방법들이 존재한다. 이에 대해 간략히 정리해 본다.





1. 루팅우회



1.1. 루팅 탐지 기법


 직접 탐지하기도 하지만, 대부분 솔루션(주로 백신 모듈)을 통해서 수행한다. 매우 다양한 방법이 존재한다. 



 1) su 바이너리 탐지   


   - 목록 확인 


/system/bin/su /system/xbin/su /sbin/su /system/su /system/bin/.ext/.su /system/usr/su-backup /system/xbin/mu

  

   - File Search API 를 통해 탐색




 2) 프로세스 리스트 탐지

  

  - ps 명령 혹은 내부 명령 구현을 통해 프로세스 목록 확인




 3) 설치된 패키지 목록 탐지


   - /system/app 폴더에 존재하는 apk 파일 확인 


private static boolean checkRoot() {
        String[] paths = { "/system/app/Superuser.apk", "/system/app/su.apk", "/system/app/Spapasu.apk", etc... };
        for (String path : paths) {
            if (new File(path).exists()) return true;
        }
        return false; }

 

      

   - 패키지 목록 확인 

 $ pm list packages | grep root


 pm list packages | grep root

 package:com.devadvance.rootcloak

 package:com.devadvance.rootcloakplus

 package:com.jrummy.root.browserfree

 package:com.geohot.towelroot




   4) 루팅 카운트 탐지




   5) busybox 및 관련 명령어 탐지




   6) build.tags 확인

 

# cat /system/build.prop | grep ro.build.tags
ro.build.tags=release-keys



   7) 폴더 권한 확인


   루팅 후에는 편의를 위해 쓰기 권한을 추가해서 remount 하고 write 권한을 주는 경우가 있다. 


   다양한 디렉토리들의 쓰기 권한 검증을 수행할 수 있다.

  

/

/data /system /system/bin /system/sbin /system/xbin /vendor/bin /sys /sbin /etc ...


  


 1.2. 루팅 탐지 기법 우회

 

 루팅 탐지를 어떤 방식으로 하는지에 대한 분석이 완료되면 우회는 간단하다. 탐지하는 파일 혹은 폴더 등을 숨기거나 변경하는 방법,


 결과값을 받아온 후 조건에 따른 앱 내부 분기문 코드를 조작하여 리패키징 하는 방법, 후킹을 통해 API 를 조작하는 방법 등이 있다.



 1) 파일 혹은 폴더 변경 




 2) smail 코드 패칭  




 3) 후킹






모바일에만 해당되는 것은 아니지만 최근 HTTPS 사이트 몇군데에서 프록시 툴을 차단하는 경우가 있다.


프록시 툴은 MITM 을 수행하여 자신을 클라이언트로 HTTPS 로 연결한 뒤 클라이언트와 중계해 주는 방식으로 HTTPS 패킷을 


볼 수 있게 해준다. 이러한 프록시를 차단하기 위한 한가지 방법으로 소개된 Certificate Pinning 은 클라이언트 상에서 CA를 검증


하여 자신이 접근해야 할 사이트가 아니면 차단하는 방법으로 구현되어 있다. 


 여기서 가장 큰 문제점은 클라이언트 상에서 구현이 된다는 것이다. 리버싱을 통해 얼마든지 우회가 가능하다는 말이기 때문이다.


방법은 몇가지가 있다.



1) 클라이언트 리버싱 + 코드패칭 

 - 코드 분석 후 리버싱, 리패키징


2) 후킹을 통한 우회

 - 주로 사용되는 통신 API 후킹, 오버라이드

 - iOS /  NSStream, CFStream, NSURLConnection

 - Android / HttpsURLConnection



1번은 코드에 따라 다르니 알아서 우회하면 되고, 2번은 자동화 툴이 공개되어 있다.


- iOS / iOS SSL Kill Switch / https://github.com/iSECPartners/ios-ssl-kill-switch

- Andoid / Android SSL Bypass Tool / https://github.com/iSECPartners/android-ssl-bypass


상세 분석은 다음에~




안드로이드 프로젝트에서 사용되는 폴더 및 파일들에 대한 정리.


무엇이든 정리해 두는 것이 남는 것이다! +_+



[그림1] 안드로이드 프로젝트 기본 폴더



1) src : 실제 작성한 프로그램 코드위치

2) gen : 프로젝트 안의 각종 개체의 ID가 정의된 파일 ( 이클립스가 자동으로 편집, 직접 편집 X)

3) Android 2.2 / Android Dependencies : 안드로이드의 기본 라이브러리

4) asset : 리소스 폴더(비디오, 오디오 파일 등)

5) bin : 안드로이드 실행파일 생성 폴더

6) res-drawable : 프로그램에 사용되는 이미지 폴더

7) res-layout : 프로그램의 레이아웃이 저장된 파일(버튼 배치 등)

8) ress-values-strings.xml : 프로그램 내부 문자열 정의

9) AndroidManifest.xml : 프로그램의 이름, 구성정보 등을 기록. 버튼 등의 이름도 저장

10) Proguard.cfg : 디컴파일 방지 관련 설정



   




+ Recent posts