InjuredAndroid 1-5

  • A+
所属分类:移动安全 逆向工程

InjuredAndroid 1-5

一、简述


该项目来自 Kyle B3nac ,是一名全职安全研究员、CTF出题人、漏洞赏金猎人。

该项目是一个Android application靶场,基于漏洞挖掘、漏洞利用,以CTF的形式呈现。

作者建议反编译apk来解题,那就jadx-gui吧。

前五题难度不大,适合初学者练手。

注:FLAG已作打码处理

Github:https://github.com/B3nac/InjuredAndroid

作者对这个项目的介绍:https://twitter.com/B3nac/status/1317185026677641218?s=20

二、writeup

1、XSSTEXT

XSSTEST is just for fun and to raise awareness on how WebViews can be made vulnerable to XSS.

InjuredAndroid 1-5
当前Actvity为 XSSTextActivity ,反编译,看一下程序对输入值的处理过程:

    public void submitText(View view) {
        Intent intent = new Intent(this, DisplayPostXSS.class);
        intent.putExtra("com.b3nac.injuredandroid.DisplayPostXSS", ((EditText) findViewById(R.id.editText)).getText().toString());
        startActivity(intent);
    }

输入的text作为参数直接传给 com.b3nac.injuredandroid.DisplayPostXSS

public final class DisplayPostXSS extends C0459c {
    /* access modifiers changed from: protected */
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        WebView webView = new WebView(this);
        setContentView((View) webView);
        String stringExtra = getIntent().getStringExtra("com.b3nac.injuredandroid.DisplayPostXSS");
        WebSettings settings = webView.getSettings();
        C2646d.m10664b(settings, "vulnWebView.settings");
        settings.setJavaScriptEnabled(true); // 开启WebView的js执行
        webView.setWebChromeClient(new WebChromeClient());
        webView.loadData(stringExtra, "text/html""UTF-8");
    }
}

在该段代码中,可以得到程序新建了一个WebView,并开启了其执行JS的能力。
在这使用最简单的xss payload: <script>alert('xss')</script> ,即可。
InjuredAndroid 1-5
这个例子简单直观的展示了开发者如何导致WebView存在XSS漏洞。

2、 FLAG ONE - LOGIN

输入字符串来验证是否为FLAG
InjuredAndroid 1-5
反编译之后,可以看到点击Button后的处理过程,输入的字符串直接与明文FLAG进行对比:
InjuredAndroid 1-5
输入flag:
InjuredAndroid 1-5

3、 FLAG TWO - EXPORTED ACTIVTY

InjuredAndroid 1-5
绕过main activity 来调用其他可导出的activities

这里使用dorzer:

dz> run app.activity.info -a  b3nac.injuredandroid
Package: b3nac.injuredandroid
  b3nac.injuredandroid.CSPBypassActivity
    Permission: null
  b3nac.injuredandroid.RCEActivity
    Permission: null
  b3nac.injuredandroid.ExportedProtectedIntent
    Permission: null
  b3nac.injuredandroid.QXV0aA
    Permission: null
  b3nac.injuredandroid.DeepLinkActivity
    Permission: null
  b3nac.injuredandroid.MainActivity
    Permission: null
  b3nac.injuredandroid.b25lActivity
    Permission: null
  b3nac.injuredandroid.TestBroadcastReceiver
    Permission: null
  com.google.firebase.auth.internal.FederatedSignInActivity
    Permission: com.google.firebase.auth.api.gms.permission.LAUNCH_FEDERATED_SIGN_IN

依次打开可被导出的组件:

dz> run app.activity.start --component b3nac.injuredandroid  b3nac.injuredandroid.ExportedProtectedIntent
dz> run app.activity.start --component b3nac.injuredandroid  b3nac.injuredandroid.CSPBypassActivity
dz> run app.activity.start --component b3nac.injuredandroid  b3nac.injuredandroid.QXV0aA
dz> run app.activity.start --component b3nac.injuredandroid  b3nac.injuredandroid.b25lActivity //this one 

InjuredAndroid 1-5

4、FLAG THERE - RESOURCES

InjuredAndroid 1-5
看一下Button被触发后的处理流程:

    public final void submitFlag(View view) {
        EditText editText = (EditText) findViewById(R.id.editText2);
        C2646d.m10664b(editText, "editText2");
        if (C2646d.m10663a(editText.getText().toString(), getString(R.string.cmVzb3VyY2VzX3lv))) { // 对比
            Intent intent = new Intent(this, FlagOneSuccess.class);
            new FlagsOverview().mo6178L(true);
            new C1464j().mo6221b(this, "flagThreeButtonColor"true);
            startActivity(intent);
        }
    }

在这,使用apktool来反编译apk

apktool d InjuredAndroid-1.0.10-release.apk -o injured

在values/strings可以看到cmVzb3VyY2VzX3lv的值:
InjuredAndroid 1-5输入flag:
InjuredAndroid 1-5

5、FLAG FOUR - LOGIN2

依然是输入flag,进行验证:
InjuredAndroid 1-5
分析触发Button时的处理逻辑:

    public final void submitFlag(View view) {
        EditText editText = (EditText) findViewById(R.id.editText2);
        C2646d.m10664b(editText, "editText2");
        String obj = editText.getText().toString(); //获取输入
        byte[] a = new C1461g().mo6220a();
        C2646d.m10664b(a, "decoder.getData()");
        if (C2646d.m10663a(obj, new String(a, C2672c.f6838a))) { // compare
            Intent intent = new Intent(this, FlagOneSuccess.class);
            new FlagsOverview().mo6175I(true);
            new C1464j().mo6221b(this"flagFourButtonColor"true); 
            startActivity(intent);
        }
    }


依次分析

       byte[] a = new C1461g().mo6220a(); 
package b3nac.injuredandroid;

import android.util.Base64;

/* renamed from: b3nac.injuredandroid.g */
public class C1461g {

    /* renamed from: a */
    private byte[] f4478a = Base64.decode("NF9vdmVyZG9uZV9vbWVsZXRz"0);
    //Base64.decode("NF9vdmVyZG9uZV9vbWVsZXRz", DEFAULT);  自行decode 得到flag

    /* renamed from: a */
    public byte[] mo6220a() {
        return this.f4478a;
    }
}

可得:a = Base64.decode("NF9vdmVyZG9uZV9vbWVsZXRz", 0); 

if函数的条件

C2646d.m10663a(obj, new String(a, C2672c.f6838a)) //比对obj(即输入)和a的值

分析 C2672c.f6838a 函数

        Charset forName = Charset.forName("UTF-8");
        C2646d.m10666d(forName, "Charset.forName("UTF-8")");
        f6838a = forName;

所以该函数可以简化为:

C2646d.m10663a(obj, new String(a, "UTF-8")) //compare

输入flag

InjuredAndroid 1-5三、Overview

整个靶场共18项,flag项共17个。
InjuredAndroid 1-5


E

N

D



Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。

InjuredAndroid 1-5

我知道你在看

InjuredAndroid 1-5
InjuredAndroid 1-5
InjuredAndroid 1-5

本文始发于微信公众号(Tide安全团队):InjuredAndroid 1-5

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: