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()