使用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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python最基本的输入输出详解
Apr 25 Python
关于Python 3中print函数的换行详解
Aug 08 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
Python发送邮件封装实现过程详解
May 09 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 Python
分享python函数常见关键字
Apr 26 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上传图片、删除图片实现代码
2010/05/12 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
python定位xpath 节点位置的方法
2019/08/27 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
个人求职信范文
2014/05/24 职场文书
嘉宾邀请函
2015/01/31 职场文书
小学中队活动总结
2015/05/11 职场文书
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS