본문 바로가기

모바일 해킹/안드로이드

취약한 로깅 메커니즘 - 로그캣(logcat)

안녕하세요 이번에는 안드로이드 취약한 로깅 메커니즘에 대해 알아보겠습니다.

 

 

 

 

-로깅 메커니즘?

 

로그 메커니즘이 많이 생소하실 수 있습니다.

 

간단하게 말씀드리면 서버 로그는 아시죠? 서버에서 하는 행동들이 기록에 남는 게 서버 로그입니다.

그 로그 기록 안에 노출되면 안 되는 중요한 데이터가 남는 경우가 있습니다.

 

예를 들어 로그인을 하는데 아이디와 비밀번호가 그대로 로그에 남는 경우라 던가

거래하는 기록이 전부 남아 있을 때 이 취약점이 있는 거죠.

 

그리고 이번 포스팅에는 안드로이드 로그를 볼 때 logcat을 이용해서 봐보는 겁니다.

주제는 로그캣 정보 내에 중요 정보 평문 노출이라고 볼 수 있겠네요.

 

 

_____________________________________________________________________________________

 

-logcat?

 

로그 캣

 

참고로 cat은 고양이가 아닌 concatenate 줄임 말입니다. 리눅스에 쓰는 cat 명령어와 같아요.

 

본래 용도는 디버깅 용입니다. 개발하는 데 있어서 가장 중요하다고 볼 수 있는 디버깅을 할 때

이 logcat을 이용해서 어느 이벤트가 실행이 되고 어디서 에러가 나며 어느 데이터가 보내지는지 볼 수 있습니다.

 

실습하기 전에 간단하게 보고 가겠습니다.

 

log cat으로 찍으면 보이는 영어 대문자가 있습니다.

 

맨 앞에 E나 D,W 등 적혀져 있습니다.

V : Verbose (중요하지 않은 정보)

D : Debug (디버그 정보)

I : information (일반 정보), 경고 정보가 안 나오고 성공적으로 수행하면 나오는 정보라고 보시면 됩니다.

W : Warning (경고 정보)

E : Error (에러 정보)

F : Fatal (중요한 정보)

S : Silent (가장 높은 순위의 정보)

 

이걸 아시면 이제 adb logcat을 보실 때 분류해서 잘 보실 수 있을 겁니다.

그리고 옵션들도 있습니다. 꽤나 많은데 참고하실 거면 여기 블로그에 정리되어 있습니다.

 

https://ch4njun.tistory.com/115

 

[Android] adb를 통한 Log 확인하기.

안드로이드 Application에서 Log.i 와 같이 로그를 출력할 때가 있다. 이럴 경우 안드로이드 스튜디오 상에서는 바로바로 확인이 가능하지만 Frida를 이용한다던지 동적디버깅을 진행한다던지 할 경

ch4njun.tistory.com

 

여기서는 그나마 자주 사용하는 옵션들을 설명해 드리겠습니다. 참고만 하시면 될 것 같습니다.

 

-s : 모든 태그의 우선순위를 'silent'로 설정하는 필터 표현식이다.  '*:S'와 동일  (백그라운드에 실행되는 것까지 확인한다고 보시면 됩니다.)

-c : 로그 전체를 삭제한다.

-d : 로그를 스크린에 덤프 한다.

-f 파일이름 : 지정한 파일이름에 로그를 저장한다.

-g : fhrm qjvjdml tkdlwmfmf rkwudhrh whdfygksek,

-v : 로그 메시지의 포맷을 설정한다. 기본은 brief 포맷이다.

 

________________________________________________________________________________________________

 

 

 

이제 인스큐어 뱅크 앱을 이용해 실습을 해보겠습니다.

 

녹스 키시고 app.py 이용해 인스큐어 뱅크 서버 열어주시고 shell 도 연결하고 난 뒤에 다른 터미널을 열겠습니다.

 

서버열고

 

 

 

로그인 한 뒤 Transfer 메뉴로 왔습니다.

 

다른 터미널에 shell도 연결합니다

 

 

그리고 난 뒤에 또 다른 터미널에 adb devices을 입력하겠습니다. 물론 adb shell 환경에서 하셔도 됩니다.

 

adb에 있는 장치

adb 서버에 연결된 장치의 목록을 보여줍니다.

이때 adb logcat을 입력하면 저 장치 목록들에 있는 로그들을 출력하게 됩니다.

 

 

갑자기 막 로그들이 나오는데 이거는 처음의 로그들이 출력된 겁니다.

 

밑으로 내리시면 로그가 끊겨 있을 겁니다.

 

저는 저기서 끊겨 있습니다.

 

이제 실행하는 로그들이 전부 탐지가 되는 겁니다. 한 번 인스큐어 뱅크에 있는 transfer을 해보겠습니다.

 

대충 작성하고 transfer합니다.

 

로그가 남는데

 

저기 보시면 가운데에 

 

Message 보이시나요

 

중간에 Message:success가 보이고 뒤에 transfer한 데이터들이 남아 있습니다. 중요한 정보죠!

근데 이렇게 로그에 남는 경우면 그때 취약점으로 잡으시면 됩니다.

 

그럼 다른 정보 확인 해보겠습니다. 앱에 Change Password 들어가서 해보겠습니다.

 

 

패스워드 변경하면 로그에 나오는지 확인하는 겁니다.

 

변경하기

 

그리고 adb logcat에 찍힌 걸 보니 Updated Password 란에 보이네요!

 

이렇게 from에서도 원래 패스워드랑 to에서 패스워드

 

from 통해 본래 패스워드랑 to에서의 변경한 패스워드가 그대로 평문으로 담겨 있네요.

그러니 소스 코드에서 logcat에서 안 찍히게 수정을 해야만 합니다.

.

.

.

.

.

그런데 로그를 확인하실 때 조금 불편하실 겁니다.

왜냐하면 장치의 로그 정보가 찍히다 보니 내가 원하는 앱뿐만 아니라 다른 앱들도 찍히는 경우가 있어서 헷갈릴 겁니다.

 

그때 내가 원하는 앱이 실행되는 걸 프로세스 번호로 알아낸 다음 logcat 찍을 때 관련 프로세스 번호만 나오게 할 수 있습니다. adb shell 통해 연동된 터미널로 다음 명령어를 작성합니다.

 

ps | grep [내가 보고 싶은 앱] | awk "{print $2}"

 

이 명령어로 바로 내가 보고 싶은 앱의 프로세스 번호를 볼 수 있습니다.

 

 

이렇게요

 

끝에 awk 명령어 굳이 안 붙여도 볼 수 있습니다.

 

이렇게 프로세스 번호 4181번인 것을 알 았으니  

logcat | grep [내가 보고 싶은 앱의 프로세스 번호] 입력하시면 됩니다!

 

안드로이드 안에서 adb 입력하면 없다고 나옵니다. 그러니 그냥 logcat만 입력하셔야 돼요.

어쨌든 입력해 보겠습니다.

 

 

이렇게 저희가 원하는 앱의 로그 정보만 볼 수 있습니다.

 

맨끝에 비밀번호 변경한 정보까지 볼 수 있네요.

 

참고로 소스 코드에 Log.d 함수 이용하거나 System.out.println 함수를 이용해 데이터를 찍는다면 저렇게 로그에 남게 됩니다. 그래서 소스 코드를 분석을 하실 때 Log.d 함수와 System.out.println 함수를 잘 보셔야만 합니다.

 

만약 그 함수를 이용해 중요한 정보를 찍는다면 그때 logcat 이용해 중요한 데이터가 찍히는지 알 수 있습니다.