
공개적으로 노출된 Microsoft Exchange 서버를 식별하고 해당 소프트웨어 버전을 확인합니다.

이 도구는 대상 호스트의 몇 가지 일반적인 공개 서비스를 스캔하여 Microsoft Exchange Server를 탐지하고 가능하면 소프트웨어 버전을 식별합니다.
이를 위해 다음 기법을 사용합니다.
탐지된 빌드 번호는 Microsoft에서 크롤링한 버전 테이블과 대조됩니다. 이 테이블은 Service Pack(SP), Cumulative Update(CU), Security Update(SU), Hotfix Update(HU), Update Rollup(RU) 수준을 포함하여 Exchange Server 5.5부터 Exchange Server Subscription Edition(SE)까지 모든 릴리스를 다룹니다. 일치 항목은 제품 이름, 릴리스 날짜, NVD 사전 형식의 CPE 문자열과 함께 보고됩니다.
스캐너를 실행하는 권장 방법은 Docker를 사용하는 것입니다. Docker 자체 외에 로컬 종속성이 필요 없습니다. 대신 스크립트를 직접 실행하려면 64비트 Debian Linux를 기준으로 설계되었지만, Python 3, dnsx, fingerprintx가 지원하는 모든 Linux 변형에서 작동해야 합니다(설치 스크립트를 약간 수정하면 됩니다).
이미지를 빌드합니다. 여기에는 Python, 고정된 Python 패키지, 버전이 고정된 dnsx 및 fingerprintx 바이너리가 포함되며, 빌드 시 Microsoft에서 Exchange Server 버전 테이블을 크롤링합니다:
docker build -t exchange-scanner .
그런 다음 스크립트에 전달할 것과 동일한 인수(아래 사용 방법 참조)를 전달하여 스캐너를 실행합니다:
# Scan a single target
docker run --rm exchange-scanner -q -t 192.168.5.3
# Scan a list of targets (mount the file into the container)
docker run --rm -v "$PWD/targets.txt:/app/targets.txt" exchange-scanner -l targets.txt
버전 테이블을 갱신하려면 이미지를 다시 빌드하세요.
필요한 도구, 패키지 및 기타 종속성을 설치하려면 scripts/install-requirements.sh를 실행하세요. Python 패키지는 scripts/requirements.txt에 특정 버전으로 고정되어 있습니다.
exchange-versions.json에 있는 소프트웨어 버전 테이블을 업데이트하려면 언제든지 scripts/get-exchange-versions.py를 별도로 다시 실행해도 됩니다.
exchange-scanner.py 스크립트를 -h와 함께 실행하여 사용 세부 정보를 확인하세요:
❯ ./exchange-scanner.py -h
usage: exchange-scanner.py [-h] [-q] [-d] [-x TIMEOUT] [-o OUTFILE] (-t TARGET | -l LIST)
optional arguments:
-h, --help show this help message and exit
-q, --quiet Suppress log output (except errors)
-d, --debug Print debugging messages
-x TIMEOUT, --timeout TIMEOUT
Set timeout for HTTP requests (defaults to 3 seconds)
-o OUTFILE, --outfile OUTFILE
Save output to a file instead of writing to stdout
-t TARGET, --target TARGET
A single hostname or IP address to scan
-l LIST, --list LIST File containing a list of hostnames and/or IP addresses to scan (one per line)
필수: -t 또는 -l
-t에 호스트 이름이나 IP 주소 하나를 지정하세요. 호스트 이름이 여러 IP로 확인되면 스크립트는 각 IP를 별도로 스캔합니다.-l에 파일 이름을 지정하세요.로깅: 대부분의 로그 출력을 억제하려면 -q를 사용하세요. 더 자세한 로그를 보려면 -d를 사용하세요.
시간 제한: HTTP 요청당 최대 응답 시간을 변경하려면 시간 제한 값을 초 단위로 지정하세요(기본값은 3). 특정 상황에서 단일 IP 주소가 200개 이상의 요청을 생성할 수 있으므로(대부분의 스캔이 이 수준에 도달하지는 않지만) 일반적으로 더 짧은 시간 제한이 권장됩니다.
출력: 스캔 결과는 기본적으로 JSON 형식으로 출력됩니다. stdout 대신 파일로 출력을 저장하려면 -o에 파일 이름을 지정하세요.
$ ./exchange-scanner.py -q -t 192.168.5.3
[
{
"hostname": "192.168.5.3",
"ip_address": "192.168.5.3",
"build_number": "15.2.1118",
"exchange_services": [
"https://192.168.5.3:443",
"imaps://192.168.5.3:993"
],
"product_name": "Exchange Server 2019 CU12 (2022H1)",
"major_version": "2019",
"update": "Cumulative Update 12",
"security_update": null,
"release_date": "2022-04-20",
"recalled": false,
"cpes": [
"cpe:2.3:a:microsoft:exchange_server:2019:cumulative_update_12:*:*:*:*:*:*",
"cpe:2.3:a:microsoft:outlook_web_access:2019:cumulative_update_12:*:*:*:*:*:*"
]
}
]
사전 상호 동의 없이 대상을 공격하기 위해 이 도구를 사용하는 것은 불법입니다. 적용 가능한 모든 지방, 주, 연방 법률을 준수할 책임은 최종 사용자에게 있습니다. 개발자는 어떠한 책임도 지지 않으며 이 프로그램으로 인한 오용이나 손해에 대해 책임을 지지 않습니다.
이 프로젝트는 GNU General Public License에 따라 라이선스가 부여됩니다.
recalled 필드를 통해 표시합니다.