[목차]

 

 

1. 환경 구성

2. 로그인 우회 실습

    # 타깃 1. 비밀번호 검증 로직 우회

    # 타깃 2. Pin 번호 검증 로직 우회 (Brute force)

 

 

 


 

 

1. 환경 구성

 

 

(1) 실습 앱 다운로드

다운로드 경로

https://github.com/as0ler/Android-Examples/blob/master/sieve.apk

 

 

들어가서 View raw나

Download 버튼 클릭

 

 

(2) 앱 설치 및 실행 테스트

adb로 설치 후

 

앱을 실행해 주고

 

 

데이터 입력 후 저장!

 

환경 구성 완료!

 

 

 

 

 

2. 로그인 우회 실습

 

 

우선 잘못된 비밀번호

 

그리고 잘못된 핀 번호 입력 시

 

The password is incorrect

라는 에러 메시지가 나오는데

이 두 구간을 모두 우회해 본다.

 

 

 


 

 

# 타깃 1. 비밀번호 검증 로직 우회

 

(1) 힌트 찾기

위에서 찾은 키워드로 검색 시

마땅한게 안 나옴

 

 

이럴 땐

리소스 > AndroidManifest.xml 파일 내

패키지 이름을 확인 후

 

 

 

패키지 메인 클래스에서

관련 메서드를 유추

 

 

의심 가는 메서드가 어디서 호출되는지 확인

 

 

해당 클래스들을 살펴보면서

어느 부분을 후킹 할지

고민해 본다.

 

MainLoginActivity - 비밀번호 우회 포인트

ShorLoginActivity - Pin 우회 포인트

 

 

 

 

(2) 후킹 포인트 확인

MainLoginActivity 클래스 내

checkkeyResult 메서드를 후킹 해

항상 True가 반환되어

loginSuccessful이 되도록

재작성해본다.

 

 

 

(3) 코드 작성

setImmediate(function(){
	Java.perform(function(){
		var login_bypass = Java.use("com.mwr.example.sieve.MainLoginActivity");
		login_bypass.checkKeyResult.implementation = function(arg){ // 인자값 하나 받고 있음 checkKeyResult(boolean status)
			console.log("\n[+] 로그인 우회 성공!\n");
			this.checkKeyResult(true);  // checkKeyResult의 기존 조건 분기 로직을 그대로 동작시키면서 무조건 true로 빠지도록!
		}
    })
})
 

 

돌린 뒤

 

 

아무 값이나 넣어주고 Sign in을 시도하면

 

 

로그인 우회에 성공!

정상 접속 완료!

 

 

 

 

 

# 타깃 2. Pin 번호 검증 로직 우회

 

 

 

(1) 후킹 포인트 확인

 

이용자가 입력한 값이

this.serviceConnection.checkPin

안에 들어가니 해당 로직이 있는

submit 메서드를 후킹, 재작성하고

 

Pin은 4 자리로 이루어져 있으니

0000~9999까지 brute force

공격으로 넣어보면 된다.

(실습에서는 1000~3333번 사이로 진행)

 

 

checkPin이 인자로 받고 있는 데이터는

 

String 값이고 우리가 넣는 값은

Int 형이니, 해당 값을 String으로

바꿔 보내야 한다.

 

 

 

 

 

(2) 코드 작성

setImmediate(function(){
	Java.perform(function(){
		function padToFour(number){
			if(number<=3333){
				number = ("000" + number).slice(-4);
				return String(number);
			}
		}
		var pin_bypass = Java.use("com.mwr.example.sieve.ShortLoginActivity"); // 클래스에 대한 객체를 사용한다!
		pin_bypass.submit.implementation = function(arg){ // submit 메서드는 인자 하나만 받고 있음 submit(View view)
			var service = this.serviceConnection.value; // this.service.Connection.checkPin(this.workingPin); 라인을 가져다 쓴다
			for(var i=1000; i<3333; i++){
				//i = String(i);
				service.checkPin(padToFour(i));
				console.log("\n[+] BruteForce:" + padToFour(i)); 
			}	
		}	
	})
})
 

 

돌려준 뒤

 

아무 값이나 넣어주면

 

 

맞는 번호가 포함되어 돌아가면서

정상 접속된다!

 

에러는 앱에 부하가 발생해

생기는 문제라 무시하고

 

해결 완료!

 

728x90

+ Recent posts