이번 포스팅에선 Insecure Bank 앱을 통한 '로컬 암호화 이슈' 취약점에 대하여 알아보겠습니다.
[로컬 암호화 이슈 취약점 이란?]
> 안드로이드 애플리케이션은 편의성을 위해 실행 도중에 저장해야 하는 정보들이 있습니다. 만약 중요한 정보를 저장할 경우 저장한 정보가 평문이나 복호화를 통해 알아낼 수 있게끔 저장이 된다면 비밀번호나 아이디같은 정보가 노출될 뿐더러 이를 통해 다른 웹사이트에 대입해보는 브루트포스 공격으로까지 이어질 수 있게 됩니다.
취약점 진단에 들어가기에 앞서 우선 암호화 방식에 대하여 간단하게 말씀드리고 가겠습니다!
<대칭키 방식>
> 암호화와 복호화에 사용되는 키가 값으며 , 이 키값은 정보를 송,수신하는 사람들 끼리만 알고있어야 합니다. A(송신자)는 보낼 정보를 암호화키를 사용하여 암호화 시킨후 , 메세지를 전달받은 B(수신자)는 암호화키를 사용하여 메세지를 복호화 시킨후 평문을 얻어내서 읽어내는 방식입니다.
<비대칭키 방식>
> 암호화와 복호화에 사용되는 키값이 서로 다르며 , 불특정 다수에게 공개키를 알려주고 공개키로 암호화 한 정보는 비밀키를 가지고 있는 사람만이 복호화 시킬 수 있는 방식입니다. A(송신자)가 공개키로 메세지를 암호화 한 후 B에게 보내면, B는 가지고있던 비밀키로 암호화된 메세지를 복호화 시켜 평문을 얻어내는 방식입니다!
1. 취약점 진단
1. Insecure Bank 앱을 켜보면 Autofill Credentails 이라는 버튼이 있습니다. 이 기능은 이전에 로그인했던 아이디와 패스워드 정보를 자동으로 입력해주는 자동로그인 기능입니다. 자동로그인 기능은 저희가 사용하는 앱에 전반적으로 존재하는 기능이죠. 중요한 점은 로그인 정보가 자동으로 입력된다는 것은 분명 기기 어딘가 이 정보가 저장되어 있다는 말입니다.
2. 그러면 cmd 창에서 nox _adb shell 을 입력후 nox 기기에 접근을 해줍니다. 주로 자동로그인 같이 기기 내부에 저장하는 단순정보는 SharedPreferences 기능을 사용하기 때문에 해당 디렉토리로 접근 해주겠습니다.
저장 경로 : data/user/0/com.android.insecurebankv2/shared_prefs
3. mySharedPreferences.xml 과 com.android.insecurebankv2_preferences.xml 란 두개의 앱에 저장되어 있을 가능성이 유력하네요. 그러면 일단 my SharedPreferences.xml 을 cat 명령어로 어떻게 쓰여져 있나 확인해보겠습니다.
4. 역시나! Username 값과 Paswword 값이 저장되어있습니다! 하지만 얼핏봐도 암호화 되어 있구나 라는것을 바로 파악하실수 있습니다.. 그러면 어떤방식으로 암호화 되어있는지 Jadx를 통한 소스코드를 살펴보며 확인해보겠습니다!
5. Jadx 로 Insecure Bank 앱 소스코드를 디컴파일링 해주시고, 검색창에 EncrytedUsername(xml 파일에서 확인했던 ID값의 key값) 을 적어서 getSharedPreference() 함수가 사용되는 위치를 찾아주세요.
6. LoginActivity 에 해당 내용이 적혀있습니다. 읽어보시면 ID값은 base64로 인코딩 시킨것이고, Password 값은 AES(대칭형 암호화 알고리즘) 으로 암호화 시키는것 같습니다. 일단 base64는 암호화가 아닌 인코딩이기 때문에 손쉽게 ID값을 알아낼 수 있을것 같습니다... 문제는 Password 인데.. 대칭키 방식이기 때문에 key값을 모르면 복호화가 사실상 불가능합니다...
7. 보시면 복호화를 하기위해 aesDeccryptedString() 이라는 함수를 사용하고 있습니다. 해당 함수를 alt 를 누른 상태에서 마우스를 올리면 클릭할 수 있게 변합니다. 이는 해당 함수가 선언된 부분으로 바로 이동할 수 있는 편리한 기능이니 알아두시면 편하실겁니다!
8. 함수 관련 부분으로 이동해서 함수 코드를 살펴보니 복호화에 사용되는 key값의 평문이 소스코드에 저장되어 있는것을 확인하실 수 있습니다! 그리고 AES방식엔 초기화 벡터라는 것이 필요한데 그에 대한 값도 0 으로 이루어진 16 바이트 길이의 바이트열 인것을 확인하실 수 있습니다. 이처럼 키값을 앱에 작성해놓으면 리버싱을 통해 알아낼 수 있으므로 매우 위험합니다! key 값을 찾았으니 취약점 진단을 마치고 해당 내용들을 토대로 ID , Password 값을 알아내보겠습니다.
2. 공격 결과
저희가 위에서 알아낸 정보를 종합해보면 다음과 같습니다.
ID : ZGluZXNo (base64로 인코딩 된 값)
Password : DTrW2VXjSoFdg0e61fHxJg== (AES 방식으로 암호화 된 값)
KEY : This is the super secret key 123 (대칭키 방식에 사용되는 키값)
초기화 벡터 : 0 으로 통일된 16바이트 열
이 정보들을 토대로 복호화를 진행해보겠습니다.
[ID 값 복호화]
1. 인터넷 base64 디코딩 사이트에서 ID값을 복호화 하자 dinesh 라는 아이디 평문이 뜨는것을 확인하였습니다. 여기서 이라는 문자열때문에 뒤에 }t 가 덧붙여서 나오는데 이건 XML 파일에서 줄바꿈이라는 뜻이므로 무시해도 상관없습니다.
[Password값 복호화]
1. 이번엔 AES 암호를 복호화 하기위한 사이트로 접속했습니다. 근데 복호화를 하려니 암호화 mode 와 패딩 방식 , key 값 , 초기화 벡터값을 적어줘야 합니다... 이를 위해서 소스코드를 다시한번 살펴보겠습니다.
2. 소스코드에서 암호화 하는 부분을 다시 보시면 AES/CBC/PKCS5Padding 이라고 적혀있습니다. 이는 AES 방식이며 , 암호화 모드는 CBC , 패딩방식은 PKCS5 라는 뜻입니다. 그러면 방식도 알았으니 다시 복호화 페이지로 이동합니다.
3. 복호화할 문자열에 XML 파일에서 얻어냈던 패스워드를 넣어주시고 , 제가 표시해둔 부분들을 주의해서 복호화를 시켜주시면 Dinesh@123$ 이라는 비밀번호 평문을 얻어낼 수 있습니다!!
3. 대응방안
암호화 방식 자체는 AES-256 의 강한 알고리즘 암호화 방식을 사용하고 있습니다.
허나 문제점은 고유키값 평문이 소스코드에 그대로 노출되는 곳에 있습니다.
1. 고유키 값을 서버에 저장
> 지금 인시큐어 뱅크 어플은 앱 내부에 고유키를 보관하고 있습니다.고유키를 관리하는 서버를 별도로 두고 키를 주기적으로 바꿔주면서 , 키를 알고있는 인원은 최소한의 인원으로 해야합니다.
2. 소스 코드 난독화
> 현재 소스코드는 어디서 어떤 함수가 암호화를 시키는지 복호화를 시키는지 알기가 너무 쉽습니다. 따라서 소스 코드 난독화를 진행하게 된다면 공격자가 디컴파일로 소스코드를 알아내는데 어려움을 줄 수 있습니다.
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Insecure Bank' 카테고리의 다른 글
[Insecure Bank] 루팅 탐지 및 우회 (0) | 2024.12.02 |
---|---|
[Insecure Bank] 액티비티 컴포넌트 취약점 (0) | 2024.11.29 |
[Insecure Bank] 취약한 인증 메커니즘 취약점 (0) | 2024.11.23 |
[Insecure Bank] 브로드캐스트 리시버 결함 취약점 (0) | 2024.11.18 |
[Insecure Bank] 앱 모의해킹용 어플 '인시큐어 뱅크' 설치방법(feat. Miniconda) (0) | 2024.11.10 |