![[붉은외계인] Mobile - OWASP UnCrackable L1](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVZovA%2FbtsFoERcTb0%2FhBx7XAPhmE5MDkXMjq0Tek%2Fimg.png)
Frida 연습을 위하여, OWASP에서 래퍼런스로 제공하는 UnCrackable Level 1을 풀어보았다
OWASP에서는 래퍼런스로 Android, iOS 상당히 많은 앱을 제공하고 있고, 앱 외에도 해킹 도구라던지
각종 좋은 정보들을 제공하고 있다
아래 링크를 첨부할테니, 꼭 한번씩 들어가보길 바란다
https://mas.owasp.org/MASTG/apps/
Reference applications - OWASP Mobile Application Security
Reference applications The applications listed below can be used as training materials. Note: only the MASTG apps and Crackmes are tested and maintained by the MAS project. Android Apps Ios Apps
mas.owasp.org
설치 및 실행
설치를 한 후, 실행을 하면 위와 같이 Rooting 감지를 하며 종료가 된다
참고로, Android 9(64bit) 환경에서는 해당 앱의 Rooting 감지가 안된다
필자는 Android 5에서 실행한 결과, 성공적으로 Rooting 감지를 확인하였다
공부를 위해서는 Android 5 환경에서 설치 및 실행하길 바란다
Rooting 우회
가장 먼저, Frida를 사용하여 Rooting을 우회해보겠다
jadx를 통해 확인해보면, 앱이 onCreate 될 때, c.a(), c.b(), c.c()를 실행하는것을 확인할 수 있다
해당 메소드를 확인해보면 환경변수를 가져와 체크하는 a()
빌드 태그를 체크하는 b()
루팅 여부를 확인하는 c()
조건이 충족된다면 True를 반환하면서, MainActivity의 a() 메소드를 실행하면서 앱이 종료된다
루팅을 우회하기 위해서는 위의 3개 메소드를 return false로 만들면 된다
Frida를 사용하여, 해당 코드를 구현하면 아래와 같다
Java.perform(function(){
console.warn("[+] Frida Start ...");
let Acvtivity = Java.use("sg.vantagepoint.a.c")
Acvtivity.a.implementation = function(){return false}
Acvtivity.b.implementation = function(){return false}
Acvtivity.c.implementation = function(){return false}
console.warn("[+] Done !");
})
코드를 실행하면, 위의 그림과 같이 성공적으로 우회한 것을 확인할 수 있다
우회에 성공하면 특정 String을 입력하라는 폼이 나오는데, 아무거나 입력해보면
위의 그림과 같은 경고창이 뜬다 다시 jadx를 통해서 확인해보자
분석
사용자가 입력폼에 입력한 텍스트 값을 a.a()메소드의 Argument로 주고있다
a()메소드를 살펴보면 사용자 입력값과 특정 문자열을 다른 패키지 a()메소드의 Argument로 주고있다
a() 메소드를 살펴보면 위와 같다
메소드의 동작을 요약하자면
bArr을 Key로 설정하고, AES 알고리즘의 ECB 모드를 사용하여 bArr2 데이터를 해독한다
해독이 성공하면 해독 문자열을 반환하고, 해당 반환값이
uncrackable1.a.a() 메소드의 str.equals(new String(bArr));의 bArr로 들어간다
그리고 사용자 입력값인 str과 같은지 비교하여, True/False를 반환한다
여기서 해당 앱의 성공 포인트를 정리하면 아래와 같다
◆ Frida를 사용하여 uncrackable1.a.a() 메소드가 True를 반환하게 하기
◆ Frida를 사용하여 sg.vantagepoint.a.a.a()메소드가 해독하여 반환하는 Return값을 찾아내어 직접 사용자 입력폼에 입력하기
다음으로, 각 포인트에 맞는 코드를 짜보자
풀이 방법 1
Java.perform(function(){
console.warn("[+] Frida Start ...");
let Activity = Java.use("sg.vantagepoint.a.c")
Activity.a.implementation = function(){return false}
Activity.b.implementation = function(){return false}
Activity.c.implementation = function(){return false}
let Acvtivity = Java.use("sg.vantagepoint.uncrackable1.a")
Acvtivity.a.implementation = function(){return true}
console.warn("[+] Done !");
})
해당 코드를 실행시키면, 어떤 문자열을 입력하든 위의 그림과 같이 Success가 뜬다
출제자가 의도한 것은 아니겠지만 어쨌든, 위 방법은 경험상 굉장히 유용했으니 알아두면 좋다
풀이 방법 2
function arrayToStr(arr){
let result = ""
for(let i=0; i < arr.length; i++){
result += String.fromCharCode(arr[i])
}
return result
}
setImmediate(function(){
Java.perform(function(){
console.warn("[+] Frida Start ...");
let Activity = Java.use("sg.vantagepoint.a.c")
Activity.a.implementation = function(){return false}
Activity.b.implementation = function(){return false}
Activity.c.implementation = function(){return false}
let Activity2 = Java.use("sg.vantagepoint.a.a")
Activity2.a.implementation = function(b1,b2){
console.warn(`Function Parameter : ${b1}, ${b2}`);
let result = this.a(b1, b2)
console.warn(`Function Return Value : ${ arrayToStr(result)}`);
return result
}
console.warn("[+] Done !");
})
})
위의 코드를 실행 후, 프롬포트를 살펴보면
sg.vantagepoint.a.a.a()메소드가 해독하여 반환하는 Return값을 알 수 있다
바로 I want to believe이다
입력하면 Success 가 뜨는 것을 확인할 수 있다
마무리
해당 앱을 해결하는 과정 동안 정말 재미있었다
다음에는 UnCrackable L2를 풀어볼 것이다 :)
끝 ~
'Security > Mobile' 카테고리의 다른 글
[붉은외계인] Mobile - OWASP UnCrackable L3 (0) | 2024.03.12 |
---|---|
[붉은외계인] Mobile - OWASP UnCrackable L2 (0) | 2024.03.05 |
[붉은외계인] Mobile - FridaLab 풀이 (1) | 2024.02.26 |
[붉은외계인] Mobile - smali 코드 분석 1 with KGB Messenger (0) | 2024.02.14 |
[붉은외계인] Mobile - Diva Hardcoding Issues - Part 2 (0) | 2024.02.07 |
IT / Android
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!