Don't Overreact
2 minutos de lectura
Se nos proporciona un archivo APK (app-release.apk
).
Extracción de APK
Del nombre del reto, podemos pensar en React Native para desarrollo de aplicaciones móviles. De momento, vamos a extraer el contenido del archivo APK con apktool
:
$ apktool d app-release.apk
I: Using Apktool 2.6.1 on app-release.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: ~/.local/share/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
$ cd app-release
$ ls
AndroidManifest.xml apktool.yml assets lib original res smali unknown
Como esperábamos, dentro de assets
encontramos un archivo llamado index.android.bundle
, que es el código JavaScript minificado de la aplicación:
$ ls assets
index.android.bundle
Análisis de JavaScript
Desafortunadamente, no existe un archivo de sourceMap
(index.android.bundle.map
), por lo que tenemos que analizar el código JavaScript minificado…
Después de ojear el código en el navegador (lo cual es útil ya que permite formatear el código para hacerlo más legible), vemos algunas cadenas de texto al final que contienen hackthebox
:
$ tail assets/index.android.bundle
__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(t){fetch(r(d[0])().url+'open-url',{method:'POST',body:JSON.stringify({url:t})})}},395,[396]);
__d(function(g,r,i,a,m,e,d){'use strict';var l,t,n=r(d[0])(r(d[1])),u='http://localhost:8081/';m.exports=function(){var o;if(void 0===l){var s=n.default.getConstants().scriptURL,c=s.match(/^https?:\/\/.*?\//);l=c?c[0]:null,t=c?s:null}return{url:null!=(o=l)?o:u,fullBundleUrl:t,bundleLoadedFromServer:null!==l}}},396,[3,171]);
__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]),l=r(d[1])(r(d[2])),u=t.StyleSheet.create({highlight:{fontWeight:'700'}}),n=t.Platform.select({ios:function(){return l.default.createElement(t.Text,null,"Press ",l.default.createElement(t.Text,{style:u.highlight},"Cmd + D")," in the simulator or",' ',l.default.createElement(t.Text,{style:u.highlight},"Shake")," your device to open the React Native debug menu.")},default:function(){return l.default.createElement(t.Text,null,"Press ",l.default.createElement(t.Text,{style:u.highlight},"Cmd or Ctrl + M")," or",' ',l.default.createElement(t.Text,{style:u.highlight},"Shake")," your device to open the React Native debug menu.")}});e.default=n},397,[1,3,47]);
__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]),l=r(d[1])(r(d[2])),o=t.StyleSheet.create({highlight:{fontWeight:'700'}}),u=t.Platform.select({ios:function(){return l.default.createElement(t.Text,null,"Press ",l.default.createElement(t.Text,{style:o.highlight},"Cmd + R")," in the simulator to reload your app's code.")},default:function(){return l.default.createElement(t.Text,null,"Double tap ",l.default.createElement(t.Text,{style:o.highlight},"R")," on your keyboard to reload your app's code.")}});e.default=u},398,[1,3,47]);
__d(function(g,r,i,a,m,e,d){m.exports=r(d[0]).registerAsset({__packager_asset:!0,httpServerLocation:"/assets",width:177,height:33,scales:[1],hash:"364ec975243cfa24b8c9b8cc5247747c",name:"logo-htb",type:"png"})},399,[393]);
__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.myConfig=void 0;var t={importantData:"baNaNa".toLowerCase(),apiUrl:'https://www.hackthebox.eu/',debug:'SFRCezIzbTQxbl9jNDFtXzRuZF9kMG43XzB2MzIyMzRjN30='};e.myConfig=t},400,[]);
__d(function(e,o,m,s,t,a,c){t.exports={name:"AwesomeProject",displayName:"AwesomeProject"}},401,[]);
__r(73);
__r(0);
//# sourceMappingURL=index.android.bundle.map
Vamos a fijarnos mejor:
$ tail assets/index.android.bundle | grep hackthebox
__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.myConfig=void 0;var t={importantData:"baNaNa".toLowerCase(),apiUrl:'https://www.hackthebox.eu/',debug:'SFRCezIzbTQxbl9jNDFtXzRuZF9kMG43XzB2MzIyMzRjN30='};e.myConfig=t},400,[]);
$ tail assets/index.android.bundle | grep -o 'hackthebox.*$'
hackthebox.eu/',debug:'SFRCezIzbTQxbl9jNDFtXzRuZF9kMG43XzB2MzIyMzRjN30='};e.myConfig=t},400,[]);
Hay una string rara ahí. Parece que está codificada en Base64.
Flag
Y de hecho, es la flag:
$ echo SFRCezIzbTQxbl9jNDFtXzRuZF9kMG43XzB2MzIyMzRjN30= | base64 -d
HTB{23m41n_c41m_4nd_d0n7_0v32234c7}