Skip to content

Commit 013b4d8

Browse files
authored
Merge pull request #538 from RUB-NDS/high-precision-timing
High precision timing
2 parents 623e144 + 11cfa56 commit 013b4d8

File tree

14 files changed

+791
-27
lines changed

14 files changed

+791
-27
lines changed

Attacks/src/main/java/de/rub/nds/tlsattacker/attacks/Main.java

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,9 @@
99
package de.rub.nds.tlsattacker.attacks;
1010

1111
import com.beust.jcommander.JCommander;
12-
import de.rub.nds.tlsattacker.attacks.config.BleichenbacherCommandConfig;
13-
import de.rub.nds.tlsattacker.attacks.config.Cve20162107CommandConfig;
14-
import de.rub.nds.tlsattacker.attacks.config.DrownCommandConfig;
15-
import de.rub.nds.tlsattacker.attacks.config.EarlyCCSCommandConfig;
16-
import de.rub.nds.tlsattacker.attacks.config.HeartbleedCommandConfig;
17-
import de.rub.nds.tlsattacker.attacks.config.InvalidCurveAttackConfig;
18-
import de.rub.nds.tlsattacker.attacks.config.PaddingOracleCommandConfig;
19-
import de.rub.nds.tlsattacker.attacks.config.PoodleCommandConfig;
20-
import de.rub.nds.tlsattacker.attacks.config.PskBruteForcerAttackClientCommandConfig;
21-
import de.rub.nds.tlsattacker.attacks.config.PskBruteForcerAttackServerCommandConfig;
22-
import de.rub.nds.tlsattacker.attacks.config.SimpleMitmProxyCommandConfig;
23-
import de.rub.nds.tlsattacker.attacks.config.TLSPoodleCommandConfig;
12+
import de.rub.nds.tlsattacker.attacks.config.*;
2413
import de.rub.nds.tlsattacker.attacks.config.delegate.GeneralAttackDelegate;
25-
import de.rub.nds.tlsattacker.attacks.impl.Attacker;
26-
import de.rub.nds.tlsattacker.attacks.impl.BleichenbacherAttacker;
27-
import de.rub.nds.tlsattacker.attacks.impl.Cve20162107Attacker;
28-
import de.rub.nds.tlsattacker.attacks.impl.DrownAttacker;
29-
import de.rub.nds.tlsattacker.attacks.impl.EarlyCCSAttacker;
30-
import de.rub.nds.tlsattacker.attacks.impl.HeartbleedAttacker;
31-
import de.rub.nds.tlsattacker.attacks.impl.InvalidCurveAttacker;
32-
import de.rub.nds.tlsattacker.attacks.impl.PaddingOracleAttacker;
33-
import de.rub.nds.tlsattacker.attacks.impl.PoodleAttacker;
34-
import de.rub.nds.tlsattacker.attacks.impl.PskBruteForcerAttackClient;
35-
import de.rub.nds.tlsattacker.attacks.impl.PskBruteForcerAttackServer;
36-
import de.rub.nds.tlsattacker.attacks.impl.SimpleMitmProxy;
37-
import de.rub.nds.tlsattacker.attacks.impl.TLSPoodleAttacker;
14+
import de.rub.nds.tlsattacker.attacks.impl.*;
3815
import de.rub.nds.tlsattacker.core.config.TLSDelegateConfig;
3916
import de.rub.nds.tlsattacker.core.config.delegate.GeneralDelegate;
4017
import de.rub.nds.tlsattacker.core.exceptions.ConfigurationException;
@@ -70,6 +47,10 @@ public static void main(String[] args) {
7047
jc.addCommand(InvalidCurveAttackConfig.ATTACK_COMMAND, ellipticTest);
7148
HeartbleedCommandConfig heartbleed = new HeartbleedCommandConfig(generalDelegate);
7249
jc.addCommand(HeartbleedCommandConfig.ATTACK_COMMAND, heartbleed);
50+
51+
Lucky13CommandConfig lucky13 = new Lucky13CommandConfig(generalDelegate);
52+
jc.addCommand(Lucky13CommandConfig.ATTACK_COMMAND, lucky13);
53+
7354
PaddingOracleCommandConfig paddingOracle = new PaddingOracleCommandConfig(generalDelegate);
7455
jc.addCommand(PaddingOracleCommandConfig.ATTACK_COMMAND, paddingOracle);
7556
TLSPoodleCommandConfig tlsPoodle = new TLSPoodleCommandConfig(generalDelegate);
@@ -104,6 +85,9 @@ public static void main(String[] args) {
10485
case HeartbleedCommandConfig.ATTACK_COMMAND:
10586
attacker = new HeartbleedAttacker(heartbleed, heartbleed.createConfig());
10687
break;
88+
case Lucky13CommandConfig.ATTACK_COMMAND:
89+
attacker = new Lucky13Attacker(lucky13, lucky13.createConfig());
90+
break;
10791
case TLSPoodleCommandConfig.ATTACK_COMMAND:
10892
attacker = new TLSPoodleAttacker(tlsPoodle, tlsPoodle.createConfig());
10993
break;
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/**
2+
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
3+
*
4+
* Copyright 2014-2017 Ruhr University Bochum / Hackmanit GmbH
5+
*
6+
* Licensed under Apache License 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*/
9+
package de.rub.nds.tlsattacker.attacks.config;
10+
11+
import com.beust.jcommander.Parameter;
12+
import com.beust.jcommander.ParametersDelegate;
13+
import de.rub.nds.tlsattacker.attacks.config.delegate.ProxyDelegate;
14+
import de.rub.nds.tlsattacker.core.config.Config;
15+
import de.rub.nds.tlsattacker.core.config.delegate.*;
16+
17+
import java.util.LinkedList;
18+
import java.util.List;
19+
20+
import de.rub.nds.tlsattacker.core.constants.CipherSuite;
21+
22+
/**
23+
*
24+
*/
25+
public class Lucky13CommandConfig extends AttackConfig {
26+
27+
public static final String ATTACK_COMMAND = "lucky13";
28+
29+
@Parameter(names = "-measurements", description = "Number of timing measurement iterations")
30+
private Integer measurements = 100;
31+
32+
@Parameter(names = "-mona_file", description = "File output for Mona timing lib. If set, the output is generated and written.")
33+
private String monaFile;
34+
35+
@Parameter(names = "-mona_jar", description = "Location of the ReportingTool.jar file.")
36+
private String monaJar = "ReportingTool.jar";
37+
38+
@Parameter(names = "-paddings", description = "Paddings to check for differences, column separated.")
39+
private String paddings = "0,255";
40+
41+
@Parameter(names = "-blocks", description = "Number of blocks to encrypt (default is set to the value from the Lucky 13 paper, Section 3)")
42+
private Integer blocks = 18;
43+
44+
@ParametersDelegate
45+
private ClientDelegate clientDelegate;
46+
@ParametersDelegate
47+
private HostnameExtensionDelegate hostnameExtensionDelegate;
48+
@ParametersDelegate
49+
private CiphersuiteDelegate ciphersuiteDelegate;
50+
@ParametersDelegate
51+
private ProtocolVersionDelegate protocolVersionDelegate;
52+
@ParametersDelegate
53+
private StarttlsDelegate starttlsDelegate;
54+
@ParametersDelegate
55+
private ProxyDelegate proxyDelegate;
56+
57+
/**
58+
*
59+
* @param delegate
60+
*/
61+
public Lucky13CommandConfig(GeneralDelegate delegate) {
62+
super(delegate);
63+
clientDelegate = new ClientDelegate();
64+
hostnameExtensionDelegate = new HostnameExtensionDelegate();
65+
ciphersuiteDelegate = new CiphersuiteDelegate();
66+
protocolVersionDelegate = new ProtocolVersionDelegate();
67+
starttlsDelegate = new StarttlsDelegate();
68+
addDelegate(clientDelegate);
69+
addDelegate(hostnameExtensionDelegate);
70+
addDelegate(ciphersuiteDelegate);
71+
addDelegate(protocolVersionDelegate);
72+
addDelegate(starttlsDelegate);
73+
addDelegate(proxyDelegate);
74+
}
75+
76+
public Integer getMeasurements() {
77+
return measurements;
78+
}
79+
80+
public void setMeasurements(Integer measurements) {
81+
this.measurements = measurements;
82+
}
83+
84+
public String getMonaFile() {
85+
return monaFile;
86+
}
87+
88+
public void setMonaFile(String monaFile) {
89+
this.monaFile = monaFile;
90+
}
91+
92+
public String getMonaJar() {
93+
return monaJar;
94+
}
95+
96+
public void setMonaJar(String monaJar) {
97+
this.monaJar = monaJar;
98+
}
99+
100+
public String getPaddings() {
101+
return paddings;
102+
}
103+
104+
public void setPaddings(String paddings) {
105+
this.paddings = paddings;
106+
}
107+
108+
public Integer getBlocks() {
109+
return blocks;
110+
}
111+
112+
public void setBlocks(Integer blocks) {
113+
this.blocks = blocks;
114+
}
115+
116+
/**
117+
*
118+
* @return
119+
*/
120+
@Override
121+
public boolean isExecuteAttack() {
122+
return false;
123+
}
124+
125+
/**
126+
*
127+
* @return
128+
*/
129+
@Override
130+
public Config createConfig() {
131+
Config config = super.createConfig();
132+
if (ciphersuiteDelegate.getCipherSuites() == null) {
133+
/*
134+
* No explicit cipher suites are set. Use the default cipher suites
135+
* for this attack
136+
*/
137+
List<CipherSuite> suiteList = new LinkedList<>();
138+
suiteList.add(CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA);
139+
config.setDefaultServerSupportedCiphersuites(suiteList);
140+
config.setDefaultClientSupportedCiphersuites(suiteList);
141+
config.setDefaultSelectedCipherSuite(suiteList.get(0));
142+
}
143+
return config;
144+
}
145+
146+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
3+
*
4+
* Copyright 2014-2017 Ruhr University Bochum / Hackmanit GmbH
5+
*
6+
* Licensed under Apache License 2.0
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*/
9+
package de.rub.nds.tlsattacker.attacks.config.delegate;
10+
11+
import com.beust.jcommander.Parameter;
12+
import com.beust.jcommander.ParameterException;
13+
import de.rub.nds.tlsattacker.core.config.Config;
14+
import de.rub.nds.tlsattacker.core.config.delegate.Delegate;
15+
import de.rub.nds.tlsattacker.core.connection.OutboundConnection;
16+
17+
/**
18+
*
19+
* @author ic0ns
20+
*/
21+
public class ProxyDelegate extends Delegate {
22+
23+
@Parameter(names = "-proxyData", description = "Specify the host and port for data used in the proxy. Syntax: localhost:4444")
24+
private String proxyData = "localhost:4444";
25+
26+
@Parameter(names = "-proxyControl", description = "Specify the host and port for control messafes used in the proxy. Syntax: localhost:5555")
27+
private String proxyControl = "localhost:5555";
28+
29+
@Override
30+
public void applyDelegate(Config config) {
31+
32+
OutboundConnection con = config.getDefaultClientConnection();
33+
if (con == null) {
34+
con = new OutboundConnection();
35+
config.setDefaultClientConnection(con);
36+
}
37+
if (proxyData != null) {
38+
String[] parsedProxyData = proxyData.split(":");
39+
switch (parsedProxyData.length) {
40+
case 1:
41+
con.setProxyDataHostname(proxyData);
42+
break;
43+
case 2:
44+
con.setProxyDataHostname(parsedProxyData[0]);
45+
con.setProxyDataPort(parsePort(parsedProxyData[1]));
46+
break;
47+
default:
48+
throw new ParameterException("Could not parse provided proxyData: " + proxyData);
49+
}
50+
}
51+
52+
if (proxyControl != null) {
53+
String[] parsedProxyControl = proxyControl.split(":");
54+
switch (parsedProxyControl.length) {
55+
case 1:
56+
con.setProxyControlHostname(proxyControl);
57+
break;
58+
case 2:
59+
con.setProxyControlHostname(parsedProxyControl[0]);
60+
con.setProxyControlPort(parsePort(parsedProxyControl[1]));
61+
break;
62+
default:
63+
throw new ParameterException("Could not parse provided proxyControl: " + proxyControl);
64+
}
65+
}
66+
}
67+
68+
private int parsePort(String portStr) {
69+
int port = Integer.parseInt(portStr);
70+
if (port < 0 || port > 65535) {
71+
throw new ParameterException("port must be in interval [0,65535], but is " + port);
72+
}
73+
return port;
74+
}
75+
}

0 commit comments

Comments
 (0)