你學習Python的目的是什麼?是想寫爬蟲爬取數據(數據、圖片等內容),還是想自寫自動化的小工具,又或是作為一個新手小白單純的欣賞這門語言呢?

今天i春秋分享的是一篇關於多線程工具的文章,工具使用效率高,代碼也比較完善,非常適合新手學習,閱讀用時約5分鐘。

涉及知識點

多線程模板:threading多線程模塊、Queue隊列模塊、超時處理、異常處理。

IP地址塊轉換:掃描的是一個比較大的網段的IP的Web埠,我們並不能手動一個一個的輸入IP地址,所以需要IP地址塊和IP的轉換。

HTTP網路請求庫:requests模塊。

正則表達式:需要在Request請求之後的Response中獲取我們想要的banner信息。

思路如下:

首先,將輸入的IP段轉換為IP依次放入隊列Queue中,之後開啟多線程,將Queue傳入多線程類,多線程類中的核心函數執行步驟:

1、取出一個IP並拼接URL為x.x.x.x的格式

2、使用requests模塊獲取頁面status信息、title信息、banner信息(伺服器的banner信息,在這裡為Web容器以及其版本信息)

3、title信息需要在頁面源代碼中獲取,並且使用re模塊正則匹配title標籤內的內容。

4、banner信息需要獲取Response中header信息中的server。

之後,加入我們的工具文檔以及自定義的LOGO信息後,一個完整的工具就完成了。

放一下完成之後的效果圖:

核心代碼講解

核心代碼區域也就是取出每個IP之後的工作。

[Python] 純文本查看 複製代碼

while not self._queue.empty():

ip = self._queue.get(timeout=0.5)

url = http:// + ip

try:

r = requests.Session().get(url=url, headers=header, timeout=5)

content = r.text

status = r.status_code

title = re.search(r<title>(.*)</title>, content)

if title:

title = title.group(1).strip().strip(" ").strip(" ")[:30]

else:

title = "None"

banner = Not Found

try:

banner = r.headers[Server][:20]

except:

pass

sys.stdout.write("|%-16s %-6s %-26s %-30s " % (ip, status, banner, title))

except:

pass

status是http頁面的狀態碼,簡單瞭解http協議的童鞋應該都知道吧。

title是請求頁面的標題信息,需要用正則表達式匹配一下。

banner是Response頭信息中的Server欄位。

下面給出一個Request請求的Response包,可以直觀看出,紅框就是我們想要獲取的東西。

輸出使用了sys.write來解決多線程輸出不對稱問題,並且使用格式化輸出使獲取的數據對齊。

添加工具模塊

Logo的製作使用Linux下的工具figlet,幫助文檔使用Python內置模塊argparse。

兩款工具詳解傳送門:

bbs.ichunqiu.com/thread

Logo代碼以及幫助文檔代碼:

輸出演示:

完成。

腳本運行示例:

[AppleScript] 純文本查看 複製代碼

python httpbannerscan.py -t 100 -i 192.168.1.1/24

後續改進

眾所周知的是Web埠可並不僅限於80埠,一些其他的Web埠的安全性可能遠不如80埠做的好。

所以,我們在使用requests模塊進行request請求時,完全可以將一些常見的Web埠放進一個列表裡,首先對埠的開放性進行檢測,之後再抓取Response信息,這是最快速的檢測方法。

常見的Web埠:

[AppleScript] 純文本查看 複製代碼

80-90,8080-8090

以上是今天的全部內容,大家學會了嗎?

推薦閱讀:

相關文章