任何一个靠谱的网络攻击都是起步于侦查的。攻击者必须在挑选并确定利用目标中的漏洞之前找出目标在哪里有漏洞。在本篇文章中,我们将编写一个扫描目标主机开放的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安装路径。
求关注,持续更新中~
有问题欢迎评论区留言,或微信公众号(同名)留言。