ICEBEAR can pwn...

블로그 이미지

ICEB34R

공부하는 아이스베어는 귀엽습니다..!

[InsecureBank] #5 Exploiting Weak Cryptography

안드로이드/InsecureBank 2020. 1. 15. 01:38

이번에 볼 것은 SharedPreferences와 암호화 키가 약한 경우입니다.

 

1. SharedPreferences가 무엇인가?

간단한 string이나 setting값 등 DB를 사용하기에는 부담스러운 정보를 저장하기 위해 사용하는 데이터 관리 기법.

 

SharedPreferences는 xml파일형태로 앱의 데이터폴더에 저장이 됩니다.

data/data/(package_name)/shared_prefs/SharedPreference

따라서 앱을 삭제하는 경우 데이터 또한 함께 삭제됩니다.

 

2. InsecureBank의 SharedPreferences를 확인해보자

 

adb shell

 

cd /data/data/com.android.insecurebankv2/shared_prefs

(/data/data에 접근이 안되는 경우, su를 입력해서 root shell로 접근해야 합니다.)

 

cat, vi 등등 에디터를 이용해서 mySharedPreferences.xml파일을 열어줍니다.

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="superSecurePassword">DTrW2VXjSoFdg0e61fHxJg==&#10;    </string>
    <string name="EncryptedUsername">ZGluZXNo&#13;&#10;    </string>
</map>

 superSecurePassword와 EncryptedUsername이 존재하는 것을 볼 수 있습니다.

 

username과 password가 암호화되어서 저장된다고 유추할 수 있습니다. 

 

EncryptedUsername의 값은 ZGluZXNo인데, 이 값을 Base64Decode를 해보면, dinesh가 나오는 것을 알 수 있습니다.

 

3. 앱 내부에서 어떻게 사용되는지 알아보자.

 

이전과 마찬가지로 Bytecode Viewer를 통해 apk를 분석합니다.

 

왼쪽 하단의 Search에서 Regex로 getSharedPreferences를 검색합니다.

 

그중 첫 결과를 보면 Dologin클래스의 saveCreds메소드에서 사용하는 것을 확인할 수 있습니다.

 

  private void saveCreds(String paramString1, String paramString2)
    throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
  {
    SharedPreferences.Editor localEditor = this.this$0.getSharedPreferences("mySharedPreferences", 0).edit();
    this.this$0.rememberme_username = paramString1;
    this.this$0.rememberme_password = paramString2;
    paramString2 = new String(Base64.encodeToString(this.this$0.rememberme_username.getBytes(), 4));
    paramString1 = new CryptoClass();
    this.this$0.superSecurePassword = paramString1.aesEncryptedString(this.this$0.rememberme_password);
    localEditor.putString("EncryptedUsername", paramString2);
    localEditor.putString("superSecurePassword", this.this$0.superSecurePassword);
    localEditor.commit();
  }

처음 getSharedPreferences를 이용해 "mySharedPreferences"를 만듭니다.

 

메소드의 인자1(아이디)는, Base64로 encode하고, 인자2(비밀번호)는 CryptoClass의 aesEncryptedString을 이용해서 aes암호화를 하는 것 같습니다.

 

SharedPreferences를 자동로그인을 구현하기위해 사용할 땐, 위와같이 암호화를 하여 저장합니다.

 

CryptoClass를 보면, 취약한 부분을 볼 수 있습니다. 

 

public class CryptoClass
{
  String base64Text;
  byte[] cipherData;
  String cipherText;
  byte[] ivBytes = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  String key = "This is the super secret key 123";
  String plainText;
  
  public static byte[] aes256decrypt(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, byte[] paramArrayOfByte3)
    throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
  {
    paramArrayOfByte1 = new IvParameterSpec(paramArrayOfByte1);
    paramArrayOfByte2 = new SecretKeySpec(paramArrayOfByte2, "AES");
    Cipher localCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    localCipher.init(2, paramArrayOfByte2, paramArrayOfByte1);
    return localCipher.doFinal(paramArrayOfByte3);
  }
  
  public static byte[] aes256encrypt(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2, byte[] paramArrayOfByte3)
    throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
  {
    paramArrayOfByte1 = new IvParameterSpec(paramArrayOfByte1);
    paramArrayOfByte2 = new SecretKeySpec(paramArrayOfByte2, "AES");
    Cipher localCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    localCipher.init(1, paramArrayOfByte2, paramArrayOfByte1);
    return localCipher.doFinal(paramArrayOfByte3);
  }

AES의 key가 하드코딩되어 있기 때문에, 이를 이용해서 AES를 decrypt할 수 있습니다.

 

https://www.devglan.com/online-tools/aes-encryption-decryption 온라인 AES툴을 이용하여 처음에 알아냈던

DTrW2VXjSoFdg0e61fHxJg== AES encrypt되어있는 값을 해당 key로 decrypt하게되면

Base64결과 값이 나오게 되며, decode해주면 Dinesh@123$로 비밀번호를 알아낼 수 있습니다.

'안드로이드 > InsecureBank' 카테고리의 다른 글

[InsecureBank] #4 Exploiting Android Content Provider  (0) 2020.01.10
[InsecureBank] #3 Exploiting Android Activities  (0) 2020.01.08
[InsecureBank] #2 Application patching , Week Auth  (0) 2020.01.08
[InsecureBank] #1 환경 구축하기  (0) 2020.01.07
Posted by ICEB34R
블로그 이미지

공부하는 아이스베어는 귀엽습니다..!

by ICEB34R

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

  • fastbin dup
  • 안드로이드취약점
  • hackerone #버그 바운티 분석 #css injection #slack
  • babyheap
  • 안드로이드
  • pwnable
  • InsecureBank
  • 앱취약점
  • 인시큐어뱅크
  • 안드로이드모의해킹
  • malloc
  • 0ctf
  • 앱모의해킹
  • fastbin
  • write-up

글 보관함

«   2025/05   »
일 월 화 수 목 금 토
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

카테고리

ICEBEAR's workbench (27)
Web Hacking (6)
메모장 (1)
hackerone 바운티 분석 (1)
Pwnable (15)
낙서장 (0)
탐구 (2)
Write-up (1)
Window Exploit (1)
Whois pwnable assignment (7)
안드로이드 (5)
InsecureBank (5)
IoT (1)
잡담 (0)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
ICEB34R's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

ICEBEAR can pwn...

공부하는 아이스베어는 귀엽습니다..!

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • ICEBEAR's workbench (27)
    • Web Hacking (6)
      • 메모장 (1)
      • hackerone 바운티 분석 (1)
    • Pwnable (15)
      • 낙서장 (0)
      • 탐구 (2)
      • Write-up (1)
      • Window Exploit (1)
      • Whois pwnable assignment (7)
    • 안드로이드 (5)
      • InsecureBank (5)
    • IoT (1)
    • 잡담 (0)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바