1. 程式人生 > 實用技巧 >利用chrome_remote_interface實現程式化、自動化Web安全測試

利用chrome_remote_interface實現程式化、自動化Web安全測試

如果要問有哪些抓包神器或者流量分析工具?以下幾款工具是必須要提的,burpsuite(跨平臺)、fiddler(windows下抓包神器)、wireshark(經典網路抓包工具)、justniffer(與前面幾個使用代理獲取流量不一樣的是,justniffer是基於網絡卡獲取流量)等。以上這幾款工具之前我有單獨成文介紹過,如有需要可點選藍色連結移步。

那麼如果問有哪些程式化的抓包工具?(註明一下這裡的程式化指的是可程式設計)首先burpsuite算一個,因為我們可以開發擴充套件工具(burpsuite外掛開發之檢測越權訪問漏洞);另外fiddle也算一個,可以編輯配置檔案,達到擴充套件功能,之前也介紹過。

那麼如果問有哪些即可以實現程式化又可以實現自動化的抓包工具?(註明一下這裡的自動化是指自動產生流量)這個問題有點拗口,你可能會想為什麼一個抓包工具要負責產生流量,流量交給爬蟲豈不是更好?這個問題暫且放一放,繼續往下看。

自動化安全測試

平常我們經常會使用burpsuite等工具檢測一個網站的安全性,檢測方法不外乎使用瀏覽器訪問網站且把流量代理到burpsuite上,然後在burpsuite上通過攔截、修改、重放流量等方式測試網站安全性。然而當要測試的網站非常多時,有沒有一個更自動化、更省力的方式去測試呢?方案肯定是有的,簡單來說要實現自動化web安全測試無非要解決幾個問題,首先是流量怎麼產生?然後是怎麼從流量中分析出漏洞?

自動化測試方案:主動掃描器

市面上基於爬蟲的主動掃描器就是一種自動化安全測試工具,首先它的流量是通過爬蟲爬取url主動產生的,然後利用一些漏洞外掛去構造不同的訪問請求。短板:目前市面上掃描器爬蟲大多基於web1.0,無法載入js渲染網頁,而現在越來越多的網站使用web2.0技術實現前後端資料互動。

自動化測試方案:被動掃描器

一些大廠內部自研的被動掃描器,首先它的流量不是通過爬蟲主動獲取的,而是通過監聽交換機等網路裝置的網絡卡流量,然後利用一些漏洞外掛去分析流量中存在漏洞的點。短板:適合大廠各業務線安全檢查不適合測試某個特定的網站,因為需要人為訪問網站產生流量。

自動化測試方案:selenium+流量獲取工具+漏洞外掛

selenium是一款網站自動化測試工具,可以程式化的操作瀏覽器,實現自動化產生流量。再結合抓包工具以及漏洞檢測外掛,應該就可以解決流量獲取以及漏洞檢測的問題。短板:用selenium只能實現一些簡單的瀏覽器操作,對於檢測複雜的網站系統,似乎不夠用,而且速度很慢,效能很差。

自動化測試方案:chrome_remote_interface+漏洞外掛

之前我介紹過headless chrome,也介紹過phantomjs等web2.0爬蟲工具,目前推薦去學習使用headless-chrome。headless chrome工具是用來自動載入js,獲取渲染後的頁面原始碼,解決web2.0爬蟲之困。而chrome_remote_interface是一個更底層的工具,可以用來分析協議,簡單說就是可以分析整個渲染過程,以及擷取分析過程中的流量。就類似您打開了chrome瀏覽器的審查元素功能,然後重新整理一下頁面,檢視一下network資訊。

chrome_remote_interface介紹

chrome_remote_interface是一個開源專案,專案地址,並且支援命令列、編碼兩種方式,且使用node.js開發。

安裝使用

因為chrome_remote_interface是基於nodejs的,因此需要安裝npm包管理工具。

yum install npm -y

然後建立一個目錄,初始化一個專案

npm init

在目錄下安裝chrome_remote_interface

npm install chrome-remote-interface

建立一個簡單的nodejs程式(nmask.js):

