再谈APP网络端口开放问题

0x00 网络端口开放概述

网络端口开放问题已经成为攻击者实现移动终端远程攻击的几大重要入口之一,但端该问题一直以来未受到广大开发人员的重视,直到百度虫洞的披露,将这个安全问题带来的严重危害赤裸裸的暴露在用户、开发者以及安全人员面前,大家才正真的意识到问题的严重性。

APP开发过程中,为了实现某些特定功能,如厂商的应用推广、信息收集和上报、和PC进行交互等,会在APP中创建一个TCP OR http Server,并绑定到特定的端口上进行监听:IP: PORT,接收本地或远程客户端的链接请求。

Server接收Client端发来的请求数据/控制指令,并进行解析执行,调用对应的接口函数/后门函数,实现如安装指定应用、获取终端信息、获取账户信息、文件上传下载等功能,因此这些后门函数一旦被恶意攻击发掘并成功调用,将对用户造成严重危害。

0x01 网络端口开放威胁扫描

我们从应用商店随机拉取了100个热门应用,通过某漏洞扫描系统进行专项的端口威胁扫描,这里简单概述一下扫描方式。该系统包含了静态和动态扫描引擎,关于端口威胁的扫描,部分扫描规则配置文件如下:

<signatureid=”e10566″type=”api”>
<logo>true</logo>
<name>&lt;init&gt;</name>
<cclass>Ljava/net/InetSocketAddress;</cclass>
</signature>

<signatureid=”e10567″type=”api”>
<logo>false</logo>
<name>bind</name>
<cclass>Ljava/net/ServerSocket;</cclass>
</signature>

<signatureid=”e10568″type=”api”>
<logo>true</logo>
<name>&lt;init&gt;</name>
<cclass>Ljava/net/DatagramPacket;</cclass>
</signature>

<signatureid=”e10569″type=”api”>
<logo>false</logo>
<name>send</name>
<cclass>Ljava/net/DatagramSocket;</cclass>
</signature>

<signatureid=”e10570″type=”api”>
<logo>true</logo>
<name>accept</name>
<cclass>Ljava/net/ServerSocket;</cclass>
</signature>

<signatureid=”e10571″type=”api”>
<logo>true</logo>
<name>receive</name>
<cclass>Ljava/net/DatagramSocket;</cclass>
</signature>

<logic>
<pattern>(e10566 and e10567 and e10570) or (e10568 and e10569 and e10571)</pattern>
<scope>apk</scope>
</logic>

经过静态扫描引擎扫描后,将扫描命中的APP输入到动态扫描引擎,安装启动应用,获取到APP实际运行过程中开放的端口信息:
 

以下是批量扫描的结果:

从结果中,我们发现影音类的APP端口开放现象尤为普遍:

APP名称 版本 开放的端口信息 APK MD5
百度视频 7.19.3 0::ffff:127.0.0.1:8058 c8ae251b1e04c7516e4e975abe96ea93
0 ::ffff:127.0.0.1:38008
……
芒果TV 4.5.5 00.0.0.0:20109 25c945a60f0b40c8cf61f1f288b2fe2b
0 0.0.0.0:30107
……
乐视视频 6 00.0.0.0:6990 944a15a6eb3258bdbf9a7b3f26d806e2
 0 0.0.0.0:1443
……
PPTV网络电视 5.2.4 00.0.0.0:1578 d4d096681bb3da0da55c6ae03e1a6e3e
0 0.0.0.0:1790
……
爱奇艺 6.8.0
暴风影音 5.2.39 00.0.0.0:9090 65db381e8811d3bb82b62968959d5d0f
0 0.0.0.0:56339
……
QQ音乐 5.7.1.5  0 0.0.0.0:49152  0CF6E6BE8470004BB5E8C56A1F7FF4F6
腾讯视频 4.5.0.9698 00.0.0.0:12024 F6247965EED0CE4EAF095DB7AD83A243
0 0.0.0.0:15418
……
百度音乐播放器 5.6.5.2 00.0.0.0:13000 52e21114b9a32a2de5c083679a9d2e38
搜狐视频 5.1.0 00.0.0.0:9010 2dc97f79583cd9e635e6b2fb707d988e

另外,市场上比较热门的应用,如新浪微博、360手机助手、一号店、一些应用分发APP等也在本地开启网络端口进行监听,其中部分程序开启的端口可被利用,进而调用本地的一些危险后门接口。

庆幸的是,截止目前,以上部分应用已经通过关闭端口、移除高危接口函数、加强通信客户端的身份检测、执行条件限制等方式对端口开放问题进行了修复。

0x02 细数端口开放漏洞的代表作

案例一、百度wormhole

