本文来自 高海峰对 玄魂工作室 的投稿

作者:高海峰 QQ:543589796

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

  1. TCP connect扫描:也称为全连接扫描,这种方式直接连接到目标端口,完成了TCP三次握手的过程,这种方式扫描结果比较准确,但速度比较慢而且可轻易被目标系统检测到。
  2. TCP SYN扫描:也称为半开放扫描,这种方式将发送一个SYN包,启动一个TCP会话,并等待目标响应数据包。如果收到的是一个RST包,则表明端口是关闭的,而如果收到的是一个SYN/ACK包,则表示相应的端口是打开的。
  3. Tcp FIN扫描:这种方式发送一个表示拆除一个活动的TCP连接的FIN包,让对方关闭连接。如果收到了一个RST包,则表明相应的端口是关闭的。
  4. 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 threadinglock = threading.Lock()
openNum = 0
threads = []def portScanner(host,port):global openNumtry:s = socket(AF_INET,SOCK_STREAM)s.connect((host,port))lock.acquire()openNum+=1print('[+] %d open' % port)lock.release()s.close()except:passdef 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 argparselock = threading.Lock()
openNum = 0
threads = []def portScanner(host,port):global openNumtry:s = socket(AF_INET,SOCK_STREAM)s.connect((host,port))lock.acquire()openNum+=1print('[+] %d open' % port)lock.release()s.close()except:passdef 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全连接的方式,不断尝试连接主机的端口来判断端口的开放情况,虽然存在一些缺点, 不过这种方式最适合初学者学习,至于更复杂的方式以后学习起来也不会很难。想举一反三的朋友可以根据协议和端口的对照关系来完成扫描时同时输出协议, 这样看起来会更好一些,至于更详细的功能就留给大家做练习了!

查看完整系列教程,请关注我的微信订阅号(xuanhun521,下方二维码),回复“python”。问题讨论请加qq群:Hacking (1群):303242737   Hacking (2群):147098303。

玄魂工作室-精彩不断

转载于:https://www.cnblogs.com/xuanhun/p/5950433.html

Python3实现TCP端口扫描器相关推荐

  1. 【Python黑帽子】——搭建TCP端口扫描器

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:一切为了她 座右铭:不要让时代的悲哀成为你的悲哀 专研方向:网络安全,数据结构 每日emo:唯有信仰与日月亘古不变 经过一段时间pyth ...

  2. Shell脚本之TCP端口扫描器

    一.需求说明   有时候系统故障我们需要验证局域网内的主机是否开放某个端口:又或者互联网报到某软件漏洞涉及到某个端口,我们需要批量检查局域网中哪些主机开放了此端口:又或者我们需要检查指定列表主机都开放 ...

  3. 用Python3实现端口扫描器

    Python3 端口扫描器 用python3 实现 connect syn udp扫描 话不多说,直接上代码 1.connect.py #!/usr/bin/python3 # -*- coding: ...

  4. 【Python脚本进阶】2.1、端口扫描器(上):TCP全连接扫描

    目录 一.简介 1.1.基础: 1.2.TCP: 二.TCP全连接扫描 2.1.简介: 2.2.函数: 2.3.实现: 第一步:获得主机名和端口 第二步: connScan和portScan函数 第三 ...

  5. TCP编程——端口扫描器与网游客户端

    文章目录 一.端口扫描器程序 1.1.单线程 1.2.多线程 一.端口扫描器程序 1.1.单线程 1.创建工程 选择类型 设置界面 代码 using System; using System.Coll ...

  6. [Python黑帽] 三.编程实现IP及端口扫描器、实现多线程C段扫描器

    Python黑帽第三篇文章将分享网络扫描基础知识,编程实现IP及端口扫描器.实现多线程C段扫描器.本文参考了<Python绝技>书籍和i春秋ADO老师的课程内容,这里真心推荐大家去学习ic ...

  7. 3. Port scanners (端口扫描器 4个)

    3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现("ping扫描")和端口扫描. 旧的2.x版本只有Windo ...

  8. 实例探究Python以并发方式编写高性能端口扫描器的方法

    来源:http://www.jb51.net/article/86615.htm 关于端口扫描器 端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具.常被计算机管理员用于 ...

  9. 使用python-nmap 搭建基本端口扫描器

    代码地址如下: http://www.demodashi.com/demo/13255.html 一.前言 注意: 本文相关教程仅供个人学习使用,切勿用于非法用途,否则造成的相关损失及影响,作者不承担 ...

最新文章

  1. 还不懂spring IOC核心原理?200行代码带你手撸一个
  2. C语言输入一行整数(OJ输入格式)
  3. Groovy开发语言
  4. 红盟php 解密,php教程_神盾加密解密教程(一)PHP变量可用字符
  5. 传统网站与Web标准——表格布局实例
  6. 亚马逊专家课 | 数据体系+用户画像+商品画像系列课(立省 299 元)
  7. ubuntu nfs
  8. python在哪些控制结构中使用else保留字_python的程序控制结构-循环结构与random库使用和圆周率案例--pyt...
  9. 一文学会,胶位偏移、缺胶、断胶、溢胶检测
  10. Linux命令常用大全
  11. java -super关键字
  12. 最全面的linux网站
  13. 【OCM】Oracle OCM11g考场合影~keep人生中重要时刻
  14. 加速晶圆代工业务创新 开创智能互联世界
  15. 服务器向客户端发送数据自动中断
  16. SHA1hash算法C语言实现
  17. JESD204B协议基础知识
  18. 面试官问“你还有什么需要了解的吗”——应该这样回答
  19. 魅族系统怎么无需root激活Xposed框架的经验
  20. 什么是串口通信UART?

热门文章

  1. Java获得随机数字
  2. Java的包裹wrap
  3. python——模块
  4. 求斐波那契数列前n项的值
  5. 《X86汇编语言:从实模式到保护模式》读书笔记之引言
  6. JVM逃逸分析(同步省略、标量替换、栈上分配)
  7. Understanding Ethereum Smart Contracts
  8. All of Recurrent Neural Networks (RNN)
  9. 生成对抗网络(GAN)相比传统训练方法有什么优势?(一)
  10. Hyperledger Fabric 1.0 实例简析 第一课 network_setup.sh分析