隨著物聯網設備越來越普及,大部分物聯網設備接入公網但卻缺乏有效管理,因此希望能夠快速獲取物公網上聯網設備的相關信息,但是在實驗環境下,幾臺計算機使用傳統的鏈接方式去掃描設備效率太低,為了能夠達到這個目的,本文介紹了一個多線程telnet快速掃描器,可以快速地實現telnet物聯網設備的密碼掃描,并將掃描結果存入庫中。
總體架構
1.數據輸出/syn泛洪發包,可配置掃描信息
2.信息收集及處理/數據嗅探及過濾
3.多線程scanner/多線程通信
4.命令交互狀態機/狀態機實現,交互過程
5.數據輸出/數據入庫
數據探測
Xml文件配置
程序使用xml格式配置讀取待掃描的ip地址段信息
寫成xml的主要一開始是因為要掃描一個固定地域的ip地址段,正好使用python可以很方便的解析網頁上的內容,所以就將網絡上的ip段信息處理成xml格式,方便以后讀取。
過程中使用的是xrange生成器,主要是怕生成的ip地址過大,占用過多內存。
syn泛洪
為了加快掃描速度,避免等待無用鏈接,使用scapy從第三層開始構造syn端口探測包并從特定的端口(例如:2222)大量發送出去,采用先回應先處理的原則,極大的縮短了掃描時間。
使用scapy可以很方便的構造數據包,如上圖,大量的構造syn數據包。使用scapy的時候注意需要root權限,同時需要注意當前工作目錄下的文件名,有可能因為文件名的原因導致scapy無法正常工作。
信息收集
Sniffer
調用scapy中的sniff函數監聽數據包,使用bpf過濾規則,過濾特定端口(port:2222),ack響應的數據包,并將數據包的來源ip存入一個FIFO隊列(隊列默認大小為:100),這是為了避免當收到服務器端的重傳ack包,導致處理該ip多次造成效率上的浪費
Queue才是真正的產出隊列,而ip_prompt_queue只是為了避免重復探測同一個的一個先進先出隊列,如果ip在FIFO隊列當中,則代表該ip已經被探測過了直接略過。
由于sniffer線程是阻塞監聽不會退出的所以在一開始將這個線程設置為daemon線程,當沒有其他線程時,程序退出,而不會阻塞在sniffer。
多線程
采用消費-生產的多線程工作模式,使用spewr線程向外泛洪syn數據包,使用sniffer線程監聽并分析數據包,使用多個scanner<線程來并行處理掃描到的ip地址。
使用一個線程標志位exitFlag來通知線程退出,spewer線程結束發包之后會將exitFlag置1,這時主線程將會循環檢測接收數據包的最后時間,如果在30秒內沒有監聽到數據包,則判斷探測過程已經完成沒有后續的產出了同時將exitFlag置2,scanner線程將會檢查queue當中是否有數據,如果沒有數據且exitFlag等于2或3,則表示沒有破解目標線程開始退出,同時將exitFlag置3,通知主線程開始退出。
命令交互狀態機
為了避免邏輯的單一造成的漏掃之類的實例發生,放棄了使用單一的if-else 或者while-which的邏輯結構,進而采用有限狀態機的編程方法,實現對telnet協議更好的交互,交互過程中scanner將會從一個優先級隊列當中取出硬編碼的用戶名-密碼對,來對設備進行暴力破解
持有狀態機的父類
使用pexpect開始數據交互
數據輸出
使用MySQL數據庫,將成功探測得到的結果存入數據庫,存入數據庫之前還將添加ip歸屬地等信息
使用mysql.sql腳本,創建數據庫及數據表,注意由于使用了歸屬地等中文信息,因此建庫和建表的時候要設置好響應的字符集才不會導致亂碼。設置ip的UNIQUE鍵,避免重復表項。
使用方法
1.操作環境linux
2.使用apt-get或者yum安裝mysql數據庫
3.下載pip安裝程序(https://pypi.python.org/pypi/pip),按照說明安裝
4.使用pip命令安裝pexpect,MySQL-python,17monip,scapy等(如:pip install pexpect)
5.進入mysql數據庫,source */mysql.sql 執行腳本創建數據庫和數據表
6.使用 python scanner.py 10 運行程序
項目代碼:https://github.com/scu-igroup/telnet-scanner
下圖是掃描的結果圖:
* 原創作者:scu-igroup,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載