diff options
-rw-r--r-- | mactelnet.c | 18 | ||||
-rw-r--r-- | mactelnetd.c | 108 |
2 files changed, 95 insertions, 31 deletions
diff --git a/mactelnet.c b/mactelnet.c index 8ed8877..6f21b09 100644 --- a/mactelnet.c +++ b/mactelnet.c @@ -50,7 +50,7 @@ static unsigned int incounter = 0; static int sessionkey = 0; static int running = 1; -static unsigned char broadcast_mode = 1; +static unsigned char use_raw_socket = 0; static unsigned char terminal_mode = 0; static unsigned char srcmac[ETH_ALEN]; @@ -83,7 +83,7 @@ static int send_udp(struct mt_packet *packet, int retransmit) { /* Clear keepalive counter */ keepalive_counter = 0; - if (broadcast_mode) { + if (!use_raw_socket) { /* Init SendTo struct */ struct sockaddr_in socket_address; socket_address.sin_family = AF_INET; @@ -370,7 +370,7 @@ int main (int argc, char **argv) { switch (c) { case 'n': - broadcast_mode = 0; + use_raw_socket = 1; break; case 'u': @@ -425,12 +425,12 @@ int main (int argc, char **argv) { /* Seed randomizer */ srand(time(NULL)); - if (!broadcast_mode && geteuid() != 0) { - fprintf(stderr, "You need to have root privileges to use the -n parameter.\n"); - return 1; - } + if (use_raw_socket) { + if (geteuid() != 0) { + fprintf(stderr, "You need to have root privileges to use the -n parameter.\n"); + return 1; + } - if (!broadcast_mode) { /* Transmit raw packets with this socket */ sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sockfd < 0) { @@ -446,7 +446,7 @@ int main (int argc, char **argv) { return 1; } - if (broadcast_mode) { + if (!use_raw_socket) { if (setsockopt(insockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof (optval))==-1) { perror("SO_BROADCAST"); return 1; diff --git a/mactelnetd.c b/mactelnetd.c index d0e4be5..e5409a8 100644 --- a/mactelnetd.c +++ b/mactelnetd.c @@ -47,6 +47,9 @@ #include "users.h" #include "config.h" +#define PROGRAM_NAME "MAC-Telnet Daemon" +#define PROGRAM_VERSION "0.2" + #define MAX_INSOCKETS 100 #define MT_INTERFACE_LEN 128 @@ -56,6 +59,7 @@ struct mt_socket { unsigned char mac[ETH_ALEN]; char name[MT_INTERFACE_LEN]; int sockfd; + int device_index; }; static int sockfd; @@ -63,6 +67,8 @@ static int insockfd; static struct mt_socket sockets[MAX_INSOCKETS]; static int sockets_count = 0; +static int use_raw_socket = 0; + static struct in_addr sourceip; static struct in_addr destip; static int sourceport; @@ -174,7 +180,7 @@ static struct mt_connection *list_find_connection(unsigned short seskey, unsigne return NULL; } -int find_socket(unsigned char *mac) { +static int find_socket(unsigned char *mac) { int i; for (i = 0; i < sockets_count; ++i) { @@ -184,7 +190,7 @@ int find_socket(unsigned char *mac) { return -1; } -void setup_sockets() { +static void setup_sockets() { struct sockaddr_in myip; char devicename[MT_INTERFACE_LEN]; unsigned char mac[ETH_ALEN]; @@ -193,30 +199,32 @@ void setup_sockets() { memset(emptymac, 0, ETH_ALEN); - while ((success = get_ips(devicename, 128, &myip))) { - if (get_device_mac(sockfd, devicename, mac)) { + while ((success = get_ips(devicename, MT_INTERFACE_LEN, &myip))) { + if (get_device_mac(insockfd, devicename, mac)) { if (memcmp(mac, emptymac, ETH_ALEN) != 0 && find_socket(mac) < 0) { -/* int optval = 1; struct sockaddr_in si_me; -*/ struct mt_socket *mysocket = &(sockets[sockets_count]); memcpy(mysocket->mac, mac, ETH_ALEN); strncpy(mysocket->name, devicename, MT_INTERFACE_LEN - 1); mysocket->name[MT_INTERFACE_LEN - 1] = '\0'; -/* + mysocket->sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (mysocket->sockfd < 0) { close(mysocket->sockfd); continue; } + if (setsockopt(mysocket->sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof (optval))==-1) { + perror("SO_BROADCAST"); + continue; + } + setsockopt(mysocket->sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); -*/ + /* Initialize receiving socket on the device chosen */ -/* si_me.sin_family = AF_INET; si_me.sin_port = htons(MT_MACTELNET_PORT); memcpy(&(si_me.sin_addr), &(myip.sin_addr), 4); @@ -225,18 +233,29 @@ void setup_sockets() { fprintf(stderr, "Error binding to %s:%d, %s\n", inet_ntoa(si_me.sin_addr), sourceport, strerror(errno)); continue; } -*/ memcpy(mysocket->ip, &(myip.sin_addr), 4); memcpy(mysocket->mac, mac, ETH_ALEN); + + mysocket->device_index = get_device_index(mysocket->sockfd, devicename); + sockets_count++; - syslog(LOG_NOTICE, "Listening on %s: %16s port %d\n", devicename, ether_ntoa((struct ether_addr *)mac), MT_MACTELNET_PORT); } } } } -static int send_udp(const struct mt_connection *conn, const struct mt_packet *data) { - return send_custom_udp(sockfd, 2, conn->dstmac, conn->srcmac, &sourceip, sourceport, &destip, conn->srcport, data->data, data->size); +static int send_udp(const struct mt_connection *conn, const struct mt_packet *packet) { + if (use_raw_socket) { + return send_custom_udp(sockfd, conn->socket->device_index, conn->dstmac, conn->srcmac, &sourceip, sourceport, &destip, conn->srcport, packet->data, packet->size); + } else { + /* Init SendTo struct */ + struct sockaddr_in socket_address; + socket_address.sin_family = AF_INET; + socket_address.sin_port = htons(conn->srcport); + socket_address.sin_addr.s_addr = htonl(INADDR_BROADCAST); + + return sendto(conn->socket->sockfd, packet->data, packet->size, 0, (struct sockaddr*)&socket_address, sizeof(socket_address)); + } } static void display_motd() { @@ -680,6 +699,10 @@ static void daemonize() { signal(SIGTTIN,SIG_IGN); } +static void print_version() { + fprintf(stderr, PROGRAM_NAME " " PROGRAM_VERSION "\n"); +} + /* * TODO: Rewrite main() when all sub-functionality is tested */ @@ -689,7 +712,41 @@ int main (int argc, char **argv) { struct timeval timeout; struct mt_packet pdata; fd_set read_fds; - int optval = 1; + int c,optval = 1; + int print_help = 0; + + while ((c = getopt(argc, argv, "nvh?")) != -1) { + switch (c) { + + case 'n': + use_raw_socket = 1; + break; + + case 'v': + print_version(); + exit(0); + break; + + case 'h': + case '?': + print_help = 1; + break; + + } + } + + if (print_help) { + print_version(); + fprintf(stderr, "Usage: %s [-n] [-h]\n", argv[0]); + + if (print_help) { + fprintf(stderr, "\nParameters:\n"); + fprintf(stderr, " -n Do not use broadcast packets. Just a tad less insecure.\n"); + fprintf(stderr, " -h This help.\n"); + fprintf(stderr, "\n"); + } + return 1; + } /* Try to read user file */ read_userfile(); @@ -702,11 +759,13 @@ int main (int argc, char **argv) { return 1; } - /* Transmit raw packets with this socket */ - sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); - if (sockfd < 0) { - perror("sockfd"); - return 1; + if (use_raw_socket) { + /* Transmit raw packets with this socket */ + sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); + if (sockfd < 0) { + perror("sockfd"); + return 1; + } } /* Receive regular udp packets with this socket */ @@ -739,14 +798,19 @@ int main (int argc, char **argv) { return 1; } + setup_sockets(); + daemonize(); openlog("mactelnetd", LOG_PID, LOG_DAEMON); syslog(LOG_NOTICE, "Bound to %s:%d", inet_ntoa(si_me.sin_addr), sourceport); - setup_sockets(); - + for (i = 0; i < sockets_count; ++i) { + struct mt_socket *socket = &(sockets[i]); + syslog(LOG_NOTICE, "Listening on %s: %16s port %d\n", socket->name, ether_ntoa((struct ether_addr *)socket->mac), MT_MACTELNET_PORT); + } + if (sockets_count == 0) { syslog(LOG_ERR, "Unable to find the mac-address on any interfaces\n"); exit(1); @@ -762,7 +826,7 @@ int main (int argc, char **argv) { /* Init select */ FD_ZERO(&read_fds); FD_SET(insockfd, &read_fds); - maxfd = sockfd > insockfd ? sockfd : insockfd; + maxfd = insockfd; /* Add active connections to select queue */ for (p = connections_head; p != NULL; p = p->next) { |