정보보안 스터디 - 22주차 1일 - frida agent Injection
☞ 모바일 앱 해킹 vs 단말기 해킹
단말기<>서버. 모바일 앱해킹 중 웹 서버측 취약점은
그냥 웹에서 하던것처럼 burp같은 프록시를 연결해서
웹에서와 마찬가지로 파일 업로드나 그런 취약점들을 찾으면 되는 거라 크게 문제가 되지 않습니다.
하지만 여기서 한가지 문제가 있다면
앱서버와 단말기 사이의 통신이 HTTPS일 경우 입니다.
단말기 <> burp(프록시) <> 앱서버
원래는 burp같은 프록시는 open browser 이런 게 안되고 그냥 setting에 들어가서 proxy 리슨상태로 만든 뒤 웹 브라우저에서 따로 connection을 했어야되었습니다. 그게 정석입니다.
여기에 하나더 설정해서 서로 HTTPS 사용할 수 있도록 단말기에 burp 인증서를 설치해야 합니다. 검색하면 나옵니다.
인증서를 설치하면 평문으로 볼 수 있지만 요즘은 SSL pinning 으로 SSL인증서를 앱자체에서 고정해놓고 쓰는 경우가 많습니다. 네이버 같은 경우에는 네이버 인증서에 대해서만 실행하도록 설정되어있기 때문에 다른 인증서라면 적용되지 않아서 평문으로 확인하지 못하고 암호화된 상태가 유지됩니다.
그럴 경우 이런 SSL Pinning bypass를 해야합니다.
어짜피 앱 자체에서 코드로 검사하므로
Android라면 frida로 우회가 충분히 가능합니다.
iOS라면 tweak 툴을 써서 스위치를 켜주면 커널단에서 SSL 우회가 가능합니다.
☞ 단말기 취약점
사용자 개인정보가 단말기에 평문으로 저장되는 경우에는 문제가 있습니다.
>>> 메모리 dump를 뜹니다.
이 과정은 루팅(rooting)/탈옥(jailbreak)을 해야하는 전제 조건이 있습니다.
하지만 루팅을 해도 대부분의 앱에서는 모바일 보안솔루션이 적용되어서 실행이 안되는 경우가 있습니다.
그러니까 앱 자체에서 공격자가 어떻게든 분석할 수 없도록 처리를 해놓고 막아놓았습니다.
루팅한 device를 탐지하여 차단하거나(꺼지거나)
분석을 못하도록 소스코드를 난독화하거나
앱을 숨겨놓는 등의 기능을 설정해두었습니다.
A보안사의 모바일 보안 솔루션이 앱에 내장되어있다면 우회가 필요합니다.
간혹 프로젝트를 나갈 때 3일이 주어진다면 1~2일이 걸리지만 3일까지 우회하는데만 시간이 걸릴 수도 있습니다. 여기서 시간이 오래걸릴 뿐이지 무조건 우회는 가능하다는 점입니다.
왜냐하면 원래 솔루션이 작동하는 방식은
정해진 루팅 관련 파일경로를 찾고 그다음 루팅이 되었다면 앱이 기기를 차단하는 것이지만
루팅 즉 관리자 권한 상태기 때문에 앱에 대한 통제권, 설정권은 루팅된 권한자에 있습니다.
솔루션이 경로를 찾으려고 하더라도 거부해버리면 됩니다.
그러면 파일이 없다고 판단하고 넘어가버립니다.
그 이후로 frida로 우회해주면 실행됩니다. 코드를 수정할 수 있고, 해당 코드를 점프하거나, 코드 변수값을 바꾸거나 등 솔루션을 우회하기만 하면 됩니다. 하지만 해당 코드위치를 찾는 데 시간이 많이 걸립니다.
그래서 프로젝트 시작 전에 미리 요구하는 게 좋습니다. 보안 솔루션 제거한 버전을 달라고 하는겁니다. ㅇ왜냐하면 A사의 보안 솔루션에 대한 모의해킹을 하느라 시간을 보내는 것과 같기 때문입니다.
그러면 담당자의 반응이 줄수도 있지만 안된다고 할 경우도 있습니다. 벗겨내는데 과정도 오래걸리고 귀찮아 하거나, 아니면 취약점을 안찾아냈으면 좋겠어서(고쳐야되고 일이 생기는 걸 싫어해서) 그럴 수도 있습니다.
그러면 그거 나름대로 1~2일에 걸쳐서 솔루션 우회를 하면됩니다.
☞ frida
DBI(Dynamic Binary Instrumentation) 동적 바이너리 조사 툴 입니다.
동적으로 코드를 패치, 수정, 흐름을 제어할 수 있습니다.
즉 바로바로 결과를 확인하면서 변경할 수 있다는 장점이 있습니다.
함수 후킹
함수 후킹이란
어셈블리어로
단계별로 진행이 될 때
함수를 call하여 들어가서 그 함수안에서도 단계별로 진행을 하고 난 후 돌아올 것입니다.
그 때 함수를 시작하기 전에, 또는 마지막에 막아놓고 직접 만든 코드를 삽입하는 것을 말합니다.
예를 들어 이 스크립트 함수를 만들어 삽입할 수 있습니다.
func plusScore(int num){
this.score += 100
return true;
}
점수가 추가되는 함수가 있고 적용되지 않게 하려면
true > false 로 바꿔 줍니다.
이 때 arg 인자값이 2개라면 맞춰줘야 오류가 생기지 않습니다.
frida의 구조
Server- Client 구조로 되어있기 때문에
단말기가 있다면
앱안에 frida server을 먼저 백그라운드로 실행해주고
자기 frida agent(클라이언트) 모듈을 injection 합니다.
그 다음 서버와 클라이언트가 서로 소통하면서 변형을 하는 구조입니다.
처음 frida 설치 과정
pip install frida pip install frida-tools 파이썬기반으로 설치가 가능합니다. |
cmd 에서 ~\Mobile_Android\class 경로 frida --version으로 버전을 확인합니다. github에서 그에 맞는 버전의 서버를 다운 받습니다. 단말기에 맞게끔 android에 x86 입니다. |
adb connect 127.0.0.1 다운받았다면 단말기와 연결해줘야합니다. |
adb shell 연결했다면 리눅스 명령어가 가능한 쉘을 사용 가능합니다. > 즉 실행도 가능하고 통제권을 얻은 것입니다. 루트가 뜨는 이유는 미리 NOX 에뮬레이션 루팅 설정이 되었기 때문입니다. |
cd /data/local/tmp 경로로 가보면 ls -al 서버가 설치되어 있을 겁니다. |
frida-ps -U 또한 현재 실행중인 프로세스 목록+ PID도 확인 가능합니다. frida-server가 작동되고 있는 것을 확인할 수 있습니다. |
js 스크립트 삽입 : test.py
frida를 실행하는 파이썬 코드를 봤을 때
import frida,sys
처음에는 frida를 사용할 것이기 때문에 불러와야합니다.
또한
패키지 이름에 앱이름을 써주고
spawn(패키지이름) - spawn 부분은 실행하는부분입니다. 정확히 말하자면
리눅스에서 처음 시작할 때 최초 프로세스 = 껍데기가 있습니다.
spawn이란 그 껍데기를 복사하는 것을 말하고 이 후 메모리상에 필요한 명령어를 넣는 것입니다.
메모리상에 실행은 안되고 등록된 상태입니다. 실행되려면 CPU에게 명령을 보내야 합니다.
agent는 리스너 역할입니다.
callback 함수까지 넣어주고 load()
attach(p1)
마지막에 resume이 나옵니다.
resume 까지 해야 메모리 상에 있는 요소들이 실행됩니다.
def get_script(script_name):
with open("./"+script_name, 'r') as f:
script = f.read()
return script
script = process_session.create_script(get_script(args.script))
script.on('message', on_message)
script.load()
js읽어오는 함수 정의 후 js를 작성할 수 있는 곳이 있습니다.
지금은 console.log(" [+] JS Inject ! ") 로 인젝트 되었다는 알림 스크립트만 삽입했지만 (js파일 삽입이 확인되었는지 테스트용으로 쓰는 습관입니다.)
실제로는 인라인으로 작성하는 것이 아니라
--script 인자값으로 원하는 js파일을 불러와서 text로 변환한 뒤 inject하도록 합니다.
이 파이썬 코드를 실행하기 위해서
python test.py로 실행하면
단말기에 앱이 실행되면서 동시에 js 인젝션이 되는 것입니다.
console.log 이기 때문에 알림창이 cmd에 정상적으로 떴습니다.
frida agent(> js)가 삽입되었다고할수 있습니다. 확인하는 방법은
maps 어플PID를 입력해서 메모리리상에 어딘가 frida-agent~.so 라이브러리가 들어가 있는지 확인합니다. = js 도 같이 삽입되어있는 상태입니다.
로그인 기능 우회
만약 앱에서 로그인 기능을 우회하고 싶다면
jadx-gui 디컴파일러에서(정적 분석)
가장 먼저해야 했던부분인 manifest에서 처음 실행되는 함수가 뭔지 확인하고
activity 처음실행되는 화면으로 찾아갑니다.
LoginActivity 에서
auth라는 함수이고 verifyUserNamePassword(아이디/비번) 의 함수가 실행되어 검증하는 것을 볼 수 있습니다.
auth가 맞다면 인증이(startActivity 함수 실행) 되고, 아니라면 안되는 코드로 이루어져있고
해당 verify 함수를 따라가 보면 부모격의 Util이 보입니다.
따라서 적용시키려면
console.log("[-] JS Inject !")
Java.perform(function(){
var verify_Class = Java.use('com.insecureshop.util.Util');
var verify_func = verify_Class.verifyUserNamePassword;
verify_func.implementation = function(arg1, arg2){
return true;
}
});
perform 후에 class 의 util을 쓰겠다는 코드를 넣습니다. java.use(패키지 경로명을 넣습니다.)
perform안에서만 정의, 사용 가능하다는 뜻입니다.
그 다음 함수를 선택 후
implementation으로 원하는 코드로 수정하면 됩니다. 새로운 스크립트 코드를 임의로 대체시킬 수 있습니다.
이 때 함수의 인자값을 맞춰줘야 오류가 뜨지 않습니다.
적용 되었는지 확인하기 위해서 앱을 껐다가 frida서버를 다시 구동합니다.
그 후 python.py 로 frida클라이언트를 키면됩니다.
다른 예시로
로그인 인증 화면에서는
1. cd키를 찾는 것처럼 해당 코드를 찾아 저장된 아이디/비밀번호를 앱에서 찾는방법을 사용하거나
2. 인증 과정을 점프하거나 return값을 true에서 false로 바꾸는 방법이 있습니다.
슈팅 게임에서는
공격을 당했을 때의 함수를 가져온 후
슈팅의 스피드를 올리거나, 배의 속도를 올리거나, 공격당했을 때 스코어를 깍이지 않게 하거나, 목숨을 깍이지 않게 변형시킬 수 있습니다.
실무 솔루션 우회
그러니까 실제 솔루션 우회 과정에 적용해보면
루팅되었는지 확인하는 함수가 있을 것이고
func rootCheck(){
~
~
if(){
return true;
}
else{
return false;
}
}
리턴값을 변경하거나 점프해주면 됩니다.
결론
frida는 동적 분석 도구로 olly디버거와 비슷한 면이 있지만 약간 차이가 있을 수 있습니다.
frida는 android뿐만아니라 iOS, MAC, windows 까지 모두 멀티 역할을 하기 때문에
이덕분에 접근성이 뛰어나졌고 아주 혁신적이라고 할 수 있습니다.
사람들이 frida를 만들기 전에는 DDL Injection, 함수 후킹이라는 기술이 고급기술에 속했지만
frida 출시이후에는 접근성이 뛰어나져서 다루기에 용이합니다.
☞ 앞으로의 연구 계획
1. 웹 모의해킹 - 프로젝트를 취약점 없거나 뻔하다고 다른 CTF를 공부하는 것이 아니라 최대한 찾거나 응용하려고 해야 실력이 늡니다.
2. 모바일 앱 모의해킹 - 프로젝트에 없어도 따로 혼자서 무조건 준비해줘야 합니다.
Android
Android DIVA 단계별로 해보기
나만의 DIVA 앱, 커뮤니티 앱 개발 - 커뮤니티는 댓글, 게시판 부터 자동로그인까지 구현합니다.
fridaLab + android game 후킹
FridaLab을 단계별로 하면 내용과 함수 후킹하는 방법 등 기초적인 부분을 익힐 수 있습니다.
앱스토어에서 앱을 아무거나 하나 다운받아서 게임에 대해서 후킹해보는 것도 좋지만
랭킹을 실제로 영향을 끼치도록 한다면 불법에 해당하기 때문에
가장좋은 방법은 github에서 개발자들이 만든 테트리스같은 게임을 받아서 후킹해보는 편이 좋습니다.
그게 재미도 있고 실력도 늘 수 있는 방법입니다.
처음엔 기존에 만들어져있는 앱 후킹을 그렇게 하다가
앱을 만드는 것도 좋습니다.
Android crackme 시리즈
so파일에 대해서 후킹하는 거라 native 함수 배우는 데 도움이 됩니다.
JAVA vs native 가 있다면 안드로이드는 java 기반이고, iOS는 native 기반입니다.
따라서 iOS frida를 검색해서 관련 native 정보를 찾아보며 공부합니다.
iOS
iOS DVIA 단계별로 해보기
나만의 DVIA 앱, 커뮤니티 앱 개발
3. 침투테스트(pentest)
이런 서비스가 많이 있지는 않지만 간혹가다가 기회가 생겼을 떄
처리할 능력이 있다면 경험할 수 있습니다.
웹서버에만 기반하는 게아니라 시스템 전체를 확인하고 전체를 침투하는 것입니다.
실제 재현을 해줍니다.
네트워크부터 여러 서버가 있을 텐데 시스템 인프라를 침투하려고 합니다.
정보 수집 및 분석 - exploit - post exploit 순으로 실제처럼 재현을 합니다.
여기서 그치지 않고
CTF
hackthebox
tryhackme 를 추천합니다.
4. pwnable 장르 + 리버싱
+) 포렌식, 네트워크, OT 해킹 등 자유롭게 공부합니다.
가면갈수록 리버싱 지식이 중요해지는 느낌이 들어
해두면 도움이 될 듯 합니다.