2015-11-02 2 views
1

Я играю с scapy, пытаясь сделать nmap-like, мне удалось выполнить трехстороннее рукопожатие, и я автоматически получаю данные, если подключаюсь к SMTP-серверу, но я не могу признать это.Номер Ack для подтверждения данных в scapy

Я подключился к нему через netcat, чтобы узнать, почему он не работает, и nc действительно отправляет ACK-пакет с полем TCP ack, установленным на длину полученного сегмента данных. 1. Итак, я пытаюсь сделать то же самое с scapy, но я не знаю, где найти длину сегмента TCP. Я попробовал lsc (TCP), но я не вижу поля.

Вот Wireshark захват связи NetCat:

enter image description here

И деталь пакета:

enter image description here

Как вы можете видеть, извед поле пакета чуть ниже данных 37 + 1 = 38.

Кто-нибудь знает, где и как это может быть und?

EDIT:

Там фактически нет поля, что дает длину сегмента, но она может быть рассчитана двумя способами:

tcp_seg_len = len(rp.getlayer(Raw).load) 
    # or 
    ip_total_len = rp.getlayer(IP).len 
    ip_header_len = rp.getlayer(IP).ihl * 32/8 
    tcp_header_len = rp.getlayer(TCP).dataofs * 32/8 
    tcp_seg_len = ip_total_len - ip_header_len - tcp_header_len 

    ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \ 
              dport=pkt[1].sport, \ 
              seq=rp[1].ack, \ 
              ack=tcp_seg_len + 1, \ 
              flags="A"), \ 
          verbose=0, timeout=1) 

Однако, когда я печатаю значения я получаю хороший номер Ack, но когда я смотрю захват wirehark, у меня есть огромный номер ack, и пакет помечен как «ACKed unseen segment». Когда я смотрю на байты в гекса, я получил правильное значение. Кто-нибудь знает, почему это происходит и как его решить?

ответ

2

Wireshark uses relative numbers в дисплее, так что правая scapy линия:

ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \ 
             dport=pkt[1].sport, \ 
             seq=rp[1].ack, \ 
             ack=rp[1].seq + tcp_seg_len, \ 
             flags="A"), \ 
         verbose=0, timeout=1) 

И следующий код (см EDIT в вопросе) делает работу:

ip_total_len = rp.getlayer(IP).len 
ip_header_len = rp.getlayer(IP).ihl * 32/8 
tcp_header_len = rp.getlayer(TCP).dataofs * 32/8 
tcp_seg_len = ip_total_len - ip_header_len - tcp_header_len 
ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \ 
             dport=pkt[1].sport, \ 
             seq=rp[1].ack, \ 
             ack=rp[1].seq + tcp_seg_len, \ 
             flags="A"), \ 
          verbose=0, timeout=1) 
0

Чтобы получить длину TCP сегмента. Это было проверено для трафика IPv6

tcp_header_len = rp.getlayer (TCP) .dataofs * 32/8 tcp_seg_len = rp.plen - tcp_header_len

Смежные вопросы