【脚本工具篇】手把手教你制作信息收集器之端口扫描

#实验目的:使用python脚本实现端口扫描
#准备工具:选项分析器:optparse;网络库:socket;编译工具:Pycharm
#Python版本:Python2.7

问题引入:

1、端口扫描器扫描的效果是怎么样的?

答:下图是运行后的效果图,扫的主机ip为xxxx这台主机上的80,21,25,135,443,445,7001,7002这些端口。

【脚本工具篇】手把手教你制作信息收集器之端口扫描_第1张图片

 2、端口扫描器的扫描流程?

 答:(1)输入目标主机名和要扫描的常用端口列表。

        (2)通过目标主机名得到目标的网络IP地址。

        (3)将列表里面的每一个端口去连接目标地址。

        (4)确定端口上运行的特殊服务,发送特定数据,并读取特定应用程序返回的标识。

 

3、端口扫描器在代码上的设计步骤?

答:在代码层面上,我们一共设计了3个函数,在下面已经用列表形式直观地列出来

【脚本工具篇】手把手教你制作信息收集器之端口扫描_第2张图片

 

制作扫描端口器的过程

1、主函数的设计采用选项分析器optparse模块

optparse是一个功能强大,易于使用的选项分析器,专门用来处理命令行的参数。

使用它之前我们需要实例化一个optparse对象。

import optparse
#实例化一个optparse对象
    parser = optparse.OptionParser('usage%prog' + '-H  -p ')

接下来,我们需要添加上命令参数:

#添加上命令参数,-H用来指定主机名,-p用来指定端口列表
#dest用来保存参数的值,该值可以作为options的属性被访问
#type用来指定输入参数的类型
#help用来指定在帮助中显示的信息
    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] by comma')
    (options, args) = parser.parse_args()

optparse还会自动生成命令行的帮助信息,运行结果图如下:

【脚本工具篇】手把手教你制作信息收集器之端口扫描_第3张图片

获取到了主机名和IP地址后,程序跳转到portScan函数并传入参数。

tgthost=options.tgthost

tgtports=str(options.tgtport).split(',')

portScan(tgthost,tgtports) #跳到portScan()函数

2、portScan()函数的设计

portScan用来获取主机名的IP地址,并逐个将其发送到connScan函数中去。

#域名解析
tgtIP = gethostbyname(tgthost)

#ip解析,返回一个元组,第一个元素是主机名
tgtName = gethostbyaddr(tgtIP)

for tgtport in tgtports:
     # print 'Scanning port '+tgtport
     connScan(tgthost, int(tgtport))

3. connScan()函数的设计

connScan采用了socket模块来建立TCP的套接字,用来发送TCP的请求。

import socket

connSkt=socket(AF_INET,SOCK_STREAM) #建立TCP的套接字

connSkt.connect((tgthost,tgtport)) #连接IP地址和对应的端口

connSkt.send('ViolenPython\r\n') #发送垃圾数据

result=connSkt.recv(100) #设置接收数据的容量

#完整的代码如下:

# -*-coding:utf-8-*-

import optparse

import socket

from socket import *

#connScan采用了socket模块来建立TCP的套接字,用来发送TCP的请求
def connScan(tgthost, tgtport):
    try:  # 尝试去建立端口的连接并发送垃圾数据

        connSkt = socket(AF_INET, SOCK_STREAM) #建立TCP的套接字

        connSkt.connect((tgthost, tgtport))  #连接IP地址和对应的端口

        connSkt.send('ViolenPython\r\n')  #发送垃圾数据

        result = connSkt.recv(100)  #设置接收数据的容量

        print ('[+]%d/tcp open' % tgtport)  # 如果没有出错,打印端口开放,并把接收到的banner信息打印出来

        if str(result):
            print ('[ %d banner]' % tgtport + str(result))

        connSkt.close()

    except:  # 如果出错,则打印端口关闭

        print ('[-]%d/tcp closed' % tgtport)


#portScan()函数的设计是用来获取主机名的IP地址,并逐个将其发送到connScan函数中去
def portScan(tgthost, tgtports):
    try:
        #域名解析
        tgtIP = gethostbyname(tgthost)

    except:

        print ("[-] Cannot resolve '%s': Unknow host" % tgthost)

        return

    try:
        #ip解析,返回一个元组,第一个元素是主机名
        tgtName = gethostbyaddr(tgtIP)

        print ('\n[+] Scan Result for:' + tgtName[0])

    except:

        print ('\n[+] Scan Result for:' + tgtIP)
    #设置默认超时时间
    setdefaulttimeout(1)

    for tgtport in tgtports:
        # print 'Scanning port '+tgtport

        connScan(tgthost, int(tgtport))


def main():
    #实例化一个optparse对象
    parser = optparse.OptionParser('usage%prog' + '-H  -p ')

    #添加上命令参数,-H用来指定主机名,-p用来指定端口列表
    #dest用来保存参数的值,该值可以作为options的属性被访问
    #type用来指定输入参数的类型
    #help用来指定在帮助中显示的信息
    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] by comma')
    (options, args) = parser.parse_args()

    tgthost = options.tgthost

    tgtports = str(options.tgtport).split(',')

    if (tgthost == None) | (tgtports[0] == None):  # 判断是否有ip和端口参数,没有则输出帮助信息并退出

        print ('[-] You must specify a target host and port[s].')

        print (parser.usage)

        exit(0)

    portScan(tgthost, tgtports)  # 跳到portScan()函数


if __name__ == '__main__':
    main()

好了,一个轻量级的只需45行代码的端口扫描器就制作完成啦,本次的扫描器采用的是TCP的全连接扫描,有其它连接方式的小伙伴可以互相交流学习一下,奥利给!!!


(不足或者侵权的地方,请尽快联系我,我会及时修改或删除,非常感谢)

  每日一句:My father used to say, whatever you do, do it a hundred percent.

                   我父亲曾经说过,不管你做什么,都要做到极致。

你可能感兴趣的:(Python脚本工具库)