使用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 相关文章推荐
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
django下创建多个app并设置urls方法
Aug 02 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
python 批量压缩图片的脚本
Jun 02 Python
python中的getter与setter你了解吗
Mar 24 Python
python图像处理 PIL Image操作实例
Apr 09 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
header导出Excel应用示例
2014/01/24 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
python实现贪吃蛇游戏
2020/03/21 Python
python实现支付宝转账接口
2019/05/07 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
通过Python实现一个简单的html页面
2020/05/16 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
劳动实践课感言
2014/02/01 职场文书
入党申请自荐书范文
2014/02/11 职场文书
小学庆六一活动方案
2014/02/28 职场文书
鸟的天堂导游词
2015/01/31 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL