6.9 KiB
Google CTF 2018 - Giochiamo a un gioco?
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata su HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.
Scarica l'APK qui:
Caricherò l'APK su https://appetize.io/ (account gratuito) per vedere come si comporta l'APK:
Sembra che tu debba vincere 1000000 volte per ottenere la flag.
Seguendo i passaggi di pentesting Android puoi decompilare l'applicazione per ottenere il codice smali e leggere il codice Java usando jadx.
Leggendo il codice Java:
Sembra che la funzione che stamperà la flag sia m().
Modifiche a Smali
Chiamare m() la prima volta
Facciamo sì che l'applicazione chiami m() se la variabile this.o != 1000000, per farlo, basta cambiare la condizione:
if-ne v0, v9, :cond_2
/hive/hacktricks/mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md
Shall we play a game?
Challenge description
This challenge is about a simple Android app that asks the user to play a game. The app has a button that, when pressed, sends a request to the server with the user's input. The server then responds with a message indicating whether the user has won or lost the game.
Analyzing the APK
To start, we need to analyze the APK file of the app. We can use tools like JADX or APKTool to decompile the APK and obtain the source code.
Once we have the source code, we can look for interesting parts that might contain vulnerabilities. In this case, we find a method called sendRequest()
that is called when the button is pressed. Let's take a closer look at this method.
private void sendRequest() {
String userInput = getUserInput();
String url = "https://example.com/game?input=" + userInput;
// Send the request to the server and handle the response
// ...
}
From the code, we can see that the user's input is concatenated with a URL and sent to the server. This is a potential vulnerability, as it could allow for various types of attacks, such as SQL injection or command injection.
Exploiting the vulnerability
To exploit this vulnerability, we can try different inputs and see how the server responds. For example, we can try sending a single quote ('
) as the input. If the server responds with an error message that includes the input, it could indicate a SQL injection vulnerability.
After some testing, we find that the server responds with an error message that includes the input when we send a single quote. This confirms the presence of a SQL injection vulnerability.
Crafting the payload
Now that we know there is a SQL injection vulnerability, we can craft a payload to exploit it. In this case, we can use a UNION-based SQL injection attack to retrieve data from the database.
The payload we can use is ' UNION SELECT table_name, column_name FROM information_schema.columns --
. This payload will retrieve the names of all the tables and columns in the database.
Retrieving the flag
With the payload crafted, we can send it as the input and see what the server responds with. In this case, the server responds with a message that includes the flag: CTF{sh4ll_w3_pl4y_a_g4m3?}
.
Conclusion
In this challenge, we were able to exploit a SQL injection vulnerability in an Android app to retrieve the flag. This highlights the importance of secure coding practices and thorough security testing when developing mobile applications.
if-eq v0, v9, :cond_2
Segui i passaggi di pentest Android per ricompilare e firmare l'APK. Successivamente, caricalo su https://appetize.io/ e vediamo cosa succede:
Sembra che la flag sia scritta senza essere completamente decifrata. Probabilmente la funzione m() dovrebbe essere chiamata 1000000 volte.
Un altro modo per fare ciò è non cambiare l'istruzione ma cambiare le istruzioni confrontate:
Un altro modo è invece di confrontare con 1000000, impostare il valore a 1 in modo che this.o venga confrontato con 1:
Un quarto modo è aggiungere un'istruzione per spostare il valore di v9(1000000) in v0 (this.o):
Soluzione
Fai sì che l'applicazione esegua il loop 100000 volte quando vinci la prima volta. Per farlo, devi solo creare il loop :goto_6 e far sì che l'applicazione salta lì se this.o
non ha valore 100000:
Devi fare questo su un dispositivo fisico perché (non so perché) non funziona su un dispositivo emulato.
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud github repos.