安装应用打开,发现要求登录,但是无法注册
首先用 jadx打开apk,看看 Java 代码,但是并没有什么有价值的发现
20240826221927
但是Java代码中有 react-native 的调用,所以我们可以猜到这是用 react-native 框架开发的,
我们的关键是找到对应的 js 代码
先用apktool反编译apk,找到assets目录下的index.android.bundle文件,这是打包后的js代码
apktool d CrackMe.apk
20240826223209
不知道assets目录下的index.android.bundle是打包后的js代码也没关系
我们可以尝试用vscode打开这个文件夹,然后搜索关键字,比如login,admin,sekai等
还是可以直接定位到关键代码的
20240826224149
我们将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的地址
20240826225022
换个关键词sekai搜索,可以看到一个AES加密的函数
20240826225627
但是密文没找到,再换个关键词password搜索
20240826230010
那好办了,先解一下AES加密

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
usr = '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

得到密码s3cr3t_SEKAI_P@ss,登录试试
20240826233643
还差点东西,回过头看登录的验证代码

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();
});
})

有两个关键的函数initializeAppgetDatabase,这是firebase的函数
Firebase是一个后端即服务(BaaS)的平台,提供了数据库、云存储、身份验证等功能
我们可以尝试与服务器交互,先搜索一下firebase参数
20240826234407
可以看到firebase的配置信息,我们可以尝试用这个信息登录firebase

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pyrebase
config = {
"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())
#SEKAI{15_React_N@71v3_R3v3rs3_H@RD???}

得到flagSEKAI{15_React_N@71v3_R3v3rs3_H@RD???}