안녕하세요! 지난시간에는 '취약한 로깅' 취약점에 대하여 다뤘습니다. 이번시간에는 '하드코딩 이슈' 취약점 에 관한 DIVA 문제를 살펴보며 알아가는 포스팅입니다!
Hardcoding Issue 란?
> 소스코드 내에 중요한 정보를 직접 입력해놓는 보안사고를 말합니다. 예를들어 Admin 페이지로 들어가려면 PIN번호를 작성해야 하는데 인증절차 과정에서 if( user의 입력값 == '591354') 이런식으로 코드에 PIN번호를 직접적으로 노출시키는 등 중요정보를 코드에 담는 경우가 있습니다. 앱의 코드같은 경우 Jadx 로 디컴파일이 가능하기 때문에 중요정보가 공격자에게 직접적으로 노출되기에 반드시 개발과정에서 조심해야합니다.
[실습]
1. Hardcoding Issues - part 1
1. Diva 앱에서 두번째 문제인 Hardcoding Issues - part 1 을 클릭해줍니다.
2. 문제를 보니 '어디가 하드코딩 되어있는지 찾아라' 라고 써있습니다.
3. 비밀번호에 159159 를 넣어봤지만 접근제한 문구가 뜨네요.. 그러면 한번 jadx로 디컴파일 하여 코드를 살펴보겠습니다.
4. 디컴파일된 소스코드중에서 HardcodeActivity 라는 액티비티로 접근시 저희가 방금 했던 인증과정에 관한 코드가 적혀있습니다. 근데 보시면 if 문안에 저희가 입력한 값과 "vendorsecretkey" 라는 문구가 같으면 접근을 성공시키는 문구가 뜬다고 되어있습니다. 이 문구를 다시 Diva 앱으로 들어가서 넣어주겠습니다.
5. "vendorsecretkey" 라는 글자를 적자 접근이 허용되었다는 메세지가 뜨는것을 확인하실 수 있습니다.
> 이런식으로 개발과정중 인증절차의 대한 정보가 직접적으로 노출된 경우를 하드코딩되었다 라고 말할수 있습니다.
2. Hardcoding Issues - part 2
1. 12번째 문제인 Hardcoding Issues - part 2 에 들어갑니다
2.음 ...문제 구성은 일단 part1 과 동일한 것 같습니다. jadx로 디컴파일링 하여 소스코드를 살펴봅시다
3. 음... 일단 Hardcode2Activity 소스코드에 들어와서 코드를 살피던중 인증절차 부분을 발견했습니다. 코드를 보시면 위에서 부터 DivaJni 라는 셩식의 djni라는 이름의 객체를 만들어 준후 , djni에 새로운 DivaJni 인스턴트를 부여해주었습니다. 그 이후 if 문에서 djni클래스에 있는 access라는 함수를 통해 저희가 입력한 값과 비교를 하여 인증절차를 진행하는 듯 보였습니다. "그래서 도대체 DivaJni 라는 클래스가 뭐지?? access 함수는 또 뭐고?" 라는 의문이 들던중 옆에 소스코드를 살펴보니 Divajni 라는 클래스가 보여서 들어가보았습니다.
4.들어와 보니 여기선 divajni 라는 이름의 라이브러리를 가져와서 사용하는 듯 보였습니다. 아마 이 라이브러리에 access함수에 관한 코드가 적혀있을듯 합니다.
5. 리소스 > lib 로 가셔서 폴더를 열어보면 libdivajni.so 라는 이름의 바이너리 파일들이 있습니다. 아마 이 파일에 저희가 불러오는 divajni 라이브러리와 관련이 있는 내용들이 정의가 되어있는 것 같습니다. 하지만 .so 파일이나 .dll 파일은 바이너리 파일이기 때문에 jadx로는 디컴파일이 불가능합니다. 이를 위해서 디스어셈블러 툴인 Ghidra를 활용해줄것입니다!!
Ghidra 가 뭔데요?...
만약 Ghidra 가 무엇인지 모르겠고 설치가 안되셨다면 제 포스팅중 관련 포스팅이 있으니 설치를 진행하고 다시 와주세요!
6. Ghidra 를 통해 libdivajni.so 파일을 읽으려면 일단 nox에서 local 컴퓨터로 libdivajni.so 파일을 옮겨줘야 합니다. 이를 위해서 cmd 창에서 NOX안에 파일을 복사해서 내 컴퓨터로 가져오는 명령어를 실행시켜줄 것입니다.
NOX에 있는 libdivajni.so 파일의 위치는 /data/user/0/jakhar.aseem.diva/lib 에 위치합니다! 여기에 위치한 libdivajni.so 파일을 내 컴퓨터로 가져와야 합니다!
내 컴퓨터로 파일을 복사하기 위해서 cmd창에 다음과 같은 명령어를 입력해주세요.
nox_adb pull /data/user/0/jakhar.aseem.diva/lib/libdivajni.so
※ 내 컴퓨터로 저장될 때 파일이 저장되는 위치는 현재 위치한 디렉토리에 저장됩니다!
7. 무사히 파일이 복사된것을 확인한 후 Ghidra를 통해 바이너리 파일을 열어주세요.
8. 왼쪽 하단에 Symbol Tree 라는 부분에 access 라는 문구를 검색하면 두개의 문구가 검색이 되는데 그중에 Functions 라고 되어있는 부분을 클릭해주시면 저희가 분석해야할 access 라는 함수가 정의되어 있는 곳으로 이동하게됩니다.
9. 인증절차 부분일테니 분명 비교하는 연산자가 쓰였을 가능성이 높습니다. 그런 생각을 가지고 보던중 연산자 중에 CMPSB 라는 문자열을 비교할때 쓰는 연산자가 보입니다. 간단히 알아보자면 CMPSB 라는 연산자를 써서 ESI(비교될 문자열) 과 EDI(우리가 입력한 값) 을 비교하는 부분인 것 같습니다.
10. 코드의 흐름을 살펴보기 위해 맨 우측 디컴파일창에 써있는 코드를 살펴봅시다.
1. 우선 access 함수에 대한 정의입니다.
2.저희가 찾던 비밀코드는 olsdfgad;lh 인것 같습니다. 이 문자열을 pcVar3 라는 변수에 넣어줍니다.
3. 이후 while문을 돌면서 저희가 입력한 값(pcvAR1) 과 비밀코드를 한글자씩 비교합니다.
4. 만약 비교하다 문자열이 서로 틀리면 uVar4값이 false 가 되어 반환되고 , 문자열이 전부 일치하면 uVar4가 true가 되는것 같습니다.
대강 이런 코드의 흐름을 가지고 진행되는 것 같습니다. 저희가 원하는 비밀코드는 얻었으니 이제 이 값을 NOX로 돌아가 삽입해보겠습니다!
11. Ghidra를 통해 얻은 코드를 넣자 접근에 성공했다는 문구가 뜨는것을 확인하실 수 있습니다!!!
3. 대응방안
part 1 &2 전부다 코드에 직접적으로 인증절차를 위한 정보가 평문으로 작성되는 것이 문제입니다! 이 문제점에 대응하는 방법은 다음과 같습니다.
> 우선 사용자가 디컴파일링 할 수 있는 APK파일엔 인증에 대한 정보를 작성하지 않아야 합니다. 인증절차를 위한 비밀번호는 암호화하여 DB에 저장합니다. 이후 인증절차를 거칠때 서버는 DB에서 가져온 값과 사용자의 입력값을 비교하는 방식으로 진행하면 됩니다.
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Android DIVA' 카테고리의 다른 글
[Android DIVA] Input Validation Issues 취약점 (0) | 2024.11.03 |
---|---|
[Android DIVA] Insecure Data Storage 취약점 (0) | 2024.11.02 |
[Android DIVA] '취약한 로깅' 취약점 (0) | 2024.10.28 |
[Reversing] 디스어셈블러 툴 GHIDRA 설치방법 (0) | 2024.10.27 |
[Android DIVA] Android DIVA app 설치하기 (feat.jadx) (0) | 2024.10.26 |