python安全开发第二章第二节扫描技术

注释:本文使用python2.7代码,懒得改了,python3使用者自行更改,并不复杂

什么banner

banner在网上有很多种意思,但是在IT里面的意思就是代表一个服务或者软件发送的关于自己的描述符,扫描器也是通过抓取banner及其他的返回出的信息的特征来判断目标服务器到底是开了什么服务的

socket

socket是一个非常底层的模块,各种访问,读取,网络连接都可以使用这个模块,也有非常多的库都是基于这个底层库封装的,但是对于网络方面的学习,我们必须要明白这个模块的用法

tcp协议是一种经过三次握手的传输层协议我们大多数的网络访问都是使用此协议,tcp协议相对耗用更多的资源,但是保证了连接的有效性tcp协议详解

udp协议相对的耗用资源比较小,是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送,通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象UDP协议详解

>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>>s.connect(('127.0.0.1',22)) #我电脑开了22端口的ssh服务
>>> s.recv(1024)
out:"SSH-2.0-OpenSSH_7.3p1 Debian-3+b1\r\n"
>>> s.close() #关闭连接
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>>s.connect(('127.0.0.1',21)) 
>>> s.recv(1024)
out:'220 (vsFTPd 3.0.3)\r\n'

上述代码是不够健壮的一旦这个端口不存在就会报错 ,如果让代码变得健壮,我们可以使用try except

>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> try:
		s.connect(('127.0.0.1',22))
		print s.recv(1024)
	except:
		print "这个端口没有开放"
	finally:
		s.close()

联想:是不是可以根据banner来做一个端口+服务程序判断的扫描器啊
####把端口扫描器函数化

#coding=utf-8
import socket
def port_scan(taghost,tagport):
    """ 这是一个例子程序 """
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
       s.connect((taghost,tagport))
       print "开放端口",tagport
    except:
        print "%s 这个端口没开放"% tagport
    finally:
        s.close()
if __name__ == '__main__':
    port_scan('127.0.0.1',22)

结合之前的知识把只能扫描22端口变成可以扫描所有端口

#coding=utf-8
import socket
socket.setdefaulttimeout(0.01)必须设置超时,不然会等的想尿尿
def port_scan(taghost,tagport):
    """ 这是一个例子程序 """
       try:
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.connect((taghost,tagport))
        print "开放端口",tagport
    except:
        print "%s 这个端口没开放"% tagport
    finally:
        s.close()

if __name__ == '__main__':
    for i in [21,22,139,80,443,445,1389,8080]:
        port_scan('127.0.0.1',i)

实现一个更像扫描器的扫描器

#coding=utf-8
import socket
import argparse
socket.setdefaulttimeout(0.01)
def port_scan(taghost,tagport):
    """ 这是一个例子程序 """  
    try:
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.connect((taghost,tagport))
        print '[+] %d/tcp open'% tagport
        try:
            s.send('AAAAAAAA\r\n')
            results=s.recv(1024)
            print '[+]'+str(results)
        except:
            print "[-]没有接收到banner信息"
    except:
        pass
    finally:
        s.close()
if __name__ == '__main__':
    parser=argparse.ArgumentParser(description="这是我的第一个工具")
    parser.add_argument("-t","--taghost",help="输入扫描的目标ip")
    args=parser.parse_args()
    if args.taghost:
        for i in [21,22,23,139,443,445,80,8080,1389]:
            port_scan(args.taghost,i)
    else:
        print parser.format_help()        

###思考
1.还有可以完善的地方??

猜你喜欢

转载自blog.csdn.net/u014247926/article/details/127127484