[InsecureBank] #5 Exploiting Weak Cryptography
이번에 볼 것은 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== </string>
<string name="EncryptedUsername">ZGluZXNo </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 |