const CDP = require('chrome-remote-interface');
// node nmask.js https://nmask.cn
var options = process.argv;
var target_url = options[2];
CDP((client) => {
    // extract domains
    const {Network, Page} = client;
    
    // setup handlers
    Network.requestWillBeSent((params) => {
        console.log(params.request.url);
    });
    Page.loadEventFired(() => {
        client.close();
    });
    
    // enable events then start!
    Promise.all([
        Network.enable(),
        Page.enable()
    ]).then(() => {
        return Page.navigate({url: target_url});//輸出請求的url
    }).catch((err) => {
        console.error(err);
        client.close();
    });
}).on('error', (err) => {
    console.error(err);
});

說明:在執行這段程式前,必須要在系統上安裝chrome以及啟動chrome headless監聽模式,具體怎麼安裝chrome headless可以移步:headless chrome and api

啟動chrome headless監聽模式:

chrome --headless --remote-debugging-port=9222
或者
google-chrome --headless --remote-debugging-port=9222

然後另外開啟一個視窗,執行nodejs:

node nmask.js https://thief.one

執行結果如下:(輸出渲染過程中請求的所有url)

chrome_remote_interface for python

由於chrome_remote_interface是nodejs實現的,因此對於不熟悉nodejs的朋友來說coding成本比較高。然而好在已經有外國友人用python封裝了一個工具,專案地址,雖然目前此專案尚處於初級階段,但實實在在地解決了我的問題。

安裝使用

基於是用python3.5開發的,那麼就clone一下專案,直接安裝吧:

git clone https://github.com/wasiher/chrome-remote-interface-python.git
python3 setup.py install

編寫一個python版的程式(nmask.py):

#! -*- coding:utf-8 -*-
'''
__author__="nMask"
__Date__="7 Jun 2018"
__Blog__="https://thief.one"
__version__="1.0"
__py_version__="3.5"
'''
import asyncio
import chrome_remote_interface
class callbacks(object):
    ''' callback class '''
    target_url = ''
    result = []
    async def start(tabs):
        await tabs.add()
    async def tab_start(tabs, tab):
        await tab.Page.enable()
        await tab.Network.enable()
        await tab.Page.navigate(url=callbacks.target_url)
    async def network__response_received(tabs, tab, requestId, loaderId, timestamp, type, response, **kwargs):
        '''
        print(response.requestHeaders)
        print(dir(response))
        more response attribute https://chromedevtools.github.io/devtools-protocol/tot/Network#type-Response
        '''
        try:
            body = tabs.helpers.old_helpers.unpack_response_body(await tab.Network.get_response_body(requestId=requestId))
        except tabs.FailResponse as e:
            print('[Error]', e)
        else:
            print(response.url,response.status,len(body))
            callbacks.result.append((response.url,response.status,len(body)))
    async def page__frame_stopped_loading(tabs, tab, **kwargs):
        print("[Info]Finish")
        tabs.terminate()
    async def any(tabs, tab, callback_name, parameters):
        pass
if __name__=="__main__":
    callbacks.target_url = "http://www.baidu.com"
    asyncio.get_event_loop().run_until_complete(chrome_remote_interface.Tabs.run('localhost', 9222, callbacks))
    print(callbacks.result)

說明:同樣的在執行這段程式碼前,先執行chrome headless監聽程式。

然後執行該程式:

python nmask.py

說明:執行程式,最終得到渲染過程中請求的url、響應碼、響應內容長度。

PPT模板下載大全https://redbox.wode007.com

Chrome Debugging Protocol

無論是nodejs版本的chrome-remote-interface還是python版本的,實現的底層都是基於Chrome Debugging Protocol介面,官方文件,因此在使用chrome-remote-interface過程中,可以查詢一下這個文件。比如python版本中network__response_received函式,是封裝了Chrome Debugging Protocol介面Network.ResponseReceived函式,而此函式接受的引數,以及一些屬性方法等都可以在該文件中查詢。

解決文章開頭的問題

文章開頭還留了一個問題,有哪些即可以實現程式化又可以實現自動化的抓包工具?想想chrome-remote-interface能幹啥?其一可以使用nodejs、python(可能還有其他語言封裝的專案)程式設計,底層介面文件比較完善;其二用它來寫web2.0爬蟲,訪問頁面產生流量,當然區別web1.0爬蟲,這裡的流量是完整的流量,相當於人工開啟瀏覽器訪問網頁;其三可以獲取流量,並且進行分析。第一點功能實現了程式化,第二三點功能實現了自動化。

最後讓我們回過頭看一下前文提到的自動化測試方案–主動掃描器,其短板就是沒法解決web2.0爬蟲的困境,而chrome-remote-interface恰恰可以解決,發揮下想象力,其前途應該無限!