Python程序設計-安全滲透測試-情報收集

信息收集基礎

這裏的“情報”指的是目標網絡、服務器、應用程序的所有信息。
滲透測試人員需要使用資源儘可能地獲取要測試目標的相關信息。

  • 信息收集獲得信息的方法可以分成兩種:
    • 被動掃描主要指的是在目標 無法察覺的情況下 進行的信息收集,例如,如果想了解一個遠在天邊的人,你會怎麼做呢?顯然可以選擇在搜索引擎中去搜索這個名字。其實這就是一次對目標的被動掃描。
    • 主動掃描一般都是針對目標發送特製的數據包,然後根據目標的反應來獲得一些信息。
    • 掃描之後將會獲得的信息包括:目標網絡的結構,目標網絡所使用設備的類型,目標主機上運行的操作系統,目標主機上所開放的端口,目標主機上所提供的服務,目標主機上所運行的應用程序。
  • 選擇掃描目標的nmap語法如下所示。
    1. 掃描指定IP主機:nmap 192.168.169.133
    2. 掃描指定域名主機:nmap www.nmap.com
    3. 掃描指定範圍主機:nmap 192.168.169.1-20
    4. 掃描一個子網主機:nmap 192.168.169.0/24
  • 對目標端口掃描的nmap語句
    1. 掃描一個主機的特定端口:nmap -p 22 192.168. 169.1
    2. 掃描指定範圍端口:nmap -p 1-80 192.168. 169.1
    3. 掃描100個最爲常用的端口:nmap -F 192.168. 169.1
  • 對目標端口狀態掃描的nmap語句
    1. 使用TCP全開掃描:nmap -sT 192.168. 169.1
    2. 使用TCP半開掃描:nmap -sS 192.168. 169.1
    3. 使用UDP掃描:nmap -sU -p 123,161,162 192.168. 169.1
  • 對目標的操作系統和運行服務進行掃描的nmap語法如下所示。
    1. 掃描目標主機上運行的操作系統:nmap -O 192.168.169.1
    2. 掃描目標主機上運行的服務類型:nmap -sV 192.168.169.1

主機狀態掃描

基於ARP的活躍主機發現技術

  • ARP的中文名字是“地址解析協議”,主要用在以太網中。
  • 需要明確的是,所有的主機在互聯網中通信的時候使用的是IP地址,而在以太網中通信時使用的卻是硬件地址(也就是常說的MAC地址)
  • 現在來編寫一個利用ARP實現的活躍主機掃描程序,這個程序有很多種方式可以實現,首先借助Scapy庫來完成。其核心思想就是要產生一個ARP請求,首先查看Scapy庫中ARP類型數據包中需要的參數
    在這裏插入圖片描述
    • 這裏面的大多數參數都有默認值,其中,hwsrc和psrc分別是源硬件地址和源IP地址。
    • 這兩個地址不用設置,發送的時候會自動填寫本機的地址。
    • 唯一需要設置的是目的IP地址pdst,將這個地址設置爲目標即可
  • 另外,因爲發送的是廣播數據包,所以需要在Ether層進行設置,首先查看一下Ether的格式
    在這裏插入圖片描述
    • 這一層只有三個參數:
    • dst是目的硬件地址,
    • src是源硬件地址,這裏面src會自動設置爲本機地址。
    • 所以只需要將dst設置爲ff:ff:ff:ff:ff:ff即可將數據包發到網絡中的各個主機上
  • 下面構造一個掃描192.168.26.100的ARP請求數據包並將其發送出去
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.26.100"),timeout=2)

在這裏插入圖片描述

  • 對這個請求的迴應進行監聽,如果得到迴應,那麼證明目標在線,並打印輸出這個主機的硬件地址:
ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%"))
# lambda:需要在Python 環境下運行 :進入python解釋器,
# 導入 scapy模塊: from scapy.all import *,再進行下列代碼的書寫

在這裏插入圖片描述
在這裏插入圖片描述

  • 如果發出這個數據包,但是沒有收到這個數據包迴應,則說明目標主機不在線
    在這裏插入圖片描述

