CifsServer.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package de.tudarmstadt.informatik.hostage.protocol.cifs;
  2. import android.content.Context;
  3. import android.net.DhcpInfo;
  4. import android.net.wifi.WifiManager;
  5. import org.alfresco.jlan.app.JLANCifsServer;
  6. import org.alfresco.jlan.app.XMLServerConfiguration;
  7. import org.alfresco.jlan.netbios.NetworkSettings;
  8. import org.alfresco.jlan.server.NetworkServer;
  9. import org.alfresco.jlan.server.ServerListener;
  10. import org.alfresco.jlan.server.SessionListener;
  11. import org.alfresco.jlan.server.SrvSession;
  12. import org.alfresco.jlan.server.filesys.DiskDeviceContext;
  13. import org.alfresco.jlan.server.filesys.DiskInterface;
  14. import org.alfresco.jlan.server.filesys.DiskSharedDevice;
  15. import org.alfresco.jlan.server.filesys.FileListener;
  16. import org.alfresco.jlan.server.filesys.FilesystemsConfigSection;
  17. import org.alfresco.jlan.server.filesys.NetworkFile;
  18. import org.alfresco.jlan.server.filesys.NetworkFileServer;
  19. import org.alfresco.jlan.server.filesys.SrvDiskInfo;
  20. import org.alfresco.jlan.smb.server.CIFSConfigSection;
  21. import org.springframework.extensions.config.element.GenericConfigElement;
  22. import java.io.File;
  23. import java.io.IOException;
  24. import java.net.InetAddress;
  25. import java.net.UnknownHostException;
  26. import de.tudarmstadt.informatik.hostage.Handler;
  27. import de.tudarmstadt.informatik.hostage.R;
  28. import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
  29. import de.tudarmstadt.informatik.hostage.protocol.SMB;
  30. import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
  31. /**
  32. * HostageV3
  33. * ================
  34. * @author Alexander Brakowski
  35. * @author Daniel Lazar
  36. * on 19.03.15.
  37. */
  38. public class CifsServer extends JLANCifsServer {
  39. private final XMLServerConfiguration serverConfiguration;
  40. protected final SMB SMB;
  41. public CifsServer(XMLServerConfiguration serverConfiguration, SMB SMB){
  42. super();
  43. this.SMB = SMB;
  44. this.serverConfiguration = serverConfiguration;
  45. }
  46. public void run() throws Exception {
  47. CIFSConfigSection cifsConfigSection = (CIFSConfigSection) serverConfiguration.getConfigSection(CIFSConfigSection.SectionName);
  48. cifsConfigSection.setBroadcastMask(getBroadcastAddress());
  49. //enables the host announcer, so that it should appear in network neighborhood
  50. cifsConfigSection.setHostAnnouncer(true);
  51. cifsConfigSection.setDisableNIOCode(true);
  52. int ip = SMB.getLocalIp();
  53. //binding to one address on both SMB and NB
  54. cifsConfigSection.setSMBBindAddress(intToInetAddress(ip));
  55. cifsConfigSection.setNetBIOSBindAddress(intToInetAddress(ip));
  56. //setting the broadcast mask for the network
  57. NetworkSettings.setBroadcastMask(getBroadcastAddress());
  58. if(cifsConfigSection.hasNetBIOSSMB()){
  59. //adding a Netbios Server for the nameservice
  60. serverConfiguration.addServer(createNetBIOSServer(serverConfiguration));
  61. }
  62. //adding a SMB server
  63. serverConfiguration.addServer(createSMBServer(serverConfiguration));
  64. FilesystemsConfigSection filesysConfig = (FilesystemsConfigSection) serverConfiguration.getConfigSection(FilesystemsConfigSection.SectionName);
  65. //creating a file which references to the apps cache folder
  66. File cacheFolder = MainActivity.context.getExternalCacheDir();
  67. File jlanFolder = new File(cacheFolder.getAbsolutePath() + "/jlan");
  68. deleteRecursive(jlanFolder);
  69. //creating folders which appear if an attacker opens a session
  70. File anotherFolder = new File(jlanFolder.getAbsolutePath() + "/Windows");
  71. File progData = new File(jlanFolder.getAbsolutePath() + "/ProgramData");
  72. File users = new File(jlanFolder.getAbsolutePath() + "/Users");
  73. File temp= new File(jlanFolder.getAbsolutePath() + "/temp");
  74. jlanFolder.mkdir();
  75. anotherFolder.mkdir();
  76. progData.mkdir();
  77. users.mkdir();
  78. temp.mkdir();
  79. // SHARES
  80. DiskInterface diskInterface = new PseudoJavaFileDiskDriver(SMB);
  81. final GenericConfigElement driverConfig = new GenericConfigElement("driver");
  82. final GenericConfigElement localPathConfig = new GenericConfigElement("LocalPath");
  83. localPathConfig.setValue(jlanFolder.getAbsolutePath());
  84. driverConfig.addChild(localPathConfig);
  85. DiskDeviceContext diskDeviceContext = (DiskDeviceContext) diskInterface.createContext("SHARE", driverConfig);
  86. diskDeviceContext.setShareName("SHARE");
  87. diskDeviceContext.setConfigurationParameters(driverConfig);
  88. diskDeviceContext.enableChangeHandler(false);
  89. diskDeviceContext.setDiskInformation(new SrvDiskInfo(2560000, 64, 512, 2304000));// Default to a 80Gb sized disk with 90% free space
  90. DiskSharedDevice diskDev = new DiskSharedDevice("SHARE", diskInterface, diskDeviceContext);
  91. diskDev.setConfiguration(serverConfiguration);
  92. diskDeviceContext.startFilesystem(diskDev);
  93. filesysConfig.addShare(diskDev);
  94. for(int i=0; i<serverConfiguration.numberOfServers(); i++){
  95. NetworkServer server = serverConfiguration.getServer(i);
  96. if(server instanceof NetworkFileServer){
  97. NetworkFileServer fileServer = (NetworkFileServer) server;
  98. fileServer.addFileListener(new FileListener() {
  99. @Override
  100. public void fileClosed(SrvSession sess, NetworkFile file) {
  101. }
  102. @Override
  103. public void fileOpened(SrvSession sess, NetworkFile file) {
  104. }
  105. });
  106. }
  107. server.addServerListener(new ServerListener() {
  108. @Override
  109. public void serverStatusEvent(NetworkServer server, int event) {
  110. }
  111. });
  112. server.addSessionListener(new SessionListener() {
  113. @Override
  114. public void sessionClosed(SrvSession sess) {
  115. SMB.log(MessageRecord.TYPE.RECEIVE, "SESSION CLOSED", 139, sess.getRemoteAddress(), 139);
  116. }
  117. @Override
  118. public void sessionCreated(SrvSession sess) {
  119. SMB.getListener().getService().notifyUI(Handler.class.getName(),
  120. new String[] {
  121. SMB.getListener().getService().getString(R.string.broadcast_started),
  122. SMB.getListener().getProtocol().toString(),
  123. Integer.toString(SMB.getListener().getPort())
  124. }
  125. );
  126. SMB.log(MessageRecord.TYPE.RECEIVE, "SESSION CREATED", 139, sess.getRemoteAddress(), 139);
  127. }
  128. @Override
  129. public void sessionLoggedOn(SrvSession sess) {
  130. SMB.log(MessageRecord.TYPE.RECEIVE, "SESSION LOGGED ON", 139, sess.getRemoteAddress(), 139);
  131. }
  132. });
  133. server.getShareMapper();
  134. server.startServer();
  135. }
  136. }
  137. /**
  138. * stops the server
  139. */
  140. public void stop(){
  141. for(int i=0; i<serverConfiguration.numberOfServers(); i++){
  142. NetworkServer server = serverConfiguration.getServer(i);
  143. server.shutdownServer(true);
  144. }
  145. }
  146. /**
  147. * helper method to obtain the broadcast address
  148. */
  149. private String getBroadcastAddress() throws IOException {
  150. WifiManager wifi = (WifiManager) MainActivity.context.getSystemService(Context.WIFI_SERVICE);
  151. DhcpInfo dhcp = wifi.getDhcpInfo();
  152. // handle null somehow
  153. int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
  154. byte[] quads = new byte[4];
  155. for (int k = 0; k < 4; k++)
  156. quads[k] = (byte) (broadcast >> (k * 8));
  157. return InetAddress.getByAddress(quads).toString().substring(1);
  158. }
  159. /**
  160. * helper method to convert the ip from int to InetAddress
  161. */
  162. public static InetAddress intToInetAddress(int hostAddress) {
  163. byte[] addressBytes = { (byte)(0xff & hostAddress),
  164. (byte)(0xff & (hostAddress >> 8)),
  165. (byte)(0xff & (hostAddress >> 16)),
  166. (byte)(0xff & (hostAddress >> 24)) };
  167. try {
  168. return InetAddress.getByAddress(addressBytes);
  169. } catch (UnknownHostException e) {
  170. throw new AssertionError();
  171. }
  172. }
  173. /**
  174. * helper method to delete the contents of the
  175. * apps cache folder
  176. */
  177. private void deleteRecursive(File fileOrDirectory) {
  178. if (fileOrDirectory.isDirectory())
  179. for (File child : fileOrDirectory.listFiles())
  180. deleteRecursive(child);
  181. fileOrDirectory.delete();
  182. }
  183. }