本文主要包括一下几部分:

  • 1.实现扫描器用到的socket方法
  • 2.实现一个简单的端口扫描
  • 3.开启线程加速
  • 4.命令行下的端口扫描器

1.端口扫描时用到的函数

import socket

gethostbyname()

# 传入hostname,比如www.bing.com,返回一个ipv4地址
# 传入一个ipv4地址仍返回这个地址
ipaddr = socket.gethostbyname('python.com')
print(ipaddr)
188.226.199.7

gethostbyaddr()

# 传入IPv4地址,返回包含主机名,备用主机名称列表以及主机上相同接口的IPV4地址列表的三元组。
socket.gethostbyaddr('202.165.102.205')
('UNKNOWN-202-165-102-X.yahoo.com', [], ['202.165.102.205'])

connect()

# 创建socket实例,通过connect()连接指定的ip地址和端口
# recv()方法接收返回的数据
socket.setdefaulttimeout(2)
# 创建实例,有三个可选参数
# family:[AF_INET, AF_INET6, AF_UNIX]
# type  :[SOCK_STREAM, SOCK_DGRAM],TCP:SOCK_STREAM; UDP:SOCK_DGRAM
# protocol:默认0
# 采用默认参数
s = socket.socket()
s.connect(('188.226.199.7',80))
# 读取套接字中的100B数据
# ans = s.recv(100)

2.TCP端口扫描器

import socket# 连接目标主机端口
def connectScan(tgtip, port):try:skt = socket.socket(AF_INET, SOCK_STREAM)skt.connect((tgtip, port))skt.send('today is a nice day.')recv = skt.recv(100)print('%d/TCP open'%port)print(str(recv))skt.close()except:print('%d/TCP close'%port)# hostname为字符串类型,port:整形列表
def portScan(hostname, ports):try:tgtIp = socket.gethostbyname(hostname)except:print('Cannot resolve %s:Unknown host'%hostname)socket.setdefaulttimeout(2)for port in ports:print('Scanning  '+tgtIp+' : '+str(port))connectScan(tgtIp, port)
portScan('iota.com', [80,21,22])
Scanning  206.188.193.56 : 80
80/TCP close
Scanning  206.188.193.56 : 21
21/TCP close
Scanning  206.188.193.56 : 22
22/TCP close

3.线程扫描
 
  在对大量的主机和端口进行扫描时,可以引入python线程,可以同时执行多个扫描任务,只用修改portScan()循环部分同时,还要引入信号量,来控制打印输出,在打印输出前,增加一个加锁操作.如果信号量未被锁,线程获得打印输出.如果锁定,要等待信号量释放后才能打印输出
 

import socket
import threading as th# 信号量
screenLock = th.Semaphore(value=1)def connectScan(tgtip, port):try:skt = socket.socket(AF_INET, SOCK_STREAM)skt.connect((hostname, port))skt.send('today is a nice day.')recv = skt.recv(100)# 加锁screenLock.acquire()print('%s : %d open'%(tgtip, port))print(str(recv))except:#加锁screenLock.acquire()print('%s : %d close'%(tgtip, port))finally:#解锁screenLock.release()# 会造成赋值之前引用的局部变量“skt”# skt.close()def portScan(hostname, ports):try:tgtIp = socket.gethostbyname(hostname)except:print('Cannot resolve %s:Unknown host'%hostname)socket.setdefaulttimeout(2)for port in ports:# 线程扫描t = th.Thread(target = connectScan, args = (tgtIp, port))t.start()
portScan('cowlevel.com',[20, 21, 22, 25, 80])
176.31.245.43 : 20 close
176.31.245.43 : 21 close
176.31.245.43 : 22 close
176.31.245.43 : 25 close
176.31.245.43 : 80 close

4.命令行下扫描端口
 
需要用到optparse库,解析命令行参数,调用optparse.OptionPaser([usage maessage])
生成一个参数解析器.通过add_option指定解析的命令行参数.
$ python portscan.py -H hostname.txt -P 20,21,22
考虑到对批量主机的扫描,第一个参数,hostname.txt是一个包含多个主机名的txt文件.
如下图所示:
     

import optparse
import socket
import threading as thscreenLock = th.Semaphore(value = 1)def connectScan(tgtip, port):try:skt = socket.socket(AF_INET, SOCK_STREAM)skt.connect((tgtip, port))skt.send('nice day/r/n')results = skt.recv(100)screenLock.acquire()print('[+] %17s : %d open '%(tgtip, port))print('[+] '+str(results))except:screenLock.acquire()print('[-] %17s : %d closed'%(tgtip, port))finally:screenLock.release()#skt.close()def portScan(hostname, ports):try:tgtIp = socket.gethostbyname(hostname)except:print('[-] Cannot resolve %s: Unknown host'%hostname)socket.setdefaulttimeout(2)for port in ports:t = th.Thread(target=connectScan, args=(tgtIp, int(port)))t.start()def main():parser = optparse.OptionParser('usage%prog -H <hostname.txt name> -P <target port>')parser.add_option('-H', dest='hostname', type='string')parser.add_option('-P', dest='port', type='string')(options, args) = parser.parse_args()hostname_txt_name = options.hostnameports = str(options.port).split(',')if (hostname_txt_name == None) | (ports[0] == None):print(parser.usage)exit(0)with open(hostname_txt_name,'r') as f:for hostname in f:portScan(hostname.strip('\n'), ports)
if __name__ == '__main__':main()

