前两篇介绍了python多线程相关的知识,这一节将使用Python3编写TCP端口扫描器。
前文学习:
[python渗透测试自学篇]一、TCP扫描器之多线程:threading模块(1)
[python渗透测试自学篇]二、TCP扫描器之多线程:threading模块(2)
参考文献:
玄魂工作室-Python3实现TCP端口扫描器
编辑不易,转载请联系说明用途,并标记作者姓名和文章来源!
端口扫描在渗透测试中是非常重要的,也是在信息收集中不可缺少的一部分。不同的端口扫描器,扫描采用的技术、扫描算法、扫描效果各不相同。
TCP端口分类:
本章我们将学习TCP connect扫描(全连接扫描)。
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()