Browse Source

handeling events and logging attacks, included file writting

Daniel Lazar 9 years ago
parent
commit
3ea0a5b54c

+ 4 - 1
src/de/tudarmstadt/informatik/hostage/Listener.java

@@ -155,7 +155,6 @@ public class Listener implements Runnable {
 		}
 
         if(protocol.toString().equals("CIFS")){
-            System.out.println("PROTOCOL: " + protocol);
             ((CIFS) protocol).initialize(this);
         }
 
@@ -187,6 +186,10 @@ public class Listener implements Runnable {
 	 */
 	public void stop() {
 		try {
+            if(protocol.toString().equals("CIFS")){
+                ((CIFS) protocol).stop();
+            }
+
 			server.close();
 			thread.interrupt();
 			running = false;

+ 113 - 2
src/de/tudarmstadt/informatik/hostage/protocol/CIFS.java

@@ -2,8 +2,10 @@ package de.tudarmstadt.informatik.hostage.protocol;
 
 
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.net.DhcpInfo;
 import android.net.wifi.WifiManager;
+import android.preference.PreferenceManager;
 
 import org.alfresco.jlan.app.XMLServerConfiguration;
 import org.alfresco.jlan.netbios.server.NetBIOSNameServer;
@@ -21,9 +23,16 @@ import java.net.InetAddress;
 import java.util.List;
 
 import de.tudarmstadt.informatik.hostage.Handler;
+import de.tudarmstadt.informatik.hostage.Hostage;
 import de.tudarmstadt.informatik.hostage.Listener;
 import de.tudarmstadt.informatik.hostage.R;
+import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
+import de.tudarmstadt.informatik.hostage.location.MyLocationManager;
+import de.tudarmstadt.informatik.hostage.logging.AttackRecord;
+import de.tudarmstadt.informatik.hostage.logging.Logger;
 import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
+import de.tudarmstadt.informatik.hostage.logging.NetworkRecord;
+import de.tudarmstadt.informatik.hostage.logging.SyncDevice;
 import de.tudarmstadt.informatik.hostage.protocol.cifs.CifsServer;
 import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
 import de.tudarmstadt.informatik.hostage.wrapper.Packet;
@@ -35,14 +44,43 @@ public class CIFS implements Protocol {
     private NetBIOSNameServer mNbNameServer;
     private CifsServer mCifsServer;
 
+    SharedPreferences pref;
+
+    private int attack_id;
+    private String externalIP;
+    private String BSSID;
+    private String SSID;
+
+    private int subnetMask;
+    private int internalIPAddress;
+
+    private boolean logged;
+
+    public Listener getListener(){
+        return mListener;
+    }
+
     public void initialize(Listener mListener) {
         this.mListener = mListener;
-        this.mHandler = new Handler(mListener.getService(),mListener, mListener.getProtocol());
+
+        Hostage service = mListener.getService();
+        pref = PreferenceManager.getDefaultSharedPreferences(service);
+        getAndIncrementAttackID(pref);
+        SharedPreferences connInfo = service.getSharedPreferences(service.getString(R.string.connection_info), Context.MODE_PRIVATE);
+        BSSID = connInfo.getString(service.getString(R.string.connection_info_bssid), null);
+        SSID = connInfo.getString(service.getString(R.string.connection_info_ssid), null);
+        externalIP = connInfo.getString(service.getString(R.string.connection_info_external_ip), null);
+
+        // we need this info to find out whether the attack was internal
+        subnetMask = connInfo.getInt(service.getString(R.string.connection_info_subnet_mask), 0);
+        internalIPAddress = connInfo.getInt(service.getString(R.string.connection_info_internal_ip), 0);
+        logged = false;
+
         XMLServerConfiguration smbConfig = new XMLServerConfiguration();
 
         try {
             smbConfig.loadConfiguration(new InputStreamReader(MainActivity.context.getResources().openRawResource(R.raw.jlan_config)));
-            mCifsServer = new CifsServer(smbConfig);
+            mCifsServer = new CifsServer(smbConfig, this);
             mCifsServer.run();
         } catch (IOException e) {
             e.printStackTrace();
@@ -53,6 +91,79 @@ public class CIFS implements Protocol {
         }
     }
 
+    public void stop(){
+        mCifsServer.stop();
+    }
+
+    public int getLocalIp(){
+        WifiManager wifi = (WifiManager) MainActivity.context.getSystemService(Context.WIFI_SERVICE);
+        DhcpInfo dhcp = wifi.getDhcpInfo();
+
+        return dhcp.ipAddress;
+    }
+
+    private synchronized void getAndIncrementAttackID(SharedPreferences pref) {
+        SharedPreferences.Editor editor = pref.edit();
+        attack_id = pref.getInt("ATTACK_ID_COUNTER", 0);
+        editor.putInt("ATTACK_ID_COUNTER", attack_id + 1);
+        editor.commit();
+    }
+
+    public MessageRecord createMessageRecord(MessageRecord.TYPE type, String packet) {
+        MessageRecord record = new MessageRecord(true);
+        //record.setId(message_id++); // autoincrement
+        record.setAttack_id(attack_id);
+        record.setType(type);
+        record.setTimestamp(System.currentTimeMillis());
+        record.setPacket(packet);
+        return record;
+    }
+
+    public AttackRecord createAttackRecord(int localPort, InetAddress remoteIP, int remotePort) {
+        AttackRecord record = new AttackRecord();
+        record.setAttack_id(attack_id);
+        record.setSync_id(attack_id);
+        record.setDevice(SyncDevice.currentDevice().getDeviceID());
+
+        record.setProtocol(this.toString());
+        record.setExternalIP(externalIP);
+        record.setLocalIP(CifsServer.intToInetAddress(getLocalIp()).getHostAddress());
+        record.setLocalPort(localPort);
+        record.setWasInternalAttack((HelperUtils.packInetAddress(remoteIP.getAddress()) & subnetMask) == (internalIPAddress & subnetMask));
+        record.setRemoteIP(remoteIP.getHostAddress());
+        record.setRemotePort(remotePort);
+        record.setBssid(BSSID);
+        return record;
+    }
+
+    public NetworkRecord createNetworkRecord() {
+        NetworkRecord record = new NetworkRecord();
+        record.setBssid(BSSID);
+        record.setSsid(SSID);
+        if (MyLocationManager.getNewestLocation() != null) {
+            record.setLatitude(MyLocationManager.getNewestLocation().getLatitude());
+            record.setLongitude(MyLocationManager.getNewestLocation().getLongitude());
+            record.setAccuracy(MyLocationManager.getNewestLocation().getAccuracy());
+            record.setTimestampLocation(MyLocationManager.getNewestLocation().getTime());
+        } else {
+            record.setLatitude(0.0);
+            record.setLongitude(0.0);
+            record.setAccuracy(Float.MAX_VALUE);
+            record.setTimestampLocation(0);
+        }
+        return record;
+    }
+
+    public void log(MessageRecord.TYPE type, String packet, int localPort, InetAddress remoteIP, int remotePort){
+        if(!logged){
+            Logger.log(Hostage.getContext(), createNetworkRecord());
+            Logger.log(Hostage.getContext(), createAttackRecord(localPort, remoteIP, remotePort));
+            logged = true;
+        }
+        if (packet != null && packet.length() > 0) { // prevent logging empty packets
+            Logger.log(Hostage.getContext(), createMessageRecord(type, packet));
+        }
+    }
     @Override
     public int getPort() {
         return 1025;

+ 25 - 6
src/de/tudarmstadt/informatik/hostage/protocol/cifs/CifsServer.java

@@ -29,6 +29,10 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Enumeration;
 
+import de.tudarmstadt.informatik.hostage.Handler;
+import de.tudarmstadt.informatik.hostage.R;
+import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
+import de.tudarmstadt.informatik.hostage.protocol.CIFS;
 import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
 
 /**
@@ -40,10 +44,12 @@ import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
 public class CifsServer extends JLANCifsServer {
 
     private final XMLServerConfiguration serverConfiguration;
+    protected final CIFS cifs;
 
-    public CifsServer(XMLServerConfiguration serverConfiguration){
+    public CifsServer(XMLServerConfiguration serverConfiguration, CIFS cifs){
         super();
 
+        this.cifs = cifs;
         this.serverConfiguration = serverConfiguration;
     }
 
@@ -53,10 +59,7 @@ public class CifsServer extends JLANCifsServer {
         cifsConfigSection.setHostAnnouncer(true);
         cifsConfigSection.setDisableNIOCode(true);
 
-        WifiManager wifi = (WifiManager) MainActivity.context.getSystemService(Context.WIFI_SERVICE);
-        DhcpInfo dhcp = wifi.getDhcpInfo();
-
-        int ip = dhcp.ipAddress;
+        int ip = cifs.getLocalIp();
 
         cifsConfigSection.setSMBBindAddress(intToInetAddress(ip));
         cifsConfigSection.setNetBIOSBindAddress(intToInetAddress(ip));
@@ -72,12 +75,14 @@ public class CifsServer extends JLANCifsServer {
 
         File cacheFolder = MainActivity.context.getExternalCacheDir();
         File jlanFolder = new File(cacheFolder.getAbsolutePath() + "/jlan");
+        jlanFolder.delete();
+
         File anotherFolder = new File(jlanFolder.getAbsolutePath() + "/System32");
         jlanFolder.mkdir();
         anotherFolder.mkdir();
 
         // SHARES
-        DiskInterface diskInterface = new PseudoJavaFileDiskDriver();
+        DiskInterface diskInterface = new PseudoJavaFileDiskDriver(cifs);
         final GenericConfigElement driverConfig = new GenericConfigElement("driver");
         final GenericConfigElement localPathConfig = new GenericConfigElement("LocalPath");
         localPathConfig.setValue(jlanFolder.getAbsolutePath());
@@ -120,17 +125,31 @@ public class CifsServer extends JLANCifsServer {
             server.addSessionListener(new SessionListener() {
                 @Override
                 public void sessionClosed(SrvSession sess) {
+
+
+                    cifs.log(MessageRecord.TYPE.RECEIVE, "SESSION CLOSED", 139, sess.getRemoteAddress(), 139);
                     System.out.println("-----------> SESSION CLOSED :(");
                 }
 
                 @Override
                 public void sessionCreated(SrvSession sess) {
+                    cifs.getListener().getService().notifyUI(Handler.class.getName(),
+                            new String[] {
+                                    cifs.getListener().getService().getString(R.string.broadcast_started),
+                                    cifs.getListener().getProtocol().toString(),
+                                    Integer.toString(cifs.getListener().getPort())
+                            }
+                    );
+
+                    cifs.log(MessageRecord.TYPE.RECEIVE, "SESSION CREATED", 139, sess.getRemoteAddress(), 139);
                     System.out.println("-----------> SESSION CREATED :)");
 
                 }
 
                 @Override
                 public void sessionLoggedOn(SrvSession sess) {
+
+                    cifs.log(MessageRecord.TYPE.RECEIVE, "SESSION LOGGED ON", 139, sess.getRemoteAddress(), 139);
                     System.out.println("-----------> SESSION LOGGED ON :D");
 
                 }

+ 95 - 2
src/de/tudarmstadt/informatik/hostage/protocol/cifs/PseudoJavaFileDIskDriver.java

@@ -1,18 +1,111 @@
 package de.tudarmstadt.informatik.hostage.protocol.cifs;
 
 import org.alfresco.jlan.server.SrvSession;
+import org.alfresco.jlan.server.core.DeviceContext;
+import org.alfresco.jlan.server.filesys.FileExistsException;
+import org.alfresco.jlan.server.filesys.FileName;
 import org.alfresco.jlan.server.filesys.FileOpenParams;
 import org.alfresco.jlan.server.filesys.NetworkFile;
 import org.alfresco.jlan.server.filesys.TreeConnection;
 import org.alfresco.jlan.smb.server.disk.JavaFileDiskDriver;
+import org.alfresco.jlan.smb.server.disk.JavaNetworkFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
+import de.tudarmstadt.informatik.hostage.protocol.CIFS;
 
 /**
  * Created by Daniel on 26.03.2015.
  */
 public class PseudoJavaFileDiskDriver extends JavaFileDiskDriver {
+    private static class PseudoJavaNetworkFile extends JavaNetworkFile {
+        protected final CIFS cifs;
+        private final SrvSession sess;
+        boolean wasWrittenTo = false;
+
+        public PseudoJavaNetworkFile(File file, String netPath, CIFS cifs, SrvSession sess) {
+            super(file, netPath);
+            this.cifs = cifs;
+            this.sess = sess;
+        }
+
+        public void closeFile() throws java.io.IOException {
+            super.closeFile();
+            if(wasWrittenTo){
+                try {
+                    MessageDigest digest = MessageDigest.getInstance("MD5");
+                    FileInputStream fis = new FileInputStream(m_file);
+
+                    byte[] buffer = new byte[8192];
+                    int numOfBytesRead;
+                    while( (numOfBytesRead = fis.read(buffer)) > 0){
+                        digest.update(buffer, 0, numOfBytesRead);
+                    }
+
+                    byte[] hash = digest.digest();
+                    String checksum = new BigInteger(1, hash).toString(16);
+
+                    String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum;
+
+                    cifs.log(MessageRecord.TYPE.RECEIVE, message, 445, sess.getRemoteAddress(), 445);
+                } catch (NoSuchAlgorithmException e) {
+                    e.printStackTrace();
+                }
+
+                m_file.delete();
+            }
+        }
+
+        public void writeFile(byte[] buf, int len, int pos)
+                throws java.io.IOException {
+            super.writeFile(buf, len, pos);
+            wasWrittenTo = true;
+        }
+
+        public void writeFile(byte[] buf, int len, int pos, long offset)
+                throws java.io.IOException {
+            super.writeFile(buf, len, pos, offset);
+            wasWrittenTo = true;
+        }
+    }
+
+    private final CIFS cifs;
+
+    public PseudoJavaFileDiskDriver(CIFS cifs) {
+        this.cifs = cifs;
+    }
+
     public NetworkFile createFile(SrvSession sess, TreeConnection tree, FileOpenParams params)
             throws java.io.IOException {
-        System.out.println("--------------------> CREATE FILE");
-        return null;
+        DeviceContext ctx = tree.getContext();
+        String fname = FileName.buildPath(ctx.getDeviceName(), params.getPath(), null, java.io.File.separatorChar);
+
+        //  Check if the file already exists
+
+        File file = new File(fname);
+        if (file.exists())
+            throw new FileExistsException();
+
+        //  Create the new file
+
+        FileWriter newFile = new FileWriter(fname, false);
+        newFile.close();
+
+        //  Create a Java network file
+
+        file = new File(fname);
+        PseudoJavaNetworkFile netFile = new PseudoJavaNetworkFile(file, params.getPath(), cifs, sess);
+        netFile.setGrantedAccess(NetworkFile.READWRITE);
+        netFile.setFullName(params.getPath());
+
+        //  Return the network file
+
+        return netFile;
     }
 }