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