全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

使用Python3制作TCP端口扫描器

在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤。通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞。 TCP端口扫描一般分为以下几种类型:

TCP connect扫描:也称为全连接扫描,这种方式直接连接到目标端口,完成了TCP三次握手的过程,这种方式扫描结果比较准确,但速度比较慢而且可轻易被目标系统检测到。

TCP SYN扫描:也称为半开放扫描,这种方式将发送一个SYN包,启动一个TCP会话,并等待目标响应数据包。如果收到的是一个RST包,则表明端口是关闭的,而如果收到的是一个SYN/ACK包,则表示相应的端口是打开的。

Tcp FIN扫描:这种方式发送一个表示拆除一个活动的TCP连接的FIN包,让对方关闭连接。如果收到了一个RST包,则表明相应的端口是关闭的。

TCP XMAS扫描:这种方式通过发送PSH、FIN、URG、和TCP标志位被设为1的数据包。如果收到了一个RST包,则表明相应的端口是关闭的。

下面我们将使用Python3 实现TCP全连接端口扫描器,下面进入编程环节。

编码实战

全连接扫描方式的核心就是针对不同端口进行TCP连接,根据是否连接成功来判断端口是否打开,现在我们来实现一个最简单的端口扫描器:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *

def portScanner(host,port):
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    print('[+] %d open' % port)
    s.close()
  except:
    print('[-] %d close' % port)

def main():
  setdefaulttimeout(1)
  for p in range(1,1024):
    portScanner('192.168.0.100',p)

if __name__ == '__main__':
  main()

这段代码的核心就是portScanner函数,从其中的内容可以看出,只是进行了简单的TCP连接,如果连接成功则判断为端口打开,否则视为关闭。 我们来看一下运行结果:

这样的扫描看起来效率太低了,实际也确实很慢,因为我们设置了默认的超时时间为1秒,这要是扫描10000个端口,岂不是要等到花都谢了? 最简单的办法就是用多线程来提高效率,虽然python的多线程有点太弱了,不过至少可以利用我们等待的时间去干点别的。另外之前扫描的端口比较多, 显示的信息我们看起来不方便,这次我们只显示我们关心的打开的端口,并将打开端口的数量在扫描结束的时候显示出来。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
  global openNum
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    lock.acquire()
    openNum+=1
    print('[+] %d open' % port)
    lock.release()
    s.close()
  except:
    pass

def main():
  setdefaulttimeout(1)
  for p in range(1,1024):
    t = threading.Thread(target=portScanner,args=('192.168.0.100',p))
    threads.append(t)
    t.start()   

  for t in threads:
    t.join()

  print('[*] The scan is complete!')
  print('[*] A total of %d open port ' % (openNum))

if __name__ == '__main__':
  main()

运行看一下效果,如下图:

这下看起来是不是方便多了?至此效率上的问题解决了,现在我们还需要为扫描器增加一个 参数解析的功能,这样才能看起来像个样子,总不能每次都改代码来修改扫描目标和端口吧!

参数解析我们将用python3自带的标准模块argparse,这样我们就省去了自己解析字符串的麻烦! 下面来看代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading
import argparse

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
  global openNum
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    lock.acquire()
    openNum+=1
    print('[+] %d open' % port)
    lock.release()
    s.close()
  except:
    pass

def main():
  p = argparse.ArgumentParser(description='Port scanner!.')
  p.add_argument('-H', dest='hosts', type=str)
  args = p.parse_args()
  hostList = args.hosts.split(',')
  setdefaulttimeout(1)
  for host in hostList:
    print('Scanning the host:%s......' % (host))
    for p in range(1,1024):
      t = threading.Thread(target=portScanner,args=(host,p))
      threads.append(t)
      t.start()   

    for t in threads:
      t.join()

    print('[*] The host:%s scan is complete!' % (host))
    print('[*] A total of %d open port ' % (openNum))

if __name__ == '__main__':
  main()

看一下运行效果,如下图:

至此我们的端口扫描器就基本完成了,虽然功能比较简单,旨在表达端口扫描器的基本实现思路! 至于更详细的功能可以基于这个基本结构来逐步完善!

小结

本节主要讲解了Python3实现一个简单的端口扫描器的过程,本次实验采用了Tcp全连接的方式,不断尝试连接主机的端口来判断端口的开放情况,虽然存在一些缺点, 不过这种方式最适合初学者学习,至于更复杂的方式以后学习起来也不会很难。想举一反三的朋友可以根据协议和端口的对照关系来完成扫描时同时输出协议, 这样看起来会更好一些,至于更详细的功能就留给大家做练习了!


# python端口扫描器  # python  # 扫描器  # web目录扫描器  # Python3多线程版TCP端口扫描器  # Python写安全小工具之TCP全连接端口扫描器  # 的是  # 看一下  # 端口扫描  # 最简单  # 收到了  # 数据包  # 多线程  # 如下图  # 完成了  # 很难  # 设为  # 这段  # 我们可以  # 采用了  # 并将  # 只显示  # 这下  # 时间为  # 像个  # 可以看出 


相关文章: c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  制作公司内部网站有哪些,内网如何建网站?  代购小票制作网站有哪些,购物小票的简要说明?  贸易公司网站制作流程,出口贸易网站设计怎么做?  专业网站建设制作报价,网页设计制作要考什么证?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何在万网开始建站?分步指南解析  网站制作的步骤包括,正确网址格式怎么写?  制作网站的软件免费下载,免费制作app哪个平台好?  如何在橙子建站上传落地页?操作指南详解  建站VPS配置与SEO优化指南:关键词排名提升策略  家具网站制作软件,家具厂怎么跑业务?  制作网站的公司有哪些,做一个公司网站要多少钱?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何零基础开发自助建站系统?完整教程解析  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  如何基于云服务器快速搭建个人网站?  如何在IIS7上新建站点并设置安全权限?  实现虚拟支付需哪些建站技术支撑?  Android滚轮选择时间控件使用详解  如何实现建站之星域名转发设置?  Swift中循环语句中的转移语句 break 和 continue  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  网站制作企业,网站的banner和导航栏是指什么?  如何快速搭建响应式可视化网站?  如何在云指建站中生成FTP站点?  ,有什么在线背英语单词效率比较高的网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站之星×万网:智能建站系统+自助建站平台一键生成  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  宝塔建站后网页无法访问如何解决?  如何通过多用户协作模板快速搭建高效企业网站?  相册网站制作软件,图片上的网址怎么复制?  如何做网站制作流程,*游戏网站怎么搭建?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  简历在线制作网站免费,免费下载个人简历的网站是哪些?  建站主机选择指南:服务器配置与SEO优化实战技巧  如何用狗爹虚拟主机快速搭建网站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  jQuery 常见小例汇总  建站主机服务器选型指南与性能优化方案解析  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何挑选最适合建站的高性能VPS主机?  如何快速搭建高效WAP手机网站?  ,交易猫的商品怎么发布到网站上去?  如何快速上传自定义模板至建站之星?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  建站之星如何优化SEO以实现高效排名?  高防服务器租用指南:配置选择与快速部署攻略 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。