mirror of
https://github.com/drk1wi/portspoof.git
synced 2024-06-27 09:18:58 +00:00
Update connection.cpp
This commit is contained in:
parent
1decde66c7
commit
af6cd4d79e
@ -115,108 +115,129 @@ void* process_connection(void *arg)
|
|||||||
|
|
||||||
if(threads[tid].clients[i] != 0)
|
if(threads[tid].clients[i] != 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
timestamp = time(NULL);
|
|
||||||
|
|
||||||
if(configuration->getConfigValue(OPT_NOT_NMAP_SCANNER))
|
|
||||||
n = 1; // just reply...
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nonblock(threads[tid].clients[i]);
|
|
||||||
FD_ZERO(&read_mask);
|
|
||||||
FD_SET(threads[tid].clients[i], &read_mask);
|
|
||||||
|
|
||||||
select_return = select(threads[tid].clients[i], &read_mask, (fd_set *)0, (fd_set *)0, &tv);
|
|
||||||
|
|
||||||
if(select_return < 0) /* [timeout=0, -1= ERROR] is returned */
|
timestamp = time(NULL);
|
||||||
{
|
nonblock(threads[tid].clients[i]);
|
||||||
n=-1;
|
FD_ZERO(&read_mask);
|
||||||
}
|
FD_SET(threads[tid].clients[i], &read_mask);
|
||||||
else
|
select_return = select(threads[tid].clients[i], &read_mask, (fd_set *) nullptr, (fd_set *) nullptr,
|
||||||
{
|
&tv);
|
||||||
n = 0;
|
|
||||||
int data_to_be_read_size = 0;
|
|
||||||
|
|
||||||
if (ioctl(threads[tid].clients[i], FIONREAD, &data_to_be_read_size) < 0) {
|
|
||||||
perror("ioctl failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data_to_be_read_size > 0) {
|
|
||||||
buffer_size = data_to_be_read_size;
|
|
||||||
n = recv(threads[tid].clients[i], buffer, buffer_size, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Linux
|
|
||||||
if ( getsockopt (threads[tid].clients[i], SOL_IP, SO_ORIGINAL_DST, (struct sockaddr*)&peer_sockaddr, (socklen_t*) &peer_sockaddr_len ))
|
|
||||||
perror("Getsockopt failed");
|
|
||||||
|
|
||||||
get_ipstr(threads[tid].clients[i], ipstr);
|
if (select_return < 0) /* [timeout=0, -1= ERROR] is returned */
|
||||||
original_port = ntohs(peer_sockaddr.sin_port);
|
{
|
||||||
|
n = -1;
|
||||||
|
} else {
|
||||||
|
n = 0;
|
||||||
//LOG
|
int data_to_be_read_size = 0;
|
||||||
char* msg=(char*)malloc(MAX_LOG_MSG_LEN);
|
|
||||||
memset(msg,0,MAX_LOG_MSG_LEN);
|
|
||||||
snprintf(msg,MAX_LOG_MSG_LEN,"%d # Service_probe # SIGNATURE_SEND # source_ip:%s # dst_port:%d \n",(int)timestamp,ipstr,original_port);//" port:%d src_ip%s\n", original_port,;
|
|
||||||
Utils::log_write(configuration,msg);
|
|
||||||
free(msg);
|
|
||||||
//
|
|
||||||
|
|
||||||
if(configuration->getConfigValue(OPT_DEBUG))
|
|
||||||
{
|
|
||||||
fprintf(stdout,"\n---\nThread nr.%d for port %d \n", tid,original_port);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<char> vectsignature=configuration->mapPort2Signature(original_port);
|
|
||||||
|
|
||||||
int buffertosendsize=vectsignature.size();
|
|
||||||
char* buffertosend= (char*)malloc(buffertosendsize);
|
|
||||||
|
|
||||||
for(int j=0; j<buffertosendsize;j++)
|
|
||||||
buffertosend[j]=vectsignature[j];
|
|
||||||
|
|
||||||
if(configuration->getConfigValue(OPT_DEBUG))
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
fprintf(stdout,"signature sent -> ");
|
|
||||||
for(int t=0;t<buffertosendsize;t++)
|
|
||||||
{
|
|
||||||
if(*(buffertosend+t)==0)
|
|
||||||
fprintf(stdout,"\\00");
|
|
||||||
else if(*(buffertosend+t)=='\n')
|
|
||||||
fprintf(stdout,"\\n");
|
|
||||||
else if(*(buffertosend+t)=='\r')
|
|
||||||
fprintf(stdout,"\\r");
|
|
||||||
else
|
|
||||||
fprintf(stdout,"\\%x",*(buffertosend+t));
|
|
||||||
}
|
|
||||||
fprintf(stdout,"\n---\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
|
|
||||||
if(send(threads[tid].clients[i], buffertosend, buffertosendsize,0)==-1)
|
|
||||||
perror("Send to socket failed");
|
|
||||||
|
|
||||||
|
|
||||||
close(threads[tid].clients[i]);
|
|
||||||
|
|
||||||
free(buffertosend);
|
|
||||||
|
|
||||||
pthread_mutex_lock(&new_connection_mutex);
|
|
||||||
threads[tid].clients[i] = 0;
|
|
||||||
threads[tid].client_count--;
|
|
||||||
pthread_mutex_unlock(&new_connection_mutex);
|
|
||||||
|
|
||||||
|
if (ioctl(threads[tid].clients[i], FIONREAD, &data_to_be_read_size) < 0) {
|
||||||
|
perror("ioctl failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data_to_be_read_size > 0) {
|
||||||
|
buffer_size = data_to_be_read_size;
|
||||||
|
n = recv(threads[tid].clients[i], buffer, buffer_size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int error_code;
|
||||||
|
socklen_t error_code_size = sizeof(error_code);
|
||||||
|
getsockopt(threads[tid].clients[i], SOL_SOCKET, SO_ERROR, &error_code, &error_code_size);
|
||||||
|
|
||||||
|
if (error_code) {
|
||||||
|
|
||||||
|
if (getsockopt(threads[tid].clients[i], SOL_IP, SO_ORIGINAL_DST, (struct sockaddr *) &peer_sockaddr,
|
||||||
|
(socklen_t *) (socklen_t *) &peer_sockaddr_len)) {
|
||||||
|
perror("Getsockopt failed: Have you set up your IPTABLES rules correctly ?");
|
||||||
|
goto close_socket;
|
||||||
|
} else
|
||||||
|
original_port = ntohs(peer_sockaddr.sin_port);
|
||||||
|
|
||||||
|
get_ipstr(threads[tid].clients[i], threads[tid].client_src_ip[i], ipstr);
|
||||||
|
|
||||||
|
close_socket:
|
||||||
|
if (configuration->getConfigValue(OPT_DEBUG))
|
||||||
|
fprintf(stdout, "Thread nr. %d : client %d closed connection\n", tid, threads[tid].clients[i]);
|
||||||
|
|
||||||
|
close(threads[tid].clients[i]);
|
||||||
|
|
||||||
|
fingerp.addTimedOutConnection(threads[tid].client_src_ip[i], original_port);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&new_connection_mutex);
|
||||||
|
threads[tid].clients[i] = 0;
|
||||||
|
threads[tid].client_count--;
|
||||||
|
pthread_mutex_unlock(&new_connection_mutex);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
|
||||||
|
// Linux
|
||||||
|
if ( getsockopt (threads[tid].clients[i], SOL_IP, SO_ORIGINAL_DST, (struct sockaddr*)&peer_sockaddr, (socklen_t*) &peer_sockaddr_len ))
|
||||||
|
perror("Getsockopt failed");
|
||||||
|
|
||||||
|
get_ipstr(threads[tid].clients[i], ipstr);
|
||||||
|
original_port = ntohs(peer_sockaddr.sin_port);
|
||||||
|
//
|
||||||
|
|
||||||
|
//LOG
|
||||||
|
char* msg=(char*)malloc(MAX_LOG_MSG_LEN);
|
||||||
|
memset(msg,0,MAX_LOG_MSG_LEN);
|
||||||
|
snprintf(msg,MAX_LOG_MSG_LEN,"%d # Service_probe # SIGNATURE_SEND # source_ip:%s # dst_port:%d \n",(int)timestamp,ipstr,original_port);//" port:%d src_ip%s\n", original_port,;
|
||||||
|
Utils::log_write(configuration,msg);
|
||||||
|
free(msg);
|
||||||
|
//
|
||||||
|
|
||||||
|
if(configuration->getConfigValue(OPT_DEBUG))
|
||||||
|
{
|
||||||
|
fprintf(stdout,"\n---\nThread nr.%d for port %d \n", tid,original_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<char> vectsignature=configuration->mapPort2Signature(original_port);
|
||||||
|
|
||||||
|
int buffertosendsize=vectsignature.size();
|
||||||
|
char* buffertosend= (char*)malloc(buffertosendsize);
|
||||||
|
|
||||||
|
for(int j=0; j<buffertosendsize;j++)
|
||||||
|
buffertosend[j]=vectsignature[j];
|
||||||
|
|
||||||
|
if(configuration->getConfigValue(OPT_DEBUG))
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
fprintf(stdout,"signature sent -> ");
|
||||||
|
for(int t=0;t<buffertosendsize;t++)
|
||||||
|
{
|
||||||
|
if(*(buffertosend+t)==0)
|
||||||
|
fprintf(stdout,"\\00");
|
||||||
|
else if(*(buffertosend+t)=='\n')
|
||||||
|
fprintf(stdout,"\\n");
|
||||||
|
else if(*(buffertosend+t)=='\r')
|
||||||
|
fprintf(stdout,"\\r");
|
||||||
|
else
|
||||||
|
fprintf(stdout,"\\%x",*(buffertosend+t));
|
||||||
|
}
|
||||||
|
fprintf(stdout,"\n---\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
|
||||||
|
if(send(threads[tid].clients[i], buffertosend, buffertosendsize,0)==-1)
|
||||||
|
perror("Send to socket failed");
|
||||||
|
|
||||||
|
close(threads[tid].clients[i]);
|
||||||
|
|
||||||
|
free(buffertosend);
|
||||||
|
pthread_mutex_lock(&new_connection_mutex);
|
||||||
|
threads[tid].clients[i] = 0;
|
||||||
|
threads[tid].client_count--;
|
||||||
|
pthread_mutex_unlock(&new_connection_mutex);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user