基於ICMP的活躍主機發現技術

  • ICMP位於TCP/IP協議族中的網絡層,它的目的是用於在IP主機、路由器之間傳遞控制消息。

  • ICMP中提供了多種報文,這些報文又可以分成兩大類:差錯報文和查詢報文。其中,查詢報文都是由一個請求和一個應答構成的。

  • ICMP查詢報文有4種,分別是響應請求或應答、時間戳請求或應答、地址掩碼請求或應答、路由器詢問或應答。

  • Ping命令就是響應請求或應答的一種應用,我們經常會使用這個命令來測試本地與目標之間的連通性。

  • 例如我們所在的主機IP爲192.168.1.1,而通信的目標IP地址爲192.168.1.2,如果要判斷192.168.1.2是否爲活躍主機,就需要向其發送一個ICMP請求,這個請求的格式如下。
    在這裏插入圖片描述

  • 現在來編寫一個利用ICMP實現的活躍主機掃描程序,

  • 藉助Scapy庫來完成。其核心思想就是要產生一個ICMP請求,首先查看Scapy庫中ICMP類型數據包中需要的參數
    在這裏插入圖片描述
    這一層和地址有關的參數有兩個:dst是目的IP地址,src是源IP地址。

  • src會自動設置爲本機地址。所以只需要將dst設置爲“192.168.26.100”即可將數據包發到目標主機上。

  • 接下來構造一個掃描192.168.26.100的ICMP請求數據包並將其發送出去。

ans,unans=sr(IP(dst="192.168.26.100")/ICMP())
  • 對這個請求的迴應進行監聽,如果得到了迴應,那麼證明目標在線,並打印輸出這個主機的IP地址。
ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") )

在這裏插入圖片描述
在這裏插入圖片描述

基於TCP的活躍主機發現技術

  • TCP(Transmission Control Protocol,傳輸控制協議)是一個位於傳輸層的協議。它是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。
  • TCP的特點是使用三次握手協議建立連接。當主動方發出SYN連接請求後,等待對方回答TCP的三次握手SYN+ACK,並最終對對方的SYN執行ACK確認。這種建立連接的方法可以防止產生錯誤的連接.
    在這裏插入圖片描述
  • 在這一層中出現了“端口”的概念。“端口”是英文port的意譯,可以認爲是設備與外界通信交流的出口。端口可分爲虛擬端口和物理端口,這裏使用的就是虛擬端口,指的是計算機內部或交換機路由器內的端口,例如計算機中的80端口、21端口、23端口等。
  • 這些端口可以被不同的服務所使用來進行各種通信,例如Web服務、FTP服務、SMTP服務等,這些服務都是通過“IP地址+端口號”來區分的
  • 如果檢測到一臺主機的某個端口有迴應,也一樣可以判斷這臺主機是活躍主機。
  • 如果一臺主機處於活躍狀態,那麼它的端口即使是關閉的,在收到請求時,也會給出一個迴應,只不過並不是一個“SYN+ACK”數據包,而是一個拒絕連接的“RST”數據包。
  • 編寫一個利用TCP實現的活躍主機掃描程序,這個程序有很多種方式可以實現,首先借助Scapy庫來完成。核心的思想就是要產生一個TCP請求,
  • 首先查看Scapy庫中TCP類型數據包中需要的參數
    在這裏插入圖片描述
    • 這裏的大多數參數都不需要設置,需要考慮的是sport、dport和flags。
    • sport是源端口,
    • dport是目的端口,
    • flags是標誌位,可能的值包括SYN(建立連接)、FIN(關閉連接)、 - ACK(響應)、PSH(有DATA數據傳輸)、RST(連接重置)。此處將flags設置爲“S”,也就是SYN。另外,TCP並沒有目標地址和源地址,所以需要在IP層進行設置。
  • 構造一個發往192.168.1.2的80端口的SYN請求數據包並將其發送出去。
ans,unans=sr( IP(dst="192.168.26.*")/TCP(dport=80,flags="S") )
  • 對這個請求的迴應進行監聽,如果得到了迴應,就證明目標在線,並打印輸出這個主機的IP地址。
ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") )

