虫洞漏洞挖掘研究

Android应用可能会使用sockets(TCP、UDP、UNIX)在应用间或者自身应用组件间进行通讯,然而这种通讯方式自己并无提供任何身份认证。
● 当开放端口绑定到0.0.0.0,那么任何IP均可以访问。
● 当开放端口绑定到127.0.0.1,那么同一设备上的应用依然能够访问。
一旦端口访问身份验证不严,就有可能产生漏洞,形成远程命令执行。浏览器

漏洞挖掘方法

一、查看应用端口开放状况

方法一app

(1)使用netstat命令查看端口开放状况。
含义以下:socket

Listen *:80
Listen 0.0.0.0:80
Listen 127.0.0.1:80
Listen 192.168.0.5:80

The above options show up as:-tcp

:::80
0.0.0.0:80
127.0.0.1:80
192.168.0.5:80

and translate to:-函数

● Listen on any IP address (IPv4 or IPv6)
● Listen on any IPv4 address on that server
● Listen on IPv4 localhost only
● Listen on external IPv4 address 192.68.0.5

(2)选择感兴趣的端口转换成16进制,查看位于/proc/net/目录下对应socket套接字,在其中找到使用该端口的uid,经过uid能够得知应用用户名。测试

(3)经过用户名找到appui

方法二url

直接使用netstat plus这个APP进行查看。spa

二、定位核心代码

得知某个应用开放某个端口后,接下来能够在该应用的逆向代码中搜索端口号(一般是16进制表示),重点关注ServerSocket(tcp)、DatagramSocket(udp)等类,定位到关键代码,进一步探索潜在攻击面。线程

漏洞挖掘示例

以sina微博5.2.0版本为例,介绍虫洞漏洞挖掘过程。
咱们经过netstat plus发现sina微博在本地监听了两个端口:8967和9527

下面是监听8967端口的代码

经过分析代码可知这是一个普通的socket通讯。
监听9527端口的代码在native层,libweibohttp.so的start_httpd()函数中,如图所示。

该函数调用了另一个函数用来处理http请求:

咱们由此能够得知,这其实是实现了一个http server,绑定9527端口到127.0.0.1。咱们追踪这个native函数到Java层代码,发现它是在一个线程中调用的。

调用initHttpd这个native函数以前,分别实例化了类c和类b。跟进这个两个类,发现它们都继承了IMiniPlugin类。类中的isServer和server函数在native代码中进行了调用:

咱们来看看c类中isServer和server函数的具体实现:

经过这几个函数调用,咱们知道这段代码首先判断传入的用户请求路径是否包含"/query"或者"/si"字符串,而后作出不一样的处理。经过代码分析和参数拼接,咱们获得

http://127.0.0.1:9527/query?appid=com.sina.weibo
http://127.0.0.1:9527/si?act=action
http://127.0.0.1:9527/si?cmp=应用包名_activity名
http://127.0.0.1:9527/si?data=data

再看看b类中isServer和server函数的具体实现:

判断传入的用户请求路径是否包含"/login"字符串,一样经过代码分析和参数拼接,咱们获得

http://127.0.0.1:9527/login?callback=xxx

咱们把这些url在手机浏览器中测试,发现

(1)经过如下连接能够打开用户手机上已安装应用的相关组件:

http://127.0.0.1:9527/si?act=action

http://127.0.0.1:9527/si?cmp=应用包名_activity名

http://127.0.0.1:9527/si?data=data

(2)经过http://127.0.0.1:9527/query?appid=com.sina.weibo能够获取到应用的安装信息,若是没有安装则返回“not install”

(3)经过http://127.0.0.1:9527/login?callback=xxx这个应该是获取登陆用户信息的,可是不知道为何老是测试不成功。

漏洞防护

应用通讯过程当中应增长身份校验。

相关文章
相关标签/搜索