1extern crate byteorder;
2use std::io::{Cursor, Read, Write};
3
4use crate::custom_module::manycastr::Address;
5use byteorder::{NetworkEndian, ReadBytesExt, WriteBytesExt};
6use prost::bytes::Buf;
7
8pub(crate) mod packet;
9
10#[derive(Debug)]
12pub struct IPv4Packet {
13 pub length: u16, pub ttl: u8, pub src: u32, pub dst: u32, pub payload: PacketPayload, }
19
20impl From<&[u8]> for IPv4Packet {
22 fn from(data: &[u8]) -> Self {
23 let mut cursor = Cursor::new(data);
24 let header_length: usize = ((cursor.read_u8().unwrap() & 0xF) * 4).into(); cursor.set_position(8); let ttl = cursor.read_u8().unwrap();
29 let packet_type = cursor.read_u8().unwrap(); cursor.set_position(12); let src = cursor.read_u32::<NetworkEndian>().unwrap(); let dst = cursor.read_u32::<NetworkEndian>().unwrap(); if header_length > data.len() {
36 return IPv4Packet {
37 length: header_length as u16,
38 ttl,
39 src,
40 dst,
41 payload: PacketPayload::Unimplemented,
42 };
43 }
44
45 let payload_bytes = &cursor.into_inner()[header_length..];
46 let payload = match packet_type {
47 1 => {
48 if payload_bytes.len() < 8 {
49 PacketPayload::Unimplemented
50 } else {
51 PacketPayload::Icmp {
52 value: ICMPPacket::from(payload_bytes),
53 }
54 }
55 }
56 17 => {
57 if payload_bytes.len() < 8 {
58 PacketPayload::Unimplemented
59 } else {
60 PacketPayload::Udp {
61 value: UDPPacket::from(payload_bytes),
62 }
63 }
64 }
65 6 => {
66 if payload_bytes.len() < 20 {
67 PacketPayload::Unimplemented
68 } else {
69 PacketPayload::Tcp {
70 value: TCPPacket::from(payload_bytes),
71 }
72 }
73 }
74 _ => PacketPayload::Unimplemented,
75 };
76
77 IPv4Packet {
78 length: header_length as u16,
79 ttl,
80 src,
81 dst,
82 payload,
83 }
84 }
85}
86
87impl From<&IPv4Packet> for Vec<u8> {
89 fn from(packet: &IPv4Packet) -> Self {
90 let (payload_type, payload) = match &packet.payload {
91 PacketPayload::Icmp { value } => (1, value.into()),
92 PacketPayload::Udp { value } => (17, value.into()),
93 PacketPayload::Tcp { value } => (6, value.into()),
94 PacketPayload::Unimplemented => (0, vec![]),
95 };
96
97 let mut wtr = vec![];
98 wtr.write_u8(0x45)
99 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u8(0x00)
101 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u16::<NetworkEndian>(packet.length)
103 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u16::<NetworkEndian>(0x3a7d)
105 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u16::<NetworkEndian>(0x0000)
107 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u8(packet.ttl)
109 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u8(payload_type)
111 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u16::<NetworkEndian>(0x0000)
113 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u32::<NetworkEndian>(packet.src)
115 .expect("Unable to write to byte buffer for IPv4 packet"); wtr.write_u32::<NetworkEndian>(packet.dst)
117 .expect("Unable to write to byte buffer for IPv4 packet"); let checksum = ICMPPacket::calc_checksum(&wtr); let mut cursor = Cursor::new(wtr);
122 cursor.set_position(10); cursor.write_u16::<NetworkEndian>(checksum).unwrap();
124
125 cursor.set_position(20); cursor
128 .write_all(&payload)
129 .expect("Unable to write to byte buffer for IPv4 packet"); cursor.into_inner()
132 }
133}
134
135#[derive(Debug)]
137pub struct IPv6Packet {
138 pub payload_length: u16, pub next_header: u8, pub hop_limit: u8, pub src: u128, pub dst: u128, pub payload: PacketPayload, }
148
149impl From<&[u8]> for IPv6Packet {
151 fn from(data: &[u8]) -> Self {
152 let mut cursor = Cursor::new(data);
153 let _version_traffic_flow: u32 = cursor.read_u32::<NetworkEndian>().unwrap();
154 let payload_length = cursor.read_u16::<NetworkEndian>().unwrap();
155 let next_header = cursor.read_u8().unwrap();
156 let hop_limit = cursor.read_u8().unwrap();
157
158 let src = cursor.read_u128::<NetworkEndian>().unwrap(); let dst = cursor.read_u128::<NetworkEndian>().unwrap(); let payload = &cursor.into_inner()[40..]; let payload = match next_header {
164 58 => {
165 PacketPayload::Icmp {
167 value: ICMPPacket::from(payload),
168 }
169 }
170 17 => {
171 if payload.len() < 8 {
173 PacketPayload::Unimplemented
174 } else {
175 PacketPayload::Udp {
176 value: UDPPacket::from(payload),
177 }
178 }
179 }
180 6 => {
181 if payload.len() < 20 {
183 PacketPayload::Unimplemented
184 } else {
185 PacketPayload::Tcp {
186 value: TCPPacket::from(payload),
187 }
188 }
189 }
190 _ => PacketPayload::Unimplemented, };
192
193 IPv6Packet {
194 payload_length,
198 next_header,
199 hop_limit,
200 src,
201 dst,
202 payload,
203 }
204 }
205}
206
207impl From<&IPv6Packet> for Vec<u8> {
209 fn from(packet: &IPv6Packet) -> Self {
210 let mut wtr = vec![];
211 wtr.write_u32::<NetworkEndian>(0x60003a7d)
213 .expect("Unable to write to byte buffer for IPv6Packet");
214 wtr.write_u16::<NetworkEndian>(packet.payload_length)
215 .expect("Unable to write to byte buffer for IPv6Packet");
216 wtr.write_u8(packet.next_header)
217 .expect("Unable to write to byte buffer for IPv6Packet");
218 wtr.write_u8(packet.hop_limit)
219 .expect("Unable to write to byte buffer for IPv6Packet");
220 wtr.write_u128::<NetworkEndian>(packet.src)
221 .expect("Unable to write source address to byte buffer for IPv6Packet");
222 wtr.write_u128::<NetworkEndian>(packet.dst)
223 .expect("Unable to write destination address to byte buffer for IPv6Packet");
224
225 let payload = match &packet.payload {
226 PacketPayload::Icmp { value } => value.into(),
227 PacketPayload::Udp { value } => value.into(),
228 PacketPayload::Tcp { value } => value.into(),
229 PacketPayload::Unimplemented => vec![],
230 };
231
232 wtr.write_all(&payload)
233 .expect("Unable to write payload to byte buffer for IPv6Packet");
234
235 wtr
236 }
237}
238
239#[derive(Debug)]
241pub enum PacketPayload {
242 Icmp { value: ICMPPacket },
243 Udp { value: UDPPacket },
244 Tcp { value: TCPPacket },
245 Unimplemented,
246}
247
248impl From<PacketPayload> for Vec<u8> {
250 fn from(payload: PacketPayload) -> Self {
251 match payload {
252 PacketPayload::Icmp { value } => (&value).into(),
253 PacketPayload::Udp { value } => (&value).into(),
254 PacketPayload::Tcp { value } => (&value).into(),
255 PacketPayload::Unimplemented => vec![],
256 }
257 }
258}
259
260#[derive(Debug)]
262pub struct PseudoHeaderV4 {
263 pub src: u32,
264 pub dst: u32,
265 pub protocol: u8,
266 pub length: u16,
267}
268
269impl From<&PseudoHeaderV4> for Vec<u8> {
271 fn from(header: &PseudoHeaderV4) -> Self {
272 let mut wtr = vec![];
273 wtr.write_u32::<NetworkEndian>(header.src)
274 .expect("Unable to write to byte buffer for PseudoHeader");
275 wtr.write_u32::<NetworkEndian>(header.dst)
276 .expect("Unable to write to byte buffer for PseudoHeader");
277 wtr.write_u8(0) .expect("Unable to write to byte buffer for PseudoHeader");
279 wtr.write_u8(header.protocol)
280 .expect("Unable to write to byte buffer for PseudoHeader");
281 wtr.write_u16::<NetworkEndian>(header.length)
282 .expect("Unable to write to byte buffer for PseudoHeader");
283
284 wtr
285 }
286}
287
288#[derive(Debug)]
290pub struct PseudoHeaderV6 {
291 pub src: u128,
292 pub dst: u128,
293 pub upper_layer_packet_length: u32,
294 pub next_header: u8,
295}
296
297impl From<&PseudoHeaderV6> for Vec<u8> {
299 fn from(header: &PseudoHeaderV6) -> Self {
300 let mut wtr = vec![];
301 wtr.write_u128::<NetworkEndian>(header.src)
302 .expect("Unable to write to byte buffer for PseudoHeader");
303 wtr.write_u128::<NetworkEndian>(header.dst)
304 .expect("Unable to write to byte buffer for PseudoHeader");
305 wtr.write_u32::<NetworkEndian>(header.upper_layer_packet_length)
306 .expect("Unable to write to byte buffer for PseudoHeader");
307 wtr.write_u24::<NetworkEndian>(0) .expect("Unable to write to byte buffer for PseudoHeader");
309 wtr.write_u8(header.next_header)
310 .expect("Unable to write to byte buffer for PseudoHeader");
311
312 wtr
313 }
314}
315
316#[derive(Debug)]
318pub enum PseudoHeader {
319 V4(PseudoHeaderV4),
320 V6(PseudoHeaderV6),
321}
322
323impl PseudoHeader {
324 pub fn new(src_addr: &Address, dst_addr: &Address, protocol: u8, packet_length: u32) -> Self {
326 if src_addr.is_v6() {
327 Self::V6(PseudoHeaderV6 {
328 src: src_addr.get_v6(),
329 dst: dst_addr.get_v6(),
330 upper_layer_packet_length: packet_length, next_header: protocol,
332 })
333 } else {
334 Self::V4(PseudoHeaderV4 {
335 src: src_addr.get_v4(),
336 dst: dst_addr.get_v4(),
337 protocol,
338 length: packet_length as u16, })
340 }
341 }
342}
343
344impl From<&PseudoHeader> for Vec<u8> {
346 fn from(header: &PseudoHeader) -> Self {
347 match header {
348 PseudoHeader::V4(header) => header.into(),
349 PseudoHeader::V6(header) => header.into(),
350 }
351 }
352}
353
354pub fn calculate_checksum(buffer: &[u8], pseudo_header: &PseudoHeader) -> u16 {
362 let mut sum = 0u32;
363 let mut packet: Vec<u8> = pseudo_header.into();
364 packet.extend_from_slice(buffer);
365
366 let packet_len = packet.len();
368 for chunk in packet.chunks_exact(2) {
369 let word = u16::from_be_bytes([chunk[0], chunk[1]]);
370 sum += u32::from(word);
371 }
372
373 if !packet_len.is_multiple_of(2) {
375 sum += u32::from(packet[packet_len - 1]) << 8;
376 }
377
378 while (sum >> 16) != 0 {
380 sum = (sum & 0xffff) + (sum >> 16);
381 }
382
383 !(sum as u16)
385}
386
387#[derive(Debug)]
389pub struct ICMPPacket {
390 pub icmp_type: u8,
391 pub code: u8,
392 pub checksum: u16,
393 pub identifier: u16,
394 pub sequence_number: u16,
395 pub body: Vec<u8>,
396}
397
398impl From<&[u8]> for ICMPPacket {
400 fn from(data: &[u8]) -> Self {
401 let mut data = Cursor::new(data);
402 ICMPPacket {
403 icmp_type: data.read_u8().unwrap(),
404 code: data.read_u8().unwrap(),
405 checksum: data.read_u16::<NetworkEndian>().unwrap(),
406 identifier: data.read_u16::<NetworkEndian>().unwrap(),
407 sequence_number: data.read_u16::<NetworkEndian>().unwrap(),
408 body: data.into_inner()[8..].to_vec(),
409 }
410 }
411}
412
413impl From<&ICMPPacket> for Vec<u8> {
415 fn from(packet: &ICMPPacket) -> Self {
416 let mut wtr = vec![];
417 wtr.write_u8(packet.icmp_type)
418 .expect("Unable to write to byte buffer for ICMP packet");
419 wtr.write_u8(packet.code)
420 .expect("Unable to write to byte buffer for ICMP packet");
421 wtr.write_u16::<NetworkEndian>(packet.checksum)
422 .expect("Unable to write to byte buffer for ICMP packet");
423 wtr.write_u16::<NetworkEndian>(packet.identifier)
424 .expect("Unable to write to byte buffer for ICMP packet");
425 wtr.write_u16::<NetworkEndian>(packet.sequence_number)
426 .expect("Unable to write to byte buffer for ICMP packet");
427 wtr.write_all(&packet.body)
428 .expect("Unable to write to byte buffer for ICMP packet");
429 wtr
430 }
431}
432
433impl ICMPPacket {
434 pub fn echo_request(
452 identifier: u16,
453 sequence_number: u16,
454 body: Vec<u8>,
455 src: u32,
456 dst: u32,
457 ttl: u8,
458 info_url: &str,
459 ) -> Vec<u8> {
460 let body_len = body.len() as u16;
461 let mut packet = ICMPPacket {
462 icmp_type: 8,
463 code: 0,
464 checksum: 0,
465 identifier,
466 sequence_number,
467 body,
468 };
469
470 let mut icmp_bytes: Vec<u8> = (&packet).into();
472 icmp_bytes.extend(info_url.bytes());
473 packet.checksum = ICMPPacket::calc_checksum(&icmp_bytes);
474
475 let v4_packet = IPv4Packet {
476 length: 20 + 8 + body_len + info_url.len() as u16,
477 ttl,
478 src,
479 dst,
480 payload: PacketPayload::Icmp { value: packet },
481 };
482
483 let mut bytes: Vec<u8> = (&v4_packet).into();
484 bytes.extend(info_url.bytes());
485
486 bytes
487 }
488
489 pub fn echo_request_v6(
507 identifier: u16,
508 sequence_number: u16,
509 body: Vec<u8>,
510 src: u128,
511 dst: u128,
512 hop_limit: u8,
513 info_url: &str,
514 ) -> Vec<u8> {
515 let body_len = body.len() as u16;
516 let mut packet = ICMPPacket {
517 icmp_type: 128,
518 code: 0,
519 checksum: 0,
520 identifier,
521 sequence_number,
522 body,
523 };
524 let icmp_bytes: Vec<u8> = (&packet).into();
525
526 let mut psuedo_header: Vec<u8> = Vec::new();
528 psuedo_header
529 .write_u128::<NetworkEndian>(src)
530 .expect("Unable to write to byte buffer for PseudoHeader");
531 psuedo_header
532 .write_u128::<NetworkEndian>(dst)
533 .expect("Unable to write to byte buffer for PseudoHeader");
534 psuedo_header
535 .write_u32::<NetworkEndian>((8 + body_len + info_url.len() as u16) as u32) .expect("Unable to write to byte buffer for PseudoHeader"); psuedo_header.write_u8(0).unwrap(); psuedo_header.write_u8(0).unwrap(); psuedo_header.write_u8(0).unwrap(); psuedo_header.write_u8(58).unwrap(); psuedo_header.extend(icmp_bytes); psuedo_header.extend(info_url.bytes()); packet.checksum = ICMPPacket::calc_checksum(psuedo_header.as_slice()); let v6_packet = IPv6Packet {
546 payload_length: 8 + body_len + info_url.len() as u16, next_header: 58, hop_limit,
549 src,
550 dst,
551 payload: PacketPayload::Icmp { value: packet },
552 };
553
554 let mut bytes: Vec<u8> = (&v6_packet).into();
555 bytes.extend(info_url.bytes());
556
557 bytes
558 }
559
560 fn calc_checksum(buffer: &[u8]) -> u16 {
565 let mut cursor = Cursor::new(buffer);
566 let mut sum: u32 = 0;
567 while let Ok(word) = cursor.read_u16::<NetworkEndian>() {
568 sum += u32::from(word);
570 }
571 if let Ok(byte) = cursor.read_u8() {
572 sum += u32::from(byte);
574 }
575 while sum >> 16 > 0 {
576 sum = (sum & 0xffff) + (sum >> 16);
577 }
578 !sum as u16
579 }
580}
581
582#[derive(Debug)]
584pub struct UDPPacket {
585 pub sport: u16,
586 pub dport: u16,
587 pub length: u16,
588 pub checksum: u16,
589 pub body: Vec<u8>,
590}
591
592impl From<&[u8]> for UDPPacket {
594 fn from(data: &[u8]) -> Self {
595 let mut data = Cursor::new(data);
596 UDPPacket {
597 sport: data.read_u16::<NetworkEndian>().unwrap(),
598 dport: data.read_u16::<NetworkEndian>().unwrap(),
599 length: data.read_u16::<NetworkEndian>().unwrap(),
600 checksum: data.read_u16::<NetworkEndian>().unwrap(),
601 body: data.into_inner()[8..].to_vec(),
602 }
603 }
604}
605
606impl From<&UDPPacket> for Vec<u8> {
608 fn from(packet: &UDPPacket) -> Self {
609 let mut wtr = vec![];
610 wtr.write_u16::<NetworkEndian>(packet.sport)
611 .expect("Unable to write to byte buffer for UDP packet");
612 wtr.write_u16::<NetworkEndian>(packet.dport)
613 .expect("Unable to write to byte buffer for UDP packet");
614 wtr.write_u16::<NetworkEndian>(packet.length)
615 .expect("Unable to write to byte buffer for UDP packet");
616 wtr.write_u16::<NetworkEndian>(packet.checksum)
617 .expect("Unable to write to byte buffer for UDP packet");
618 wtr.write_all(&packet.body)
619 .expect("Unable to write to byte buffer for UDP packet");
620
621 wtr
622 }
623}
624
625#[allow(dead_code)]
627#[derive(Debug)]
628pub struct DNSRecord {
629 pub transaction_id: u16,
630 pub flags: u16,
631 pub questions: u16,
632 pub answer: u16,
633 pub authority: u16,
634 pub additional: u16,
635 pub domain: String,
636 pub record_type: u16,
637 pub class: u16,
638 pub body: Vec<u8>, }
640
641#[allow(dead_code)]
643#[derive(Debug)]
644pub struct DNSAnswer {
645 pub domain: String,
646 pub record_type: u16,
647 pub class: u16,
648 pub ttl: u32,
649 pub data_length: u16,
650 pub data: Vec<u8>,
651}
652
653#[allow(dead_code)]
655#[derive(Debug)]
656pub struct TXTRecord {
657 pub txt_length: u8,
658 pub txt: String,
659}
660
661fn read_dns_name(data: &mut Cursor<&[u8]>) -> String {
664 let mut result = String::new();
665 loop {
666 if !data.has_remaining() {
667 break;
668 }
669 let label_len = data.read_u8().unwrap();
670 if label_len == 0 {
672 break;
673 }
674 if label_len & 0xC0 == 0xC0 {
676 let offset = ((label_len as u16 & 0x3F) << 8) | data.read_u8().unwrap() as u16;
678 data.set_position(offset as u64);
679 result.push_str(&read_dns_name(data));
680 break;
681 }
682 let mut label_bytes = vec![0; label_len as usize];
684
685 match data.read_exact(&mut label_bytes) {
686 Ok(()) => {}
687 Err(_) => {
688 return "Invalid domain name".to_string();
689 }
690 }
691
692 let label = String::from_utf8_lossy(&label_bytes).to_string();
693 result.push_str(&label);
694 result.push('.');
695 }
696 if result.ends_with('.') {
698 result.pop();
699 }
700 result
701}
702
703impl From<&[u8]> for DNSRecord {
705 fn from(data: &[u8]) -> Self {
706 let mut data = Cursor::new(data);
707
708 let transaction_id = data.read_u16::<NetworkEndian>().unwrap();
709 let flags = data.read_u16::<NetworkEndian>().unwrap();
710 let questions = data.read_u16::<NetworkEndian>().unwrap();
711 let answer = data.read_u16::<NetworkEndian>().unwrap();
712 let authority = data.read_u16::<NetworkEndian>().unwrap();
713 let additional = data.read_u16::<NetworkEndian>().unwrap();
714 let domain = read_dns_name(&mut data);
715
716 let (record_type, class, body) = if data.remaining() >= 4 {
717 let record_type = data.read_u16::<NetworkEndian>().unwrap();
718 let class = data.read_u16::<NetworkEndian>().unwrap();
719 let body = data.clone().into_inner()[data.position() as usize..].to_vec();
720 (record_type, class, body)
721 } else {
722 let record_type = 0;
723 let class = 0;
724 let body = vec![];
725 (record_type, class, body)
726 };
727
728 DNSRecord {
729 transaction_id,
730 flags,
731 questions,
732 answer,
733 authority,
734 additional,
735 domain,
736 record_type,
737 class,
738 body,
739 }
740 }
741}
742
743impl From<&[u8]> for DNSAnswer {
745 fn from(data: &[u8]) -> Self {
746 let mut data = Cursor::new(data);
747
748 if data.remaining() < 10 {
750 return DNSAnswer {
751 domain: "Invalid DNS record".to_string(),
752 record_type: 0,
753 class: 0,
754 ttl: 0,
755 data_length: 0,
756 data: vec![],
757 };
758 }
759
760 DNSAnswer {
761 domain: data.read_u16::<NetworkEndian>().unwrap().to_string(), record_type: data.read_u16::<NetworkEndian>().unwrap(),
763 class: data.read_u16::<NetworkEndian>().unwrap(),
764 ttl: data.read_u32::<NetworkEndian>().unwrap(),
765 data_length: data.read_u16::<NetworkEndian>().unwrap(),
766 data: data.clone().into_inner()[data.position() as usize..].to_vec(),
767 }
768 }
769}
770
771impl From<&[u8]> for TXTRecord {
773 fn from(data: &[u8]) -> Self {
774 let mut data = Cursor::new(data);
775 if data.remaining() < 1 {
777 return TXTRecord {
778 txt_length: 0,
779 txt: "Invalid TXT record".to_string(),
780 };
781 }
782
783 let txt_length = data.read_u8().unwrap();
784
785 if txt_length as usize > data.remaining() {
787 return TXTRecord {
788 txt_length,
789 txt: "Invalid TXT record".to_string(),
790 };
791 }
792
793 TXTRecord {
794 txt_length,
795 txt: String::from_utf8_lossy(&data.into_inner()[1..(1 + txt_length as u64) as usize])
797 .to_string(),
798 }
799 }
800}
801
802impl UDPPacket {
803 pub fn dns_request(
806 src: &Address,
807 dst: &Address,
808 sport: u16,
809 domain_name: &str,
810 tx_time: u64,
811 tx_id: u32,
812 ttl: u8,
813 ) -> Vec<u8> {
814 let dns_packet =
815 Self::create_a_record_request(domain_name, tx_time, src, dst, tx_id, sport);
816 let udp_length = (8 + dns_packet.len()) as u16;
817
818 let mut udp_packet = Self {
819 sport,
820 dport: 53u16, length: udp_length,
822 checksum: 0,
823 body: dns_packet,
824 };
825
826 let udp_bytes: Vec<u8> = (&udp_packet).into();
827
828 let pseudo_header = PseudoHeader::new(
829 src,
830 dst,
831 17, udp_length as u32,
833 );
834 udp_packet.checksum = calculate_checksum(&udp_bytes, &pseudo_header);
835
836 if src.is_v6() {
837 (&IPv6Packet {
838 payload_length: udp_length,
839 next_header: 17, hop_limit: ttl,
841 src: src.get_v6(),
842 dst: dst.get_v6(),
843 payload: PacketPayload::Udp { value: udp_packet },
844 })
845 .into()
846 } else {
847 (&IPv4Packet {
848 length: 20 + udp_length,
849 ttl,
850 src: src.get_v4(),
851 dst: dst.get_v4(),
852 payload: PacketPayload::Udp { value: udp_packet },
853 })
854 .into()
855 }
856 }
857
858 fn create_a_record_request(
860 domain_name: &str,
861 tx_time: u64,
862 src: &Address,
863 dst: &Address,
864 tx_id: u32,
865 sport: u16,
866 ) -> Vec<u8> {
867 let subdomain = if src.is_v6() {
871 format!(
872 "{}.{}.{}.{}.{}.{}",
873 tx_time,
874 src.get_v6(),
875 dst.get_v6(),
876 tx_id,
877 sport,
878 domain_name
879 )
880 } else {
881 format!(
882 "{}.{}.{}.{}.{}.{}",
883 tx_time,
884 src.get_v4(),
885 dst.get_v4(),
886 tx_id,
887 sport,
888 domain_name
889 )
890 };
891 let mut dns_body: Vec<u8> = Vec::new();
892
893 dns_body
895 .write_u16::<byteorder::BigEndian>(tx_id as u16)
896 .unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0100).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0001).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0000).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0000).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0000).unwrap(); for label in subdomain.split('.') {
905 dns_body.push(label.len() as u8);
906 dns_body.write_all(label.as_bytes()).unwrap();
907 }
908 dns_body.push(0); dns_body.write_u16::<byteorder::BigEndian>(0x0001).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0001).unwrap(); dns_body
913 }
914
915 pub fn chaos_request(
917 src: &Address,
918 dst: &Address,
919 sport: u16,
920 tx: u32,
921 chaos: &str,
922 ) -> Vec<u8> {
923 let dns_body = Self::create_chaos_request(tx, chaos);
924 let udp_length = 8 + dns_body.len() as u32;
925
926 let mut udp_packet = Self {
927 sport,
928 dport: 53u16,
929 length: udp_length as u16,
930 checksum: 0,
931 body: dns_body,
932 };
933
934 let udp_bytes: Vec<u8> = (&udp_packet).into();
935
936 let pseudo_header = PseudoHeader::new(
937 src, dst, 17, udp_length,
939 );
940
941 udp_packet.checksum = calculate_checksum(&udp_bytes, &pseudo_header);
942
943 if src.is_v6() {
944 let v6_packet = IPv6Packet {
946 payload_length: udp_length as u16,
947 next_header: 17, hop_limit: 255,
949 src: src.get_v6(),
950 dst: dst.get_v6(),
951 payload: PacketPayload::Udp { value: udp_packet },
952 };
953 (&v6_packet).into()
954 } else {
955 let v4_packet = IPv4Packet {
957 length: 20 + udp_length as u16,
958 ttl: 255,
959 src: src.get_v4(),
960 dst: dst.get_v4(),
961 payload: PacketPayload::Udp { value: udp_packet },
962 };
963 (&v4_packet).into()
964 }
965 }
966
967 fn create_chaos_request(tx_id: u32, chaos: &str) -> Vec<u8> {
969 let mut dns_body: Vec<u8> = Vec::new();
970
971 dns_body.write_u32::<byteorder::BigEndian>(tx_id).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0100).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0001).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0000).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0000).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0000).unwrap(); for label in chaos.split('.') {
981 dns_body.push(label.len() as u8);
982 dns_body.write_all(label.as_bytes()).unwrap();
983 }
984 dns_body.push(0); dns_body.write_u16::<byteorder::BigEndian>(0x0010).unwrap(); dns_body.write_u16::<byteorder::BigEndian>(0x0003).unwrap(); dns_body
989 }
990}
991
992#[allow(dead_code)]
995pub fn get_domain_bytes_length(domain: &str) -> u32 {
996 if domain == "." {
997 return 1;
998 }
999 let mut length = 1; for label in domain.split('.') {
1001 length += label.len() as u32 + 1; }
1003 length
1004}
1005
1006#[derive(Debug)]
1008pub struct TCPPacket {
1009 pub sport: u16,
1010 pub dport: u16,
1011 pub seq: u32,
1012 pub ack: u32,
1013 pub offset: u8,
1015 pub flags: u8,
1016 pub window_size: u16,
1017 pub checksum: u16,
1018 pub pointer: u16,
1019 pub body: Vec<u8>,
1020}
1021
1022impl From<&[u8]> for TCPPacket {
1024 fn from(data: &[u8]) -> Self {
1025 let mut data = Cursor::new(data);
1026 TCPPacket {
1027 sport: data.read_u16::<NetworkEndian>().unwrap(),
1028 dport: data.read_u16::<NetworkEndian>().unwrap(),
1029 seq: data.read_u32::<NetworkEndian>().unwrap(),
1030 ack: data.read_u32::<NetworkEndian>().unwrap(),
1031 offset: data.read_u8().unwrap(),
1032 flags: data.read_u8().unwrap(),
1033 window_size: data.read_u16::<NetworkEndian>().unwrap(),
1034 checksum: data.read_u16::<NetworkEndian>().unwrap(),
1035 pointer: data.read_u16::<NetworkEndian>().unwrap(),
1036 body: data.into_inner()[8..].to_vec(),
1037 }
1038 }
1039}
1040
1041impl From<&TCPPacket> for Vec<u8> {
1042 fn from(packet: &TCPPacket) -> Self {
1043 let mut wtr = vec![];
1044
1045 wtr.write_u16::<NetworkEndian>(packet.sport)
1046 .expect("Unable to write to byte buffer for TCP packet");
1047 wtr.write_u16::<NetworkEndian>(packet.dport)
1048 .expect("Unable to write to byte buffer for TCP packet");
1049 wtr.write_u32::<NetworkEndian>(packet.seq)
1050 .expect("Unable to write to byte buffer for TCP packet");
1051 wtr.write_u32::<NetworkEndian>(packet.ack)
1052 .expect("Unable to write to byte buffer for TCP packet");
1053 wtr.write_u8(packet.offset)
1054 .expect("Unable to write to byte buffer for TCP packet");
1055 wtr.write_u8(packet.flags)
1056 .expect("Unable to write to byte buffer for TCP packet");
1057 wtr.write_u16::<NetworkEndian>(packet.window_size)
1058 .expect("Unable to write to byte buffer for TCP packet");
1059 wtr.write_u16::<NetworkEndian>(packet.checksum)
1060 .expect("Unable to write to byte buffer for TCP packet");
1061 wtr.write_u16::<NetworkEndian>(packet.pointer)
1062 .expect("Unable to write to byte buffer for TCP packet");
1063 wtr.write_all(&packet.body)
1064 .expect("Unable to write to byte buffer for TCP packet");
1065
1066 wtr
1067 }
1068}
1069
1070impl TCPPacket {
1071 pub fn tcp_syn_ack(
1073 src: &Address,
1074 dst: &Address,
1075 sport: u16,
1076 dport: u16,
1077 ack: u32,
1078 ttl: u8,
1079 info_url: &str,
1080 ) -> Vec<u8> {
1081 let mut packet = Self {
1082 sport,
1083 dport,
1084 seq: 0, ack,
1086 offset: 0b01010000, flags: 0b00010010, checksum: 0,
1089 pointer: 0,
1090 body: info_url.bytes().collect(),
1091 window_size: 0,
1092 };
1093
1094 let bytes: Vec<u8> = (&packet).into();
1096
1097 let pseudo_header = PseudoHeader::new(
1098 src,
1099 dst,
1100 6, bytes.len() as u32, );
1103 packet.checksum = calculate_checksum(&bytes, &pseudo_header);
1104
1105 if src.is_v6() {
1106 let v6_packet = IPv6Packet {
1108 payload_length: bytes.len() as u16,
1109 next_header: 6, hop_limit: ttl,
1111 src: src.get_v6(),
1112 dst: dst.get_v6(),
1113 payload: PacketPayload::Tcp { value: packet },
1114 };
1115 (&v6_packet).into()
1116 } else {
1117 let v4_packet = IPv4Packet {
1119 length: 20 + bytes.len() as u16,
1120 ttl,
1121 src: src.get_v4(),
1122 dst: dst.get_v4(),
1123 payload: PacketPayload::Tcp { value: packet },
1124 };
1125
1126 (&v4_packet).into()
1127 }
1128 }
1129}