https://blog.ropnop.com/configuring-burp-suite-with-android-nougat/

 

Configuring Burp Suite With Android Nougat

Android Nougat changed the default behavior for apps, so installing the Burp CA to user certs no longer works. Here’s two ways to bypass it

blog.ropnop.com

 

https://blog.nviso.be/2017/12/22/intercepting-https-traffic-from-apps-on-android-7-using-magisk-burp/ 

 

Intercepting HTTPS Traffic from Apps on Android 7+ using Magisk & Burp

Intercepting HTTPS traffic is a necessity with any mobile security assessment. By adding a custom CA to Android, this can easily be done. As of Android Nougat, however, apps don’t trust clien…

blog.nviso.eu

 

1. 인증서 변환

$ openssl x509 -inform DER -in cacert.der -out burpca.pem

$ openssl x509 -inform PEM -subject_hash_old -in burpca.pem

$ mv burpca.pem 9a5ba575.0

-- 휴대폰으로 복사는 알아서.

 

2. 갤럭시노트8 ( 안드로이드 9 ) 설정

# mount -o remount,rw /system

# cd /system/etc/security/cacerts

# cp /sdcard/Download/9a5ba575.0 ./

# chmod 644 9a5ba575.0

 

 

3. 샤오미 Mi 9 SE ( 안드로이드 10) 설정

- https://github.com/NVISOsecurity/MagiskTrustUserCerts   모듈 설치 후

 

GitHub - NVISOsecurity/MagiskTrustUserCerts: A Magisk module that automatically adds user certificates to the system root CA sto

A Magisk module that automatically adds user certificates to the system root CA store - GitHub - NVISOsecurity/MagiskTrustUserCerts: A Magisk module that automatically adds user certificates to the...

github.com

# cd /data/misc/user/0/cacerts-added

# cp /sdcard/Download/9a5ba575.0 ./

 

'Security > Mobile' 카테고리의 다른 글

[iPhone/iOS] [더한섬닷컴] 탈옥안했는데 탈옥알림  (2) 2022.02.14
Android WebView 디버깅  (0) 2020.02.25
AntiDebug  (0) 2019.03.26

1. 서론

와이프가 아이폰을 쓰는데 한섬 애용자..

더한섬닷컴 앱을 잘 이용하다가 어느날 아래의 사진과 같이 "탈옥된 기기에서 사용할 수 없습니다." 메시지와 함께 사용할 수 없었음.

더한섬닷컴

 

와이프가 나름 노력한다고..

1) 한섬에 탈옥안했는데 탈옥된 메시지가 뜨는데 어떻게 하면 되냐고 문의글 남겼으나, 해결하지 못함.

2) 애플 A/S 센터가서 문의했으나, 해결하지 못함.

   (이건 하드웨어 지점을 방문했다함.. 소프트웨어는 애플 고객센터에 전화해야한다고..)

 

그래서 어쩔 수 없이 리서치를 시작함..

2. 생각정리

여러가지 탈옥탐지 룰이 있겠지만, 먼저 생각을 정리

1) 실제로 탈옥을 하지 않았기 때문에 오탐일거라고 판단함.

2) 오탐이라면 일반앱을 탈옥앱으로 판단했을거라고 가정함.

3) 그 외적인 sshd 파일이 있는지 root 권한이 있는지 등등은 불필요하니까 제외.

 

3. 테스트

한섬 앱의 ipa를 디컴파일하기 전에 ipa 압출풀고 cydia 문자열을 검색해봄.

Info.plist에 cydia 문자열 확인

 

cydia 문자열이 Info.plist에 있음을 확인했고, 내용을 살펴봄.

LSApplicationQueriesSchemes의 리스트

 

LSApplicationQueriesSchemes의 하위에 등록되어 있고 해당 메서드는 다른 앱을 실행할 수 있는 스킴을 등록한 것.

- 자세한 것은 구글을 검색하세염 >.<

저 부분을 보고, 더한섬닷컴 앱의 탈옥 탐지로직 중에 하나가 cydia 스킴을 호출하여 반응여부를 보고 판단할 거라고 생각함.

 

3.1 사파리 브라우저에서 스킴호출 시도

브라우저에서 URL 입력창에 "cydia://package/com.example.package.com" 을 입력 후 엔터를 누르면 스킴을 호출 함.

cydia 스킴 호출

 

"cydia" 이름의 커스텀 스킴을 쓰는 앱이 실행됨.

cydia 커스텀 스킴의 반응

 

cydia 커스텀 스킴으로 실행

 

범인은 UBpay(유비페이) !!!!!

 

3.2 유비페이 삭제 후 더한섬닷컴 실행 확인

유비페이 앱을 삭제 후 한섬 앱을 실행해봤다.

유비페이 삭제

 

한섬 실행 확인

 

와이프의 환호성.. ㅋㅋ

이걸 어느앱의 잘못이라고 해야하는지.. 암튼 해결... 

'Security > Mobile' 카테고리의 다른 글

안드로이드 7.0이상 버프 인증서 디바이스 설치  (0) 2023.04.04
Android WebView 디버깅  (0) 2020.02.25
AntiDebug  (0) 2019.03.26

 

 서버로 XML 데이터가 넘어갈 때, 기존 XXE 공격 벡터와 함께 아래의 XInclude 공격 벡터도 활용가능.
 사용자 입력값으로 DOCTYPE element를 제어할 수 없어서 기존의 XXE 공격벡터들이 통하지 않고, 벡엔드에서 SOAP가 사용될 때 유효한 공격 벡터

 

<foo xmlns:xi="www.w3.org/2001/XInclude">

