服務掃描獲取 banner 信息的方法有哪些

0x00:簡介

banner 信息來表示歡迎語,其中會包含一些敏感信息,所以獲取 banner 也屬於信息蒐集的範疇。在滲透測試中,典型的 4xx、5xx 信息泄露就屬於 banner 泄露的一種。在 banner 信息中,可以獲取到軟件開發商、軟件名稱、服務類型、版本號等。而版本號有時候就會存在公開的 CVE 問題,可以直接進行利用。

banner 信息獲取的基礎是在和目標建立鏈接後的,只有建立的鏈接,纔可以獲取到相應的 banner 信息,當目標對 banner 信息進行隱藏或者配置了禁止讀取時,這時的 banner 則獲取不到。

0x01:nc

nc 在建立鏈接後會返回相應端口的 banner,命令格式爲 nc -nv 1.1.1.1 xx,ip 直接跟端口即可,示例如下:

請輸入圖片描述

上圖中,21,22,23,25 端口都是開放的,並返回了 banner 信息,包括使用的服務和版本號。24 端口是沒有開放的,直接返回了拒絕鏈接。

0x02:scapy

除了 nc 外,python 中的 socket 模塊也可以用來獲取 banner 信息,之前在主機發現、端口掃描時經常用到 scapy,而在這裏 scapy 不合適。scapy 可以理解爲是用來構造數據包、發送數據包、修改數據包以及接收數據包的。而 socket 可以理解爲是用來建立鏈接發送數據和接收數據的,用於網絡服務,網絡編程。進入 python 環境,簡單的利用 socket 進行鏈接目標並返回 banner 信息的示例如下:

請輸入圖片描述

以上過程可寫爲 python 腳本,腳本示例如下:

#!/usr/bin/python
import socket
import select
import sys

if len(sys.argv)!=4:
    print"error:./banner.py 1.1.1.1 1 100"
    sys.exit()

ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])

for port in range(start,end):
    try:
        banner = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        banner.connect((ip,port))
        ready = select.select([banner],[],[],1)
        if ready[0]:
            print"TCP port "+str(port)+"-"+banner.recv(1024)
            banner.close()
    except:
        pass

先說一下上面腳本的總體流程,首先是需要四個參數,一個是 ip 地址,一個是起始端口號,一個是結束端口號,在 sys 系統模塊的 argv 參數這裏,作用是從外部獲取輸入的內容作爲參數,文件名也屬於參數,所以是四個。然後分別分別分配給變量 ip、start、end,循環端口號給到 socket,最後獲取 banner 信息。

再說一下細節,首先是 socket.socket 的參數,第一個參數是輸入地址類型,第二個是輸入套接字類型。socket.AF_INET 是用於服務之間的網絡通信。socket.SOCK_STREAM 是用於 TCP,這兩個參數的選擇項如下:

第一個地址類型:
socket.AF_UNIX:用於 Unix 系統進程間的通信。
socket.AF_INET:服務器之間的網絡通信。
socket.AF_INET6:使用 IPv6 進行通信。

第二個套接字類型:
socket.SOCK_STREAM:流式的 socket,用於 TCP。
socket.SOCK_DGRAM:數據包式的 socket,用於 UDP。

而經常組合用到的有兩種,一種是 TCP 的 socket,一種是 UDP 的 socket,他們分別如下:

TCP:socket.socket(socket.AF_INET,socket.SOCK_STREAM)
UDP:socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

腳本中的 connect 用來鏈接目標。select 作用在於獲取鏈接狀態,經常和 socket 一起使用,四個參數分別是鏈接狀態,寫入狀態,錯誤狀態和超時時間,腳本中只指定了第一個參數鏈接狀態,寫入和錯誤留的空,最後超時爲 1 秒,即每過 1 秒 select 就會獲取一下 banner 的鏈接狀態。

腳本中 select 的作用在於,recv 獲取字符的時候如果沒有返回就會掛起,這樣會影響後續的其他端口 banner 信息獲取,所以用 select 指定鏈接狀態和超時時間。連接後會返回 banner 信息,用 recv 讀取然後打印,如果沒有內容返回則不做任何處理。執行結果如下:

請輸入圖片描述

結果顯示獲取到了 21 和 22 的 banner 信息,看下 wireshark 的抓包過程:

請輸入圖片描述

通過 wireshark 抓包可以發現,如果端口是沒開放的,則是返回的 RST/ACK 包,則沒有 banner 信息,如果端口是開放狀態,則進行了整個 tcp 的三次握手。

0x03:dmitry

除了 nc 和 scapy 外,dmitry 也有此功能,dmitry 也屬於端口發現中全鏈接掃描方式的一種,使用簡單,參數如下:

請輸入圖片描述

參數不多,很簡單的一個工具,p 參數用來做 tcp 掃描,b 參數用來獲取 banner 信息,dmitry 默認掃描 150 個端口,執行如下:

請輸入圖片描述

獲取 banner 信息如下:

請輸入圖片描述

0x04:nmap

強大的 nmap 肯定也有獲取 banner 的方法,只不過是通過腳本實現的,因爲 banner 獲取是建立在連接的基礎上的,所以需要用到 sT 參數,sT 用來連接目標,其命令和結果如下:

請輸入圖片描述

這裏就體現出了 nmap 的強大,業界把 nmap 稱爲神器,電影也有 nmap 的身影,是有理由的。單從 banner 這塊就獲取到了其他命令沒有獲取到的一些結果,例如 23,25,53,80 這些,其 nmap 使用的 banner 腳本寫的也很好,感興趣可以看一下。

0x05:amap

還有一個工具是 amap,這個命令是用來發現端口後面跑的是什麼服務,其中 B 參數是專門用來獲取 banner 信息的,參數說明如下:

請輸入圖片描述

執行結果如下:

請輸入圖片描述

0x06:總結

這邊博客記錄了在服務掃描時獲取 banner 的一些方法,其中有 nc、scapy、nmap、dmitry、amap,通過上面介紹,可以發現 nmap 相對來說是更全面的。

公衆號回覆數字“8”領取CIS加固全套手冊。

微 信:fageweiketang,朋友圈不定期乾貨分享,歡迎討論。

公衆號:發哥微課堂,專注於代碼審計、WEB滲透、網絡安全。

                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章