Customized Network Layer Protocol C2

0x9bc2 Raw Socket留下的坑, 自定义网络层协议实现木马通信 实现细节 server和agent都需要高权限运行, 因为使用了原始套接字(raw socket) server使用原始套接字监听监听0x9bIP协议号 agent发送协议号为0x9b的原始IP数据包 我们将使用socket2和etherparsecrate实现核心功能 server核心代码 // 创建0x9b协议号的原始套接字 let sock = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::from(155)))?; // 创建堆区缓冲区 let mut data = Box::new([MaybeUninit::new(0u8); 65535]); // 接收数据, 并得到agent的SockAddr结构 let (n, agent) = sock.recv_from(&mut *data)?; // 切片数据 let data = &self[..n]; // 创建迭代器, 过滤出所有有效数据, 并收集成Vec<u8> let data: Vec<u8> = data .iter() .filter_map(|r| Some(unsafe { r.assume_init() })) .collect(); // 提取出IPv4协议下的数据 let (_, data) = Ipv4Header::from_slice(data.as_slice())?; agent核心代码 // 创建stdlib net下的SocketAddrV4, 指向服务器IP let server = SocketAddrV4::new("127....

April 1, 2023 · b1n

Raw Socket

Linux raw socket的总结 介绍相关结构体和常量, 最后实现ICMP接收和响应 创建套接字 int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 创建一个IPV4 ICMP原始套接字(IPV4 ICMP raw socket) AF_INET: 代表IPV4协议 SOCK_RAW: 代表原始套接字 IPPROTO_ICMP: 代表ICMP协议 禁用内核自动附加IP头 int on = 1; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); 启用IP_HDRINCL选项, 数据包含IP数据头, 发送数据时需要自己构建IP数据头, 内核不再生成 接收数据 char* buf = calloc(1, IPPROTO_MAX); struct sockaddr in; socklen_t in_len = sizeof(in); recvfrom(sock, buf, IPPROTO_MAX, 0, &in, &in_len); 将数据写入buf, 发送方地址将保存在in变量 解析数据段 struct iphdr *ip = (struct iphdr*)buf; struct icmphdr *icmp = (struct icmphdr*)((char*)ip + 4 * ip->ihl); printf("data: %s\n", (char*)icmp + 8); iphdr是ip header的缩写, 表示一个IP数据头结构 IHL(Internet Header Length): IP数据头是不定长的, 所以需要IHL记录IP数据头大小, 以4字节为单位, 所以IP数据头大小等于4 * IHL bytes...

March 8, 2023 · b1n