ProxyChannel.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "../../include/CovertChannel/ProxyChannel.h"
  2. #include <iostream>
  3. ProxyChannel::ProxyChannel(const std::string &innerInterface, const std::string &outerInterface, const std::string &ownIP, const std::string &partnerIP,
  4. const std::string &originIP, const std::string &targetIP, const std::string &targetPort, const std::string &ownMAC,
  5. const std::string &originMAC, const std::string &channelGatewayMAC, const std::string &gatewayMAC, const bool relayOnly)
  6. : CovertChannel(innerInterface, outerInterface,
  7. "(not (tcp and src host " + originIP + " and dst host " + targetIP + " and dst port " + targetPort + ")) and (not (dst host " + ownIP +
  8. "))",
  9. "(not (tcp and src host " + targetIP + " and dst host " + ownIP + " and src port " + targetPort + ")) and (not (dst host " + ownIP + "))",
  10. "tcp and src host " + originIP + " and dst host " + targetIP + " and dst port " + targetPort,
  11. "tcp and src host " + targetIP + " and dst host " + ownIP + " and src port " + targetPort,
  12. "tcp and src host " + partnerIP + " and dst host " + ownIP + " and port " + targetPort),
  13. relayOnly(relayOnly), ownAddress(ownIP), partnerAddress(partnerIP), originAddress(originIP), targetAddress(targetIP), ownMAC(ownMAC),
  14. channelGatewayMAC(channelGatewayMAC), gatewayMAC(gatewayMAC), originMAC(originMAC) {}
  15. ProxyChannel::~ProxyChannel() {}
  16. bool ProxyChannel::handleChannelFromOuter(Tins::PDU &pdu) {
  17. // TODO: check in a list how to route it and who send the request for this answer
  18. Tins::EthernetII &eth = pdu.rfind_pdu<Tins::EthernetII>();
  19. Tins::IP &ip = pdu.rfind_pdu<Tins::IP>();
  20. if (relayOnly) {
  21. // redirect to partner
  22. eth.src_addr(ownMAC);
  23. eth.dst_addr(channelGatewayMAC);
  24. ip.src_addr(ownAddress);
  25. ip.dst_addr(partnerAddress);
  26. outerSender.send(pdu);
  27. } else {
  28. // Just forward it
  29. // eth.src_addr(gatewayMAC);
  30. // eth.dst_addr(originMAC);
  31. // ip.src_addr(targetAddress);
  32. // ip.dst_addr(originAddress);
  33. innerSender.send(pdu);
  34. std::cout << "channel from outer" << std::endl;
  35. }
  36. return true;
  37. }
  38. bool ProxyChannel::handleChannelFromInner(Tins::PDU &pdu) {
  39. Tins::EthernetII &eth = pdu.rfind_pdu<Tins::EthernetII>();
  40. Tins::IP &ip = pdu.rfind_pdu<Tins::IP>();
  41. if (relayOnly) {
  42. std::cerr << "Fixme: packet cannot be routed back so it's dropped here!!!" << std::endl;
  43. // outerSender.send(pdu);
  44. // TODO: add pdu to a list to check later how to route it
  45. } else {
  46. eth.src_addr(ownMAC);
  47. eth.dst_addr(channelGatewayMAC);
  48. ip.src_addr(ownAddress);
  49. ip.dst_addr(partnerAddress);
  50. outerSender.send(pdu);
  51. std::cout << "channel from inner" << std::endl;
  52. }
  53. return true;
  54. }
  55. bool ProxyChannel::handlePartnerFromOuter(Tins::PDU &pdu) {
  56. Tins::EthernetII &eth = pdu.rfind_pdu<Tins::EthernetII>();
  57. Tins::IP &ip = pdu.rfind_pdu<Tins::IP>();
  58. if (relayOnly) {
  59. // redirect to target
  60. eth.src_addr(ownMAC);
  61. eth.dst_addr(gatewayMAC);
  62. ip.src_addr(ownAddress);
  63. ip.dst_addr(targetAddress);
  64. outerSender.send(pdu);
  65. std::cout << "relay" << std::endl;
  66. } else {
  67. eth.src_addr(gatewayMAC);
  68. eth.dst_addr(originMAC);
  69. ip.src_addr(targetAddress);
  70. ip.dst_addr(originAddress);
  71. innerSender.send(pdu);
  72. std::cout << "partner" << std::endl;
  73. }
  74. return true;
  75. }