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. 作业:xml练习2-写.xml的外部约束文件(dtd文件)

    写外部DTD: 步骤: 1.在srd目录下新建DTD文件,并命名为:scores.dtd 2.在练习1的基础上,剪切练习1的DTD内部声明.粘贴到一个新建的DTD文件中.剪切之后的地方换上:包含外部D ...

  2. Android Studio中的“favorites”和“bookmark”

    做项目难免来回查看某个文件的某个方法,某些文件可能访问率很高, 为了加快开发效率楼主推荐使用favorites (文件)bookmark (代码 行). favorites 的添加就在文件单击右键ad ...

  3. Object.prototype.constructor

    Returns a reference to the Object function that created the instance's prototype. 注意这个属性的值是函数本省的引用,而 ...

  4. javaScrpit中NaN的秘密

    NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱, 一些操作会导致NaN值的产生.这里有些例子: Math.sqrt(- ...

  5. 【整理】XOR:从陌生到头晕

    一:解决XOR常用的方法: 在vjudge上面输入关键词xor,然后按照顺序刷了一些题. 然后大概悟出了一些的的套路: 常用的有贪心,主要是利用二进制的一些性质,即贪心最大值的尽量高位取1. 然后有前 ...

  6. Update 出现在的问题

    报错提示:之前的操作没有完成,运行deanup被打断,请先执行Cleanup方法. 正常右键点击Cleanup,如果只让默认值勾选,可能还是会报这个错.所以正确操作如下: 全部选中再点击OK,这样就可 ...

  7. AtCoder Grand Contest 014 E:Blue and Red Tree

    题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_e 题目翻译 有一棵有\(N\)个点的树,初始时每条边都是蓝色的,每次你可以选择一条由蓝色边构 ...

  8. 解决最近windows版本Node.js中npm出现的“Error: ENOENT, stat 'C:\Users\UserName\AppData\Roaming\npm”的问题

    (转载请注明出处,from www.cnblogs.com/xdxer) 问题可能如下所示 解决方案: 在 'C:\Users\UserName\AppData\Roaming\‘ 下手动的增加一个文 ...

  9. 【旧文章搬运】ntfs中的文件名排序规则~

    原文发表于百度空间,2011-04-05========================================================================== 在分析nt ...

  10. 4.oracle正确卸载步骤

    oracle 11g如何完全卸载 方法/步骤1: 停用oracle服务:进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止 方法/步骤2: 在开始菜单中,找到oracle-> ...