
TLS 라이브러리의 체계적인 퍼징 및 분석을 위한 Java 기반 프레임워크입니다. 임의의 프로토콜 메시지 조작, 수정 및 TLS 클라이언트/서버 테스트를 통해 취약점 발견을 가능하게 합니다.
TLS-Attacker는 TLS 라이브러리를 분석하기 위한 Java 기반 프레임워크입니다. 임의의 순서로 TLS 피어에게 임의의 프로토콜 메시지를 보낼 수 있으며, 제공된 인터페이스를 사용하여 수정 사항을 정의할 수 있습니다. 이를 통해 개발자는 사용자 정의 TLS 프로토콜 흐름을 쉽게 정의하고 자신의 TLS 라이브러리로 테스트할 수 있습니다.
참고: TLS-Attacker는 TLS 개발자와 침투 테스터를 위한 연구 도구입니다. GUI나 초록/빨간불 표시는 없습니다.
TLS-Attacker를 컴파일하고 사용하려면 Java와 Maven이 설치되어 있어야 합니다. Ubuntu에서는 다음 명령어로 Maven을 설치할 수 있습니다:
$ sudo apt-get install maven
TLS-Attacker는 현재 Java JDK 21이 필요합니다.
올바른 Java 버전이 있다면 TLS-Attacker 디렉토리에서 maven 명령어를 실행할 수 있습니다:
$ git clone https://github.com/tls-attacker/TLS-Attacker.git
$ cd TLS-Attacker
$ mvn clean install
또는, 시간이 없다면 다음을 사용하여 테스트를 건너뛸 수 있습니다:
$ mvn clean install -DskipTests=true
결과 jar 파일은 "apps" 폴더에 위치합니다.
이 프로젝트를 의존성으로 사용하려면 직접 컴파일할 필요 없이 pom.xml에 다음과 같이 포함시킬 수 있습니다.
<dependency>
<groupId>de.rub.nds.tls.attacker</groupId>
<artifactId>tls-attacker</artifactId>
<version>7.0.0</version>
<type>pom</type>
</dependency>
TLS-Attacker에는 TLS-Attacker 기능에 쉽게 접근할 수 있는 데모 애플리케이션이 포함되어 있습니다.
다음 명령어로 TLS-Attacker를 클라이언트로 실행할 수 있습니다:
$ cd apps
$ java -jar TLS-Client.jar -connect [host:port]
또는 서버로 실행하려면:
$ java -jar TLS-Server.jar -port [port]
이 예제 애플리케이션들은 그 자체로도 매우 강력하지만, TLS-Attacker는 프로그래밍 라이브러리로 사용될 때 진정한 잠재력을 발휘합니다.
TLS-Attacker는 여러 (maven) 프로젝트로 구성됩니다:

