**前書き: **
このスタディノートでは、pythonを使用してスキャンを記述し、pythonスキャナーの書き込みプロセス全体を記録し、コードの最初の行から最新バージョンまで記録し、各バージョンの更新で使用されるテクノロジーについて詳しく説明します。
バージョン1.0(ソケットライブラリ)
ポートスキャンにソケットライブラリを使用します。
更新ログ:
ソケット内のライブラリを呼び出してターゲットをスキャンし、ターゲットポートのオープンステータスをカウントします
#! /usr/bin/python
# - *- coding: UTF-8-*-import sys
from socket import*
# import socket
# ポートスキャンモジュール
def portScan(ip,portStart,portEnd):
open_ports=[]for port inrange(int(portStart),int(portEnd)+1):
# スキャンパーセンテージを表示
percent =float(port)*100/float(int(portEnd))
sys.stdout.write("%.2f"%percent)
sys.stdout.write("%\r")
sys.stdout.flush()
# データを送信し、接続を確立してみてください
sock =socket(AF_INET, SOCK_STREAM)
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
result = sock.connect_ex((ip,port))if result ==0:
open_ports.append(port)
pass
print open_ports
pass
# IPとポートのスキャン範囲を取得する
def main():
ip = sys.argv[1]
port = sys.argv[2].split("-")
portStart = port[0]
portEnd = port[1]portScan(ip,portStart,portEnd)if __name__ =='__main__':main()
バージョン1.1(スレッドプールマルチスレッド)
マルチスレッドポートスキャンにスレッドプールを使用します。
更新ログ:
pythonでThreadpoolモジュールを呼び出し、マルチスレッドとマルチターゲットのポートをスキャンするように設定し、スキャンの効率を高めます
#! /usr/bin/python
# - *- coding: UTF-8-*-import socket
import sys
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
remote_server = sys.argv[1]
targetport = sys.argv[2].split("-")
startPort = targetport[0]
endPort = targetport[1]
remote_server_ip = socket.gethostbyname(remote_server)
ports =[]
print '-'*60
print 'ターゲティング:', remote_server_ip +'スキャンするには'
print '-'*60
socket.setdefaulttimeout(0.5)
def scan_port(port):try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))if res ==0: #ポートが開いている場合は、helloを送信してバナーを取得します
print 'Port {}: OPEN'.format(port)
s.close()
except Exception,e:
print str(e.message)for i inrange(int(startPort),int(endPort)+1):
ports.append(i)
# Check what time the scan started
t1 = datetime.now()
# スレッドを作成する
pool =ThreadPool(processes =32) #スレッド数を設定する
results = pool.map(scan_port,ports) #マルチスレッドを使用する必要がある関数の名前を設定し、パラメーターのセットを渡します。関数は、渡されたパラメーターのセットをセクションで関数に渡します。
pool.close()
pool.join()
print 'このポートスキャンが共有される場合', datetime.now()- t1
デモ:
バージョン1.2(optparseライブラリ)
optparseを使用してpythonプロセスのコマンドを解析します
更新ログ:
スクリプトの実行プロセスで「–host」およびその他のメソッドを使用してパラメータ名を指定するには、pythonのoptparseライブラリを呼び出します
#! /usr/bin/python
# - *- coding: UTF-8-*-import optparse
import socket
import sys
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
print "------------------------------------------------------------------------------------------"
print "| ___ _ _ _ |"
print "| ___ ___ / _ \ ___ _ __ | |_| |_ _ _ _ __ ___ _ __| |_ ___ ___ __ _ _ __ |"
print "| / __/ _ \| | | |/ _ \| '_ \| __| __| | | | | '_ \ / _ \| '__| __/ __|/ __/ _` | '_ \ |"
print "| | (_| (_) | |_| | (_) | | | | |_| |_| |_| | | |_) | (_) | | | |_\__ \ (_| (_| | | | | |"
print "| \___\___/ \___/ \___/|_| |_|\__|\__|\__, | | .__/ \___/|_| \__|___/\___\__,_|_| |_| |"
print "| |___/ |_| |"
print "------------------------------------------------------------------------------------------"
parse=optparse.OptionParser(usage='python portscan.py -H 127.0.0.1 -P 60,90 -T 32',version="co0ontty portscan version:1.2")
parse.add_option('-H','--Host',dest='host',action='store',type=str,metavar='host',help='Enter Host!!')
parse.add_option('-P','--Port',dest='port',type=str,metavar='port',default='1,10000',help='Enter Port!!')
parse.add_option('-T','--Thread',dest='thread',type=int,metavar='thread')
parse.set_defaults(thread=32)
options,args=parse.parse_args()
# optparse.OptionParser usage=''使い方を紹介します
# dest='host',hostという名前の変数にパラメーターを渡します
# type='str',渡されるパラメーターのタイプ
# metavar='host',ヘルプのパラメータの後の名前
# help=''、ヘルプのステートメント
# parse.set_defaults(thread=32)パラメータのデフォルト値を設定する別の方法
# すべてのコマンドラインパラメータを定義したら、parseを呼び出す必要があります_args()メソッド追加_option()関数によって順番に渡されるパラメーター:オプション,args=parse.parse_args()
portList = options.port.split(",")
startPort = portList[0]
endPort = portList[1]
remote_server_ip = socket.gethostbyname(options.host)
# remote_server_info = socket.gethostbyname_ex(host)
ports =[]
openPort =[]
print 'ターゲティング:'+remote_server_ip +'乗る'+str(options.thread)+'スレッドスキャン'
socket.setdefaulttimeout(0.5)
def scan_port(port):try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))if res ==0:
openPort.append(port)
s.close()
except Exception,e:
print str(e.message)for i inrange(int(startPort),int(endPort)+1):
ports.append(i)
# スキャン開始
t1 = datetime.now()
# スレッドを作成する
pool =ThreadPool(processes =int(options.thread))
results = pool.map(scan_port,ports)
pool.close()
pool.join()
print openPort
print 'このポートスキャンが共有される場合', datetime.now()- t1
Version 1.3 (gethostbyname_ex)
gethostbyname_ex関数を使用して、ターゲットのドメイン名、IP、およびその他の情報を取得します
更新ログ:
1、 gethostbyname_ex関数を使用して、入力したドメイン名を解決します
2、 -Dパラメーターを使用してドメイン名を渡すと、スキャナーはドメイン名に関連するIPでポートスキャンを実行します
3、 コードをモジュール化
#! /usr/bin/python
# - *- coding: UTF-8-*-import socket,sys,optparse
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool
print "------------------------------------------------------------------------------------------"
print "| ___ _ _ _ |"
print "| ___ ___ / _ \ ___ _ __ | |_| |_ _ _ _ __ ___ _ __| |_ ___ ___ __ _ _ __ |"
print "| / __/ _ \| | | |/ _ \| '_ \| __| __| | | | | '_ \ / _ \| '__| __/ __|/ __/ _` | '_ \ |"
print "| | (_| (_) | |_| | (_) | | | | |_| |_| |_| | | |_) | (_) | | | |_\__ \ (_| (_| | | | | |"
print "| \___\___/ \___/ \___/|_| |_|\__|\__|\__, | | .__/ \___/|_| \__|___/\___\__,_|_| |_| |"
print "| |___/ |_| |"
print "| Blog: https://co0ontty.github.io |"
print "------------------------------------------------------------------------------------------"
def Ip_scan_port(port):
socket.setdefaulttimeout(0.5)
remote_server_ip = socket.gethostbyname(Ip_target)try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))if res ==0:
openPort.append(port)
s.close()
except Exception,e:
print str(e.message)
def Domain_scan_port(port):
socket.setdefaulttimeout(0.5)for remote_server_ip in Ip_from_domain:try:
s = socket.socket(2,1)
res = s.connect_ex((remote_server_ip,port))if res ==0:
# Domain_res =str(remote_server_ip)+":"+str(port)
Domain_result.append(str(remote_server_ip)+":"+str(port))
s.close()
pass
except Exception as e:
print str(e.message)
def moreInfo(domainName):
global Ip_from_domain
Ip_from_domain =[]
domainNames = socket.gethostbyname_ex(domainName)
print "[+]Start domain Scan"for x in domainNames:iftype(x)== list:for i in x:
print "Find : "+str(i)+"\n"+" IP :"+str(socket.gethostbyname(i))
Ip_from_domain.append(socket.gethostbyname(i))else:
Ip_from_domain.append(socket.gethostbyname(x))
Ip_from_domain =list(set(Ip_from_domain)) #重複排除
start_domain_pool()
def start_IP_Pool():
pool =ThreadPool(processes =int(thread))
results = pool.map(Ip_scan_port,ports)
pool.close()
pool.join()
print openPort
def start_domain_pool():
print "[+] Start portscan on those IP from "+str(startPort)+" to "+str(endPort)
pool =ThreadPool(processes =int(thread))
results = pool.map(Domain_scan_port,ports)
pool.close()
pool.join()for x in Domain_result:
print "Find open port :"+str(x)
pass
def main():
parse=optparse.OptionParser(usage='python portscan.py -H 127.0.0.1 -P 60,90 -T 32 or python portscan.py -D www.baidu.com -P 60,90 -T 32 ',version="co0ontty portscan version:1.0")
parse.add_option('-H','--Host',dest='host',action='store',type=str,default="0")
parse.add_option('-P','--Port',dest='port',type=str,default='1,10000')
parse.add_option('-T','--Thread',dest='thread',type=int)
parse.add_option('-D','--Domain',dest='domainName',type=str,default="0")
parse.set_defaults(thread=32)
options,args=parse.parse_args()
global remote_server_ip,openPort,domainName,Ip_target,thread,openPort,ports,Domain_result,startPort,endPort
Ip_target = options.host
domainName = options.domainName
portList = options.port.split(",")
thread = options.thread
startPort = portList[0]
endPort = portList[1]
ports =[]
openPort =[]
Domain_result =[]for i inrange(int(startPort),int(endPort)+1):
ports.append(i)if domainName =="0":
print "[+]port scan :"+Ip_target
start_IP_Pool()else:moreInfo(domainName)
pass
if __name__ =='__main__':main()
元の寄稿者:co0ontty
著者のブログ:co0ontty.github.io