サービスID

序文

ペネトレーションテストのプロセスでは、サービスの識別は非常に重要な部分です。侵入者の場合、ターゲットで実行されているこれらのサービスを検出すると、ソフトウェアの脆弱性を使用してターゲットに侵入できます。ネットワークセキュリティメンテナの場合、システムの脆弱性を事前に検出して、これらの侵入を防ぐこともできます。多くのソフトウェアは接続後に独自の情報を示すバナーを提供するため、取得したバナー情報に基づいて実行中のサービスの種類を判断し、開いているポートに対応するサービスの種類とバージョン番号を判別できます。

ファイル共有サービスポート

ポート番号 説明 効果
21/22/69 FTP / TFTP 匿名のアップロード、ダウンロード、クラッキング、盗聴攻撃を許可する
2049 NFSサービス 不適切な構成
139 Sambaサービス クラッキング、不正アクセス、リモートコード実行
389 LDAP(ディレクトリアクセスプロトコル) 挿入、匿名アクセスの許可、脆弱なパスワードの使用

リモート接続サービスポート

ポート番号 説明 効果
22 SSHリモート接続 クラッキング、SSHトンネルおよびイントラネットプロキシ転送、ファイル転送
23 Telnetリモート接続 クラッキング、スニッフィング、弱いパスワード
3389 Rdpリモートデスクトップ接続 バックドアのシフト(Windows Server 2003より下のシステムが必要)、クラック
5900 VNC 弱いパスワードクラッキング
5632 PyAnywhereサービス パスワードの取得、コードの実行

Webアプリケーションサービスポート

ポート番号 説明 効果
80/443/8080 共通のWebサービスポート Web攻撃、クラック、サーバーバージョンの脆弱性
7001/7002 WebLogicコンソール Javaの逆シリアル化、弱いパスワード
8080/8089 Jboss / Resin / Jetty / JenKins 逆シリアル化、弱いコンソールパスワード
9090 WebSphereコンソール Javaの逆シリアル化、弱いパスワード
4848 GlassFishコンソール 弱いパスワード
1352 LotusDominoメールサービス 弱いパスワード、情報漏えい、クラッキング
10000 Webmin-Webコントロールパネル 弱いパスワード

データベースサービスポート

ポート番号 説明 効果
3306 MySQL 注入、権利の引き上げ、クラック
1433 MSSQL インジェクション、特権昇格、弱いSAパスワード、クラッキング
1521 Oracleデータベース TNSクラッキング、インジェクション、リバウンドシェル
5432 PostgreSQLデータベース パスワードの解読、挿入、脆弱性
27017/27018 MongoDB クラッキング、不正アクセス
6379 Redisデータベース 不正アクセス、弱いパスワードクラッキングを試すことができます
5000 SysBase / DB2 クラック、注入

メールサービスポート

ポート番号 説明 効果
25 SMTPメールサービス メール偽造
110 POP3プロトコル クラッキング、スニッフィング
143 IMAPプロトコル 亀裂

共通のネットワークプロトコルポート

ポート番号 説明 効果
53 DNSドメインネームシステム ゾーン転送、DNSハイジャック、キャッシュポイズニング、スプーフィングを許可する
67/68 DHCPサービス ハイジャック、不正行為
161 SNMPプロトコル ターゲットイントラネット情報をクラックして収集する

特別サービスポート

ポート番号 説明 効果
2181 Zookeeper 不正アクセス
8069 Zabbixサービス リモート実行、SQLインジェクション
9200/9300 Elasticsearch リモート実行
11211 Memcacheサービス 不正アクセス
512/513/514 LinuxRexecサービス クラック、Rloginログイン
873 Rsyncサービス 匿名アクセス、ファイルアップロード
3690 SVNサービス SVNリーク、不正アクセス
50000 SAP管理コンソール リモート実行

コード表示

プログラムで使用されるモジュールとSIGNSフィンガープリントライブラリをインポートします

from optparse import OptionParser
import time
import socket
import re

SIGNS = (
    # 协议 | 版本 | 关键字
    #b" "前缀表示:后面字符串是bytes 类型
    #用处:网络编程中,服务器和浏览器只认bytes 类型数据
    b'FTP|FTP|^220.*FTP',
    b'MySQL|MySQL|mysql_native_password',
    b'oracle-https|^220- ora',
    b'Telnet|Telnet|Telnet',
    b'Telnet|Telnet|^\r\n%connection closed by remote host!\x00$',
    b'VNC|VNC|^RFB',
    b'IMAP|IMAP|^\* OK.*?IMAP',
    b'POP|POP|^\+OK.*?',
    b'SMTP|SMTP|^220.*?SMTP',
    b'Kangle|Kangle|HTTP.*kangle',
    b'SMTP|SMTP|^554 SMTP',
    b'SSH|SSH|^SSH-',
    b'HTTPS|HTTPS|Location: https',
    b'HTTP|HTTP|HTTP/1.1',
    b'HTTP|HTTP|HTTP/1.0',
)

