前言
任何一個靠譜的網絡攻擊都是起步于偵查的。攻擊者必須在挑選并確定利用目標中的漏洞之前找出目標在哪里有漏洞。在本篇文章中,我們將編寫一個掃描目標主機開放的TCP端口的偵查小腳本。當然,為了與TCP端口進行交互,我們先要建立TCP套接字。
與大多數現代編程語言一樣,Python也提供了訪問BSD套接字的接口。BSD套接字提供了一個應用編程接口(API) ,使程序員能編寫在主機之間進行網絡通信的應用程序。通過一系列的套接字API函數,我們可以創建、綁定、監聽、連接,或在TCP/IP套接字上發送數據。在這一點上,為了進一步開發我們自己的攻擊程序,必須對TCP/IP套接字有一個更深入的了解。
大多數能訪問互聯網的應用使用的都是TCP協議。例如,在目標組織中,Web 服務器可能位于TCP 80端口,電子郵件服務器在TCP25端口,FTP服務器在TCP21端口。要連接目標組織中的任一一 服務器,攻擊者必須知道與服務器相關聯的IP地址和TCP端口。雖然熟悉我們目標組織的人可能掌握這些信息,但攻擊者卻不定。
所有成功的網絡攻擊一般都是以端口掃描拉開序幕的。有一種類型的端口掃描會向一 系列常用的端口發送TCP SYN數據包,并等待TCP ACK響應這能讓我們確定這 個端口是開放的。與此相反,TCP 連接掃描是使用完整的三次握手來確定服務器或端口是否可用的。
代碼
TCP全連接掃描
import socket
from socket import *
from threading import *
screenLock = Semaphore(value=1)
def connScan(tgtHost, tgtPort):
try:
connSkt = socket(AF_INET, SOCK_STREAM)
connSkt.connect((tgtHost, tgtPort))
connSkt.send('ViolentPythonrn')
results = connSkt.recv(100)
print('[+] %d/tcp open' % tgtPort)
print('[+] ' + str(results))
except:
screenLock.acquire()
print('[-] %d/tcp closed' % tgtPort)
finally:
screenLock.release()
connSkt.close()
def portScan(tgtHost, tgtPorts):
try:
tgtIP = gethostbyname(tgtHost)
except:
print("[-] Cannot resolve '%s':Unknown host" % tgtHost)
return
try:
tgtName = gethostbyaddr(tgtIP)
print('n[+] Scan Resulst for: ' + tgtName[0])
except:
print('n[+] Scan Results for: ' + tgtIP)
setdefaulttimeout(1)
for tgtPort in tgtPorts:
t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
t.start()
def main():
parser = optparse.OptionParser('usage % prog ' + '-H <target host> -p <target port>')
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPorts = str(options.tgtPort).split(',')
if (tgtHost == None) | (tgtPorts[0] == None):
print('[-] You must specify a target host and port[s].')
exit(0)
portScan(tgtHost, tgtPorts)
if __name__=='__main__':
main()
windows上運行
kali-linux上運行
nmap端口掃描
import nmap
import optparse
def nmapScan(tgtHost, tgtPort):
nmScan = nmap.PortScanner(nmap_search_path=('nmap',r'D:應用程序Nmapnmap.exe'))
nmScan.scan(tgtHost, tgtPort)
state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
print("[*] "+tgtHost+" tcp/"+tgtPort+" "+state)
def main():
parser = optparse.OptionParser('usage % prog ' + '-H <target host> -p <target port>')
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPorts = str(options.tgtPort).split(',')
if (tgtHost == None) | (tgtPorts[0] == None):
print('[-] You must specify a target host and port[s].')
exit(0)
for tgtPort in tgtPorts:
nmapScan(tgtHost, tgtPort)
if __name__=='__main__':
main()
注意:若在Windows上要運行nmap端口掃描代碼,要安裝的包是python-nmap,而非nmap,還需安裝nmap.exe,第4行代碼中”D:應用程序Nmapnmap.exe“為nmap安裝路徑。
求關注,持續更新中~
有問題歡迎評論區留言,或微信公眾號(同名)留言。