frida Android hooking(모바일 해킹)

2019. 7. 21. 19:31 보안 이야기/취약점

오늘은 hooking의 강력함과 왜 hooking을 해야하는지를 포스팅해보려한다..

 

많은 CTF나 ANDROID 진단 프로젝트에서 굳이 hooking을 하지 않더라도

 

Rooting 체크나 어떤 솔루션에 대해 제약을 받지 않을 수도 있다.

 

왜? 프로젝트 시에는 대게 솔루션이 입혀지지 않은 경우도 많고..

 

프로젝트 기간 상의 문제로 솔루션을 제외시켜달라고 하는 경우도 있기 때문이다.

 

 

안드로이드의 솔루션은 무엇이 있는가?

 

무결성 검증, 루팅 체크, SSL pinning 난독화 등

 

일단 루팅 체크를 예를 들어서 본 포스팅을 하도록 해보겠다.

 

 

 

루팅우회? 그거 그냥 smali에 들어가서 루팅 체크하는 string 아무 string으로

 

예 ) /su -> /sa 이딴식으로 바꾸면 되는거 아니에요?

 

이럴수도 있다.

 

 

그래 바꿔보자 신나는 마음으로 바꿔서 재빌드를해보자.

 

 

여깃다 이딴거!

 

 

 

 

여기도 있다

 

 

 

 

이런식으로 바꿔보자.. CTF 풀때는 됬었는데..!!

 

자 재빌드를 시작해보자

 

 

누구나 사용하는 apk manager이다 어? 왜 안되지

 

에러를 볼까?

 

 



 실제 앱스토어에 있는 앱으로 진행했기 때문에 모자이크 함

 

뭐 로직에 따라 솔루션에 따라 다르겠지만 대게 이런식으로 에러메시지가 출력되고

 

대게 알아먹을수가 없는 에러 메시지일 경우가 많다.

 

이런 경우는 대게 무결성 검증을 하기 때문이다. 

 

아 그럼 포기. 안할래 할수도 있지만

 

이럴때 후킹을 해야한다.. 후킹은 앱이 실행되면서 특정 메소드에 훅을 걸어

 

자기가 마음대로 그 메소드의 리턴값이나 그 메소드의 내용을 패치할 수 있다.

 

 

먼저 소스코드를 분석해야한다.

 

루팅검사하는 부분의 소스코드를 분석해보자.

 

먼저 일하면서 가장 빨랐던 방법은 apkmanager로 디컴파일을 한 후

 

astrogrep 으로 smali 코드에서 찾는 것이다.

 

 

자 이런식으로 찾았다. iOS도 훅거는 소스는 조금 다르지만 이런식으로 iOS는 IDA를 통해서 찾는다.

 

뭐 용어는 그떄그때 소스코드 분석은 아는만큼 보이는 것이니 자세히 보고싶으면 자세히 공부하시길

 

 

 

자 이런식으로 위치를 찾아준다. 

smali 코드의 디렉토리 위치가 바로 클라스 위치이다.

 

자 그럼 이것의 소스코드를 봐보자 툴은 다양하다 jeb(상용) jadx 등 뭐 알아서 찾아보자

 

근데 갠적으로는 jeb가 젤 복구율이 좋았다.

 

자 까보자.

 




클래스 상단에 루팅 체크를 하는 경로를 ROOTING_FILES와 ROOTING_PACKAGES string array에 담았다.


 

이렇게 isRooting 메소드에서 검사를 하게되는데 자료형이 boolean이다.

 

자료형이 bool이라는 것은 리턴값이 

 

TRUE or FALSE 라는 것이다.

 

상단 트라이에 와 if 문에서 검사로직이 있고 검사 결과에 따라 isRooting에 true와 false 를 넣어주고

 

마지막에 isRooting을 뱉어주는 구조이다.

 

자 그럼 이거를 우회해보자/

 

 

frida 설정방법은찾으면 많이 나오기 때문에 따로 설명하지 않겠다.

 

 

자 먼저 앱의 루팅 체크를 우회하지 않은 상태로 실행했을 때 어떤 에러가 팝업되는지 보자.

 

 

 

요딴식으로 아예 켜지지도 않고 꺼진다. 자 그럼 몇가지 생각을 해볼수 있다.

 

훅을 언제걸어야되나?

 

나는 hooking을 처음 공부할때 이것에 대한 고민을 많이했다.

 

아마 나같은사람이 많을 것이다.

 

보통 훅은 앱이 실행되고 나서 frida 명령어로 훅을 거는게 아닌가? 라고 생각을 하는 사람이 많을 거라고 생각한다.

 

내가그랬어서 .... 아님말구

 

근데 이 앱의 경우에는 아예 켜지지도 않는다. 실행되자마자 루팅검사를 하고 바로 종료를 하기 때문이다.

 

그러면 실행과 동시에 훅을 거는 방법이? 있다. 뭐 내가 모르는 방법도 많겠지만 아는것만 포스팅을 하겠다.

 

 

소스는 이렇다. 보통 나중에 훅을 거는 것은 아래 글을 참고하면 자세히 나와있다.

 

https://bourbonkk.tistory.com/9

SSL Pinning 우회

최근까지 하고있는 모의해킹 프로젝트에서 가장 막강한(?) 대응책으로 불리웠던 SSL Pinning 우회방법...

 

 

 

소스는 이런식이다 . 파이썬에 JS를 담아서 구현되어 있고 이런 형식은 android ctf를 풀다보면github에 올라와 있다.

 

```

Java.perform(function() {



rootchk1 = Java.use("com.실제 앱이므로 삭제합니다.RegUtil");

console.log("[*] Hooking RootDetection1");

     rootchk1.isRooting.implementation = function(){



return false;

     }

console.log("[*] Hooking going out RootDetection1 method");



});

```

이렇게 java.use 메소드로 특정 클래스를 rootchk1에 넣어주고

 

이 클래스의 isRooing 메소드를 무조건 false를 리턴하도록 구현해준다.

 

 

 

try:

device = frida.get_usb_device(1)

pid = device.spawn(PACKAGE_NAME)

session = device.attach(pid)

script = session.create_script(jscode)

script.on('message', on_message)

device.resume(PACKAGE_NAME)

print('[*] Running Hook')

script.load()

sys.stdin.read()

except Exception as e:

 

 

여기서 pid =device.spawn(package_name) 부분이 키 포인트다.

 

이 메소드로 앱이 실행되자마자 훅이 걸린다.

 

그리고 셋트로 사용되는 것이

 

device.resume부분

 

이부분이 없다면 앱이 굳어서 아무것도 할 수 없는 상황이된다.

 

 

그러고 실행해보자

 

 

 

콘솔에 로그가 짝짝 찍힌다. 그러고 앱은 제대로 실행이 되었다. 

 

 

 

 

이건데 ... 음 ... 나같은 겁쟁이는 무슨 문제가 생길수도 있단 생각에 앱을 다 보여줄수는 없다.

 

이런식으로 백신, 뭐 이런 것들 솔루션을 걷어낼 수 있다. 

 

그리고 hooking할때 무조건 bool만 되는것이 아니다 

 

 

 

여기를 참조하면된다 자세한건 아직 나도 공부중이지만 정말 많은 것을 할 수 있는 공격 기술이다.

 

 

 

그럼 이것을 어떻게 막느냐?

 

아직은 확실히 막을 수 는 없는 것으로 알고 있지만.

 

분석하기 어렵게 난독화를 입히는 것도 하나의 방법이다.

 

이상.