1 使用单线程扫描单台主机

首先实现的是对单台主机中0-1024端口的扫描,发现差不多每秒扫描一个端口,很慢。

import socket

def tcp_scanner(host,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
return True
except:
# print('connected to host %s,port %d failed' %(host,port))
return False if __name__ == '__main__':
host = "192.168.10.10"
for port in range(1024):
tcp_scanner(host,port)

  

2 使用多线程扫描单台主机

import threading,socket

def tcp_scanner(host,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
client.close()
return True
except:
# print('connected to host %s,port %d failed' %(host,port))
return False if __name__ == '__main__':
host = "192.168.10.10"
for port in range(1,1024):
th = threading.Thread(target=tcp_scanner,args=(host,port))
th.start()

  

在运行以上代码时,出现报错:RuntimeError: can't start new thread,原因是超过了线程启动数的上限。

解决办法是修改最大文件描述符打开数。

3 使用多线程扫描多台主机

import threading,socket,subprocess

def tcp_scanner(host,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
client.close()
return True
except:
# print('connected to host %s,port %d failed' %(host,port))
return False def main(): for i in range(2,255): # host = "10.224.32.%d" %i
host = "192.168.136.%d" %i
cmd = 'fping %s 1>/dev/null 2>&1;echo $?' %host
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
ret = int(p.stdout.read())
if ret == 0:
for port in range(1,4000):
th = threading.Thread(target=tcp_scanner,args=(host,port))
th.start()
else:
print('status of %s:False' %host) if __name__ == '__main__':
main()

  

上面的问题又出现了,可以用的文件描述符不够,即使改到655350。毕竟是全盘扫描。

解决办法是加信号threading.Semaphore,限制线程数

'''
create 2018/9/24
version 1.0
auth jabbok
info scan all the tcp port of the listed hosts by multithreading,to know is it listened
''' import threading,socket,subprocess,time screenLock = threading.Semaphore(value=1) def tcp_scanner(host,port): socket.setdefaulttimeout(1)
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
client.close()
screenLock.acquire()
return True except:
screenLock.acquire()
return False finally:
screenLock.release()
client.close() def main(): for i in range(2,255):
# host = "10.224.32.%d" %i
host = "192.168.136.%d" %i
cmd = 'fping %s 1>/dev/null 2>&1;echo $?' %host
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
ret = int(p.stdout.read()) if ret == 0:
for port in range(1,4000):
th = threading.Thread(target=tcp_scanner,args=(host,port))
th.start() else:
print('status of %s:False' %host) if __name__ == '__main__':
main()

  

tcp端口扫描(python多线程)的更多相关文章

  1. Python3实现TCP端口扫描

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

  2. tcp端口扫描与syn扫描

    连接网络设备时,一般都会在网络设备端选取0-65535之间的一个端口进行连接,端口扫描是指:检查网络设备上0-65535号端口哪些端口是开启状态.如果黑客扫描到某网络设备的80端口是开启状态,那么很有 ...

  3. Socket2实现tcp端口扫描

    主要的界面如下: 主要代码如下: //对于每一个线程,传过去的参数 typedef struct ThreadParamStruct { CString strIP; //要扫描的IP地址 UINT ...

  4. TCP端口扫描

    # TCP三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1 ...

  5. python端口扫描用多线程+线程安全的队列+Thread类实现

    用线程安全的队列Queue实现扫描端口数据存储 用多线程扫描端口 用Thread类实现程序组织 #coding:utf-8 import sys import socket import sys im ...

  6. TCP端口扫描类型-隐蔽扫描和僵尸扫描

    TCP扫描有三种类型:全连接扫描,隐蔽扫描,僵尸扫描.全连接扫描无须赘述. 隐蔽扫描:发送完SYN数据包以及收到SYN/ACK数据包后不再发送SCK数据包,由于没有建立完整的TCP连接,所以在目标主机 ...

  7. 简单高效的端口扫描python脚本

    欢迎python爱好者加入:学习交流群 667279387 最近为了获取虚拟机端口开放情况,写了一个简单脚本来查看.共享给大家.下面的代码在python2种测试通过 说明:concurrent是pyt ...

  8. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...

  9. portscaner 多线程、多协程并发端口扫描

    import socket,time,re,sys,os,threading import gevent from gevent import monkey monkey.patch_all() so ...

随机推荐

  1. 剑指Offer:调整数组顺序使奇数位于偶数前面【21】

    剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...

  2. 测试覆盖率Emma工具使用

    Emma使用与分析 #什么是Emma EMMA 是一个开源.面向 Java 程序测试覆盖率收集和报告工具.它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种 ...

  3. 找到bashrc

    (1)直接sudo gedit ~/.bashrc就可以了,编辑完后关闭就行 (2)主文件夹下ctrl+h就能找到.bashrc文件 之所以要找到bashrc文件,是为了把命令 source /opt ...

  4. Codeforces Round #398 (Div. 2) C. Garland —— DFS

    题目链接:http://codeforces.com/contest/767/problem/C 题解:类似于提着一串葡萄,用剪刀剪两条藤,葡萄分成了三串.问怎样剪才能使三串葡萄的质量相等. 首先要做 ...

  5. SpringMVC与Struts2区别与比较

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...

  6. hadoop 添加,删除节点

    http://www.cnblogs.com/tommyli/p/3418273.html

  7. Jquery form表单提交

    起因 由于项目中原先提交from是通过JavaScript指定action,在submit提交的,使用的方式,也不是很标准,造成除了ie之外的浏览器都不能正常的提交数据,做web项目还是要考虑到浏览器 ...

  8. BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量

    BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...

  9. [Codeforces 877E] Danil and a Part-time Job

    [题目链接] https://codeforces.com/contest/877/problem/E [算法] 首先求出这棵树的DFS序 一棵子树的DFS序为连续的一段 , 根据这个性质 , 用线段 ...

  10. eclipse 切换数据库

    PS:jdbc.url = 后面的路径就是连接的数据库,如果需要连接开发库(dev_cfin),则只需要将tg_cfin 换成 dev_cfin,重启后台即可.