Dodany przez: andrewdre, 22:45 21-07-2023

Nowy Pobierz
  1. #include <iostream>
  2. #include <sys/wait.h>
  3. #include <sys/mount.h>
  4. #include <arpa/inet.h>
  5. #include <net/if.h>
  6. #include <string.h>
  7. #include <net/route.h>
  8.  
  9. #define STACK_SIZE (1024 * 1024)
  10.  
  11. using namespace std;
  12.  
  13. static char stack[STACK_SIZE];
  14.  
  15. int setip(char *name,char *addr,char *netmask) {
  16.     struct ifreq ifr;
  17.     int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
  18.  
  19.     strncpy(ifr.ifr_name, name, IFNAMSIZ);
  20.  
  21.     ifr.ifr_addr.sa_family = AF_INET;
  22.     inet_pton(AF_INET, addr, ifr.ifr_addr.sa_data + 2);
  23.     ioctl(fd, SIOCSIFADDR, &ifr);
  24.  
  25.     inet_pton(AF_INET, netmask, ifr.ifr_addr.sa_data + 2);
  26.     ioctl(fd, SIOCSIFNETMASK, &ifr);
  27.  
  28.     //get flags
  29.     ioctl(fd, SIOCGIFFLAGS, &ifr);
  30.     strncpy(ifr.ifr_name, name, IFNAMSIZ);
  31.     ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
  32.     // set flags
  33.     //ioctl(fd, SIOCSIFFLAGS, &ifr);
  34.     if(ioctl(fd, SIOCSIFFLAGS, &ifr) < 0 )
  35.        perror("ioctl");
  36.  
  37.     return 0;
  38. }
  39.  
  40. int setRoute(char *name, char *addr) {
  41.     int sockfd;
  42.     struct rtentry rt;
  43.  
  44.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  45.     if (sockfd == -1)
  46.     {
  47.         perror("socket creation failed\n");
  48.         return 0;
  49.     }
  50.  
  51.     struct sockaddr_in *sockinfo = (struct sockaddr_in *)&rt.rt_gateway;
  52.     sockinfo->sin_family = AF_INET;
  53.     sockinfo->sin_addr.s_addr = inet_addr(addr);
  54.  
  55.     sockinfo = (struct sockaddr_in *)&rt.rt_dst;
  56.     sockinfo->sin_family = AF_INET;
  57.     sockinfo->sin_addr.s_addr = INADDR_ANY;
  58.  
  59.     sockinfo = (struct sockaddr_in *)&rt.rt_genmask;
  60.     sockinfo->sin_family = AF_INET;
  61.     sockinfo->sin_addr.s_addr = INADDR_ANY;
  62.  
  63.     rt.rt_flags = RTF_UP | RTF_GATEWAY;
  64.     rt.rt_dev = name;
  65.  
  66.     if(ioctl(sockfd, SIOCADDRT, &rt) < 0 ){
  67.         perror("ioctl");
  68.     }
  69.     return 0;
  70. }
  71.  
  72. void setInterfaceUp(char *name){
  73.     int sockfd;
  74.     struct ifreq ifr;
  75.  
  76.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  77.  
  78.     if (sockfd < 0)
  79.         return;
  80.  
  81.     memset(&ifr, 0, sizeof ifr);
  82.  
  83.     strncpy(ifr.ifr_name, name, IFNAMSIZ);
  84.  
  85.     ifr.ifr_flags |= IFF_UP;
  86.     if (ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0 ){
  87.         perror("ioctl");
  88.     }
  89.  
  90. }
  91.  
  92. int child(void* arg)
  93. {
  94.     sleep(1);
  95.  
  96.     if (mount("none", "/", NULL, MS_PRIVATE|MS_REC, NULL) == -1) {
  97.         perror("mount");
  98.         exit(1);
  99.     }
  100.     if (chroot("/path/to/new/root/") == -1){
  101.         perror("chroot");
  102.         exit(1);
  103.     }
  104.     if (chdir("/") == -1){
  105.         perror("chdir");
  106.         exit(1);
  107.     }
  108.     if (mount("proc", "/proc", "proc", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL) == -1) {
  109.         perror("mount");
  110.         exit(1);
  111.     }
  112.  
  113.     setip("veth1","192.168.0.1","255.255.255.0");
  114.     setRoute("veth1", "192.168.0.2");
  115.     setInterfaceUp("lo");
  116.     if (setresuid(1001, 1001, 1001) == -1){
  117.         perror("setresuid");
  118.         exit(1);
  119.     }
  120.     if (execlp("/bin/bash", "/bin/bash", NULL) == -1){
  121.         perror("execlp");
  122.         exit(1);
  123.     }
  124.  
  125.     return 1;
  126. }
  127.  
  128. int main()
  129. {
  130.     if(setresuid(0, 0, 0) == -1 ){
  131.         perror("setresuid");
  132.         exit(1);
  133.     }
  134.     char buf[255];
  135.     pid_t pid = clone(child, stack+STACK_SIZE,
  136.     CLONE_NEWNET|CLONE_NEWNS|CLONE_NEWCGROUP|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID|SIGCHLD, NULL);
  137.  
  138.     if (pid == -1){
  139.         perror("clone");
  140.         exit(1);
  141.     }
  142.  
  143.  
  144.     sprintf(buf,"ip link add name veth0 type veth peer name veth1 netns %d",pid);
  145.     if (system(buf) == -1){
  146.         perror("system");
  147.         exit(1);
  148.     }
  149.  
  150.     setip("veth0","192.168.0.2","255.255.255.0");
  151.  
  152.     if (setresuid(1001, 1001, 1001) == -1){
  153.         perror("setresuid");
  154.         exit(1);
  155.     }
  156.  
  157.     if (waitpid(pid, NULL, 0) == -1){
  158.         perror("waitpid");
  159.         exit(1);
  160.     }
  161.     return 0;
  162. }
  163.  

Źródło:

Ostatnie wpisy

Linki

Funkcje