rust - 我的网络之外的主机响应我的 SYN 数据包
问题描述
我正在尝试编写一个玩具端口扫描器,它在 TCP 标头的标志字段中设置 SYN 位。问题是程序打印来自我网络之外的主机的响应,我不知道这怎么可能,因为我明确地将我的路由器设置为目的地。我也没有在 Wireshark 中看到发送的数据包。就好像数据包格式错误或类似的东西。
use std::str::FromStr;
use std::net::IpAddr;
use std::net::Ipv4Addr;
use pnet::packet::Packet;
use pnet::packet::ip::IpNextHeaderProtocols;
use pnet::transport::ipv4_packet_iter;
use pnet::packet::ipv4::Ipv4Flags;
use pnet::packet::ipv4::MutableIpv4Packet;
use pnet::packet::ipv4::checksum;
use pnet::packet::tcp::MutableTcpPacket;
use pnet::packet::tcp::ipv4_checksum;
use pnet::packet::tcp::TcpFlags;
use pnet::transport::tcp_packet_iter;
use pnet::transport::transport_channel;
use pnet::transport::TransportChannelType;
use pnet::transport::TransportProtocol;
use rand::Rng;
fn main() {
let ports = [22, 80, 443, 8000];
ports.iter().for_each(|port| {
let mut buf_tcp = [0u8; 20];
let mut buf_ip = [0u8; 40];
let tcp_packet = build_tcp_packet(&mut buf_tcp, *port);
let ipv4_packet = build_ipv4_packet(&mut buf_ip, tcp_packet);
let protocol = TransportChannelType::Layer3(IpNextHeaderProtocols::Tcp);
let (mut tx, mut rx) = transport_channel(1024, protocol).unwrap();
let mut rx = ipv4_packet_iter(&mut rx);
tx.send_to(ipv4_packet, IpAddr::from_str("192.168.1.1").unwrap());
if let Ok((packet, addr)) = rx.next() {
println!("{:?}", addr);
match packet.get_flags() {
18 => println!("{}: open", port),
_ => println!("{}: closed", port),
}
}
});
}
fn build_ipv4_packet<'a>(buf: &'a mut [u8], payload: MutableTcpPacket) -> MutableIpv4Packet<'a> {
let mut ipv4_packet = MutableIpv4Packet::new(buf).unwrap();
ipv4_packet.set_version(0x4);
ipv4_packet.set_header_length(0x14);
ipv4_packet.set_dscp(0x0);
ipv4_packet.set_ecn(0x0);
ipv4_packet.set_total_length(0x28);
ipv4_packet.set_flags(Ipv4Flags::DontFragment);
ipv4_packet.set_fragment_offset(0x0);
ipv4_packet.set_ttl(0x20);
ipv4_packet.set_next_level_protocol(IpNextHeaderProtocols::Tcp);
ipv4_packet.set_source(Ipv4Addr::new(192, 168, 1, 46));
ipv4_packet.set_destination(Ipv4Addr::new(192, 168, 1, 1));
ipv4_packet.set_checksum(checksum(&ipv4_packet.to_immutable()));
ipv4_packet.set_payload(payload.to_immutable().packet());
ipv4_packet
}
fn build_tcp_packet(buf: &mut [u8], dest: u16) -> MutableTcpPacket {
let mut tcp_packet = MutableTcpPacket::new(buf).unwrap();
tcp_packet.set_source(0x1312);
tcp_packet.set_destination(dest);
tcp_packet.set_sequence(rand::thread_rng().gen::<u32>());
tcp_packet.set_acknowledgement(0x0);
tcp_packet.set_data_offset(0x5);
tcp_packet.set_reserved(0x0);
tcp_packet.set_flags(TcpFlags::SYN);
tcp_packet.set_window(0x1312);
tcp_packet.set_urgent_ptr(0x0);
tcp_packet.set_checksum(ipv4_checksum(
&tcp_packet.to_immutable(),
&Ipv4Addr::new(192, 168, 1, 46),
&Ipv4Addr::new(192, 168, 1, 1),
));
tcp_packet
}
我正在使用 Rust 和 pnet。
解决方案
推荐阅读
- docker - 创建持久、耐用的“工人箱”Docker 容器
- javascript - 在 vue js 中跳转相同的路线不起作用
- eclipse - 黄瓜测试用例执行后在 Eclipse 中出现奇怪的控制台错误/异常
- java - 将嵌套的对象列表持久保存到同一个表中 JPA hibernate
- prisma2 - Prisma2,分组日期
- react-native - 具有反应原生和裸工作流博览会的后台应用程序
- c# - 自定义授权过滤器未触发默认代码
- highcharts - Highcharts - 我无法显示数据集的图例
- java - 使用 Java stream() 查找 Arrays.asList 中 2 个元素的平均值
- android - 从 StateFlow 收集状态