diff options
author | Ryan Schanzenbacher <ryan@rschanz.org> | 2023-03-08 16:26:08 -0500 |
---|---|---|
committer | Ryan Schanzenbacher <ryan@rschanz.org> | 2023-03-08 16:26:08 -0500 |
commit | e75179f41c5d50dd62c60f572182b8178ed03e94 (patch) | |
tree | 5be10592f60b0fcae929d2e81f88db76084f9a12 | |
parent | ccaa1b97dd76c8f39f3126f554ffe5f247da9963 (diff) |
Added new ping trigger programs
Two executables along with the C code exist:
- ping3.c - Source code
- ping3 - Linux executable
- ping_send - FreeBSD executable (for pfSense)
-rwxr-xr-x | ping3 | bin | 0 -> 22704 bytes | |||
-rw-r--r-- | ping3.c | 110 | ||||
-rw-r--r-- | ping_send | bin | 0 -> 6113864 bytes |
3 files changed, 110 insertions, 0 deletions
Binary files differ | |||
@@ -0,0 +1,110 @@ | |||
1 | #include <stdio.h> | ||
2 | #include <stdlib.h> | ||
3 | #include <unistd.h> | ||
4 | #include <sys/types.h> | ||
5 | #include <sys/socket.h> | ||
6 | #include <netdb.h> | ||
7 | #include <netinet/in.h> | ||
8 | #include <netinet/in_systm.h> | ||
9 | #include <netinet/ip.h> | ||
10 | #include <netinet/ip_icmp.h> | ||
11 | #include <string.h> | ||
12 | #include <arpa/inet.h> | ||
13 | #include <sys/select.h> | ||
14 | |||
15 | unsigned short cksum(unsigned short *addr, int len); | ||
16 | |||
17 | int main(int argc, char *argv[]) { | ||
18 | int sock; | ||
19 | char send_buf[400], src_ip[15], dst_ip[15], src_name[256]; | ||
20 | struct ip *ip = (struct ip *)send_buf; | ||
21 | struct icmp *icmp = (struct icmp *)(ip + 1); | ||
22 | struct hostent *src_hp, *dst_hp; | ||
23 | struct sockaddr_in src, dst; | ||
24 | int on = 1; | ||
25 | memset(send_buf, 0, sizeof(send_buf)); | ||
26 | |||
27 | if (argc < 2) { | ||
28 | printf("Need arg. I\n"); | ||
29 | exit(EXIT_FAILURE); | ||
30 | } | ||
31 | |||
32 | /**if (getuid() == 0) { | ||
33 | fprintf(stderr, "Need to elevate\n"); | ||
34 | exit(EXIT_FAILURE); | ||
35 | } **/ | ||
36 | |||
37 | gethostname(src_name, sizeof(src_name)); | ||
38 | printf("%s\n", src_name); | ||
39 | src_hp = gethostbyname(src_name); | ||
40 | ip->ip_src = (*(struct in_addr *)src_hp->h_addr_list[0]); | ||
41 | |||
42 | dst_hp = gethostbyname(argv[1]); | ||
43 | ip->ip_dst = (*(struct in_addr *)dst_hp->h_addr); | ||
44 | dst.sin_addr = (*(struct in_addr *)dst_hp->h_addr); | ||
45 | |||
46 | sprintf(src_ip, "%s", inet_ntoa(ip->ip_src)); | ||
47 | sprintf(dst_ip, "%s", inet_ntoa(ip->ip_dst)); | ||
48 | printf("Src: %s -- Dst: %s\n", src_ip, dst_ip); | ||
49 | |||
50 | // Create socket | ||
51 | sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); | ||
52 | |||
53 | setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); | ||
54 | |||
55 | // IP Structure | ||
56 | ip->ip_v = 4; | ||
57 | ip->ip_hl = 5; | ||
58 | ip->ip_tos = 0; | ||
59 | ip->ip_len = htons(sizeof(send_buf)); | ||
60 | ip->ip_id = htons(321); | ||
61 | ip->ip_off = htons(0); | ||
62 | ip->ip_ttl = 255; | ||
63 | ip->ip_p = IPPROTO_ICMP; | ||
64 | ip->ip_sum = 0; | ||
65 | |||
66 | // ICMP Structure | ||
67 | icmp->icmp_type = 2; | ||
68 | icmp->icmp_code = 0; | ||
69 | |||
70 | dst.sin_family = AF_INET; | ||
71 | |||
72 | ip->ip_sum = cksum((unsigned short *)send_buf, ip->ip_hl); | ||
73 | icmp->icmp_cksum = cksum((unsigned short *)icmp, sizeof(send_buf) - sizeof(struct icmp)); | ||
74 | |||
75 | int dst_addr_len = sizeof(dst); | ||
76 | int bytes_sent; | ||
77 | |||
78 | if((bytes_sent = sendto(sock, send_buf, sizeof(send_buf), 0, (struct sockaddr *)&dst, dst_addr_len)) < 0) { | ||
79 | perror("send err"); | ||
80 | fflush(stdout); | ||
81 | } | ||
82 | else { | ||
83 | printf("Sent %d bytes\n", bytes_sent); | ||
84 | } | ||
85 | |||
86 | |||
87 | } | ||
88 | |||
89 | unsigned short cksum(unsigned short *addr, int len) { | ||
90 | int nleft = len; | ||
91 | int sum = 0; | ||
92 | unsigned short *w = addr; | ||
93 | unsigned short answer = 0; | ||
94 | |||
95 | while (nleft > 1) { | ||
96 | sum += *w++; | ||
97 | nleft -= 2; | ||
98 | } | ||
99 | |||
100 | if (nleft == 1) { | ||
101 | *(unsigned char *)(&answer) = *(unsigned char *)w; | ||
102 | sum += answer; | ||
103 | } | ||
104 | |||
105 | sum = (sum >> 16) + (sum & 0xffff); | ||
106 | sum += (sum >> 16); | ||
107 | answer = ~sum; | ||
108 | |||
109 | return answer; | ||
110 | } | ||
diff --git a/ping_send b/ping_send new file mode 100644 index 0000000..37a2396 --- /dev/null +++ b/ping_send | |||
Binary files differ | |||