Skip to content

Instantly share code, notes, and snippets.

@deseven
Last active December 24, 2017 19:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save deseven/6cf9158e3c59e2371b350cee4eafeb5f to your computer and use it in GitHub Desktop.
Save deseven/6cf9158e3c59e2371b350cee4eafeb5f to your computer and use it in GitHub Desktop.
Randomizing srcip PoC
/*
Copyright (C) 2000 Daniel Ryde
Copyright (C) 2017 deseven <de7@deseven.info>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
*/
/*
LD_PRELOAD library to make connect() to use a set of IP addresses
specified via the enviroment variable SRCADDRS.
Compile on Linux with:
gcc -nostartfiles -fpic -shared source_random.c -o srcrand.so -ldl -D_GNU_SOURCE
Example in bash:
SRCADDRS="127.0.0.1,127.0.0.2,127.0.0.3" LD_PRELOAD=./srcrand.so curl url url url url
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <dlfcn.h>
#include <errno.h>
#include <time.h>
#include <arpa/inet.h>
int (*real_bind)(int, const struct sockaddr *, socklen_t);
int (*real_connect)(int, const struct sockaddr *, socklen_t);
char *src_addrs_env;
int num_addrs = 0;
char* src_addrs[254];
unsigned long int src_addr_saddr;
unsigned long int inaddr_any_saddr;
struct sockaddr_in local_sockaddr_in[] = { 0 };
void _init (void) {
const char *err;
real_bind = dlsym (RTLD_NEXT, "bind");
if ((err = dlerror ()) != NULL) {
fprintf (stderr, "dlsym (bind): %s\n", err);
}
real_connect = dlsym (RTLD_NEXT, "connect");
if ((err = dlerror ()) != NULL) {
fprintf (stderr, "dlsym (connect): %s\n", err);
}
inaddr_any_saddr = htonl (INADDR_ANY);
if (src_addrs_env = getenv ("SRCADDRS")) {
const char s[3] = ",; ";
char *token;
token = strtok(src_addrs_env,s);
while(token != NULL) {
src_addrs[num_addrs] = token;
token = strtok(NULL,s);
num_addrs++;
}
srand(time(NULL));
} else {
printf("no source addrs are defined\nset env variable SRCADDRS first\n");
exit(1);
}
}
int connect (int fd, const struct sockaddr *sk, socklen_t sl) {
static struct sockaddr_in *rsk_in;
int randomAddr = rand() % num_addrs;
rsk_in = (struct sockaddr_in *)sk;
/* printf("connect: %d %s:%d\n", fd, inet_ntoa (rsk_in->sin_addr.s_addr),
ntohs (rsk_in->sin_port));*/
src_addr_saddr = inet_addr (src_addrs[randomAddr]);
local_sockaddr_in->sin_family = AF_INET;
local_sockaddr_in->sin_addr.s_addr = src_addr_saddr;
local_sockaddr_in->sin_port = htons (0);
if ((rsk_in->sin_family == AF_INET)
&& (src_addrs)) {
real_bind (fd, (struct sockaddr *)local_sockaddr_in, sizeof (struct sockaddr));
}
return real_connect (fd, sk, sl);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment