你學習Python的目的是什麼?是想寫爬蟲爬取數據(數據、圖片等內容),還是想自寫自動化的小工具,又或是作為一個新手小白單純的欣賞這門語言呢?
今天i春秋分享的是一篇關於多線程工具的文章,工具使用效率高,代碼也比較完善,非常適合新手學習,閱讀用時約5分鐘。
涉及知識點
多線程模板:threading多線程模塊、Queue隊列模塊、超時處理、異常處理。
IP地址塊轉換:掃描的是一個比較大的網段的IP的Web埠,我們並不能手動一個一個的輸入IP地址,所以需要IP地址塊和IP的轉換。
HTTP網路請求庫:requests模塊。
正則表達式:需要在Request請求之後的Response中獲取我們想要的banner信息。
思路如下:
首先,將輸入的IP段轉換為IP依次放入隊列Queue中,之後開啟多線程,將Queue傳入多線程類,多線程類中的核心函數執行步驟:
1、取出一個IP並拼接URL為http://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
banner = r.headers[Server][:20]
except:
pass
sys.stdout.write("|%-16s %-6s %-26s %-30s " % (ip, status, banner, title))
status是http頁面的狀態碼,簡單瞭解http協議的童鞋應該都知道吧。
title是請求頁面的標題信息,需要用正則表達式匹配一下。
banner是Response頭信息中的Server欄位。
下面給出一個Request請求的Response包,可以直觀看出,紅框就是我們想要獲取的東西。
輸出使用了sys.write來解決多線程輸出不對稱問題,並且使用格式化輸出使獲取的數據對齊。
添加工具模塊
Logo的製作使用Linux下的工具figlet,幫助文檔使用Python內置模塊argparse。
兩款工具詳解傳送門:
https://bbs.ichunqiu.com/thread-31231-1-1.html
Logo代碼以及幫助文檔代碼:
輸出演示:
完成。
腳本運行示例:
[AppleScript] 純文本查看 複製代碼
python httpbannerscan.py -t 100 -i 192.168.1.1/24
後續改進
眾所周知的是Web埠可並不僅限於80埠,一些其他的Web埠的安全性可能遠不如80埠做的好。
所以,我們在使用requests模塊進行request請求時,完全可以將一些常見的Web埠放進一個列表裡,首先對埠的開放性進行檢測,之後再抓取Response信息,這是最快速的檢測方法。
常見的Web埠:
80-90,8080-8090
以上是今天的全部內容,大家學會了嗎?
推薦閱讀: