/**
* 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.fuzzer;
import com.beust.jcommander.JCommander;
import de.rub.nds.tlsattacker.attacks.config.BleichenbacherCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.DtlsPaddingOracleAttackCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.HeartbleedCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.InvalidCurveAttackCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.InvalidCurveAttackFullCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.PaddingOracleCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.PoodleCommandConfig;
import de.rub.nds.tlsattacker.attacks.config.WinshockCommandConfig;
import de.rub.nds.tlsattacker.attacks.impl.BleichenbacherAttack;
import de.rub.nds.tlsattacker.attacks.impl.DtlsPaddingOracleAttack;
import de.rub.nds.tlsattacker.attacks.impl.HeartbleedAttack;
import de.rub.nds.tlsattacker.attacks.impl.InvalidCurveAttack;
import de.rub.nds.tlsattacker.attacks.impl.InvalidCurveAttackFull;
import de.rub.nds.tlsattacker.attacks.impl.PaddingOracleAttack;
import de.rub.nds.tlsattacker.attacks.impl.PoodleAttack;
import de.rub.nds.tlsattacker.attacks.impl.WinshockAttack;
import de.rub.nds.tlsattacker.fuzzer.config.MultiFuzzerConfig;
import de.rub.nds.tlsattacker.fuzzer.impl.MultiFuzzer;
import de.rub.nds.tlsattacker.tls.Attacker;
import de.rub.nds.tlsattacker.tls.config.CommandConfig;
import de.rub.nds.tlsattacker.tls.config.ConfigHandler;
import de.rub.nds.tlsattacker.tls.config.ConfigHandlerFactory;
import de.rub.nds.tlsattacker.tls.config.GeneralConfig;
import de.rub.nds.tlsattacker.tls.exceptions.ConfigurationException;
/**
*
* @author Juraj Somorovsky <juraj.somorovsky@rub.de>
*/
public class Main {
public static void main(String[] args) throws Exception {
GeneralConfig generalConfig = new GeneralConfig();
JCommander jc = new JCommander(generalConfig);
MultiFuzzerConfig cmconfig = new MultiFuzzerConfig();
jc.addCommand(MultiFuzzerConfig.COMMAND, cmconfig);
BleichenbacherCommandConfig bleichenbacherTest = new BleichenbacherCommandConfig();
jc.addCommand(BleichenbacherCommandConfig.ATTACK_COMMAND, bleichenbacherTest);
DtlsPaddingOracleAttackCommandConfig dtlsPaddingOracleAttackTest = new DtlsPaddingOracleAttackCommandConfig();
jc.addCommand(DtlsPaddingOracleAttackCommandConfig.ATTACK_COMMAND, dtlsPaddingOracleAttackTest);
// EarlyCCSCommandConfig earlyCCS = new EarlyCCSCommandConfig();
// jc.addCommand(EarlyCCSCommandConfig.COMMAND, earlyCCS);
InvalidCurveAttackCommandConfig ellipticTest = new InvalidCurveAttackCommandConfig();
jc.addCommand(InvalidCurveAttackCommandConfig.ATTACK_COMMAND, ellipticTest);
InvalidCurveAttackFullCommandConfig elliptic = new InvalidCurveAttackFullCommandConfig();
jc.addCommand(InvalidCurveAttackFullCommandConfig.ATTACK_COMMAND, elliptic);
HeartbleedCommandConfig heartbleed = new HeartbleedCommandConfig();
jc.addCommand(HeartbleedCommandConfig.ATTACK_COMMAND, heartbleed);
PaddingOracleCommandConfig paddingOracle = new PaddingOracleCommandConfig();
jc.addCommand(PaddingOracleCommandConfig.ATTACK_COMMAND, paddingOracle);
PoodleCommandConfig poodle = new PoodleCommandConfig();
jc.addCommand(PoodleCommandConfig.ATTACK_COMMAND, poodle);
// SniTestCommandConfig sniTest = new SniTestCommandConfig();
// jc.addCommand(SniTestCommandConfig.COMMAND, sniTest);
WinshockCommandConfig winshock = new WinshockCommandConfig();
jc.addCommand(WinshockCommandConfig.ATTACK_COMMAND, winshock);
jc.parse(args);
if (generalConfig.isHelp() || jc.getParsedCommand() == null) {
jc.usage();
return;
}
Attacker<? extends CommandConfig> attacker;
switch (jc.getParsedCommand()) {
case MultiFuzzerConfig.COMMAND:
startMultiFuzzer(cmconfig, generalConfig, jc);
return;
case BleichenbacherCommandConfig.ATTACK_COMMAND:
attacker = new BleichenbacherAttack(bleichenbacherTest);
break;
// case EarlyCCSCommandConfig.COMMAND:
// attacker = new EarlyCCSAttack(earlyCCS);
// break;
case InvalidCurveAttackCommandConfig.ATTACK_COMMAND:
attacker = new InvalidCurveAttack(ellipticTest);
break;
case InvalidCurveAttackFullCommandConfig.ATTACK_COMMAND:
attacker = new InvalidCurveAttackFull(elliptic);
break;
case HeartbleedCommandConfig.ATTACK_COMMAND:
attacker = new HeartbleedAttack(heartbleed);
break;
case PoodleCommandConfig.ATTACK_COMMAND:
attacker = new PoodleAttack(poodle);
break;
case PaddingOracleCommandConfig.ATTACK_COMMAND:
attacker = new PaddingOracleAttack(paddingOracle);
break;
case WinshockCommandConfig.ATTACK_COMMAND:
attacker = new WinshockAttack(winshock);
break;
case DtlsPaddingOracleAttackCommandConfig.ATTACK_COMMAND:
attacker = new DtlsPaddingOracleAttack(dtlsPaddingOracleAttackTest);
break;
// case SniTestCommandConfig.COMMAND:
// attacker = new SniTest(sniTest);
// break;
default:
throw new ConfigurationException("No command found");
}
ConfigHandler configHandler = ConfigHandlerFactory.createConfigHandler("client");
configHandler.initialize(generalConfig);
if (configHandler.printHelpForCommand(jc, attacker.getConfig())) {
return;
}
attacker.executeAttack(configHandler);
}
private static void startMultiFuzzer(MultiFuzzerConfig fuzzerConfig, GeneralConfig generalConfig, JCommander jc) {
MultiFuzzer fuzzer = new MultiFuzzer(fuzzerConfig, generalConfig);
if (fuzzerConfig.isHelp()) {
jc.usage(MultiFuzzerConfig.COMMAND);
return;
}
fuzzer.startFuzzer();
}
}