序言
這篇文章的內(nèi)容包括我對綿羊墻所做的一些優(yōu)化以及具體的方法
多線程
由于整個項目的流程主要包括在抓包與分析包兩個部分,在之前的版本中使用的方法是抓一定數(shù)量的包之后傳回主機進行分析须鼎,在分析結(jié)束后開始下一次的抓包幸逆。這種不成熟的處理方法既是對機器性能的浪費特姐,也會錯過在分析包的過程中流經(jīng)的流量。
因此我使用了多線程的方法艺糜,在每次抓完一組包后豌注,僅完成保存就開始下一次的抓包,同時開啟另一個線程進行對包的分析處理缴允。
由于使用了多線程,因此需要對包進行編號珍德,并將這個號碼傳給分析的函數(shù)练般。
但是這種處理方法仍然是不成熟的。第一個問題是在每一次開始抓包的過程中有一個建立ssh連接并開始抓包的時間(大約1~2s)锈候,這會造成性能浪費和錯失一部分的包薄料。這個問題可以通過調(diào)整每次抓包的大小進行優(yōu)化,如果一次抓包的時期夠長泵琳,就可以忽略這些時間都办,但周期過長會導(dǎo)致刷新頻率不足,影響項目的用戶體驗虑稼。第二個問題是絕大多數(shù)路由器傳回主機的包都是無用的數(shù)據(jù)。這里我想到了兩種辦法势木,一種是通過一些過濾策略來減少包的總數(shù)蛛倦,比如就目前的檢測策略,我們只需要帶有Http POST請求的包就可以了啦桌。另一種辦法是將整個抓包分析的過程移植到路由器上溯壶,在本機上只進行展示。就在不久前我看到了通過scapy進行類似實現(xiàn)的辦法甫男,在之后會進行嘗試且改。
下面是優(yōu)化后的主邏輯的代碼。
代碼清單一:
import os
from MyPassword import password
from analyzer import analyze
import _thread
import pexpect
import sys
iterator = 1
while 1:
shellCmd = 'ssh root@10.0.0.1 "tcpdump -c 50 -w - -s 0 port not 22" > data' + str(iterator) + '.cap'
child = pexpect.spawn('/bin/bash',['-c',shellCmd])
sshNewkey = 'Are you sure you want to continue connecting'
i = child.expect([pexpect.TIMEOUT, sshNewkey, 'password: '])
if i == 0:
print("ERROR:")
print('SSH could not login. Here is what SSH said:')
print(child.before, child.after)
sys.exit()
if i == 1 :
child.sendline('yes')
child.expect('password:')
child.sendline(password)
print("dumping in Wi-Fi,please wait")
child.expect(pexpect.EOF)
print("get data package" + str(iterator))
_thread.start_new_thread( analyze, (str(iterator),))
iterator += 1
之前每次上傳github的時候我都要將password手動引入板驳,在這次我把密碼保存在一個單獨的文件中直接引入又跛,雖然是一個很通用的做法但是由我自己想到還是很開心的。
pexpect模塊
pexpect是對expect的一個封裝若治。之前我使用的是sshpass進行慨蓝,在命令行中直接加入密碼以跳過交互式的密碼認證,但這種方式十分不安全端幼,所以我使用pexpect模塊進行交互式的密碼輸入礼烈。
在上述的代碼中,我直接使用了pexpect提供的連接ssh的范例程序婆跑。在連接ssh的過程中會碰到三種情況此熬,對超時,請求確認和請求密碼三種情況進行合適的分別處理,這種代碼風格很值得我學習犀忱。
這里要注意的是直接使用pexpect進行命令行處理的話會忽略管道等一些命令行的特性募谎,這點在優(yōu)化的過程中對我造成了很大的困擾,直到我在IBM的網(wǎng)站中看到涉及這方面的說明峡碉,在修改了代碼后就可以按預(yù)期運行了近哟。
Pexpect
接下來我想做什么
如果有這系列的下一篇文章的話,他可能會有關(guān):
- 在路由器上直接完成密碼帳號提取
- 除了直接提取明文之外更多的攻擊方式