timeモジュールは主に遅延時間を生成するために使用され、optparseモジュールはコマンドラインパラメータを生成するために使用され、socketモジュールはTCP要求を生成するために使用され、reモジュールは正規表現モジュールであり、指紋情報を効果的に照合してサービスタイプを決定します。SIGNSこれは、ターゲットホストから返されるバナー情報を照合するために使用されるフィンガープリントライブラリです。

次に、optparseモジュールを使用して、入力パラメーターを受信して​​バッチ処理します

def main():
    parser = OptionParser("Usage: %prog -i <target host>")
    parser.add_option('-i',type='string',dest='IP',help='specify target host')
    #获取IP地址参数
    parser.add_option('-p',type='string',dest='PORT',help='specify target host')
    options,args = parser.parse_args()
    ip = options.IP
    port = options.PORT
    print("Scan report for " +ip+ "\n")
    for line in port.split(','):
        request(ip,line)
        time.sleep(0.2)
    print("\nScan finished!...\n")

私たちは、request最初の呼び出しsock.connect()のターゲットホストポートが開いているかどうかを検出する機能で関数を、ポートが開いている場合は、使用sock.sendall()送信する機能をPROBEターゲットポートにプローブを。sock.recv()この関数は、返されたフィンガープリント情報を受信し、フィンガープリント情報とポートをregex()関数に送信するために使用されます。

def request(ip,port):
    response = ''
    PROBE = 'GET / HTTP/1.0\r\n\r\n'
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.settimeout(10)
    result = sock.connect_ex((ip,int(port)))
    if result == 0:
        try:
            sock.sendall(PROBE.encode())
            response = sock.recv(256)
            if response:
                regex(response,port)
        except(ConnectionResetError,socket.timeout):
            pass
    else:
        pass
    sock.close()

re.search()関数を使用して、返されたバナー情報とSIGNSに含まれる指紋情報を定期的に照合し、照合した結果を出力します。そうでない場合は、Unrecongnizedを出力します。

def regex(response,port):
    text = ""
    if re.search(b'<title>502 Bad Gateway',response):
        proto = {
    
    "Service failed to access!!"}
    for pattern in SIGNS:
        pattern = pattern.split(b'|')
        if re.search(pattern[-1], response, re.IGNORECASE):
            proto = "["+port+"]" + " open " + pattern[1].decode()
            break
        else:
            proto = "["+port+"]" + " open " + "Unrecongnized"
    print(proto)

最後に、main関数を記述します

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("interrupted by user, killing all threads...")

その効果を下図に示します。
ここに画像の説明を挿入します
これはNmapバージョンであり、nmapのスキャン速度は比較的高速です。

import nmap
import optparse

def NmapScan(targetIP,targetPort):
    #实例化PortScanner对象
    nm = nmap.PortScanner()
    try:
        #host为目标IP地址,arguments为Nmap的扫描参数
        #-sn:使用ping进行扫描
        #-PE:使用ICMP的echo请求包(-PP:使用timestamp请求包 -PM:network请求包)
        result = nm.scan(hosts=targetIP,arguments='-sV -p'+str(targetPort))
        #对结果进行切片,提取主机状态信息
        port_infor = result['scan'][targetIP]['tcp'][int(targetPort)]
        print("[{}:{}] : [{}:{}]".format(targetPort,port_infor['state'],port_infor['name'],port_infor['product']))
    except Exception as e:
        pass

if __name__ == '__main__':
	parser = optparse.OptionParser('usage: python %prog -i ip -p port\n\n'
                                    'Example: python %prog -i 192.168.1.1 -p 80,3306\n')
	# 添加目标IP参数-i
	parser.add_option('-i','--ip',dest='targetIP',default='192.168.1.1',type='string',help='target ip address')
	# 添加扫描端口参数-p
	parser.add_option('-p','--port',dest='targetPort',default='80',type='string',help='target port')
	options,args = parser.parse_args()
	for i in range(0,len(options.targetPort.split(','))):
		NmapScan(options.targetIP, options.targetPort.split(',')[i])

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_45007073/article/details/113574063