Added very, very basic C2 capability

This commit is contained in:
Andrew Rioux
2024-01-23 08:16:52 -05:00
31 changed files with 2717 additions and 194 deletions

View File

@@ -104,8 +104,12 @@ pub fn spawn_connection_handler(
use packets::*;
let packet = connection_packet.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()? else {
todo!()
};
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let data = udp_pkt.get_data();
@@ -197,8 +201,12 @@ fn authenticate<F: Fn()>(
Ok(p) => {
use packets::*;
let p = p.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = p.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer3Pkt::IPv4Pkt(ip_pkt) = p.get_layer3_pkt()? else {
todo!()
};
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let Ok(data) = conninfo.try_decrypt_and_verify(udp_pkt.get_data()) else {
counter += 1;
@@ -245,8 +253,12 @@ where
let msg = packet_handler.recv()?;
let pkt = msg.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()? else {
todo!()
};
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
if ip_pkt.source_ip() != conninfo.srcip || udp_pkt.srcport() != conninfo.srcport {
continue;

View File

@@ -110,8 +110,12 @@ impl InterfaceSender {
Self::RawUdp(interf) => Ok(interf.sendpacket(packet)?),
Self::Udp(interf) => {
use packets::*;
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()? else {
todo!()
};
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let addr = SocketAddrV4::new(ip_pkt.dest_ip(), udp_pkt.dstport());

View File

@@ -49,7 +49,9 @@ fn main() -> anyhow::Result<()> {
let (kill_connection, kill_connection_recv) = channel::<(Ipv4Addr, u16)>();
thread::spawn(move || loop {
let Ok(packet) = recv_eth_packet.recv() else { continue };
let Ok(packet) = recv_eth_packet.recv() else {
continue;
};
if let Err(_) = interface_sender.sendpacket(packet.pkt()) {}
});
@@ -57,7 +59,9 @@ fn main() -> anyhow::Result<()> {
s.spawn({
let connections = &connections;
move || loop {
let Ok(connection) = kill_connection_recv.recv() else { continue };
let Ok(connection) = kill_connection_recv.recv() else {
continue;
};
if let Ok(mut e) = connections.lock() {
e.remove(&connection);
}
@@ -70,8 +74,12 @@ fn main() -> anyhow::Result<()> {
let pkt = pkt.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()? else {
todo!()
};
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let connection_handle = &(ip_pkt.dest_ip(), udp_pkt.srcport());