1
0
mirror of https://github.com/rofl0r/proxychains-ng synced 2026-05-18 03:31:21 +08:00

dig works

This commit is contained in:
hugoc
2023-12-13 02:22:20 +01:00
Unverified
parent 8ed4b52140
commit f3511f80a6
3 changed files with 458 additions and 117 deletions
+263 -104
View File
@@ -674,6 +674,23 @@ size_t write_buf_to_iov(void* buff, size_t buff_len, struct iovec* iov, size_t i
return written;
}
size_t write_iov_to_buf(void* buff, size_t buff_len, struct iovec* iov, size_t iov_len){
size_t written = 0;
int i = 0;
size_t min = 0;
//size_t iov_total_len = get_iov_total_len(iov, iov_len);
while( (written < buff_len) && (i < iov_len)){
min = ((buff_len-written)<iov[i].iov_len)?(buff_len-written):iov[i].iov_len;
memcpy(buff+written, iov[i].iov_base, min);
written += min;
i += 1;
}
return written;
}
void cast_socks5addr_v4inv6_to_v4(socks5_addr* addr){
if( (addr->atyp == ATYP_V6) && !memcmp(addr->addr.v6, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12)){
PDEBUG("casting v4inv6 address to v4 address\n");
@@ -723,6 +740,7 @@ int is_from_chain_head(udp_relay_chain chain, struct sockaddr src_addr){
}
int decapsulate_check_udp_packet(void* in_buffer, size_t in_buffer_len, udp_relay_chain chain, socks5_addr* src_addr, unsigned short* src_port, void* udp_data, size_t* udp_data_len){
PFUNC();
@@ -787,7 +805,7 @@ int decapsulate_check_udp_packet(void* in_buffer, size_t in_buffer_len, udp_rela
return 0;
}
int unsocks_udp_packet(void* in_buffer, size_t in_buffer_len, udp_relay_chain chain, ip_type* src_ip, unsigned short* src_port, void* udp_data, size_t* udp_data_len){
int unsocksify_udp_packet(void* in_buffer, size_t in_buffer_len, udp_relay_chain chain, ip_type* src_ip, unsigned short* src_port, void* udp_data, size_t* udp_data_len){
PFUNC();
// Decapsulate all the UDP headers and check that the packet came from the right proxy nodes
int rc;
@@ -863,7 +881,7 @@ int receive_udp_packet(int sockfd, udp_relay_chain chain, ip_type* src_ip, unsig
int rc;
size_t udp_data_len = data_len;
rc = unsocks_udp_packet(buffer, bytes_received, chain, src_ip, src_port, data, &udp_data_len);
rc = unsocksify_udp_packet(buffer, bytes_received, chain, src_ip, src_port, data, &udp_data_len);
if(rc != SUCCESS){
PDEBUG("error unSOCKSing the UDP packet\n");
return -1;
@@ -914,8 +932,45 @@ int receive_udp_packet(int sockfd, udp_relay_chain chain, ip_type* src_ip, unsig
// return udp_data_len;
}
int send_udp_packet(int sockfd, udp_relay_chain chain, ip_type target_ip, unsigned short target_port, char frag, char * data, unsigned int data_len) {
int encapsulate_udp_packet(udp_relay_chain chain, socks5_addr dst_addr, unsigned short dst_port, void* buffer, size_t* buffer_len){
PFUNC();
unsigned int written = 0;
unsigned int offset = 0;
udp_relay_node * tmp = chain.head;
while ((tmp->next != NULL) && (written < *buffer_len))
{
socks5_addr tmpaddr;
tmpaddr.atyp = (tmp->next)->bnd_addr.is_v6?ATYP_V6:ATYP_V4;
memcpy(tmpaddr.addr.v6, (tmp->next)->bnd_addr.addr.v6, (tmp->next)->bnd_addr.is_v6?16:4);
written = write_udp_header(tmpaddr, (tmp->next)->bnd_port, 0, buffer+offset, *buffer_len - offset);
if (written == -1){
PDEBUG("error write_udp_header\n");
return -1;
}
offset += written;
tmp = tmp->next;
}
written = write_udp_header(dst_addr, dst_port, 0, buffer+offset, *buffer_len-offset);
if (written == -1){
PDEBUG("error write_udp_header\n");
return -1;
}
offset += written;
*buffer_len = offset;
return 0;
}
int socksify_udp_packet(void* udp_data, size_t udp_data_len, udp_relay_chain chain, ip_type dst_ip, unsigned short dst_port, void* buffer, size_t* buffer_len){
PFUNC();
if (chain.head == NULL ){
PDEBUG("provided chain is empty\n");
return -1;
@@ -924,119 +979,68 @@ int send_udp_packet(int sockfd, udp_relay_chain chain, ip_type target_ip, unsign
char *dns_name = NULL;
char hostnamebuf[MSG_LEN_MAX];
size_t dns_len = 0;
socks5_addr target_addr;
socks5_addr dst_addr;
// we use ip addresses with 224.* to lookup their dns name in our table, to allow remote DNS resolution
// the range 224-255.* is reserved, and it won't go outside (unless the app does some other stuff with
// the results returned from gethostbyname et al.)
// the hardcoded number 224 can now be changed using the config option remote_dns_subnet to i.e. 127
if(!target_ip.is_v6 && proxychains_resolver >= DNSLF_RDNS_START && target_ip.addr.v4.octet[0] == remote_dns_subnet) {
target_addr.atyp = ATYP_DOM;
dns_len = rdns_get_host_for_ip(target_ip.addr.v4, target_addr.addr.dom.name);
if(!dst_ip.is_v6 && proxychains_resolver >= DNSLF_RDNS_START && dst_ip.addr.v4.octet[0] == remote_dns_subnet) {
dst_addr.atyp = ATYP_DOM;
dns_len = rdns_get_host_for_ip(dst_ip.addr.v4, dst_addr.addr.dom.name);
PDEBUG("dnslen: %d\n", dns_len);
if(!dns_len) goto err;
else dns_name = target_addr.addr.dom.name;
target_addr.addr.dom.len = dns_len & 0xFF;
PDEBUG("dnslen in struct: %d\n", target_addr.addr.dom.len);
if(!dns_len) return -1;
else dns_name = dst_addr.addr.dom.name;
dst_addr.addr.dom.len = dns_len & 0xFF;
PDEBUG("dnslen in struct: %d\n", dst_addr.addr.dom.len);
} else {
if(target_ip.is_v6){
target_addr.atyp = ATYP_V6;
memcpy(target_addr.addr.v6, target_ip.addr.v6, 16);
if(dst_ip.is_v6){
dst_addr.atyp = ATYP_V6;
memcpy(dst_addr.addr.v6, dst_ip.addr.v6, 16);
} else {
target_addr.atyp = ATYP_V4;
memcpy(target_addr.addr.v4.octet, target_ip.addr.v4.octet, 4);
dst_addr.atyp = ATYP_V4;
memcpy(dst_addr.addr.v4.octet, dst_ip.addr.v4.octet, 4);
}
}
PDEBUG("host dns %s\n", dns_name ? dns_name : "<NULL>");
// Write all the UDP headers into the provided buffer
int rc;
size_t tmp_buffer_len = *buffer_len;
rc = encapsulate_udp_packet(chain, dst_addr, dst_port, buffer, &tmp_buffer_len);
if(rc != SUCCESS){
PDEBUG("error encapsulate_udp_packet()\n");
return -1;
}
// Append UDP data in the remaining space of the buffer
int min = (udp_data_len>(buffer_len-tmp_buffer_len))?(buffer_len-tmp_buffer_len):udp_data_len;
memcpy(buffer + tmp_buffer_len, udp_data, min);
*buffer_len = tmp_buffer_len + min;
return 0;
}
int send_udp_packet(int sockfd, udp_relay_chain chain, ip_type target_ip, unsigned short target_port, char frag, char * data, unsigned int data_len) {
PFUNC();
char send_buffer[65535];
size_t send_buffer_len = sizeof(send_buffer);
int rc;
// Allocate a new buffer for the packet data and all the headers
unsigned int headers_size = 0;
udp_relay_node * tmp = chain.head;
int len = 0;
while(tmp->next != NULL){
// switch ((tmp->next)->bnd_addr.atyp)
// {
// case ATYP_V4:
// len = 4;
// break;
// case ATYP_V6:
// len = 6;
// break;
// case ATYP_DOM:
// len = (tmp->next)->bnd_addr.addr.dom.len + 1;
// break;
// default:
// break;
// }
len = (tmp->next)->bnd_addr.is_v6?16:4;
headers_size += len + 6;
tmp = tmp->next;
}
switch (target_addr.atyp)
{
case ATYP_V4:
len = 4;
break;
case ATYP_V6:
len = 6;
break;
case ATYP_DOM:
len = target_addr.addr.dom.len + 1;
break;
default:
break;
}
headers_size += len + 6;
char * buff = NULL;
if (NULL == (buff = (char*)malloc(headers_size+data_len))){
PDEBUG("error malloc buffer\n");
rc = socksify_udp_packet(data, data_len, chain, target_ip, target_port,send_buffer, &send_buffer_len);
if(rc != SUCCESS){
PDEBUG("error socksify_udp_packet()\n");
return -1;
}
// Append each header to the buffer
unsigned int written = 0;
unsigned int offset = 0;
tmp = chain.head;
while (tmp->next != NULL)
{
socks5_addr tmpaddr;
tmpaddr.atyp = (tmp->next)->bnd_addr.is_v6?ATYP_V6:ATYP_V4;
memcpy(tmpaddr.addr.v6, (tmp->next)->bnd_addr.addr.v6, (tmp->next)->bnd_addr.is_v6?16:4);
written = write_udp_header(tmpaddr, (tmp->next)->bnd_port, 0, buff+offset, headers_size + data_len - offset);
if (written == -1){
PDEBUG("error write_udp_header\n");
goto err;
}
offset += written;
tmp = tmp->next;
}
written = write_udp_header(target_addr, target_port, 0, buff + offset, headers_size + data_len - offset);
if (written == -1){
PDEBUG("error write_udp_header\n");
goto err;
}
offset += written;
// Append data to the buffer
memcpy(buff + offset, data, data_len);
// Send the packet
// FIXME: should write_n_bytes be used here instead ?
@@ -1059,20 +1063,175 @@ int send_udp_packet(int sockfd, udp_relay_chain chain, ip_type target_ip, unsign
int sent = 0;
sent = true_sendto(sockfd, buff, offset+data_len, 0, (struct sockaddr *) (v6?(void*)&addr6:(void*)&addr), v6?sizeof(addr6):sizeof(addr) );
if (sent != offset+data_len){
sent = true_sendto(sockfd, send_buffer, send_buffer_len, 0, (struct sockaddr *) (v6?(void*)&addr6:(void*)&addr), v6?sizeof(addr6):sizeof(addr) );
if (sent != send_buffer_len){
PDEBUG("true_sendto error\n");
goto err;
return -1;
}
return SUCCESS;
err:
free(buff);
return -1;
}
// int send_udp_packet(int sockfd, udp_relay_chain chain, ip_type target_ip, unsigned short target_port, char frag, char * data, unsigned int data_len) {
// if (chain.head == NULL ){
// PDEBUG("provided chain is empty\n");
// return -1;
// }
// char *dns_name = NULL;
// char hostnamebuf[MSG_LEN_MAX];
// size_t dns_len = 0;
// socks5_addr target_addr;
// // we use ip addresses with 224.* to lookup their dns name in our table, to allow remote DNS resolution
// // the range 224-255.* is reserved, and it won't go outside (unless the app does some other stuff with
// // the results returned from gethostbyname et al.)
// // the hardcoded number 224 can now be changed using the config option remote_dns_subnet to i.e. 127
// if(!target_ip.is_v6 && proxychains_resolver >= DNSLF_RDNS_START && target_ip.addr.v4.octet[0] == remote_dns_subnet) {
// target_addr.atyp = ATYP_DOM;
// dns_len = rdns_get_host_for_ip(target_ip.addr.v4, target_addr.addr.dom.name);
// PDEBUG("dnslen: %d\n", dns_len);
// if(!dns_len) goto err;
// else dns_name = target_addr.addr.dom.name;
// target_addr.addr.dom.len = dns_len & 0xFF;
// PDEBUG("dnslen in struct: %d\n", target_addr.addr.dom.len);
// } else {
// if(target_ip.is_v6){
// target_addr.atyp = ATYP_V6;
// memcpy(target_addr.addr.v6, target_ip.addr.v6, 16);
// } else {
// target_addr.atyp = ATYP_V4;
// memcpy(target_addr.addr.v4.octet, target_ip.addr.v4.octet, 4);
// }
// }
// PDEBUG("host dns %s\n", dns_name ? dns_name : "<NULL>");
}
// // Allocate a new buffer for the packet data and all the headers
// unsigned int headers_size = 0;
// udp_relay_node * tmp = chain.head;
// int len = 0;
// while(tmp->next != NULL){
// // switch ((tmp->next)->bnd_addr.atyp)
// // {
// // case ATYP_V4:
// // len = 4;
// // break;
// // case ATYP_V6:
// // len = 6;
// // break;
// // case ATYP_DOM:
// // len = (tmp->next)->bnd_addr.addr.dom.len + 1;
// // break;
// // default:
// // break;
// // }
// len = (tmp->next)->bnd_addr.is_v6?16:4;
// headers_size += len + 6;
// tmp = tmp->next;
// }
// switch (target_addr.atyp)
// {
// case ATYP_V4:
// len = 4;
// break;
// case ATYP_V6:
// len = 6;
// break;
// case ATYP_DOM:
// len = target_addr.addr.dom.len + 1;
// break;
// default:
// break;
// }
// headers_size += len + 6;
// char * buff = NULL;
// if (NULL == (buff = (char*)malloc(headers_size+data_len))){
// PDEBUG("error malloc buffer\n");
// return -1;
// }
// // Append each header to the buffer
// unsigned int written = 0;
// unsigned int offset = 0;
// tmp = chain.head;
// while (tmp->next != NULL)
// {
// socks5_addr tmpaddr;
// tmpaddr.atyp = (tmp->next)->bnd_addr.is_v6?ATYP_V6:ATYP_V4;
// memcpy(tmpaddr.addr.v6, (tmp->next)->bnd_addr.addr.v6, (tmp->next)->bnd_addr.is_v6?16:4);
// written = write_udp_header(tmpaddr, (tmp->next)->bnd_port, 0, buff+offset, headers_size + data_len - offset);
// if (written == -1){
// PDEBUG("error write_udp_header\n");
// goto err;
// }
// offset += written;
// tmp = tmp->next;
// }
// written = write_udp_header(target_addr, target_port, 0, buff + offset, headers_size + data_len - offset);
// if (written == -1){
// PDEBUG("error write_udp_header\n");
// goto err;
// }
// offset += written;
// // Append data to the buffer
// memcpy(buff + offset, data, data_len);
// // Send the packet
// // FIXME: should write_n_bytes be used here instead ?
// // if(chain.head->bnd_addr.atyp == ATYP_DOM){
// // PDEBUG("BND_ADDR of type DOMAINE (0x03) not supported yet\n");
// // goto err;
// // }
// int v6 = chain.head->bnd_addr.is_v6 == ATYP_V6;
// struct sockaddr_in addr = {
// .sin_family = AF_INET,
// .sin_port = chain.head->bnd_port,
// .sin_addr.s_addr = (in_addr_t) chain.head->bnd_addr.addr.v4.as_int,
// };
// struct sockaddr_in6 addr6 = {
// .sin6_family = AF_INET6,
// .sin6_port = chain.head->bnd_port,
// };
// if(v6) memcpy(&addr6.sin6_addr.s6_addr, chain.head->bnd_addr.addr.v6, 16);
// int sent = 0;
// sent = true_sendto(sockfd, buff, offset+data_len, 0, (struct sockaddr *) (v6?(void*)&addr6:(void*)&addr), v6?sizeof(addr6):sizeof(addr) );
// if (sent != offset+data_len){
// PDEBUG("true_sendto error\n");
// goto err;
// }
// return SUCCESS;
// err:
// free(buff);
// return -1;
// }
#define TP " ... "