當前位置:
首頁 > 最新 > 安全開發之掃描器迭代記:W9Scan

安全開發之掃描器迭代記:W9Scan

w9scan是一款全能型的網站漏洞掃描器,借鑒了各位前輩的優秀代碼。內置1200+插件可對網站進行一次規模的檢測,功能包括但不限於web指紋檢測、埠指紋檢測、網站結構分析、各種流行的漏洞檢測、爬蟲以及SQL注入檢測、XSS檢測等等,w9scan會自動生成精美HTML格式結果報告。

在開發w9scan之前筆者已經開發過了w8scan,了解的朋友可能知道,w8scan的掃描功能並不強,所以,筆者想通過開發w9scan,這款在本地運行的掃描器來為w8scan的掃描器代碼探路~。

俗話說工欲善其事必先利其器,筆者用過很多掃描器,無不為他們強大的掃描功能所折服。而筆者作為一名腳本小子,本想開車駛向遠方卻造起了輪子樂此不疲。僅以此文紀念w9scan的開發過程,紀念那逝去的青春…

額,,, 將視線拉回到本渣作。w9scan的初期代碼是模仿bugscan而寫的,因為w9scan在編寫的初期就是為了兼容bugscan的插件,因此做了大量兼容工作來兼容w9scan的代碼。而做兼容工作必不可少要了解下bugscan的工作原理,所以筆者用自己的渣渣理解力簡述下bugscan的功能流程:

首先載入服務類型為www的插件,www插件掃描的過程中同時解析服務,得到ip,載入服務類型為ip的插件繼續掃描,得到埠信息載入各種埠插件對目標分析,得到CMS信息,載入對應cms的插件等等…

不得不說,這是一個很棒的結構。

於是筆者在代碼結構層次模仿w9scan,功能結構層次模仿bugscan,憑著腦中若干的想像!@#¥@# 製造了w9scan第一版本..

對於bugscan插件的兼容:可以在

Exploit_run類中找到,主要通過下面幾個階段完成。

獲取plugins目錄下所有的py文件,(__init__.py除外),將內容存入一個字典中

2. 插件代碼載入函數,通過調用imp模塊將字典存儲的代碼載入進來,返回模塊對象

3.為返回的模塊類加上內置的API(就是一些bugscan常用的內置API,如curlhackhttp之類)

4.一切就緒,然後根據bugscan API說明,bugscan插件需定義兩個函數 assign為驗證 audit為執行函數。所有接下來來調用這兩個函數了。


目前CMS大多數都是依靠指紋,看了很多依靠機器識別來驗證webshell的列子,筆者也在學習如何用機器學習來識別CMS。

W9scan的CMS識別的指紋庫以及代碼都是bugscan的,裡面有一些有趣的技巧,分享一下。CMS指紋文件在 lib/utils/cmsdata.py

可以看到主要是根據MD5以及關鍵字來識別的。筆者之前寫的CMS識別都會用個欄位來表示識別方式,這個似乎沒有,來看看有什麼奧秘?

來到 plugins/www/whatcms.py

從 audit函數看起,第一個for循環是給指紋排序

為了減少訪問網頁的次數,cms識別即最好訪問一次路徑後,同時找出相同路徑下的cms的特徵,例如訪問一次 robots.txt 會有很多cms的指紋路徑是這個。

最後在isMatch() 函數下找到我們問題的答案~

可以看到,是通過對訪問路徑的後綴做判斷,並且對讀取的圖片前幾位做校驗。這種判斷模式比一些暴力用指紋枚舉的判斷模式在效率方面應該是更好的。

最後,如果匹配成功,會像我們上面說到的一樣,調用相應CMS的相應插件

在我們exploit_run 類的內部實現task_push 的功能就好啦~


剛開始筆者接觸到的插件是這樣的

這種對查找插件和添加都不太方便,於是筆者一個一個的將它們整理到了目錄,變成了這個樣子。這裡面的辛苦。。!