<xi:include parse="text" href="file:///etc/passwd"/></foo> 

자꾸 까먹어서 기록.. 

 

아래의 설정이 셋팅된 웹뷰는 구글크롬에서 webview 디버깅이 가능하다.

WebView.setWebContentsDebuggingEnabled(true)

 

휴대폰 설정에 USB 디버깅은 켜고 PC와 연결 후 

구글 크롬 주소창에 "chrome://inspect/"를 입력한다.

 

inspect 가능한 디바이스 목록이 뜨고 inspect를 클릭하면 아래와 같이 크롬 브라우저의 개발자도구와 비슷한 UI에서 디버깅이 가능하다.

1. 목적

본 문서는 Anti-Debugging 기능 중 Attach 선점을 이용한 구현 방법에 대해서 설명합니다.

 

2. 원리

A 프로세스가 B프로세스를 Attach를 먼저 수행하였다면 Detach되기 전까지, C프로세스는 B프로세스를 Attach 할 수 없다.

 

3. Self Attach

 ptrace 함수 호출 시 PTRACE_TRACEME를 전달하여 자기 자신한테 Attach를 적용

A. 필요조건

  • 부모프로세스와 동일한 UID, GID를 가지고 있을 경우
  • 부모프로세스가 CAP_SYS_PTRACE를 가지고 있을 경우

 

B. 예시코드

void anti_debug() {
    long ptrace_status = ptrace(PTRACE_TRACEME, 0, 0, 0);
}

 

C. Android에서 사용불가능한 이유

Android는 zygote가 루트가 아닌 unconfined로 실행되며 CAP_SYS_PTRACE가 설정되어 있습니다.

그래서 Android 4.3까지는 zygote의 하위 프로세스가 Self Attach가 가능했었으나, 

Android 4.4부터는 SELinux가 적용되면서 CAP_SYS_PTRACE 기능이 제한되어 Self Attach를 할 수 없습니다.

 
 

4. Attach from child 

자식프로세스를 생성 후 자식프로세스가 부모프로세스에게 Attach를 적용

A. 필요조건

    부모프로세스가 디버깅 가능한 상태일 경우
    • 앱 Release 빌드의 경우 : 기본값이 Debuggable이 false로 셋팅되므로, ptrace 호출 전 prctl 함수를 이용하여  덤프가능한 상태로 변경 필요.
    • 앱 Debug 빌드의 경우 : 기본값이 Debuggable이 true로 셋팅되므로 추가 작업은 필요없으나, JDWP이 가능한 상태로 권장하지 않음.

B. 예시코드

#include <jni.h>
#include <string>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/prctl.h>
#include <sys/types.h>
#include <pthread.h>
#include <sys/wait.h>
#include <android/log.h>
 
 
#define  LOG_TAG    "LEE_NDK"
#define  LOGUNK(...)  __android_log_print(ANDROID_LOG_UNKNOWN,LOG_TAG,__VA_ARGS__)
#define  LOGDEF(...)  __android_log_print(ANDROID_LOG_DEFAULT,LOG_TAG,__VA_ARGS__)
#define  LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define  LOGF(...)  __android_log_print(ANDROID_FATAL_ERROR,LOG_TAG,__VA_ARGS__)
#define  LOGS(...)  __android_log_print(ANDROID_SILENT_ERROR,LOG_TAG,__VA_ARGS__)
 
static int child_pid = -2;
static int ptrace_status;
 
//c++11에서는 void *monitor_pid(void *args)
void *monitor_pid(void *) {
    int status;
    waitpid(child_pid, &status, 0);
    /* Child status should never change. */
    _exit(0);
}
 
int anti_debug() {
    if (child_pid == -2) {
        int status_prctl = prctl(PR_SET_DUMPABLE, 1);
        LOGI("status_prctl 상태: %d", status_prctl);
        child_pid = fork();
    }
    if (child_pid == 0) {
        int status;
        pid_t ppid = getppid();
        ptrace_status = ptrace(PTRACE_ATTACH, ppid, 0, 0);
        LOGI("ptrace_status 상태: %d", ptrace_status);
        if (ptrace_status == 0) {
            // 로그 변경 해야함. //
            LOGI("부모프로세스 Attach 성공");
            int waitpid_status = waitpid(ppid, &status, 0);
            LOGI("waitpid : %d", waitpid_status);
            ptrace(PTRACE_CONT, ppid, NULL, NULL);
            while (waitpid(ppid, &status, 0)) {
                if (WIFSTOPPED(status)) {
                    ptrace(PTRACE_CONT, ppid, NULL, NULL);
                } else {
                    LOGI("Ptrace Exit");
                    _exit(0);
                }
            }
        }
        else {
            // ptrace 실패 시 처리 코드 삽입 //
        }
    }
    else {
        pthread_t t;
        pthread_create(&t, NULL, monitor_pid, (void *) NULL);
    }
    if ((child_pid > 0) && (ptrace_status == 0))
        return 0;
    return -1;
}
 
extern "C"
JNIEXPORT void JNICALL Java_kamos_kakao_com_antidebugging_MainActivity_antidebug
        (JNIEnv *env, jobject /* this */) {
    anti_debug();
}
  • 성능 : 디바이스의 성능에 따라 다를 수 있으나, 빠른 응답이 필요한 서비스의 경우 속도 하향이 발생할 수 있음.

 

5. ToDO

  • 다른 프로세스가 선점했을 때 처리 부분 반영 필요
  • 단순히 libc.so에 내장된 ptrace 함수를 사용할 경우 비교적 우호
  • so 파일을 디컴파일 했을 때 쉬운 코드 분석이 가능한 점

 

 

+ Recent posts