抓包,反抓包,反反抓包

小咪咪 2023-10-08 14:32 87阅读 0赞

在这里插入图片描述

前言

当年还在学校的时候,就接触到了抓包,当时还在贴吧写了一篇小白文来误导小白(不是。但当时的自己还没接触到逆向,竟然对抓包没有提起兴趣,说到底又是太年轻,不懂事。时至今日,才发现它是安全人员必须要掌握的基本技能,面试安全岗位也多多少会问到与抓包相关的知识。抓包(packet capture)是查看数据包发送和接收过程的手段。抓包也有很多种办法,可以在软件层面对函数进行hook,查看发送或接受的数据包,还有利用WireShark,tcpdump,Fiddler,Charles等第三方工具来抓包。本文演示如何利用Charles来对AndroidApp进行抓包,并且强行让App走代理

工具准备

  • 电脑
  • 一部已经ROOT的手机
  • Charles
  • Openssl

步骤

安装Charles后打开。依次选择菜单Proxy -> SSL Proxying Settings…

在这里插入图片描述

在SSL Proxying标签下勾选Enable SSL Proxying,再点击Add按钮

在这里插入图片描述

添加一条Host为*,Port为443的规则,如图:

在这里插入图片描述

点击OK

在这里插入图片描述

依次点击Help -> SSL Proxying -> Save Charles Root Certificate…导出根证书,另存为charles.pem

在这里插入图片描述

将下载好的OpenSSL放入环境变量

在这里插入图片描述

转到证书导出目录,打开命令行,执行以下命令:

  1. openssl x509 -subject_hash_old -in charles.pem

在这里插入图片描述

根据输出的内容,将charles.pem重命名为b6a3624b.0,注意文件后缀是0

然后重新挂载手机的system分区

  1. adb root
  2. adb remount

将重命名后的文件推入/system/etc/security/cacerts目录中

  1. adb push b6a3624b.0 /system/etc/security/cacerts

回到Charles,依次选择Proxy->Proxy Settings

在这里插入图片描述

设置一个端口,按确定

在这里插入图片描述

在手机WIFI设置页面,给连接的WIFI设置代理,代理到Charles。代理服务器主机名写电脑的主机名或者ip地址,代理服务器端口写上面在Charles中设置的端口,写完后点保存

在这里插入图片描述

接下来,手机的https包都会被转到Chales中,并成功解析

在这里插入图片描述

当然,有时候事情不会那么顺利。咱们抓包,那别人也会想办法防止抓包。如果抓包的时候我们知道应用明明有http请求但是在抓包工具中却抓不到包,那么应用中很有可能设置了不让请求走代理,常用的设置代码如下:

  1. URLConnection
  2. public static String get(String urlStr){
  3. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  4. InputStream inputStream = null;
  5. try {
  6. URL url = new URL(urlStr);
  7. HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
  8. httpURLConnection.setRequestMethod("GET");
  9. inputStream = httpURLConnection.getInputStream();
  10. if(httpURLConnection.getResponseCode() == 200) {
  11. byte[] buf = new byte[1024];
  12. int len = -1;
  13. while ((len = inputStream.read(buf)) != -1) {
  14. byteArrayOutputStream.write(buf, 0, len);
  15. }
  16. }
  17. }
  18. catch (Exception e){
  19. return e.toString();
  20. }
  21. finally {
  22. close(inputStream);
  23. close(byteArrayOutputStream);
  24. }
  25. return byteArrayOutputStream.toString();
  26. }

注意上面的openConnection(Proxy.NO_PROXY),这就是设置请求不走代理的地方

OkHttp库

  1. public static String get(String url) {
  2. OkHttpClient.Builder client = new OkHttpClient.Builder();
  3. // //方式一:
  4. // client.proxy(Proxy.NO_PROXY);
  5. // //方式二:
  6. ProxySelector proxySelector = new ProxySelector() {
  7. @Override
  8. public List<Proxy> select(URI uri) {
  9. return null;
  10. }
  11. @Override
  12. public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
  13. }
  14. };
  15. client.proxySelector(proxySelector);
  16. Request request = new Request.Builder()
  17. .url(url)
  18. .build();
  19. try (Response response = client.build().newCall(request).execute()) {
  20. return response.body().string();
  21. }
  22. catch (Exception e){
  23. return e.toString();
  24. }
  25. }

同样的,上面注释标出的地方也是设置请求不走代理

针对这些我们可以利用Hook相应的方法强行让http请求走代理,这里使用frida来进行hook,代码如下:

  1. if(Java.available){
  2. Java.perform(function(){
  3. //openConnection
  4. var URL = Java.use("java.net.URL")
  5. var openConnection1 = URL.openConnection.overload("java.net.Proxy")
  6. var openConnection2 = URL.openConnection.overload()
  7. openConnection1.implementation = function(proxy){
  8. console.log("openConnection() proxy = " + proxy)
  9. return openConnection2.call(this)
  10. }
  11. //okhttp
  12. var OkHttpClientBuilder = Java.use("okhttp3.OkHttpClient$Builder")
  13. var proxy = OkHttpClientBuilder.proxy.overload("java.net.Proxy")
  14. proxy.implementation = function(proxy){
  15. console.log("proxy() prxoy = " + proxy)
  16. return null
  17. }
  18. var proxySelector = OkHttpClientBuilder.proxySelector.overload("java.net.ProxySelector")
  19. proxySelector.implementation = function(proxySelector){
  20. console.log("proxySelector() proxySelector = " + proxySelector)
  21. return null
  22. }
  23. })
  24. }

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
在这里插入图片描述

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MAC

    网络抓包是个基础技能,对于网络协议的掌握有一定的要求。iOS上实现网络抓包可以用Charles(针对http和https),tcpdump(快速分析网络包),和Wireshar