Moplus是百度自身应用中集成的一个SDKSDK中的com.baidu.android.moplus.MoPlusService用于开启一个HTTP server,并绑定在6259/40310端口进行监听,这里以百度云7.8.3为例:

sdk中对于接收到的连接请求没有做任何限制或过滤,直接解析执行,导致任意IP可以对目标的客户端发送请求,执行后门函数:

攻击截图:

受百度wormhole影响的APP列表(以下数据来源于:http://drops.wooyun.org/papers/10061):

足球直播

悦动圈跑步

贴吧看片

百度贴吧简版

PhotoWonder

足球巨星

优米课堂

贴吧饭团

百度贴吧HD

hao123特价

足彩网

音悦台

视频直播

百度输入法

CCTV手机电视

卓易彩票

移动91桌面

生活小工具

百度手机助手

91桌面

助手贴吧

央视影音

上网导航

百度手机游戏

91助手

中国足彩网

修车易

全民探索

百度视频HD

91爱桌面

中国蓝TV

小红书海外购物神器

穷游

百度视频

91 Launcher

中国蓝HD

侠侣周边游

途牛网

百度浏览器

365彩票

珍品网

物色

汽车之家

百度翻译

购车族

掌上百度

万达电影

拇指医生

百度地图DuWear版

彩票365

萌萌聊天

歌勇赛

爆猛料

百度地图

百度贴吧青春版

美西时尚

凤凰视频

百姓网

百度HD

PPS影音

么么哒

风云直播Pro

百度桌面Plus

百度

Selfie Wonder

蚂蚁短租

多米音乐

百度云

安卓市场

百度图片

旅游攻略

都市激情飙车

百度游戏大全

爱奇艺视频

彩票到家

乐视视频

懂球帝

百度音乐2014

VidNow

经理人分享

酷音铃声

蛋蛋理财

百度新闻

Video Now

口袋理财

穿越古代

百度团购

T2F话友

案例二、新浪微博

新浪微博V5.2.0存在端口开放漏洞,通过该漏洞可以调起新浪微博的未导出组件、获取用户的登陆状态信息、作为攻击第三方应用的跳板。新浪微博在libweibohttp.so中实现了一个httpserver,并绑定了127.0.0.1在端口9527进行监听:

Java层对应的功能代码位于com\sina\weibo\utils\weibohttpd\a,b,c三个文件内,主要实现了三个功能:

1)在用户登陆的情况下,获取用户的登陆状态信息

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

关键代码:

攻击截图:

2)获取终端上任意APP的基本信息

http://127.0.0.1:9257/query?appid=com.rytong.bankbj

3)调起微博任意组件,包括未导出组件

htpp://127.0.0.1:9257/si?cmp=com.sina.weibo_com.sina.weibo.ChooseGoodsActivity

打开未导出组件工程模式,在APP权限内执行任意命令,这里如果微博客户端具有root权限,攻击者将可以通过微博获取懂啊root权限,控制用户手机。
关键代码:

攻击截图:

案例三、360手机助手

360手机助手V3.4.7本地开启了一个http服务,该服务会监听手机的38517端口,并且允许远程IP连接:

恶意攻击者可以远程链接到被攻击客户端,通过360手机助手在用户终端进行一些列操作,如自动下载恶意程序并伪装为终端上已安装程序的升级程序,或者一些热门应用,诱导用户点击安装等。关键代码如下:

攻击的URL格式:

http://ip:38517/in?url=downloadurl&sign=md5(downloadurl+key)&logo=pngurl&name=appname

其中可以是硬编码的,所以sign可以轻松的计算出来;logoname可以自定义,用于欺骗用户,如下图:

0x03 结语


上图是乌云上某安全人员对某一重大后门漏洞的回复,从中可以看出:
1)为了这样or那样的目的,后门总是存在的,就看会不会被发现、能不能被利用、可不可被披露。
2)后门就在那里,尽管被发现、被利用、被披露,但竟然可以被隐藏而不愿去关闭。希望以上只是属于个例。实际中很多后门被发现被利用后,开发者会移除一些高危函数,加强对应的安全策略。

从安全研究人员的角度来说,我们不推荐或者说不赞同开发者在应用程序中留有后门,但是事实并不能如我们所愿,以下是固执坚持留后门的开发者的建议:
1)把门做坚固:通信数据加密,命令格式复杂化,移除对功能影响不大的高危接口,避免硬编码一些关键数据;
2)把门做隐蔽:关键代码做混淆做加固;
3)通行条件做苛刻:对数据来源做过滤,做身份验证。

但最安全、最值得推荐的方法依然是:NO DOOR,NO WAY

转载自:http://www.bigniu.com/article/view/10    原文作者:duanwangye