Пример #1
0
def create_session(packet_log):
    listener = MockListener()
    syn = packet_log[0]
    listener.source_port = syn.sport - 1
    conn = TCPSocket(listener)
    conn.connect(syn.payload.dst, syn.dport)
    # Change the sequence number so that we can test it
    conn.seq = syn.seq
    return listener, conn
Пример #2
0
def create_session(packet_log):
    """
    Helper function to create a client session from a PCAP log. Sets up the
    sequence numbers to match with the sequence numbers in the PCAP.
    """
    listener = MockListener()
    syn = packet_log[0]
    listener.source_port = syn.sport - 1
    conn = TCPSocket(listener)
    conn.connect(syn.payload.dst, syn.dport)
    # Change the sequence number so that we can test it
    conn.seq = syn.seq
    return listener, conn
Пример #3
0
def test_sends_reset():
    """The connection should send a RST packet when it's closed."""
    listener = MockListener()

    packet_log = rdpcap("test/inputs/tiniest-session.pcap")
    listener, conn = create_session(packet_log)
    conn._close()

    syn_ack = packet_log[1]
    listener.dispatch(syn_ack)

    last_packet = listener.received_packets[-1]
    assert last_packet.sprintf("%TCP.flags%") == "R"
Пример #4
0
def test_reset():
    listener = MockListener()

    packet_log = rdpcap("test/inputs/tiniest-session.pcap")
    listener, conn = create_session(packet_log)
    syn_ack = packet_log[1]

    listener.dispatch(syn_ack)

    reset = syn_ack.copy()
    reset.payload.payload.flags = "R"
    reset.seq += 1
    listener.dispatch(reset)

    assert conn.state == "CLOSED"
Пример #5
0
def test_bind_handshake():
    packet_log = rdpcap("test/inputs/tiniest-session.pcap")
    syn, syn_ack, ack, client_fin_ack, server_fin_ack, client_ack = packet_log

    listener = MockListener()
    conn = TCPSocket(listener)
    conn.seq = syn_ack.seq
    conn.bind(syn.payload.dst, syn.dport)

    listener.dispatch(syn)
    listener.dispatch(ack)

    assert len(listener.received_packets) == 1
    assert conn.state == "ESTABLISHED"
    check_mostly_same(listener.received_packets[0], syn_ack)
Пример #6
0
def test_bind_handshake():
    """
    We can do a handshake when we're the server (someone else initiates the
    SYN).
    """
    packet_log = rdpcap("test/inputs/tiniest-session.pcap")
    syn, syn_ack, ack, client_fin_ack, server_fin_ack, client_ack = packet_log

    listener = MockListener()
    conn = TCPSocket(listener)
    conn.seq = syn_ack.seq
    conn.bind(syn.payload.dst, syn.dport)

    listener.dispatch(syn)
    listener.dispatch(ack)

    assert len(listener.received_packets) == 1
    assert conn.state == "ESTABLISHED"
    check_mostly_same(listener.received_packets[0], syn_ack)
Пример #7
0
def test_syn():
    """When we connect, we should send a SYN."""
    listener = MockListener()
    conn = TCPSocket(listener)
    conn.connect("localhost", 80)

    assert conn.state == "SYN-SENT"
    pkts = listener.received_packets
    assert len(pkts) == 1
    assert pkts[0].sprintf("%TCP.flags%") == "S"
Пример #8
0
def test_handshake_client():
    listener = MockListener()
    conn = TCPSocket(listener)
    conn.connect("localhost", 80)
    initial_seq = conn.seq

    tcp_packet = TCP(dport=conn.src_port, flags="SA", seq=100, ack=initial_seq + 1)
    syn_ack = Ether() / IP(dst=conn.src_ip) / tcp_packet
    listener.dispatch(syn_ack)

    assert conn.seq == initial_seq + 1
    assert conn.state == "ESTABLISHED"

    # We should have sent exactly two packets
    # Check that they look okay
    pkts = listener.received_packets
    assert len(pkts) == 2
    syn, ack = pkts
    assert ack.seq == syn.seq + 1
    assert syn.sprintf("%TCP.flags%") == "S"
    assert ack.sprintf("%TCP.flags%") == "A"
Пример #9
0
def test_tiny_session_server():
    """
    Test the whole tiny session, from a server POV.
    """
    packet_log = rdpcap("test/inputs/tiniest-session.pcap")
    syn, syn_ack = packet_log[:2]

    listener = MockListener()
    conn = TCPSocket(listener)
    conn.seq = syn_ack.seq

    conn.bind(syn.payload.dst, syn.dport)

    check_replay(listener, conn, packet_log)
Пример #10
0
def test_closes_on_reset():
    """The connection should close when it receives a RST packet"""
    listener = MockListener()

    packet_log = rdpcap("test/inputs/tiniest-session.pcap")
    listener, conn = create_session(packet_log)
    syn_ack = packet_log[1]

    listener.dispatch(syn_ack)

    reset = syn_ack.copy()
    reset.payload.payload.flags = "R"
    reset.seq += 1
    listener.dispatch(reset)

    assert conn.state == "CLOSED"