tcpポートスキャン(pythonマルチスレッド)
3930 ワード
1単一スレッドを使用した単一ホストのスキャン
まず、1台のホストの0-1024ポートのスキャンを実現し、1秒あたり1ポートをスキャンする差は少なく、遅いことが分かった.
2 マルチスレッドを使用した単一ホストのスキャン
以上のコードを実行すると、スレッド起動数の上限を超えたため、エラーが発生しました:RuntimeError:can't start new thread.
解決策は、最大ファイル記述子のオープン数を変更することです.
3マルチスレッドを使用した複数ホストのスキャン
上記の問題はまた発生し、655350に変更しても使用できるファイル記述子が足りない.結局、全体的なスキャンです.
解決策は、スレッド数を制限する信号threading.Semaphoreを追加することです.
転載先:https://www.cnblogs.com/jabbok/p/9696109.html
まず、1台のホストの0-1024ポートのスキャンを実現し、1秒あたり1ポートをスキャンする差は少なく、遅いことが分かった.
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()
転載先:https://www.cnblogs.com/jabbok/p/9696109.html