Browse Source

Changed log to view packet information
Changed formating of the log
Added possibilty to change sleeptime in preferences

qam 10 years ago
parent
commit
68c3da3eb0

+ 2 - 0
res/values/strings_preferences.xml

@@ -18,6 +18,8 @@
 	<string name="pref_max_connections_default">5</string>	
 	<string name="pref_timeout">SocketTimeout(in seconds)</string>	
 	<string name="pref_timeout_default">30</string>	
+	<string name="pref_sleeptime">Stream Sleeptime(in mseconds)</string>
+	<string name="pref_sleeptime_default">500</string>
 	<string name="pref_connection_settings">Connection Settings</string>
 	
 </resources>

+ 5 - 1
res/xml/preferences.xml

@@ -49,7 +49,11 @@
             android:key="pref_timeout"
             android:defaultValue="@string/pref_timeout_default"
             android:title="@string/pref_timeout" />
-            
+          
+          <EditTextPreference
+            android:key="pref_sleeptime"
+            android:defaultValue="@string/pref_sleeptime_default"
+            android:title="@string/pref_sleeptime" />
     </PreferenceCategory>
 
 

+ 38 - 0
src/de/tudarmstadt/informatik/hostage/commons/HelperUtils.java

@@ -213,4 +213,42 @@ public final class HelperUtils {
 		}
 		return dst;
 	}
+	
+	/**
+	 * Converts a byte[] to a String, but only characters in ASCII between 32 and 127
+	 * @param bytes that are converted
+	 * @return converted String
+	 */
+	public static String byteToStr(byte[] bytes) {
+		char[] chars = new char[bytes.length];
+		for (int i = 0, j = 0; i < bytes.length && j < chars.length; i++) {
+			if (isLetter((char) bytes[i])) {
+				chars[j] = (char) bytes[i];
+				j++;
+			}
+		}
+		return new String(chars);
+	}
+
+	/**
+	 * Determines if a character is in ASCII between 32 and 126
+	 * @param character that is checked 
+	 * @return true if the character is between 32 and 126, else false
+	 */
+	private static boolean isLetter(char character) {
+		return (character > 31 && character < 127);
+	}
+	
+	
+	public static String bytesToHex(byte[] bytes) {
+		char[] hexArray = "0123456789ABCDEF".toCharArray();
+	    char[] hexChars = new char[bytes.length * 2];
+	    int v;
+	    for ( int j = 0; j < bytes.length; j++ ) {
+	        v = bytes[j] & 0xFF;
+	        hexChars[j * 2] = hexArray[v >>> 4];
+	        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+	    }
+	    return new String(hexChars);
+	}
 }

+ 1 - 1
src/de/tudarmstadt/informatik/hostage/handler/AbstractHandler.java

