/**
* 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.config;
import com.beust.jcommander.Parameter;
import de.rub.nds.tlsattacker.fuzzer.config.converters.PropertyFormatConverter;
import de.rub.nds.tlsattacker.fuzzer.config.converters.PropertyTypeConverter;
import de.rub.nds.tlsattacker.modifiablevariable.ModifiableVariableProperty;
import de.rub.nds.tlsattacker.tls.config.ClientCommandConfig;
import de.rub.nds.tlsattacker.tls.config.converters.FileConverter;
import de.rub.nds.tlsattacker.tls.config.validators.PercentageValidator;
import java.util.LinkedList;
import java.util.List;
/**
*
* @author Juraj Somorovsky <juraj.somorovsky@rub.de>
*/
public class SimpleFuzzerConfig extends ClientCommandConfig {
public static final String ATTACK_COMMAND = "simple_fuzzer";
@Parameter(names = "-server_command", description = "Command for starting the server")
String serverCommand;
@Parameter(names = "-server_command_file", description = "Command for starting the server, initialized from a given file.", converter = FileConverter.class)
String serverCommandFromFile;
@Parameter(names = "-modify_variable", description = "Probability of a random variable modification (0-100), in steps 2 and 3", validateWith = PercentageValidator.class)
Integer modifyVariablePercentage = 50;
@Parameter(names = "-modified_variable_whitelist", description = "Pattern for modifiable variables that are going to be modified randomly (e.g., defining *length consideres only variables ending with length")
String modifiedVariableWhitelist;
@Parameter(names = "-modified_variable_blacklist", description = "Pattern for modifiable variables that are NOT going to be modified randomly (e.g., defining *length consideres variables ending with length are out of modification scope.")
String modifiedVariableBlacklist;
@Parameter(names = "-modified_variable_types", description = "Type of modifiable variables that are going to be modified randomly (e.g., defining LENGTH consideres only length variables)", converter = PropertyTypeConverter.class)
List<ModifiableVariableProperty.Type> modifiableVariableTypes;
@Parameter(names = "-modified_variable_formats", description = "Format of modifiable variables that are going to be modified randomly (e.g., defining ASN1 consideres only variables with ASN.1 formats)", converter = PropertyFormatConverter.class)
List<ModifiableVariableProperty.Format> modifiableVariableFormats;
@Parameter(names = "-generate_message", description = "Probability of a random message generation in step 3", validateWith = PercentageValidator.class)
Integer generateMessagePercentage = 50;
@Parameter(names = "-not_sending_message", description = "Probability of a random message being not sent to the peer in step 3", validateWith = PercentageValidator.class)
Integer notSendingMessagePercantage = 50;
@Parameter(names = "-add_record", description = "Probability of adding a random record to a random protocol message (may cause the message is split into more records)", validateWith = PercentageValidator.class)
Integer addRecordPercentage = 50;
@Parameter(names = "-variable_modification_iter", description = "Number of modifications made to each field while executing a systematic fuzzing in phase 1.")
Integer variableModificationIter = 1000;
@Parameter(names = "-random_modification_iter", description = "Number of random modifications made to a handshake while executing a systematic fuzzing in phase 2.")
Integer randomModificationIter = 100000;
@Parameter(names = "-handshake_modification_iter", description = "Number of random modifications to the handshake made while fuzzing in phase 3.")
Integer handshakeModificationIter = 100000;
@Parameter(names = "-restart_server", description = "Indicates whether the server is restarted in each fuzzing iteration.")
boolean restartServerInEachInteration = false;
@Parameter(names = "-output_folder", description = "Output folder for the fuzzing results.")
String outputFolder;
@Parameter(names = "-workflow_folder", description = "Folder with tested workflows.")
String workflowFolder;
@Parameter(names = "-stage1", description = "Crypto Fuzzing with all crypto attacks", arity = 1)
boolean stage1;
@Parameter(names = "-stage2", description = "Random protocol fuzzing for boundary violations", arity = 1)
boolean stage2;
public SimpleFuzzerConfig() {
modifiableVariableTypes = new LinkedList<>();
modifiableVariableTypes.add(ModifiableVariableProperty.Type.COUNT);
modifiableVariableTypes.add(ModifiableVariableProperty.Type.LENGTH);
modifiableVariableTypes.add(ModifiableVariableProperty.Type.PADDING);
modifiableVariableTypes.add(ModifiableVariableProperty.Type.COOKIE);
modifiableVariableTypes.add(ModifiableVariableProperty.Type.KEY_MATERIAL);
modifiableVariableTypes.add(ModifiableVariableProperty.Type.SIGNATURE);
modifiableVariableTypes.add(ModifiableVariableProperty.Type.TLS_CONSTANT);
modifiableVariableFormats = new LinkedList<>();
modifiableVariableFormats.add(ModifiableVariableProperty.Format.NONE);
modifiableVariableFormats.add(ModifiableVariableProperty.Format.ASN1);
modifiableVariableFormats.add(ModifiableVariableProperty.Format.PKCS1);
outputFolder = "/tmp/";
tlsTimeout = 80;
stage1 = true;
stage2 = true;
}
public String getServerCommand() {
return serverCommand;
}
public void setServerCommand(String serverCommand) {
this.serverCommand = serverCommand;
}
public String getServerCommandFromFile() {
return serverCommandFromFile;
}
public void setServerCommandFromFile(String serverCommandFromFile) {
this.serverCommandFromFile = serverCommandFromFile;
}
public Integer getModifyVariablePercentage() {
return modifyVariablePercentage;
}
public void setModifyVariablePercentage(Integer modifyVariablePercentage) {
this.modifyVariablePercentage = modifyVariablePercentage;
}
// public String getModifiedVariablePattern() {
// return modifiedVariableWhitelist;
// }
//
// public void setModifiedVariablePattern(String modifiedVariableWhitelist)
// {
// this.modifiedVariableWhitelist = modifiedVariableWhitelist;
// }
public List<ModifiableVariableProperty.Type> getModifiableVariableTypes() {
return modifiableVariableTypes;
}
public void setModifiableVariableTypes(List<ModifiableVariableProperty.Type> modifiableVariableTypes) {
this.modifiableVariableTypes = modifiableVariableTypes;
}
public List<ModifiableVariableProperty.Format> getModifiableVariableFormats() {
return modifiableVariableFormats;
}
public void setModifiableVariableFormats(List<ModifiableVariableProperty.Format> modifiableVariableFormats) {
this.modifiableVariableFormats = modifiableVariableFormats;
}
public Integer getGenerateMessagePercentage() {
return generateMessagePercentage;
}
public void setGenerateMessagePercentage(Integer generateMessagePercentage) {
this.generateMessagePercentage = generateMessagePercentage;
}
public Integer getNotSendingMessagePercantage() {
return notSendingMessagePercantage;
}
public void setNotSendingMessagePercantage(Integer notSendingMessagePercantage) {
this.notSendingMessagePercantage = notSendingMessagePercantage;
}
public Integer getAddRecordPercentage() {
return addRecordPercentage;
}
public void setAddRecordPercentage(Integer addRecordPercentage) {
this.addRecordPercentage = addRecordPercentage;
}
// public boolean isInterruptAfterFirstFinding() {
// return interruptAfterFirstFinding;
// }
//
// public void setInterruptAfterFirstFinding(boolean
// interruptAfterFirstFinding) {
// this.interruptAfterFirstFinding = interruptAfterFirstFinding;
// }
public String getModifiedVariableWhitelist() {
return modifiedVariableWhitelist;
}
public void setModifiedVariableWhitelist(String modifiedVariableWhitelist) {
this.modifiedVariableWhitelist = modifiedVariableWhitelist;
}
public String getModifiedVariableBlacklist() {
return modifiedVariableBlacklist;
}
public void setModifiedVariableBlacklist(String modifiedVariableBlacklist) {
this.modifiedVariableBlacklist = modifiedVariableBlacklist;
}
public Integer getVariableModificationIter() {
return variableModificationIter;
}
public void setVariableModificationIter(Integer variableModificationIter) {
this.variableModificationIter = variableModificationIter;
}
public boolean isRestartServerInEachInteration() {
return restartServerInEachInteration;
}
public void setRestartServerInEachInteration(boolean restartServerInEachInteration) {
this.restartServerInEachInteration = restartServerInEachInteration;
}
public Integer getRandomModificationIter() {
return randomModificationIter;
}
public void setRandomModificationIter(Integer randomModificationIter) {
this.randomModificationIter = randomModificationIter;
}
public Integer getHandshakeModificationIter() {
return handshakeModificationIter;
}
public void setHandshakeModificationIter(Integer handshakeModificationIter) {
this.handshakeModificationIter = handshakeModificationIter;
}
public String getOutputFolder() {
return outputFolder;
}
public void setOutputFolder(String outputFolder) {
this.outputFolder = outputFolder;
}
public String getWorkflowFolder() {
return workflowFolder;
}
public void setWorkflowFolder(String workflowFolder) {
this.workflowFolder = workflowFolder;
}
public boolean containsServerCommand() {
return serverCommand != null || serverCommandFromFile != null;
}
public String getResultingServerCommand() {
if (serverCommand != null) {
return serverCommand;
} else {
return serverCommandFromFile;
}
}
public boolean isStage1() {
return stage1;
}
public void setStage1(boolean stage1) {
this.stage1 = stage1;
}
public boolean isStage2() {
return stage2;
}
public void setStage2(boolean stage2) {
this.stage2 = stage2;
}
}