天天看點

網絡安全學習第11篇 - 簡易端口掃描工具

依據文檔中的内容,編寫一個簡易的端口掃描工具,并測試該工具是否有效。

實驗檔案與參考文檔.rar

相關知識:

端口掃描背景及意義

網絡中每台計算機猶如一座城堡,這些城堡中,有些是對外完全開放的,有些卻是大門緊閉的。入侵者們是如何找到,并打開它們的城門呢?這些城門究竟通向何處? 在網絡中,把這些城堡的“城門”稱之為計算機的“端口”。端口掃描是入侵者搜尋資訊的幾種常用方法之一,也正是這一種方法最容易暴露入侵者的身份和意圖。一般說來,掃描端口有以下目的: 判斷目标主機上開放了哪些服務 判斷目标主機的作業系統 如果入侵者掌握了目标主機開放了哪些服務,運作何種作業系統,他們就能使用相應的手段實作入侵。而如果管理者先掌握了這些端口服務的安全漏洞,就能采取有效的安全措施,防範相應的入侵。

端口掃描現狀

計算機資訊網絡的發展加速了資訊化時代的程序,但是随着社會網絡化程度的增加,對計算機網絡的依賴也越來越大,網絡安全問題也日益明顯。端口掃描技術是發現安全問題的重要手段之一。一個端口就是一個潛在的通信通道,也就是一個入侵通道。對目标計算機進行端口掃描,能得到許多有用的資訊。掃描器通過選用遠端TCP/IP不同的端口的服務,并記錄目标給予的回答,通過這種方法,可以搜集到很多關于目标主機的各種有用的資訊,進而發現目标機的某些内在的弱點。 

端口掃描工具(Port Scanner)指用于探測伺服器或主機開放端口情況的工具。常被計算機管理者用于确認安全政策,同時被攻擊者用于識别目标主機上的可運作的網絡服務。

端口掃描定義是用戶端向一定範圍的伺服器端口發送對應請求,以此确認可使用的端口。雖然其本身并不是惡意的網絡活動,但也是網絡攻擊者探測目标主機服務,以利用該服務的已知漏洞的重要手段。端口掃描的主要用途仍然隻是确認遠端機器某個服務的可用性。

掃描多個主機以擷取特定的某個端口被稱為端口清掃(Portsweep),以此擷取特定的服務。例如,基于SQL服務的計算機蠕蟲就會清掃大量主機的同一端口以在 1433 端口上建立TCP連接配接。 [1] 

TCP掃描

最簡單的端口掃描工具使用作業系統原生的網絡功能,且通常作為SYN掃描的替代選項。Nmap将這種模式稱為連接配接掃描,因為使用了類似Unix系統的connect()指令。如果該端口是開放的,作業系統就能完成TCP三向交握,然後端口掃描工具會立即關閉剛建立的該連接配接,防止拒絕服務攻擊。這種掃描模式的優勢是使用者無需特殊權限。但使用作業系統原生網絡功能不能實作底層控制,是以這種掃描方式并不流行。并且TCP掃描很容易被發現,尤其作為端口清掃的手段:這些服務會記錄發送者的IP位址,入侵檢測系統可能觸發警報。 [1] 

SYN掃描

SYN掃描是另一種TCP掃描。端口掃描工具不使用作業系統原生網絡功能,而是自行生成、發送IP資料包,并監控其回應。這種掃描模式被稱為“半開放掃描”,因為它從不建立完整的TCP連接配接。端口掃描工具生成一個SYN包,如果目标端口開放,則會傳回SYN-ACK包。掃描端回應一個RST包,然後在握手完成前關閉連接配接。如果端口關閉了但未使用過濾,目标端口應該會持續傳回RST包。

這種粗略的網絡利用方式有幾個優點:給掃描工具全權控制資料包發送和等待回應時長的權力,允許更詳細的回應分析。關于哪一種對目标主機的掃描方式更不具備入侵性存在一些争議,但SYN掃描的優勢是從不會建立完整的連接配接。然而,RST包可能導緻網絡堵塞,尤其是一些簡單如列印機之類的網絡裝置。 [1] 

UDP掃描

UDP掃描也是可能的,盡管存在一些技術挑戰。 UDP是無連接配接協定,是以沒有等同于TCP SYN的資料包。但是,如果将UDP資料包發送到未打開的端口,目标系統将響應ICMP端口不可達的消息。大多數UDP端口掃描器都使用這種掃描方法,并使用缺少響應來推斷端口是否打開。但是,如果端口被防火牆阻止,則此方法将錯誤地報告端口已打開。如果端口不可達消息被阻塞,則所有端口将顯示為打開。這種方法也受到ICMP速率限制的影響。

