
python3로 작성된 종합 스캐닝 도구로, 주로 생존 확인, 민감 파일 탐지(디렉토리 스캔/JS 누출 인터페이스/HTML 주석 누출), WAF/CDN 식별, 포트 스캔, 핑거프린트/서비스 식별, 운영 체제 식별, POC 스캔, SQL 인젝션, CDN 우회, 인접 사이트 조회 등의 기능을 제공합니다. 주로 발주처 자체 테스트 또는 수주처 승인 테스트에 사용되며, 파괴 목적으로 사용하지 마십시오.
English | 简体中文
Python3 종합 스캐닝 도구로, 주로 민감한 파일 탐지(디렉토리 스캔 및 JS 누수 인터페이스), WAF/CDN 식별, 포트 스캔, 핑거프린트/서비스 식별, 운영체제 식별, 약한 비밀번호 탐지, 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, leaves 등 일반적인 정보 누수 스캔 플러그인 추가
Pdns에 viewdns.info 인터페이스 추가
2019.7.1
핑 탐지에 실패한 호스트 표시
-u 명령에 여러 대상 추가 가능, 쉼표로 구분
핑거프린트 인식 오류 수정
2019.6.18
iis 웹사이트 핑거프린트 인식 오류 문제 수정, apps.json 수정
오류가 발생하기 쉬운 일부 서드파티 라이브러리 및 스크립트 제거
스캔 완료 시 깜빡이는 현상은 프로그램이 먼저 DNS 파싱 및 핑 작업을 수행하기 때문
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 도움말 메시지 표시 및 종료
-u URL, --url URL 이 URL 스캔 시작 -u xxx.com
-i INET, --inet INET cidr 예: 1.1.1.1 또는 1.1.1.0/24
-f FILE, --file FILE 파일에서 URL 읽기
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 웹 핑거프린트 정보
│ ├─apps.txt 웹 핑거프린트 정보 (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 해석 및 핑 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 Crawl 웹사이트 링크 크롤링 및 테스트
│ ├─osdetect.py 운영체제 식별
│ ├─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을 생성한 후 각 웹 포트에서 접속합니다. 다음 스크립트는 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