@@ -141,7 +141,7 @@ public abstract class AbstractHandler implements Runnable {
 	 */
 	protected Record createRecord(TYPE type, String packet) {
 		Record record = new Record();
-		record.setAttack_id(attack_id);
+		record.setAttack_id(attack_id++);
 		record.setProtocol(protocol.toString());
 		record.setType(type);
 		record.setTimestamp(System.currentTimeMillis());

+ 9 - 2
src/de/tudarmstadt/informatik/hostage/handler/ByteArrayHandlerImpl.java

@@ -6,6 +6,9 @@ import java.io.OutputStream;
 import java.net.Socket;
 import java.util.List;
 
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
 import de.tudarmstadt.informatik.hostage.HoneyListener;
 import de.tudarmstadt.informatik.hostage.HoneyService;
 import de.tudarmstadt.informatik.hostage.io.ByteArrayReaderWriter;
@@ -17,15 +20,19 @@ import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 
 public class ByteArrayHandlerImpl extends AbstractHandler {
 
+	private int SLEEPTIME;
+	
 	public ByteArrayHandlerImpl(HoneyService service, HoneyListener listener,
 			Protocol protocol, Socket client) {
 		super(service, listener, protocol, client);
+		SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(service);
+		SLEEPTIME = pref.getInt("sleeptime", 500);
 	}
 
 	@Override
 	protected void talkToClient(InputStream in, OutputStream out)
 			throws IOException {
-		ReaderWriter<ByteArray> stream = new ByteArrayReaderWriter(in, out);
+		ReaderWriter<ByteArray> stream = new ByteArrayReaderWriter(in, out, SLEEPTIME);
 
 		ByteArray inputLine;
 		List<ByteArray> outputLine;
@@ -39,8 +46,8 @@ public class ByteArrayHandlerImpl extends AbstractHandler {
 		}
 
 		while (!thread.isInterrupted() && (inputLine = stream.read()) != null) {
-			log.write(createRecord(TYPE.RECEIVE, inputLine.toString()));
 			outputLine = protocol.processMessage(inputLine);
+			log.write(createRecord(TYPE.RECEIVE, protocol.getPacketContent()));
 			if (outputLine != null) {
 				stream.write(outputLine);
 				for (ByteArray s : outputLine) {

+ 4 - 2
src/de/tudarmstadt/informatik/hostage/io/ByteArrayReaderWriter.java

@@ -14,10 +14,12 @@ public class ByteArrayReaderWriter implements ReaderWriter<ByteArray> {
 
 	private BufferedInputStream in;
 	private BufferedOutputStream out;
+	private int SLEEPTIME;
 
-	public ByteArrayReaderWriter(InputStream in, OutputStream out) {
+	public ByteArrayReaderWriter(InputStream in, OutputStream out, int SLEEPTIME) {
 		this.in = new BufferedInputStream(in);
 		this.out = new BufferedOutputStream(out);
+		this.SLEEPTIME = SLEEPTIME;
 	}
 
 	@Override
@@ -25,7 +27,7 @@ public class ByteArrayReaderWriter implements ReaderWriter<ByteArray> {
 		int availableBytes;
 		while((availableBytes = in.available()) <= 0) {
 			try {
-				Thread.sleep(500);
+				Thread.sleep(SLEEPTIME);
 			} catch (InterruptedException e) {
 				e.printStackTrace();
 			}

+ 1 - 1
src/de/tudarmstadt/informatik/hostage/logging/DatabaseHandler.java

@@ -215,7 +215,7 @@ public class DatabaseHandler extends SQLiteOpenHelper {
 	 */
     public ArrayList<Record> getRecordOfEachAttack() {
     	ArrayList<Record> recordList = new ArrayList<Record>();
-        String selectQuery = "SELECT  * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_BSSIDS + " GROUP BY " + KEY_ATTACK_ID;
+        String selectQuery = "SELECT  * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_BSSIDS + " GROUP BY " + KEY_ATTACK_ID + " ORDER BY " + KEY_TIME;
         SQLiteDatabase db = this.getReadableDatabase();
         Cursor cursor = db.rawQuery(selectQuery, null);
 		

+ 1 - 1
src/de/tudarmstadt/informatik/hostage/logging/Record.java

@@ -240,7 +240,7 @@ public class Record implements Serializable {
 				return String.format("{ \"sensor\":{\"type\": \"Honeypot\", \"name\": \"HOsTaGe\"}, \"type\": 0, \"src\":{\"ip\": \"%s\", \"port\": %d}, \"dst\":{\"ip\": \"%s\", \"port\": %d} }", externalIP, localPort, externalIP, remotePort);
 			// ViewLogTable format: contains all important information about an attack.
 			case 2: 
-				return String.format("%d: %s in %s(%s) from [%s:%d] to [%s:%d]", attack_id, protocol, SSID, BSSID, remoteIP.getHostAddress(), remotePort, localIP.getHostAddress(), localPort);
+				return String.format("%d: %s\nIn %s\n(%s)\nFrom [%s:%d]\nTo [%s:%d]\nMessage: %s\n", attack_id, protocol, SSID, BSSID, remoteIP.getHostAddress(), remotePort, localIP.getHostAddress(), localPort, packet);
 			default:
 				return toString();
 		}

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

@@ -3,6 +3,7 @@ package de.tudarmstadt.informatik.hostage.protocol;
 import java.util.ArrayList;
 import java.util.List;
 
+import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.wrapper.ByteArray;
 
 /**
@@ -20,9 +21,13 @@ public class ECHO implements Protocol<ByteArray>{
 	public TALK_FIRST whoTalksFirst() {
 		return TALK_FIRST.CLIENT;
 	}
+	
+	private byte[] lastMessage;
 
 	@Override
 	public List<ByteArray> processMessage(ByteArray message) {
+		if(message != null)
+			lastMessage = message.get();
 		List<ByteArray> response = new ArrayList<ByteArray>();
 		//respond with the received message
 		response.add(message);
@@ -48,5 +53,10 @@ public class ECHO implements Protocol<ByteArray>{
 	public String toString() {
 		return "ECHO";
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return HelperUtils.byteToStr(lastMessage);
+	}
 
 }

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

@@ -19,6 +19,8 @@ public final class FTP implements Protocol<String> {
 	 * Denotes in which state the protocol is right now
 	 */
 	private STATE state = STATE.NONE;
+	
+	private String lastMessage;
 
 	@Override
 	public int getPort() {
@@ -32,6 +34,8 @@ public final class FTP implements Protocol<String> {
 
 	@Override
 	public List<String> processMessage(String message) {
+		if(message != null)
+			lastMessage = message;
 		List<String> response = new ArrayList<String>();
 		switch (state) {
 		case NONE:
@@ -111,5 +115,10 @@ public final class FTP implements Protocol<String> {
 	public String toString() {
 		return "FTP";
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return lastMessage;
+	}
 
 }

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

@@ -19,8 +19,12 @@ public final class HTTP implements Protocol<String> {
 		return TALK_FIRST.CLIENT;
 	}
 
+	private String lastMessage;
+	
 	@Override
 	public List<String> processMessage(String message) {
+		if(message != null)
+			lastMessage = message;
 		List<String> response = new ArrayList<String>();
 		request = message + request;
 
@@ -67,6 +71,11 @@ public final class HTTP implements Protocol<String> {
 	public String toString() {
 		return "HTTP";
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return lastMessage;
+	}
 
 	/**
 	 * Builds a html response that can be sent

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

@@ -1,6 +1,5 @@
 package de.tudarmstadt.informatik.hostage.protocol;
 
-import java.io.FileInputStream;
 import java.security.KeyStore;
 import java.util.ArrayList;
 import java.util.List;
@@ -25,9 +24,13 @@ public class HTTPS implements SSLProtocol<String> {
 	public TALK_FIRST whoTalksFirst() {
 		return TALK_FIRST.CLIENT;
 	}
+	
+	private String lastMessage;
 
 	@Override
 	public List<String> processMessage(String message) {
+		if(message != null)
+			lastMessage = message;
 		List<String> response = new ArrayList<String>();
 		request = message + request;
 
@@ -74,6 +77,11 @@ public class HTTPS implements SSLProtocol<String> {
 	public String toString() {
 		return "HTTPS";
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return lastMessage;
+	}
 
 	@Override
 	public SSLContext getSSLContext() {

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

@@ -23,16 +23,15 @@ public class MySQL implements Protocol<ByteArray>{
 	 * Denotes in which state the protocol is right now
 	 */
 	private STATE state = STATE.NONE;
-	
+		
 	/** last request from client */ 
-	private byte[] request;
+	private byte[] lastMessage;
 	
 	@Override
 	public List<ByteArray> processMessage(ByteArray request) {
 		List<ByteArray> response = new ArrayList<ByteArray>();
-		if(request != null) {
-			this.request = request.get();
-		}
+		if(request != null)
+			lastMessage = request.get();
 				
 		switch(state) {
 		case NONE:
@@ -44,7 +43,7 @@ public class MySQL implements Protocol<ByteArray>{
 			state = STATE.LOGIN_INFO;
 			break;
 		case LOGIN_INFO:
-			if(this.request[4] == 0x01) {
+			if(this.lastMessage[4] == 0x01) {
 				state = STATE.CLOSED;
 			} else {
 				response.add(new ByteArray(responseError()));
@@ -77,6 +76,11 @@ public class MySQL implements Protocol<ByteArray>{
 	public boolean isClosed() {
 		return state == STATE.CLOSED;
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return HelperUtils.byteToStr(lastMessage);
+	}
 
 	/**
 	 * Wraps the response packet with the packet length and number
@@ -87,7 +91,7 @@ public class MySQL implements Protocol<ByteArray>{
 		byte[] buffer = ByteBuffer.allocate(4).putInt(packet.length).array();
 		byte[] packetLength = {buffer[3], buffer[2], buffer[1]};
 		byte[] packetNumber = new byte[1];
-		if(request != null) packetNumber[0] = (byte) (request[3] + 1);
+		if(lastMessage != null) packetNumber[0] = (byte) (lastMessage[3] + 1);
 		else packetNumber[0] = 0x00;
 		
 		byte[] response = HelperUtils.concat(packetLength, packetNumber, packet);

+ 3 - 1
src/de/tudarmstadt/informatik/hostage/protocol/Protocol.java

@@ -58,5 +58,7 @@ public interface Protocol<T> {
 	 */
 	@Override 
 	String toString();
-
+	
+	String getPacketContent();
+	
 }

+ 12 - 29
src/de/tudarmstadt/informatik/hostage/protocol/SMB.java

@@ -27,6 +27,8 @@ public final class SMB implements Protocol<ByteArray> {
 	 */
 	private STATE state = STATE.NONE;
 
+	private byte[] lastMessage;
+	
 	@Override
 	public int getPort() {
 		return 445;
@@ -41,8 +43,9 @@ public final class SMB implements Protocol<ByteArray> {
 
 	@Override
 	public List<ByteArray> processMessage(ByteArray message) {
-		byte[] primitiveByteArray = message.get();
-		packet.newMsg(primitiveByteArray);
+		if(message != null)
+			lastMessage = message.get();
+		packet.newMsg(lastMessage);
 		byte smbCommand = packet.getSmbCommand();
 		List<ByteArray> response = new ArrayList<ByteArray>();
 
@@ -131,6 +134,11 @@ public final class SMB implements Protocol<ByteArray> {
 	public String toString() {
 		return "SMB";
 	}
+	
+	@Override
+	public String getPacketContent()  {
+		return HelperUtils.byteToStr(lastMessage);
+	}
 
 	/**
 	 * Converts the current system time into a byte[] with windows specific time
@@ -277,7 +285,7 @@ public final class SMB implements Protocol<ByteArray> {
 				if(dialectMsg[i] == 0x00) {
 					byte[] dialect = new byte[i-start];
 					System.arraycopy(dialectMsg, start, dialect, 0, i-start);
-					if(byteToStr(dialect).contains("NT LM 0.12")) {
+					if(HelperUtils.byteToStr(dialect).contains("NT LM 0.12")) {
 						return new byte[]{(byte)dialectNumber, (byte)(dialectNumber >> 8)};
 					}
 					start = i+1;
@@ -601,32 +609,7 @@ public final class SMB implements Protocol<ByteArray> {
 
 		@Override
 		public String toString() {
-			return byteToStr(message);
-		}
-		
-		/**
-		 * Converts a byte[] to a String, but only characters in ASCII between 32 and 127
-		 * @param bytes that are converted
-		 * @return converted String
-		 */
-		private String byteToStr(byte[] bytes) {
-			char[] chars = new char[bytes.length];
-			for (int i = 0, j = 0; i < bytes.length && j < chars.length; i++) {
-				if (isLetter((char) bytes[i])) {
-					chars[j] = (char) bytes[i];
-					j++;
-				}
-			}
-			return new String(chars);
-		}
-
-		/**
-		 * Determines if a character is in ASCII between 32 and 127
-		 * @param character that is checked 
-		 * @return true if the character is between 32 and 127, else false
-		 */
-		private boolean isLetter(char character) {
-			return (character >= 32 && character <= 127);
+			return HelperUtils.byteToStr(message);
 		}
 		
 		/**

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

@@ -95,6 +95,8 @@ public final class SSH implements Protocol<ByteArray> {
 	
 	/** Denotes in which state the protocol is right now */
 	private STATE state = STATE.NONE;
+	
+	private byte[] lastMessage;
 
 	@Override
 	public int getPort() {
@@ -108,6 +110,8 @@ public final class SSH implements Protocol<ByteArray> {
 
 	@Override
 	public List<ByteArray> processMessage(ByteArray message) {
+		if(message != null)
+			lastMessage = message.get();
 		List<ByteArray> response = new ArrayList<ByteArray>();
 		byte[] request = null;
 		if(message != null) request = message.get();
@@ -162,6 +166,11 @@ public final class SSH implements Protocol<ByteArray> {
 	public String toString() {
 		return "SSH";
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return HelperUtils.byteToStr(lastMessage);
+	}
 
 	/**
 	 * Wraps the packets with packet length and padding.

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

@@ -22,6 +22,8 @@ public final class TELNET implements Protocol<ByteArray> {
 	 * Denotes in which state the protocol is right now
 	 */
 	private STATE state = STATE.NONE;
+	
+	private byte[] lastMessage;
 
 	/** user entered by the client */
 	private byte[] user;
@@ -44,6 +46,8 @@ public final class TELNET implements Protocol<ByteArray> {
 
 	@Override
 	public List<ByteArray> processMessage(ByteArray message) {
+		if(message != null)
+			lastMessage = message.get();
 		byte[] request = null;
 		if(message != null) request = message.get();
 		List<ByteArray> response = new ArrayList<ByteArray>();
@@ -146,6 +150,11 @@ public final class TELNET implements Protocol<ByteArray> {
 	public Class<ByteArray> getType() {
 		return ByteArray.class;
 	}
+	
+	@Override
+	public String getPacketContent() {
+		return HelperUtils.byteToStr(lastMessage);
+	}
 
 	/**
 	 * Determines which options that are requested by the client will be done and which not

+ 16 - 0
src/de/tudarmstadt/informatik/hostage/ui/SettingsActivity.java

@@ -42,6 +42,11 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
         defaultPref.edit().putInt("timeout", Integer.valueOf(etp.getText()).intValue()).commit();
         pref.setSummary(etp.getText());
         
+        //Set the value of the preference as the summary for the preference
+        pref = findPreference("pref_sleeptime");
+        etp = (EditTextPreference) pref;
+        defaultPref.edit().putInt("sleeptime", Integer.valueOf(etp.getText()).intValue()).commit();
+        
     }    
 
     protected void onResume() {
@@ -103,6 +108,17 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
         	sharedPreferences.edit().putInt("timeout", Integer.valueOf(value).intValue()).commit();
     		pref.setSummary(value);
     	}
+    	else if(key.equals("pref_sleeptime")){
+    		Preference pref = findPreference(key);
+    		EditTextPreference etp = (EditTextPreference) pref;
+    		String value = etp.getText();
+    		if(!value.matches("([0-9])+")){
+    			Toast.makeText(getApplicationContext(), "Enter a valid number.", Toast.LENGTH_SHORT).show();
+    			value = getResources().getString(R.string.pref_sleeptime_default);
+    		}
+        	sharedPreferences.edit().putInt("sleeptime", Integer.valueOf(value).intValue()).commit();
+    		pref.setSummary(value);
+    	}
     	 
     }
 }