IoT Hacking Basic

이동화·2025년 7월 14일

Android Platform Architecture

안드로이드 운영체제의 아키텍처는 각 계층마다 서로 다른 기능과 사용자 인터페이스 수준을 제공한다.

  • System Apps

    • Android OS에 기본으로 내장된 앱
    • 사용자가 직접 사용하는 부분
  • Java API Framework

    • 앱 개발자가 사용하는 계층
    • ActivityManager같은 Manager classContent Provider, View System 등이 존재
  • Native C/C++ Libraries

    • Android 기능을 위한 핵심 라이브러리
    • WebKit은 웹 콘텐츠 렌더링, Media Framework는 오디오/비디오 처리 등
    • runtime과 함께 앱 실행을 위한 기반 시스템 기능을 제공
  • Android Runtime

    • Android 앱을 실행하는 환경(엔진)으로, 실행 중 필요한 기능을 제공하는 시스템이다. java bytecode를 컴파일하여 DEX 파일을 만들고 실행한다. 컴파일 시점에 따라 JIT와 AOT로 나누며, 최근은 JIT와 AOT 두 방식을 섞어 사용
    • ART : Ahead-of-Time 컴파일 (앱 설치 시 컴파일)을 통해 메모리 사용량이 증가하지만 실행 속도가 빠름
    • Dalvik VM : Just-In-Time 컴파일 (앱 실행 중 컴파일)을 통해 메모리를 절약할 수 있으나 속도는 조금 느림
  • Hardware Abstraction Layer

    • 하드웨어와 상위 계층 간의 인터페이스 역할
    • 카메라, 오디오 등의 기능을 표준화된 방식으로 접근할 수 있게 해준다.
  • Linux Kernel

    • Android의 핵심 기반 계층으로, 하드웨어와 가장 가까운 수준에서 동작한다.
    • 드라이버(I/O, display, WiFi 등)를 통해 하드웨어를 제어하고 관리한다.
    • IPC (프로세스 간 통신), 전원 관리, 메모리 관리 등 핵심 시스템 서비스를 제공한다.

Android

APK

  • Android 앱을 배포하고 설치할 수 있는 패키지 파일로, zip 형식으로 압축되어 있다.
  • assets/ : 앱을 실행할 때 필요한 정적 자원 중 큰 파일(동영상, 폰트 등)을 관리하는 폴더
  • res/ : 앱을 실행할 때 필요한 자원 중 작은 파일(이미지 등)을 관리하는 폴더
  • META-INF/ : 인증 서명과 관련한 정보(APK 서명, 인증서)가 담긴 폴더
  • lib/ : 라이브러리 파일(*.so)이 들어있는 폴더
  • AndroidManifest.xml : 앱의 기본 정보, 접근 권한, 버전, activity 등이 적힌 파일
  • resources.arsc : res에 대한 세부 정보가(문자열, 리소스 인덱스) 담긴 파일
  • class.dex : bytecode로 변환된 핵심 실행 파일(.dex)

기본 파일 시스템 구조

Android는 linux 기반이라 root 디렉토리를 기준으로 하위 디렉토리가 존재한다.

  • /system : Android OS의 핵심 파일들이 있는 영역
    (bin, app, framework, lib 등)
  • /data : 사용자 데이터를 저장하는 곳 (app, cache, user)
  • /proc : 실행 중인 프로세스나 시스템 정보를 저장하는 가상 파일 시스템
  • /sys : kernel이 장치 트리, 드라이버, 전원 상태를 노출하는 가상 디렉토리
  • /dev, /sbin, /etc, /root, /tmp 등 전통적인 linux 계층 구조를 이루고 있으며, 일반 앱은 /data/data 디렉토리 안에서만 동작 가능하다. (나머지는 root 권한 필요)

Activity

앱의 화면 하나를 나타내는 컴포넌트

  • Activity Life Cycle
    • 최초로 실행되는 activity는 onCreate ,onStart ,onResume 함수를 실행하며 화면을 출력
    • 클릭, 다른 앱 실행 등으로 다른 activity 를 실행하면 onPause ,onStop 함수 등으로 기존의 activity가 중지 혹은 종료됨. 다시 기존 activity로 돌아오면 onRestart 함수를 실행.
    • activity가 완전 종료될 경우 onDestroy 함수로 스택에서 완전히 삭제함.
  • AndroidManifest.xml에 선언되어 있어야 한다.
  • Intent를 통해 서로 이동할 수 있음.

정적 분석

  • APK 분석 및 Native library 분석
  • decompiler : dex2jar, jdx
  • disassembler : smali (금융 관련 앱은 난독화가 되어 있어 bytecode를 분석)
  • AndroidManifest.xml : 앱의 핵심 정보를 담고 있다.
    • pkg 이름 : 앱을 식별할 때 필요한 정보
    • activity : 앱 실행 시 볼 수 있는, 사용자와 상호작용이 가능한 화면 (일종의 class)
    • 외부 라이브러리 정보 및 필요한 권한이 정의되어 있음
    • binary라 apktool 등의 도구로 읽을 수 있게 변환해야 함.

동적 분석

  • Rooting : 파일 시스템의 루트 권한을 획득하는것
  • Emulator : bluestack, Nox 등
  • Hooking : frida

여러 취약점

  • Data Leak : 자동 로그인과 같이 앱/디바이스 저장소 내부에 credential (id, pw, API key 등)을 평문으로 저장하는 경우 데이터가 유출될 수 있음. 디버깅 용 log 코드를 지우지 않거나, 소스 코드 내 하드 코딩 되어있는 credential를 지우지 않은 경우가 이에 해당된다.

  • AWS Cognito : 웹 및 모바일 앱에 대한 인증 및 권한 부여 기능을 제공하는 서비스로, 사용자 풀(User pool)과 자격 증명 풀(Identity pool)로 구성되어 있다.

    • user pool은 cognito에 가입한 사용자에 대한 정보를 저장하는 DB로, 사용자의 로그인 요청을 통해 인증 받으면 사용자에게 JWT 토큰을 반환한다.
    • identity pool은 사용자의 임시 AWS 자격 증명을 만들어 S3, DynamoDB 등 다른 AWS 서비스에 대해 접근 권한을 부여한다.
    • 이 경우 Identity pool ID가 HTTP 트래픽이나, 소스 코드, 리소스에서 발견될 경우 문제가 된다. enumerate-iam 도구를 통해 획득한 credential의 권한을 확인하여 악용할 수 있다.
  • Deep Link : 특정 링크를 클릭했을 때 모바일 앱의 기능(activity)이 실행되게 하는 기술

    • Manifest 파일에 <intent-filter> 를 추가해서 설정할 수 있는 기능이다.
      <activity android:name=".ProductDetailActivity">
          <intent-filter>
              <action android:name="android.intent.action.VIEW"/>
              <category android:name="android.intent.category.DEFAULT"/>
              <category android:name="android.intent.category.BROWSABLE"/>
              <data
                  android:scheme="https"
                  android:host="example.com"
                  android:pathPrefix="/product/" />
          </intent-filter>
      </activity>
      
      사용자가 링크를 클릭하면 필터와 URL을 비교하고, 일치하는 경우 특정 activity를 실행한다 URL 검증이 미흡하거나, HOST 검증이 미흡하면 이를 악용하여 XSS 공격, 세션/토큰 탈취, Phising Page로 redirect하는 등 공격이 가능하고, 사용자가 신뢰할 수 있는 앱을 믿고 입력한 credential이 공격자한테 전송이 될 수 있다.
  • Broadcast receiver 취약점

    • Broadcast Reciever : Android 시스템 또는 다른 앱에서 발생한 특정 이벤트를 감지하고 반응하는 컴포넌트. 충전 중, 부팅 완료, 네트워크 상태 변경 같은 이벤트를 감지하고, 앱에 전달한다.

    • manifest 파일에서 exported=“true” 이 설정되어 있으면 리시버는 외부 앱에서 직접 호출이 가능하게 된다. 이 때, 특정 리시버가 외부 Intent를 받을 수 있게 설정되어 있으면 특정 피싱 URL이 포함된 intent를 전송하여 공격할 수 있다.

    • 특정한 컴포넌트를 명확히 지정하여 호출하지 않고, 암시적 intent로 조건에 맞는 모든 앱에 intent를 보내게 되면 사용자가 그 중 선택하도록 되어 있다. 그러나 이 앱 중 공격자가 개발한 악성 앱이 있을 경우 intent에 사용자의 credential이 있으면 이것이봇 가로채질 수 있다.

  • Intent Redirection : 외부에서 실행할 수 없는 activity (exported=”false”)가 있어 특정 앱에서만 실행할 수 있도록 되어 있는 경우, intent를 전달받아 activity를 실행하는 코드가 있을 때

  • Content Provider : Android 앱이 어떤 데이터, 파일 리소스에 접근할 수 있도록 해주는 컴포넌트

    이 때 exported=”true”로 설정되어 있으면 다른 앱에서도 접근이 가능함.

