网络攻防学习 1编写一个端口扫描器
谨以此文献给初学的自己!
我有太多的名词不认识通过学习 一步步巩固基础 一步步提高自己r
任何一个靠谱的网络攻击都是起步于侦查的。我们将学习编写一个扫描主机开放的tcp端口的侦察小脚本,为了与tcp端交互,我们先建立TCP套接字。
套接字:
英文名字为socket, 是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
书写一个初级的端口扫描器,从而学习了optparse的用法,optparse可用来解析命令行参数 来传递指令来实现交互
import optparse from optparse import OptionParser import socket from socket import * #去测试目标主机的那个端口是开放的,并且开放的端口的活动应用是什么 def connScan(tgtHost,tgtPort): try: connSkt=socket.socket(AF_INET,SOCK_STREAM) connSkt.connect((tgtHost,tgtPort)) #我们需要发送一个消息去获得一个响应,从而根据这个响应 我们来判断对应的目标主机和端口上的应用 connSkt.send("ViolentPython\r\n") results=connSkt.recv(1024) #标明端口开放 print ("[+]%d/tcp open")% tgtPort #输出返回的结果 print ("[+]"+str(results)) connSkt.close() except: print ("[-]%d/tcp closed"% tgtPort) def portScan(tgtHost,tgtPorts): #其实我我觉得这两个try就是为了测试tgtHost的准确性 try: #传入一个主机名字会返回其对应得IP地址 tgtIP=gethostbyname(tgtHost) except: print ("[-] cannot resolve '%s': unkown host"%tgtHost) return try: #根据IP能返回其对应的主机名字 tgtName=gethostbyaddr(tgtIP) #返回扫描的结果 print ("\n[+] Scan Results for:" +tgtName[0]) except: print ("\n[+] Scan Results for :"+tgtIP) #设置全局的socket超出时间1秒 setdefaulttimeout(1) for tgtPort in tgtPorts: print ("Scanning Port%s "%tgtPort) connScan(tgtHost,int(tgtPort)) 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="int",help="specify target port[s] separeted by comma") #parse_args 来用来解析这些参数 (options,args)=parser.parse_args() tgtHost=options.tgtHost #端口不止一个 所以我们用split分隔 共同存储在一个列表中 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() #上面这一部分 快速解析了要扫描的目标主机名字 和 端口