Python渗透系列——TCP扫描器

前言:

前两篇介绍了python多线程相关的知识,这一节将使用Python3编写TCP端口扫描器。
前文学习:
[python渗透测试自学篇]一、TCP扫描器之多线程:threading模块(1)
[python渗透测试自学篇]二、TCP扫描器之多线程:threading模块(2)

参考文献:
玄魂工作室-Python3实现TCP端口扫描器

编辑不易,转载请联系说明用途,并标记作者姓名和文章来源!


一、简介

端口扫描在渗透测试中是非常重要的,也是在信息收集中不可缺少的一部分。不同的端口扫描器,扫描采用的技术、扫描算法、扫描效果各不相同。

  • 根据扫描软件运行环境可以分为Unix/Linux系列扫描器Windows系列扫描器其它操作系统下扫描器
  • 根据扫描端口的数量可以分为多端口扫描器专一端口扫描器
  • 根据向用户提供的扫描结果可以分为只扫开关状态扫描漏洞两种扫描器。
  • 根据所采用的技术可以分为一般扫描器特殊扫描器

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包,则表明相应的端口是关闭的。

本章我们将学习TCP connect扫描(全连接扫描)。

需求

  1. 打开虚拟机随便一台机器即可,获取该机器的ip地址。有条件的可以用两台电脑也可以,但要ping的通。

二、简单的端口扫描

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);#重连1秒,如果没有就停止运行
    for p in range(1,1024):
        portScanner('192.168.154.131',p);

if __name__ == '__main__':
    main();
    
'''
--------------------------------------
运行结果:
[*] 1 close
[*] 2 close
[*] 3 close
[*] 4 close
[*] 5 close
[*] 6 close
[*] 7 close
[*] 8 close
[*] 9 close
[*] 10 close
[*] 11 close
[*] 12 close
[*] 13 close
[*] 14 close
[*] 15 close
[*] 16 close
[*] 17 close
[*] 18 close
[*] 19 close
[*] 20 close
[*] 21 close
[*] 22 open
'''

可以发现是按单个端口扫描的,这段代码的核心就是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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值