iOS

IPA (iOS App store Package)

iOS 앱을 배포하고 설치할 수 있는 패키지 파일

  • Payload/ : 앱의 데이터가 포함되어 있는 폴더. {appname}.app 가 있음.
  • iTunesArtwork : 앱 아이콘이 512px 크기의 png파일 형태로 들어가 있음.
  • iTunesMetadata.plist : 개발자 이름, ID, 저작권 정보 등 기본 정보가 들어가 있음.

Container

ipa를 설치하면 세 개의 주요 컨테이너에 나뉘어 설치된다

  • Bundle Container : 앱의 실행 파일 및 리소스를 저장하는 폴더
    • 수정 불가능한 read-only의 영역으로, 정적 파일들이 저장된다.
    • 핵심 실행 파일과 앱에서 추가로 사용하는 리소스 파일과 앱의 설정 정보 (권한, bundle ID)가 저장된 Info.plist 파일이 존재함.
    • Plist (property list) : 앱 속성, 설정 데이터들이 저장되어 있는 파일로, xml format 또는 binary format으로 작성되어 있음. (binary→xml로 바꾸는 plutil과 같은 도구 필요)
      • NSAppTransportSecurity (ATS) : HTTP 통신을 허용하는지 설정하는 옵션
      • CFBundleExecutable : 앱 실행 바이너리 파일 이름
      • CFBundleIdentifier : 앱 식별자
  • Data Container : 앱이 실행 중에 생성하는 데이터를 저장하는 폴더
    • Documents/ : 사용자가 생성한 콘텐츠 및 오프라인 데이터를 영구적으로 저장하는 폴더. 다른 앱과 상호작용 할 때는 Inbox 하위 디렉토리에 저장되기도 한다.
    • Library/ : 앱 실행 시 사용하는 데이터가 저장된 폴더로, 캐시 데이터, 사용자 정보가 담긴 Preferences/ 폴더 등이 존재한다.
    • tmp/ : 앱 종료 시 OS가 자동으로 삭제하는 임시 파일들이 저장되는 폴더이다.
  • iCloud Container : Apple이 제공하는 클라우드 스토리지 서비스인 iCloud를 사용하는 앱을 위해 만들어진 컨테이너로, 파일은 사용자가 접근 가능한 Documents 와 앱 내부에 저장되는 Data 로 나뉘어 저장된다.

App Delegate
iOS 앱의 실행 상태를 관리하고 시스템 이벤트를 처리하는 핵심 객체

  • iOS 앱이 실행되면 main 함수에서 앱의 전반적인 실행 상태를 관리하는 UIApplication 객체를 생성하고, App Delegate가 이벤트를 수신 및 처리함
  • application:WillFinishLaunchingWithOptions (앱 최초 실행될 때 호출되는 메서드)와 같이 delegate에 정의되어 있는 프로토콜
  • iOS 앱의 생명 주기는 실행 중일 때 화면에 표시 중인 Foreground 상태에서 사용자 입력을 받지 않는 Inactive와 받는 Active 상태를 오간다.
  • 앱이 화면에 보이지 않으면 Background 상태, CPU 리소스를 사용하지 않으면 Suspend 상태이다.

iOS 보안

  • 안드로이드만큼 자체 취약점이 많지 않다. iOS 운영 체제의 보안 기능이 뛰어나 악성 앱을 활용하기 쉽지 않다.

  • 대부분의 iOS 취약점은 대부분 Android에서도 발생한다.

  • Credential Hardcoding : 소스 코드, 리소스 내에 credential을 하드 코딩 하면 취약

  • URL Scheme Vulnerability : URL을 통해 앱을 실행할 수 있는 기능으로, deep link와 비슷함

  • UIWebView : js를 활용한 웹 해킹 공격에 취약 (XSS)

  • Client 측 인증 우회 : 사용자 측에서 앱의 로직을 통한 인증만 구현했으면, 공격자들은 이를 쉽게 우회할 수 있음 (FRIDA 등). 인증의 경우 서버 측에서 검증이 필요함

  • iOS 앱에는 사전 할당 권한이 없고, 앱이 최초로 민감한 API를 사용 시도 시 권한 부여하라는 메시지를 사용자에서 출력한다. 권한이 부여된 앱은 설정 내 Privacy 메뉴에서 앱 별로 수정할 수 있다.

Mobile Solution

앱 분석을 어렵게 만들어서 공격자로부터 보호하려는 목적으로 사용되는 방법

