随着物聯網裝置越來越普及,大部分物聯網裝置接入公網但卻缺乏有效管理,是以希望能夠快速擷取物公網上聯網裝置的相關資訊,但是在實驗環境下,幾台計算機使用傳統的連結方式去掃描裝置效率太低,為了能夠達到這個目的,本文介紹了一個多線程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
本文轉自d1net(轉載)