標籤:

0x1: 埠掃描

##埠掃描

這一章將會演示如何通過Python的網路連接來開發一個基礎的埠掃描器,我們的設計思路是使用socket一遍又一遍的去連接ip與埠的組合的新值,為了方面我們能夠快速的完成它,首先需要介紹一點新的概念,for循環:

>>>n>>> for port in range(1000,1024):n... print "[+] The port is: "+str(port)n...n[+] The port is: 1000n[+] The port is: 1001n[+] The port is: 1002n[+] The port is: 1003n[+] The port is: 1004n[+] The port is: 1005n[+] The port is: 1006n[+] The port is: 1007n[+] The port is: 1008n[+] The port is: 1009n[+] The port is: 1010n[+] The port is: 1011n[+] The port is: 1012n[+] The port is: 1013n[+] The port is: 1014n[+] The port is: 1015n[+] The port is: 1016n[+] The port is: 1017n[+] The port is: 1018n[+] The port is: 1019n[+] The port is: 1020n[+] The port is: 1021n[+] The port is: 1022n[+] The port is: 1023n

注意上面那段代碼在循環體內的縮進,通常情況下是空兩格或一個tab鍵,但這都沒有關係,只要你的整個代碼一直就可以了。我么所寫的那個簡短的埠掃描器的核心代碼會寫在上面代碼中的輸出塊部分,然後建立一個socket連接。下面的代碼就演示了如何使用內建的socket模塊去建立一個socket連接:

>>>n>>> import socketn>>>n>>> s = socket.socket()n>>> s.connect((127.0.0.1, 22))n>>> s.send(Primal Security n)n17n>>> banner = s.recv(1024)n>>> print bannernOpenSSHn

上面這個例子:我們先import這socket模塊並且調用connect()函數去連接指定的IP地址與埠。它就會建立一個TCP連接(SYN/SYN-ACK/ACK)並且我們再通過send()函數給伺服器發送一個真實的數據,然後使用recv()列印出響應的內容。現在教大家如何容錯socket,對於不能打開的連接:

>>>n>>> s.connect((127.0.0.1, 23))nTraceback (most recent call last):n File "<stdin>", line 1, in ?n File "<string>", line 1, in connectnsocket.error: (111, Connection refused)n

對於上面的錯誤有若干中處理方式,這裡我們使用最簡單的一種方式:使用"try/except"循環來處理錯誤:

>>>n>>> try:n... s.connect((127.0.0.1, 23))n... except: passn...n>>>n

現在就不會出現錯誤了,一行很簡單的代碼就讓你的程序能夠繼續工作下去^_^。現在讓我們使用之前學到的知識,使用for循環來寫一個簡單的埠掃描器:

>>>n>>> for port in range(20,25):n... try:n... print "[+] Attempting to connect to 127.0.0.1:"+str(port)n... s.connect((127.0.0.1, port))n... s.send(Primal Security n) n... banner = s.recv(1024)n... if banner:n... print "[+] Port "+str(port)+" open: "+bannern... s.close()n... except: passn...n17n[+] Attempting to connect to 127.0.0.1:20n[+] Attempting to connect to 127.0.0.1:21n[+] Attempting to connect to 127.0.0.1:22n[+] Port 22 open: OpenSSHn[+] Attempting to connect to 127.0.0.1:23n[+] Attempting to connect to 127.0.0.1:24n[+] Attempting to connect to 127.0.0.1:25n

上面我們演示了使用"try/except"循環來處理當socket連接的時候遇到埠關閉的錯誤,同時上面還演示了如何使用"if"語句列印出可以連接成功的埠。下面我們將創建一個我們掃描指定埠的掃描器,這裡的埠號,我們使用數組來存儲,然後遍歷這一個數組:

>>>n>>> ports = [22, 445, 80, 443, 3389]n>>> for port in ports:n... print portn...n22n445n80n443n3389n>>>n

如果我們想一次性掃描多台主機,可以使用一個for循環嵌套。最外層的是主機的ip,然后里面的for循環是埠。下面有一個基礎的例子,展示了如何通過循環嵌套來構建一個簡單的掃描器:

>>>n>>> hosts = [127.0.0.1, 192.168.1.5, 10.0.0.1]n>>>n>>> ports = [22, 445, 80, 443, 3389]n>>>n>>> for host in hosts:n... for port in ports:n... try:n... print "[+] Connecting to "+host+":"+str(port)n... s.connect((host, port))n... s.send(Primal Security n)n... banner = s.recv(1024)n... if banner:n... print "[+] Port "+str(port)+" open: "+bannern... s.close()n... except:passn...n[+] Connecting to 127.0.0.1:22n[+] Port 22 open: OpenSSHn[+] Connecting to 127.0.0.1:445n[+] Connecting to 127.0.0.1:80n[+] Connecting to 127.0.0.1:443n[+] Connecting to 127.0.0.1:3389n[+] Connecting to 192.168.1.5:22n[+] Connecting to 192.168.1.5:445n[+] Connecting to 192.168.1.5:80n[+] Connecting to 192.168.1.5:443n[+] Connecting to 192.168.1.5:3389n[+] Connecting to 10.0.0.1:22n[+] Connecting to 10.0.0.1:445n[+] Connecting to 10.0.0.1:80n[+] Connecting to 10.0.0.1:443n[+] Connecting to 10.0.0.1:3389n

正如你所看到的結果,它把hosts數組裡面的所有值都遍歷了一次ports數組,等hosts[0]掃描完成之後再掃描hosts[1]依次類推。在這個例子裡面你也可以修改裡面的代碼,只讓它顯示出可以打開的埠。

在這最後,你會發現還是Nmap最好用,但是我們將在後面的文章裡面繼續完善這個實例,大家可以花點時間去學習一些socket模塊其他的功能函數,大家可以使用"dir(socket)"來了解更多,當然還有help().


推薦閱讀:

【視頻】字元串,今天你學習了嗎
python3下安裝aiohttp遇到過的那些坑
Python網路爬蟲(二)- urllib爬蟲案例
給妹子講python--01好用的列表
學習筆記三:改善Python程序的91個建議

TAG:Python教程 |