目录
原理:
实践:
代码:
模块介绍:
optparse模块
socket模块
简单一句话:
原理:
TCP连接扫描是使用完整的三次握手来确定服务器或端口是否可用,这里我们模仿其,脚本主要分成一下几个部分。
- 首先输入一个主机名和用逗号分隔的端口列表并开始扫描;
- 将主机名转换成IPV4地址。
- 对每个端口都进行TCP连接,抓取目标应用的Banner信息。
实践:
第一步:获取命令参数主机名和端口。这个动作可以通过optparse库来解析命令行参数,调用optparse.OptionPaser([usage message])会生成一个参数解析器类的实列,然后在parser.add_option中指定这个脚本具体要解析哪个命令行参数。
import optparse
parser = optparse.OptionParser('usage %prog -H <target host> -p <target ports>')
parser.add_option('-H',dest='Host',type='string',help='specitfy target host')
parser.add_option('-P',dest='Ports',type='string',help='specify target ports')
(options.args)=parser.parse_args()
Host = options.Host
Posts = str(options.Posts).split(',')
if (Host == None)|(Ports==None):
print parser.usage
exit(0)
第二步:生成两个函数connScan和portScan,portScan函数以参数的形式接受主机名和目标端口列表,它会首先尝试用gethostbyname()函数确定主机名对应的IP地址,接下来以connScan函数输出主机名或者IP地址并使用connScan函数逐个连接每一个指定的端口。
import optparse
from socket import *
def connScan(Host,Port):
try:
connSkt = socket(AF_INET,SOCK_STREAM)
connSkt.connect((Host.Port))
print '[+] %d/tcp open '%Port
connSkt.close()
except:
print '[-] %d/tcp closed'%Port
def portScan(Host,Ports):
try:
Ip=gethostbyname(Host)
except:
print "[-] Cannot resolve '%s': Unknown host"%Host
return
try:
Name = gethostbyaddr(IP)
print '\n[+] Scan Results for:'+Name[0]
except:
print '\n[+] Scan Results for:'+IP
setdefaulttimeout(1)
for Port in Ports:
print 'Scanning port '+Port
connscan(Host.int(Port))
第三步:在connScan函数中插入一些新的代码段,检测目标端口开放后,向目标发送一个数据串并等待响应,从响应的消息中推断出目标主机和端口上的应用。
def connScan(Host,Port):
try:
connSkt = socket(AF_INET,SOCK_STREAM)
connSkt.connect((Host,Port))
connSkt.send('quiet simple\r\n')
results = connSkt.recv(100)
connSkt.close();
except:
print "%d/tcp closed"%Port
代码:
#coding:utf-8
import optparse
import socket
from socket import *
def main():
usage="%prog -H <target host> -p <target port>"
parser=optparse.OptionParser(usage)
parser.add_option('-H',dest='tgthost',type='string',help='target host')
parser.add_option('-p',dest='tgtport',type='string',help='target port[s]')
(options,args)=parser.parse_args()
port_list=str(options.tgtport).split(',')
for port in port_list:
portScan(options.tgthost,int(port))
def portScan(host,port):
try:
sock=socket(AF_INET,SOCK_STREAM)
sock.connect((host,port))
print "[*]%d/tcp open" % port
sock.close()
except:
print "[*]%d/tcp close" % port
if __name__=='__main__':
main()
模块介绍:
optparse模块
选项分析器,可用来生成脚本使用说明文档,
import optparse
#程序使用说明
usage="%prog -H <target host> -p <target port>"
#实例化optparse对象
parser=optparse.OptionParser(usage)
#添加-H参数相关内容
parser.add_option('-H',dest='host',type='string',help='target host')
#将上述dest赋给options的属性,即options.host,其值表示的是-H参数后的host值
(options,args)=parser.parse_args()
socket模块
socket包含一个非常强大的网络库,用于网络编程,基本用法如下:
#创建socket对象
sock=socket(AF_INET,SOCK_STREAM)
#发起连接
sock.connect((host,port))
#发送数据
sock.send()
#接收数据
sock.recv()
#关闭
sock.close()
简单一句话:
先调用optparse库读取解析命令参数对应的主机名和端口;再定义两个函数,一个用于读取主机名和端口列表,通过gethostbyname()来确定IP,另一个函数用来输出IP和对应的端口,逐个连接之。