PseudoJavaFileDiskDriver.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package de.tudarmstadt.informatik.hostage.protocol.cifs;
  2. import android.app.Activity;
  3. import android.app.FragmentManager;
  4. import android.content.Context;
  5. import org.alfresco.jlan.server.SrvSession;
  6. import org.alfresco.jlan.server.core.DeviceContext;
  7. import org.alfresco.jlan.server.filesys.FileExistsException;
  8. import org.alfresco.jlan.server.filesys.FileName;
  9. import org.alfresco.jlan.server.filesys.FileOpenParams;
  10. import org.alfresco.jlan.server.filesys.NetworkFile;
  11. import org.alfresco.jlan.server.filesys.TreeConnection;
  12. import org.alfresco.jlan.smb.server.disk.JavaFileDiskDriver;
  13. import org.alfresco.jlan.smb.server.disk.JavaNetworkFile;
  14. import java.io.File;
  15. import java.io.FileInputStream;
  16. import java.io.FileWriter;
  17. import java.math.BigInteger;
  18. import java.security.MessageDigest;
  19. import java.security.NoSuchAlgorithmException;
  20. import java.util.Set;
  21. import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
  22. import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
  23. import de.tudarmstadt.informatik.hostage.protocol.SMB;
  24. import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
  25. import de.tudarmstadt.informatik.hostage.ui.fragment.FileAlertDialogFragment;
  26. import virustotalapi.ReportScan;
  27. import virustotalapi.VirusTotal;
  28. /**
  29. * HostageV3
  30. * ================
  31. * @author Alexander Brakowski
  32. * @author Daniel Lazar
  33. * @author Shreyas Srinivasa
  34. *
  35. * This is a pseudo file disk driver, which overwrites the libs JavaFileDiskDriver,
  36. * so that we can get more information about the attack
  37. */
  38. public class PseudoJavaFileDiskDriver extends JavaFileDiskDriver {
  39. private static class PseudoJavaNetworkFile extends JavaNetworkFile {
  40. protected final SMB SMB;
  41. private final SrvSession sess;
  42. boolean wasWrittenTo = false;
  43. private final FileInject fileInject;
  44. public PseudoJavaNetworkFile(File file, String netPath, SMB SMB, SrvSession sess, FileInject fileInject) {
  45. super(file, netPath);
  46. this.SMB = SMB;
  47. this.sess = sess;
  48. this.fileInject = fileInject;
  49. }
  50. /**
  51. * method that checks if the file was just written, then gets the MD5 checksum of the
  52. * file and logs it. Afterwards the file gets deleted.
  53. * @throws java.io.IOException
  54. */
  55. public void closeFile() throws java.io.IOException {
  56. super.closeFile();
  57. if(wasWrittenTo){
  58. HelperUtils.setIsFileInjected(true);
  59. try {
  60. MessageDigest digest = MessageDigest.getInstance("SHA256");
  61. FileInputStream fis = new FileInputStream(m_file);
  62. byte[] buffer = new byte[8192];
  63. int numOfBytesRead;
  64. while( (numOfBytesRead = fis.read(buffer)) > 0){
  65. digest.update(buffer, 0, numOfBytesRead);
  66. }
  67. byte[] hash = digest.digest();
  68. String checksum = new BigInteger(1, hash).toString(16);
  69. StringBuilder sb = new StringBuilder();
  70. //Creates use of Virustotal api
  71. VirusTotal VT = new VirusTotal("111c226204f5de7228563bbca91c5860e4965fbe936307dffa8f2f2d575ff292"); // Virus Total API Key
  72. Set<ReportScan> Report = VT.ReportScan(checksum); //The SHA256 file
  73. for (ReportScan report : Report) {
  74. if (report.getDetected().contentEquals("true")){
  75. if (report.getVendor().contentEquals("McAfee")||report.getVendor().contentEquals("Microsoft")||report.getVendor().contentEquals("AVG")||report.getVendor().contentEquals("Symantec")||report.getVendor().contentEquals("CAT-QuickHeal")||report.getVendor().contentEquals("TrendMicro")||report.getVendor().contentEquals("Kaspersky"))
  76. {
  77. sb.append("\n\nVendor: " + report.getVendor() + " \nDetected: " + report.getDetected() + " \nMalware Name: " + report.getMalwarename());
  78. }
  79. }
  80. }
  81. //Setting the display component with the results obtained from Virustotal
  82. String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum+"\n Scroll Down for Malware Details"+sb.toString();
  83. fileInject.log(MessageRecord.TYPE.RECEIVE, message, 445, sess.getRemoteAddress(), 445);
  84. HelperUtils.setFileName(m_file.getName());
  85. HelperUtils.setFilePath(m_file.getPath());
  86. HelperUtils.setFileSHA256(checksum);
  87. } catch (NoSuchAlgorithmException e) {
  88. e.printStackTrace();
  89. }
  90. wasWrittenTo = true; // Saving file in phones memory
  91. }
  92. }
  93. public void writeFile(byte[] buf, int len, int pos)
  94. throws java.io.IOException {
  95. super.writeFile(buf, len, pos);
  96. wasWrittenTo = true;
  97. }
  98. public void writeFile(byte[] buf, int len, int pos, long offset)
  99. throws java.io.IOException {
  100. super.writeFile(buf, len, pos, offset);
  101. wasWrittenTo = true;
  102. }
  103. }
  104. private final SMB SMB;
  105. private final FileInject fileInject;
  106. public PseudoJavaFileDiskDriver(SMB SMB, FileInject fileInject) {
  107. this.SMB = SMB;
  108. this.fileInject = fileInject;
  109. }
  110. public NetworkFile createFile(SrvSession sess, TreeConnection tree, FileOpenParams params)
  111. throws java.io.IOException {
  112. DeviceContext ctx = tree.getContext();
  113. String fname = FileName.buildPath(ctx.getDeviceName(), params.getPath(), null, java.io.File.separatorChar);
  114. // Check if the file already exists
  115. File file = new File(fname);
  116. String path = file.getAbsolutePath();
  117. if (file.exists())
  118. throw new FileExistsException();
  119. // Create the new file
  120. FileWriter newFile = new FileWriter(fname, false);
  121. newFile.close();
  122. // Create a Java network file
  123. file = new File(fname);
  124. PseudoJavaNetworkFile netFile = new PseudoJavaNetworkFile(file, params.getPath(), SMB, sess, fileInject);
  125. netFile.setGrantedAccess(NetworkFile.READWRITE);
  126. netFile.setFullName(params.getPath());
  127. // Return the network file
  128. return netFile;
  129. }
  130. private static void displayAlert() {
  131. Context context = null;
  132. final Activity activity = MainActivity.getInstance();
  133. final FragmentManager fragmentManager = activity.getFragmentManager();
  134. if (fragmentManager != null) {
  135. FileAlertDialogFragment fileAlertDialogFragment = new FileAlertDialogFragment();
  136. fileAlertDialogFragment.show(fragmentManager.beginTransaction(), fileAlertDialogFragment.getTag());
  137. }
  138. }
  139. }