在這裏插入圖片描述

基於UDP的活躍主機發現技術

  • UDP全稱是用戶數據報協議,在網絡中它與TCP一樣用於處理數據包,是一種無連接的協議。在OSI模型中位於第4層——傳輸層,處於IP的上一層。
  • 但基於UDP的活躍主機發現技術和TCP不同,UDP沒有三次握手。
  • 當向目標發送一個UDP數據包之後,目標是不會發回任何UDP數據包的。
  • 不過,如果目標主機是處於活躍狀態的,但是目標端口是關閉的時候,可以返回一個ICMP數據包,這個數據包的含義爲“unreachable”
  • 如果目標主機不處於活躍狀態,這時是收不到任何迴應的
    在這裏插入圖片描述
  • 接下來構造一個發往192.168.26.100的6777端口的UDP數據包並將其發送出去。
ans,unans=sr( IP(dst="192.168.26.100")/UDP(dport=6777) )
  • 對這個請求的迴應進行監聽,如果得到了迴應,當然這個迴應是ICMP類型的,就證明目標在線,並打印輸出這個主機的IP地址。
ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive"))

在這裏插入圖片描述

端口掃描

  • 在信息收集階段就需要對目標的端口開放情況進行掃描:
    • 因爲一方面這些端口可能成爲進出的通道,
    • 另一方面利用這些端口可以進一步獲得目標主機上運行的服務,從而找到可以進行滲透的漏洞。
  • 對於網絡安全管理人員來說,對管理範圍內主機進行端口掃描也是做好防範措施的第一步。
  • 正常的情況下,端口只有open(開放)和closed(關閉)兩種狀態。
  • 但是有時網絡安全機制會屏蔽對端口的探測,因此端口狀態可能會出現無法判斷的情況,所以在探測的時候需要爲端口加上一個filtered狀態,表示 無法獲悉 目標端口的真正狀態。

基於TCP全開的端口掃描技術

  • TCP全開掃描:如果目標端口是開放的,那麼在接到主機端口發出的SYN請求之後,就會返回一個SYN+ACK迴應,表示願意接受這次連接的請求,然後主機端口再回應一個ACK,這樣就成功地和目標端口建立了一個TCP連接
    在這裏插入圖片描述
  • 如果目標端口是關閉的,那麼在接到主機端口發出的SYN請求之後,就會返回一個RST迴應,表示不接受這次連接的請求,這樣就中斷了這次TCP連接
    在這裏插入圖片描述
  • 目標端口不開放還有另外一種情況,就是當主機端口發出SYN請求之後,沒有收到任何的迴應。
  • 多種原因都可能造成這種情況,例如,目標主機處於非活躍狀態,這時當然無法進行迴應,不過這也可以認爲端口是關閉的。
  • 另外一些網絡安全設備也會屏蔽掉對某些端口的SYN請求,這時也會出現無法進行迴應的情況
    在這裏插入圖片描述
  • 前面的已經學習了Scapy中IP數據包和TCP數據包的格式,我們可以構造一個 SYN的請求數據包
packet = IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S")
  • 然後使用sr1函數將這個數據包發送出去
