1.编写一个端口扫描器:代码见文末尾
2.实现思路
(1).实现一个完整的TCP握手作为tcp端口是否开放的判断依据
(2).给定一个ip和端口列表进行判断端口是否开放,开放则加入列表中
(3).利用多线程实现高性能扫描,利用信号量防止线程冲突导致打印结果混乱
主要调用模块:
import optparse
from socket import *
from threading import *
socket模块常用于TCP端口连接
threading 模块用于线程处理
optparse 模块用于解析参数选项,如:
python xxx.py <-r file> <>即为参数解析
设计了两个函数
def connport(tHost,tPort): #与端口建立连接
def scanport(tHost,tPorts): #扫描主机的端口列表
线程的使用方法:
for tPort in tPorts:
# print '[*] scanning Port %d'%tPort 出现了神奇的BUG
t = Thread(target=connport, args=(tHost,int(tPort)))
t.start()
2.编写一个调用Nmap工具的脚本:代码
主要调用模块
import nmap
import optparse
from threading import *
from socket import *
其中Nmap 模块并非是python的内置库
主要函数
def nmapScan(tHost,tPort):
def main():
3.复习思考
1.TCP端口扫描:
完整的TCP扫描使用操作系统原生网络功能不能实现底层控制,因此这种扫描方式并不流行。并且TCP扫描很容易被发现,尤其作为端口清扫的手段:这些服务会记录发送者的IP地址
2.利用ip连接:result = sock.connect_ex((target_ip, port))
利用主机名连接:result = sock.connect((target_host, port))
主机名除了web服务器比较好获取,其他都难找到
python-namp包:
https://xael.org/pages/python-nmap-en.html
利用dns的api接口可以将ip进行反向解析。
可以导入dns模块
3.可以考虑尝试常用服务端口扫描后,对开放相应端口的主机进行漏洞检测(即是否符合banner),如果有,实施攻击(down机,蓝屏,等)。
#!/usr/bin/python
# coding: utf-8
import nmap
import optparse
from threading import *
from socket import *
def nmapScan(tHost,tPort):
nmscan = nmap.PortScanner()
nmscan.scan(tHost,tPort)
state = nmscan[tHost]['tcp'][int(tPort)]['state']
print '[*] '+str(tHost) + 'tcp/' +str(tPort)+' '+str(state)
def main():
parser = optparse.OptionParser('usage%prog'+' -H <target Host> -p <target Port>')# 参数解析
parser.add_option('-H',dest='Host',type='string',help='specify Host')
parser.add_option('-p',dest='Port',type='string',help='specify Port')
(options, args) = parser.parse_args() #参数和parser实例建立联系
tHost = gethostbyname(options.Host)
tPorts = str(options.Port).split(',')
if(tHost == None) | (tPorts == None):
print 'please input your Host and Port'
exit(0)
setdefaulttimeout(1)
for tPort in tPorts:
nmapScan(tHost,tPort)
if __name__ == '__main__':
main()