另一種方法是發送特定于應用程式的UDP資料包,希望生成應用層響應。例如,如果DNS伺服器存在,向端口53發送DNS查詢将導緻響應。這種方法在識别開放端口方面更加可靠。然而,它僅限于應用程式特定的探測包可用時的端口掃描。一些工具(例如,NMAP)通常具有少于20個UDP服務的探針,而一些商業工具(例如,NESUS)有多達70個。在某些情況下,服務能在端口上被偵聽,但被配置為不響應特定的探測包。

程式設計實作原理(我們使用tcp掃描)

端口掃描的原理很簡單,就是建立socket通信,切換不同端口,通過connect函數,如果成功則代表端口開發者,否則端口關閉。

// PortScanf.cpp : 定義控制台應用程式的入口點。
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN


#include <WinSock2.h>
#include <cstdio>
#include <iostream>

#pragma comment(lib, "Ws2_32")

using namespace std;

int scant(char *Ip, int StartPort, int EndPort)
{
	WSADATA wsa;
	SOCKET s;
	struct sockaddr_in server;

	int CurrPort;    //目前端口
	int ret;

	WSAStartup(MAKEWORD(2, 2), &wsa);    //使用winsock函數之前,必須用WSAStartup函數來裝入并初始化動态連接配接庫

	server.sin_family = AF_INET;    //指定位址格式,在winsock中隻能使用AF_INET
	server.sin_addr.s_addr = inet_addr(Ip); //指定被掃描的IP位址

	for (CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
	{
		s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
		server.sin_port = htons(CurrPort); //指定被掃描IP位址的端口号
		ret = connect(s, (struct sockaddr *)&server, sizeof(server)); //連接配接

		if (0 == ret) //判斷連接配接是否成功
		{
			printf("%s:%d Success O(∩_∩)O~~\n", Ip, CurrPort);
			closesocket(s);
		}
		else {
			printf("%s:%d Failed\n", Ip, CurrPort);
		}
	}
	//printf("Cost time:%f second\n", CostTime); //輸出掃描過程中耗費的時間
	WSACleanup();    //釋放動态連接配接庫并釋放被建立的套接字
	return 1;
}

int main()
{
	while (true)
	{

		cout << "請輸入你要掃描的ip:" << endl;
		cout << ">>";
		char * ip = new char[50];
		cin >> ip;

		cout << "輸入你要查詢的起始端口:" << endl;
		cout << ">>";
		int startPort;
		cin >> startPort;

		cout << "輸入你要查詢的結束端口:" << endl;
		cout << ">>";
		int endPort;
		cin >> endPort;

		scant(ip, startPort, endPort);

	}

	return 0;
}
           
網絡安全學習第11篇 - 簡易端口掃描工具
網絡安全學習第11篇 - 簡易端口掃描工具

通過此次試驗的學習,我們認識了端口掃描工具的編寫。

總結為以下這個特點:(僅針對tcp掃描)

端口掃描的原理很簡單,就是建立socket通信,切換不同端口,通過connect函數(其實就是檢視是否可以連接配接),如果成功則代表端口開發者,否則端口關閉。其他掃描,如udp等其實也是大同小異。

那麼端口掃描工具有什麼用呢?

端口掃描是指某些别有用心的人發送一組端口掃描消息,試圖以此侵入某台計算機,并了解其提供的計算機網絡服務類型(這些網絡服務均端口号相關)。端口掃描是計算機解密高手喜歡的一種方式。攻擊者可以通過它了解到從哪裡可探尋到攻擊弱點。實質上,端口掃描包括向每個端口發送消息,一次隻發送一個消息。接收到的回應類型表示是否在使用該端口并且可由此探尋弱點。

掃描器是一種自動檢測遠端或本地主機安全性弱點的程式,通過使用掃描器你可以的發現遠端的各種TCP端口的配置設定及提供的服務和它們的軟體版本!這就能讓我們間接的或直覺的了解到遠端主機所存在的安全問題。

端口掃描,顧名思義,就是逐個對一段端口或指定的端口進行掃描。通過掃描結果可以知道一台計算機上都提供了哪些服務,然後就可以通過所提供的這些服務的己知漏洞就可進行攻擊。其原理是當一個主機向遠端一個伺服器的某一個端口提出建立一個連接配接的請求,如果對方有此項服務,就會應答,如果對方未安裝此項服務時,即使你向相應的端口送出請求,對方仍無應答,利用這個原理,如果對所有熟知端口或自己標明的某個範圍内的熟知端口分别建立連接配接,并記錄下遠端伺服器所給予的應答,通過檢視一記錄就可以知道目标伺服器上都安裝了哪些服務,這就是端口掃描,通過端口掃描,就可以搜集到很多關于目标主機的各種很有參考價值的資訊。例如,對方是否提供FPT服務、WWW服務或其它服務。

繼續閱讀