
침투 테스터와 연구자를 위한 자동화된 TLS 서버 및 클라이언트 구성 스캐너입니다. 암호화 제품군, 프로토콜 버전 및 보안 가이드라인을 평가하며, 사용자 정의 가능한 스캔 깊이와 기계 판독 가능한 출력을 제공합니다.
TLS-Scanner는 침투 테스터와 보안 연구원이 TLS 서버 및 클라이언트 구성을 평가하는 데 도움을 주는 도구입니다.
참고: TLS-Scanner는 TLS 개발자, 침투 테스터, 관리자 및 연구원을 위한 연구 도구입니다. GUI는 없습니다. 첫 번째 버전이며 일부 버그가 있을 수 있습니다.
TLS-Scanner를 컴파일하고 사용하려면 다음을 실행해야 합니다:
$ cd TLS-Scanner
$ git submodule update --init --recursive
$ mvn clean package
또는 시간이 없다면 다음을 사용하여 테스트를 건너뛸 수 있습니다:
$ mvn clean package -DskipTests=true
TLS-Scanner를 라이브러리로 사용하려면 다음 명령으로 설치해야 합니다:
$ mvn clean install
TLS-Scanner를 실행하려면 apps/ 폴더에 있는 jar 파일 중 하나를 실행해야 합니다. 이 파일들은 앱을 직접 컴파일하거나 GitHub에서 릴리스된 jar 파일을 다운로드하여 얻을 수 있습니다.
$ java -jar apps/TLS-Server-Scanner.jar -connect localhost:4433
TLS-Scanner는 지정된 서버(여기서는 포트 4433의 localhost)를 평가하고 마지막에 보고서를 출력합니다.
보고서는 발견 사항의 심각도를 전달하기 위해 색상을 사용합니다:
-connect 매개변수로 스캔하려는 호스트를 지정해야 합니다.
스캔 성능을 향상시키려면 -threads 매개변수를 사용하여 사용되는 스레드 수를 늘릴 수 있습니다.
성능상의 이유로 중요한 또 다른 매개변수는 -scanDetail 매개변수로, 얼마나 상세하게 스캔할지 구성하는 데 사용할 수 있습니다. 빠른 것부터 매우 상세한 것까지 가능한 값은 QUICK, NORMAL, DETAILED, ALL입니다.
출력의 상세도는 -reportDetail 매개변수로 구성할 수 있습니다. Guidelines에 대한 더 자세한 내용을 보려면 -reportDetail ALL을 사용하십시오.
기본적으로 결과는 콘솔에만 기록됩니다. 기계 판독 가능한 출력을 원한다면 -outputFile output.json을 사용하여 결과를 JSON 파일에 자동으로 기록할 수 있습니다.
가장 중요하게 변경할 매개변수는 -scanDetail과 -reportDetail입니다. 다음에서는 이러한 매개변수에 대한 몇 가지 사용 사례를 설명합니다.
대부분의 경우 기본 매개변수 설정으로 충분합니다. 이는 두 상세 수준을 모두 NORMAL로 설정하여 스캔을 수행합니다.
빠른 스캔을 수행하고 시스템에 대한 빠른 개요를 얻으려면 두 상세 수준을 모두 QUICK으로 설정하는 것이 좋습니다. 이는 일부 실행되는 프로브의 범위를 제한하여 런타임을 줄이고 보고서 상세도를 제한하여 매우 상세하고 기술적인 정보를 포함하지 않도록 합니다.
시스템을 완전히 평가하고 보유한 모든 것을 실행하려면 두 상세 수준을 모두 ALL로 설정하는 것이 좋습니다. 이는 모든 기존 프로브를 완전히 실행하고 추가 분석 및 평가를 위해 매우 상세한 정보를 출력합니다.
-scanDetail과 같은 매개변수를 개별적으로 설정하는 대신(또는 추가로), 실행할 프로브와
사용할 매개변수를 재사용 가능한 JSON 스캔 프로필로 묶을 수 있습니다. 이는
-profile <path/to/profile.json> 매개변수를 통해 사용할 수 있으며, TlsServerScanner와
TlsClientScanner 모두에서 사용 가능합니다.
프로필은 다음과 같은 JSON 파일입니다:
inheritedFromProfiles: 프로브를 결합할 다른 프로필의 경로로, 이를 선언하는 프로필 파일의
디렉터리를 기준으로 상대 경로가 해석됩니다(절대 경로는 그대로 사용됨).probes: 실행할 프로브로, ProbeType enum 클래스의 정규화된 이름에서 실행할 상수 이름
목록으로의 맵입니다. 이는 모든 단일 프로브마다 타입을 반복하는 대신 타입별로 프로브를
그룹화하며, 단일 프로필이 서로 다른 ProbeType 구현(예: TlsProbeType과 QuicProbeType)의
프로브를 자유롭게 결합할 수 있습니다. 각 타입별 목록은 "*"(해당 타입의 모든 상수)와
"!CONSTANT_NAME"(이전에 이름 또는 "*"로 추가된 상수 제거)도 허용하며, 순서대로
처리됩니다 — 예시는 scan-profiles/의 Everything.json과 demo.json을
참조하십시오.settings(선택 사항): -scanDetail, -reportDetail, -postAnalysisDetail, -noColor,
-outputFile, -probeTimeout, -parallelProbes, -threads와 같은 매개변수에 대한
재정의입니다. 생략된 필드는 일반 기본값(또는 명령줄에서 전달된 값)을 유지합니다.
probes와 달리 settings는 상속되지 않습니다 — -profile로 지정한 프로필에 직접
선언된 설정만 적용되며, 다른 프로필에서 프로브를 상속하더라도 마찬가지입니다.활성 프로필(및 상속하는 모든 것)에서 해석된 프로브만 실행되며, 나머지는 모두 건너뜁니다.
예시: 기본 프로필의 프로브를 자신의 프로브와 결합하고 스캔 상세도를 조정하는 경우:
base.json:
{
"probes": {
"de.rub.nds.tlsscanner.core.constants.TlsProbeType": ["PROTOCOL_VERSION", "CIPHER_SUITE"]
}
}
quic.json(base.json과 같은 디렉터리에 있음):
{
"inheritedFromProfiles": ["base.json"],
"settings": {
"scanDetail": "QUICK"
},
"probes": {
"de.rub.nds.tlsscanner.core.constants.QuicProbeType": ["SUPPORTED_VERSIONS"]
}
}
$ java -jar apps/TLS-Server-Scanner.jar -connect localhost:4433 -profile quic.json
이는 -scanDetail QUICK으로 PROTOCOL_VERSION, CIPHER_SUITE, SUPPORTED_VERSIONS를 실행합니다.
스캐너에 사용 가능한 모든 프로브를 보려면(대상에 연결하지 않고) -listProbes를 사용하십시오.
이는 프로필의 probes 필드가 기대하는 정확한 JSON 구문으로 ProbeType 클래스별로 그룹화하여
출력하므로, 프로필에 바로 복사하여 붙여넣을 수 있습니다:
$ java -jar apps/TLS-Server-Scanner.jar -listProbes
{
"de.rub.nds.tlsscanner.core.constants.TlsProbeType" : [ "ALPN", "ESNI", "CERTIFICATE", ... ],
"de.rub.nds.tlsscanner.core.constants.QuicProbeType" : [ "SUPPORTED_VERSIONS", ... ]
}
가능한 모든 매개변수에 대한 자세한 정보를 얻으려면 -help 매개변수를 사용하거나 매개변수를 설정하지 않고 jar를 실행하십시오.
TLS-Server-Scanner를 쉽게 사용할 수 있도록 미리 빌드된 docker 이미지를 제공합니다.
$ docker run -it --network host ghcr.io/tls-attacker/tlsscanner -connect localhost:4433
이 이미지는 서버 스캔용으로 만들어졌지만 다른 jar 파일도 포함하고 있습니다. entrypoint를 변경하여 접근할 수 있습니다.
$ docker run -it --network host --entrypoint java ghcr.io/tls-attacker/tlsscanner -jar TLS-Client-Scanner.jar
컨테이너를 직접 빌드할 수 있도록 Dockerfile도 제공합니다:
$ docker build . -t tlsscanner
$ docker run -t tlsscanner
참고: 저는 Docker 모범 사례에 전혀 익숙하지 않습니다. Dockerfile을 개선하는 방법을 알고 있다면 자유롭게 pull request를 제출해 주십시오
(TLS) 프로브는 때때로 이 특정 프로브를 실행하기 위해 필요한 전제 조건을 가지고 있습니다. 요구 사항 시스템을 사용하면 프로브가 실행되기 위해 충족되어야 하는 이러한 요구 사항의 집합을 정의할 수 있습니다.
각 요구 사항은 요구 사항이 충족되었는지 여부를 나타내는 부울 값을 반환하는 evaluate 함수를 제공합니다.
요구 사항은 잘 알려진 논리 연산을 사용하여 여러 방식으로 연결할 수 있습니다. 각 요구 사항은 여러 요구 사항을 연결하기 위한 and, or, not, xor
인스턴스 메서드를 제공합니다. 다음 프로브가 현재 구현되어 있으며 바로 사용할 수 있습니다:
FulfilledRequirement - 항상 true로 평가되며, 요구 사항이 없음을 나타내는 데 유용합니다.UnfulfillableRequirement - 항상 false로 평가되며, 프로브 실행을 방지합니다.ProbeRequirement - 지정된 프로브가 실행된 경우 true로 평가됩니다.PropertyRequirement - 지정된 분석된 속성이 미리 정의된 값을 가진 경우 true로 평가됩니다. 값은 생성자 매개변수로 제공되거나 TestResults.TRUE와 TestResults.FALSE에 대한 축약형으로 PropertyTrueRequirement와 PropertyFalseRequirement를 사용할 수 있습니다.PropertyComparatorRequirement - 분석된 속성의 컬렉션 결과가 상수 값보다 작거나, 같거나, 큰 경우 true로 평가됩니다.ProtocolRequirement - 특정 프로토콜 버전이 지원되는 경우 true로 평가됩니다.ExtensionRequirement - 특정 확장이 원격 피어에 의해 지원되는 경우 true로 평가됩니다.OptionsRequirement - 추가 cli 플래그가 설정된 경우 true로 평가됩니다. 현재 일부 클라이언트 프로브(ALPN, SNI, 세션 재개)에서 사용됩니다.WorkingConfigRequirement - 작동하는 구성이 발견된 경우 true로 평가됩니다.이러한 미리 정의된 요구 사항 외에도 getRequirements 메서드 내에서 Requirement 클래스를 익명으로 확장할 수 있습니다. 아무것도 필요하지 않은 경우 항상 true로 평가되는 FulfilledRequirement를 반환할 수 있습니다.
요구 사항을 사용하는 방법에 대한 예시는 tls-client-scanner와 tls-server-scanner의 probe 패키지에서 찾을 수 있습니다.
@Override
public Requirement<ClientReport> getRequirements() {
return new ProbeRequirement<ClientReport>(TlsProbeType.CIPHER_SUITE)
.and(new PropertyTrueRequirement<>(TlsAnalyzedProperty.SUPPORTS_DHE));
}