其實整理也不辛苦拉,像筆者這麼懶的人怎麼會一個個手動干呢,一個正則一個移動文件 一個自動創建文件夾就把這些搞定了

為什麼要放出來說呢?因為筆者認為這是筆者用程序干過的最省力的事情了!QAQ


子域名查詢是比較頭疼的東西,因為對於w9scan,不想太依賴第三方龐大的庫支持,重寫DNS協議一個覺得麻煩而且重複造輪子沒有意義,參考github上別人的子域名工具都太龐大了,短小精悍的不知道有木有。最後…用下面這十行的代碼搞定了。

try: l =socket.gethostbyname_ex(hostnames) security_info(str(l),"subdomain")exceptsocket.error:pass

O(∩_∩)O哈哈~,其實通過socket.gethostname就可以完成子域名爆破的工作,為什麼要用自己重寫dns協議呢。


這是一個識別網站框架,網站信息的腳本,當初認識它是在一本爬蟲的書上,後來發現原來調用的是Wappalyzer的腳本,但是Buildwith更短小精悍,一個py文件就寫好了全部的功能,簡直深得我意。於是集成之~

大家可以自行 pipinstall buildwith 安裝這個庫試試,非常強大!

當然如果大家下載w9scan是不需要安裝這個的,因為我已經將他集成上去了!!

原理其實也非常簡單,就是這麼多的指紋!!!

其實,一款好用的掃描器無外乎需要在速度和精準度之間權衡,精準度需要大量的插件做支撐,而這些插件,也都是一些特定的指紋訪問特定的路徑,但此時速度方面就得不到提高。似乎陷入一個二者不可得兼的狀況。


對於像掃描器這樣的IO密集型作業,用線程似乎可以大大提升速度。當然,用多進程聯動的方式也行,這應該是w9scan後面研究的對象,現在說下w9scan怎樣控制線程的。

起初,用了網上常用的ThreadPool模塊,但是不知怎的,經常會出現python運行已停止的提示(Windows上)。。,而且夾雜一大堆不知道有什麼用的模塊。上回說到,筆者並不洗用那種一大堆文件的模塊,不利於集成就算了,還ctrl+c暫停的時候卡住了!是可忍孰不可忍,於是筆者立馬操起菜刀,小心翼翼的在Google上搜索答案。

以筆者的渣渣水平,十個答案裡面只能看懂3個,轉而想想看代碼好了。之前筆者用POC-T這款軟體的時候覺得挺穩,於是乎拉它開刀,還真開對了!

筆者模仿[POC-T](https://github.com/Xyntax/POC-T/blob/2.0/lib/controller/engine.py)的線程引擎不僅解決了程序異常,也解決了ctrl+c阻塞的問題。請聽我慢慢道來。

程序運行異常可能在於ThreadPool模塊中有不少自動調節線程的程序,經過筆者多次的測試,每次出現異常時載入的插件並不相同,可以排除是筆者插件代碼問題導致。實際上筆者的程序不需要這麼高端的線程池,仿照POC-T,筆者寫了一個簡陋,但是好用的線程池。

這麼一個簡陋的線程池對於筆者的w9scan來說足夠了(其實筆者的要求也不高是不是)

Ctrl+c阻塞主線程可能是join()這個方法阻塞了,解決辦法就是不用這個方法,用while循環和time.sleep功能達到一個模擬join()的作用。


我覺得,一些成熟的掃描器在一些常規掃描方式達到登峰造極的地步,以至於在想用這些常規方法掃描漏洞,效果可能不太好。想要有效挖掘一個網站的漏洞,應該從那些不起眼的地方著力,比如w9scan掃描器中有git svm泄露路徑尋找,會基於域名的字典來查找備份文件,以及根據爬蟲尋找出的文件逐個進行一句話密碼破解等等……


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 瘋貓網路 的精彩文章:

Android惡意軟體偷取Uber憑證
如果重新設計網路協議,能否完全解決ddos攻擊?

TAG:瘋貓網路 |