
python3で書かれた総合スキャンツール。主に生存確認、機密ファイル検出(ディレクトリスキャン/JS漏洩インターフェース/HTMLコメント漏洩)、WAF/CDN識別、ポートスキャン、指紋/サービス識別、OS識別、POCスキャン、SQLインジェクション、CDN回避、周辺サイトの検索などの機能を備えています。主に自社テストや許可を得た第三者テストを目的としており、破壊行為には使用しないでください。
English | 简体中文
Python3 による総合スキャンツール。主に機密ファイル検出(ディレクトリスキャン、JSリークインターフェース)、WAF/CDN識別、ポートスキャン、フィンガープリント/サービス識別、OS識別、弱パスワード検出、POCスキャン、SQLインジェクション、CDNバイパス、サブドメイン調査に使用します。
2019.8.19
gov.cn および edu.cn ドメイン名のスキャンを禁止する機能を追加。プログラムが検出すると即座に終了します。
プログラムの出力インターフェースを変更。「時間 + プラグイン + ドメイン名 + 結果」形式に。
元のSQLインジェクションプラグインを削除し、弱パスワード検出プラグイン(Mysql、Postgresql、SSH 等)を追加。
Fofaのフィンガープリント識別ライブラリとWEBEYEを統合。フィンガープリントルール数 2000+。
2019.7.19
socks5 グローバルプロキシを追加。
requests をパッケージ化。
ディレクトリ構成を最適化。
元の HTML レポートを削除し、Perun から抽出した HTML レポートを使用。
JSON 結果出力を削除し、sqllite3 データベースに保存するように調整。重複排除してデータベースに格納。スキャン中にターゲットホストが db ファイルに既に存在する場合はスキップ。
phpinfo、一般的な情報漏洩スキャンプラグインを追加。
Pdns に viewdns.info のインターフェースを追加。
2019.7.1
ping 検出に失敗したホストを表示。
-u コマンドで複数のターゲットをカンマ区切りで追加可能に。
フィンガープリント認識のバグを修正。
2019.6.18
iis サイトのフィンガープリント認識エラーを修正。apps.json を修正。
エラーが発生しやすいサードパーティライブラリとスクリプトを一部削除。
スキャンがすぐに終了してしまう場合は、プログラムが最初に DNS 解決と ping 操作を行うためです。
初回 Vxscan 使用時、fake_useragent が https://fake-useragent.herokuapp.com/browsers/0.1.11 から UA リストをロードするため、タイムアウトエラーが発生する可能性があります。
Python バージョン > 3.6
requests
pyfiglet
fake-useragent
beautifulsoup4
tldextract
python-nmap
geoip2
lxml
pymongo
virustotal_python
dnspython
pysocks
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
展開後、GeoLite2-City.mmdb を vxscan/data/GeoLite2-City.mmdb に配置
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-ASN.tar.gz
展開後、GeoLite2-ASN.mmdb を vxscan/data/GeoLite2-ASN.mmdb に配置
pip3 install -r requirements.txt
python3 Vxscan.py -h
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Start scanning this url -u xxx.com
-i INET, --inet INET cidr eg. 1.1.1.1 or 1.1.1.0/24
-f FILE, --file FILE read the url from the file
1. ウェブサイトをスキャン
python3 vxscan.py -u http://www.xxx.com/
2. ファイルリストからウェブサイトをスキャン
python3 vxscan.py -f hosts.txt
3. cidr 例: 127.0.0.0/24
python3 vxscan.py -i 127.0.0.0/24
├─Vxscan.py メインファイル
├─data
│ ├─apps.json Webフィンガープリント情報
│ ├─apps.txt Webフィンガープリント情報 (WEBEYE)
│ ├─GeoLite2-ASN.mmdb geoip
│ ├─GeoLite2-City.mmdb asn
├─doc 画像やドキュメントリソースを保存
├─report HTMLレポート関連コンテンツ
├─lib
│ ├─common.py CDN判定、ポートスキャン、POCスキャン等
│ ├─color.py ターミナルカラー出力
│ ├─cli_output.py ターミナル出力
│ ├─active.py DNS解決とping IP生存確認
│ ├─save_html.py HTMLレポート生成
│ ├─waf.py WAFルール
│ ├─options.py オプション設定
│ ├─iscdn.py IPセグメントとASN範囲に基づいてIPがCDNかを判定
│ ├─osdetect.py OSバージョン識別
│ ├─random_header.py カスタムヘッダー
│ ├─settings.py 設定スクリプト
│ ├─vuln.py バッチPOCスキャン呼び出し
│ ├─url.py 取得した接続の重複排除
│ ├─verify.py スクリプトに検証インターフェースを提供
│ ├─sqldb.py sqlite3関連の全処理
│ ├─Requests.py requestsライブラリをパッケージ化、一部カスタム設定
├─script
│ ├─Poc.py Pocスクリプト
│ ├─......
├─Plugins
│ ├─ActiveReconnaissance
│ ├─active.py ホスト生存確認とDNS解決検証
│ ├─check_waf.py ウェブサイトWAF判定
│ ├─crawk.py ウェブサイトリンクをクロールしてテスト
│ ├─osdetect.py OS識別
│ ├─InformationGathering
│ ├─geoip.py 位置情報検索
│ ├─js_leaks.py JS情報漏洩
│ ├─PassiveReconnaissance
│ ├─ip_history.py pdnsインターフェース
│ ├─reverse_domain.py サブドメイン調査
│ ├─virustotal.py VT Pdnsクエリ
│ ├─wappalyzer.py CMSパッシブフィンガープリント認識
│ ├─Scanning
│ ├─dir_scan ディレクトリスキャン
│ ├─port_scan ポートスキャン
├─requirements.txt
├─report.py HTMLレポート生成
├─logo.jpg
├─error.log
# coding=utf-8
# グローバルタイムアウト
TIMEOUT = 5
# 除外するステータスコード
BLOCK_CODE = [
301, 403, 308, 404, 405, 406, 408, 411, 417, 429, 493, 502, 503, 504, 999
]
# スキャンスレッド数
THREADS = 100
# 除外するContent-Type
BLOCK_CONTYPE = [
'image/jpeg', 'image/gif', 'image/png', 'application/javascript',
'application/x-javascript', 'text/css', 'application/x-shockwave-flash',
'text/javascript', 'image/x-icon'
]
# ディレクトリスキャンをスキップするか
SCANDIR = True
# POCプラグインを起動するか
POC = True
# 結果dbに存在する場合はスキップ
CHECK_DB = False
# 無効な404ページ
PAGE_404 = [
'page_404"', "404.png", '找不到页面', '页面找不到', "Not Found", "访问的页面不存在",
"page does't exist", 'notice_404', '404 not found'
]
# ping
PING = True
# socks5プロキシ
# SOCKS5 = ('127.0.0.1', 1080)
SOCKS5 = ()
# shodan
SHODAN_API = ''
# VT
VIRUSTOTAL_API = ''
# cookie
COOKIE = {'Cookie': 'test'}
1. ポート開放またはフィンガープリント認識結果に基づいてPOCを呼び出す
script ディレクトリに新しい Python ファイルを作成し、check 関数を定義します。引数は主に IP アドレス、ポートリスト、フィンガープリント識別リストで、結果を返します:
import pymongo
from lib.verify import verify
timeout = 2
vuln = ['27017', 'Mongodb']
def check(ip, ports, apps):
# verify はスキャンリストに Mongodb 関連の結果があるか確認するために使用。ポートが開いていなければスキャンしない。
if verify(vuln, ports, apps):
try:
conn = pymongo.MongoClient(host=ip, port=27017, serverSelectionTimeoutMS=timeout)
database_list = conn.list_database_names()
if not database_list:
conn.close()
return
conn.close()
return '27017 MongoDB Unauthorized Access'
except Exception as e:
pass
2. ターゲットIPの各HTTPポートに対して走査
渡されたポートサービスのリストに基づいてスキャンするURLを生成し、各Webポートにアクセスします。次のスクリプトはIPの各HTTPポートのタイトルを取得します。
from lib.verify import get_list
from lib.random_header import HEADERS
from lxml import etree
import requests
def get_title(url):
try:
r = requests.get(url, headers=HEADERS, timeout=3, verify=False)
html = etree.HTML(r.text)
title = html.xpath('//title/text()')
return url + ' | ' + title[0]
except:
pass
def check(ip, ports, apps):
result = []
probe = get_list(ip, ports)
for i in probe:
out = get_title(i)
if out:
result.append(out)
return result