実際の戦闘| Python書き込みポートスキャナー

**前書き: **

このスタディノートでは、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

Recommended Posts

実際の戦闘| Python書き込みポートスキャナー
Python書き込みTetris
pythonでguiを書く
Pythonオープン読み取りおよび書き込み
Pythonマルチスレッドポートスキャンツール
pythonはダウンロードソフトウェアをコンパイルします