Browse Source

Changed protocols to give error instead of unimplemented
Fixed some small issues
Updated HTTPS

qam 10 years ago
parent
commit
4971c0cd3f

+ 3 - 3
res/values/protocols.xml

@@ -2,14 +2,14 @@
 <resources>
 
     <string-array name="protocols">
+		<item>ECHO</item>
         <item>FTP</item>
-        <item>HTTPS</item>
         <item>HTTP</item>
+        <item>HTTPS</item>
+        <item>MySQL</item>
         <item>SMB</item>
         <item>SSH</item>
         <item>TELNET</item>
-        <item>MySQL</item>
-        <item>ECHO</item>
     </string-array>
 
 </resources>

+ 4 - 2
src/de/tudarmstadt/informatik/hostage/protocol/ECHO.java

@@ -3,10 +3,12 @@ package de.tudarmstadt.informatik.hostage.protocol;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.net.ssl.SSLContext;
-
 import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 
+/**
+ * ECHO protocol
+ * @author Wulf Pfeiffer
+ */
 public class ECHO implements Protocol<ByteArray>{
 
 	@Override

+ 29 - 27
src/de/tudarmstadt/informatik/hostage/protocol/FTP.java

@@ -2,12 +2,10 @@ package de.tudarmstadt.informatik.hostage.protocol;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.net.ssl.SSLContext;
 
 /**
  * FTP protocol
+ * @author Wulf Pfeiffer
  */
 public final class FTP implements Protocol<String> {
 	/**
@@ -39,60 +37,64 @@ public final class FTP implements Protocol<String> {
 		case NONE:
 			if (message == null) {
 				state = STATE.OPEN;
-				response.add("220 Service ready for new user.");
+				response.add(c220);
 			} else {
 				state = STATE.CLOSED;
-				response.add("421 Service not available, closing control connection.");
+				response.add(c421);
 			}
 			break;
 		case OPEN:
-			if (Pattern.matches("^QUIT\\s?", message)) {
+			if (message.contains("QUIT")) {
 				state = STATE.CLOSED;
 				return null;
-			} else if (Pattern.matches("^USER (\\w)+$", message)) {
+			} else if (message.equals("USER \r\n")) {
+				response.add(c501);
+			} else if (message.contains("USER")) {
 				state = STATE.USER;
-				response.add("331 User name ok, need password.");
-			} else if (message != null && Pattern.matches("^USER\\s?", message)) {
-				response.add("530 Not logged in.");
-			} else if (message != null && Pattern.matches("^USER.*", message)) {
-				response.add("501 Syntax error in parameters or arguments");
+				response.add(c331);
 			} else {
-				response.add("332 Need account for login.");
+				response.add(c332);
 			}
 			break;
 		case USER:
-			if (Pattern.matches("^PASS (\\S)+$", message)) {
-				state = STATE.LOGGED_IN;
-				response.add("230 User logged in.");
-			} else if (Pattern.matches("^PASS.*", message)) {
+			if (message.equals("PASS \r\n")) {
 				state = STATE.OPEN;
-				response.add("501 Syntax error in parameters or arguments");
+				response.add(c501);
+			} else if (message.contains("PASS")) {
+				state = STATE.LOGGED_IN;
+				response.add(c230);
 			} else {
 				state = STATE.CLOSED;
-				response.add("221 Service closing control connection.");
+				response.add(c221);
 			}
 			break;
 		case LOGGED_IN:
-			if (Pattern.matches("^QUIT\\s?", message)) {
-				state = STATE.CLOSED;
-				response.add("221 Service closing control connection.");
-			} else if (message != null) {
-				response.add("502 Command not implemented.");
+			if (message != null && !message.contains("QUIT")) {
+				response.add(c500);
 			} else {
 				state = STATE.CLOSED;
-				response.add("221 Service closing control connection.");
+				response.add(c221);
 			}
 			break;
 		default:
 			state = STATE.CLOSED;
-			response.add("421 Service not available, closing control connection.");
+			response.add(c421);
 		}
 		return response;
 	}
+	
+	private String c220 = "220 Service ready for new user.";
+	private String c221 = "221 Service closing control connection.";
+	private String c230 = "230 User logged in.";
+	private String c331 = "331 User name ok, need password.";
+	private String c332 = "332 Need account for login.";
+	private String c421 = "421 Service not available, closing control connection.";
+	private String c500 = "500 Syntax error, command unrecognized.";
+	private String c501 = "501 Syntax error in parameters or arguments";
 
 	@Override
 	public boolean isClosed() {
-		return (state == STATE.CLOSED);
+		return state == STATE.CLOSED;
 	}
 
 	@Override

+ 27 - 48
src/de/tudarmstadt/informatik/hostage/protocol/HTTP.java

@@ -3,26 +3,12 @@ package de.tudarmstadt.informatik.hostage.protocol;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.net.ssl.SSLContext;
-
 /**
  * HTTP protocol
  * @author Wulf Pfeiffer
  */
 public final class HTTP implements Protocol<String> {
 	
-	/**
-	 * Represents the states of the protocol
-	 */
-	private enum STATE {
-		NONE, CLOSED
-	}
-
-	/**
-	 * Denotes in which state the protocol is right now
-	 */
-	private STATE state = STATE.NONE;
-	
 	@Override
 	public int getPort() {
 		return 80;
@@ -37,40 +23,34 @@ public final class HTTP implements Protocol<String> {
 	public List<String> processMessage(String message) {
 		List<String> response = new ArrayList<String>();
 		request = message + request;
-		
-		switch(state) {
-		case NONE:
-			if(!message.contains(version)){
-				response.add(buildPacket(versionUnsupported, ""));
-			} else if(message.contains(get)) {
-				response.add(buildPacket(ok, get));
-			} else if(message.contains(head)) {
-				response.add(buildPacket(ok, head));
-			} else if(message.contains(trace)){
-				response.add(buildPacket(ok, trace));
-			} else if(message.contains(options)){
-				response.add(buildPacket(methodNotAllowed, options));
-			} else if(message.contains(post)){
-				response.add(buildPacket(methodNotAllowed, post));
-			} else if(message.contains(put)){
-				response.add(buildPacket(methodNotAllowed, put));
-			} else if(message.contains(delete)){
-				response.add(buildPacket(methodNotAllowed, delete));
-			} else if(message.contains(connect)){
-				response.add(buildPacket(methodNotAllowed, connect));
-			} else {
-				response.add(buildPacket(badRequest, ""));
-			}
-			state = STATE.CLOSED;
-		default:
-			state = STATE.CLOSED;
+
+		if(!message.contains(version)){
+			response.add(buildPacket(c505, ""));
+		} else if(message.contains(get)) {
+			response.add(buildPacket(c200, get));
+		} else if(message.contains(head)) {
+			response.add(buildPacket(c200, head));
+		} else if(message.contains(trace)){
+			response.add(buildPacket(c200, trace));
+		} else if(message.contains(options)){
+			response.add(buildPacket(c400, options));
+		} else if(message.contains(post)){
+			response.add(buildPacket(c400, post));
+		} else if(message.contains(put)){
+			response.add(buildPacket(c400, put));
+		} else if(message.contains(delete)){
+			response.add(buildPacket(c400, delete));
+		} else if(message.contains(connect)){
+			response.add(buildPacket(c400, connect));
+		} else {
+			response.add(buildPacket(c400, ""));
 		}
 		return response;
 	}
 
 	@Override
 	public boolean isClosed() {
-		return state == STATE.CLOSED;
+		return true;
 	}
 
 	@Override
@@ -105,8 +85,8 @@ public final class HTTP implements Protocol<String> {
 	}
 
 	/** Whole request that was sent by the client */
-	private String request = "";
-	private String version = "HTTP/1.1";
+	private String request	= "";
+	private String version	= "HTTP/1.1";
 	//request codes
 	private String options 	= "OPTIONS";
 	private String get 		= "GET";
@@ -117,10 +97,9 @@ public final class HTTP implements Protocol<String> {
 	private String trace	= "TRACE";
 	private String connect	= "CONNECT";
 	//response codes
-	private String ok 					= " 200 OK\r\n";
-	private String badRequest 			= " 400 Bad Request\r\n";
-	private String methodNotAllowed 	= " 405 Method Not Allowed\r\n";
-	private String versionUnsupported 	= " 505 HTTP Version not supported\r\n";
+	private String c200 	= " 200 OK\r\n";
+	private String c400 	= " 400 Bad Request\r\n";
+	private String c505 	= " 505 HTTP Version not supported\r\n";
 	
 	//html header pre and suffix
 	private String headerPrefix =				

+ 81 - 15
src/de/tudarmstadt/informatik/hostage/protocol/HTTPS.java

@@ -8,13 +8,11 @@ import java.util.List;
 import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
 
+/**
+ * HTTPS protocol
+ * @author Wulf Pfeiffer
+ */
 public class HTTPS implements SSLProtocol<String> {
-
-	private static enum STATE {
-		NONE, OPEN, CLOSED
-	};
-
-	private STATE state = STATE.NONE;
 	
 	@Override
 	public int getPort() {
@@ -30,14 +28,35 @@ public class HTTPS implements SSLProtocol<String> {
 	@Override
 	public List<String> processMessage(String message) {
 		List<String> response = new ArrayList<String>();
-		response.add(header+html);
-		state = STATE.CLOSED;
+		request = message + request;
+
+		if(!message.contains(version)){
+			response.add(buildPacket(c505, ""));
+		} else if(message.contains(get)) {
+			response.add(buildPacket(c200, get));
+		} else if(message.contains(head)) {
+			response.add(buildPacket(c200, head));
+		} else if(message.contains(trace)){
+			response.add(buildPacket(c200, trace));
+		} else if(message.contains(options)){
+			response.add(buildPacket(c400, options));
+		} else if(message.contains(post)){
+			response.add(buildPacket(c400, post));
+		} else if(message.contains(put)){
+			response.add(buildPacket(c400, put));
+		} else if(message.contains(delete)){
+			response.add(buildPacket(c400, delete));
+		} else if(message.contains(connect)){
+			response.add(buildPacket(c400, connect));
+		} else {
+			response.add(buildPacket(c400, ""));
+		}
 		return response;
 	}
 
 	@Override
 	public boolean isClosed() {
-		return state == STATE.CLOSED;
+		return true;
 	}
 
 	@Override
@@ -81,19 +100,53 @@ public class HTTPS implements SSLProtocol<String> {
 		return sslcontext;
 	}
 	
-	private String header =	
-			"HTTP/1.1 200 OK\r\n" +
+	/**
+	 * Builds a html response that can be sent
+	 * @param code response code that was determined
+	 * @param type request type that was sent by the client
+	 * @return the html response
+	 */
+	private String buildPacket(String code, String type) {
+		String doc = "";
+		if(type.equals(get)) doc = htmlDoc;
+		else if(type.equals(head)) doc = "";
+		else if(type.equals(trace)) doc = request;
+		else doc = errorHtmlPrefix + code + errorHtmlSuffix;
+		
+		return version + code + headerPrefix + doc.length() + headerSuffix + doc;
+	}
+
+	/** Whole request that was sent by the client */
+	private String request	= "";
+	private String version	= "HTTP/1.1";
+	//request codes
+	private String options 	= "OPTIONS";
+	private String get 		= "GET";
+	private String head 	= "HEAD";
+	private String post		= "POST";
+	private String put		= "PUT";
+	private String delete	= "DELETE";
+	private String trace	= "TRACE";
+	private String connect	= "CONNECT";
+	//response codes
+	private String c200 	= " 200 OK\r\n";
+	private String c400 	= " 400 Bad Request\r\n";
+	private String c505 	= " 505 HTTP Version not supported\r\n";
+	
+	//html header pre and suffix
+	private String headerPrefix =				
 			"Date: Mon, 01 Jul 2013 18:27:55 GMT\r\n" +
 			"Server: Apache/2.2.22 (Debian)\r\n" +
-			"X-Powered-By: PHP/5.4.4.-14\r\n" +
 			"Vary: Accept-Encoding\r\n" +
-			"Content-Length: 173\r\n" +	
+			"Content-Length: ";
+	private String headerSuffix =
+			"\r\n" +	
 			"Keep-Alive: timeout=5, max=100\r\n" +
 			"Connection: Keep-Alive\r\n" +
 			"Content-Type: text/html\r\n" +
 			"\r\n";
-
-	private String html =	
+	//html website
+	private String htmlDoc = 
 			"<!doctype html>\n" +
 			"<html lang=\"en\">\n" +
 			"<head>\n" +
@@ -105,5 +158,18 @@ public class HTTPS implements SSLProtocol<String> {
 			"<p>Congratulations.</p>\n" +
 			"</body>\n" +
 			"</html>";
+	//html error pre and suffix
+	private String errorHtmlPrefix =
+			"<!doctype html>\n" +
+			"<html lang=\"en\">\n" +
+			"<head>\n" +
+			"<meta charset=\"UTF-8\">\n" +
+			"<title>";
+	private String errorHtmlSuffix =
+			"</title>\n" +
+			"</head>\n" +
+			"<body>\n" +
+			"</body>\n" +
+			"</html>";
 
 }

+ 0 - 4
src/de/tudarmstadt/informatik/hostage/protocol/MySQL.java

@@ -4,8 +4,6 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.net.ssl.SSLContext;
-
 import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 
@@ -48,8 +46,6 @@ public class MySQL implements Protocol<ByteArray>{
 		case LOGIN_INFO:
 			if(this.request[4] == 0x01) {
 				state = STATE.CLOSED;
-			} else if(this.request[4] == 0x03) {
-				response.add(new ByteArray(responseOK()));
 			} else {
 				response.add(new ByteArray(responseError()));
 			}

+ 0 - 2
src/de/tudarmstadt/informatik/hostage/protocol/Protocol.java

@@ -2,8 +2,6 @@ package de.tudarmstadt.informatik.hostage.protocol;
 
 import java.util.List;
 
-import javax.net.ssl.SSLContext;
-
 /**
  * Interface for protocols that are used by hostage
  * @param <T> Denotes if the protocol is using Strings or ByteArrays

+ 0 - 2
src/de/tudarmstadt/informatik/hostage/protocol/SMB.java

@@ -7,8 +7,6 @@ import java.util.List;
 import java.util.Random;
 import java.util.TimeZone;
 
-import javax.net.ssl.SSLContext;
-
 import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 

+ 0 - 2
src/de/tudarmstadt/informatik/hostage/protocol/SSH.java

@@ -17,8 +17,6 @@ import javax.crypto.KeyAgreement;
 import javax.crypto.interfaces.DHPublicKey;
 import javax.crypto.spec.DHParameterSpec;
 import javax.crypto.spec.DHPublicKeySpec;
-import javax.net.ssl.SSLContext;
-
 import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 

+ 9 - 1
src/de/tudarmstadt/informatik/hostage/protocol/SSLProtocol.java

@@ -1,8 +1,16 @@
 package de.tudarmstadt.informatik.hostage.protocol;
 
 import javax.net.ssl.SSLContext;
-
+/**
+ * Interface for ssl protocols that are used by hostage
+ * @author Wulf Pfeiffer
+ * @param <T> Denotes if the protocol is using Strings or ByteArrays
+ */
 public interface SSLProtocol<T> extends Protocol<T> {
 
+	/**
+	 * Returns the initialized SSL Context with the KeyManager and TrustManager that will be used
+	 * @return the used SSLContext
+	 */
 	SSLContext getSSLContext();
 }

+ 3 - 5
src/de/tudarmstadt/informatik/hostage/protocol/TELNET.java

@@ -3,8 +3,6 @@ package de.tudarmstadt.informatik.hostage.protocol;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.net.ssl.SSLContext;
-
 import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 
@@ -58,7 +56,7 @@ public final class TELNET implements Protocol<ByteArray> {
 			if(request != null) {
 				response.add(new ByteArray(getOptionResponse(request)));
 				response.add(new ByteArray("Debian GNU/Linux 7.0\r\n"));
-				response.add(new ByteArray(server + "login: "));
+				response.add(new ByteArray(server + " login: "));
 				state = STATE.LOGIN;
 			}
 			break;
@@ -68,7 +66,7 @@ public final class TELNET implements Protocol<ByteArray> {
 				response.add(new ByteArray("\r\n"));
 				response.add(new ByteArray("Password: "));
 				state = STATE.AUTHENTICATE;
-				sessionToken = HelperUtils.concat(sessionPrefix, "@".getBytes(), server.getBytes(), sessionMiddle, "@".getBytes(), server.getBytes(), sessionSuffix);
+				sessionToken = HelperUtils.concat(sessionPrefix, user, "@".getBytes(), server.getBytes(), sessionMiddle, user, "@".getBytes(), server.getBytes(), sessionSuffix);
 				break;
 			} else if (request[0] == 0x7f) {
 				byte[] tmp = new byte[user.length - 1];
@@ -86,7 +84,7 @@ public final class TELNET implements Protocol<ByteArray> {
 		case AUTHENTICATE:
 			if(request == null) break;
 			else if(request[0] == 0x0d) {
-				response.add(new ByteArray("Last Login: \r\nLinux" + server + " 3.6.11+\r\n"));
+				response.add(new ByteArray("\r\nLast Login: \r\nLinux" + server + " 3.6.11+\r\n"));
 				response.add(new ByteArray(sessionToken));
 				state = STATE.LOGGED_IN;
 			} else if (request[0] == 0x7f) {