resp = sr1(packet,timeout=10)
  • 要根據收到對應的應答包來判斷目標端口的狀態,這時會有以下三種情況。
    • 第一種:如果此時resp的值爲空,就表示 沒有收到來自目標的迴應。
      • 使用str(type(resp))來判斷這個resp是不是爲空,
      • 當type(resp)的值轉換爲字符串之後爲"<type’NoneType’>"時就表明resp是空,也就是沒有收到任何數據包,判斷該端口爲closed。
      • 如果不爲這個值,則說明resp不爲空,也就是收到了迴應的數據包,那麼就轉到後面的第二種或者第三種。
    • 第二種:當收到了迴應的數據包之後,需要判斷一下這個數據包是“SYN+ACK”類型還是“RST”類型的。
      • 在Scapy中數據包的構造是分層的,可以使用haslayer()函數來判斷這個函數是否具有某一個協議,
      • 例如,判斷一個數據包是否使用了TCP,就可以使用haslayer(TCP)來判斷
      • 也可以使用getlayer(TCP)來讀取其中某個字段的內容。
      • 可以使用如下語句來判斷迴應數據包是否爲“SYN+ACK”類型。resp.getlayer(TCP).flags == 0x12 #0x12就是"SYN+ACK"
      • 如果結果爲真,表示目標接受TCP請求,需要繼續發送一個ACK數據包過去,完成三次握手。IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="AR")
    • 第三種:如果resp.getlayer(TCP).flags的結果不是0x12,而是0x14(表示RST),那麼表明目標端口是關閉的resp.getlayer(TCP).flags == 0x14 #0x12就是"SYN+ACK"
  • 按照上面設計的思路編寫一個基於TCP全開的完整端口掃描程序。
    full_open.py
    在這裏插入圖片描述
    在這裏插入圖片描述

基於TCP半開的端口掃描技術

  • 基於TCP全開的端口掃描技術還有一些不完善的地方

  • 例如,這次連接可能會被目標主機的日誌記錄下來,
    而且最爲主要的是建立TCP連接三次握手中的最後一次是沒用的,
    在目標返回一個SYN+ACK類型的數據包之後,已經達到了探測的目的,最後發送的ACK類型數據包是不必要的,所以可以考慮去除這一步。

  • 如果目標端口是開放的,那麼在接到主機端口發出的SYN請求之後,就會返回一個SYN+ACK迴應,表示願意接受這次連接的請求,然後主機端口不再回應一個ACK,而是發送一個 RST 表示中斷這個連接。這樣實際上並沒有建立好完整的TCP連接,所以稱爲半開。
    在這裏插入圖片描述

  • 如果目標端口是關閉的,半開掃描和全開掃描沒有區別
    在這裏插入圖片描述

  • 半開掃描實例中,考慮一種更爲複雜的情況,那就是目標端口的filtered狀態。

  • 這種狀態往往是由 包過濾機制 造成的,過濾可能來自專業的防火牆設備、路由器規則或者主機上的軟件防火牆。這種情況下會讓掃描工作變得很難,因爲這些端口幾乎不提供任何信息。不過有時候它們也會響應ICMP錯誤消息,但更多時候包過濾機制不做出任何響應
    在這裏插入圖片描述

  • 將沒有收到迴應數據包的端口歸於“filtered”狀態

  • 當TCP連接的數據包被屏蔽時,一般會返回如下所示的幾種ICMP錯誤消息
    在這裏插入圖片描述

  • 如果收到這幾種類型的ICMP數據包,也將目標端口的狀態歸類到“filtered”。

  • 所以在編寫程序的時候,考慮如下兩種情形。

if(str(type(stealth_scan_resp))==<type ‘NoneType’>):  #表示沒有收到任何的迴應數據包。
if(int(resp.getlayer(ICMP).type)==3 and int(resp.getlayer(ICMP).code) in [1,2,3,9,10,13]):  #表示的是收到的是ICMP類型的數據包。

在這裏插入圖片描述

服務掃描

  • 平時所使用的軟件除了操作系統之外,還有大量的其他應用程序。有些個人開發的應用軟件大都也存在着漏洞,它們更是網絡安全的重災區。
    如果目標使用這些軟件對外提供網絡服務,攻擊者就有可能利用這個網絡服務的漏洞入侵。
  • 因此,在對目標進行滲透測試的時候,要儘量地檢測出目標系統運行的各種服務。
  • 對於入侵者來說,發現這些運行在目標上的服務,就可以利用這些軟件上的漏洞入侵目標;
  • 對於網絡安全的維護者來說,也可以提前發現系統的漏洞,從而預防這些入侵行爲。

