ruby-lorcon 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Lorcon2.c +655 -0
- data/Lorcon2.h +31 -0
- data/README +41 -0
- data/extconf.rb +16 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f3f8c3a4d5a177cff318f1499a9ee6e7593448cb
|
4
|
+
data.tar.gz: ed69f9133024bf1a40ce2e4eef0aa9cf53694a15
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0ea7023ed642d65809fc297cbed55d34d97e1e1cf2d79bf7ee14d93a6a4fdcf502596ae625e13c0665a886e3e3a73622c13755f8494887891bf890fa02009186
|
7
|
+
data.tar.gz: 58372d941bb628b9f76ffcb4cdcf99b21008227d07b4452e651ece90680368cb286eb29ef4897ce1f6bc90cf980d712b17d36b181e56c75461330eac7a58581a
|
data/Lorcon2.c
ADDED
@@ -0,0 +1,655 @@
|
|
1
|
+
#include "Lorcon2.h"
|
2
|
+
#include "ruby.h"
|
3
|
+
|
4
|
+
#ifndef RUBY_19
|
5
|
+
#include "rubysig.h"
|
6
|
+
#endif
|
7
|
+
|
8
|
+
/*
|
9
|
+
self.license = GPLv2;
|
10
|
+
*/
|
11
|
+
|
12
|
+
/*
|
13
|
+
This is a derivative of the tx.c sample included with lorcon:
|
14
|
+
http://802.11ninja.net/lorcon/
|
15
|
+
|
16
|
+
lorcon is free software; you can redistribute it and/or modify
|
17
|
+
it under the terms of the GNU General Public License as published by
|
18
|
+
the Free Software Foundation; either version 2 of the License, or
|
19
|
+
(at your option) any later version.
|
20
|
+
|
21
|
+
lorcon is distributed in the hope that it will be useful,
|
22
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
23
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
24
|
+
GNU General Public License for more details.
|
25
|
+
|
26
|
+
You should have received a copy of the GNU General Public License
|
27
|
+
along with lorcon; if not, write to the Free Software
|
28
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
29
|
+
|
30
|
+
Copyright (c) 2005 dragorn and Joshua Wright
|
31
|
+
|
32
|
+
*/
|
33
|
+
|
34
|
+
/*
|
35
|
+
Lots of code borrowed from Tom Wambold's pylorcon:
|
36
|
+
http://pylorcon.googlecode.com/ - tom5760[at]gmail.com
|
37
|
+
*/
|
38
|
+
|
39
|
+
/*
|
40
|
+
All ruby-lorcon/rubyisms are by Metasploit LLC (C) 2006-2007
|
41
|
+
http://metasploit.com/ - msfdev[at]metasploit.com
|
42
|
+
*/
|
43
|
+
|
44
|
+
VALUE mLorcon;
|
45
|
+
VALUE cDevice;
|
46
|
+
VALUE cPacket;
|
47
|
+
|
48
|
+
VALUE Lorcon_get_version(VALUE self) {
|
49
|
+
return INT2NUM(lorcon_get_version());
|
50
|
+
}
|
51
|
+
|
52
|
+
static VALUE Lorcon_list_drivers(VALUE self) {
|
53
|
+
VALUE list;
|
54
|
+
VALUE hash;
|
55
|
+
|
56
|
+
lorcon_driver_t *drvlist, *dri;
|
57
|
+
|
58
|
+
list = rb_hash_new();
|
59
|
+
|
60
|
+
dri = drvlist = lorcon_list_drivers();
|
61
|
+
|
62
|
+
if (dri == NULL)
|
63
|
+
return Qnil;
|
64
|
+
|
65
|
+
while (dri) {
|
66
|
+
hash = rb_hash_new();
|
67
|
+
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
|
68
|
+
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
|
69
|
+
rb_hash_aset(list, rb_str_new2(dri->name),hash);
|
70
|
+
dri = dri->next;
|
71
|
+
}
|
72
|
+
|
73
|
+
lorcon_free_driver_list(drvlist);
|
74
|
+
|
75
|
+
return(list);
|
76
|
+
}
|
77
|
+
|
78
|
+
static VALUE Lorcon_find_driver(VALUE self, VALUE driver) {
|
79
|
+
VALUE hash;
|
80
|
+
lorcon_driver_t *dri;
|
81
|
+
char *drivert = RSTRING_PTR(driver);
|
82
|
+
|
83
|
+
dri = lorcon_find_driver(drivert);
|
84
|
+
|
85
|
+
if (dri == NULL)
|
86
|
+
return Qnil;
|
87
|
+
|
88
|
+
hash = rb_hash_new();
|
89
|
+
|
90
|
+
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
|
91
|
+
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
|
92
|
+
|
93
|
+
lorcon_free_driver_list(dri);
|
94
|
+
|
95
|
+
return(hash);
|
96
|
+
}
|
97
|
+
|
98
|
+
static VALUE Lorcon_auto_driver(VALUE self, VALUE interface) {
|
99
|
+
VALUE hash;
|
100
|
+
lorcon_driver_t *dri;
|
101
|
+
char *intf = RSTRING_PTR(interface);
|
102
|
+
|
103
|
+
dri = lorcon_auto_driver(intf);
|
104
|
+
|
105
|
+
if (dri == NULL)
|
106
|
+
return Qnil;
|
107
|
+
|
108
|
+
hash = rb_hash_new();
|
109
|
+
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
|
110
|
+
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
|
111
|
+
|
112
|
+
lorcon_free_driver_list(dri);
|
113
|
+
|
114
|
+
return hash;
|
115
|
+
}
|
116
|
+
|
117
|
+
void Lorcon_free(struct rldev *rld) {
|
118
|
+
if (rld->context != NULL)
|
119
|
+
lorcon_free(rld->context);
|
120
|
+
}
|
121
|
+
|
122
|
+
static VALUE Lorcon_create(int argc, VALUE *argv, VALUE self) {
|
123
|
+
struct rldev *rld;
|
124
|
+
char *intf = NULL, *driver = NULL;
|
125
|
+
VALUE rbdriver, rbintf, obj;
|
126
|
+
lorcon_driver_t *dri;
|
127
|
+
|
128
|
+
if (argc == 2) {
|
129
|
+
rb_scan_args(argc, argv, "2", &rbintf, &rbdriver);
|
130
|
+
intf = StringValuePtr(rbintf);
|
131
|
+
driver = StringValuePtr(rbdriver);
|
132
|
+
} else {
|
133
|
+
rb_scan_args(argc, argv, "1", &rbintf);
|
134
|
+
intf = StringValuePtr(rbintf);
|
135
|
+
}
|
136
|
+
|
137
|
+
if (driver == NULL) {
|
138
|
+
if ((dri = lorcon_auto_driver(intf)) == NULL) {
|
139
|
+
rb_raise(rb_eRuntimeError,
|
140
|
+
"LORCON could not detect a driver and none specified");
|
141
|
+
return (Qnil);
|
142
|
+
}
|
143
|
+
} else {
|
144
|
+
if ((dri = lorcon_find_driver(driver)) == NULL) {
|
145
|
+
rb_raise(rb_eArgError,
|
146
|
+
"LORCON could not recognize the specified driver");
|
147
|
+
return (Qnil);
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
obj = Data_Make_Struct(cDevice, struct rldev, 0, Lorcon_free, rld);
|
152
|
+
|
153
|
+
rld->context = lorcon_create(intf, dri);
|
154
|
+
|
155
|
+
// Obsolete: XXX
|
156
|
+
// lorcon_set_timeout(rld->context, 100);
|
157
|
+
|
158
|
+
if (rld->context == NULL) {
|
159
|
+
rb_raise(rb_eRuntimeError,
|
160
|
+
"LORCON could not create context");
|
161
|
+
return (Qnil);
|
162
|
+
}
|
163
|
+
|
164
|
+
lorcon_free_driver_list(dri);
|
165
|
+
|
166
|
+
rb_obj_call_init(obj, 0, 0);
|
167
|
+
return(obj);
|
168
|
+
}
|
169
|
+
|
170
|
+
|
171
|
+
static VALUE Lorcon_open_inject(VALUE self) {
|
172
|
+
struct rldev *rld;
|
173
|
+
|
174
|
+
Data_Get_Struct(self, struct rldev, rld);
|
175
|
+
|
176
|
+
if (lorcon_open_inject(rld->context) < 0)
|
177
|
+
return Qfalse;
|
178
|
+
|
179
|
+
return Qtrue;
|
180
|
+
}
|
181
|
+
|
182
|
+
static VALUE Lorcon_open_monitor(VALUE self) {
|
183
|
+
struct rldev *rld;
|
184
|
+
|
185
|
+
Data_Get_Struct(self, struct rldev, rld);
|
186
|
+
|
187
|
+
if (lorcon_open_monitor(rld->context) < 0)
|
188
|
+
return Qfalse;
|
189
|
+
|
190
|
+
return Qtrue;
|
191
|
+
}
|
192
|
+
|
193
|
+
static VALUE Lorcon_open_injmon(VALUE self) {
|
194
|
+
struct rldev *rld;
|
195
|
+
|
196
|
+
Data_Get_Struct(self, struct rldev, rld);
|
197
|
+
|
198
|
+
if (lorcon_open_injmon(rld->context) < 0)
|
199
|
+
return Qfalse;
|
200
|
+
|
201
|
+
return Qtrue;
|
202
|
+
}
|
203
|
+
|
204
|
+
static VALUE Lorcon_get_error(VALUE self) {
|
205
|
+
struct rldev *rld;
|
206
|
+
|
207
|
+
Data_Get_Struct(self, struct rldev, rld);
|
208
|
+
|
209
|
+
return rb_str_new2(lorcon_get_error(rld->context));
|
210
|
+
}
|
211
|
+
|
212
|
+
static VALUE Lorcon_get_capiface(VALUE self) {
|
213
|
+
struct rldev *rld;
|
214
|
+
Data_Get_Struct(self, struct rldev, rld);
|
215
|
+
|
216
|
+
return rb_str_new2(lorcon_get_capiface(rld->context));
|
217
|
+
}
|
218
|
+
|
219
|
+
void Lorcon_packet_free(struct rlpack *rlp) {
|
220
|
+
if (rlp->packet != NULL) {
|
221
|
+
lorcon_packet_free(rlp->packet);
|
222
|
+
rlp->packet = NULL;
|
223
|
+
free(rlp);
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
static VALUE Lorcon_packet_create(int argc, VALUE *argv, VALUE self) {
|
228
|
+
struct rlpack *rlp;
|
229
|
+
VALUE obj;
|
230
|
+
|
231
|
+
obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp);
|
232
|
+
|
233
|
+
rlp->packet = (struct lorcon_packet *) malloc(sizeof(struct lorcon_packet));
|
234
|
+
memset(rlp->packet, 0, sizeof(struct lorcon_packet));
|
235
|
+
|
236
|
+
rlp->bssid = NULL;
|
237
|
+
rlp->dot3 = NULL;
|
238
|
+
rlp->len = 0;
|
239
|
+
rlp->dir = 0;
|
240
|
+
|
241
|
+
rb_obj_call_init(obj, 0, 0);
|
242
|
+
return(obj);
|
243
|
+
}
|
244
|
+
|
245
|
+
static VALUE Lorcon_packet_get_channel(VALUE self) {
|
246
|
+
struct rlpack *rlp;
|
247
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
248
|
+
|
249
|
+
return INT2FIX(rlp->packet->channel);
|
250
|
+
}
|
251
|
+
|
252
|
+
static VALUE Lorcon_packet_set_channel(VALUE self, VALUE channel) {
|
253
|
+
struct rlpack *rlp;
|
254
|
+
|
255
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
256
|
+
|
257
|
+
lorcon_packet_set_channel(rlp->packet, NUM2INT(channel));
|
258
|
+
|
259
|
+
return channel;
|
260
|
+
}
|
261
|
+
|
262
|
+
static VALUE Lorcon_packet_get_dlt(VALUE self) {
|
263
|
+
struct rlpack *rlp;
|
264
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
265
|
+
|
266
|
+
return INT2FIX(rlp->packet->dlt);
|
267
|
+
}
|
268
|
+
|
269
|
+
static VALUE Lorcon_packet_get_bssid(VALUE self) {
|
270
|
+
struct rlpack *rlp;
|
271
|
+
struct lorcon_dot11_extra *extra;
|
272
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
273
|
+
|
274
|
+
if (rlp->packet->extra_info == NULL ||
|
275
|
+
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
276
|
+
return Qnil;
|
277
|
+
|
278
|
+
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
279
|
+
|
280
|
+
if (extra->bssid_mac == NULL)
|
281
|
+
return Qnil;
|
282
|
+
|
283
|
+
return rb_str_new((char *)extra->bssid_mac, 6);
|
284
|
+
}
|
285
|
+
|
286
|
+
static VALUE Lorcon_packet_get_source(VALUE self) {
|
287
|
+
struct rlpack *rlp;
|
288
|
+
struct lorcon_dot11_extra *extra;
|
289
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
290
|
+
|
291
|
+
if (rlp->packet->extra_info == NULL ||
|
292
|
+
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
293
|
+
return Qnil;
|
294
|
+
|
295
|
+
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
296
|
+
|
297
|
+
if (extra->source_mac == NULL)
|
298
|
+
return Qnil;
|
299
|
+
|
300
|
+
return rb_str_new((char *)extra->source_mac, 6);
|
301
|
+
}
|
302
|
+
|
303
|
+
static VALUE Lorcon_packet_get_dest(VALUE self) {
|
304
|
+
struct rlpack *rlp;
|
305
|
+
struct lorcon_dot11_extra *extra;
|
306
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
307
|
+
|
308
|
+
if (rlp->packet->extra_info == NULL ||
|
309
|
+
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
310
|
+
return Qnil;
|
311
|
+
|
312
|
+
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
313
|
+
|
314
|
+
if (extra->dest_mac == NULL)
|
315
|
+
return Qnil;
|
316
|
+
|
317
|
+
return rb_str_new((char *)extra->dest_mac, 6);
|
318
|
+
}
|
319
|
+
|
320
|
+
static VALUE Lorcon_packet_get_rawdata(VALUE self) {
|
321
|
+
struct rlpack *rlp;
|
322
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
323
|
+
|
324
|
+
if (rlp->packet->packet_raw == NULL)
|
325
|
+
return Qnil;
|
326
|
+
|
327
|
+
return rb_str_new((char *)rlp->packet->packet_raw, rlp->packet->length);
|
328
|
+
}
|
329
|
+
|
330
|
+
static VALUE Lorcon_packet_get_headerdata(VALUE self) {
|
331
|
+
struct rlpack *rlp;
|
332
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
333
|
+
|
334
|
+
if (rlp->packet->packet_header == NULL)
|
335
|
+
return Qnil;
|
336
|
+
|
337
|
+
return rb_str_new((char *)rlp->packet->packet_header, rlp->packet->length_header);
|
338
|
+
}
|
339
|
+
|
340
|
+
static VALUE Lorcon_packet_get_data(VALUE self) {
|
341
|
+
struct rlpack *rlp;
|
342
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
343
|
+
|
344
|
+
if (rlp->packet->packet_data == NULL)
|
345
|
+
return Qnil;
|
346
|
+
|
347
|
+
return rb_str_new((char *)rlp->packet->packet_data, rlp->packet->length_data);
|
348
|
+
}
|
349
|
+
|
350
|
+
|
351
|
+
static VALUE Lorcon_packet_getdot3(VALUE self) {
|
352
|
+
struct rlpack *rlp;
|
353
|
+
u_char *pdata;
|
354
|
+
int len;
|
355
|
+
VALUE ret;
|
356
|
+
|
357
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
358
|
+
|
359
|
+
if (rlp->packet->packet_data == NULL)
|
360
|
+
return Qnil;
|
361
|
+
|
362
|
+
len = lorcon_packet_to_dot3(rlp->packet, &pdata);
|
363
|
+
|
364
|
+
ret = rb_str_new((char *)pdata, len);
|
365
|
+
|
366
|
+
free(pdata);
|
367
|
+
|
368
|
+
return ret;
|
369
|
+
}
|
370
|
+
|
371
|
+
static VALUE Lorcon_packet_prepdot3(VALUE self, VALUE dot3) {
|
372
|
+
struct rlpack *rlp;
|
373
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
374
|
+
|
375
|
+
rlp->dot3 = (unsigned char *) RSTRING_PTR(dot3);
|
376
|
+
rlp->len = RSTRING_LEN(dot3);
|
377
|
+
|
378
|
+
return dot3;
|
379
|
+
}
|
380
|
+
|
381
|
+
static VALUE Lorcon_packet_prepbssid(VALUE self, VALUE bssid) {
|
382
|
+
struct rlpack *rlp;
|
383
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
384
|
+
|
385
|
+
rlp->bssid = (unsigned char *)RSTRING_PTR(bssid);
|
386
|
+
|
387
|
+
return bssid;
|
388
|
+
}
|
389
|
+
|
390
|
+
static VALUE Lorcon_packet_prepdir(VALUE self, VALUE dir) {
|
391
|
+
struct rlpack *rlp;
|
392
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
393
|
+
|
394
|
+
rlp->dir = NUM2INT(dir);
|
395
|
+
|
396
|
+
return dir;
|
397
|
+
}
|
398
|
+
|
399
|
+
static VALUE Lorcon_packet_getdir(VALUE self) {
|
400
|
+
struct rlpack *rlp;
|
401
|
+
struct lorcon_dot11_extra *extra;
|
402
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
403
|
+
|
404
|
+
if (rlp->dir != 0)
|
405
|
+
return INT2FIX(rlp->dir);
|
406
|
+
|
407
|
+
if (rlp->packet == NULL)
|
408
|
+
return Qnil;
|
409
|
+
|
410
|
+
if (rlp->packet->extra_info == NULL ||
|
411
|
+
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
412
|
+
return Qnil;
|
413
|
+
|
414
|
+
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
415
|
+
|
416
|
+
if (extra->from_ds && !extra->to_ds)
|
417
|
+
return INT2FIX(LORCON_DOT11_DIR_FROMDS);
|
418
|
+
else if (!extra->from_ds && extra->to_ds)
|
419
|
+
return INT2FIX(LORCON_DOT11_DIR_TODS);
|
420
|
+
else if (!extra->from_ds && !extra->to_ds)
|
421
|
+
return INT2FIX(LORCON_DOT11_DIR_ADHOCDS);
|
422
|
+
else if (extra->from_ds && extra->to_ds)
|
423
|
+
return INT2FIX(LORCON_DOT11_DIR_INTRADS);
|
424
|
+
|
425
|
+
return Qnil;
|
426
|
+
}
|
427
|
+
|
428
|
+
static VALUE Lorcon_packet_get_rawlength(VALUE self) {
|
429
|
+
struct rlpack *rlp;
|
430
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
431
|
+
|
432
|
+
return INT2FIX(rlp->packet->length);
|
433
|
+
}
|
434
|
+
|
435
|
+
static VALUE Lorcon_packet_get_headerlength(VALUE self) {
|
436
|
+
struct rlpack *rlp;
|
437
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
438
|
+
|
439
|
+
return INT2FIX(rlp->packet->length_header);
|
440
|
+
}
|
441
|
+
|
442
|
+
static VALUE Lorcon_packet_get_datalength(VALUE self) {
|
443
|
+
struct rlpack *rlp;
|
444
|
+
Data_Get_Struct(self, struct rlpack, rlp);
|
445
|
+
|
446
|
+
return INT2FIX(rlp->packet->length_data);
|
447
|
+
}
|
448
|
+
|
449
|
+
VALUE new_lorcon_packet(struct lorcon_packet **packet) {
|
450
|
+
struct rlpack *rlp;
|
451
|
+
VALUE obj;
|
452
|
+
|
453
|
+
obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp);
|
454
|
+
|
455
|
+
rlp->packet = *packet;
|
456
|
+
rb_obj_call_init(obj, 0, 0);
|
457
|
+
return(obj);
|
458
|
+
}
|
459
|
+
|
460
|
+
static VALUE Lorcon_inject_packet(VALUE self, VALUE packet) {
|
461
|
+
struct rldev *rld;
|
462
|
+
struct rlpack *rlp;
|
463
|
+
lorcon_packet_t *pack = NULL;
|
464
|
+
int ret;
|
465
|
+
|
466
|
+
if (rb_obj_is_kind_of(packet, cPacket) == 0) {
|
467
|
+
rb_raise(rb_eTypeError, "wrong type expected %s", rb_class2name(cPacket));
|
468
|
+
return Qnil;
|
469
|
+
}
|
470
|
+
|
471
|
+
Data_Get_Struct(self, struct rldev, rld);
|
472
|
+
Data_Get_Struct(packet, struct rlpack, rlp);
|
473
|
+
|
474
|
+
if (rlp->bssid != NULL && rlp->dot3 != NULL) {
|
475
|
+
pack = lorcon_packet_from_dot3(rlp->bssid, rlp->dir, rlp->dot3, rlp->len);
|
476
|
+
ret = lorcon_inject(rld->context, pack);
|
477
|
+
lorcon_packet_free(pack);
|
478
|
+
} else {
|
479
|
+
ret = lorcon_inject(rld->context, rlp->packet);
|
480
|
+
}
|
481
|
+
|
482
|
+
return INT2FIX(ret);
|
483
|
+
}
|
484
|
+
|
485
|
+
static VALUE Lorcon_write_raw(VALUE self, VALUE rpacket) {
|
486
|
+
struct rldev *rld;
|
487
|
+
int ret;
|
488
|
+
|
489
|
+
Data_Get_Struct(self, struct rldev, rld);
|
490
|
+
|
491
|
+
if(TYPE(rpacket) != T_STRING) {
|
492
|
+
rb_raise(rb_eArgError, "packet data must be a string");
|
493
|
+
return Qnil;
|
494
|
+
}
|
495
|
+
|
496
|
+
ret = lorcon_send_bytes(rld->context, RSTRING_LEN(rpacket), (unsigned char *)RSTRING_PTR(rpacket));
|
497
|
+
return INT2FIX(ret);
|
498
|
+
}
|
499
|
+
|
500
|
+
static VALUE Lorcon_set_filter(VALUE self, VALUE filter) {
|
501
|
+
struct rldev *rld;
|
502
|
+
Data_Get_Struct(self, struct rldev, rld);
|
503
|
+
return INT2FIX(lorcon_set_filter(rld->context, RSTRING_PTR(filter)));
|
504
|
+
}
|
505
|
+
|
506
|
+
static VALUE Lorcon_set_channel(VALUE self, VALUE channel) {
|
507
|
+
struct rldev *rld;
|
508
|
+
Data_Get_Struct(self, struct rldev, rld);
|
509
|
+
return INT2FIX(lorcon_set_channel(rld->context, NUM2INT(channel)));
|
510
|
+
}
|
511
|
+
|
512
|
+
static VALUE Lorcon_get_channel(VALUE self) {
|
513
|
+
struct rldev *rld;
|
514
|
+
Data_Get_Struct(self, struct rldev, rld);
|
515
|
+
return INT2FIX(lorcon_get_channel(rld->context));
|
516
|
+
}
|
517
|
+
|
518
|
+
static void rblorcon_pcap_handler(rblorconjob_t *job, struct pcap_pkthdr *hdr, u_char *pkt){
|
519
|
+
job->pkt = (unsigned char *)pkt;
|
520
|
+
job->hdr = *hdr;
|
521
|
+
}
|
522
|
+
|
523
|
+
static VALUE Lorcon_capture_next(VALUE self) {
|
524
|
+
struct rldev *rld;
|
525
|
+
int ret = 0;
|
526
|
+
struct lorcon_packet *packet;
|
527
|
+
unsigned char *raw;
|
528
|
+
pcap_t *pd;
|
529
|
+
rblorconjob_t job;
|
530
|
+
Data_Get_Struct(self, struct rldev, rld);
|
531
|
+
|
532
|
+
pd = lorcon_get_pcap(rld->context);
|
533
|
+
|
534
|
+
#ifdef RUBY_18
|
535
|
+
TRAP_BEG;
|
536
|
+
#endif
|
537
|
+
ret = pcap_dispatch(pd, 1, (pcap_handler) rblorcon_pcap_handler, (u_char *)&job);
|
538
|
+
#ifdef RUBY_18
|
539
|
+
TRAP_END;
|
540
|
+
#endif
|
541
|
+
|
542
|
+
if (ret == 0)
|
543
|
+
return(Qnil);
|
544
|
+
|
545
|
+
if (ret < 0 || job.hdr.caplen <= 0)
|
546
|
+
return INT2FIX(ret);
|
547
|
+
|
548
|
+
raw = malloc(job.hdr.caplen);
|
549
|
+
if(! raw) return Qnil;
|
550
|
+
|
551
|
+
memcpy(raw, job.pkt, job.hdr.caplen);
|
552
|
+
packet = lorcon_packet_from_pcap(rld->context, &job.hdr, raw);
|
553
|
+
lorcon_packet_set_freedata(packet, 1);
|
554
|
+
|
555
|
+
return new_lorcon_packet(&packet);
|
556
|
+
}
|
557
|
+
|
558
|
+
|
559
|
+
static VALUE Lorcon_capture_loop(int argc, VALUE *argv, VALUE self) {
|
560
|
+
struct rldev *rld;
|
561
|
+
int count = 0;
|
562
|
+
int p = 0;
|
563
|
+
VALUE v_cnt;
|
564
|
+
VALUE ret;
|
565
|
+
int fd;
|
566
|
+
|
567
|
+
Data_Get_Struct(self, struct rldev, rld);
|
568
|
+
|
569
|
+
if (rb_scan_args(argc, argv, "01", &v_cnt) >= 1) {
|
570
|
+
count = FIX2INT(v_cnt);
|
571
|
+
} else {
|
572
|
+
count = -1;
|
573
|
+
}
|
574
|
+
|
575
|
+
fd = lorcon_get_selectable_fd(rld->context);
|
576
|
+
if(fd < 0 ) {
|
577
|
+
rb_raise(rb_eRuntimeError,
|
578
|
+
"LORCON context could not provide a pollable descriptor "
|
579
|
+
"and we need one for the threaded dispatch loop");
|
580
|
+
}
|
581
|
+
|
582
|
+
while (p < count || count <= 0) {
|
583
|
+
ret = Lorcon_capture_next(self);
|
584
|
+
if(TYPE(ret) == T_FIXNUM) return(ret);
|
585
|
+
if(ret == Qnil) {
|
586
|
+
rb_thread_wait_fd(fd);
|
587
|
+
} else {
|
588
|
+
rb_yield(ret);
|
589
|
+
p++;
|
590
|
+
}
|
591
|
+
}
|
592
|
+
|
593
|
+
return INT2FIX(p);
|
594
|
+
}
|
595
|
+
|
596
|
+
|
597
|
+
void Init_Lorcon2() {
|
598
|
+
mLorcon = rb_define_module("Lorcon");
|
599
|
+
|
600
|
+
cPacket = rb_define_class_under(mLorcon, "Packet", rb_cObject);
|
601
|
+
|
602
|
+
rb_define_const(cPacket, "LORCON_FROM_DS", INT2NUM(LORCON_DOT11_DIR_FROMDS));
|
603
|
+
rb_define_const(cPacket, "LORCON_TO_DS", INT2NUM(LORCON_DOT11_DIR_TODS));
|
604
|
+
rb_define_const(cPacket, "LORCON_INTRA_DS", INT2NUM(LORCON_DOT11_DIR_INTRADS));
|
605
|
+
rb_define_const(cPacket, "LORCON_ADHOC_DS", INT2NUM(LORCON_DOT11_DIR_ADHOCDS));
|
606
|
+
|
607
|
+
rb_define_singleton_method(cPacket, "new", Lorcon_packet_create, -1);
|
608
|
+
rb_define_method(cPacket, "bssid", Lorcon_packet_get_bssid, 0);
|
609
|
+
rb_define_method(cPacket, "source", Lorcon_packet_get_source, 0);
|
610
|
+
rb_define_method(cPacket, "dest", Lorcon_packet_get_dest, 0);
|
611
|
+
|
612
|
+
rb_define_method(cPacket, "channel", Lorcon_packet_get_channel, 0);
|
613
|
+
rb_define_method(cPacket, "channel=", Lorcon_packet_set_channel, 1);
|
614
|
+
rb_define_method(cPacket, "dlt", Lorcon_packet_get_dlt, 0);
|
615
|
+
|
616
|
+
rb_define_method(cPacket, "rawdata", Lorcon_packet_get_rawdata, 0);
|
617
|
+
rb_define_method(cPacket, "headerdata", Lorcon_packet_get_headerdata, 0);
|
618
|
+
rb_define_method(cPacket, "data", Lorcon_packet_get_data, 0);
|
619
|
+
|
620
|
+
rb_define_method(cPacket, "dot3", Lorcon_packet_getdot3, 0);
|
621
|
+
|
622
|
+
rb_define_method(cPacket, "dot3=", Lorcon_packet_prepdot3, 1);
|
623
|
+
rb_define_method(cPacket, "bssid=", Lorcon_packet_prepbssid, 1);
|
624
|
+
rb_define_method(cPacket, "direction=", Lorcon_packet_prepdir, 1);
|
625
|
+
rb_define_method(cPacket, "direction", Lorcon_packet_getdir, 0);
|
626
|
+
|
627
|
+
rb_define_method(cPacket, "size", Lorcon_packet_get_rawlength, 0);
|
628
|
+
rb_define_method(cPacket, "linesize", Lorcon_packet_get_rawlength, 0);
|
629
|
+
rb_define_method(cPacket, "headersize", Lorcon_packet_get_headerlength, 0);
|
630
|
+
rb_define_method(cPacket, "datasize", Lorcon_packet_get_datalength, 0);
|
631
|
+
|
632
|
+
cDevice = rb_define_class_under(mLorcon, "Device", rb_cObject);
|
633
|
+
rb_define_singleton_method(cDevice, "new", Lorcon_create, -1);
|
634
|
+
rb_define_method(cDevice, "openinject", Lorcon_open_inject, 0);
|
635
|
+
rb_define_method(cDevice, "openmonitor", Lorcon_open_monitor, 0);
|
636
|
+
rb_define_method(cDevice, "openinjmon", Lorcon_open_injmon, 0);
|
637
|
+
rb_define_method(cDevice, "error", Lorcon_get_error, 0);
|
638
|
+
rb_define_method(cDevice, "capiface", Lorcon_get_capiface, 0);
|
639
|
+
|
640
|
+
rb_define_method(cDevice, "filter=", Lorcon_set_filter, 1);
|
641
|
+
rb_define_method(cDevice, "channel=", Lorcon_set_channel, 1);
|
642
|
+
rb_define_method(cDevice, "channel", Lorcon_get_channel, 0);
|
643
|
+
|
644
|
+
rb_define_method(cDevice, "loop", Lorcon_capture_loop, -1);
|
645
|
+
rb_define_method(cDevice, "each", Lorcon_capture_loop, -1);
|
646
|
+
rb_define_method(cDevice, "each_packet", Lorcon_capture_loop, -1);
|
647
|
+
rb_define_method(cDevice, "write", Lorcon_write_raw, 1);
|
648
|
+
rb_define_method(cDevice, "inject", Lorcon_inject_packet, 1);
|
649
|
+
rb_define_module_function(mLorcon, "drivers", Lorcon_list_drivers, 0);
|
650
|
+
rb_define_module_function(mLorcon, "version", Lorcon_get_version, 0);
|
651
|
+
rb_define_module_function(mLorcon, "find_driver", Lorcon_find_driver, 1);
|
652
|
+
rb_define_module_function(mLorcon, "auto_driver", Lorcon_auto_driver, 1);
|
653
|
+
}
|
654
|
+
|
655
|
+
|
data/Lorcon2.h
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#ifndef _MSFLORCON_H
|
2
|
+
#define _MSFLORCON_H
|
3
|
+
|
4
|
+
#include <stdlib.h>
|
5
|
+
#include <errno.h>
|
6
|
+
#include <string.h>
|
7
|
+
#include <stdio.h>
|
8
|
+
#include <sys/socket.h>
|
9
|
+
|
10
|
+
#include <lorcon2/lorcon.h>
|
11
|
+
#include <pcap.h>
|
12
|
+
|
13
|
+
struct rldev {
|
14
|
+
struct lorcon *context;
|
15
|
+
};
|
16
|
+
|
17
|
+
struct rlpack {
|
18
|
+
struct lorcon_packet *packet;
|
19
|
+
|
20
|
+
/* dot3 construction via multiple elements */
|
21
|
+
u_char *bssid, *dot3;
|
22
|
+
int dir, len;
|
23
|
+
};
|
24
|
+
|
25
|
+
|
26
|
+
typedef struct rblorconjob {
|
27
|
+
struct pcap_pkthdr hdr;
|
28
|
+
unsigned char *pkt;
|
29
|
+
} rblorconjob_t;
|
30
|
+
|
31
|
+
#endif
|
data/README
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
This is an experimental interface for lorcon, a 802.11 library
|
2
|
+
developed by Joshua Wright and dragorn. This interface is only
|
3
|
+
available on Linux and with lorcon-supported wireless drivers.
|
4
|
+
|
5
|
+
For more information, please see the lorcon documentation and code:
|
6
|
+
https://github.com/kismetwireless/lorcon/
|
7
|
+
|
8
|
+
To build this extension:
|
9
|
+
|
10
|
+
1) Download, compile, and install lorcon
|
11
|
+
The latest version of lorcon can pulled from SVN:
|
12
|
+
$ git clone https://github.com/kismetwireless/lorcon.git lorcon
|
13
|
+
$ cd lorcon
|
14
|
+
$ ./configure
|
15
|
+
$ make
|
16
|
+
$ sudo make install
|
17
|
+
-- or --
|
18
|
+
$ su
|
19
|
+
# make install
|
20
|
+
# exit
|
21
|
+
$ cd ..
|
22
|
+
|
23
|
+
2) build the ruby extension..
|
24
|
+
$ ruby extconf.rb
|
25
|
+
$ make
|
26
|
+
$ sudo make install
|
27
|
+
-- or --
|
28
|
+
$ su
|
29
|
+
# make install
|
30
|
+
|
31
|
+
|
32
|
+
NOTES:
|
33
|
+
|
34
|
+
if Ubuntu 8.04 (and probably others) bitches about 'mkmf',
|
35
|
+
you need ruby dev package.
|
36
|
+
|
37
|
+
:~/metasploit/external/ruby-lorcon$ ruby extconf.rb
|
38
|
+
extconf.rb:2:in `require': no such file to load -- mkmf (LoadError)
|
39
|
+
from extconf.rb:2
|
40
|
+
|
41
|
+
:~/metasploit/external/ruby-lorcon$ sudo apt-get install ruby1.8-dev
|
data/extconf.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'mkmf'
|
3
|
+
|
4
|
+
|
5
|
+
$CFLAGS += " -I/usr/include/lorcon2"
|
6
|
+
|
7
|
+
if ( RUBY_VERSION =~ /^(1\.9|2\.0)/ )
|
8
|
+
$CFLAGS += " -DRUBY_19"
|
9
|
+
end
|
10
|
+
|
11
|
+
if find_library("orcon2", "lorcon_list_drivers", "lorcon2/lorcon.h") and find_library("pcap","pcap_dispatch","pcap/phap.h")
|
12
|
+
create_makefile("Lorcon2")
|
13
|
+
else
|
14
|
+
puts "Error: the lorcon2 library was not found, please see the README"
|
15
|
+
end
|
16
|
+
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-lorcon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- dragorn
|
8
|
+
- Joshua Wright
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-12-13 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: This interface is only available on Linux and with lorcon-supported wireless
|
15
|
+
drivers.
|
16
|
+
email:
|
17
|
+
- msfdev@metasploit.com
|
18
|
+
executables: []
|
19
|
+
extensions:
|
20
|
+
- extconf.rb
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- Lorcon2.c
|
24
|
+
- Lorcon2.h
|
25
|
+
- README
|
26
|
+
- extconf.rb
|
27
|
+
homepage: https://github.com/kismetwireless/lorcon/tree/master/ruby-lorcon
|
28
|
+
licenses:
|
29
|
+
- GPL-2.0
|
30
|
+
metadata:
|
31
|
+
source_code_uri: https://github.com/kismetwireless/lorcon.git
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.5.1
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: This is an experimental interface for lorcon.
|
52
|
+
test_files: []
|