Browse Source

Added SSL support (only ports > 1024 for now)
Added HTTPS (on port 50505)

qam 10 years ago
parent
commit
26dfed9166

+ 1 - 0
res/values/protocols.xml

@@ -3,6 +3,7 @@
 
     <string-array name="protocols">
         <item>FTP</item>
+        <item>HTTPS</item>
         <item>HTTP</item>
         <item>SMB</item>
         <item>SSH</item>

+ 15 - 2
src/de/tudarmstadt/informatik/hostage/HoneyListener.java

@@ -5,6 +5,9 @@ import java.net.Socket;
 import java.util.ArrayList;
 import java.util.Iterator;
 
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLSocket;
+
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
@@ -60,7 +63,13 @@ public class HoneyListener implements Runnable {
 
 	public void start() {
 		try {
-			server = new MyServerSocketFactory().createServerSocket(protocol
+			if(protocol.isSecure())
+				//TODO
+//				server = new MyServerSocketFactory().createServerSocket(
+//						protocol.getPort(), protocol.getSSLContext());
+				server = (SSLServerSocket) protocol.getSSLContext().getServerSocketFactory().createServerSocket(protocol.getPort());
+			else
+				server = new MyServerSocketFactory().createServerSocket(protocol
 					.getPort());
 			(this.thread = new Thread(this)).start();
 	    	editor.putBoolean(protocol + MainActivity.LISTENER, true);
@@ -100,7 +109,11 @@ public class HoneyListener implements Runnable {
 
 	private void addHandler() {
 		try {
-			Socket client = server.accept();
+			Socket client; 
+			if(protocol.isSecure()) 
+				client = (SSLSocket) server.accept();
+			else
+				client = server.accept();
 			handlers.add(newInstance(service, this, protocol.getClass()
 					.newInstance(), client));
 	    	int handlerCount = pref.getInt(protocol + MainActivity.HANDLER_COUNT, 0);

+ 20 - 0
src/de/tudarmstadt/informatik/hostage/net/MyServerSocketFactory.java

@@ -8,6 +8,8 @@ import java.net.ServerSocket;
 import java.net.SocketImpl;
 
 import javax.net.ServerSocketFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocket;
 
 import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
 
@@ -33,6 +35,24 @@ public class MyServerSocketFactory extends ServerSocketFactory {
 
 		return socket;
 	}
+	
+	public ServerSocket createServerSocket(int port, SSLContext sslc) throws IOException {
+		//TODO
+		FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
+
+		ServerSocketFactory ssf = sslc.getServerSocketFactory();
+		ServerSocket socket = ssf.createServerSocket();
+		try {
+			SocketImpl impl = getImpl(socket);
+			injectFD(fd, impl);
+			injectImpl(impl, socket);
+			setBound(socket);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return socket;
+	}
 
 	/**
 	 * Extracts the SocketImpl out of a ServerSocket.

+ 6 - 0
src/de/tudarmstadt/informatik/hostage/protocol/ECHO.java

@@ -3,6 +3,8 @@ 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;
 
 public class ECHO implements Protocol<ByteArray>{
@@ -45,4 +47,8 @@ public class ECHO implements Protocol<ByteArray>{
 		return "ECHO";
 	}
 
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
 }

+ 7 - 0
src/de/tudarmstadt/informatik/hostage/protocol/FTP.java

@@ -4,6 +4,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
 
+import javax.net.ssl.SSLContext;
+
 /**
  * FTP protocol
  */
@@ -107,5 +109,10 @@ public final class FTP implements Protocol<String> {
 	public String toString() {
 		return "FTP";
 	}
+	
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
 
 }

+ 7 - 0
src/de/tudarmstadt/informatik/hostage/protocol/HTTP.java

@@ -3,6 +3,8 @@ package de.tudarmstadt.informatik.hostage.protocol;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.net.ssl.SSLContext;
+
 /**
  * HTTP protocol
  * @author Wulf Pfeiffer
@@ -85,6 +87,11 @@ public final class HTTP implements Protocol<String> {
 	public String toString() {
 		return "HTTP";
 	}
+	
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
 
 	/**
 	 * Builds a html response that can be sent

+ 109 - 0
src/de/tudarmstadt/informatik/hostage/protocol/HTTPS.java

@@ -0,0 +1,109 @@
+package de.tudarmstadt.informatik.hostage.protocol;
+
+import java.io.FileInputStream;
+import java.security.KeyStore;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+
+public class HTTPS implements Protocol<String> {
+
+	private static enum STATE {
+		NONE, OPEN, CLOSED
+	};
+
+	private STATE state = STATE.NONE;
+	
+	@Override
+	public int getPort() {
+		//TODO
+		return 50505;
+	}
+
+	@Override
+	public TALK_FIRST whoTalksFirst() {
+		return TALK_FIRST.CLIENT;
+	}
+
+	@Override
+	public List<String> processMessage(String message) {
+		List<String> response = new ArrayList<String>();
+		response.add(header+html);
+		state = STATE.CLOSED;
+		return response;
+	}
+
+	@Override
+	public boolean isClosed() {
+		return state == STATE.CLOSED;
+	}
+
+	@Override
+	public boolean isSecure() {
+		return true;
+	}
+
+	@Override
+	public Class<String> getType() {
+		return String.class;
+	}
+	
+	@Override
+	public String toString() {
+		return "HTTPS";
+	}
+
+	@Override
+	public SSLContext getSSLContext() {
+		String ksName = "/storage/sdcard0/server.bks";
+		char ksPass[] = "password".toCharArray();
+        
+		KeyStore ks;
+		KeyManagerFactory kmf = null;
+		try {
+			ks = KeyStore.getInstance(KeyStore.getDefaultType());
+			ks.load(new FileInputStream(ksName), ksPass);
+			kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+			kmf.init(ks, ksPass);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		SSLContext sslcontext = null;
+		try {
+			sslcontext = SSLContext.getInstance("SSLv3");
+			sslcontext.init(kmf.getKeyManagers(), null, null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return sslcontext;
+	}
+	
+	private String header =	
+			"HTTP/1.1 200 OK\r\n" +
+			"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" +	
+			"Keep-Alive: timeout=5, max=100\r\n" +
+			"Connection: Keep-Alive\r\n" +
+			"Content-Type: text/html\r\n" +
+			"\r\n";
+
+	private String html =	
+			"<!doctype html>\n" +
+			"<html lang=\"en\">\n" +
+			"<head>\n" +
+			"<meta charset=\"UTF-8\">\n" +
+			"<title>Test successful</title>\n" +
+			"</head>\n" +
+			"<body>\n" +
+			"<h1>Test successful</h1>\n" +
+			"<p>Congratulations.</p>\n" +
+			"</body>\n" +
+			"</html>";
+
+}

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

@@ -4,6 +4,8 @@ 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;
 
@@ -80,6 +82,11 @@ public class MySQL implements Protocol<ByteArray>{
 		return state == STATE.CLOSED;
 	}
 	
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
+	
 	/**
 	 * Wraps the response packet with the packet length and number
 	 * @param packet that is wrapped

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

@@ -2,6 +2,8 @@ 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
@@ -58,5 +60,7 @@ public interface Protocol<T> {
 	 */
 	@Override 
 	String toString();
+	
+	SSLContext getSSLContext();
 
 }

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

@@ -7,6 +7,8 @@ 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;
 
@@ -131,6 +133,11 @@ public final class SMB implements Protocol<ByteArray> {
 	public String toString() {
 		return "SMB";
 	}
+	
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
 
 	/**
 	 * Converts the current system time into a byte[] with windows specific time

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

@@ -17,6 +17,7 @@ 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;
@@ -158,6 +159,11 @@ public final class SSH implements Protocol<ByteArray> {
 		return "SSH";
 	}
 	
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
+	
 	/**
 	 * Wraps the packets with packet length and padding
 	 * @param packet content that is wrapped

+ 7 - 0
src/de/tudarmstadt/informatik/hostage/protocol/TELNET.java

@@ -3,6 +3,8 @@ 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;
 
@@ -146,6 +148,11 @@ public final class TELNET implements Protocol<ByteArray> {
 	public Class<ByteArray> getType() {
 		return ByteArray.class;
 	}
+	
+	@Override
+	public SSLContext getSSLContext() {
+		return null;
+	}
 
 	/**
 	 * Determines which options that are requested by the client will be done and which not