app渗透测试_app渗透测试思路 - CSDN
精华内容
参与话题
  • APP渗透测试篇(上)

    千次阅读 2020-08-02 19:03:35
    一、App渗透测试原理 1.简介 App渗透测试与Web渗透测试从某种角度说基本没有区别 App其实就是手机软件,咱们不需要害怕他。 说一个简单的道理,一个网站存在sql注入,用电脑访问存在,用...
    每日一句:
    
    		渗透测试,一定要有耐心,所有的功能点都要测试。
    		
    		很多地方不亲身经历是没有太多的感受的。
    

    一、App渗透测试原理

    	1.简介
    		
    				App渗透测试与Web渗透测试从某种角度说基本没有区别
    			
    				App其实就是手机软件,咱们不需要害怕他。
    				
    				说一个简单的道理,一个网站存在sql注入,用电脑访问存在,用咱们的手机去访问一样存在注入。
    				
    				大部分漏洞的存在并不是在客户端而是在服务端
    				
    				例如:
    						SQL注入、验证码绕过、越权漏洞、支付漏洞、CSRF、XSS、
    						
    						变量覆盖、反序列化、文件包含、SSRF、XXE、文件上传等等
    				
    				这些漏洞web存在,app也存在。
    
    
    	2.换个思维角度
    	
    				我们再换一个思路,渗透测试网站,其实核心思想是控制传参访问,与服务器产生交互。
    				
    				如果说我们不对他进行访问和传参,那么他有可能被你渗透攻击下来吗?
    				
    				答案是否定的。
    						
    				渗透测试的核心其实就是把控传参。其实和App交互的还是服务器,用的还是HTTP协议,
    				
    				交互的服务器还是同一个,网站和App和同一个服务器交互都是很正常的事情。
    				
    				一般都是用api通信,例如:
    				
    						http://xxx/api.xxxxx.com/Api/xxx
    
    	3.小结
    	
    				正常网站的交互: 浏览器 -> 网站
    
    				App的交互: App -> 网站
    
    				我们既然可以抓网站的数据包,那么我们能否抓App的数据包?
    					当然可以
    	
    	4.补充
    			(1)
    			
    				提起app,有的朋友可能会在自动在脑海中给App渗透增加一些难度,比如通信加密、重打包、脱壳、逆向 apk解包等等
    				
    				我就说一句,难到web网站的传输没有加密传输的? 一个目标网站没有源码,就不测试了?src没有源码就不挖掘了?
    				
    				不要将自己的思维固定。	在多说一些,其实微信小程序与web也有着千丝万缕的联系,本质区别并不大。
    				
    				大多app的安全性会比web网站的还差,各种app的破解软件基本遍布大街,
    				
    				因为大多刚刚入门的白帽子认为app很难,很少去搞,加上大多app开发的安全性并不比web开发者强多少。
    				
    				而且经过这么多年的发展,其实web的发展也有了一定的瓶颈,特别是对一些大厂的测试,app的渗透测试是比web更容易下手。
    				
    				话不多说上一些前辈们的案例。
    				
    			(2)前人案例
    			
    					https://www.uedbox.com/?s=wooyun+app
    					
    					逻辑漏洞:https://www.uedbox.com/post/10278/ 
    					
    					假装打码:https://www.uedbox.com/post/10714/
    					
    					越权漏洞:https://www.uedbox.com/post/10172/ 
    					
    					任意密码找回:https://www.uedbox.com/post/9621/
    					
    					SQL注入:https://www.uedbox.com/post/11214/
    					
    					XSS:https://www.uedbox.com/post/10169/ 
    			
    			(3)扩展
    			
    					看这些案例,想起一个之前项目中遇到的情况。
    						
    					测试某集团,注册登录上去,查看我得个人资料。
    						
    					在前端界面看到了我注册时的一些手机号等待,但是在浏览器的JS源码中有所有人的资料
    						
    					其实这些东西(伪打码导致的信息泄露)在项目中很常见,
    						
    					比如,前端显示手机号为:185xxxx6666。抓包就可以看到完整的手机号。
    					
    					有很多小伙伴说挖不倒洞,这些小伙伴问问自己在一个网站上,自己花了多少时间,是不是将与服务器的传参都测试了?
    					
    					是不是返回包都仔细检查了?  我想大概率是没有的,很多时候菜鸡与大佬的区别就是细心,
    					
    					对一般的网站测试中,大佬挖到的洞,只要你细心基本也可以挖掘的到。抛去见识与经验之谈,多多少少总会有一些收获。
    					
    					绝大多数刚入门的白帽子最大的问题是没有耐心与细心。
    					
    					一个网站5分钟找不到漏洞直接放弃,说网站防护的太好,不存在漏洞,这种行为是很不可取,并且可笑的。
    					
    					建议刚刚入门不久但小有实力的白帽子一定要戒骄戒躁,要有一定的耐心与恒心。
    

    二、安装安卓模拟器 + 抓包(夜神)

    	1.安装模拟器
    	
    			既然是App抓包,那肯定需要先安装App,那么Windows电脑上怎么安装App?
    			
    			这里我建议使用安卓模拟器,我用的是夜神模拟器
    	
    					下载地址:https://www.yeshen.com/cn/download/fullPackage
    		
    					直接下载就行,安装就行
    					
    			别的模拟器与真实的手机也是可以的,只要连接到同一个内网(WIFI)。
    	
    	2.原理
    	
    			模拟器的核心就是在电脑上面模拟出一个手机,然后你可以在上面进行一系列的操作,
    			
    			你可以在上面打游戏,也可以办公,
    			
    			比如:我以前拿这个模拟器来挂微信,后面拿来钉钉打卡,最后还玩过吃鸡,模拟器物理挂,专门带妹吃鸡。
    			
    			这些让人脸红的往事就不多提了。
    	
    	3.设置代理
    		
    			模拟器既然拿来做渗透测试,那么我们该如何对安卓模拟器抓包?
    
    			其实很简单。
    			
    			(1)配置模拟器
    			
    				找到设置中的Wifi然后长按当前使用的Wifi,会出现高级选项(修改网络),然后选择手动设置代理就可以。
    				
    				模拟器的IP同虚拟机的IP一样,与本机的IP不是同一个IP。
    			
    				所以大家设置模拟器的代理主机名,不要写127.0.0.1。要设置本机IP,如:192.168.1.66。
    				
    				端口写8080(其实这个端口写什么都行),然后我们去配置Burp。
    				
    			(2)配置burp
    				
    				打开burp,点击Proxy(代理)--Options(设置)--Add(增加)--Specific address(具体地址)
    				
    				选择192.168.1.66。将Bind to port(监听端口)设置为8080--点击ok即可。
    					
    				此时模拟器(手机)上的所有数据都将先发送给burp。
    				
    				可以在模拟器中打开浏览器,访问一些网址,都会在burp中抓到数据。
    				
    				这个时候可能会弹出一些证书问题,一直点击接受就行,
    				
    				当然,想要从根本上解决问题,需要我们给模拟器安装个一下burp的证书。
    			
    			补充:
    			
    				模拟器上这么设置。真实的手机上也这么设置就行。主要真实的手机要与电脑连接同一个内网(WIFI)。
    				另外,其实手机上也有一些抓包软件,但是我个人用不太习惯,且不是太方便就在展开,大家有兴趣可以自己去找找。
    			
    			(3)
    			
    				方式一:
    						打开模拟器浏览器,访问192.168.1.66:8080下载证书
    						
    						点击模拟器的文件管理器,找到刚刚下载的证书。
    						
    						将证书文件的后缀(一般是cacert.der)改为“.cer”
    						
    						点击设置--安全--从sd卡安装(证书)
    						
    						找到刚刚修改后的证书,(找不到直接在搜索框搜索)
    						
    						安装证书,可能会让起名字任意起一个名字即可(如:a)
    				
    				方式二:(推荐)
    				
    						直接在本机浏览器访问192.168.1.66:8080下载证书
    						
    						将后缀改为“.cer”之后,直接拖进模拟器
    						
    						点击设置--安全--从sd卡安装(证书)
    						
    						找到刚刚修改后的证书,(找不到直接在搜索框搜索)
    						
    						安装证书,可能会让起名字任意起一个名字即可(如:a)
    						
    				其实这些和web浏览器安装证书几乎没啥区别,原理也大同小异。
    

    三、实战App渗透测试

    	0.说明
    	
    		这会用到一些App,由一些前辈老师所设计的。因为一些特殊原因,
    		
    		不可能直接放出来公布与众,毕竟不是我写的软件。(有兴趣的同学可以私聊我)
    	
    	1.安装配置环境
    	
    		打开安装完毕的软件,需要小小设置一下。
    		
    		点击软件右上角的设置,填写一个服务器(靶场)地址。		//地址同上述“ 0.说明 ”
    	
    	2.
    		(1)
    			注意的是,很多App访问地址都是写死的。
    		
    			App也是有服务端的(客户端、服务端)
    			
    			客户端就是个人安装的App,服务端就是服务器
    			
    			所以不要认为App所有的操作都是在个人手机上完成的,很多App是不停的在和他设定好的服务器之间进行通信的。
    			
    			为什么上边安装App的地址没有写死呢?因为这是一个靶场。
    		
    		(2)
    			从某种角度说,App的作用很是类似网站web页面的作用,他仅仅是将内容展示给用户。
    			
    			同时,将用户产生的数据发送给写死的服务端。而对于App本身是不会保存太多重要的数据,
    			
    			他也只是从服务器的数据库中读取到了数据,然后经过一些渲染处理展示给手机用户。
    			
    			其本身并不会保存像数据库账户密码等敏感内容,也没必要。
    	
    		(3)
    			另外在模拟器商店下载一些软件的时候,最好将代理关掉。(在模拟器设置--WiFi代理)
    			
    			下载软件的时候可能会走一些其他的协议,代理会影响。
    			
    			当然有一些更加简单粗暴的解决方法:在本机下载app,然后直接拖拽到模拟器安装。
    			
    	3.抓不到数据包
    	
    			有时候一些小伙伴可能会遇到一个问题:
    				
    				我模拟器浏览器的包与大部分应用的数据包都可以抓取得到,但是有个别应用的个别功能数据包就是抓不到
    				
    			这个其实不难理解,在客户端与服务端进行通信的过程之中,有很多的协议。
    			
    			而burp一般仅仅可以拦截到http/https协议的数据包,对于应用的某些功能走一些特殊的协议
    			
    			这个时候原生的burp就显得稍微乏力一些。对于这种情况,大家可以参考一下以下文章:
    			
    					https://www.freebuf.com/articles/network/158589.html
    					
    					https://iassas.com/archives/ffc80a19.html
    					
    			一般这种情况多发生在一些大型App的关键业务处,如登录、找回密码等处。
    		
    	4.靶机问题
    	
    		(1)所有的功能点都要试试
    				
    				~忘记密码处,点击,提醒一些“巴拉巴拉”的信息。貌似这个功能点是假的
    				
    				~只剩下OA登录了(正常的OA办公系统是没有注册功能的)
    						
    						随便用一个账户(如admin,123456)试试,发现多登录几次会提示:
    						
    							“登录错误太频繁,请稍后在试”,这个时候无论我们在写什么密码,都一个提醒。
    							
    							之前查看过源码,大概意思是登录错误几次,就被拉黑了。如何绕过呢?
    						
    		(2)绕过登录拉黑功能 
    				
    				使用任意账户,如(admin,123456)登录。抓包,
    				
    				发现:
    						~内容很简单,没有cookie
    						
    						~一个device(设备)的值,可以试着改一下如:
    							
    							将最后的数字5改成4,或者6在发包试试提示什么?密码不对。
    							
    							这就是一处漏洞了,通过修改传参绕后登录检测功能。
    							
    							补充:
    							
    								一般在渗透测试中,提示你登录太频繁的情况下,可以试着以下操作进行绕过
    								
    									~可以修改一下cookie
    									
    									~增加一个XFF值
    									
    									~修改一下包内传参
    		
    						~传参携带信息猜测解密
    						
    							在数据包中下方,有一些信息(一般是携带的账户,密码等)。
    							
    							而且他的值是:	user:YWRtaW4%3A&pass=.....
    							
    							到这可以对加密进行猜解一下。
    							
    		(3)猜解加密信息
    			
    				将user的值,先进行url解密,得知%3A是“ :”。
    				
    				正常加密中,这个 :是很罕见的。
    				
    				先百度一下前面的几个字母:“YWRtaW4”,没什么收获,但是百度结果关键词后边有的是“ = ”
    					
    				试了试 YWRtaW4= 进行base64解密,直接出结果:admin	//一般看到结尾是“=”的大多是base64编码。
    				
    				结论:先base64加密,将“ = ”替换为“ :”				//其实直接拿“ YWRtaW4:”直接进行base64解密也可以结出东西。 
    						
    				验证:可以将密码的加密值进行base64解密试试,果然也是输出的值。
    				
    						这个时候就可以爆破了
    						
    				补充:在渗透测试过程中,base64、md5是使用的非常广泛的,不认识的一些编码,直接丢进去先解密试试,说不定就有惊喜。
    				
    		(4)base64加密的字典
    					
    				~将自己的常用的字典进行base64加密
    					
    					可以去百度、谷歌一些小脚本。如下边php的小脚本
    						
    							<?php
    								$file = fopen("1.txt","r");
    								while(!feof($file))
    								{
    									echo base64_encode(fgets($file))."<br />";
    								}
    								fclose($file)									
    							?>
    						
    					或者去一些在线网站如:https://www.sojson.com/base64.html
    					
    					补充:
    					
    						多说一句,在web测试中,字典不易过大。一般超过20M我认为都没啥必要,或者说不及格的字典。
    						
    						几个G,十几个G的字典也仅仅在爆破SSH,3389等服务用过。
    						
    						大文本字典,用win自带的notepad打开会很卡(一般超过40M就巨卡),可以去下载一些编辑器打开。
    						
    				~将加密后字典内容中的“=”替换为“:”
    							
    		(5)爆破admin账户
    						
    				~先将密码字典进行base加密魔改。
    				
    				~抓取登陆包,发到burp爆破模块。
    				
    					爆破选项选择第三个 标记一个绕过登录处,一个密码处。
    					
    					//burp的四种爆破模式,大家可以去百度、谷歌一下。了解了解。
    					
    					第一处,选择数字替换。进行绕过登录限制
    					
    					第二处,加密魔改的base字典
    			
    		(6)关于cms的一些补充
    		
    				在渗透测试中,发现目标网站是某CMS搭建的,看看能不能自己在本机也搭建一下。
    				
    				一些cms的数据库中是存在默认测试账户的,很多的管理员一般改密码也仅仅将默认的admin密码修改,
    				
    				对其他测试账户不会修改,在登录的可以试试。
    						
    							
    				
    				另外在实际环境中,爆破admin的概率,其实不如爆破一些测试账户如:
    				
    				test、a、b、admin1、test1、ceshi、ceshi1、公司名、域名、人名等
    				
    				发现这个测试账户的存在,在爆破这些测试账户容易的多。
    				
    		(7)假设用测试登录进去后
    				
    				测试一些功能点处,如打卡处:
    				
    					~一些框可以测试xss,多个框的情况下,可以第一个框写alert(1)、第二个写(2)等,方便区分哪个地方出现问题。
    					
    					~一些地方,可能会有前端过滤,即服务器存在xss,但是你在提交的过程中,前端进行实体化编码等。
    					
    						对这种情况就要抓包,然后再数据包中将内容进行替换为弹窗语句。
    				
    					~在其他有框的地方也可以进行测试,每一个框都试试。比如这个打开有追加说明、催办、评论等等处可以在插入xss语句。
    
    						做渗透测试,一定要耐心,不放过任何交互点、功能点,所有的数据包都要进行测试查看。
    						
    				除了打卡处,还有很多功能处可以去测试,如思考:
    					
    					邮件处可否弹窗呢?看看通讯录是否可越权呢?能不能对一些功能的数据包进行篡改达到低权限看到高权限的信息呢?
    					
    					另外如新增客户处是否可以sql注入呢?	这些地方要想到,更要去测试。
    					
    		(8)App靶场的flag处,
    			
    				任意一个文件上传点,上传图片马。抓取返回包,发现文件保存的地址。
    				
    				结合数据包的其他信息,可以精确到文件的位置,这个靶场服务器是存在CGI解析漏洞的,
    				
    				在图片马后边加 “ /.php?a=phpinfo(); ” 。	之后连接菜刀,蚁剑都行。
    				
    				当然,这是最简单粗暴的,也可以测试其他的文件上传方法。
    
    展开全文
  • APP渗透测试之代理篇

    2019-10-17 09:43:24
    本课程就APP渗透测试中的服务端测试进行讲解,课程中讲解如何使用夜神模拟器,如何抓取app中的http协议流量及HTTPS协议流量。结合web服务端测试,通过抓取的流量进行修改来完成服务端渗透测试。
  • 渗透测试-Android-App渗透测试测试流程 0x01:前言: 仅作为记录以供参考 0x02:漏洞测试方法以及修复方案 一、组件以及源码安全 1、签名校验 命令: //test.apk 为要检测的包jarsigner.exe -...

     

    渗透测试-Android-App渗透测试测试流程

     

     

     

    0x01:前言:

    仅作为记录以供参考

    0x02:漏洞测试方法以及修复方案

     一、组件以及源码安全

    1、签名校验

    命令:

    //test.apk 为要检测的包
    jarsigner.exe -verify test.apk -verbose –certs

    如果显示jar已验证即为已做了签名校验

    修复方案:增加验证签名机制。

    2、任意调试漏洞

      通过对apk文件进行解包,检测 AndroidManifest.xml 文件的 debuggable 属性,如果该属性为 true,则存在任意调试漏洞。

    解包过程:

    命令:

    //test.apk为要拆解的包名 test为拆解后存放的文件夹
    java -jar apktool_2.4.0.jar d -f apl test.apk -o test

    使用编译器打开XML文件,搜索关键字 debuggable ,如果存在该属性且为 true ,则存在任意调试漏洞,如果不存在该属性则不存在该漏洞(debuggable默认为false)

    修复方案:将 debuggable 改为 false。

    3、AllowBackup漏洞

      通过对apk文件进行解包,检测 AndroidManifest.xml 文件的 allowBackup 属性,如果该属性为 true,则存在 allowBackup 漏洞。用户可通过adb backup来进行对应用数据的备份,在无root的情况下可以导出应用中存储的所有数据,造成用户数据的严重泄露。

      使用编译器打开XML文件,搜索关键字 allowBackup ,如果存在该属性且为 true ,则存在allowBackup漏洞,如果不存在该属性也存在该漏洞(allowBackup默认为true)

    修复方案:将 allowBackup 改为 false。

    4、APP代码未混淆

       使用 dex2jar 对apk文件内的 classes.dex 文件处理得到 classes-dex2jar.jar 文件,使用 jd-jui 反编译jar文件得到源码,如果代码未混淆,即代码的类名、函数、变量等未变为无意义的字符,则有源码暴露、资源文件暴露、主配文件篡改、核心SO库暴露、暴力破解恶意利用等风险。

      操作方法:

      使用解压缩包软件打开apk文件,将classes.dex文件复制出来。

      使用 dex2jar 将classes.dex处理为jar文件

      命令:

    ./d2j-dex2jar.bat  /d/渗透测试/移动app渗透/dex2jar-2.0/classes.dex

      然后使用jui打开jar文件,如果代码未混淆,将是下面这个样子

    已经混淆的,如下

     

     修复方案:将代码进行混淆加密。

    5、APP未作应用完整性校验

      未检测app的MD5或CRC32、SHA1准确性以及完整性,导致可以修改app任意文件二次打包。

      拆包后将 app logo 文件替换为其他图片,一般存在于res文件夹下的以mipmap开头的几个文件夹中,或者直接在apk文件夹下搜索launcher、logo 。然后重新打包签名,查看是否可以正常安装使用

      过程如下:将app拆包后更换app的logo文件

      重新打包apk,打包生成的apk文件默认存放在apk文件夹中dist文件夹下:

      命令:

    //test指要打包的文件夹
    java -jar apktool_2.4.0.jar b test/

      将apk签名:

      命令:

    //test.apk是要签名的apk test1.apk是签名后输出的apk
    java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test1.apk

      尝试安装,如果可以正常安装且可以正常打开使用,代表存在app未作应用完整性校验

    修复方案:在app安装时首先进行CRC32、MD5或SHA1校验,校验与源app值相同时才可以正常安装,否则禁止安装或设置开启app自动关闭

    6、APP敏感数据泄露

    主要检测软件包内的db数据库是否泄露了敏感信息,本地数据库有可能明文保存用户的账号密码或其他信息。

    将手机和pc连接,pc部署adb环境,手机需要root,adb进入手机系统

    命令:

    adb shell

    切换root权限,命令:

    su

    进入/data/data目录,此目录是用户安装的软件目录

    选择要进入的包,包名在 AndroidManifest.xml 文件中,通过搜索package可以得到

    进入相应的包,查看文件目录,应该存在database目录

    进入该目录,查看文件,导出.db文件

    命令:

    cp xx.db /sdcard/

    然后在sd卡,也就是手机内部存储器即可可见数据库文件

    使用数据库管理工具SQLiteExpert打开即可

    未完待续……

     

     

     二、逻辑漏洞

    1、邮件炸弹

      存在点:存在于任意可发送验证码的位置,发送验证码一般都有限制时间。

      验证方法:输入手机号、邮箱后抓包后多次重放,如果接到许多验证码即代表存在邮件炸弹。

      产生原因:服务器未作后端校验,只是在前端设置了60s冷却时间,但是服务端并与前端进行联合校验,导致可以绕过限制时间不停发邮件或验证码。

      修复方案:服务端记录邮件发送冷却时间,与前端其进行联合校验。

    2、任意用户密码重置

      存在点:找回密码和修改密码处

      验证方法:1.修改密码,修改自己的密码,输入正确信息后抓取发送数据包,然后改变手机号(或邮箱)这一参数,将它改为其他手机号(或邮箱),然后发出数据包。

              2.找回密码,输入自己的手机号(或邮箱),获取验证码,然后输入正确的验证码,抓包,将手机号(或邮箱)这一参数改为其他用户的手机号(或邮箱),发送数据。

      产生原因:1.输入密码后提交到服务端的post数据包需要包含当前用户的身份信息,而一般网站是通过用户名或用户ID来标识用户身份的,如果这个用户名或用户ID没有和当前手机号、短信验证码进行绑定,也就是说服务端只验证用户名、ID是否存在,而不去验证用户和当前手机号是否匹配,那么我们就可以通过修改用户名、ID去修改其他用户的密码了。

           2.漏洞原因判断了验证码是否正确,而没有判断该验证码是否跟该用户匹配。

      修复方案:对参数进行复杂加密,将用户名、验证码和手机号进行绑定,输入新的密码,然后提交到服务端,服务端应对当前用户名、手机号、短信验证码进行二次匹配验证,都为true时,才可以修改成功。

     未完待续......

     

    转载于:https://www.cnblogs.com/pureqh/p/10881329.html

    展开全文
  • APP渗透测试准备(一)

    千次阅读 2019-10-05 20:22:32
    APP渗透测试准备(一) 文章目录APP渗透测试准备(一)环境准备安装adb安装fridafrida hook实例 环境准备 Windows10 X64 Python 3.7 OppoR9st anroid6.0.1 adb frida burpsuite+brida插件 安装adb 参考链接:...

    APP渗透测试准备(一)

    环境准备

    Windows10 X64
    Python 3.7
    OppoR9st anroid6.0.1
    adb
    frida
    burpsuite+brida插件
    

    安装adb

    参考链接:https://wnma3mz.github.io/hexo_blog/2018/01/25/%E7%94%A8ADB%E8%B0%83%E8%AF%95%E5%AE%89%E5%8D%93%E6%89%8B%E6%9C%BA/

    下载adb:https://dl.google.com/android/repository/platform-tools-latest-windows.zip

    How to Install ADB on Windows, macOS, and Linux:https://www.xda-developers.com/install-adb-windows-macos-linux/

    然后解压 配置环境变量。

    然后手机USB数据线连接到电脑。记得打开usb调试模式,当然了你想把root了也可以。

    adb连接不上的原因:https://mianao.info/2015/12/07/adb%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5android%E8%AE%BE%E5%A4%87%E7%9A%84%E5%87%A0%E7%A7%8D%E5%8E%9F%E5%9B%A0

    附上adb调试命令大全:https://blog.csdn.net/qq_15364915/article/details/52369266

    常用adb命令小记:

    # 查看所有连接设备
    > adb devices
    
    # 进行截图保存在sd卡的根目录下,名字为screen.png
    > adb shell screencap -p /sdcard/screen.png
    # 将截图发送到本地(当前目录下),也可以发送其他文件
    > adb pull /sdcard/screen.png
    # 删除本地文件
    > adb shell rm /sdcard/screen.png
    # 发送电脑里的文件到设备
    > adb shell push screen.png /sdcard/
    
    
    # 进入手机的交互环境,操作类似linux终端,exit或者Ctrl+C退出
    > adb shell
    
    # 点击手机屏幕(1000,1000)的位置
    > adb shell input tap 1000 1000
    # 输入字符串"helloworld",此处不能直接输入中文,且字符串不能有空格
    > adb shell input text helloworld
    # 滑动屏幕,从(100, 100)到(1000,1000),经历10s(也可以当作长按屏幕来使用)
    > adb shell input swipe 100 100 1000 1000 10
    
    # 查看当前运行的App, 这里Windows没有grep所以会运行失败,可以进入先进入交互环境再输入下面去掉"adb shell"命令
    > adb shell dumpsys window | grep mCurrentFocus
    # 或者
    > adb shell dumpsys activity activities | grep mFocusedActivity
    
    # 按下电源键
    > adb shell input keyevent 26
    # 按下返回键
    > adb shell input keyevent 4
    # 按下HOME健
    > adb shell input keyevent 3
    # 点亮屏幕
    > adb shell input keyevent 224
    # 熄灭屏幕
    > adb shell input keyevent 223
    
    # 查看手机安装了哪些App,输出按行输出App的包名
    > adb shell pm list packages
    # 加"-s"表示只输出系统应用
    # 加"-3"表示只输出第三方应用
    # 加字符串表示过滤应用名称,当然也可以使用grep
    
    # 安装apk
    > adb install <packagename>
    # 卸载apk
    > adb uninstall <packagename>
    
    
    # 从桌面启动app
    > adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1
    # 关闭app
    > adb shell am force-stop <packagename>
    
    $ adb devices
    
    * daemon not running; starting now at tcp:5037
    * daemon started successfully
    List of devices attached
    33b4c4be        device
    

    说明连接上了.

    查看手机cpu版本。 根据内核版本去安装相应的frida。

    $ adb shell
    shell@R9s:/ $ cat /proc/cpuinfo
    Processor       : AArch64 Processor rev 4 (aarch64)
    processor       : 0
    Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
    CPU implementer : 0x41
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0xd03
    CPU revision    : 4
    ......
    

    根据cpu版本去下载相应frida-server,手机是AArch64的。

    安装frida

    参考链接:https://www.jianshu.com/p/c349471bdef7

    记得python版本要3.7。

    3.6的话会找不到dll,看奈沙的blog是之前是3.5出现了这个问题:https://blog.csdn.net/whklhhhh/article/details/79302848

    他是3.5要更新到3.6,现在我3.6不行的话更新到3.7然后并没有解决,最后解决方案是再装个frida-tools:

    python3.7 -m pip install frida -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
    
    python37 -m pip install frida-tools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
    

    安装好之后执行

    frida-ps  
    

    正常执行之后说明frida已经正常安装。

    然后在手机上安装fridaserver

    选择arm64的android-server下载:https://github.com/frida/frida/releases/download/12.7.4/frida-server-12.7.4-android-arm64.xz

    $ adb push frida-server-12.7.4-android-arm64 /data/local/tmp/frida-server
    
    frida-server-12.7.4-android-arm64: 1 file pushed. 2.5 MB/s (38414672 bytes in 14.544s)
    
    $ adb shell
    
    $ su
    
    R9s:/ # whoami
    root
    R9s:/ # cd /data/local/tmp/
    R9s:/data/local/tmp # chmod 755 frida-server
    R9s:/data/local/tmp # ./frida-server
    

    记得手机要root,不然没权限。

    然后另开一个cmd。

    frida-ps -U

    如果hook不上就转发下端口
    adb forward tcp:27042 tcp:27042

    frida hook实例

    以一个ctf题为例来玩一下frida:
    https://github.com/ctfs/write-ups-2015/raw/master/seccon-quals-ctf-2015/binary/reverse-engineering-android-apk-1/rps.apk

    参考链接:https://blog.csdn.net/zouyuanxc/article/details/80492465

    frida理解:https://blog.csdn.net/jiangwei0910410003/article/details/80372118

    hook分两种:

    第一、Java层代码Hook操作

    1、hook方法包括构造方法和对象方法,构造方法固定写法是$init,普通方法直接是方法名,参数可以自己定义也可以使用系统隐含的变量arguments获取。

    2、修改方法的参数和返回值,直接调用原始方法通过传入想要修改的参数来做到修改参数的目的,以及修改返回值即可。

    3、构造对象和修改对象的属性值,直接用反射进行操作,构造对象用固定写法的$new即可。

    4、直接用Java的Exception对象打印堆栈信息,然后通过adb logcat -s AndroidRuntime来查看异常信息跟踪代码。

    总结:获取对象的类类型是Java.use方法,方法有重载的话用overload(…)解决。

    第二、Native层代码Hook操作

    1、hook导出的函数直接用so文件名和函数名即可。

    2、hook未导出的函数需要计算出函数在内存中的绝对地址,通过查看maps文件获取so的基地址+函数的相对地址即可,最后不要忘了+1操作。

    总结:Native中最常用的就是内存地址指针了,所以如果要正确的获取值一定要用Memory类作为辅助,特别是字符串信息。

    先推荐一个神器:jadx 将apk用jadx打开 直接反汇编出源码.

    package com.example.seccon2015.rock_paper_scissors;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    import java.util.Random;
    
    public class MainActivity extends Activity implements OnClickListener {
        Button P;
        Button S;
        int cnt = 0;
        int flag;
        private final Handler handler = new Handler();
        int m;
        int n;
        Button r;
        private final Runnable showMessageTask = new Runnable() {
            public void run() {
                TextView tv3 = (TextView) MainActivity.this.findViewById(R.id.textView3);
                if (MainActivity.this.n - MainActivity.this.m == 1) {
                    MainActivity.this.cnt++;
                    tv3.setText("WIN! +" + String.valueOf(MainActivity.this.cnt));
                } else if (MainActivity.this.m - MainActivity.this.n == 1) {
                    MainActivity.this.cnt = 0;
                    tv3.setText("LOSE +0");
                } else if (MainActivity.this.m == MainActivity.this.n) {
                    tv3.setText("DRAW +" + String.valueOf(MainActivity.this.cnt));
                } else if (MainActivity.this.m < MainActivity.this.n) {
                    MainActivity.this.cnt = 0;
                    tv3.setText("LOSE +0");
                } else {
                    MainActivity.this.cnt++;
                    tv3.setText("WIN! +" + String.valueOf(MainActivity.this.cnt));
                }
                if (1000 == MainActivity.this.cnt) {
                    tv3.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
                }
                MainActivity.this.flag = 0;
            }
        };
    
        public native int calc();
    
        static {
            System.loadLibrary("calc");
        }
    
        /* access modifiers changed from: protected */
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            this.P = (Button) findViewById(R.id.button);
            this.S = (Button) findViewById(R.id.button3);
            this.r = (Button) findViewById(R.id.buttonR);
            this.P.setOnClickListener(this);
            this.r.setOnClickListener(this);
            this.S.setOnClickListener(this);
            this.flag = 0;
        }
    
        public void onClick(View v) {
            if (this.flag != 1) {
                this.flag = 1;
                ((TextView) findViewById(R.id.textView3)).setText("");
                TextView tv = (TextView) findViewById(R.id.textView);
                TextView tv2 = (TextView) findViewById(R.id.textView2);
                this.m = 0;
                this.n = new Random().nextInt(3);
                tv2.setText(new String[]{"CPU: Paper", "CPU: Rock", "CPU: Scissors"}[this.n]);
                if (v == this.P) {
                    tv.setText("YOU: Paper");
                    this.m = 0;
                }
                if (v == this.r) {
                    tv.setText("YOU: Rock");
                    this.m = 1;
                }
                if (v == this.S) {
                    tv.setText("YOU: Scissors");
                    this.m = 2;
                }
                this.handler.postDelayed(this.showMessageTask, 1000);
            }
        }
    }
    

    代码逻辑也比较简单,按钮按一下选择石头剪刀布,然后电脑是随机石头剪刀布。赢到1000分即可。

    发现是直接调用calc函数运算一下得到最后flag,hook一下方法去调用calc即可。我这里hook的是onclick函数,点击即可弹flag。
    exp:

    import frida, sys
    
    def on_message(message, data):
        if message['type'] == 'send':
            print("[*] {0}".format(message['payload']))
        else:
            print(message)
    
    jscode = """
    Java.perform(function () {
        var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
        MainActivity.onClick.implementation = function (v) {
            send("Hook Start...");
            var returnValue = this.calc();
            send("Return:"+returnValue);
            var result = (1000+returnValue)*107;
            send("Flag:"+"SECCON{"+result.toString()+"}");
        }
    });
    """
    
    process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')
    script = process.create_script(jscode)
    script.on('message', on_message)
    script.load()
    sys.stdin.read()
    
    

    第二种方法就是hook结果,将分数改为999,然后出拳必赢,hook到onclick,再点击触发,即可弹flag

    
    import frida, sys
    
    def on_message(message, data):
        if message['type'] == 'send':
            print("[*] {0}".format(message['payload']))
        else:
            print(message)
    
    jscode = """
    Java.perform(function () {
        var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
        MainActivity.onClick.implementation = function (v) {
            send("Hook Start...");
            this.onClick(v);
            this.n.value = 0;
            this.m.value = 2;
            this.cnt.value = 999;
            send("Success!")
        }
    });
    """
    
    process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')
    script = process.create_script(jscode)
    script.on('message', on_message)
    script.load()
    sys.stdin.read()
    

    第三种方法就是去搞so文件了,从native层hook来获取calc的返回值。

    以上是java层的hook。接下来玩一下native层的hook。

    附上一个批量提取apk中so文件的脚本:

    # export_so.py
    
    #!/usr/bin/env python
    # coding=utf-8
    import zipfile
    import os
     
    path = "./"
    so_path="./so/"
    apklist=os.listdir(path)
    for APK in apklist:
        if APK.endswith(".apk"):
            portion = os.path.splitext(APK)
            apkname = portion[0]
            abs_so_path=os.path.join(so_path,apkname) 
            abs_zipAPK_path=os.path.join(path,APK)
            z = zipfile.ZipFile(abs_zipAPK_path,'r')
            solists=[]
            for filename in z.namelist():
                if filename.endswith(".so"):
                    sofileName = os.path.basename(filename)
                    soSource = os.path.basename(os.path.dirname(filename))
                    storePath=os.path.join(abs_so_path,soSource) 
                    if not os.path.exists(storePath):
                        os.makedirs(storePath)
                    newsofile=os.path.join(storePath,sofileName)
                    f = open(newsofile,'w')
                    f.write(z.read(filename))
    
    

    libcalc.so是我们的目标。

    丢到ida里面去看看。

    拿到函数名是 Java_com_example_seccon2015_rock_1paper_1scissors_MainActivity_calc
    然后去写脚本hooknative层即可。

    exp:

    import frida, sys
    # export native function
    native_hook_code = """
    Java.perform(function(){
        send("Running Script");
        var exports = Module.findExportByName("libcalc.so","Java_com_example_seccon2015_rock_1paper_1scissors_MainActivity_calc");
        send("so native pointers:"+exports);
        Interceptor.attach(exports,{
            onEnter: function(args){ 
                //send("so function args is: " +args[0]+","+args[1]+","+args[2]);
                send("123");
            },
            onLeave: function(retval){
                send("so result value is :"+retval);
            }
        });
    });
    """
    
    def on_message(message, data):
        if message['type'] == 'send':
            print("[*] {0}".format(message['payload']))
        else:
            print(message)
    
    process = frida.get_device_manager().enumerate_devices()[-1].attach("com.example.seccon2015.rock_paper_scissors")
    script = process.create_script(native_hook_code)
    script.on('message', on_message)
    script.load()
    sys.stdin.read()
    
    
    D:\Frida>python37 rps_native_exp.py
    [*] Running Script
    [*] so native pointers:0xe8473c75
    [*] 123
    [*] so result value is :0x7
    

    同样拿到返回值是7。然后进行运算

    if (1000 == MainActivity.this.cnt) {
        tv3.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
    }
    

    也就是(1000+7)*107结果是107749,和之前的结果一样。

    展开全文
  • 记一次色情app渗透测试

    千次阅读 2020-06-25 22:31:17
    某个星期六的晚上,我还在挖 edusrc ,刚 getshell 内网漫游完(纯属放屁哈哈哈)准备下机睡觉,修君表哥给我发了某站(表哥们懂的,疯狂暗示),我打开一看,WC好东西,不渗透一波怎么能对得起它呢? 背景: 找到某...

    前言:

    某个星期六的晚上,我还在挖 edusrc ,刚 getshell 内网漫游完(纯属放屁哈哈哈)准备下机睡觉,修君表哥给我发了某站(表哥们懂的,疯狂暗示),我打开一看,WC好东西,不渗透一波怎么能对得起它呢?

    背景:

    找到某app的界面:
    在这里插入图片描述

    咳咳,表哥们别想太多哈,本人纯情小处男,啥都不知道啥都不懂
    在这里插入图片描述
    看了看功能点,有一个注册的地方,但是注册的时候居然要邀请码!!!真的很没意思,一点互联网资源共享精神都没,这就很过分了,这么好的东西怎么能吃独食??必须安排一波

    过程:

    看了看功能点,有一个注册的地方,但是注册的时候居然要邀请码!!!真的很没意思,一点互联网资源共享精神都没,这就很过分了,这么好的东西怎么能吃独食??必须安排一波,没办法,看着到手的资源就要飞了,于心不忍啊,于是将app放到虚拟机,通过抓包拿到其真实域名
    在这里插入图片描述
    然后利用bp的爬虫爬到一处api接口

    在这里插入图片描述
    提示参数缺失 fuzz一波参数
    fuzz.jpg (自行脑部bp fuzz图 忘了截图了)
    在这里插入图片描述
    http://www.xxxxxxx.cn/api/index/tab3?p=1&t=3&v=0&s=0
    然后就是一波中奖

    在这里插入图片描述但是不是DBA 也无法写文件 数据库实在太乱了 懒得一个一个的读
    目前后台地址也还没找到 而且这个站及其的卡 思路完全乱了,,

    想着先利用注入搞一个账号出来 然后登录该app,,看看app内有无什么可利用的
    但是除了一处留言反馈准备测试xss之外,就是各种诱惑。。。。
    留言框只允许中文以及中文符号,但是却是使用js进行验证,抓包即可绕过

    在这里插入图片描述对着该处留言框就是一顿乱插
    中途等了大概10分钟 就当我以为要失败的时候
    在这里插入图片描述
    果然,,菜逼运气好==
    拿到后台登录地址 虽然没有cookie 但是利用注入点读出了后台账号密码
    在这里插入图片描述
    最后登陆后台
    在这里插入图片描述在这里插入图片描述

    看了看后台,app总用户达到1w+…一天用户增加500+
    在这里插入图片描述
    翻了下后台的功能,,发现一处图片上传,而且似乎是js验证的图片类型

    在这里插入图片描述但是在实际上传中 各种失败,应该是前台js验证+后端功能让所有上传的文件强制改名为.jpg

    接下来的事就比较好玩了,虽然拿到了后台,但是没法突破,没卵用
    于是我添加了后台留的一个QQ号
    在这里插入图片描述对方秒通过,经过简单的交流,发现他是这套程序的二开作者,售卖给别人被别人用来当作淫秽视频传播盈利网站了。于是我就将计就计,先唬住他(我摊牌了,我是演员)
    在这里插入图片描述在这里插入图片描述这个地方 hw 和授权书只是我骗他的==
    各位表哥看着爽就行

    在这里插入图片描述在这里插入图片描述甚至他把他的网站后台账号密码都给我了。。。

    在这里插入图片描述tips:以上内容都是瞎编的,大佬们不要当真!

    通过他提供的部分上传验证源码,发现是后段对上传文件强制改名了,我人都傻了,大佬们有绕过思路可以在下方评论

    最后还是没拿到shell等等,,也就是只止步于后台了。
    一方面是这个后台实在太鸡儿卡了,动不动无法响应
    另一方面就是漏洞利用手法没有全面利用,导致忽略了很多getshell的姿势,还是太菜了呜呜呜,表哥们轻喷。
    在这里插入图片描述

    最后,这里附上修君表哥博客:http://www.xiu09.cn/

    展开全文
  • app渗透测试

    2020-03-24 07:58:04
    http://blog.nsfocus.net/app-security-test/app渗透测试要点 http://blog.nsfocus.net/the-challenge-in-penetration-test-for-isp/ 运营商测试要点和挑战 ...手机银行渗透...
  • APP渗透测试知识

    2020-10-12 11:59:14
    渗透测试:对网站、APP应用进行全面的安全检测与漏洞扫描,模拟黑客的手法对App进行渗透,针对网站、APP存在的漏洞,最后生成对网站、App渗透测试安全报告书。 在对客户网站、APP进行渗透测试之前,都需要获取...
  • 被产品经理分到了个app测试的活,(话说为啥是产品经理给派活,我不是归技术总监管么),包含安卓端的和ios端的,有点懵逼...app渗透测试,来源的威胁不外乎三方面: 其实web端好像也是这三方面哈。 面临的主...
  • 移动APP渗透测试方案 展示5个方面总结3种常见漏洞 发布时间:2017年10月26日 10:47 浏览量:1193  绿盟科技这几天连出渗透测试文章,真是干货啊。之前安全加介绍了金融行业 实战微信银行渗透测试, 运营商...
  • 本文档总结了安卓应用程序渗透测试的各种方法100多页,非常全面,适合不同基础的人阅读、学习。 Android APP 渗透测试方法大全 一、Android APP 渗透测试方法 二、工具使用 三、常用测试工具以及环境平台 四、...
  • Android APP渗透测试方法checklist!
  • 安应用APP渗透测试方案

    千次阅读 2017-06-20 17:11:28
    安应用模拟黑客对应用进行安全性测试,审计其风险,提供解决方案。可帮助企业全面发现业务漏洞及风险。 在黑客之前找到可导致企业数据泄露、资损、业务被篡改等危机的漏洞,企业可对漏洞进行应急响应、及时修复。...
  • APP渗透测试篇(下)

    2020-08-09 21:54:18
    一、快速自建一个App 1.App难写吗? (1) ~问:我不懂Java我能写App吗? 答:我觉得大部分人都觉得自己不能。 ~问:你还记得CMS吗? 你会CMS里面的全部代码吗? 答:你也不会,但是...
  • 某盟 Android+APP渗透测试方法大全 内部培训资源 某盟 Android+APP渗透测试方法大全 内部培训资源
  • Android客户端安全测试指南,
  • 对各种经典目标检测算法模型结构、原理有较深入了解。 更重要的是,使得自己的算法模型能够在海思nnie仿真环境以及开发板上运行起来。 起到举一反三、触类旁通的效果 来有助于新的算法模型移植到海思nnie平台。
  • 微信 小程序 APP 渗透测试方案

    千次阅读 2020-05-11 09:55:26
    1 、APP渗透测试简介 模拟黑客对应用进行安全性测试,审计其风险,提供解决方案。可帮助企业全面发现业务漏洞及风险。 在黑客之前找到可导致企业数据泄露、资损、业务被篡改等危机的漏洞,企业可对漏洞进行应急响应...
  • 网上目前我是没看到有成熟的相关文档,在自己踩了几个坑之后,将使用文档整理出。 首先下载夜神模拟器,这个不难,百度一下就能下载。 adb下载: ...安装:不需要安装,解压然后放到目录下就行,任意路径,比如d盘...
  • 网上搜集了一些App安全学习教程及工具,项目地址:https://github.com/Brucetg/App_Security 一. drozer简介 drozer(以前称为Mercury)是一款Android安全测试框架。 drozer允许您通过承担应用程序的角色并与...
  • 天气越来越凉爽,在对客户网站代码进行渗透测试,漏洞测试的同时我们SINE安全渗透技术要对客户的网站源代码进行全方位的安全检测与审计,只有真正的了解网站,才能更好的去渗透测试,发现网站存在的漏洞,尽可能的让客户的...
1 2 3 4 5 ... 20
收藏数 6,161
精华内容 2,464
关键字:

app渗透测试