|
@@ -3,25 +3,24 @@
|
|
#include <iostream>
|
|
#include <iostream>
|
|
#include <thread>
|
|
#include <thread>
|
|
|
|
|
|
-CovertChannel::CovertChannel(const std::string &innerInterface, const std::string &outerInterface, const std::string &filter)
|
|
|
|
|
|
+CovertChannel::CovertChannel(const std::string &innerInterface, const std::string &outerInterface, const std::string &innerForwardFilter,
|
|
|
|
+ const std::string &outerForwardFilter, const std::string &innerChannelFilter, const std::string &outerChannelFilter,
|
|
|
|
+ const std::string &outerPartnerFilter)
|
|
: innerSender(innerInterface), outerSender(outerInterface) {
|
|
: 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);
|
|
|
|
|
|
+ Tins::SnifferConfiguration config;
|
|
|
|
+ config.set_promisc_mode(true);
|
|
|
|
+ config.set_immediate_mode(true);
|
|
|
|
+ config.set_direction(PCAP_D_IN);
|
|
|
|
+ config.set_snap_len(1500);
|
|
|
|
|
|
try {
|
|
try {
|
|
- innerForwardSniffer = new Tins::Sniffer(innerInterface, forwardConfig);
|
|
|
|
- outerForwardSniffer = new Tins::Sniffer(outerInterface, forwardConfig);
|
|
|
|
|
|
+ innerForwardSniffer = new Tins::Sniffer(innerInterface, config);
|
|
|
|
+ outerForwardSniffer = new Tins::Sniffer(outerInterface, config);
|
|
|
|
+ innerChannelSniffer = new Tins::Sniffer(innerInterface, config);
|
|
|
|
+ outerChannelSniffer = new Tins::Sniffer(outerInterface, config);
|
|
|
|
+ outerPartnerSniffer = new Tins::Sniffer(outerInterface, config);
|
|
|
|
+
|
|
|
|
+ setFilter(innerForwardFilter, outerForwardFilter, innerChannelFilter, outerChannelFilter, outerPartnerFilter);
|
|
} catch (const Tins::pcap_error &e) {
|
|
} catch (const Tins::pcap_error &e) {
|
|
std::cerr << "An error accured setting up the sniffer: " << e.what() << std::endl;
|
|
std::cerr << "An error accured setting up the sniffer: " << e.what() << std::endl;
|
|
std::exit(EXIT_FAILURE);
|
|
std::exit(EXIT_FAILURE);
|
|
@@ -33,17 +32,35 @@ CovertChannel::~CovertChannel() {
|
|
outerForwardSniffer->stop_sniff();
|
|
outerForwardSniffer->stop_sniff();
|
|
innerChannelSniffer->stop_sniff();
|
|
innerChannelSniffer->stop_sniff();
|
|
outerChannelSniffer->stop_sniff();
|
|
outerChannelSniffer->stop_sniff();
|
|
|
|
+ outerPartnerSniffer->stop_sniff();
|
|
delete (innerForwardSniffer);
|
|
delete (innerForwardSniffer);
|
|
delete (outerForwardSniffer);
|
|
delete (outerForwardSniffer);
|
|
delete (innerChannelSniffer);
|
|
delete (innerChannelSniffer);
|
|
delete (outerChannelSniffer);
|
|
delete (outerChannelSniffer);
|
|
|
|
+ delete (outerPartnerSniffer);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void CovertChannel::setFilter(const std::string &innerForwardFilter, const std::string &outerForwardFilter, const std::string &innerChannelFilter,
|
|
|
|
+ const std::string &outerChannelFilter, const std::string &outerPartnerFilter) {
|
|
|
|
+ innerForwardSniffer->set_filter(innerForwardFilter);
|
|
|
|
+ outerForwardSniffer->set_filter(outerForwardFilter);
|
|
|
|
+ innerChannelSniffer->set_filter(innerChannelFilter);
|
|
|
|
+ outerChannelSniffer->set_filter(outerChannelFilter);
|
|
|
|
+ outerPartnerSniffer->set_filter(outerPartnerFilter);
|
|
}
|
|
}
|
|
|
|
|
|
void CovertChannel::startSniffing() {
|
|
void CovertChannel::startSniffing() {
|
|
- std::thread innerSnifferThread(&CovertChannel::startInnerForwardSniffing, this);
|
|
|
|
- std::thread outerSnifferThread(&CovertChannel::startOuterForwardSniffing, this);
|
|
|
|
- innerSnifferThread.detach();
|
|
|
|
- outerSnifferThread.detach();
|
|
|
|
|
|
+ std::thread innerForwardSnifferThread(&CovertChannel::startInnerForwardSniffing, this);
|
|
|
|
+ std::thread outerForwardSnifferThread(&CovertChannel::startOuterForwardSniffing, this);
|
|
|
|
+ std::thread innerChannelSnifferThread(&CovertChannel::startInnerChannelSniffing, this);
|
|
|
|
+ std::thread outerChannelSnifferThread(&CovertChannel::startOuterChannelSniffing, this);
|
|
|
|
+ std::thread outerPartnerSnifferThread(&CovertChannel::startOuterPartnerSniffing, this);
|
|
|
|
+
|
|
|
|
+ innerForwardSnifferThread.detach();
|
|
|
|
+ outerForwardSnifferThread.detach();
|
|
|
|
+ innerChannelSnifferThread.detach();
|
|
|
|
+ outerChannelSnifferThread.detach();
|
|
|
|
+ outerPartnerSnifferThread.detach();
|
|
}
|
|
}
|
|
|
|
|
|
void CovertChannel::startInnerForwardSniffing() { innerForwardSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleForwardFromInner)); }
|
|
void CovertChannel::startInnerForwardSniffing() { innerForwardSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleForwardFromInner)); }
|
|
@@ -54,12 +71,7 @@ void CovertChannel::startInnerChannelSniffing() { innerChannelSniffer->sniff_loo
|
|
|
|
|
|
void CovertChannel::startOuterChannelSniffing() { outerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelFromOuter)); }
|
|
void CovertChannel::startOuterChannelSniffing() { outerChannelSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handleChannelFromOuter)); }
|
|
|
|
|
|
-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);
|
|
|
|
-}
|
|
|
|
|
|
+void CovertChannel::startOuterPartnerSniffing() { outerPartnerSniffer->sniff_loop(make_sniffer_handler(this, &CovertChannel::handlePartnerFromOuter)); }
|
|
|
|
|
|
bool CovertChannel::handleForwardFromOuter(Tins::PDU &pdu) {
|
|
bool CovertChannel::handleForwardFromOuter(Tins::PDU &pdu) {
|
|
innerSender.send(pdu);
|
|
innerSender.send(pdu);
|