Android_CTF: kgb_messenger

186 阅读2分钟

环境:kgb_messenger.apk,测试机:OnePlus Andorid 9 

  1. Alerts

安装该apk后,使用发现如下的界面

​编辑

 用 jadx 反编译该 apk,搜索字符串 "Russian", 在MainActivity中发现了以上字符串,且代码逻辑如下

​编辑

 其中 System.getProperty() 函数用于获取当前系统属性,包括 java版本、操作系统版本等信息,其中可以获得的属性值,参见:JAVA 命令参数详解:-D_枝叶飞扬_新浪博客

其中 System.getenv() 函数用于获取指定的环境变量的值。

审计代码,发现,会判断 user.home 对应的系统属性的值是否为 Russia, 然后判断 USER 对应的环境变量是否为 R.string.User 对应的字符串的值,如果两个判断都通过,则会启动一个 LoginActivity。

首先想去看一下 R.string.User 对应的字符串是啥,R.string.User 表示在res文件夹中,定义了一个string类型的名为 User 的字符串。于是用apktool 如下命令对该apk解压

java -jar apktool.jar d xxx.apk

并在res文件夹下使用如下命令搜索 User 字符串

​编辑

 结合搜索结果来看,果然在strings.xml文件中,定义了一个名为 User 的字符串,其对应的值明显是一个base64编码的字符串,不管三七二十一,先拿去base64解码再说,解码后得到FLAG:FLAG{57ERL1NG_4RCH3R}

  1. Login

在1中的MainActivity中,想要进入

startActivity(new Intent(this, LoginActivity.class));

就必须得进入else分支,于是想到直接去修改Smali文件,删除前两个if-else if的分支check,直接进入第三个else分支,启动LoginActivity。

查看对应MainActivity.java的smali代码(该文件存在于之前使用apktool解压后的文件夹中,存在于对应的smali文件夹中),对smali代码进行修改,然后重打包成apk。将onCreate()函数中的两个if-else if分支中的内容注释掉,尤其注意要把 :goto_0 return-void 移到函数末尾,否则会直接执行 return-void

.method protected onCreate(Landroid/os/Bundle;)V
    .locals 3

    invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V

    const v0, 0x7f09001c

    invoke-virtual {p0, v0}, Lcom/tlamb96/kgbmessenger/MainActivity;->setContentView(I)V

    const-string v0, "user.home"

    invoke-static {v0}, Ljava/lang/System;->getProperty(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v0

    const-string v1, "USER"

    invoke-static {v1}, Ljava/lang/System;->getenv(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v1

    # if-eqz v0, :cond_0

    # invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z

    # move-result v2

    # if-nez v2, :cond_0

    # const-string v2, "Russia"

    # invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    # move-result v0

    # if-nez v0, :cond_1

    # :cond_0
    # const-string v0, "Integrity Error"

    # const-string v1, "This app can only run on Russian devices."

    # invoke-direct {p0, v0, v1}, Lcom/tlamb96/kgbmessenger/MainActivity;->a(Ljava/lang/String;Ljava/lang/String;)V

    # :goto_0
    # return-void

    # :cond_1
    # if-eqz v1, :cond_2

    # invoke-virtual {v1}, Ljava/lang/String;->isEmpty()Z

    # move-result v0

    # if-nez v0, :cond_2

    # invoke-virtual {p0}, Lcom/tlamb96/kgbmessenger/MainActivity;->getResources()Landroid/content/res/Resources;

    # move-result-object v0

    # const/high16 v2, 0x7f0d0000

    # invoke-virtual {v0, v2}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;

    # move-result-object v0

    # invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    # move-result v0

    # if-nez v0, :cond_3

    # :cond_2
    # const-string v0, "Integrity Error"

    # const-string v1, "Must be on the user whitelist."

    # invoke-direct {p0, v0, v1}, Lcom/tlamb96/kgbmessenger/MainActivity;->a(Ljava/lang/String;Ljava/lang/String;)V

    # goto :goto_0

    :cond_3
    invoke-static {p0}, La/a/a/a/a;->a(Landroid/content/Context;)V

    new-instance v0, Landroid/content/Intent;

    const-class v1, Lcom/tlamb96/kgbmessenger/LoginActivity;

    invoke-direct {v0, p0, v1}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

    invoke-virtual {p0, v0}, Lcom/tlamb96/kgbmessenger/MainActivity;->startActivity(Landroid/content/Intent;)V

    goto :goto_0
    
    :goto_0
    return-void
.end method

修改完smali文件后,对apk进行重打包和签名,完成后在手机上安装签名后的apk。打开对应APP后,直接进入了LoginActivity对应的登录界面。

3. Social Engineering

这一步是需要输入正确的用户名和密码,完成登录。通过审计代码发现用户名是定义在res文件夹中的一个字符串 "codenameduchess",密码是一个md5()后的哈希值,直接丢到网站上无法破解成功,官方的writeup中写的是

用户名codenameduchess其实是一个动漫里Archer中特工的代号,代号为duchess

然后google对应的内容就可以拿到duchess的账号密码:guest。输入对应的账号和密码就可以成功登录,拿到flag。

(这脑洞就离谱??谁猜得到啊?!)