SekaiCTF 2024 - CrackMe

Posted on Mon 26 August 2024 in CTF

문제 분석

문제를 보면 apk 파일을 하나 제공한다. 해당 어플은 React로 만들어져 있으며 ID(Email)과 Password를 받아서 로그인하는 기능을 포함하고 있다.

소스 코드 분석

주어진 apk 파일의 assets/index.android.bundle 에는 이 어플을 만드는데 사용한 js 코드를 볼 수 있다. 그리고 이 코드에는 다음과 같은 코드가 포함되어 있다.

    t.setState({ verifying: true });
    var n = (0, k.initializeApp)(T.default), o = (0, A.getDatabase)(n);
    '[email protected]' !== t.state.email || false === 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: false });
        var n = (0, A.ref)(o, 'users/' + e.user.uid + '/flag');
        (0, A.onValue)(n, function () {
            t.setState({ verifying: false });
            t.setState({
                errorTitle: 'Hello Admin',
                errorMessage: 'Keep digging, you\'re almost there!'
            });
            t.AlertPro.open();
        });
    }).catch(function (e) {
        t.setState({ verifying: false });
        var n = e.code, o = e.message;
        'auth/wrong-password' === n ? (t.setState({
            password: '',
            wrongPwd: true,
            errorTitle: 'Password Error',
            errorMessage: 'Password is incorrect, please check again'
        }), t.AlertPro.open()) : 'auth/invalid-email' === n ? (t.setState({
            email: '',
            password: '',
            wrongEmail: true,
            errorTitle: 'Email error',
            errorMessage: 'Invalid email, please check again'
        }), t.AlertPro.open()) : (t.setState({
            email: '',
            password: '',
            errorTitle: 'Error',
            errorMessage: o
        }), t.AlertPro.open());
    });
}), function (e) {
    return o.apply(this, arguments);
}), e.validatePassword = function (e) {
    if (17 !== e.length) {
        return false;
    }
    var t = R.default.enc.Utf8.parse(b.default.KEY), n = R.default.enc.Utf8.parse(b.default.IV);
    return '03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524' === R.default.AES.encrypt(e, t, { iv: n }).ciphertext.toString(R.default.enc.Hex);

위를 보면 알 수 있듯이 email은 admin@sekai.team 이고, password를 AES로 암호화한 값이 03afaa672ff078c63d5bdb0ea08be12b09ea53ea822cd2acef36da5b279b9524 이면 로그인에 성공한다.

풀이

apk 수정

apk를 수정하기 위해서는 Android Studio SDK의 apksigner와 JDK의 keygen, apktool가 필요하다.

  1. apktool d 를 통해 apk 파일을 압축해제한다.
  2. keytool -genkey 을 통해 keystore 파일을 만든다.
  3. assets/index.android.bundleconsole.log 등을 적절히 추가한다.
  4. apktool b 를 통해 apk 파일을 압축한다.
  5. apksigner sign --ks 를 통해 apk에 서명을 한다.
  6. 추가적인 수정이 필요하면 3으로 돌아간다.

그리고 수정한 apk에서 console.log 를 통해 출력한 값은 adb의 logcat을 통해 확인할 수 있다.

AES 정보 추출

위와 같은 수정을 통해 AES.encrypt에서 사용하는 KEY와 IV를 알아낼 수 있고 그 값은 다음과 같다.

  • KEY: react_native_expo_version_47.0.0
  • IV: __sekaictf2023__

위 값을 사용해서 암호화된 비밀번호를 복호화하면 s3cr3t_SEKAI_P@ss 가 나온다.

서버 접근 및 플래그 획득

다음 값을 통해 로그인하면 firebase 서버에 접근하는 것을 볼 수 있다.

  • Email: admin@sekai.team
  • Password: s3cr3t_SEKAI_P@ss

Firebase에 접근해서 받아오는 패킷에 플래그가 있는 것을 확인할 수 있다.