|
@@ -0,0 +1,74 @@
|
|
|
|
+#include "../../include/CovertChannel/CovertChannel.h"
|
|
|
|
+#include <cstdlib>
|
|
|
|
+#include <iostream>
|
|
|
|
+#include <thread>
|
|
|
|
+
|
|
|
|
+CovertChannel::CovertChannel(const std::string &innerInterface, const std::string &outerInterface, const std::string &filter)
|
|
|
|
+ : innerSender(innerInterface), outerSender(outerInterface) {
|
|
|
|
+ Tins::SnifferConfiguration forwardConfig;
|
|
|
|
+ forwardConfig.set_promisc_mode(true);
|
|
|
|
+ forwardConfig.set_immediate_mode(true);
|
|
|
|
+ forwardConfig.set_direction(PCAP_D_IN);
|
|
|
|
+ forwardConfig.set_snap_len(1500);
|
|
|
|
+ forwardConfig.set_filter("not (" + filter + ")");
|
|
|
|
+
|
|
|
|
+ Tins::SnifferConfiguration channelConfig;
|
|
|
|
+ channelConfig.set_promisc_mode(true);
|
|
|
|
+ channelConfig.set_immediate_mode(true);
|
|
|
|
+ channelConfig.set_direction(PCAP_D_IN);
|
|
|
|
+ channelConfig.set_snap_len(1500);
|
|
|
|
+ channelConfig.set_filter(filter);
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ innerForwardSniffer = new Tins::Sniffer(innerInterface, forwardConfig);
|
|
|
|
+ outerForwardSniffer = new Tins::Sniffer(outerInterface, forwardConfig);
|
|
|
|
+ } catch (const Tins::pcap_error &e) {
|
|
|
|
+ std::cerr << "An error accured setting up the sniffer: " << e.what() << std::endl;
|
|
|
|
+ std::exit(EXIT_FAILURE);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+CovertChannel::~CovertChannel() {
|
|
|
|
+ innerForwardSniffer->stop_sniff();
|
|
|
|
+ outerForwardSniffer->stop_sniff();
|
|
|
|
+ innerChannelSniffer->stop_sniff();
|
|
|
|
+ outerChannelSniffer->stop_sniff();
|
|
|
|
+ delete (innerForwardSniffer);
|
|
|
|
+ delete (outerForwardSniffer);
|
|
|
|
+ delete (innerChannelSniffer);
|
|
|
|
+ delete (outerChannelSniffer);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void CovertChannel::startSniffing() {
|
|
|
|
+ std::thread innerSnifferThread(&CovertChannel::startInnerForwardSniffing, this);
|
|
|
|
+ std::thread outerSnifferThread(&CovertChannel::startOuterForwardSniffing, this);
|
|
|
|
+ innerSnifferThread.detach();
|
|
|
|
+ outerSnifferThread.detach();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void CovertChannel::startInnerForwardSniffing() { innerForwardSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleForwardToOuter)); }
|
|
|
|
+
|
|
|
|
+void CovertChannel::startOuterForwardSniffing() { outerForwardSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleForwardToInner)); }
|
|
|
|
+
|
|
|
|
+void CovertChannel::startInnerChannelSniffing() { innerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelToOuter)); }
|
|
|
|
+
|
|
|
|
+void CovertChannel::startOuterChannelSniffing() { outerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelToInner)); }
|
|
|
|
+
|
|
|
|
+void CovertChannel::setFilter(const std::string &filterString) {
|
|
|
|
+ innerForwardSniffer->set_filter("not (" + filterString + ")");
|
|
|
|
+ outerForwardSniffer->set_filter("not (" + filterString + ")");
|
|
|
|
+ innerChannelSniffer->set_filter(filterString);
|
|
|
|
+ outerChannelSniffer->set_filter(filterString);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool CovertChannel::handleForwardToInner(Tins::PDU &pdu) {
|
|
|
|
+ innerSender.send(pdu);
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool CovertChannel::handleForwardToOuter(Tins::PDU &pdu) {
|
|
|
|
+ outerSender.send(pdu);
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|