libpcap aplikace libpcap API Závěr libpcap Tématicky zaměřený vývoj aplikací v jazyce C skupina Systémové programování – Linux Jiří Novosad Fakulta informatiky Masarykova univerzita novosad@fi.muni.cz Brno, 17. 11. 2014 J. Novosad libpcap Brno, 17. 11. 2014 1 / 17 libpcap aplikace libpcap API Závěr libpcap packet capture knihovna (C/C++) zpracovává data ještě před OS (včetně NetFilteru!) obvykle vyžaduje práva administrátora dostupná i pro Windows (WinPcap) informace viz man pcap www.tcpdump.org/ J. Novosad libpcap Brno, 17. 11. 2014 2 / 17 libpcap aplikace libpcap API Závěr Aplikace Aplikace používající libpcap J. Novosad libpcap Brno, 17. 11. 2014 3 / 17 libpcap aplikace libpcap API Závěr tcpdump CLI packet analyzátor www.tcpdump.org/ J. Novosad libpcap Brno, 17. 11. 2014 4 / 17 libpcap aplikace libpcap API Závěr tcpdump CLI packet analyzátor www.tcpdump.org/ úkol vyzkoušejte si tcpdump -D vyberte si interface a vyzkoušejte tcpdump -ni eth0 J. Novosad libpcap Brno, 17. 11. 2014 4 / 17 libpcap aplikace libpcap API Závěr tcpdump CLI packet analyzátor www.tcpdump.org/ úkol vyzkoušejte si tcpdump -D vyberte si interface a vyzkoušejte tcpdump -ni eth0 použijte filtr a uložte DNS komunikaci resolveip J. Novosad libpcap Brno, 17. 11. 2014 4 / 17 libpcap aplikace libpcap API Závěr Wireshark grafická obdoba tcpdumpu www.wireshark.org/ úkol otevřete vzorek uložený tcpdumpem a analyzujte provoz J. Novosad libpcap Brno, 17. 11. 2014 5 / 17 libpcap aplikace libpcap API Závěr Další aplikace snort, suricata (IDS) Bro (IDS) ngrep (network grep) nmap (port scanner) . . . J. Novosad libpcap Brno, 17. 11. 2014 6 / 17 libpcap aplikace libpcap API Závěr Nmap J. Novosad libpcap Brno, 17. 11. 2014 7 / 17 libpcap aplikace libpcap API Závěr API libpcap API J. Novosad libpcap Brno, 17. 11. 2014 8 / 17 libpcap aplikace libpcap API Závěr Specifikace zařízení pcapu je třeba říct, z kterého síťového zařízení má brát data #include char errbuf[PCAP_ERRBUF_SIZE]; int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf); void pcap_freealldevs(pcap_if_t *alldevs); char *pcap_lookupdev(char *errbuf); J. Novosad libpcap Brno, 17. 11. 2014 9 / 17 libpcap aplikace libpcap API Závěr úkol Vytiskněte informace o všech síťových interfacech: jméno popis aktuálně přidělené IP adresy (pokud jsou) J. Novosad libpcap Brno, 17. 11. 2014 10 / 17 libpcap aplikace libpcap API Závěr Capture handler 2 režimy: online a offline #include pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf); pcap_t *pcap_open_offline(const char *fname, char *errbuf); pcap_t *pcap_fopen_offline(FILE *fp, char *errbuf); pcap_t *pcap_open_dead(int linktype, int snaplen); int pcap_datalink(pcap_t *p); int pcap_list_datalinks(pcap_t *p, int **dlt_buf); void pcap_free_datalinks(int *dlt_list); void pcap_close(pcap_t *p); char *pcap_geterr(pcap_t *p); void pcap_perror(pcap_t *p, char *prefix); J. Novosad libpcap Brno, 17. 11. 2014 11 / 17 libpcap aplikace libpcap API Závěr Zpracování paketů cyklus pro zpracování každého paketu buď is napíšete vlastní, nebo použijete cyklus pcapu J. Novosad libpcap Brno, 17. 11. 2014 12 / 17 libpcap aplikace libpcap API Závěr Zpracování paketů cyklus pro zpracování každého paketu buď is napíšete vlastní, nebo použijete cyklus pcapu int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data); const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h); J. Novosad libpcap Brno, 17. 11. 2014 12 / 17 libpcap aplikace libpcap API Závěr Zpracování paketů cyklus pro zpracování každého paketu buď is napíšete vlastní, nebo použijete cyklus pcapu int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data); const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h); int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user); int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user); void pcap_breakloop(pcap_t *); J. Novosad libpcap Brno, 17. 11. 2014 12 / 17 libpcap aplikace libpcap API Závěr Zpracování paketů cyklus pro zpracování každého paketu buď is napíšete vlastní, nebo použijete cyklus pcapu int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data); const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h); int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user); int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user); void pcap_breakloop(pcap_t *); void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes); struct pcap_pkthdr { struct timeval ts; /* time stamp */ bpf_u_int32 caplen; /* length of portion present */ bpf_u_int32 len; /* length this packet (off wire) */ }; J. Novosad libpcap Brno, 17. 11. 2014 12 / 17 libpcap aplikace libpcap API Závěr úkol Vytvořte počítadlo paketů Vstupním parametrem je název interfacu Program počítá pakety procházející interfacem Při ukončení (Ctrl+C) je vytištěn počet paketů J. Novosad libpcap Brno, 17. 11. 2014 13 / 17 libpcap aplikace libpcap API Závěr Filtry BPF (BSD Packet Filter) formát biot.com/capstats/bpf.html J. Novosad libpcap Brno, 17. 11. 2014 14 / 17 libpcap aplikace libpcap API Závěr Filtry BPF (BSD Packet Filter) formát biot.com/capstats/bpf.html int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf); int pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask); void pcap_freecode(struct bpf_program *); int pcap_setfilter(pcap_t *p, struct bpf_program *fp); Vyzkoušejte: tcpdump -d ip and tcp dst port 7 J. Novosad libpcap Brno, 17. 11. 2014 14 / 17 libpcap aplikace libpcap API Závěr Závěr domácí úkoly a zdroje J. Novosad libpcap Brno, 17. 11. 2014 15 / 17 libpcap aplikace libpcap API Závěr Domácí úkol Síťový analyzátor Volání: ./sniff eth0 Z IP paketů (v Ethernetu) zjistěte následující informace čas přijetí paketu L2: src, dst MAC adresa L3 (IPv4 i IPv6): src, dst adresa TTL (IPv6: hop limit) protokol (UDP/TCP) L4 (UDP i TCP): src, dst port Informace vypisujte v reálném čase Zachycujte jen IPv4/IPv6 pakety (použijte správný filtr) Typ: netinet/{ether,ip,ip6,tcp}.h, ether_ntoa(), inet_ntop(), ntohs() J. Novosad libpcap Brno, 17. 11. 2014 16 / 17 libpcap aplikace libpcap API Závěr Zdroje www.tcpdump.org/ www.wireshark.org/ biot.com/capstats/bpf.html blog.cloudflare.com/bpf-the-forgotten-bytecode/ J. Novosad libpcap Brno, 17. 11. 2014 17 / 17