AI安全初探——利用深度學(xué)習(xí)檢測(cè)DNS隱蔽通道
AI安全初探——利用深度學(xué)習(xí)檢測(cè)DNS隱蔽通道
目錄
AI安全初探——利用深度學(xué)習(xí)檢測(cè)DNS隱蔽通道
1、DNS 隱蔽通道簡(jiǎn)介
2、 算法前的準(zhǔn)備工作——數(shù)據(jù)采集
3、 利用深度學(xué)習(xí)進(jìn)行DNS隱蔽通道檢測(cè)
4、 驗(yàn)證XShell的檢測(cè)效果
5、 結(jié)語(yǔ)
1、DNS 隱蔽通道簡(jiǎn)介
DNS 通道是隱蔽通道的一種,通過(guò)將其他協(xié)議封裝在DNS協(xié)議中進(jìn)行數(shù)據(jù)傳輸。由于大部分防火墻和入侵檢測(cè)設(shè)備很少會(huì)過(guò)濾DNS流量,這就給DNS作為隱蔽通道提供了條件,從而可以利用它實(shí)現(xiàn)諸如遠(yuǎn)程控制、文件傳輸?shù)炔僮鳎珼NS隱蔽通道也經(jīng)常在僵尸網(wǎng)絡(luò)和APT攻擊中扮演著重要的角色。
DNS隱蔽通道可以分為直連和中繼兩種模式。直連也就是Client直接和指定的目標(biāo)DNS Server(授權(quán)的NS 服務(wù)器)連接,通過(guò)將數(shù)據(jù)編碼封裝在DNS協(xié)議中進(jìn)行通信,這種方式速度快,但是限制比較多,很多場(chǎng)景不允許用戶指定DNS Server。而中繼模式的DNS通道則更為隱蔽,但同時(shí)也因?yàn)閿?shù)據(jù)包到達(dá)目標(biāo)DNS Server前需要經(jīng)過(guò)多個(gè)DNS查詢服務(wù)器,所以速度上較直連模式慢很多。中繼模式的DNS通道原理如圖1所示。
圖1 中繼模式下的DNS隱蔽通道原理
例如,前段時(shí)間著名的XShell DNS通道攻擊,黑客在Xshell中植入惡意代碼,通過(guò)DNS隱蔽通道外發(fā)用戶敏感數(shù)據(jù)的示例如圖2 所示,黑客將外發(fā)數(shù)據(jù)藏在nylalobghyhirgh.com子域名中。
圖2 Xshell DNS隱蔽通道,黑客將外發(fā)數(shù)據(jù)藏在nylalobghyhirgh.com子域名中
DNS 隱蔽通道從提出到現(xiàn)在已經(jīng)有了很多實(shí)現(xiàn)工具,歷史比較早的有NSTX、Ozymandns,目前比較活躍的有iodine、dnscat2、dns2tcp,其他不太常見(jiàn)的還有DeNise、Heyoka等。不同工具的核心原理相似,但在編碼、實(shí)現(xiàn)細(xì)節(jié)和應(yīng)用場(chǎng)景方面存在一定的差異。
本文使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來(lái)檢測(cè)DNS隱蔽通道。第一步工作是樣本數(shù)據(jù)采集。
2、算法前的準(zhǔn)備工作——數(shù)據(jù)采集
利用上述DNS隱蔽通道工具進(jìn)行“黑”樣本采集工作見(jiàn)另一篇博文《DNS隱蔽通道檢測(cè)——數(shù)據(jù)收集,利用iodine進(jìn)行DNS隱蔽通道樣本收集》,其流程是先抓取DNS隱蔽通道工具攻擊過(guò)程中的網(wǎng)絡(luò)流量pcap包,然后利用wireshark工具將pcap包轉(zhuǎn)換為機(jī)器學(xué)習(xí)算法能夠識(shí)別文本文件。這是一個(gè)體力活,我收集到的業(yè)界流行的DNS 隱蔽通道工具的數(shù)據(jù)樣本如圖3所示。
圖3 收集的DNS隱蔽通道工具示意樣本
以dnscat2工具為例,其生成的一個(gè)樣本見(jiàn)圖4,可以看到DNS報(bào)文里包含了大量的較長(zhǎng)子域名,而外發(fā)數(shù)據(jù)便藏在這些子域名中(我使用的主域名是friendsakka.xyz)。
圖4 dnscat2工具生成的示意樣本
至于“白”樣本收集,我們使用的是某高校的校園網(wǎng)絡(luò)流量。黑白樣本收集好以后,就可以進(jìn)入檢測(cè)算法環(huán)節(jié)了。
3、利用深度學(xué)習(xí)進(jìn)行DNS隱蔽通道檢測(cè)
本文使用CNN(卷積神經(jīng)網(wǎng)絡(luò))來(lái)檢測(cè)DNS隱蔽通道,在介紹算法前,先簡(jiǎn)單介紹下CNN。
CNN(卷積神經(jīng)網(wǎng)絡(luò))常用于圖像識(shí)別并取得了極佳的效果。圖5展示的是一個(gè)典型的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。該網(wǎng)絡(luò)包含兩個(gè)卷積層(convolution layer),兩個(gè)池化層(pooling layer)和一個(gè)全連接層(fully connected layer)。
圖5 典型的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)的基本思想和我們?nèi)祟惔竽X識(shí)別圖像的機(jī)制是一致的。例如,當(dāng)看到一張“喵星人”圖像時(shí),我們之所以認(rèn)為它是“喵星人”,是因?yàn)槲覀兛吹剿忻让鹊念^、長(zhǎng)長(zhǎng)的尾巴、柔軟光滑的皮毛等明顯特征,通過(guò)組合(更高層次的抽象)這些特征,我們的大腦最終便可做出準(zhǔn)確的判斷。卷積神經(jīng)網(wǎng)絡(luò)的基本思想也是類似,核心理念包括:
·?局部感受野:這是通過(guò)卷積層來(lái)完成的,形象地說(shuō),就是模仿你的眼睛,想想看,你在看東西的時(shí)候,目光是聚焦在一個(gè)相對(duì)較小的局部吧?比如喵星人的圖像上有爪子或者萌頭等明顯的局部特征。而在卷積神經(jīng)網(wǎng)絡(luò)中,每個(gè)隱層節(jié)點(diǎn)只連接到圖像的某些局部像素點(diǎn)上。
·?池化:形象地說(shuō),當(dāng)你看向遠(yuǎn)方,然后閉上眼睛,你仍然記得看到了些什么,但是你能完全記住你剛剛看到的每一個(gè)細(xì)節(jié)嗎?答案是不能。同樣,在卷積神經(jīng)網(wǎng)絡(luò)中,沒(méi)有必要對(duì)原圖像所有細(xì)節(jié)做處理,而是使用某種“壓縮”方法,這就是池化,也就是每次將原圖像卷積后,都通過(guò)一個(gè)采樣的過(guò)程,來(lái)減小圖像的規(guī)模。
·?權(quán)值共享:在卷積神經(jīng)網(wǎng)中,同一個(gè)卷積核內(nèi),所有的神經(jīng)元的權(quán)值是相同的,從而大大減少需要訓(xùn)練的參數(shù)。之所以如此設(shè)計(jì),就如同人類大腦的某個(gè)神經(jīng)中樞中的神經(jīng)細(xì)胞,它們的結(jié)構(gòu)、功能是相同的,甚至可以互相替代。
如果你還沒(méi)有理解的話,我們?cè)倏聪旅孢@個(gè)例子,專家們?cè)O(shè)計(jì)了包含10個(gè)卷積層,4個(gè)池化層和2個(gè)全連接層的卷積神經(jīng)網(wǎng)絡(luò),見(jiàn)圖6所示,該網(wǎng)絡(luò)主要用于圖像識(shí)別。專家們發(fā)現(xiàn),在比較低的層,神經(jīng)元傾向于學(xué)習(xí)一些簡(jiǎn)單的模式,比如圖像邊緣、顏色、條帶燈;而在比較高的層,神經(jīng)元能夠檢測(cè)到一些更為高層次的抽象特征,比如整輛轎車等。
圖6?專家構(gòu)建的用于圖像識(shí)別的卷積神經(jīng)網(wǎng)絡(luò)
CNN的誕生是為了解決圖像處理問(wèn)題。在安全界,瀚思科技開(kāi)發(fā)出了基于深度學(xué)習(xí)的二進(jìn)制病毒樣本檢測(cè)技術(shù),可以做到沙箱同等水平的 99% 的檢測(cè)準(zhǔn)確率,而誤報(bào)率低于 1/1000。
CNN檢測(cè)的圖像通常是二維數(shù)據(jù),而作為DNS隱蔽通道傳輸?shù)淖佑蛎m是一維的文本數(shù)據(jù),但同樣可以用CNN進(jìn)行處理。在本文的DNS隱蔽通道檢測(cè)中,我們使用一維的卷積函數(shù)處理DNS子域名片段,以提煉高級(jí)特征進(jìn)一步分析。
利用CNN進(jìn)行DNS隱蔽通道檢測(cè)的代碼框架如下:
def?run(): ????X,?Y,?max_len,?volcab_size?=?get_data() ????trainX,?testX,?trainY,?testY?=?train_test_split(X,?Y,?test_size=0.2,?random_state=42) ????model?=?get_cnn_model(max_len,?volcab_size) ????model.fit(trainX,?trainY,?validation_set=(testX,?testY),?show_metric=True,?batch_size=32)
大致流程是先獲取黑白樣本數(shù)據(jù),然后將80%的數(shù)據(jù)用于訓(xùn)練,剩下20%的數(shù)據(jù)用于CNN模型驗(yàn)證。
其中,get_cnn_model使用了python的TensorFlow庫(kù)tflearn,其代碼如下:
def?get_cnn_model(max_len,?volcab_size): ????#?構(gòu)建CNN模型 ????network?=?tflearn.input_data(shape=[None,?max_len],?name='input') ????#?為了進(jìn)行數(shù)據(jù)降維加入了embedding層 ????network?=?tflearn.embedding(network,?input_dim=volcab_size,?output_dim=64) ????#?卷積層使用了一維的卷積函數(shù) ????branch1?=?conv_1d(network,?128,?3,?padding='valid',?activation='relu',?regularizer="L2") ????branch2?=?conv_1d(network,?128,?4,?padding='valid',?activation='relu',?regularizer="L2") ????branch3?=?conv_1d(network,?128,?5,?padding='valid',?activation='relu',?regularizer="L2") ????network?=?merge([branch1,?branch2,?branch3],?mode='concat',?axis=1) ????network?=?tf.expand_dims(network,?2) ????#?最大池化操作?? ????network?=?global_max_pool(network) ????#?加入dropout防止過(guò)擬合?? ????network?=?dropout(network,?0.5) ????#?全連接 ????network?=?fully_connected(network,?2,?activation='softmax') ????#?回歸操作?? ????network?=?regression(network,?optimizer='adam',?learning_rate=0.001, ?????????????????????????loss='categorical_crossentropy',?name='target') ????#?構(gòu)建深度神經(jīng)網(wǎng)絡(luò)模型?? ????model?=?tflearn.DNN(network,?tensorboard_verbose=0) ????return?model
在上述模型中,為了進(jìn)行數(shù)據(jù)降維先加入了embedding層,其本質(zhì)和word2vec一樣,因?yàn)樵贒NS 隱蔽通道的子域名中包含了大量的字符而導(dǎo)致數(shù)據(jù)輸入維度過(guò)高,代碼中output_dim=64表示將數(shù)據(jù)輸入降低維度到64維。接下來(lái)我們使用一維的卷積函數(shù)conv_1d處理DNS子域名片段,提煉高級(jí)特征進(jìn)一步分析。由于典型的一維卷積函數(shù)處理文字片段的大小通常為3、4、5,我們也使用這些典型參數(shù)。此外,模型中加入了dropout,用于防止過(guò)擬合。
獲取黑白樣本數(shù)據(jù)的代碼如下,其中包括對(duì)原始的子域名字符進(jìn)行字典編碼(先得到黑白樣本所有子域名字符集合),并使用pad_sequences函數(shù)按照固定長(zhǎng)度進(jìn)行子域名長(zhǎng)度對(duì)齊操作(因CNN要求各樣本數(shù)據(jù)輸入維度一致,而某些子域名很短,某些子域名很長(zhǎng),pad_sequences將短的子域名采用特殊數(shù)字進(jìn)行填充補(bǔ)齊,使它們長(zhǎng)度一致):
def?get_data(): ????black_x,?white_x?=?get_local_data() ????black_y,?white_y?=?[LABEL.black]*len(black_x),?[LABEL.white]*len(white_x) ? ????X?=?black_x?+?white_x ????labels?=?black_y?+?white_y ? ????#?Generate?a?dictionary?of?valid?characters ????valid_chars?=?{x:idx+1?for?idx,?x?in?enumerate(set(''.join(X)))} ? ????max_features?=?len(valid_chars)?+?1 ????maxlen?=?np.max([len(x)?for?x?in?X]) ? ????#?Convert?characters?to?int?and?pad ????X?=?[[valid_chars[y]?for?y?in?x]?for?x?in?X] ????X?=?pad_sequences(X,?maxlen=maxlen,?value=0.) ? ????#?Convert?labels?to?0-1 ????Y?=?to_categorical(labels,?nb_classes=2) ????return?X,?Y,?maxlen,?max_features
其中,get_local_data主要是從樣本文件中提取DNS子域名。
def?get_local_data(tag="labeled"): ????data_path?=?"latest_metadata_sample" ????black_data,?white_data?=?[],?[]?? ????for?dir_name?in?("black",?"white_like"): ????????dir_path?=?"%s/%s_%s"?%?(data_path,?tag,?dir_name) ????????for?path?in?iterbrowse(dir_path): ????????????with?open(path)?as?f: ????????????????for?line?in?f: ????????????????????_,?subdomain?=?extract_subdomain(line) ????????????????????if?subdomain?is?not?None: ????????????????????????if?"white_like"?in?path: ???????????????????????????white_data.append(subdomain) ????????????????????????elif?"black"?in?path: ????????????????????????????black_data.append(subdomain) ????return?black_data,?white_data
核心代碼講解完畢,開(kāi)始進(jìn)行模型訓(xùn)練。在我的個(gè)人電腦上,算法運(yùn)行時(shí)間大概17小時(shí),最后的結(jié)果如下:
Run?id:?6U1KPD Log?directory:?/tmp/tflearn_logs/ -- Training?Step:?5131??|?total?loss:?0.03967?|?time:?6406.696s |?Adam?|?epoch:?001?|?loss:?0.03967?-?acc:?0.9888?|?val_loss:?0.02546?-?val_acc:?0.9926?--?iter:?164165/164165 -- Training?Step:?10262??|?total?loss:?0.03562?|?time:?6422.500s5776/164165 |?Adam?|?epoch:?002?|?loss:?0.03562?-?acc:?0.9917?|?val_loss:?0.01793?-?val_acc:?0.9948?--?iter:?164165/164165 -- Training?Step:?15393??|?total?loss:?0.03433?|?time:?6357.422s |?Adam?|?epoch:?003?|?loss:?0.03433?-?acc:?0.9888?|?val_loss:?0.01432?-?val_acc:?0.9962?--?iter:?164165/164165 -- Training?Step:?20524??|?total?loss:?0.02852?|?time:?6312.083s |?Adam?|?epoch:?004?|?loss:?0.02852?-?acc:?0.9892?|?val_loss:?0.01186?-?val_acc:?0.9972?--?iter:?164165/164165 -- Training?Step:?25655??|?total?loss:?0.02441?|?time:?6292.232s |?Adam?|?epoch:?005?|?loss:?0.02441?-?acc:?0.9947?|?val_loss:?0.01398?-?val_acc:?0.9960?--?iter:?164165/164165 -- Training?Step:?30786??|?total?loss:?0.01890?|?time:?6286.252s |?Adam?|?epoch:?006?|?loss:?0.01890?-?acc:?0.9930?|?val_loss:?0.01373?-?val_acc:?0.9963?--?iter:?164165/164165 -- Training?Step:?35917??|?total?loss:?0.00921?|?time:?6261.734s |?Adam?|?epoch:?007?|?loss:?0.00921?-?acc:?0.9984?|?val_loss:?0.01290?-?val_acc:?0.9966?--?iter:?164165/164165 -- Training?Step:?41048??|?total?loss:?0.00780?|?time:?6266.017s |?Adam?|?epoch:?008?|?loss:?0.00780?-?acc:?0.9994?|?val_loss:?0.01177?-?val_acc:?0.9970?--?iter:?164165/164165 -- Training?Step:?46179??|?total?loss:?0.01850?|?time:?6257.918s |?Adam?|?epoch:?009?|?loss:?0.01850?-?acc:?0.9951?|?val_loss:?0.01109?-?val_acc:?0.9971?--?iter:?164165/164165 -- Training?Step:?51310??|?total?loss:?0.02062?|?time:?6258.476s |?Adam?|?epoch:?010?|?loss:?0.02062?-?acc:?0.9953?|?val_loss:?0.00966?-?val_acc:?0.9974?--?iter:?164165/164165
可以看到算法迭代了10次,每次訓(xùn)練時(shí)間一個(gè)多小時(shí),最終的檢測(cè)精度在99.53%,使用CNN進(jìn)行DNS隱蔽通道的檢測(cè)效果初步看來(lái)還不錯(cuò)。但是,因?yàn)橛?xùn)練樣本和測(cè)試樣本的內(nèi)在數(shù)據(jù)分布規(guī)律是相同的,該精度再高也可能存在一定的過(guò)擬合風(fēng)險(xiǎn)。下面我們利用前段時(shí)間著名的XShell DNS隱蔽通道攻擊來(lái)評(píng)估算法的檢測(cè)能力。
4、驗(yàn)證XShell的檢測(cè)效果
我們嘗試用訓(xùn)練出的算法檢測(cè)前段時(shí)間著名的XShell隱蔽通道攻擊,其進(jìn)行攻擊的域名為nylalobghyhirgh.com,將包含該攻擊的DNS樣本加入到模型預(yù)測(cè)中:
def?predict(): ????testX,?testY?=?get_xshell_data() ????model?=?get_cnn_model() ????....?? ????predictions?=?model.predict(testX)???? ????cnt?=?0 ????for?i,p?in?enumerate(predictions): ????????if?abs(p[2]-testY[i][2])?0.1: ????????????cnt?+=?1 ????print?cnt/(len(predictions)+.0)
代碼運(yùn)行后得到的檢測(cè)準(zhǔn)確率為97.3%,也就意味著nylalobghyhirgh.com下97.3%的子域名都可能是在利用DNS隱蔽通道傳輸數(shù)據(jù)。
上述驗(yàn)證表明,使用CNN可以有效地檢測(cè)DNS隱蔽通道。當(dāng)然,最終的檢測(cè)準(zhǔn)確率還需在真實(shí)而復(fù)雜的網(wǎng)絡(luò)環(huán)境中長(zhǎng)期運(yùn)行觀察而定。
5、結(jié)語(yǔ)
本文只是AI安全初探的一次嘗試,大致說(shuō)明了使用深度學(xué)習(xí)算法CNN進(jìn)行安全檢測(cè)的基本流程,文中有寫(xiě)得不明白的地方,歡迎大家留言一起探討。
參考資料:
1、http://blog.csdn.net/baobei0112/article/details/54906309
2、https://yq.aliyun.com/articles/68901
3、http://www.freebuf.com/articles/network/153345.html
通用安全 AI
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。