PseudoJavaFileDiskDriver.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package de.tudarmstadt.informatik.hostage.protocol.cifs;
  2. import org.alfresco.jlan.server.SrvSession;
  3. import org.alfresco.jlan.server.core.DeviceContext;
  4. import org.alfresco.jlan.server.filesys.FileExistsException;
  5. import org.alfresco.jlan.server.filesys.FileName;
  6. import org.alfresco.jlan.server.filesys.FileOpenParams;
  7. import org.alfresco.jlan.server.filesys.NetworkFile;
  8. import org.alfresco.jlan.server.filesys.TreeConnection;
  9. import org.alfresco.jlan.smb.server.disk.JavaFileDiskDriver;
  10. import org.alfresco.jlan.smb.server.disk.JavaNetworkFile;
  11. import java.io.File;
  12. import java.io.FileInputStream;
  13. import java.io.FileWriter;
  14. import java.math.BigInteger;
  15. import java.security.MessageDigest;
  16. import java.security.NoSuchAlgorithmException;
  17. import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
  18. import de.tudarmstadt.informatik.hostage.protocol.SMB;
  19. /**
  20. * HostageV3
  21. * ================
  22. * @author Alexander Brakowski
  23. * @author Daniel Lazar
  24. *
  25. * This is a pseudo file disk driver, which overwrites the libs JavaFileDiskDriver,
  26. * so that we can get more information about the attack
  27. */
  28. public class PseudoJavaFileDiskDriver extends JavaFileDiskDriver {
  29. private static class PseudoJavaNetworkFile extends JavaNetworkFile {
  30. protected final SMB SMB;
  31. private final SrvSession sess;
  32. boolean wasWrittenTo = false;
  33. public PseudoJavaNetworkFile(File file, String netPath, SMB SMB, SrvSession sess) {
  34. super(file, netPath);
  35. this.SMB = SMB;
  36. this.sess = sess;
  37. }
  38. /**
  39. * method that checks if the file was just written, then gets the MD5 checksum of the
  40. * file and logs it. Afterwards the file gets deleted.
  41. * @throws java.io.IOException
  42. */
  43. public void closeFile() throws java.io.IOException {
  44. super.closeFile();
  45. if(wasWrittenTo){
  46. try {
  47. MessageDigest digest = MessageDigest.getInstance("MD5");
  48. FileInputStream fis = new FileInputStream(m_file);
  49. byte[] buffer = new byte[8192];
  50. int numOfBytesRead;
  51. while( (numOfBytesRead = fis.read(buffer)) > 0){
  52. digest.update(buffer, 0, numOfBytesRead);
  53. }
  54. byte[] hash = digest.digest();
  55. String checksum = new BigInteger(1, hash).toString(16);
  56. String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum;
  57. SMB.log(MessageRecord.TYPE.RECEIVE, message, 445, sess.getRemoteAddress(), 445);
  58. } catch (NoSuchAlgorithmException e) {
  59. e.printStackTrace();
  60. }
  61. m_file.delete();
  62. wasWrittenTo = false;
  63. }
  64. }
  65. public void writeFile(byte[] buf, int len, int pos)
  66. throws java.io.IOException {
  67. super.writeFile(buf, len, pos);
  68. wasWrittenTo = true;
  69. }
  70. public void writeFile(byte[] buf, int len, int pos, long offset)
  71. throws java.io.IOException {
  72. super.writeFile(buf, len, pos, offset);
  73. wasWrittenTo = true;
  74. }
  75. }
  76. private final SMB SMB;
  77. public PseudoJavaFileDiskDriver(SMB SMB) {
  78. this.SMB = SMB;
  79. }
  80. public NetworkFile createFile(SrvSession sess, TreeConnection tree, FileOpenParams params)
  81. throws java.io.IOException {
  82. DeviceContext ctx = tree.getContext();
  83. String fname = FileName.buildPath(ctx.getDeviceName(), params.getPath(), null, java.io.File.separatorChar);
  84. // Check if the file already exists
  85. File file = new File(fname);
  86. if (file.exists())
  87. throw new FileExistsException();
  88. // Create the new file
  89. FileWriter newFile = new FileWriter(fname, false);
  90. newFile.close();
  91. // Create a Java network file
  92. file = new File(fname);
  93. PseudoJavaNetworkFile netFile = new PseudoJavaNetworkFile(file, params.getPath(), SMB, sess);
  94. netFile.setGrantedAccess(NetworkFile.READWRITE);
  95. netFile.setFullName(params.getPath());
  96. // Return the network file
  97. return netFile;
  98. }
  99. }