디지털포렌식/악성코드 샘플 분석

우리 은행 사칭 apk

Lhaaan 2024. 7. 23. 12:48
  • 해당 파일은 우리은행을 사칭했던 앱이다. apk 악성코드 샘플을 분석해보려고 하다가 예전에 피싱과 관련된 apk가 있길래 해당 앱으로 분석을 진행하였다.

파일 구성

  • 파일명: wooribank.apk
  • 해시값
    • MD5: 7a21e6b574427fcdc5f9c8db33f707cc
    • SHA-1: f09b2e759a86abdd42fc99b7068a2cdd669cccf1
    • SHA-256: 6bf3853d2814acef8aa805efda34b156de18e96814a226c66eb4339b567eca55
  • 파일 구성 요소
    • 파일은 다양한 리소스 파일들과 classes.dex 파일로 이루어져 있는데, secret-classes/secret-classes2.dex 파일이 있는 것으로 보아 해당 파일들을 복호화 하는 과정이 들어있지 않을까 추정된다.

AndroidManifest.xml

  • androidmanifest.xml 파일을 통해 먼저 구성요소들을 확인했다. 해당 파일들을 통해 앱의 패키지명이나 권한 정보들을 확인할 수 있다.
  • 언뜻 봐도 전화나 통화기록, 연락처를 읽고 쓰는 권한들이 설정되어 있는 것을 확인할 수 있다.

apk 분석

  • apk를 jadx-gui에 올려서 확인해봤을때 두 가지 클래스가 나오는 것을 확인할 수 있었고, 난독화 되어 있는 것으로 추측했다.

  • androidmanifest.xml 파일을 통해 확인해봤을때 com.ppnt.ccmd.aavv.Nforg 클래스가 엔트리포인트인것을 알 수 있었다.

  • ppnt.ccmd.aavv에 InDe 클래스를 확인해보니 dn_ssl 라이브러리를 로드하는 것을 확인할 수 있었고, decrypt 함수가 있는 것을 확인할 수 있었다. 그렇다면 so 파일에 있는 decrypt 함수를 사용해서 dex를 복호화할것이다.

  • decrypt 함수를 사용하는 곳을 확인해보았다. 일단 decrypt 함수에 2가지 인자가 넘어간다는 것을 알 수 있었고, getAbsolutePath()에 복호화할 dex 파일의 경로가 넘어갈 것이라고 추측했다.

  • 먼저 attachBaseContext 부분을 확인하였다. dexDir 경로가 존재하지 않으면 a 함수를 호출하는 것을 알 수 있었다. 일종의 해커의 루틴이지 않을까 싶다.. 잘 모르겠음
  • 아마도 정상 앱과의 비교를 위한 것이 아닐까 싶다.

  • 파일을 실행중에 복호화를 진행하는 것으로 보이는데, else 부분에서 secret-classes/secret-classes2.dex 파일이 a 함수의 3번째 인자로 넘어간다.

  • a 함수를 쭉 따라가본 결과 decrypt 함수를 호출하는 것을 확인할 수 있었다. d클래스의 a 메소드를 호출하는 것을 볼 수 있어 쓰레드로 복호화를 수행한다.

복호화 로직 분석

  • decrypt 함수를 쫓아 가보자.. IDA에서 java로 함수 검색 해보니 바로 decrypt 함수가 나오는 것을 확인할 수 있었다.
  • 보아하니 j_EVP_DecryptInit_ex에서 키를 설정하는 것을 확인할 수 있다. 키는 “dbcdcfghijklmaop” 였다.

  • aes 128 ecb 모드인 것도 다 확인되었으니 chatgpt를 통해 복호화 코드를 만들어달라고 하자. 귀찮을땐 chatgpt가 짱이다.
  • 복호화 하고 나니 dex 시그니처가 확인됐다.

Secret-classes2_decrypt.dex 분석

  • 해당 파일에서 악성 행위가 이루어진다는 것을 확인하였고, 해당 파일을 위주로 분석을 진행하였다.
  • CallActivity가 굉장히 많이 나뉘어져 있다.

  • MainActivity 분석
    • app.html 파일을 로드하는 것을 확인할 수 있다.

  • 해당 app.html 파일이 피해자들에게 보여지는 메인 화면이다.

  • 권한을 요구하는 부분도 확인가능하다.

  • Mcrypt 클래스에는 데이터를 암호화하고, 복호화하는 로직이 담겨있다.

  • C2 서버로 추정되는 도메인을 확인할 수 있었다. 아까 앞에 분석했던 복호화 함수를 통해 C2 서버로부터 받는 데이터를 복호화하는것을 알 수 있다. 아마 저 pwnText 안에 실제 데이터가 전송되는 C2 서버가 있을 것으로 판단된다.
  • 하지만 해당 C2는 닫혀 있어서 더 확인이 불가했다.

  • 굉장히 많은 정보들을 가져가는 것을 확인할 수 있었다.
  • 그 중에서도 com.skt.prod.dialer 정보를 가져가는 것을 확인할 수 있는데, skt만 따로 왜 지정해서 확인하는지는 모르겠다. 더 많은 로직이 있지만, 귀찮아서 생략..

  • URL을 생성하는 부분이 있는데.. 왜 이렇게 해놨지?... 각 액티비티마다 다르게 분기를 타서 URL 끝에 번호를 지정해주는것 같았다.

  • 이 부분에서 위에 있는 데이터를 다 수집 후 json에 담아 C2서버로 전송한다.

js 파일 분석

  • subutil.js 파일을 확인해본 결과 json으로 유저 정보를 수집하는 것을 확인할 수 있다.

  • 결국 setUserInfo를 통해 받은 정보를 넘기고, “K_SEND_WEB_USER_INFO” 액티비티를 통해 정보를 C2로 넘기는 것을 확인할 수 있었다.

  • apk는 진짜 많이 안해봐서 그런지 헷갈리고, 아직도 많이 어렵다. 좀 더 많이 해봐야지..