兴趣使然的抓包练习

1 MITM

中间人攻击(英语:Man-in-the-middle attack,缩写:MITM)在密码学和计算机安全领域中是指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。

一图胜千言。

man in the middle mitm attack

2 抓包

  1. 安装CA证书,解密HTTPS流量。笔者使用网球这款软件示例。
  1. 选取抓包目标,笔者以联合早报为例。

如图所示,顶部banner栏完全无意义,中间的问卷调查也有变成广告位的趋势。所以,笔者决定去除这两个牛皮藓。

  1. 运行软件进行抓包。

请求路径带ad的显然是广告,对应上图中间的广告位,顶部banner栏的内容在首页数据的json中。

3 编写脚本

3.1 去除广告位

对于广告位,拒绝掉这个请求即可。编写正则匹配url,规则定为reject即可。

关于正则表达式这种高端操作,笔者是编不出来的,请ChatGPT出马。

对应的脚本即为:

1
2
[rewrite_local]
^https:\/\/ads\.zaobao\.com\/advertapi\/advert\/queryAdvertisementByCondition\?([^&]*&)*adSize=320x100(&[^&]*)*$ url reject

3.2 去除banner

首页请求返回的数据如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
  "code" : "200",
  "message" : "Success",
  "data" : [ {
    "cardHash" : "26c27a3da1a25a300ed246c39f8b14e4",
    "meta" : { },
    "name" : "home banner",
    "cardSizes" : {
      "compact" : "TransientsViewer",
      "regular" : "TransientsViewer"
    },
    "children" : [ {
      "cardHash" : "4b9f9e3e8a317ecf790c13147283bd84",
      "meta" : { },
      "cardSizes" : {
        "compact" : "Banner",
        "regular" : "Banner"
      },
      "cardFooter" : {
        "link" : {
          "id" : "https://www.zaobao.com/specials/scf2023",
          "type" : "webview"
        }
      },
      "item" : {
        "itemType" : "AppBanners",
        "appBannerData" : {
          "name" : "世纪早报",
          "feedId" : "6733580487324860416",
          "bannerUrl" : "https://dss1.zbstatic1.com/app-banners/20231116000849_singapore-china-forum-2023.png",
          "sort" : 1
        }
      }
    }, {
      "cardHash" : "4b42339bd5d254c1610c0c4f2728f94f",
      "meta" : { },
      "cardSizes" : {
        "compact" : "Banner",
        "regular" : "Banner"
      },
      "cardFooter" : {
        "link" : {
          "id" : "https://www.zaobao.com/interactive/zb100scroll?orientation=landscape",
          "type" : "webview"
        }
      },
      "item" : {
        "itemType" : "AppBanners",
        "appBannerData" : {
          "name" : "世纪早报",
          "feedId" : "6733580487324860416",
          "bannerUrl" : "https://dss1.zbstatic1.com/app-banners/20230906051723_zbcn_app_720x240.jpg",
          "sort" : 2
        }
      }
    } ]
  }, {
    #data[1]#
    ....

不难看出,data[0]就是banner数据,将其去除即可。

匹配url的正则:

^https:\/\/nsdd\.zaobao\.com\/appapi\/feed\/home\/zb\?[^?]*$

编写的脚本:

1
2
3
4
5
6
7
var Q = JSON.parse($response.body);

// 去掉banner
if (Q.data && Q.data.length > 0) {
    Q.data.splice(0, 1);
}
$done({body : JSON.stringify(Q)});

最终,编写的脚本为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*************************************
项目名称:联合早报
脚本作者:Henry
更新日期:2023/11/29
**************************************

[rewrite_local]
^https:\/\/ads\.zaobao\.com\/advertapi\/advert\/queryAdvertisementByCondition\?([^&]*&)*adSize=320x100(&[^&]*)*$ url reject
^https:\/\/nsdd\.zaobao\.com\/appapi\/feed\/home\/zb\?[^?]*$ url script-response-body https://raw.githubusercontent.com/lychee-h/QuantumultX-backup/main/scripts/zaobao.js

[mitm] 
hostname = *.zaobao.com

*************************************/

var Q = JSON.parse($response.body);

// 去掉banner
if (Q.data && Q.data.length > 0) {
    Q.data.splice(0, 1);
}
$done({body : JSON.stringify(Q)});

4 测试

清清爽爽,大功告成。

相关代码上传本人GitHub仓库,喜欢的话,点个star吧!

updatedupdated2023-11-292023-11-29