SMB.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package de.tudarmstadt.informatik.hostage.protocol;
  2. import java.security.SecureRandom;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import de.tudarmstadt.informatik.hostage.Hostage;
  6. import de.tudarmstadt.informatik.hostage.R;
  7. import de.tudarmstadt.informatik.hostage.protocol.SMBUtils.NBNS;
  8. import de.tudarmstadt.informatik.hostage.protocol.SMBUtils.NMB;
  9. import de.tudarmstadt.informatik.hostage.protocol.SMBUtils.SMBPacket;
  10. import de.tudarmstadt.informatik.hostage.wrapper.Packet;
  11. /**
  12. * SMB protocol. It can handle the following requests: Negotiate Protocol
  13. * Request, Session Setup AndX Request, Tree Connect AndX Request, NT Create
  14. * AndX Request, Bind, NetShareEnumAll, Close Request, Tree Disconnect Request,
  15. * Echo Request, Trans2 Request.
  16. *
  17. * @author Wulf Pfeiffer
  18. */
  19. public class SMB implements Protocol {
  20. // message constants
  21. private static final byte SMB_COM_CLOSE = 0x04;
  22. private static final byte SMB_COM_TRANSACTION = 0x25;
  23. private static final byte SMB_COM_ECHO = 0x2B;
  24. private static final byte SMB_COM_TRANSACTION2 = 0x32;
  25. private static final byte SMB_COM_TREE_DISCONNECT = 0x71;
  26. private static final byte SMB_COM_NEGOTIATE = 0x72;
  27. private static final byte SMB_COM_SESSION_SETUP_ANDX = 0x73;
  28. private static final byte SMB_COM_TREE_CONNECT_ANDX = 0x75;
  29. private static final byte SMB_COM_NT_CREATE_ANDX = (byte) 0xA2;
  30. /**
  31. * Denotes in which state the protocol is right now
  32. */
  33. private STATE state = STATE.NONE;
  34. private byte[] lastMessage;
  35. // version stuff
  36. private String[][] possibleSmbVersions = {
  37. { "Windows 7 Professional 7600", "Windows 7 Professional 6.1" },
  38. { "Windows 8 Enterprise 9200", "Windows 8 Enterprise 9200" },
  39. { "Windows Server 2008 R2 Enterprise 7600", "Windows Server 2008 R2 Enterprise 6.1" },
  40. { "Windows Server 2012 Standard 6.2", "Windows Server 2012 Standard 6.2" },
  41. { "Unix", "Samba" },
  42. { "Windows 2002 Service Pack 2", "Windows 2002 5.1" }
  43. };
  44. /**
  45. * Represents the states of the protocol
  46. */
  47. private static enum STATE {
  48. NONE, CONNECTED, AUTHENTICATED, LISTING, DISCONNECTED, CLOSED
  49. }
  50. public void setIP(String ip) {
  51. // new NMB(ip).start();
  52. }
  53. private String[] initServerVersion() {
  54. System.out.println("hi");
  55. String sharedPreferencePath = Hostage.getContext().getString(
  56. R.string.shared_preference_path);
  57. System.out.println(sharedPreferencePath);
  58. String profile = Hostage
  59. .getContext()
  60. .getSharedPreferences(sharedPreferencePath,
  61. Hostage.MODE_PRIVATE).getString("os", "");
  62. System.out.println(profile);
  63. if (profile.equals("Windows 7")) {
  64. return possibleSmbVersions[0];
  65. } else if (profile.equals("Windows 8")) {
  66. return possibleSmbVersions[1];
  67. } else if (profile.equals("Windows Server 2008")) {
  68. return possibleSmbVersions[2];
  69. } else if (profile.equals("Windows Server 2012")) {
  70. return possibleSmbVersions[3];
  71. } else if (profile.equals("Linux")) {
  72. return possibleSmbVersions[4];
  73. } else if (profile.equals("Windows XP")) {
  74. return possibleSmbVersions[5];
  75. } else {
  76. return possibleSmbVersions[new SecureRandom().nextInt(possibleSmbVersions.length)];
  77. }
  78. }
  79. //required to be declared down here, do not change position over initServerVersion() and possibleServerVersions!!
  80. private String[] serverVersion = initServerVersion();
  81. private SMBPacket smbPacket = new SMBPacket(serverVersion);
  82. @Override
  83. public int getPort() {
  84. return 445;
  85. }
  86. @Override
  87. public boolean isClosed() {
  88. return (state == STATE.CLOSED);
  89. }
  90. @Override
  91. public boolean isSecure() {
  92. return false;
  93. }
  94. @Override
  95. public List<Packet> processMessage(Packet requestPacket) {
  96. if (requestPacket != null)
  97. lastMessage = requestPacket.getBytes();
  98. smbPacket.prepareNextResponse(lastMessage);
  99. byte smbCommand = smbPacket.getSmbCommand();
  100. List<Packet> responsePackets = new ArrayList<Packet>();
  101. switch (state) {
  102. case NONE:
  103. if (smbCommand == SMB_COM_NEGOTIATE) {
  104. state = STATE.CONNECTED;
  105. responsePackets.add(new Packet(smbPacket.getNego()));
  106. } else {
  107. state = STATE.DISCONNECTED;
  108. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  109. }
  110. break;
  111. case CONNECTED:
  112. if (smbCommand == SMB_COM_SESSION_SETUP_ANDX) {
  113. responsePackets.add(new Packet(smbPacket.getSessSetup()));
  114. } else if (smbCommand == SMB_COM_TREE_CONNECT_ANDX) {
  115. state = STATE.AUTHENTICATED;
  116. responsePackets.add(new Packet(smbPacket.getTreeCon()));
  117. } else {
  118. state = STATE.DISCONNECTED;
  119. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  120. }
  121. break;
  122. case AUTHENTICATED:
  123. if (smbCommand == SMB_COM_NT_CREATE_ANDX) {
  124. state = STATE.LISTING;
  125. responsePackets.add(new Packet(smbPacket.getNTCreate()));
  126. } else if (smbCommand == SMB_COM_ECHO) {
  127. responsePackets.add(new Packet(smbPacket.getEcho()));
  128. } else if (smbCommand == SMB_COM_TRANSACTION2) {
  129. responsePackets.add(new Packet(smbPacket.getTrans2()));
  130. } else if (smbCommand == SMB_COM_CLOSE) {
  131. responsePackets.add(new Packet(smbPacket.getClose()));
  132. } else if (smbCommand == SMB_COM_TREE_DISCONNECT) {
  133. state = STATE.CLOSED;
  134. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  135. } else {
  136. state = STATE.DISCONNECTED;
  137. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  138. }
  139. break;
  140. case LISTING:
  141. if (smbCommand == SMB_COM_TRANSACTION) {
  142. responsePackets.add(new Packet(smbPacket.getTrans()));
  143. } else if (smbCommand == SMB_COM_CLOSE) {
  144. responsePackets.add(new Packet(smbPacket.getClose()));
  145. } else if (smbCommand == SMB_COM_TREE_DISCONNECT) {
  146. state = STATE.CLOSED;
  147. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  148. } else if (smbCommand == SMB_COM_NEGOTIATE) {
  149. state = STATE.CONNECTED;
  150. responsePackets.add(new Packet(smbPacket.getNego()));
  151. } else {
  152. state = STATE.DISCONNECTED;
  153. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  154. }
  155. break;
  156. case DISCONNECTED:
  157. state = STATE.CLOSED;
  158. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  159. break;
  160. default:
  161. state = STATE.CLOSED;
  162. responsePackets.add(new Packet(smbPacket.getTreeDisc()));
  163. }
  164. return responsePackets;
  165. }
  166. @Override
  167. public String toString() {
  168. return "SMB";
  169. }
  170. @Override
  171. public TALK_FIRST whoTalksFirst() {
  172. return TALK_FIRST.CLIENT;
  173. }
  174. }