服務掃描的思路

  • 常見的服務都會運行在指定的端口上
  • 例如,FTP服務上總會運行在21號端口上,而HTTP服務總會運行在80端口上。因爲這些端口都是公知端口,所以只需要知道目標上哪個端口是開放的,就可以猜測出目標上運行着什麼服務。
  • 這樣做有兩個明顯的缺點:
    • 一是很多人會將服務運行在其他端口上,例如,將本來運行在23號端口上的Telnet運行在22號端口上,這樣就會誤以爲這是一個SSH服務;
    • 二是這樣得到的信息極爲有限,即使知道目標80端口上運行着HTTP服務,但是完全不知道是什麼軟件提供的這個服務,也就無從查找這個軟件的漏洞了。
  • 有一些掃描工具採用了抓取軟件banner的方法,因爲很多的軟件都會在連接之後提供一個表明自身信息的banner,可以編寫程序來抓取這個banner從中讀出目標軟件的信息
  • 最後也是最爲優秀的一種方法,就是向目標開放的端口發送探針數據包,然後根據返回的數據包與數據庫中的記錄進行比對,找出具體的服務信息。
    • Nmap掃描工具就是採用了這種方法,它包含一個十分強大的Nmap-service-probe數據庫,這個庫中包含世界上大部分常見軟件的信息,而且這個庫還在完善中

利用抓取軟件banner的方式

在這裏插入圖片描述

  • 執行如下代碼:
    在這裏插入圖片描述
  • 將這個程序以“ServiceScan.py”爲名保存起來,爲這個程序指定兩個參數“192.168.169.133(Windows主機IP) 21”,然後執行

使用更爲強大的Nmap庫

  • 掃描的過程很簡單,核心語句變成了nm.scan(target, port,"-sV"),關鍵是對掃描結果的處理
    在這裏插入圖片描述

操作系統掃描

  • 現在很多著名的工具都提供了遠程對操作系統進行檢測的功能
  • 這一點用在入侵上就可以成爲黑客的工具,而用在網絡管理上就可以進行資產管理和操作系統補丁管理。
  • 但是並沒有一種工具可以提供絕對準確的遠程操作系統信息。幾乎所有的工具都使用了一種“猜”的方法。當然這不是憑空的猜測
  • 目前遠程對操作系統進行檢測的方法一般可以分成以下兩類。
    • (1)被動式方法:這種方法是通過抓包工具來收集流經網絡的數據包,再從這些數據包中分析出目標主機的操作系統信息。
      • p0f就是一款典型的被動式掃描工具。p0f可以自動地捕獲網絡中通信的數據包,並對其進行分析,使用的方法很簡單,可以在命令行中直接輸入“p0f”

      • 在這裏插入圖片描述

      • 這時p0f就會開始監聽網絡中的通信

      • 然後,打開瀏覽器訪問如:web服務器,就會產生如下結果

      • 在這裏插入圖片描述

    • (2)主動式方法:向目標主機發送特定的數據包,目標主機一般會對這些數據包做出迴應,對這些迴應做出分析,就有可能得知遠程主機的操作系統類型。這些信息可以是正常的網絡程序如Telnet、FTP等與主機交互的數據包,也可以是一些經過精心構造、正常的或殘缺的數據包。
      • 採用向目標發送數據包的方式來檢測,但是這需要設計一系列的探針式數據包,並將各種操作系統的反應保存爲一個數據庫使用Nmap庫文件來編寫一個主動式掃描程序,首先還是在命令行中來實現這個程序
      • 在這裏插入圖片描述
      • 掃描結果
      • 在這裏插入圖片描述

在這裏插入圖片描述

  • osmatch是一個字典類型,它包括’accuracy’ ‘line’ 'osclass’三個鍵,
  • 而’osclass’中包含關鍵信息,它本身也是一個字典類型,其中包含’accuracy’(匹配度)、‘cpe’(通用平臺枚舉)、‘osfamily’(系統類別)、‘osgen’(第幾代操作系統)、‘type’(設備類型)、‘vendor’(生產廠家)6個鍵。
  • 下面是一個使用Nmap庫編寫的完整程序。
    在這裏插入圖片描述
  • 將這個程序以“OSScan”爲名保存起來,指定一個參數“192.168.43.250”,然後執行這個程序,結果如圖
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章