使用Python3制作TCP端口扫描器


Posted in Python onApril 17, 2017

在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤。通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞。 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连接,如果连接成功则判断为端口打开,否则视为关闭。 我们来看一下运行结果:

使用Python3制作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制作TCP端口扫描器

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

参数解析我们将用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端口扫描器

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

小结

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

Python 相关文章推荐
在Python中使用HTML模版的教程
Apr 29 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
Python之py2exe打包工具详解
Jun 14 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
Pytorch释放显存占用方式
Jan 13 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
python中类与对象之间的关系详解
Dec 16 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 #Python
Python的时间模块datetime详解
Apr 17 #Python
Python中标准模块importlib详解
Apr 16 #Python
Python 实现随机数详解及实例代码
Apr 15 #Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 #Python
Python生成随机数组的方法小结
Apr 15 #Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 #Python
You might like
php实现的在线人员函数库
2008/04/09 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
javascript call方法使用说明
2010/01/11 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
vue小白入门教程
2018/04/02 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
文员岗位职责
2013/11/09 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
公司授权委托书
2014/10/17 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技