实战 | Python 编写端口扫描器
时间:2022-07-24
本文章向大家介绍实战 | Python 编写端口扫描器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
介绍:
本篇学习笔记将记录使用 python 编写 Scan 的学习路线,记录整个 python 扫描器的编写过程,记录从第一行代码到最新版本,对每个版本更新用到的技术进行详解
Version 1.0(socket 库)
使用 socket 库进行端口扫描:
更新日志:
调用 socket 中的库对目标进行扫描,并统计目标端口的开放情况
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
from socket import *
# import socket
# 端口扫描模块
def portScan(ip,portStart,portEnd):
open_ports=[]
for port in range(int(portStart),int(portEnd)+1):
# 显示扫描百分比
percent = float(port)*100/float(int(portEnd))
sys.stdout.write("%.2f"%percent)
sys.stdout.write("%r")
sys.stdout.flush()
# 发送数据,尝试建立连接
sock = socket(AF_INET, SOCK_STREAM)
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
result = sock.connect_ex((ip,port))
if result == 0:
open_ports.append(port)
pass
print open_ports
pass
# 获取ip和端口扫描范围
def main():
ip = sys.argv[1]
port = sys.argv[2].split("-")
portStart = port[0]
portEnd = port[1]
portScan(ip,portStart,portEnd)
if __name__ == '__main__':
main()
Version 1.1(Threadpool 多线程)
使用 Threadpool 进行多线程端口扫描:
更新日志:
调用 python 中的 Threadpool 模块,设置多线程多目标的端口进行扫描,增加扫描的效率
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
import sys
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
remote_server = sys.argv[1]
targetport = sys.argv[2].split("-")
startPort = targetport[0]
endPort = targetport[1]
remote_server_ip = socket.gethostbyname(remote_server)
ports = []
print '-' * 60
print '正在对目标:', remote_server_ip + '进行扫描'
print '-' * 60
socket.setdefaulttimeout(0.5)
def scan_port(port):
try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))
if res == 0: # 如果端口开启 发送 hello 获取banner
print 'Port {}: OPEN'.format(port)
s.close()
except Exception,e:
print str(e.message)
for i in range(int(startPort),int(endPort)+1):
ports.append(i)
# Check what time the scan started
t1 = datetime.now()
# 创建线程
pool = ThreadPool(processes = 32) # 设置线程数
results = pool.map(scan_port,ports) # 设置需要使用多线程的函数名称,传递参数的集合,该函数会将传递参数的集合分条传递到函数中使用
pool.close()
pool.join()
print '本次端口扫描共用时 ', datetime.now() - t1
演示:
Version 1.2 (optparse 库)
使用 optparse 对 python 使用过程的命令进行解析
更新日志:
调用 python 的 optparse 库,实现在运行该脚本的过程中使用“–host”等方式指定参数名称
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import optparse
import socket
import sys
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
print "------------------------------------------------------------------------------------------"
print "| ___ _ _ _ |"
print "| ___ ___ / _ ___ _ __ | |_| |_ _ _ _ __ ___ _ __| |_ ___ ___ __ _ _ __ |"
print "| / __/ _ | | | |/ _ | '_ | __| __| | | | | '_ / _ | '__| __/ __|/ __/ _` | '_ |"
print "| | (_| (_) | |_| | (_) | | | | |_| |_| |_| | | |_) | (_) | | | |___ (_| (_| | | | | |"
print "| ______/ ___/ ___/|_| |_|__|__|__, | | .__/ ___/|_| __|___/_____,_|_| |_| |"
print "| |___/ |_| |"
print "------------------------------------------------------------------------------------------"
parse=optparse.OptionParser(usage='python portscan.py -H 127.0.0.1 -P 60,90 -T 32',version="co0ontty portscan version:1.2")
parse.add_option('-H','--Host',dest='host',action='store',type=str,metavar='host',help='Enter Host!!')
parse.add_option('-P','--Port',dest='port',type=str,metavar='port',default='1,10000',help='Enter Port!!')
parse.add_option('-T','--Thread',dest='thread',type=int,metavar='thread')
parse.set_defaults(thread=32)
options,args=parse.parse_args()
# optparse.OptionParser usage=''介绍使用方式
# dest='host',传递参数到名为host的变量
# type='str',传递参数的类型
# metavar='host', help中参数后的名称
# help='',help中的语句
# parse.set_defaults(thread=32) 设置参数默认值的另一种方式
# 当你将所有的命令行参数都定义好了的时候,我们需要调用parse_args()方法add_option()函数依次传入的参数:options,args=parse.parse_args()
portList = options.port.split(",")
startPort = portList[0]
endPort = portList[1]
remote_server_ip = socket.gethostbyname(options.host)
# remote_server_info = socket.gethostbyname_ex(host)
ports = []
openPort = []
print '正在对目标:'+remote_server_ip + ' 进行 '+str(options.thread)+' 线程扫描'
socket.setdefaulttimeout(0.5)
def scan_port(port):
try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))
if res == 0:
openPort.append(port)
s.close()
except Exception,e:
print str(e.message)
for i in range(int(startPort),int(endPort)+1):
ports.append(i)
# 扫描开始
t1 = datetime.now()
# 创建线程
pool = ThreadPool(processes = int(options.thread))
results = pool.map(scan_port,ports)
pool.close()
pool.join()
print openPort
print '本次端口扫描共用时 ', datetime.now() - t1
Version 1.3 (gethostbyname_ex)
使用 gethostbyname_ex 函数获取目标的域名、ip 等信息
更新日志:
1、使用 gethostbyname_ex 函数实现对输入的域名进行解析
2、使用-D 参数传递域名,扫描器将对域名相关的 ip 进行端口扫描
3、对代码进行了模块化操作
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket,sys,optparse
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
print "------------------------------------------------------------------------------------------"
print "| ___ _ _ _ |"
print "| ___ ___ / _ ___ _ __ | |_| |_ _ _ _ __ ___ _ __| |_ ___ ___ __ _ _ __ |"
print "| / __/ _ | | | |/ _ | '_ | __| __| | | | | '_ / _ | '__| __/ __|/ __/ _` | '_ |"
print "| | (_| (_) | |_| | (_) | | | | |_| |_| |_| | | |_) | (_) | | | |___ (_| (_| | | | | |"
print "| ______/ ___/ ___/|_| |_|__|__|__, | | .__/ ___/|_| __|___/_____,_|_| |_| |"
print "| |___/ |_| |"
print "| Blog: https://co0ontty.github.io |"
print "------------------------------------------------------------------------------------------"
def Ip_scan_port(port):
socket.setdefaulttimeout(0.5)
remote_server_ip = socket.gethostbyname(Ip_target)
try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))
if res == 0:
openPort.append(port)
s.close()
except Exception,e:
print str(e.message)
def Domain_scan_port(port):
socket.setdefaulttimeout(0.5)
for remote_server_ip in Ip_from_domain:
try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))
if res == 0:
# Domain_res = str(remote_server_ip)+":"+str(port)
Domain_result.append(str(remote_server_ip)+":"+str(port))
s.close()
pass
except Exception as e:
print str(e.message)
def moreInfo(domainName):
global Ip_from_domain
Ip_from_domain = []
domainNames = socket.gethostbyname_ex(domainName)
print "[+]Start domain Scan"
for x in domainNames:
if type(x) == list:
for i in x:
print "Find : "+str(i)+"n"+" IP :"+str(socket.gethostbyname(i))
Ip_from_domain.append(socket.gethostbyname(i))
else:
Ip_from_domain.append(socket.gethostbyname(x))
Ip_from_domain = list(set(Ip_from_domain)) #去重
start_domain_pool()
def start_IP_Pool():
pool = ThreadPool(processes = int(thread))
results = pool.map(Ip_scan_port,ports)
pool.close()
pool.join()
print openPort
def start_domain_pool():
print "[+] Start portscan on those IP from "+str(startPort)+" to "+str(endPort)
pool = ThreadPool(processes = int(thread))
results = pool.map(Domain_scan_port,ports)
pool.close()
pool.join()
for x in Domain_result:
print "Find open port :"+str(x)
pass
def main():
parse=optparse.OptionParser(usage='python portscan.py -H 127.0.0.1 -P 60,90 -T 32 or python portscan.py -D www.baidu.com -P 60,90 -T 32 ',version="co0ontty portscan version:1.0")
parse.add_option('-H','--Host',dest='host',action='store',type=str,default="0")
parse.add_option('-P','--Port',dest='port',type=str,default='1,10000')
parse.add_option('-T','--Thread',dest='thread',type=int)
parse.add_option('-D','--Domain',dest='domainName',type=str,default="0")
parse.set_defaults(thread=32)
options,args=parse.parse_args()
global remote_server_ip,openPort,domainName,Ip_target,thread,openPort,ports,Domain_result,startPort,endPort
Ip_target = options.host
domainName = options.domainName
portList = options.port.split(",")
thread = options.thread
startPort = portList[0]
endPort = portList[1]
ports = []
openPort = []
Domain_result = []
for i in range(int(startPort),int(endPort)+1):
ports.append(i)
if domainName == "0":
print "[+]port scan :"+Ip_target
start_IP_Pool()
else:
moreInfo(domainName)
pass
if __name__ == '__main__':
main()
原创投稿作者:co0ontty
作者博客:co0ontty.github.io
- Java基础-18(02)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类
- 特殊的物化视图刷新 (r4笔记第77天)
- 通过单例模式模拟RAC连接 (r4笔记第76天)
- 网站上的验证码是怎么产生的?
- Java基础-17(01)总结,登录注册案例,Set集合,HashSet
- mongoDB初探第一篇(r4笔记第75天)
- 重温快速排序(r4笔记第73天)
- Java基础-17(01)总结,TreeSet,LinkHashSet
- 海量数据迁移之数据抽取流程 (r4笔记第72天)
- CSS Selectors Level 4新特性全面解析
- 巧用外部表避免大量的insert (r4笔记第71天)
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
- 16(01)总结List的子类,ArrayList,Vector,LinkedList
- 16(02)总结泛型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Java】15 File 类
- seaborn更高效的统计图表制作工具
- 牛客2019跨年AK场题解(一)
- qiankun proxySand 沙箱
- MATLAB 与 C 语言的混合编程实战之辛普森积分法、自适应辛普森积分
- Java那些事之JDK环境配置及集成开发环境Eclipse安装
- 敲代码、作诗、写论文无所不能?史上最大AI模型GPT-3霸榜Github
- 数据结构实验——校园导游 实现最小生成树+最短路
- Salesforce LWC学习(二十六) 简单知识总结篇三
- 【Java】13 异常
- 【Java】14 多线程
- 【Java】16 字节流
- 【Java】17 字符流
- 极坐标系在数据可视化中的巧妙运用
- 【Java】18 增强流