Desprecitor - BreizhCtf 2018
This write up is about the second APK that was given to us at the BreizhCTF : Desprecitor
Decompilation
To reverse Android application, I usually start by reversing the source code . For that i use 2 tools : Jadx and APKTool when Jadx is not sufficient.
For this chall, I only used Jadx with the command
jadx Desprecitor.apk
Once this command executed desassembled file of this applications are located in the folder Desprecitor.
Here I also unzipped the apk to get the file enc.bin from the assets folder.
Finding the vulnerability
We are given 3 interesting files :
Data.java
package fr.breizhctf.saxx.desprecito;
import java.io.Serializable;
import javax.crypto.SealedObject;
import javax.crypto.SecretKey;
public class Data implements Serializable {
private final SecretKey key;
private final SealedObject sealed;
public Data(SealedObject sealed, SecretKey key) {
this.sealed = sealed;
this.key = key;
}
public SealedObject getSealed() {
return this.sealed;
}
public SecretKey getKey() {
return this.key;
}
}
Flag.java
package fr.breizhctf.saxx.desprecito;
import java.io.Serializable;
public class Flag implements Serializable {
private final String flag;
public Flag(String flag) {
this.flag = flag;
}
public String getFlag() {
return this.flag;
}
}
Desprecitor.java
package fr.breizhctf.saxx.desprecito;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SealedObject;
import javax.crypto.SecretKey;
public class Desprecitor {
public static void main(String[] args) throws Exception {
if (args.length != 4) {
System.out.println("Desprecitor <<algorithm>> <<cipher mode>> <<flag>> <<output_file>>");
return;
}
SecretKey secretKey = KeyGenerator.getInstance(args[0]).generateKey();
Cipher theCipher = Cipher.getInstance(args[1]);
theCipher.init(1, secretKey);
Data enc = new Data(new SealedObject(new Flag(args[2]), theCipher), secretKey);
ObjectOutputStream fileObject = new ObjectOutputStream(new FileOutputStream(args[3]));
fileObject.writeObject(enc);
fileObject.close();
System.out.println("File created: " + args[3]);
}
}
And we where also given enc.bin in the assets which contained data that look like serialized data.
Finding the vulnerability
After searching a litlle in the Desprecitor.java we can see that when the flag got encrypted, he was put in a SealedObject which is secure, but the key of the SealedObject and the SealedObject are stored in a Data object. The Data object is then saved in a file using Serialization.
To get back the flag we just have to revert the operation using deserialization.
Getting the password
Here is my Java code that do the opposite :
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SealedObject;
import javax.crypto.SecretKey;
public class Desprecitor {
public static void main(String[] args) throws Exception {
Data e = null;
ObjectInputStream fileObject = new ObjectInputStream(new FileInputStream("enc.bin"));
e = (Data) fileObject.readObject();
SecretKey secretKey = e.getKey();
System.out.println(((Flag)e.getSealed().getObject(secretKey)).getFlag());
fileObject.close();
}
}
And the flag is :
BZHCTF{#Desprecito_Quiero_respirar_tu_DES_CIPHER_despacito#}