linux下埠掃描程式(C)
根據TCP協議規範,當一臺計算機收到一個TCP連線建立請求報文(TCP SYN)的時候,做這樣的處理:
1、 如果請求的TCP埠是開放的,則迴應一個TCP ACK報文,並建立TCP連線控制結構(TCB);
2、 如果請求的TCP埠沒有開放,則迴應一個TCP RST(TCP頭部中的RST標誌設為1)報文,告訴發起計算機,該埠沒有開放。
相應地,如果IP協議棧收到一個UDP報文,做如下處理:
1、 如果該報文的目標埠開放,則把該UDP報文送上層協議(UDP)處理,不迴應任何報文(上層協議根據處理結果而回應的報文例外);
2、 如果該報文的目標埠沒有開放,則向發起者回應一個ICMP不可達報文,告訴發起者計算機該UDP報文的埠不可達。
利用這個原理,攻擊者計算機便可以通過傳送合適的報文,判斷目標計算機哪些TCP或UDP埠是開放的,過程如下:
1、 發出埠號從0開始依次遞增的TCP SYN或UDP報文(埠號是一個16位元的數字,這樣最大為65535,數量很有限);
2、 如果收到了針對這個TCP報文的RST報文,或針對這個UDP報文的ICMP不可達報文,則說明這個埠沒有開放;
3、 相反,如果收到了針對這個TCP SYN報文的ACK報文,或者沒有接收到任何針對該UDP報文的ICMP報文,則說明該TCP埠是開放的,UDP埠可能開放(因為有的實現中可能不迴應ICMP不可達報文,即使該UDP埠沒有開放)。
這樣繼續下去,便可以很容易的判斷出目標計算機開放了哪些TCP或UDP埠,然後針對埠的具體數字,進行下一步攻擊,這就是所謂的埠掃描攻擊。
根據以上原理,我編寫了以下程式碼(只進行了TCP掃描):
#include<stdlib.h> #include<stdio.h> #include<sys/socket.h> #include<netdb.h> #include<string.h> #include<unistd.h> #include<netinet/in.h> #include<arpa/inet.h> #include<fcntl.h> #include<time.h> #include<sys/types.h> #define TIMEOUT 5 //由於把socket設定為非阻塞,使用select函式,觀察其 //5秒後的是否連線成功,連線不成功則認為其埠沒有開放 struct servenet{ char * s_name; char** s_aliases; int s_port; char* s_proto; }; //引數是目標機的IP int main(int argc,char** argv) { struct sockaddr_in server; int ret; int len; int scanport; int start_port=0; int end_port=1024; int sockfd; fd_set rset; fd_set wset; struct servenet *sp; for(scanport=start_port;scanport<end_port;scanport++) { if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0))) { perror("can not create socket\n"); exit(1); } memset(&server,0,sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(argv[1]); server.sin_port = htons(scanport); int flag = fcntl(sockfd, F_GETFL,0); fcntl(sockfd,F_SETFL, flag|O_NONBLOCK); struct timeval tm; tm.tv_sec = TIMEOUT; tm.tv_usec = 0; //connect為非阻塞,連線不成功立即返回-1 if (!connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr))){ sp=getservbyport(htons(scanport),"tcp"); printf("tcp port %d open:%s\n ",scanport,sp->s_name); }//假如連線不成功,則執行select,直到超時 else { FD_ZERO(&rset); FD_ZERO(&wset); FD_SET(sockfd, &rset); FD_SET(sockfd, &wset); int error; //錯誤程式碼 int len = sizeof(error); //5秒後檢視socket的狀態變化 if (select(sockfd+1,&rset,&wset,NULL,&tm)>0){ getsockopt(sockfd, SOL_SOCKET, SO_ERROR,&error, &len ); if(error == 0) printf("Port %d is opened\n", scanport); } } close(sockfd); } return 0; }
相關推薦
linux下埠掃描程式(C)
網路攻擊第一步是掃描目標機的開放埠,其原理是(摘自http://www.pconline.com.cn/pcjob/nettech/safe/others/0502/557020_1.html): 根據TCP協議規範,當一臺計算機收到一個TCP連線建立請求報文(TCP
Linux下埠掃描程式nmap介紹
NMAP(1) Nmap Reference Guide NMAP(1) NAME nmap - Network exploration tool and security / port sc
Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.net/w28252
Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne
linux下oracle11G DG搭建(四):興許驗證操作
歸檔 驗證 補充 over nts content -s 環境 fontsize linux下oracle11G DG搭建(四):興許驗證操作 環境 名稱 主庫 備庫 主機名 bjsrv shsrv 軟件版本號 RedH
Linux下MySQL的基礎(一)
mysql基於解釋MYSQL的基礎1. MySQL服務器中幫助的使用格式: mysql> help command eg: mysql> help create database Name: ‘CREATE DATABASE‘ Description: Sy
linux下殺死進程(kill)的N種方法
linxu、ps、kill首先,用ps查看進程,方法如下:$ ps -ef……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 1823 1822 0 11:38 ? 00:00:00 gnome-
Linux下的基本指令(一)
文章目錄 1.檔案系統層次結構 1.1根目錄下重要的目錄 2. 對目錄進行操作 2.1 樹狀目錄結構的解釋 2.2 目錄的基本命令 1. cp 指令:複製一個或多個檔案
Linux下使用ElasticSearch教程(一)
一:ElasticSearch在Linux下安裝簡單總結. 1.本次安裝的版本是ES6.3.2.版本.下載到壓縮包.解壓後直接來到當前的解壓目錄. cd config &n
Linux下生成隨機密碼(轉)
1、使用SHA演算法來加密日期,並輸出結果的前32個字元: date +%s |sha256sum |base64 |head -c 32 ;echo 生成結果如下: ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4 2、使用內嵌的/dev/urandom,並過濾掉那些日常
Linux下程序的總結(3)
程序的控制 1.程序的建立 fork()函式 在一個程式碼段中建立一個新的子程序可以使用fork()函式。 1.fork()函式以父程序為模板創建出了一個子程序,但是父子程序程式碼共享,資料獨有一份。也就是分配新的記憶體塊和核心資料結構。然後父程序的部分資料拷貝到了子程序。
Linux下程序的總結(2)
程的優先順序 由於每個程序的任務所要消耗的資源量不同。所以要對程序進行分級制度。 為什麼要有程序的優先順序? 計算機只有一個cpu,採用了分時機制,讓每個程式在cpu上執行很短的時間。這個時間非常短,人的感知無法仔細的觀察到。切換時間片的時候,有的程序需要緊急處理,有的程序可以放
Linux下安裝微信(轉)
擴充套件:https://www.cnblogs.com/dunitian/p/9124806.html 安裝過程如下: 1.下載最新版本tar.gz壓縮包https://github.com/geeeeeeeeek/electronic-wechat/releases/download/V2.0/lin
linux下卸載mysql(rpm)
bubuko info 是否 用戶和用戶組 mysq 安裝 del 用戶及用戶組 .com linux下卸載mysql 查看是否安裝了mysql的組件 rpm –qa |grep –I mysql 卸載前關閉mysql服務 service mysql status se
linux下解除安裝mysql(rpm)
linux下解除安裝mysql 檢視是否安裝了mysql的元件 rpm –qa |grep –I mysql 解除安裝前關閉mysql服務 service mysql status service mysql stop 檢視mysql對應的資料夾資訊
對於Linux下的伺服器程式設計(2)
對於驚群問題,我們可以使用一個主執行緒來接受連線,並且把這個連線套接字傳遞到子程序裡面,讓子程序來處理這個連線。這種方法需要程序間通訊:通過Unix套接字來在程序之間傳遞套接字。【注意不能使用Unix套接字***直接***傳遞描述符到子程序,因為雖然父程序和子程序獲得的檔案描述符相同,但是子程序
對於Linux下的伺服器程式設計(1)
在Linux下面,對於海量連線並且每個連線在大部分時間裡面都是不活躍的情況下,我們使用Epoll來解決C10K[C10M]問題。 1.如何使用Epoll:man Epoll。即為三個系統呼叫。 2.在伺服器擁有多個CPU的情況下,我們需要多執行緒或者多程序來幫助我們提高程式的效能,所以就需要
手寫一個Linux下的debug工具(一)
寫在前面 學習過Linux程式設計的同學都或多或少用過gdb來除錯自己的程式,但是並沒有很多的資源讓我們學習有關偵錯程式的東西。希望通過這篇文章,你可以瞭解基本的除錯原理,更重要的是可以寫出一個自己的簡易除錯工具。更有趣的是,你可以瞭解如何修改記憶體,來“愚弄
Linux下的賬號管理(3)-chage/usermod/userdel
chage命令: 可以更好的展示和修改密碼的屬性,直接修改配置檔案也是可以的 -l:檢視一個賬戶和密碼有關的時間引數 -d:YYYY-MM-DD,修改最近一次更改密碼的時間 -E: YYYY-MM-DD,修改賬號的失效時間 -I:天數,設定密碼幾天後失效 -m:天數,設定密碼至少保留
Linux下的賬戶管理(1)--passwd和shadow
Linux中的使用者分為兩大類 超級使用者:root(預設) 普通使用者:其餘都是普通使用者 超級使用者登入是“#”的表示,普通使用者登入是“$”的標誌 [[email protected] ~]# [[email protected] ~]$ 方括號中的文
linux下的i節點(node)
對於Unix系列的作業系統,大多都有v節點。但是對於linux來說,只有通用的i節點,卻沒有v節點。 下面來探討一下,linux下的i節點。 linux中,檔案查詢不是通過檔名稱來查詢的。實際上是通過i節點來實現檔案的查詢定位的。我們可以形象的將i節點看做