diff --git a/packages/mcp/service/pointsd/run b/packages/mcp/service/pointsd/run index ea3d1ac..104d477 100755 --- a/packages/mcp/service/pointsd/run +++ b/packages/mcp/service/pointsd/run @@ -9,11 +9,25 @@ touch /etc/group /etc/passwd addgroup -g 56634 nogroup || true adduser -D -S -h /var/lib/ctf -H ctf || true +# Set up base directories NEWDIR=/var/lib/ctf/points.new - install -d /var/www +install -d /var/lib/ctf install -o ctf -m 0755 -d $NEWDIR install -o ctf -m 0755 -d /var/lib/ctf/points.tmp + +# Make tokens database now, this is as good a time as any +TOKENS=/var/lib/ctf/tokens.db +for fn in $TOKENS /opt/*/tokens.txt; do + [ -f "$fn" ] || continue + cat $fn +done | sort | uniq > $TOKENS.new +mv $TOKENS.new $TOKENS + +# Create some files +CLAIM=/var/lib/ctf/claim.db +touch $CLAIM +chown ctf $CLAIM touch /var/lib/ctf/points.log # Generate preliminary scoreboard diff --git a/packages/mcp/www/index.html b/packages/mcp/www/index.html index 82b48c1..6eb124c 100644 --- a/packages/mcp/www/index.html +++ b/packages/mcp/www/index.html @@ -46,6 +46,7 @@ No DoS attacks.
  • + Contest servers lie within fd84:b410:3441::/112. Do not attack machines outside fd84:b410:3441::/48. Low ports (under 1024) do not run contest categories, don't waste your time. diff --git a/packages/multicaster/multicaster.mk b/packages/multicaster/multicaster.mk index ce8e15c..9e7fed6 100644 --- a/packages/multicaster/multicaster.mk +++ b/packages/multicaster/multicaster.mk @@ -2,6 +2,9 @@ MULTICASTER_PKGDIR = $(TARGET)/multicaster multicaster-install: multicaster-build mkdir -p $(MULTICASTER_PKGDIR) + cp packages/multicaster/tokens.txt $(MULTICASTER_PKGDIR) + + $(call COPYTREE, packages/multicaster/service, $(MULTICASTER_PKGDIR)/service) mkdir -p $(MULTICASTER_PKGDIR)/bin/ $(MAKE) -C packages/multicaster/src install DESTDIR=$(CURDIR)/$(MULTICASTER_PKGDIR) diff --git a/packages/multicaster/src/Makefile b/packages/multicaster/src/Makefile index bf4eb10..219a13b 100644 --- a/packages/multicaster/src/Makefile +++ b/packages/multicaster/src/Makefile @@ -1,5 +1,5 @@ CFLAGS = -Wall -Werror -TARGETS = multicaster-server multicaster-client +TARGETS = multicaster all: build build: $(TARGETS) diff --git a/packages/multicaster/src/multicaster-serverAWESOME.c b/packages/multicaster/src/multicaster-serverAWESOME.c deleted file mode 100644 index d8b69d0..0000000 --- a/packages/multicaster/src/multicaster-serverAWESOME.c +++ /dev/null @@ -1,178 +0,0 @@ -/* multicast_server.c - * Adapted from tmouse's IPv6 client/server example code - * found at http://cboard.cprogramming.com/showthread.php?t=67469 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static void DieWithError(const char* errorMessage) -{ - fprintf(stderr, "%s\n", errorMessage); - exit(1); -} - -int main(int argc, char *argv[]) -{ - int sender, listener; /* Sockets */ - char* multicastIP; /* Arg: IP Multicast address */ - char* multicastPort; /* Arg: Server port */ - char* token; - size_t tokenlen; - struct addrinfo * multicastAddr; /* Multicast address */ - struct addrinfo hints = { 0 }; /* Hints for name lookup */ - struct timeval timeout = { 0 }; - - if (argc != 4) - { - fprintf(stderr, "Usage: %s \n", argv[0]); - exit(1); - } - - multicastIP = argv[1]; /* First arg: multicast IP address */ - multicastPort = argv[2]; /* Second arg: multicast port */ - token = argv[3]; - tokenlen = strlen(token); - - /* Resolve destination address for multicast datagrams */ - hints.ai_family = PF_INET6; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_NUMERICHOST; - - if (getaddrinfo(multicastIP, multicastPort, &hints, &multicastAddr) != 0) - { - DieWithError("getaddrinfo() failed"); - } - - /* Create socket for sending multicast datagrams */ - if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) - { - DieWithError("socket() failed"); - } - - /* Create socket for recieving multicast datagrams */ - if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) - { - DieWithError("socket() failed"); - } - - { - int hops = 5; - if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) - { - DieWithError("setsockopt(MULTICAST_HOPS) failed"); - } - } - - /* Bind to the multicast port */ - if (bind(listener, multicastAddr->ai_addr, multicastAddr->ai_addrlen) != 0) - { - DieWithError("bind() failed"); - } - - /* Join the multicast group. */ - if ((multicastAddr->ai_family == PF_INET6)&&(multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6))) - { - struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); - struct ipv6_mreq multicastRequest; /* Multicast address join structure */ - - /* Specify the multicast group */ - memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr)->sin6_addr, sizeof(multicastRequest.ipv6mr_multiaddr)); - - /* Accept multicast from any interface */ - multicastRequest.ipv6mr_interface = addr->sin6_scope_id; - - /* Join the multicast address */ - if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0) - { - DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); - } - } else { - DieWithError("Not IPv6"); - } - - for (;;) /* Run forever */ - { - int n; - int max_fd; - fd_set input; - - char recvString[500]; /* Buffer for received string */ - int recvStringLen; /* Length of received string */ - - char sendString[] = "Say Hello\n"; - size_t sendStringLen = sizeof(sendString)-1; - char errorString[] = "That is not correct! Try again!\n"; - - struct sockaddr_in6 from; - socklen_t fromlen = sizeof(from); - - FD_ZERO(&input); - FD_SET(listener, &input); - - max_fd = listener + 1; - - if (timeout.tv_usec < 100) - { - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - int sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, - multicastAddr->ai_addrlen); - if (sendLen == sendStringLen) - { - printf("Sent [%s] (%i bytes) to %s, port %s\n", sendString, sendLen, - multicastIP, multicastPort); - } else { - DieWithError("sendto() sent a different number of bytes than expected"); - } - } - - n = select(max_fd, &input, NULL, NULL, &timeout); - - /* See if there was an error */ - if (n < 0) - { - perror("select failed"); - } else if (n == 0) { - puts("TIMEOUT"); - } else { - if (FD_ISSET(listener, &input)) - { - recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, - (struct sockaddr *)&from, &fromlen); - /* Receive a single datagram from the server */ - if (recvStringLen < 0) - { - DieWithError("recvfrom() failed"); - } - - recvString[recvStringLen] = '\0'; - if (strcmp(recvString, "hello")==0) - { - printf("Correct!!\n"); - sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, fromlen); - } else if (strcmp(recvString, sendString)!=0) { - sendto(listener, errorString, sizeof(errorString), 0, (struct sockaddr *)&from, fromlen); - } - - /* Print the received string */ - printf("Received string [%s]\n", recvString); - } - } - } - - /* NOT REACHED */ - freeaddrinfo(multicastAddr); - close(sender); - close(listener); - - return 0; -} diff --git a/packages/multicaster/src/multicaster.c b/packages/multicaster/src/multicaster.c new file mode 100644 index 0000000..0689959 --- /dev/null +++ b/packages/multicaster/src/multicaster.c @@ -0,0 +1,166 @@ +/* multicast_server.c + * Adapted from tmouse's IPv6 client/server example code + * found at http://cboard.cprogramming.com/showthread.php?t=67469 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void +DieWithError(const char* errorMessage) +{ + fprintf(stderr, "%s\n", errorMessage); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int sender, listener; /* Sockets */ + char* multicastIP; /* Arg: IP Multicast address */ + char* multicastPort; /* Arg: Server port */ + char token[100]; + size_t tokenlen; + struct addrinfo * multicastAddr; /* Multicast address */ + struct addrinfo hints = { 0 }; /* Hints for name lookup */ + struct timeval timeout = { 0 }; + + if (argc != 3) + { + fprintf(stderr, "Usage: %s ADDRESS PORT ai_family == PF_INET6) && + (multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6)))) { + DieWithError("Not IPv6"); + } + + /* Create socket for sending multicast datagrams */ + if ((sender = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) { + DieWithError("socket() failed"); + } + + /* Create socket for recieving multicast datagrams */ + if ((listener = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, 0)) == -1) { + DieWithError("socket() failed"); + } + + /* We need to go through a router, set hops to 5 */ + { + int hops = 5; + + if (setsockopt(sender, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) != 0) { + DieWithError("setsockopt(MULTICAST_HOPS) failed"); + } + } + + /* Bind to the multicast port */ + if (bind(listener, multicastAddr->ai_addr, multicastAddr->ai_addrlen) != 0) { + DieWithError("bind() failed"); + } + + + /* Join the multicast group. */ + { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *)(multicastAddr->ai_addr); + struct ipv6_mreq multicastRequest; + + multicastRequest.ipv6mr_interface = addr->sin6_scope_id; + memcpy(&multicastRequest.ipv6mr_multiaddr, &(addr->sin6_addr), + sizeof(multicastRequest.ipv6mr_multiaddr)); + + if (setsockopt(listener, IPPROTO_IPV6, IPV6_JOIN_GROUP, + (char*)&multicastRequest, sizeof(multicastRequest)) != 0) { + DieWithError("setsockopt(IPV6_JOIN_GROUP) failed"); + } + } + + for (;;) { /* Run forever */ + int n; + int max_fd; + fd_set input; + + char recvString[500]; /* Buffer for received string */ + int recvStringLen; /* Length of received string */ + + char sendString[] = "If anyone is out there, please say hello\n"; + size_t sendStringLen = sizeof(sendString)-1; + char errorString[] = "Say what?\n"; + + struct sockaddr_in6 from; + socklen_t fromlen = sizeof(from); + + FD_ZERO(&input); + FD_SET(listener, &input); + + max_fd = listener + 1; + + if (timeout.tv_usec < 100) { + ssize_t sendLen; + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + sendLen = sendto(sender, sendString, sendStringLen, 0, multicastAddr->ai_addr, + multicastAddr->ai_addrlen); + if (sendLen != sendStringLen) { + DieWithError("sendto() sent a different number of bytes than expected"); + } + } + + n = select(max_fd, &input, NULL, NULL, &timeout); + + /* See if there was an error */ + if (n < 0) { + perror("select failed"); + } else if (FD_ISSET(listener, &input)) { + recvStringLen = recvfrom(listener, recvString, sizeof(recvString) - 1, 0, + (struct sockaddr *)&from, &fromlen); + /* Receive a single datagram from the server */ + if (recvStringLen < 0) { + DieWithError("recvfrom() failed"); + } + + recvString[recvStringLen] = '\0'; + if (strcmp(recvString, "hello")==0) { + sendto(listener, token, sizeof(sendString), 0, (struct sockaddr *)&from, + fromlen); + } else if (strcmp(recvString, sendString)!=0) { + sendto(listener, errorString, sizeof(errorString), 0, + (struct sockaddr *)&from, fromlen); + } + } + } + + /* NOT REACHED */ + freeaddrinfo(multicastAddr); + close(sender); + close(listener); + + return 0; +}