GHOST.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package de.tudarmstadt.informatik.hostage.protocol;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.IOException;
  5. import java.net.InetAddress;
  6. import java.net.Socket;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import de.tudarmstadt.informatik.hostage.wrapper.Packet;
  10. /**
  11. * Ghost Protocol. This protocol mirrors an incoming connection back to the
  12. * attacker on the same port, that it is running on. It will send all incoming
  13. * requests back to the attacker on the mirrored connection and will relpy with
  14. * the responses it get's from this mirrored connection.
  15. *
  16. * @author Wulf Pfeiffer
  17. */
  18. public class GHOST implements Protocol {
  19. private boolean isClosed = false;
  20. private Socket mirroredConnection;
  21. private BufferedInputStream mirrorInputStream;
  22. private BufferedOutputStream mirrorOutputStream;
  23. private int currentPort;
  24. private InetAddress attackerIP;
  25. public void setCurrentPort(int currentPort) {
  26. this.currentPort = currentPort;
  27. }
  28. public void setAttackerIP(InetAddress attackerIP) {
  29. this.attackerIP = attackerIP;
  30. }
  31. @Override
  32. public int getPort() {
  33. return 1433;
  34. }
  35. @Override
  36. public boolean isClosed() {
  37. return isClosed;
  38. }
  39. @Override
  40. public boolean isSecure() {
  41. return false;
  42. }
  43. @Override
  44. public List<Packet> processMessage(Packet requestPacket) {
  45. List<Packet> responsePackets = new ArrayList<Packet>();
  46. try {
  47. if (mirroredConnection == null) {
  48. mirroredConnection = new Socket(attackerIP, currentPort);
  49. mirrorInputStream = new BufferedInputStream(
  50. mirroredConnection.getInputStream());
  51. mirrorOutputStream = new BufferedOutputStream(
  52. mirroredConnection.getOutputStream());
  53. }
  54. if (mirroredConnection.isInputShutdown()
  55. || mirroredConnection.isOutputShutdown()) {
  56. mirrorInputStream.close();
  57. mirrorOutputStream.close();
  58. mirroredConnection.close();
  59. isClosed = true;
  60. }
  61. mirrorOutputStream.write(requestPacket.getBytes());
  62. mirrorOutputStream.flush();
  63. int availableBytes;
  64. while ((availableBytes = mirrorInputStream.available()) <= 0) {
  65. Thread.yield();
  66. }
  67. byte[] mirrorResponse = new byte[availableBytes];
  68. mirrorInputStream.read(mirrorResponse);
  69. responsePackets.add(new Packet(mirrorResponse));
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. responsePackets.add(requestPacket);
  73. }
  74. return responsePackets;
  75. }
  76. @Override
  77. public String toString() {
  78. return "GHOST";
  79. }
  80. @Override
  81. public TALK_FIRST whoTalksFirst() {
  82. return TALK_FIRST.CLIENT;
  83. }
  84. }