可以先看一下n0r00t的文章的这一篇:https://www.n0tr00t.com/2017/01/09/Chrome-Extensions-Probe.html
以及用chrome试用一下最后的成果POC:http://server.n0tr00t.com/chrome/ext_probe.html,可以探测Chrome中已安装的扩展,配合Chrome扩展的一些漏洞,说不定能达到定点攻击的效果。

和蘑菇同学一起弄的一个有趣的尝试。在此之上写的爬虫项目,主要以实现目的为主,不过有几个点挺有意思,稍微记录分享一下,留给后人用。主要的思路可以看上面的文章,简单来说就是:以script标签on事件的差异性,结合Chrome开发规范”version 2.0”的manifest.json中的web_accessible_resources,探测客户端所存在的扩展。

我这里主要负责的工作就是前期的数据准备啦。主要目的:爬虫获取Chrome扩展的一些信息包括:扩展ID,扩展名,Star数量,用户数量、类别、插件商店URL等信息,然后根据ID下载扩展的.crx文件进行解压,提取其manifest.json,解析manifest.json中的web_accessible_resources字段,生成一个json文件。

github地址:https://github.com/neargle/ChromeExtensionKnower

1
2
3
4
5
6
7
8
9
10
11
12
$ python3 geknower.py --help                                                                             master [b563839] modified untracked
[*] main start
Usage: geknower.py [OPTIONS] COMMAND [ARGS]...

Options:
--help Show this message and exit.

Commands:
etxDownload Download Chrome Etx .crx file and get some...
etxInfo Crawl and update Chrome Etx infomation
spec-fileCheck Check filename in web_accessible_resources is...
spec-weblistAgain Re get weblist

关于脚本如何使用,可以去看一下github上面的readme,这里主要先记录一下写程序时遇到的一些有趣的点,以备后人使用。看完这些可能更有助于你理解代码。

Q. Note

1. Chrome WebStore Api

主要用到三个API:

  1. 爬取chrome扩展信息:https://chrome.google.com/webstore/ajax/item?hl=zh-CN&gl=CN&pv=20161108&mce=atf,eed,pii,rtr,rlb,gtc,hcn,svp,wtd,c3d,ncr,ctm,ac,hot,euf,mac,fcf,rma,pot,evt,igb&requestedCounts=infiniteWall:{limit}:0:false&token=featured:[email protected]:7:false,mcol#top_picks_productivity:[email protected]:11:true,infiniteWall:[email protected]:{start}:false&category={category}&_reqid=3058318&rt=j
  2. 根据ID下载.crx文件:https://clients2.google.com/service/update2/crx?response=redirect&prodversion=49.0&x=id%3D{id}%26installsource%3Dondemand%26uc

下载crx文件是比较简单的,主要是爬取chrome扩展信息的那个API,费了我和蘑菇一点神。主要看url中,我{}出来的start和limit的位置是比较奇特的,不像正常的翻页请求,根据start,limit和category可以获取到全部的chrome扩展信息。扩展的分类有:

1
2
3
4
5
6
7
8
9
10
11
12
13
category_list = [
'ext/10-blogging',
'ext/12-shopping',
'ext/11-web-development',
'ext/1-communication',
'ext/7-productivity',
'ext/38-search-tools',
'ext/13-sports',
'ext/22-accessibility',
'ext/6-news',
'ext/14-fun',
'ext/28-photos'
]

其实还有一个’ext/15-by-google’分类,但是这个分类的扩展在其他分类中也存在,而且这个分类是不能用第一个Api爬去的,得使用https://chrome.google.com/webstore/ajax/item?pv=20161108&count=209&category=ext/15-by-google这个API。API中存在的pv可能是需要更新的。

2. 拓展数据解析

一般这种ajax,返回的应该是正常的json格式,但是Chrome Webstore却不是,Chrome返回的的格式是这样的。

明显不是正常的json,经过测试之后,是可以根据这样json.loads(res.lstrip(")]}'\n"))解析成一个复杂的list的。然后再根据位置进行提取可以获得到我们所需的信息。其中要注意,users的信息是千分位字符串1,000,000,而且是有可能出现1,000,000+的情况,在处理数据的时候需要考虑进来。处理方法看https://github.com/neargle/ChromeExtensionKnower/blob/master/lib/common.py#L8

3. 解析”web_accessible_resources”

我们需要web_accessible_resources中可以访问的资源,原本直接使用web_accessible_resources,但是发现web_accessible_resources中是可以使用*做通配符的,所以我们需要获取crx中的所有文件路径对通配符进行匹配。但是与linux通配符又有一定区别。/path/*是可以匹配到path/zzz.png的,所以如果要使用fnmatch进行处理的话,多进行一个对路径和通配符的操作。

实际编写脚本的过程中,因为这些问题得爬取数据下来观察数据才能发现不对,所以重复爬了好几次。浪费了很多时间。

还有一些小细节,比较繁琐就不描述了,有需要的可以看看项目代码。

程序使用介绍

https://github.com/neargle/ChromeExtensionKnower/blob/master/README.md

最后

因为chrome插件开发者的质量层次不齐,不免还有很多未解决的问题。包括其最后的Poc的JavaScript中也留了一个很有趣的点,注意到并且对此有想法的人可以和我们交流呀。

Thx

Evi1m0 Phithon

本文URL: https://blog.neargle.com/2017/01/09/chrome-ext-spider-for-probe/index.html