基于应用日志的扫描器检测实践
基于應(yīng)用日志的掃描器檢測實踐
在網(wǎng)絡(luò)上搜索web掃描器時,各類掃描器工具、掃描攻略玲瑯滿目,但對掃描器檢測方法的內(nèi)容卻少之又少。因此,本文對各類web掃描特特征進行了梳理和總結(jié),并結(jié)合蘇寧應(yīng)用防火墻(SNWAF)日志數(shù)據(jù),分別展示了規(guī)則模型、統(tǒng)計特征模型和基于文本情感分析的深度學習模型在Web掃描器識別上的實踐效果,供大家參考。
1. 掃描器概覽
Web掃描器通過構(gòu)造特殊請求的方式,對Web系統(tǒng)可能存在的安全漏洞進行掃描,是滲透工作的必備工具。相關(guān)的網(wǎng)絡(luò)資源有很多的漏掃工具研發(fā)和使用的工作,如Nessus、Nikto、SQLmap等,然而掃描器檢測的工作卻非常少。這里嘗試從掃描器檢測方向出發(fā),根據(jù)掃描器的功能和所產(chǎn)生的請求內(nèi)容對其進行分類,并提出一種簡單有效的檢測思路。
1.1 敏感內(nèi)容掃描
俗話說知己知彼方能百戰(zhàn)不殆,當黑客或滲透測試人員面對一個未知站點時,這個站點對他們來說就是一個黑盒。這時候不妨拿敏感內(nèi)容掃描器先給它來個一把嗦摸摸底,指不定就能掃到有價值信息,找到撬動安全防護缺口的第一把鑰匙。
敏感內(nèi)容掃描器通常具備一些列敏感路徑及敏感文件的字典,掃描器利用這些敏感內(nèi)容字典對站點進行盲掃來判斷是否存在這些敏感內(nèi)容;進一步地,通過響應(yīng)數(shù)據(jù)包對站點目錄結(jié)構(gòu)及其他信息進行判斷,為下一步針對性單點突破作準備。
這里提到了一個字典的概念,字典這個玩意很重要,可以說字典的質(zhì)量、廣度和深度決定了這個掃描器的上限。相對于IP代理、UA偽造、隨機放訪問時間間隔這些偽裝手段來說,敏感內(nèi)容是固定的,翻來覆去就這么多東西,同時因為請求資源不存在大多數(shù)會返回404狀態(tài)碼(有些會觸發(fā)WAF攔截策略返回403,還有些因為服務(wù)器設(shè)置了默認跳轉(zhuǎn)狀態(tài)碼為301或302)。攻方選手通常不會構(gòu)造毫無意義的字典內(nèi)容來浪費有限的資源和精力,這些字典通常包含如下內(nèi)容信息(忽略大小寫):
- 敏感目錄信息:如/admin/, /phpadmin/, /mysqladmin/, /usr/local/, /etc/passwd/, ...
- 敏感配置文件:如.bashrc, .bash_history, conf.icn, config.inc, ...
- 版本文件信息:如/.git/config, /.svn/entries, /.bzr/xxx, ...
- 備份文件信息:如htpasswd.bak, index.php.bak, database.wsp, backup.zip, ...
- 密鑰文件信息:如/.ssh/id_rsa, /.ssh/known_hosts, id_rsa.pub, authorized_keys, ...
- 日志文件信息:如/logs/error.log, /logs/auth.log, /var/log/mysql/mysql.log, ...
- 其他敏感文件:如config.php, system.inc, mysql.inc, shell.php, ...
1.2 Web漏洞掃描
漏洞掃描器通常會與爬蟲相結(jié)合。首先利用爬蟲獲取到頁面可能存在注入點的接口,然后針對該接口來一個SQl注入、XSS注入、命令注入一把嗦,對于一些安全防護意識低的站點往往能取到最直接的效果。針對這類掃描請求,WAF都能夠做到單點正則過濾,理論上會攔截返回大量403狀態(tài)碼,但是掃描器常針對一些新域名或偏僻的域名進行掃描,這些域名往往沒有啟用WAF攻擊防護,因此實際上是有很多是未被攔截的非403狀態(tài)碼。同上述敏感內(nèi)容掃描,這類請求往往也具備明顯的文本特征,下面分別以sql注入、文件包含和XSS跨站掃描舉例。
1.2.1 sql注入漏洞掃描
SQL注入攻擊是一種注入攻擊,它將SQL命令注入到數(shù)據(jù)層輸入,從而影響執(zhí)行預(yù)定義的SQL命令;通過控制部分SQL語句,攻擊者可以查詢數(shù)據(jù)庫中任何自己需要的數(shù)據(jù),利用數(shù)據(jù)庫的一些特性,可以直接獲取數(shù)據(jù)庫服務(wù)器的系統(tǒng)權(quán)限。
首先,判斷接口是否存在注入點,如:
- 若參數(shù)ID為數(shù)字,加減運算判斷是否存在數(shù)字型注入
- 參數(shù)后加單雙引號,判斷返回結(jié)果是否報錯
- 添加注釋符判斷前后是否有報錯:如id=1' --+ 或 id=1" --+或id=1' #或id=1" --+
- 有些參數(shù)可能在括號里面,所以也可以在參數(shù)后面加單雙引號和括號,如id=1') --+或 id=1") --+或id=1') #或id=1") --+
- 參數(shù)后面跟or 或者and,判斷返回結(jié)果是否有變化,如1' or 'a'='a或者and 'a'='a或者1' or 'a'='b或者1' or '1'='2
- 也可以考慮時間延遲的方法判斷是否存在注入,如 1’ and sleep(5)
然后對存在注入漏洞的點利用聯(lián)合查詢一步步獲取信息,如:
- 查詢數(shù)據(jù)庫名:id=0’ union select NULL,database(),NULL --+
- 爆庫名:id=0’ union select null,group_concat(schema_name),null from information_schema.schemata --+
- 爆表名:id=0’ union select null,group_concat(table_name),null from information_schema.tables where table_schema=‘security’ --+
- 爆字段名:id=0’ union select null,group_concat(column_name),null from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+
或者通過報錯回顯查詢結(jié)果,如:
- 回顯數(shù)據(jù)庫名:and extractvalue(1,concat(0x7e,(select database())))
- 回顯表名:
and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’ ))) - 回顯列名:
and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’)))
?
1.2.2 文件包含漏洞掃描
服務(wù)器通過php的特性(函數(shù))去包含任意文件時,由于要包含的這個文件來源過濾不嚴,從而可以去包含一個惡意文件,非法用戶可以構(gòu)造這個惡意文件來達到惡意的目的,如讀取目標主機上的其他文件,遠程文件包含可運行的PHP木馬,包含一個創(chuàng)建文件的PHP文件,本地文件包含等。
- Include:包含并運行指定文件,當包含外部文件發(fā)生錯誤時,系統(tǒng)給出警告,但整個php文件繼續(xù)執(zhí)行;
- Require:跟include唯一不同的是,當產(chǎn)生錯誤時候,include下面繼續(xù)運行而require停止運行了;
- Include_once:這個函數(shù)跟include函數(shù)作用幾乎相同,只是他在導(dǎo)入函數(shù)之前先檢測下該文件是否被導(dǎo)入,如果已經(jīng)執(zhí)行一遍那么就不重復(fù)執(zhí)行了;
- Require_once:這個函數(shù)跟require的區(qū)別 跟上面所講的include和include_once一樣。
1.2.3 XSS跨站漏洞
跨站腳本攻擊是指惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的Script代碼會被執(zhí)行,從而達到惡意攻擊用戶的目的。與正常請求相比,XSS請求也具備明顯的文本特征,如<script>alert(0)</script>,<img src=0 onerror=alert(0)>等。
2. 規(guī)則模型
掃描器檢測與Web攻擊檢測不同之處在于,掃描是一種持續(xù)的行為,我們通過對掃描器持續(xù)一段時間的請求進行聚合分析,而Web攻擊檢測則是把每條請求作為一次獨立的事件來判斷是否為Web攻擊。掃描器在請求不存在的資源時往往會返回狀態(tài)碼404,但實際生產(chǎn)環(huán)境中并非如此。尤其是作為電商企業(yè),希望被正面的搜索引擎抓取,返回404的這種方式會對SEO搜索引擎優(yōu)化產(chǎn)生不利影響,因此多數(shù)域名針對這種請求會做3XX的跳轉(zhuǎn)。總體來說,大量返回404的請求往往都是盲掃請求,但仍有大量盲掃請求返回狀態(tài)碼并非404。這里依賴Web請求日志,在一定時間被僅對請求url文本特征進行分析,來識別掃描器。
2.1 正則提取
敏感內(nèi)容掃描器往往會請求敏感路徑、敏感文件等信息,因此首先收集這些信息,然后用正則匹配去你和這些內(nèi)容。這里分別按照敏感信息的類型進行分類:
class Sensitive(object):"""docstring for Sensitive"""def __init__(self):super(Sensitive, self).__init__()self.patterns = [# 0. 敏感文件re.compile("(((php)?info|php|[mc]oon|dns|payload|mytag_js|cmd|log|my|shell|data|te?mp|settings|default|root|robots?|htaccess|(my)?sql|data(base)?|db|conf(iguration|ig|igs)?|bac?k(up)?|te?mp|pack(age)?|test|web(site)?|old|site|src|code|suning|result|home|ftp|common|sys(tem)?|(htp)?passwd|shadow|ssh|httpd?)\d{,3}\.(php|zip|rar|tar|gz|tgz|bz2|7z))(\?|&|\s|$|\.)",re.I),# 1. 敏感后綴re.compile("(\.(sql|in(i|c)|conf(ig)?|pub|bac?k(up)?|mdb|swp|ssh|old|tag|git(ignore)?|svn|bzr)(\?|&|\s|$))",re.I),# 3. 敏感日志re.compile("(/logs?/(\w+/){0,}[\w_\.-]+log$)", re.I),# 2. adminre.compile("(/_*(sql|my(sql)?|php|db|sha)[+-._\d]*(my)?admins?[+-._]*(bak|old|[\d.]+)?/)|(\w*admin\w*\.\w+)",re.I),# 3. 連續(xù)重復(fù)字符文件re.compile("/(\w)\\1{1,4}\.(php|zip|rar|tar|gz|tgz|bz2|7z)(\?|&|\s|$)",re.I),# 4. 敏感路徑re.compile("((etc/(passwd|shadow|(sys)?(\w*\.)conf(ig)?|\.?ssh|httpd|apache|bashrc|issue|termcap|inputrc|group))|web-inf|usr/local|(var/(lib|logs?|cahces?|apache2?)))",re.I),# 5. 連續(xù)數(shù)字文件re.compile("(/\d{1,5}\.(php|zip|rar|tar|gz|tgz|bz2|7z))(\?|&|\s|$)")]2.2 正則優(yōu)化
正則順序優(yōu)化:按照Sensitive類的定義,當url匹配到關(guān)鍵內(nèi)容后即返回匹配內(nèi)容,跳出正則過濾的循環(huán)。因此,為了進一步降低性能的消耗,將生產(chǎn)環(huán)境中命中頻率最高的正則放在最前面,命中率低的正則放在靠后位置。
單條正則調(diào)優(yōu):由于正則匹配搜索的優(yōu)先級為由左向右,因此將生產(chǎn)環(huán)境中命中頻率最高的放在左邊,最低的放在最右邊。
2.3 準確率和召回率評估
評估方式:模型部署在SSMP平臺,按每分鐘進行聚合,并將檢測到的掃描器數(shù)據(jù)作為Log日志打印。根據(jù)Yarn日志輸出的掃描器IP和檢測到的請求時間在云跡進行抽樣驗證。
3. 統(tǒng)計特征ML模型
掃描器請求和正常請求之間除了文本特征以外,在狀態(tài)碼、url長度、所攜帶ua的混亂度及訪問域名的混亂度等也存在一定差異性。因此提取命中關(guān)鍵詞次數(shù)及上述特征,結(jié)合WAF正常日志和規(guī)則檢測到的掃描器日志形成黑白樣本,進一步訓練ML模型。
3.1 特征提取
- 關(guān)鍵詞提取
結(jié)合網(wǎng)上常見的集中掃描器提取敏感內(nèi)容字典,并結(jié)合規(guī)則模型識別的掃描器日志加以補充,組成關(guān)鍵詞庫。進一步隨機提取全網(wǎng)流量作為白樣本對掃描器關(guān)鍵詞庫進行匹配,并將白樣本中大量存在的關(guān)鍵詞剔除,最終關(guān)鍵詞如下:
3.2 特征工程
除了關(guān)鍵詞系數(shù)特征,同時還分別提取了請求次數(shù)、敏感詞個數(shù)、敏感詞威脅系數(shù)、UA混亂度、域名換亂度、狀態(tài)碼占比等特征進行示范。
class ScannerFeatures(object):def __init__(self):super(ScannerFeatures, self).__init__()self.wspatt = re.compile("/(\w)\\1{,4}\.(php|zip|rar|tar|gz|tgz|bz2|7z)(\?|&|\s|$)")self.nbpatt = re.compile("(/\d{1,5}\.(php|zip|rar|tar|gz|tgz|bz2|7z))(\?|&|\s|$)")self.adminpatt = re.compile(r'(/_*(sql|my(sql)?|php|db|sha)[+-._\d]*(my)?admins?[+-._]*(bak|old|[\d.]+)?/)|(\w*admin\w*\.\w+)', re.I)self.wordindex = eval(open('wordindex.txt', 'r').read())def statusRate(self, arr, statu):"""計算狀態(tài)碼占比"""return arr.count(statu) / len(arr)def GiniArr(self, arr):"""計算元素Gini系數(shù)"""D = dict(zip(*np.unique(arr, return_counts=True)))arr = [_ for _ in D.values()]n = sum(arr)g = 0for i in arr:g += (i / n) ** 2return 1 - gdef feature(self, data):"""輸入Web日志Datafream數(shù)據(jù),輸出每個IP聚合后的特征向量"""X = np.zeros(len(self.wordindex))for url in list(data['url']):url = self.wspatt.subn(' wsfile ', url)[0].lower()url = self.nbpatt.subn(' nbfile ', url)[0]url = re.subn('\d+', '', url)[0]for kw in re.split('[^a-z]', url):try:X[self.wordindex[kw]] += 1except:passX = [np.log(x + 1) for x in X[X != 0]]nums = len(X)r = np.sum(X)cont = len(data)giniHost = self.GiniArr(list(data['host']))giniUa = self.GiniArr(list(data['ua']))sr200 = self.statusRate(list(data['status']), 200)sr403 = self.statusRate(list(data['status']), 403)sr404 = self.statusRate(list(data['status']), 404)srOts = 1 - sr200 - sr403 - sr404result = np.array([cont, nums, r, giniUa, giniHost, sr200, sr403, sr404, srOts])return result3.3 模型評估
對規(guī)則模型采集的黑樣本及Web日志白樣本進行逐個人為驗證并打標,進而訓練隨機森林模型、和MLP模型分別用召回率、準確率和F1得分進行評估。模型在訓練及表現(xiàn)良好,但測試集中可以看出模型過擬合驗證,結(jié)構(gòu)風險太高。無法滿足生產(chǎn)環(huán)境真實業(yè)務(wù)場景需求。針對不同的模型通過降低樹深度、前后剪植,調(diào)整懲罰系數(shù)等方式降低模型結(jié)構(gòu)風險造成準確率和召回率降低,左右權(quán)衡后效果均未能達到滿意效果。
-
測試1
-
測試2
4. 基于n-gram特征提取的MLP模型
4.1 模型訓練和評估示范
對傳統(tǒng)機器學習來說,特征提取是比較繁瑣的,需要對業(yè)務(wù)場景的深入理解。在掃描器識別任務(wù)中,我們可以將單個用戶連續(xù)發(fā)起的請求序列拼接到一起作為一個短文本,采取NLP中情感分析的思想,分別訓練詞向量和分類器模型對掃描器請求序列進行識別。訓練過程中需要注意參數(shù)n-gram和max_features的調(diào)整,這里分別代表取詞方式和特征維度。我們先取部分數(shù)據(jù)實驗不同的n-gram參數(shù)和max_features參數(shù)進行模型訓練,并對測試集數(shù)據(jù)進行評估效果。在保證模型測試集評分的基礎(chǔ)上,max_features越小資源消耗越小。
# 訓練詞向量 max_features = 3000 seed = 123 countvectorizer = CountVectorizer(ngram_range=(2, 2), decode_error="ignore",min_df=1, analyzer="word",token_pattern='[\w-]+',max_features=max_features) X = countvectorizer.fit_transform(sequence).toarray() y = lables x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=seed)# 訓練模型 mlp = MLPClassifier(solver="adam", alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=seed) mlp.fit(x_train, y_train) joblib.dump(mlp, "model/scan_mlp.pkl", compress=3)# 將模型參數(shù)和偏置保存為np格式 np.save("../model/weights",mlp.coefs_) np.save("../model/bias",mlp.intercepts_)在實際訓練中,從蘇寧應(yīng)用防火墻(SNWAF)日志中抽取了275019條正常訪問序列作為正樣本,同時通過SNWAF輸出的掃描器IP列表提取出361504條掃描器IP的訪問序列作為黑樣本,對模型進行訓練,取得了比規(guī)則模型和統(tǒng)計特征ML模型更好的效果。該方法有更好的成長性,可以隨著高質(zhì)量訓練數(shù)據(jù)的增長進行優(yōu)化迭代,同時缺點是模型結(jié)構(gòu)更加復(fù)雜,資源消耗較大。
4.2 模型工程化部署
由于需要實時對海量訪問日志進行監(jiān)控,我們需要將模型部署到分布式大數(shù)據(jù)計算平臺。在實際的代碼工程化部署過程中,可能會出現(xiàn)訓練模型的環(huán)境與分布式環(huán)境模塊版本不一致或缺少模塊導(dǎo)致的模型加載失敗問題。針對上述問題,我們采取了一些辦法:
通過本地測試我們發(fā)現(xiàn),采取上述方式與加載模型的輸出結(jié)果一直,并且預(yù)測效率更高。
我們通過創(chuàng)建pyspark-streaming任務(wù),實時消費WAF訪問日志對每批次用戶的訪問日志進行向量化轉(zhuǎn)化后輸入預(yù)測模型,從而實現(xiàn)掃描器的實時監(jiān)控,并將檢測到的掃描器IP進行告警或根據(jù)配置實施訪問限制。
5. 總結(jié)
本文對各類web掃描特特征進行了梳理和總結(jié),并展示了利用規(guī)則模型和統(tǒng)計特征ML模型對掃描器的識別效果。
其中規(guī)則模型有天然的優(yōu)勢,所見即所得,可信度高可解釋性強,同時滿足奧朗姆剃刀簡單高效原則,然而只對已知的掃描類型有效,合理的閾值設(shè)計非常重要,需要結(jié)合實際業(yè)務(wù)流量來精準分析;基于統(tǒng)計特征的機器學習識別模型的特征提取相對簡單,只抽取了少量數(shù)據(jù)集進行訓練,表達能力有限,不能夠充分學習到正常請求行為和掃描器行為的區(qū)別,有興趣的同學可以在此基礎(chǔ)上進行更加精細化的特征提取以達到識別率的提升;基于n-gram特征提取的MLP模型具備更好的成長性,可以隨著高質(zhì)量訓練樣本數(shù)據(jù)的增加進行優(yōu)化迭代,同時缺點是相對前兩種方式資源消耗略大。
在實際的生產(chǎn)應(yīng)用中,我們選擇AI模型的落地,需要根據(jù)企業(yè)的數(shù)據(jù)規(guī)模、資源情況和需求標準來選擇適合自己場景的模型和方式,最適合的才是最好的。
總結(jié)
以上是生活随笔為你收集整理的基于应用日志的扫描器检测实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Pyflink》Flink集群安装,P
- 下一篇: IT人喝酒,不同岗位不同姿势