运行结果:
    

TCP端口扫描[Python3.5]相关推荐

  1. java 扫描tcp端口号_多线程TCP端口扫描 java实现

    界面部分: import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt. ...

  2. 需要额外端口信息_使用Python进行TCP端口扫描

    使用Python进行TCP端口扫描 首先我们供给一台主机,要进行的步骤就是对其主机端口的扫描,查看其中开放的端口. 我们创建一个TCP的全连接的扫描器,使用socket来创建连接器. 扫描端口开放 # ...

  3. 御剑高速TCP端口扫描工具

    鉴于CSDN平台想恰钱想疯了,连下载个软件也要付费/VIP 那我在这里就无私贡献出珍藏的--御剑高速TCP端口扫描工具 网址:百度网盘 请输入提取码 提取码:7fk6

  4. 基于TCP端口扫描技术

    基于TCP全开的端口扫描技术 TCP扫描基本概念 TCP端口扫描工具的编写 TCP扫描基本概念 首先介绍第一种扫描技术--TCP全开扫描.这种扫描的思想很简单,如果目标端口是开放的,那么在接到主机端口 ...

  5. Socket2实现tcp端口扫描

    主要的界面如下: 主要代码如下: 1 //对于每一个线程,传过去的参数 2 typedef struct ThreadParamStruct 3 { 4 CString strIP; //要扫描的IP ...

  6. Python3实现TCP端口扫描器

    本文来自 高海峰对 玄魂工作室 的投稿 作者:高海峰 QQ:543589796 在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可 ...

  7. 第七章(五)—主动信息收集—端口扫描(基于TCP全连接扫描、隐蔽扫描、僵尸扫描、UDP的端口扫描)

    `## 端口扫描 端口对应网络服务及应用端程序 服务端程序的漏洞通过端口攻入 发现开放的端口 更具体的攻击面 UDP端口扫描 向某一端口发送UDP数据包,如果目标ip给我一个ICMP prot-unr ...

  8. Kali Linux渗透测试之端口扫描(一)——UDP、TCP、隐蔽端口扫描、全连接端口扫描

    端口扫描 二.三.四层发现的目的就是发现存活的IP,在存活的IP上面,展开进一步的扫描,及端口扫描,发现存活主机上存在着哪些开放的端口,端口后面就对应着各种各样的应用程序,应用程序的漏洞都是通过端口体 ...

  9. Kali渗透测试之端口扫描1——UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 每个服务器上面都会跑很多应用,每个应用都会侦听某些端口,通过侦听端口接收来自客户端或其他用户对应用程序的访问.所以在发现目标主机存活后,我们需要知道目标主机上都开放了那些端口,应用程序的漏洞 ...

  10. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...

最新文章

  1. WinForm 曲线图控件
  2. 学习:双机热备、集群、负载均衡、SQL故障转移群集简单理解(转)
  3. css3让元素自适应高度
  4. Apache ZooKeeper - ZK的ACL权限控制( Access Control List )
  5. 【深度学习】Yolov5_DeepSort_Pytorch:基于 Yolov5 + Deep Sort 的实时多目标跟踪器
  6. SQL语句错误:Operand should contain 1 column(s)【查询多个字段不用加括号】
  7. 逻辑漏洞——权限控制问题
  8. 深入理解C语言——#define宏和枚举的区别
  9. windows下 , py运用了 进程池, 将py打包成exe,出现错误的 解决思路之一
  10. 学成在线--16.添加课程计划
  11. jsp----中文乱码
  12. SQL Server 2017 AlwaysOn AG 自动初始化(十六)
  13. 简单尝试windows多线程程序
  14. 区块链 Fisco bcos 智能合约(12)-Solidity的基础特性
  15. (10)Spring框架----AOP面向切面编程的实现原理
  16. 微信小程序-基于云开发 CMS + Vant Weapp 电商 Demo 来了!
  17. PHP:编写标准体重计算器
  18. OSChina 周五乱弹 ——妹子一不小心就被拖到小巷子里
  19. 单片机18b20c语言程序,单片机c语言ds18b20程序
  20. Subversive or Subclipse

热门文章

  1. 今天安利一个超牛叉的黑客入侵的特效网页,我第一次打开就被惊艳到了
  2. linux运行jar包依赖,linux怎么打jar包
  3. ajxa TypeError: $.ajax is not a function
  4. VS2015打开cshtml视图页文件报错 未将对象引用设置为实例 解决办法
  5. 优云automation实践技巧:简单4步完成自动化构建与发布
  6. leetcode 336. Palindrome Pairs
  7. 网页后门危害大 网站安全狗帮助查杀
  8. 看看这段代码有没有内存泄露?
  9. 使用 /proc 文件系统来控制系统
  10. 南阳oj-----Binary String Matching(string)