Rooting 탐지 (Detection)

  • 루팅 앱 패키지 확인 (.su, .oneclickroot, .magisk 등)
  • 루팅 관련 파일 확인 (su, busybox 등 다양한 경로 탐색)
  • 시스템 무결성 검사 (build.prop 변조 여부 확인)
  • 시스템 디렉토리 권한 변경 감지 (RW 권한 체크)
  • 앱 실행 시 바로 실행되는 activity나, method를 apk에서 찾아 후킹을 통해 우회 가능

무결성 검증

  • 앱이 변조되었는지 확인하여 악의적으로 패치된 앱의 실행과 유포를 방지
  • 파일 해시 값을 비교하거나, dex 파일을 암호화 후 저장하여 app 실행 시 해당 파일을 복호화하여 로딩하는 것으로 확인
  • 서버 기반으로 검사하면 통신 데이터를 가로채는 방법으로, 클라이언트 기반으로 검사하면 후킹을 통해 검증 로직을 우회하여 무결성 검증을 무력화할 수 있다.

Anti Debugging

  • 디버거가 보호하려는 앱 프로세스에 attach 하는 것을 막는 것으로, 디버거의 존재를 확인했을 경우 해당 프로세스가 동작하지 못하도록 막는 것이다.
  • 시간 기반 탐지 : 두 명령어 (asm) 사이의 실행 시간이 일정 시간보다 크면 디버깅 중인 것으로 판단하는 방법
  • 파일 기반 탐지
    • /proc/pid/statusTracerPid != 0(디버깅 중이면 pid가 적혀있음)
    • /proc/pid/task/status 의 중괄호 뒤에 t 가 적힌 경우
    • wchan 파일 내 ptrace_stop가 존재하는 경우
    • 그러나 전부 후킹 및 코드 패치로 무력화가 가능
  • VM 필드를 이용한 탐지 : Android Java VM 구조체에 있는 여러 정보 중에는 디버깅 상태 정보가 있음. isDebuggerConnected 메서드가 대표적이다.
  • ptrace를 이용한 안티 디버깅 : 프로세스 당 디버거는 하나만 붙을 수 있기 때문에 ptrace 함수를 이용해 먼저 선점하는 방법
  • BP scan : 디버깅 시 bp 설정 후 디버깅 하여, 현재 코드 영역에 bp가 설치되었는지 스캔 후 탐지
  • 코드 패치, 함수 후킹으로 우회가 가능

SSL Pinning

  • 앱에서 SSL/TLS통신 시 사용하는 인증서를 고정하는 경우가 존재한다. 앱이 특정 인증서만 신뢰하는 것이기에 proxy 앱 사용을 차단하여 MITM 공격이 불가능하다.
  • 근데 frida 이용해도 우회 가능, 앱 중에서 xposed framework을 깔아서 활용해도 됨

iOS의 경우

  • Apple의 폐쇄적인 정책으로 개발자들의 기능들도 많이 제한 되어 있다.
  • Jailbreak 탐지
    • fileExistsPath ,fopen 함수를 활용하여 Cydia, shell(/bin/bash) 여부 등을 확인하여 탈옥 여부를 확인 가능 (iOS는 기본적으로 쉘이 없음)
    • Sanbox 체크 : 탈옥 시 기기에서 앱이 Sandbox 기능을 사용할 수 없던 기능을 쓸 수 있게 되어 (권한 이상의 파일 w/r) 탈옥 여부를 확인 가능
    • URL Scheme 체크 : Cydia 앱이 설치되면 URL Scheme을 등록하게 되는데, canOpenURL 함수 등으로 URL이 실행이 되면 (cydia:// 등) 현재 환경이 탈옥 상태임을 알 수 있음
  • iOS는 XNU 커널 위에서 돌아가고, ptracesysctl 함수 등으로 안티 디버깅 가능

정적 분석

  • OTA URL 또는 app store에서 jailbreak 단말로 IPA 파일 설치
    이후 IPA 파일을 복호화 (frida-ios-dump), (clutch)
  • APP 바이너리 분석
    • 단순 분석 : class-dump
    • reverse engineering : IDA, ghidra
    • objective C, swift : 기존의 reverse engineering에 비해 조금 까다로움

동적 분석

  • jailbreaking : root access to the file system
  • apple에서 서명하지 않은 응용 프로그램을 실행
  • debugging과 dynamic analysis 가능
  • access to the objective-c or swift runtime
profile
notion이 나은듯

0개의 댓글