*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
*本文作者:GhostSec,本文属于FreeBuf原创奖励计划,未经许可禁止转载
“每个人的手机都是一部窃听器,不管你开不开机,都能被窃听。”在2009年上映的《窃听风云》中吴彦祖饰演的人物有这样一句台词,随着影片热映,“手机窃听”的问题被更多的人顾虑,网络商家也大肆推出各种窃听软件和设备,甚至某宝上也可以买到“GSM阻截器”,但是GSM阻截器需要相关仪器功率巨大,一般几百至几千的售卖多为骗人的假货,相关的技术分析网上有很多,这并不是我们今天谈论的主题。一般的窃听分为物理窃听和软件窃听,而软件窃听的成本相较较低,但是一般的窃听软件买卖信息也为假货。
近日碰到一个让人细思极恐的真实的窃听软件,可以说是把用户扒的一条“胖次”都不剩,这里针对其窃听的隐私内容和实现技术进行简要分析,让大家感受一波,旨在提高自身的安全意识。
一、窃听词云
本次分析的恶意软件伪装成“百度”应用,病毒名称定义为“ A.Privacy.OverHeard.a”,在用户使用时安装之后,会隐藏启动图标,不明所以的用户会认为未安装成功,之后就置之不理了。恶意软件在此之后就会注册广播,监听系统广播开启自身服务,并使用远程控制技术向手机发送各种指令,达到窃听的目的。我们研究的重点在于窃取隐私技术,直接爆破样本,从源码维度对此样本进行追踪分析,看我们日常使用的手机都包含了我们哪些的私密信息,而此恶意软件又能拿我们这些信息对我们造成什么伤害,相信等你看完此报告,一定是一地鸡毛。
下面我们通过一张词云图来直观的感受一下“窃听风云”,OverHeard病毒窃取的用户信息如图1-1所示:
图1-1 窃取隐私词云
二、窃听技术逐个击破
恶意软件在窃取隐私数据时使用UDP协议进行发送加密数据,我们分析其窃取隐私信息最好的方式就是直接找到其协议包发送的源码,对其加密前的数据进行分析。此样本近乎把用户常见的隐私数据全部获取了,而android系统中大部分数据获取都有其相应的API,所以在这里我们针对主要窃取行为进行详细分析,常见窃取行为进行简要分析,简单窃取行为一笔带过或直接忽略。
2.1 用户通话录音及日常录音
OverHeard窃听软件,最重要的功能就是对用户实施监听,但是这种监听的方式并不是实时的,而是通过两种方式实现,一是对用户通话的监听,实现方式是设置用户通话监听,通过用户通话状态的改变来控制录音;二是对用户日常信息的监听,实现方式是通过远程控制,遥控指令控制录音的开启和关闭。最终将录音文件发送到服务器。
两种监听都有一个前提,在android系统中要使用录音功能,需要向用户申请相应的录音权限。录音权限的申请如图2-1所示:
图2-1 窃取隐私词云
取得用户授权之后,就可以使用相应API执行操作。窃听行为的第一种对用户通话实施监听。首先是在其开启的服务TimerService中,实例化对象Audio,并进行初始化init,传入TelephonyManager对象,初始化Audio的代码如图2-2所示:
图2-2 初始化Audio
在Audio初始化时,TelephonyManager设置了一个电话状态的监听PhoneStateListener,在通话状态改变时,分别调用开启录音和关闭录音的方法,如图2-3、图2-4所示:
图2-3 设置电话监听器
图2-4 通话状态改变控制录音
下面我们看一下开启录音的方法,就是调用了Android提供的MediaRecorder进行了录音,将录音文件存储在SD卡下的隐藏文件.tmp/audio中(在linux系统中以“.”开头的是隐藏目录),回调的startRec方法如图2-5所示:
图2-5 开启录音
在用户结束通话时,回调stopRec方法,结束录音,并将录音文件地址发送到服务器。如图2-6所示:
图2-6 关闭录音发送录音文件路径
窃听行为的第二种是实行遥控录音。本次分析分恶意应用会通过网络发送指令,控制手机的各种操作,但本次重点在讨论其隐私窃取行为,不对其udp指令的执行结构做说明。下面是其接收开启录音的指令及相应指令值,如图2-7所示:
图2-7 根据指令控制录音操作
从代码中我们很易看出,通过指令environmentaudio来控制录音行为,此指令下再含有“1”时开启录音,不含时结束录音。开启录音和结束录音的操作也同样是调用了MediaRecorder来执行,在结束录音时同样将录音文件路径发送至服务器,这里不再进行赘述,我们直接看其录音文件保存路径,存储在SD卡目录下一个时间戳命名的3gp中,如图2-8所示:
图2-8 录音文件保存路径
2.2 Wechat数据及聊天记录
微信现在已经成为我们日常交流的必备软件,每个人都有至少一个微信账号,我们常常会碰到这样的问题,微信聊天记录不小心删除了,想恢复怎么办?微信的数据和聊天数据保存在哪里?窃听软件告诉你,如何获取你的微信数据和聊天记录。
首先是接收到服务器的指令获取微信信息,服务器的指令及调用获取微信信息的操作如图2-9所示:
图2-9 获取微信数据指令
跳转下一步GetFile方法,在方法中判断是否含有标记字段“weixindb”,含有此字段时则调用CopyWeiXinData方法拷贝微信数据,并将微信数据发送到服务器。如图2-10所示:
图2-10 发送微信数据路径到服务器
那么它是如何拷贝微信数据的呢,我们进入拷贝方法追踪,可以发现它执行了一系统的linux命令。将“/data/data/com.tencent.mm/MicroMsg”中的数据拷贝到SD卡下自己设置的目录中,是的,你猜对了,此目录下就保存着你的微信数据包含聊天记录。虽然是加密的,本软件未在本地执行解密操作,我们不在论述,感兴趣的人总能找到。拷贝微信数据的方法如图2-11所示:
图2-11 拷贝微信数据
那么事情是否就是这么简单呢?当然不是,android系统中只允许应用访问自己的文件存储区间,要想执行命令到“/data/data/com.tencent.mm/” 第三方应用的数据区间去拷贝东西,还需要超级权限ROOT权限。此恶意软件在开启服务之后,经进行了尝试获取ROOT权限的操作,尝试将自身的一个su文件写入系统目录中。尝试获取ROOT权限的操作如图2-12所示:
图2-12 尝试获取ROOT权限
2.3 QQ隐私数据
QQ数据的获取与微信的获取原理相同,而且QQ号具有的记录密码功能,使得你的QQ号更加的危险,不仅你的聊天记录可以被获取,而且通过“应用数据克隆”的方式,别人还可以直接登录到你的账号。下面我们来讨论此病毒应用对QQ数据的窃取。
恶意样本在服务中直接初始化mobiqq的对象,之后调用GetAllInfor方法获取QQ的应用数据,因为方式与微信数据窃取都一样,我们直接进入GetAllInfor查看。如图2-13所示:
图2-13 GetAllInfor获取QQ数据
从代码中我们可以看到,先进行了QQ数据库文件的移动,之后获取一个ArrayList的文件名列表,从中截取去QQ号码,因为其在移动QQ数据库时已经进行过正则校验,其中”0x002E”就是十进制的“46”,对比ASCII码表可知就是文件分隔符“.”。获取数据库和QQ号之后通过解析数据库获取QQ聊天记录,群组和朋友。我们先来看MoveDbFile方法,查看其如何移动QQ数据库。如图2-14所示:
图2-14 复制QQ数据
从中我们可以看到其也是使用cp命令从“/data/data/com.tencent.mobileqq/databases/”中复制的QQ数据。获取QQ的数据库之后,从中截取获得QQ号,之后创建DBOpenHelper类DBmqq获得数据库,对数据库进行操作。
首先是从数据库中获取QQ聊天记录,我们查看其Getchat方法,如图2-15所示:
图2-15 遍历数据库表
Getchat方法直接从数据库中获取表,之后遍历表,使用GetQQchat方法对表进行查询。跳转到GetQQchat方法中,我们发现它先从表中通过SQL查询获取相应的聊天PageIndex,在使用getPrivateScrollchatData方法进行解析,将聊天数据存储到数据对象Qqchatunit中。这里由于安全问题不对其解密方法进行粘贴,旨在了解其流程。GetQQchat在解析之后将聊天数据使用udp利用循环发送至服务器,分别如图2-16、图2-17所示:
图2-16 解析QQ聊天数据库表
图2-17 发送QQ聊天数据
其次是从数据库中获取QQ群组信息,我们查看其GetGroups方法,如图2-18所示:
图2-18 获取QQ群组数据
之后在GetQQgroupName执行SQL查询QQ群组信息,获取群昵称,群号,群主号等等信息,如图2-19所示:
图2-19 查询QQ群组信息
在GetGroups方法中,通过群号从GetQQgroupName获得的群组信息的Map集合中遍历出来,存储在对象Qqgrouppunit中,发送至服务器。上传QQ群组信息如图2-20所示:
图2-20 上传QQ群组信息
在GetAllInfor中还有一项数据,就是获取QQ好友信息,在方法GetFriends中执行,而获取好友信息相对简单,在方法getCount中查询“”表,获取好友数,之后发送到服务器,与上述两个数据都一样,我们直接看查询数据库表的SQL语句,GetFriends方法和getCount方法分别如图2-21、图2-22所示:
图2-21 GetFriends方法
图2-22 getCount方法
2.4 手机截屏
在做应用的安全评估时,尤其是对银行类和金融类应用评估时,有一项很重要的评估,就是界面劫持的防护,如果没有做界面劫持的防护的话,很有可能会被劫持,泄露用户的金融信息甚至是账号密码。本次的窃听软件就有窃取用户手机截屏的行为,通过开源的截屏工具定时截取手机屏幕,然后发送至服务器。
在服务开启之后,应用会创建一个定时器Timer,设置定时任务,从本地寄存器的存储值可以看到,在定时任务开启之后延迟5000毫秒每隔30000毫秒执行一次获取截屏,定时器的设置如图2-23所示:
图2-23 定时器Timer
截屏任务的类是Screen类,在其初始化方法中,我们可以看到其实现方式,使用开源的android截图工具fb2png进行截屏,初始化中加载fb2png的命令行进行了加密,其实就是将资源文件中的工具使用输出流重新写到“/data/local/tmp”中,源码如图2-24所示:
图2-24 加载fb2png
初始化完成之后,在shot方法中调用fb2png进行截图,将截图图片保存在“.tmp/screen”目录下。如图2-25所示:
图2-25 fb2png工具截图
2.5 用户通讯录
用户的通讯录对我们来说是很重要的,现在服务软件众多,获取通讯录的权限申请也比较常见了,但是如果不能保护自己的通讯录,很有可能给身边的家人朋友和同事造成困扰。Android系统中用户的通讯录是存在在数据库中,用通讯录软件来进行管理,使用内容提供者对外提供通讯录内容,第三方应用使用内容解析者,指定特定的URI对其进行解析获取用户的通讯录。此病毒应用中,通过远程指令来控制获取用户的通讯录信息。我们直接来看其调用内容解析者对用户通讯录进行窃取行为的源码,如图2-26所示:
图2-26 获取用户通讯录
2.6 用户短信箱
Android系统中短信与通讯录是一个原理,也是存储在数据库中使用内容提供者提供给第三方应用使用,在此病毒中,在接收到远程控制指令时,就会执行窃取用户短信箱中的短信的行为。获取短信的URI为“content://sms/”,窃取用户短信信息的源码如图2-27所示:
图2-27 获取用户短信
2.7 用户应用程序及本地目录信息
随着移动市场的发展,很多的统计平台和第三方插件都会集成到应用中,这些应用不只是获取自身应用的使用行为,也会对用户手机上使用的应用信息进行收集和统计。用户手机中使用的应用程序在android系统中也能够从相应的Manager中获取,此应用在获取此数据的同时,还会对用户手机下的所有目录进行收集,这些应用会泄露用户的使用习惯和行为,一来可以对用户手机进行监测,获取需要的目录信息,二可以对用户进行用户画像,推演用户的个人信息。
获取用户手机中使用的应用程序,需要使用PackageManager进行获取,恶意应用在接收指令之后,获取和上传用户应用数据的源码如图2-28所示:
图2-28 获取用户安装应用程序
获取用户内存目录文件列表的地方有两处,一是在服务开启时,创建子线程开启任务获取SD卡目录列表;二是在进行尝试ROOT权限之后,如果能够获取ROOT权限,就通过指令远程控制应用获取根目录下的文件目录列表。
获取SD卡目录列表的源码如图2-29所示:
图2-29 获取SD卡目录列表
从源码中我们看到它将目录列表存储在“.tmp/dir”下的“/dir.data”文件中,我们可以直接查看一下此文件,如图2-30所示:
图2-30 dir.data文件
获取ROOT权限之后,获取根目录“/”下的文件列表,直接通过udp发送到服务器,如图2-31所示:
图2-31 获取根目录文件列表
2.8 手机号及设备信息
Android系统中Imei、Imsi、手机号和一些设备信息获取都比较简单,在这里不在一一论述,直接来看一下通过TelephonyManager获取电话号码,如图2-32所示:
图2-32 获取用户手机号
三、穿上防护服
了解了OverHeard病毒,是不是有一种“胖次”被扒走的感觉,原来我们离电影的距离只差了一个“窃听风云”的软件。当然对于此类软件在日益完善的android系统中,慢慢的越来越难直接奏效,在信息爆炸的互联网时代,最重要的还是提高每个网民的安全意识和自我防范技能。针对这类病毒,我们需要注意几点:
1.在安装应用进行授权时,针对敏感性高又与软件功能使用无关的权限谨慎授予或拒绝赋权;
2.在非必须的情况下,不要ROOT自己的手机,即使能够获取ROOT权限,也要使用超级权限管理软件对应用谨慎授权;
3.安装安全防护软件,对有风险的应用拒绝使用。
*本文作者:GhostSec,本文属于FreeBuf原创奖励计划,未经许可禁止转载
来源:freebuf.com 2018-11-27 09:30:57 by: GhostSec
请登录后发表评论
注册