首页 > 解决方案 > 我的网络之外的主机响应我的 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。

标签: rusttcppnet

解决方案


推荐阅读