33 *
44 * Copyright 2014-2016 Ruhr University Bochum / Hackmanit GmbH
55 *
6- * Licensed under Apache License 2.0
7- * http://www.apache.org/licenses/LICENSE-2.0
6+ * Licensed under Apache License 2.0 http://www.apache.org/licenses/LICENSE-2.0
87 */
98package de .rub .nds .tlsattacker ;
109
2928import de .rub .nds .tlsattacker .attacks .impl .WinshockAttack ;
3029import de .rub .nds .tlsattacker .fuzzer .config .MultiFuzzerConfig ;
3130import de .rub .nds .tlsattacker .fuzzer .impl .MultiFuzzer ;
31+ import de .rub .nds .tlsattacker .testsuite .config .ServerTestConfig ;
32+ import de .rub .nds .tlsattacker .testsuite .impl .ServerTestSuite ;
3233import de .rub .nds .tlsattacker .tls .Attacker ;
3334import de .rub .nds .tlsattacker .tls .config .ClientCommandConfig ;
3435import de .rub .nds .tlsattacker .tls .config .CommandConfig ;
5253import org .apache .logging .log4j .Logger ;
5354
5455/**
55- *
56+ *
5657 * @author Juraj Somorovsky <juraj.somorovsky@rub.de>
5758 */
5859public class Main {
@@ -61,143 +62,149 @@ public class Main {
6162
6263 public static void main (String [] args ) throws Exception {
6364
64- GeneralConfig generalConfig = new GeneralConfig ();
65- JCommander jc = new JCommander (generalConfig );
66-
67- MultiFuzzerConfig cmconfig = new MultiFuzzerConfig ();
68- jc .addCommand (MultiFuzzerConfig .ATTACK_COMMAND , cmconfig );
69-
70- BleichenbacherCommandConfig bleichenbacherTest = new BleichenbacherCommandConfig ();
71- jc .addCommand (BleichenbacherCommandConfig .ATTACK_COMMAND , bleichenbacherTest );
72- DtlsPaddingOracleAttackCommandConfig dtlsPaddingOracleAttackTest = new DtlsPaddingOracleAttackCommandConfig ();
73- jc .addCommand (DtlsPaddingOracleAttackCommandConfig .ATTACK_COMMAND , dtlsPaddingOracleAttackTest );
74- InvalidCurveAttackCommandConfig ellipticTest = new InvalidCurveAttackCommandConfig ();
75- jc .addCommand (InvalidCurveAttackCommandConfig .ATTACK_COMMAND , ellipticTest );
76- InvalidCurveAttackFullCommandConfig elliptic = new InvalidCurveAttackFullCommandConfig ();
77- jc .addCommand (InvalidCurveAttackFullCommandConfig .ATTACK_COMMAND , elliptic );
78- HeartbleedCommandConfig heartbleed = new HeartbleedCommandConfig ();
79- jc .addCommand (HeartbleedCommandConfig .ATTACK_COMMAND , heartbleed );
80- PaddingOracleCommandConfig paddingOracle = new PaddingOracleCommandConfig ();
81- jc .addCommand (PaddingOracleCommandConfig .ATTACK_COMMAND , paddingOracle );
82- PoodleCommandConfig poodle = new PoodleCommandConfig ();
83- jc .addCommand (PoodleCommandConfig .ATTACK_COMMAND , poodle );
84- WinshockCommandConfig winshock = new WinshockCommandConfig ();
85- jc .addCommand (WinshockCommandConfig .ATTACK_COMMAND , winshock );
86- ServerCommandConfig server = new ServerCommandConfig ();
87- jc .addCommand (ServerCommandConfig .COMMAND , server );
88- ClientCommandConfig client = new ClientCommandConfig ();
89- jc .addCommand (ClientCommandConfig .COMMAND , client );
90- ManInTheMiddleAttackCommandConfig MitM_Attack = new ManInTheMiddleAttackCommandConfig ();
91- jc .addCommand (ManInTheMiddleAttackCommandConfig .ATTACK_COMMAND , MitM_Attack );
92-
93- jc .parse (args );
94-
95- if (generalConfig .isHelp () || jc .getParsedCommand () == null ) {
96- jc .usage ();
97- return ;
98- }
99-
100- Attacker attacker ;
101- switch (jc .getParsedCommand ()) {
102- case MultiFuzzerConfig .ATTACK_COMMAND :
103- startMultiFuzzer (cmconfig , generalConfig , jc );
104- return ;
105- case ServerCommandConfig .COMMAND :
106- startSimpleTls (generalConfig , server , jc );
107- return ;
108- case ClientCommandConfig .COMMAND :
109- startSimpleTls (generalConfig , client , jc );
110- return ;
111- case BleichenbacherCommandConfig .ATTACK_COMMAND :
112- attacker = new BleichenbacherAttack (bleichenbacherTest );
113- break ;
114- case InvalidCurveAttackCommandConfig .ATTACK_COMMAND :
115- attacker = new InvalidCurveAttack (ellipticTest );
116- break ;
117- case InvalidCurveAttackFullCommandConfig .ATTACK_COMMAND :
118- attacker = new InvalidCurveAttackFull (elliptic );
119- break ;
120- case HeartbleedCommandConfig .ATTACK_COMMAND :
121- attacker = new HeartbleedAttack (heartbleed );
122- break ;
123- case PoodleCommandConfig .ATTACK_COMMAND :
124- attacker = new PoodleAttack (poodle );
125- break ;
126- case PaddingOracleCommandConfig .ATTACK_COMMAND :
127- attacker = new PaddingOracleAttack (paddingOracle );
128- break ;
129- case WinshockCommandConfig .ATTACK_COMMAND :
130- attacker = new WinshockAttack (winshock );
131- break ;
132- case DtlsPaddingOracleAttackCommandConfig .ATTACK_COMMAND :
133- attacker = new DtlsPaddingOracleAttack (dtlsPaddingOracleAttackTest );
134- break ;
135- case ManInTheMiddleAttackCommandConfig .ATTACK_COMMAND :
136- attacker = new ManInTheMiddleAttack (MitM_Attack );
137- break ;
138- default :
139- throw new ConfigurationException ("No command found" );
140- }
141- ConfigHandler configHandler = ConfigHandlerFactory .createConfigHandler ("client" );
142- configHandler .initialize (generalConfig );
143-
144- if (configHandler .printHelpForCommand (jc , attacker .getConfig ())) {
145- return ;
146- }
147-
148- attacker .executeAttack (configHandler );
149-
150- CommandConfig config = attacker .getConfig ();
151- if (config .getWorkflowOutput () != null && !config .getWorkflowOutput ().isEmpty ()) {
152- logWorkflowTraces (attacker .getTlsContexts (), config .getWorkflowOutput ());
153- }
65+ GeneralConfig generalConfig = new GeneralConfig ();
66+ JCommander jc = new JCommander (generalConfig );
67+
68+ MultiFuzzerConfig cmconfig = new MultiFuzzerConfig ();
69+ jc .addCommand (MultiFuzzerConfig .COMMAND , cmconfig );
70+
71+ BleichenbacherCommandConfig bleichenbacherTest = new BleichenbacherCommandConfig ();
72+ jc .addCommand (BleichenbacherCommandConfig .ATTACK_COMMAND , bleichenbacherTest );
73+ DtlsPaddingOracleAttackCommandConfig dtlsPaddingOracleAttackTest = new DtlsPaddingOracleAttackCommandConfig ();
74+ jc .addCommand (DtlsPaddingOracleAttackCommandConfig .ATTACK_COMMAND , dtlsPaddingOracleAttackTest );
75+ InvalidCurveAttackCommandConfig ellipticTest = new InvalidCurveAttackCommandConfig ();
76+ jc .addCommand (InvalidCurveAttackCommandConfig .ATTACK_COMMAND , ellipticTest );
77+ InvalidCurveAttackFullCommandConfig elliptic = new InvalidCurveAttackFullCommandConfig ();
78+ jc .addCommand (InvalidCurveAttackFullCommandConfig .ATTACK_COMMAND , elliptic );
79+ HeartbleedCommandConfig heartbleed = new HeartbleedCommandConfig ();
80+ jc .addCommand (HeartbleedCommandConfig .ATTACK_COMMAND , heartbleed );
81+ PaddingOracleCommandConfig paddingOracle = new PaddingOracleCommandConfig ();
82+ jc .addCommand (PaddingOracleCommandConfig .ATTACK_COMMAND , paddingOracle );
83+ PoodleCommandConfig poodle = new PoodleCommandConfig ();
84+ jc .addCommand (PoodleCommandConfig .ATTACK_COMMAND , poodle );
85+ WinshockCommandConfig winshock = new WinshockCommandConfig ();
86+ jc .addCommand (WinshockCommandConfig .ATTACK_COMMAND , winshock );
87+ ServerCommandConfig server = new ServerCommandConfig ();
88+ jc .addCommand (ServerCommandConfig .COMMAND , server );
89+ ClientCommandConfig client = new ClientCommandConfig ();
90+ jc .addCommand (ClientCommandConfig .COMMAND , client );
91+ ManInTheMiddleAttackCommandConfig MitM_Attack = new ManInTheMiddleAttackCommandConfig ();
92+ jc .addCommand (ManInTheMiddleAttackCommandConfig .ATTACK_COMMAND , MitM_Attack );
93+ ServerTestConfig stconfig = new ServerTestConfig ();
94+ jc .addCommand (ServerTestConfig .COMMAND , stconfig );
95+
96+ jc .parse (args );
97+
98+ if (generalConfig .isHelp () || jc .getParsedCommand () == null ) {
99+ jc .usage ();
100+ return ;
101+ }
102+
103+ Attacker attacker ;
104+ switch (jc .getParsedCommand ()) {
105+ case MultiFuzzerConfig .COMMAND :
106+ startMultiFuzzer (cmconfig , generalConfig , jc );
107+ return ;
108+ case ServerCommandConfig .COMMAND :
109+ startSimpleTls (generalConfig , server , jc );
110+ return ;
111+ case ClientCommandConfig .COMMAND :
112+ startSimpleTls (generalConfig , client , jc );
113+ return ;
114+ case ServerTestConfig .COMMAND :
115+ ServerTestSuite st = new ServerTestSuite (stconfig , generalConfig );
116+ st .startTests ();
117+ return ;
118+ case BleichenbacherCommandConfig .ATTACK_COMMAND :
119+ attacker = new BleichenbacherAttack (bleichenbacherTest );
120+ break ;
121+ case InvalidCurveAttackCommandConfig .ATTACK_COMMAND :
122+ attacker = new InvalidCurveAttack (ellipticTest );
123+ break ;
124+ case InvalidCurveAttackFullCommandConfig .ATTACK_COMMAND :
125+ attacker = new InvalidCurveAttackFull (elliptic );
126+ break ;
127+ case HeartbleedCommandConfig .ATTACK_COMMAND :
128+ attacker = new HeartbleedAttack (heartbleed );
129+ break ;
130+ case PoodleCommandConfig .ATTACK_COMMAND :
131+ attacker = new PoodleAttack (poodle );
132+ break ;
133+ case PaddingOracleCommandConfig .ATTACK_COMMAND :
134+ attacker = new PaddingOracleAttack (paddingOracle );
135+ break ;
136+ case WinshockCommandConfig .ATTACK_COMMAND :
137+ attacker = new WinshockAttack (winshock );
138+ break ;
139+ case DtlsPaddingOracleAttackCommandConfig .ATTACK_COMMAND :
140+ attacker = new DtlsPaddingOracleAttack (dtlsPaddingOracleAttackTest );
141+ break ;
142+ case ManInTheMiddleAttackCommandConfig .ATTACK_COMMAND :
143+ attacker = new ManInTheMiddleAttack (MitM_Attack );
144+ break ;
145+ default :
146+ throw new ConfigurationException ("No command found" );
147+ }
148+ ConfigHandler configHandler = ConfigHandlerFactory .createConfigHandler ("client" );
149+ configHandler .initialize (generalConfig );
150+
151+ if (configHandler .printHelpForCommand (jc , attacker .getConfig ())) {
152+ return ;
153+ }
154+
155+ attacker .executeAttack (configHandler );
156+
157+ CommandConfig config = attacker .getConfig ();
158+ if (config .getWorkflowOutput () != null && !config .getWorkflowOutput ().isEmpty ()) {
159+ logWorkflowTraces (attacker .getTlsContexts (), config .getWorkflowOutput ());
160+ }
154161 }
155162
156163 private static void startMultiFuzzer (MultiFuzzerConfig fuzzerConfig , GeneralConfig generalConfig , JCommander jc ) {
157- MultiFuzzer fuzzer = new MultiFuzzer (fuzzerConfig , generalConfig );
158- if (fuzzerConfig .isHelp ()) {
159- jc .usage (MultiFuzzerConfig .ATTACK_COMMAND );
160- return ;
161- }
162- fuzzer .startFuzzer ();
164+ MultiFuzzer fuzzer = new MultiFuzzer (fuzzerConfig , generalConfig );
165+ if (fuzzerConfig .isHelp ()) {
166+ jc .usage (MultiFuzzerConfig .COMMAND );
167+ return ;
168+ }
169+ fuzzer .startFuzzer ();
163170 }
164171
165172 private static void startSimpleTls (GeneralConfig generalConfig , CommandConfig config , JCommander jc )
166- throws JAXBException , IOException {
167- ConfigHandler configHandler = ConfigHandlerFactory .createConfigHandler (jc .getParsedCommand ());
168- configHandler .initialize (generalConfig );
169-
170- if (configHandler .printHelpForCommand (jc , config )) {
171- return ;
172- }
173-
174- TransportHandler transportHandler = configHandler .initializeTransportHandler (config );
175- TlsContext tlsContext = configHandler .initializeTlsContext (config );
176- WorkflowExecutor workflowExecutor = configHandler .initializeWorkflowExecutor (transportHandler , tlsContext );
177-
178- try {
179- workflowExecutor .executeWorkflow ();
180- } catch (WorkflowExecutionException ex ) {
181- LOGGER .info (ex .getLocalizedMessage (), ex );
182- LOGGER .log (LogLevel .CONSOLE_OUTPUT ,
183- "The TLS protocol flow was not executed completely, follow the debug messages for more information." );
184- }
185-
186- transportHandler .closeConnection ();
187-
188- if (config .getWorkflowOutput () != null && !config .getWorkflowOutput ().isEmpty ()) {
189- FileOutputStream fos = new FileOutputStream (config .getWorkflowOutput ());
190- WorkflowTraceSerializer .write (fos , tlsContext .getWorkflowTrace ());
191- }
173+ throws JAXBException , IOException {
174+ ConfigHandler configHandler = ConfigHandlerFactory .createConfigHandler (jc .getParsedCommand ());
175+ configHandler .initialize (generalConfig );
176+
177+ if (configHandler .printHelpForCommand (jc , config )) {
178+ return ;
179+ }
180+
181+ TransportHandler transportHandler = configHandler .initializeTransportHandler (config );
182+ TlsContext tlsContext = configHandler .initializeTlsContext (config );
183+ WorkflowExecutor workflowExecutor = configHandler .initializeWorkflowExecutor (transportHandler , tlsContext );
184+
185+ try {
186+ workflowExecutor .executeWorkflow ();
187+ } catch (WorkflowExecutionException ex ) {
188+ LOGGER .info (ex .getLocalizedMessage (), ex );
189+ LOGGER .log (LogLevel .CONSOLE_OUTPUT ,
190+ "The TLS protocol flow was not executed completely, follow the debug messages for more information." );
191+ }
192+
193+ transportHandler .closeConnection ();
194+
195+ if (config .getWorkflowOutput () != null && !config .getWorkflowOutput ().isEmpty ()) {
196+ FileOutputStream fos = new FileOutputStream (config .getWorkflowOutput ());
197+ WorkflowTraceSerializer .write (fos , tlsContext .getWorkflowTrace ());
198+ }
192199 }
193200
194201 private static void logWorkflowTraces (List <TlsContext > tlsContexts , String fileName ) throws JAXBException ,
195- FileNotFoundException , IOException {
196- int i = 0 ;
197- for (TlsContext context : tlsContexts ) {
198- i ++;
199- FileOutputStream fos = new FileOutputStream (fileName + i );
200- WorkflowTraceSerializer .write (fos , context .getWorkflowTrace ());
201- }
202+ FileNotFoundException , IOException {
203+ int i = 0 ;
204+ for (TlsContext context : tlsContexts ) {
205+ i ++;
206+ FileOutputStream fos = new FileOutputStream (fileName + i );
207+ WorkflowTraceSerializer .write (fos , context .getWorkflowTrace ());
208+ }
202209 }
203210}
0 commit comments