安装应用打开,发现要求登录,但是无法注册
首先用 jadx打开apk,看看 Java 代码,但是并没有什么有价值的发现
但是Java代码中有 react-native 的调用,所以我们可以猜到这是用 react-native 框架开发的,
我们的关键是找到对应的 js 代码
先用apktool反编译apk,找到assets目录下的index.android.bundle文件,这是打包后的js代码
apktool d CrackMe.apk
不知道assets目录下的index.android.bundle是打包后的js代码也没关系
我们可以尝试用vscode打开这个文件夹,然后搜索关键字,比如login,admin,sekai等
还是可以直接定位到关键代码的
我们将index.android.bundle美化一下,方便阅读
js-beautify
或者用react-native-decompile
npx react-native-decompiler -i ./index.android.bundle -o ./output
反编译
可以看到几个关键信息,管理员账户邮箱应该是admin@sekai.team
,认证成功后应该会访问一个users/user.uid/flag
的地址
换个关键词sekai
搜索,可以看到一个AES加密的函数
但是密文没找到,再换个关键词password
搜索
那好办了,先解一下AES加密
1 2 3 4 5 6 7 8 9 10 11 from Crypto.Cipher import AESfrom Crypto.Util.Padding import unpadusr = 'admin@sekai.team' enc = bytes .fromhex('03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524' ) key = b'react_native_expo_version_47.0.0' iv = b'__sekaictf2023__' cipher = AES.new(key, AES.MODE_CBC, iv) pwd = unpad(cipher.decrypt(enc), AES.block_size).decode() print (pwd)
得到密码s3cr3t_SEKAI_P@ss
,登录试试
还差点东西,回过头看登录的验证代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 (e._verifyEmail = ((o = (0 , t.default )(function * (t) { t.setState ({ verifying : !0 }); var n = (0 , k.initializeApp )(T.default ), o = (0 , A.getDatabase )(n); "admin@sekai.team" !== t.state .email || !1 === e.validatePassword (t.state .password ) ? console .log ("Not an admin account." ) : console .log ("You are an admin...This could be useful." ); var s = (0 , M.getAuth )(n); (0 , M.signInWithEmailAndPassword )( s, t.state .email , t.state .password , ) .then (function (e ) { t.setState ({ verifying : !1 }); var n = (0 , A.ref )(o, "users/" + e.user .uid + "/flag" ); (0 , A.onValue )(n, function ( ) { t.setState ({ verifying : !1 }), t.setState ({ errorTitle : "Hello Admin" , errorMessage : "Keep digging, you're almost there!" , }), t.AlertPro .open (); }); })
有两个关键的函数initializeApp
和getDatabase
,这是firebase的函数
Firebase是一个后端即服务(BaaS)的平台,提供了数据库、云存储、身份验证等功能
我们可以尝试与服务器交互,先搜索一下firebase参数
可以看到firebase的配置信息,我们可以尝试用这个信息登录firebase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import pyrebaseconfig = { "apiKey" : "AIzaSyCR2Al5_9U5j6UOhqu0HCDS0jhpYfa2Wgk" , "authDomain" : "crackme-1b52a.firebaseapp.com" , "databaseURL" : "https://crackme-1b52a-default-rtdb.firebaseio.com" , "storageBucket" : "crackme-1b52a.appspot.com" , "projectId" : "crackme-1b52a" , } firebase = pyrebase.initialize_app(config) auth = firebase.auth() user = auth.sign_in_with_email_and_password("admin@sekai.team" , "s3cr3t_SEKAI_P@ss" ) db = firebase.database() data = db.child("users" ).child(user['localId' ]).child("flag" ).get(user.get('idToken' )) print (data.val())
得到flagSEKAI{15_React_N@71v3_R3v3rs3_H@RD???}