본문 바로가기
SeSAC/어플리케이션 보안 & 취약점 진단

[SeSAC 성동캠퍼스 1기] 어플리케이션 보안 & 취약점 진단 9, 10일차

by zivvon 2023. 11. 23.
목차 접기

어플리케이션 보안 & 취약점 진단

[Android]

▶ OS 변조 탐지

- SU 명령어 확인

~> 루트 명령어(su) 실행 후 실행 여부 확인

 

- 파일 이름 기반 확인

~> 루팅 시 설치되는 파일 이름을 기반으로 탐지

~> /sbin/su, /system/su, /system/sbin/su, /system/xbin/su, /system/app/Superuser.apk

 

- 시스템 설정 파일 확인

~> 루팅 후 변경이 가능한 시스템 설정 파일 확인

~> ro.ebuggable, service.adb.root

 

▶ 메모리 내 중요 정보 노출

- 이용자 단말기 메모리 영역에서 중요 정보(계정, 카드번호, 계좌)가 평문으로 존재하는 경우

~> Frida-dump

 

▶ 단말기 내 중요정보 저장

- 어플리케이션 사용 폴더 및 외부 저장소에 중요정보 저장 여부 확인

 

- SharedPreferences

~> 어플리케이션 폴더 내 데이터를 파일로 저장

/data/data/[패키지명]/shard_prefs/

 

- SQLite

~> 어플리케이션 폴더 내 데이터베이스 파일로 저장

/data/data/[패키지명]/databases/

 

▶ 화면 강제 실행에 의한 인증단계 우회

- AndroidManifest.xml에 exported 값이 true일 시 가능

- android:exported="true" : 다른 앱이나 시스템에서 해당 서비스 직접 접근 가능

- android:exported="false" : 앱 내부에서만 접근 가능 

adb shell am start -n com.android.insecurebankv2/.ViewStatement

 

▶ 로드된 덱스 확인

- /proc/[pid]/maps에 load된 dex가 보임

- 보안 솔루션 경우 해당 dex를 삭제하기도 함

- adb pull로 해당 파일을 꺼내면 odex 형태

- odex를 smali로 변환해 분석 가능

 

▶ Multiex

- DEX의 사이즈 제한으로 인해 DEX를 동적으로 로드

- File 호출

- Memory 호출

 

▶ ELF(Executable and Linkable Format)

- 안드로이드 Native 영역

- lib 디렉토리 안의 lib[name].so

 

- .text(Code 섹션)에서의 함수 객체 출력

- 각 함수 내에서 GOT 또는 함수로의 호출 관계 표현

~> plt(Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블, 다른 라이브러리 호출 가능

~> got(Global Offset Table) : PLT가 참조하는 테이블, 프로시저들의 주소

 

 

▶ Frida ⭐

- DBI 프레임 워크

- 다양한 플랫폼에서 프로세스에 대한 코드 인젝션이 가능

- JavaScript 통한 확장성 지님 => 컴파일 불필요!

 

- 주요 기능

~> AppMon과 Needle 등의 도구에서 프리다를 기반으로 사용

~> 함수 후킹

~> Application 디버깅 가능

~> Heap 메모리 내 객체 인스턴스 검색 및 사용

~> 실시간 트래픽 스니핑 또는 암호 해독

~> 탈옥 또는 루팅되지 않은 단말기에서도 사용 가능

 

- 주요 도구

  • 프리다에 연결된 프로세스 목록을 출력하기 위한 도구
  • adb에 연결되어 있으면 adb shell ps
frida-ps

 

  • 연결된 디바이스를 출력하는 도구
frida-ls-devices

 

  • 함수 호출을 동적으로 추적하기 위한 도구
frida-trace

 

  • 프로세스를 종료하는 도구
frida-kill

 

 

Frida • A world-class dynamic instrumentation toolkit

Observe and reprogram running programs on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX

frida.re

 

▶ open 함수

- Linux Manual Page 참조

- 특정 파일을 열 때 해당 함수 사용

 

- open.js

~> 해당 어플리케이션이 실행되며 open 함수를 호출 시 아래 코드가 후킹(Hooking)되어 "open()"이라는 로그를 남기고 있음

onEnter(log, args, state){
    log('open()');
},

onleave(log, retval, state){

}

 

 

open(2) - Linux manual page

open(2) — Linux manual page open(2) System Calls Manual open(2) NAME         top open, openat, creat - open and possibly create a file LIBRARY         top Standard C library (libc, -lc) SYNOPSIS         top #include int open(const char *pathn

man7.org

 

▶ Java.perform(function)

- 현재 스레드가 가상머신에 연결되어 있는지 확인하고 function 호출

Java.perform(function () {
  Java.enumerateLoadedClasses({
    onMatch: function (className) {
      console.log(className);
    },

    onComplete: function () {},
  });
});

 

💡 오늘의 실습!

frida 환경 구축
adb push frida-server-16.1.7-android-x86_64 /data/local/tmp/​

 

adb 쉘로 접속
cd /data/local/tmp/​
ls -al
frida 파일 권한이 666인 것을 확인할 수 있다
chmod +x frida-server-16.1.7-android-x86_64​

권한을 777로 바꿔준 것이다! 똑같이 'ls -al' 명령어로 확인해보면 읽고, 쓰고, 실행이 가능하게 바뀐 것을 볼 수 있다


백그라운드에서 frida 서버 돌려주기
./frida-server-16.1.7-android-x86_64 &

서버 잘 붙어있는지 확인하기
ps -ef | grep "frida"

root 단에서 frida 서버가 잘 돌아가고 있는 걸 확인할 수 있다

⚠️
device의 버전을 확인하고 frida 파일을 잘 설치하고 돌려야됨!

 

frida를 이용해 Nox 브라우저 dump 뜨기
python fridump.py -U -s 인터넷​
naver 로그인 후 떠진 dump data들

 

Nox가 가끔 62001 포트 번호로 연결이 안 돼서
' cannot connect to 127.0.0.1:62001: 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다. (10061) '
오류가 뜨는데 이럴 때는!

1. tasklist 명령어로 NoxBoxHandle의 프로세스 ID를 확인하고
tasklist | findstr "Nox"​
여기서 프로세스 ID는 30268!

2. netstat 명령어로 해당 NoxBoxHandled의 port 번호들을 확인한다
netstat -ano | findstr [프로세스 ID]​

3. 리스닝하는 포트 찾아서 연결해주기
adb connect 127.0.0.1:[포트번호]​

 


 

오늘의 후기! :

게임 파일 뜯어서 직접 조작도 해보고! 정말 신기한 경험을 많이 했다.

개발만 해왔던 개구리임이 또 한 번 실감되는 하루였다.

실습이 많아질수록 스트레스도 재미도 배가 되는 중 ㅎㅎ

 

화이팅!