RTIS(信安之路) CTF 戰隊招聘
CTF 的五個方向:web、misc、pwn、reverse、crypto
需要五個組長、若干組員,有比賽經驗的優先、在信安之路投過稿的優先、在別的平臺分享過 writeup 的優先
五個組長可以直接加入 作者團隊 以及 小密圈
想申請可以寫一個簡單的簡歷,發送到 1293348082@qq.com,簡歷的篩選均由作者團隊審核,擇優錄取,並進行考核
考核方式:找專人與你一對一聊天面試
工欲善其事,必先利其器。
在滲透測試領域有琳琅滿目的工具、神器,它們可以大大簡化滲透測試的工作量。但很多時候僅僅使用別人的工具是不夠的,我們需要自己去編寫一些腳本、插件來完成定製的內容,而這樣的工作會很大程度提升滲透測試的效率。筆者認為沒有最好的工具,如果有則一定是自己根據自己需要開發的工具。
本文結合 pentestdb 這個項目介紹一些安全工具設計實現方面的思路,項目地址如下:
https://github.com/alpha1e0/pentestdb
pentestdb 使用 python 語言實現,而 python 這門程式語言非常適合編寫此類工具,不僅語法簡單、入門容易,而且有大量的非常優秀的庫可以幫助我們很快解決問題。
pentestdb 最早的時候只是一個「數據集合」,用於存放一些在滲透測試中常用的信息,比如 webshell 、弱口令字典、url 爆破字典等,後來發現如果基於這些信息編寫一些工具則可以一定程度上提高滲透測試的效率,於是有了 pentestdb 當前這個項目。
pentestdb 項目的設計原則:
1、一切圍繞「數據」。因此的各種字典文件、特徵文件、插件、exploit 是最核心的內容。
2、易用、易擴展。可以通過修改字典文件、特徵文件、插件來擴展能力。
3、各個子模塊可以相互協調工作。例如一個模塊生成的結果可以作為輸入給其他模塊使用。
4、便攜。無需要安裝,可在任何 python2.x 環境執行。
在本文中會介紹 pentestdb 的服務識別、google hacking、域名爆破、編解碼等內容,希望這些內容對於需要實現工具的人有所啟發。
1 服務識別在 web 滲透測試中,當確定目標站點地址後首先要做的事情就是了解這些 web 站點的相關信息:
1、web 站點所在主機的作業系統是什麼
2、使用的程式語言是什麼
3、後端的資料庫是什麼
4、使用的 web 伺服器、容器是什麼
5、使用哪些開源 CMS 或開源組件
我們會通過發送一些 http 請求通過觀察、推測從而獲得以上信息。而在探測過程中有如下幾種信息是關鍵的:
1、http 返回中的 header 信息。例如 Server: nginx 表示後端使用的是 nginx 伺服器
2、返回html中的信息。例如很多開源CMS會有一個 Powered by xxxx 的欄位
3、特殊 url 路徑。每種 CMS 都會有一些特殊 url 路徑,通過訪問這些路徑可以確定是否是相關的 CMS
4、robots 文件信息。
例如,我們向目標 web 伺服器發送一個 GET 請求,收到了如下信息:
那麼我們可以通過返回的 http headers 中的 Server 欄位推斷出,被測試的 web 站點是搭建在 windows 作業系統上,並且伺服器是 IIS8.5,而且進一步我們可以猜測 web 後端可能會使用 ASP/ASP.net/C# 來構建應用。
將這些維度的信息總結、提煉、格式化就形成了 web 的指紋資料庫。pentestdb 中的指紋「資料庫」使用 yaml 格式來編寫,可以參考 app_fingerprint.yaml 這個文件。這裡簡單舉例
以上是 PHPWind 的指紋信息定義,其中:
1、cats 表示該指紋信息的分類,pentestdb 中的其他類別有 OS/Sever/Language/Middleware
2、implies 表示推測的信息,例如 PHPWind 顯然可以推斷出後端使用了 PHP 作為程式語言
3、matches 是真正的指紋定義。這裡有 html/requests/robots 三種方式,html 是正則的定義,用於通過正則表達式在返回的 HTML 中匹配模式; requests 是特殊 URL 的匹配定義, robots 是匹配 robots.txt 文件的模式;另外還有 headers 定義這裡沒有看到,同樣也是使用正則匹配 http headers 中的欄位
另外, pentestdb 中其實還有一個 CMS 識別的小模塊,其原理和這裡的 requests 匹配類似,通過特殊 URL 來匹配,只是規則稍微複雜一些,可參考 cms_fingerprint.yaml 這個文件。
當然可以利用的指紋特徵不僅僅有這些,例如不同 web 伺服器返回的 headers 中各個欄位的順序是不同的,通過這些順序也可以猜測到目標的信息。關於這方面的內容可參考 OWASP OTG-INFO-002
https://www.owasp.org/index.php/Fingerprint_Web_Server_(OTG-INFO-002)
不過在多數場合下以上的數據都是夠用的。
在定義了指紋之後,就可以編寫業務邏輯,只需要一個 http 客戶端 requests,然後用 if-esle 實現邏輯代碼即可。具體實現可參考 service.py 這個文件。
前文中提到了, pentestdb 最初是一個滲透測試的數據、資源集合,這裡也可以看到,這些 yaml 配置文件本身也是很好的記錄知識、經驗的方法,在研究了某些 CMS 之後完全可以將研究的結果隨手添加到 yaml 配置中,這樣既記錄了知識,又完善了自動化工具。
對 web 指紋識別感興趣的也可以參考 wappalyzer 這個項目,項目地址:
https://www.wappalyzer.com
該項目提供了一個瀏覽器插件,在訪問網站的時候可以直接顯示網站的一些組成信息,非常方便,pentestdb 的指紋格式設計就是參考了該項目。
2 google hackinggoogle hacking 是一種常見的前期信息收集工具,可以完成子域名收集、敏感文件收集等,當然 google hacking 本身也是一種在網際網路上尋找測試對象的好方法。
pentestdb 引入了專門的模塊做 google hacking ,語法和 google hacking 的常用語法完全一樣,關於 google hacking 語法方面的資料網際網路上有很多,可參考 GHDB
https://www.exploit-db.com/google-hacking-database/
本文不再詳細介紹。
在 pentestdb 中引入 google hacking 是因為在很多自動化工具中,我們需要直接獲取到一個 URL 列表,例如 pentestdb 的 exploit、url 爆破模塊都可以直接輸入一個 URL 列表進行批量的測試,而是用瀏覽器是無法實現這些的。
google hacking 模塊實現了 bing/google/baidu 三個 SearchEngine ,同時作為一個基礎模塊(要為子域名爆破服務)提供了 Query 類作為入口方便調用,相關實現可參考 searchengine.py 。
在 google hacking 的實現中最麻煩的地方在於,目前的搜尋引擎都有 機器人識別程序 ,使用腳本進行批量搜索的時候如果不做一些處理,很容易被機器人識別程序發現,並進行「阻斷」。
筆者並沒有深入研究過幾個搜尋引擎的機器人識別程序, pentestdb 中使用的 bypass 機器人方法是基於常用的機器人識別算法開發的,實際使用效果不錯。機器人識別程序一般通過以下幾個特徵判別是否是機器人
1、user-agent。爬蟲、框架都有「專屬」的 user-agent 和瀏覽器明顯不同,例如 python requests 框架的 user-agent 為 python-requests
2、通過同一源的訪問頻率。如果同一個源地址頻繁的訪問,則會認為是機器人。注意這裡的源,包含源 IP:port/session 等信息。
搜尋引擎在發現機器人後,常見的處理方式是發送「挑戰頁面」,而不是直接斷開連接,挑戰頁面需要人輸入驗證碼從而最終判定是否為機器人程序。
因此,bypass 機器人識別的關鍵在於: 讓搜尋引擎覺得工具的的搜索請求來自於不同的、合法的客戶端。
在 pentestdb 中使用三種方式來 bypass 機器人識別。
1、修改 user-agent 。 pentestdb 會讀取常見瀏覽器的 user-agent ,然後隨機挑選一個來使用
2、隨機延時。 pentestdb 在兩個相鄰 http 請求之間會隨機延時 1 到 3 秒時間。
3、添加隨機的 X-Forward-For 頭部。 搜尋引擎可能會通過 X-Forward-For 來獲取「真實的」源IP位址,不過該欄位是否有意義尚待考證,因為目前至少在國內作為家庭用戶一般都是通過 NAT 到運營商網絡,所以很多人的源 IP 是一致的,搜尋引擎在機器人識別的時候不大可能僅僅通過源 IP 來進行判斷。
4、去掉 cookie 頭。在 pentestdb 提交查詢的時候是不攜帶 cookie 的,這樣搜尋引擎無法通過同一個 cookie 來判斷是否來自相同的客戶端。
3 子域名爆破當 web 滲透測試的對象是一個較大規模的對象的時候,一般正面突破的可能性比較小,例如一個公司,它的官網一定是防護最嚴格的地方,這時候我們要考慮旁註,公司一般有一些子域名的網站,不會經常用,從而防護較弱,例如公司一般都有論壇、考試之類的子域名網站,往往更具有價值。因此在 web 滲透測試前期工作中識別出子域名是非常重要的。
在 web 滲透測試中,常見的子域名獲取方式有:
1、通過域傳送漏洞。如果目標存在域傳送漏洞,則可以一勞永逸的獲取所有子域名。
2、通過 google hacking。
3、通過字典爆破。
4、通過 C 段,然後通過IP位址反查。不過支持 IP 地址反查的 DNS 比較少。
pentestdb 實現了前三種方式。
DNS 域傳送
DNS 服務在部署的時候,為了穩定性,一般會採用主備的模式,而備伺服器同步主伺服器的信息通過 AXLR 協議,在有的情況下,由於運維人員的錯誤配置會允許任何源(比如我們自己的電腦)通過 AXLR 訪問 DNS 伺服器,這就是「域傳送漏洞」的原理,一般在手工探測的時候我們會使用:
host -t ns domain; 查詢ns記錄獲取DNS Server,然後:host -l domain server,
dig NS domain; 查詢ns記錄獲取DNS Server,然後:dig axlr domain @server,
在 python 當然有 DNS 相關的庫, pentestdb 中使用 dnspython 這個庫實現 DNS AXLR 查詢,可參考 dnsparse.py 文件。
google hacking
子域名查詢的另外一種常用的方式就是 google hacking 一般我們通過下面的語法進行查詢
site:xxx.com -site:www.xxx.com
pentestdb 中會調用 google hacking 模塊進行處理,並返回子域名列表
域名字典爆破
pentestdb 的 dns 目錄下收集整理了一些常用的子域名字典文件,工具會基於這些字典文件進行爆破。這裡需要注意的是,不要忘了頂級域名的爆破,因為有的網站會有多個頂級域名。例如
xxx.com ==> xxx.cc xxx.xin xxx.info
4 編解碼編解碼是非常考驗安全人員基本功的的知識,在滲透測試中有廣泛的應用,尤其是在 bypass 各種安全機制、安全產品中編解碼都起到了重要作用。
web 滲透測試中我們經常使用 firefox+hackbar 或者 burpsuite 來完成編解碼,但筆者使用的過程中還是會遇到一些不盡人意的地方,所以自己開發了編解碼的工具。
pentestdb 中涉及編解碼的有 encode/decode/code 三個子命令,前兩者類似有 hackbar,後者用來對文件進行編解碼。
為了便於理解,本文將編解碼分為「非 ASCII 編解碼」和「特殊編解碼」。
非 ASCII 編解碼
由於 ASCII 只能表示非常有限的字符集,因此對於「非英文」字符無法表示,比如中文,因此有
1、中文專用編碼。例如,簡體中文的 GB2312/GBK ( GBK 是 GB2312 的擴展集,是目前最常用的,中文 windows 的默認編碼),繁體中文的 BIG5
2、Unicode 系列編碼。和 GBK 不同的是 Unicode 系列的編碼是全球通用的,包含絕大多數語言,常見的有 UTF8/UTF16/UTF32/UTF7
這裡需要區分 Unicode 和 UTFxx。 Unicode 只是一個碼錶,為了便於理解可以將其看作和計算機無關的數學映射,一個自然數對應一個字符,而為了將這個映射實現到計算機中就需要一個「轉換格式」,這個就是 UTF(Unicode Transformation Format) 。
最初的 Unicode 碼錶長度是小於 65536 的,因此最直觀的一種轉換方式就是使用 2 個字節表示,這種編碼就是 UTF16。因此有時候 Unicode 和 UTFxx 會有一些概念混淆,例如 windows 記事本中的 Unicode 格式其實是 UTF16 格式。
在 python 中實現非 ASCII 編解碼是非常簡單的事情, python 的標準庫裡面實現了全世界幾乎所有的編解碼方式,使用方式非常簡單
"some string".decode("utf8") # 將字符串( str 類型)按照 utf8 格式進行解碼,返回 unicode 類型字符串
u"一些字符串".encode("gbk") # 將字符串( unicode 類型)按照 gbk 格式進行編碼,返回 str 類型字符串
注意這裡的 unicode 是 python 內部的一種 Unicode 的數據格式,並非上文的 Unicode 碼錶。
有時候,我們可能不知道某個字符串的編碼格式,需要對編碼格式進行猜解,此時可以使用 chardet 這個 python 庫。
chardet.detect("some string") ==> {'confidence': 1.0, 'encoding': 'ascii'}
chardet.detect(u"中華人民共和國".encode("gbk")) ==> {'confidence': 0.99, 'encoding': 'GB2312'}
chardet 只能獲取到一個概率結果,一般在文本較長的時候才能獲取較準確的結果
特殊編解碼
我們常見的」特殊編解碼「有 url 編碼、html 編碼、base64、php-chr、8 進位、16 進位等等。
這些編碼經常和」非 ascii 編解碼「混合在一起,例如URL中包含中文的情況,在 firefox 中會先進行 UTF8 編碼,然後再使用 URL 編碼。
pentestdb 中支持同時制定兩種編碼方式來進行編解碼,而這個是很多其他工具不具備的。
5 其他模塊pentestdb 還有社會化密碼生成模塊、exploit 模塊、C 段掃描模塊在此做簡單介紹。
社會化密碼生成模塊
滲透測試的時候我們經常需要去做密碼猜解,在猜解的時候獲取的信息越多越好,這些信息包括但不限於如下:
人名 暱稱 英文名 愛人名稱 手機號 QQ號 公司名稱 域名
根據這些信息使用一定的模式來生成弱口令字典,猜解正確率會高很多。而這其中最關鍵的就是 模式 ,例如 XXX520、zhangsan@1111 是將人名加上一些前後綴的修飾。pentestdb 中使用了簡單的模式來根據這些信息生成密碼字典。
pentestdb 中定義了一些常用的前後綴,例如:
1、常用密碼關鍵數字
_numList = ['123456', '123123', ...]
2、常用前綴列表
_prefixList = ['a','qq','yy','aa','abc', ...]
3、常用密碼
_commonPasswd = ['123456', 'a123456', ...]
4、和 partner 混合的常用前綴列表
partnerPrefixList = ['520','5201314','1314','iloveu', ...]
5、和 domian,company 組合的前綴列表
domainPrefixList = ['admin','root','manager', ...]
然後將這些列表和獲取的社工信息組合在一起,組合的方式為加前綴、後綴,加分隔符,於是就生成了一份密碼文件列表。
exploit 模塊
pentestdb 中內置了一個小微的 exploit 框架,其接口參考了知道創宇的 pocsuite
https://github.com/knownsec/Pocsuite
可以基於此框架編寫一些 exploit,此框架主要的構成如下:
exploit(包含關於漏洞描述信息) <===> exploit 資料庫 <===> exploit 控制器
每個 exploit 都必須填寫一些「元信息」,例如:
而這些 元信息 都會存入 sqlite 資料庫,在使用的時候 exploit 控制器 可以通過這些 元信息 來過從而濾獲得想要的 exploit。這樣設計可以提高靈活性,例如現在要對某個 discuz 做測試,可以通過 appName:discuz 找到所有 discuz 的漏洞然後批量驗證目標站點是否有這些漏洞。
exploit 模塊是一個小微框架,鬆散結構的,其核心還是提供了方便的過濾方法及組織、格式化 exploit 編寫,因此 exploit 並沒有提供 payload 生成、多種類型客戶端。這也符合 pentestdb 的設計初衷,重點在於組織、歸檔資源信息。
C 段掃描
pentestdb 的C段掃描模塊實現得很簡單,因為筆者精力有限,只是簡單得調用了 Nmap 做掃描。
對於C段掃描任務,python 中有一個框架 scapy
https://github.com/secdev/scapy
非常適合做此類任務,此框架將常見的網絡協議封裝成一個個使用起來非常簡單直觀的類,並且使用中綴語法來構建不同的協議對象,使得協議層面的操作變得非常簡單,可以方便得實現很多功能,包括 Nmap/arping/tcpdump/netcat 等等。例如,可以用以下兩行代碼來進行 ping 操作:
p = IP(dst="1.1.1.1")/ICMP()
r = sr1(p)
如果想實現比較複雜的掃描工具,則可以使用 scapy 來實現
6 總結通過 pentestdb 的介紹可以看到,實現一個安全工具並不是很困難的事情,尤其是使用 python 這樣的包含大量第三方庫的高級語言,在了解目標需求後可以很快得實現一個定製化的小工具。
這些根據需求定製的安全工具往往也是對安全人員自己來說最「好用」的工具,筆者自己開發的這些工具都在自己的業餘和公司工作中發揮了重要的作用,並且提供了非常有價值的代碼積累。