이 모듈들에 대한 자세한 정보는 Wiki에서 확인할 수 있습니다.
현재 다음 기능이 지원됩니다:
여기에서는 TLS-Attacker 사용에 대한 매우 간단한 예제를 소개합니다.
먼저 TLS 서버를 시작해야 합니다 (공개 서버는 사용하지 마십시오). 아직 실행하지 않았다면 keygen.sh 스크립트를 실행하세요. 예를 들어 OpenSSL 테스트 서버를 사용할 수 있습니다:
$ cd TLS-Attacker/resources
$ openssl s_server -key rsa1024key.pem -cert rsa1024cert.pem
이 명령어는 4433 포트에서 TLS 서버를 시작합니다.
서버에 연결하려면 다음 명령어를 사용할 수 있습니다:
$ cd TLS-Attacker/apps
$ java -jar TLS-Client.jar -connect localhost:4433
참고: 이 핸드셰이크가 실패하면 특정 암호 스위트를 지정하지 않았기 때문일 수 있습니다. TLS-Attacker는 서버가 선택한 암호 스위트를 완전히 따르지 않습니다.
다른 암호 스위트, TLS 버전 또는 다른 포트에 연결하려면 다음 매개변수를 사용하세요:
$ java -jar TLS-Client.jar -connect localhost:4433 -cipher TLS_RSA_WITH_AES_256_CBC_SHA -version TLS11
더 경험이 많은 개발자라면 Java 코드를 작성하여 자신만의 TLS 메시지 흐름을 만들 수 있습니다. 예:
Config config = Config.createConfig();
WorkflowTrace trace = new WorkflowTrace();
trace.addTlsAction(new SendAction(new ClientHelloMessage()));
trace.addTlsAction(new ReceiveAction(new ServerHelloMessage()));
State state = new State(config, trace);
DefaultWorkflowExecutor executor = new DefaultWorkflowExecutor(state);
executor.executeWorkflow();
TLS-Attacker는 WorkflowTrace 개념을 사용하여 "TLS 메시지 흐름"을 정의합니다. WorkflowTrace는 순차적으로 실행되는 동작 목록으로 구성됩니다. 일반적인 "TLS 메시지 흐름"에는 SendAction과 ReceiveAction만 필요하지만, 프레임워크는 여기서 멈추지 않고 훨씬 더 다양한 메시지 흐름을 실행하는 데 사용할 수 있는 다양한 다른 동작들을 구현합니다. 현재 구현된 동작 목록과 설명은 Wiki에서 확인할 수 있습니다.
Java를 싫어하는 분들도 많다는 것을 알고 있습니다. 따라서 XML 구조를 사용하여 XML에서 사용자 정의 TLS 프로토콜을 실행할 수도 있습니다:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflowTrace>
<!-- Send ClientHello -->
<Send>
<configuredMessages>
<ClientHello>
<extensions>
<ECPointFormat/>
<EllipticCurves/>
<SignatureAndHashAlgorithmsExtension/>
<RenegotiationInfoExtension/>
</extensions>
</ClientHello>
</configuredMessages>
<configuredRecords>
<record/>
</configuredRecords>
</Send>
<!-- Receive server response -->
<Receive>
<expectedMessages>
<ServerHello>
<extensions>
<ECPointFormat/>
<RenegotiationInfoExtension/>
</extensions>
</ServerHello>
<Certificate/>
<ServerHelloDone/>
</expectedMessages>
</Receive>
<!-- Send client key exchange and finish -->
<Send>
<configuredMessages>
<RSAClientKeyExchange/>
<ChangeCipherSpec/>
<Finished/>
</configuredMessages>
<configuredRecords>
<record/>
<record/>
<record/>
</configuredRecords>
</Send>
<!-- Receive server finish -->
<Receive>
<expectedMessages>
<ChangeCipherSpec/>
<Finished/>
</expectedMessages>
</Receive>
</workflowTrace>
이 XML 구조가 TLS-Attacker/apps/workflow.xml에 있다면, 다음을 실행하기만 하면 됩니다:
$ java -jar TLS-Client.jar -connect [host]:[port] -workflow_input workflow.xml
원래 TLS 프로토콜을 공격하기 위해 설계되었지만, TLS-Attacker는 임의의 프로토콜을 지원할 수 있습니다. 이를 위해 TLS-Attacker는 각 연결에 계층 스택을 할당합니다. 이 계층 스택은 사용자가 활용하려는 다양한 프로토콜 계층으로 구성됩니다. 계층 스택을 통해 사용자는 DTLS, HTTP (더 많은 것은 작업 중)와 같은 계층을 임의의 순서로 추가할 수 있습니다.
계층 스택을 사용하여 임의의 메시지를 보내고 받기 위해 사용자는 각 계층에 대한 구성을 정의할 수 있습니다. 이러한 구성은 보내거나 받을 메시지를 지정합니다. 또한 사용자는 각 계층에 대한 계층별 메시지/데이터 컨테이너를 지정할 수 있습니다. 예를 들어 TLS-Attacker가 보내야 할 TLS 메시지와 레코드를 지정할 수 있으며, TLS-Attacker는 주어진 TLS 메시지를 자동으로 레코드에 캡슐화합니다.
TLS-Attacker는 수정 가능 변수(Modifiable Variable) 개념을 사용하여 사전 정의된 워크플로우에 런타임 수정을 허용합니다. 수정 가능 변수를 사용하면 값이 실제로 설정된 후 또는 전에 기본 타입에 대한 수정을 설정할 수 있습니다. 실제 값이 결정되고 getter를 통해 값에 접근하려고 하면 원래 값이 그에 따라 수정된 형태로 반환됩니다. 이 개념에 대한 자세한 내용은 https://github.com/tls-attacker/ModifiableVariable 에서 확인할 수 있습니다.
ModifiableInteger i = new ModifiableInteger();
i.setOriginalValue(30);
i.setModification(new AddModification(20));
System.out.println(i.getValue()); // 50
이 예제에서는 새로운 ModifiableInteger를 정의하고 값을 30으로 설정했습니다. 다음으로 두 정수의 합을 반환하는 AddModification 수정을 정의하고 값을 20으로 설정했습니다. 위 프로그램을 실행하면 결과 50이 출력됩니다.
물론 이 개념을 TLS 워크플로우를 구성하는 데 사용할 수 있습니다. 서버에서 하트블리드 취약점을 테스트한다고 가정해 보겠습니다. 이를 위해 하트비트 요청의 페이로드 길이를 늘려야 합니다. TLS-Attacker를 사용하면 다음과 같이 할 수 있습니다: