CovertChannel.cpp 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "../../include/CovertChannel/CovertChannel.h"
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <thread>
  5. CovertChannel::CovertChannel(const std::string &innerInterface, const std::string &outerInterface, const std::string &innerForwardFilter,
  6. const std::string &outerForwardFilter, const std::string &innerChannelFilter, const std::string &outerChannelFilter,
  7. const std::string &outerPartnerFilter)
  8. : innerSender(innerInterface), outerSender(outerInterface) {
  9. Tins::SnifferConfiguration config;
  10. config.set_promisc_mode(true);
  11. config.set_immediate_mode(true);
  12. config.set_direction(PCAP_D_IN);
  13. config.set_snap_len(1500);
  14. try {
  15. innerForwardSniffer = new Tins::Sniffer(innerInterface, config);
  16. outerForwardSniffer = new Tins::Sniffer(outerInterface, config);
  17. innerChannelSniffer = new Tins::Sniffer(innerInterface, config);
  18. outerChannelSniffer = new Tins::Sniffer(outerInterface, config);
  19. outerPartnerSniffer = new Tins::Sniffer(outerInterface, config);
  20. setFilter(innerForwardFilter, outerForwardFilter, innerChannelFilter, outerChannelFilter, outerPartnerFilter);
  21. } catch (const Tins::pcap_error &e) {
  22. std::cerr << "An error accured setting up the sniffer: " << e.what() << std::endl;
  23. std::exit(EXIT_FAILURE);
  24. }
  25. }
  26. CovertChannel::~CovertChannel() {
  27. innerForwardSniffer->stop_sniff();
  28. outerForwardSniffer->stop_sniff();
  29. innerChannelSniffer->stop_sniff();
  30. outerChannelSniffer->stop_sniff();
  31. outerPartnerSniffer->stop_sniff();
  32. delete (innerForwardSniffer);
  33. delete (outerForwardSniffer);
  34. delete (innerChannelSniffer);
  35. delete (outerChannelSniffer);
  36. delete (outerPartnerSniffer);
  37. }
  38. void CovertChannel::setFilter(const std::string &innerForwardFilter, const std::string &outerForwardFilter, const std::string &innerChannelFilter,
  39. const std::string &outerChannelFilter, const std::string &outerPartnerFilter) {
  40. innerForwardSniffer->set_filter(innerForwardFilter);
  41. outerForwardSniffer->set_filter(outerForwardFilter);
  42. innerChannelSniffer->set_filter(innerChannelFilter);
  43. outerChannelSniffer->set_filter(outerChannelFilter);
  44. outerPartnerSniffer->set_filter(outerPartnerFilter);
  45. }
  46. void CovertChannel::startSniffing() {
  47. std::thread innerForwardSnifferThread(&CovertChannel::startInnerForwardSniffing, this);
  48. std::thread outerForwardSnifferThread(&CovertChannel::startOuterForwardSniffing, this);
  49. std::thread innerChannelSnifferThread(&CovertChannel::startInnerChannelSniffing, this);
  50. std::thread outerChannelSnifferThread(&CovertChannel::startOuterChannelSniffing, this);
  51. std::thread outerPartnerSnifferThread(&CovertChannel::startOuterPartnerSniffing, this);
  52. innerForwardSnifferThread.detach();
  53. outerForwardSnifferThread.detach();
  54. innerChannelSnifferThread.detach();
  55. outerChannelSnifferThread.detach();
  56. outerPartnerSnifferThread.detach();
  57. }
  58. void CovertChannel::startInnerForwardSniffing() { innerForwardSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleForwardFromInner)); }
  59. void CovertChannel::startOuterForwardSniffing() { outerForwardSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleForwardFromOuter)); }
  60. void CovertChannel::startInnerChannelSniffing() { innerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelFromInner)); }
  61. void CovertChannel::startOuterChannelSniffing() { outerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelFromOuter)); }
  62. void CovertChannel::startOuterPartnerSniffing() { outerPartnerSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handlePartnerFromOuter)); }
  63. bool CovertChannel::handleForwardFromOuter(Tins::PDU &pdu) {
  64. innerSender.send(pdu);
  65. return true;
  66. }
  67. bool CovertChannel::handleForwardFromInner(Tins::PDU &pdu) {
  68. outerSender.send(pdu);
  69. return true;
  70. }