initial push of all stuff :)
[oweals/thc-archive.git] / Tools / THCsmbgetOS.c
1 /*\r
2 * This is a little smb OS-detection tool which gets workgroup, smbserver and OS\r
3 * works for all tested samba versions on different platforms \r
4 * like: macosx,aix,solaris,linux,bsd and all Windows platforms !\r
5 * below you can see some sample outputs:\r
6\r
7 * Windows 2003 gives me:\r
8 * Remote OS:\r
9 * ----------\r
10 * WINDOMAIN1\r
11 * Windows Server 2003 5.2\r
12 * Windows Server 2003 3790\r
13\r
14 * Windows NT gives me:\r
15 * Remote OS:\r
16 * ----------\r
17 * WINDOMAIN2\r
18 * NT LAN Manager 4.0\r
19 * Windows NT 4.0\r
20\r
21 * Windows 2k gives me:\r
22 * Remote OS:\r
23 * ----------\r
24 * WINDOMAIN3\r
25 * Windows 2000 LAN Manager\r
26 * Windows 5.0\r
27\r
28 * Windows XP gives me:\r
29 * Remote OS:\r
30 * ----------\r
31 * WINDOMAIN4\r
32 * Windows 2000 LAN Manager\r
33 * Windows 5.1\r
34\r
35 * Samba gives me:\r
36 * Remote OS:\r
37 * ----------\r
38 * SAMBADOMAIN1\r
39 * Samba 2.0.7\r
40 * Unix\r
41 *\r
42 * COMPILE:\r
43 *       cl THCsmbgetOS.c\r
44 *\r
45 * RUN:\r
46 *       C:\ccode\THCsmbgetOS>THCsmbgetOS.exe gnpctx01\r
47 *\r
48 * -------------------------------------------------------\r
49 *  THCsmbgetOS v0.1 - gets group, server and os via SMB\r
50 *      by Johnny Cyberpunk (jcyberpunk@thc.org)\r
51 * -------------------------------------------------------\r
52 *\r
53 * [*] Connecting Port 139....\r
54 * [*] Sending session request....\r
55 * [*] Sending negotiation request....\r
56 * [*] Sending setup account request....\r
57 * [*] Successful....\r
58 *\r
59 * Remote OS:\r
60 * ----------\r
61 * MYNTDOMAIN\r
62 * Windows Server 2003 5.2\r
63 * Windows Server 2003 3790\r
64 *\r
65 * Enjoy,\r
66 *\r
67 * http://www.thc.org\r
68 */\r
69 \r
70 #include <stdio.h>\r
71 #include <stdlib.h>\r
72 #include <string.h>\r
73 #include <winsock2.h>\r
74 \r
75 #pragma comment(lib, "ws2_32.lib")\r
76 \r
77 char sessionrequest[] =\r
78 "\x81\x00\x00\x44\x20\x43\x4b\x46\x44\x45\x4e\x45\x43\x46\x44\x45"\r
79 "\x46\x46\x43\x46\x47\x45\x46\x46\x43\x43\x41\x43\x41\x43\x41\x43"\r
80 "\x41\x43\x41\x43\x41\x00\x20\x45\x4b\x45\x44\x46\x45\x45\x49\x45"\r
81 "\x44\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43"\r
82 "\x41\x43\x41\x43\x41\x41\x41\x00";\r
83 \r
84 char negotiate[] =\r
85 "\x00\x00\x00\x2f\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x00\x00\x00"\r
86 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x02"\r
87 "\x00\x00\x00\x00\x00\x0c\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e"\r
88 "\x31\x32\x00";\r
89 \r
90 char setupaccount[] =\r
91 "\x00\x00\x00\x48\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x00\x00\x00"\r
92 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x02"\r
93 "\x00\x00\x00\x00\x0d\xff\x00\x00\x00\xff\xff\x02\x00\x5c\x02\x00"\r
94 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0b"\r
95 "\x00\x00\x00\x4a\x43\00\x41\x54\x54\x48\x43\x00";\r
96 \r
97 int main(int argc, char *argv[])\r
98 {  \r
99   unsigned short smbport=139;\r
100   unsigned char *infobuf;\r
101   unsigned int sock,addr,i;\r
102   int rc;\r
103   struct sockaddr_in smbtcp;\r
104   struct hostent * hp;\r
105   WSADATA wsaData;\r
106   unsigned int zeroc=0;\r
107 \r
108   printf("\n-------------------------------------------------------\n");\r
109   printf(" THCsmbgetOS v0.1 - gets group, server and os via SMB\n");\r
110   printf("       by Johnny Cyberpunk (jcyberpunk@thc.org)\n");\r
111   printf("-------------------------------------------------------\n");\r
112   \r
113   if(argc<2)\r
114   {\r
115    printf("gimme host or ip\n");\r
116    exit(-1);\r
117   }\r
118  \r
119   if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)\r
120   {\r
121    printf("WSAStartup failed !\n");\r
122    exit(-1);\r
123   }\r
124   \r
125   hp = gethostbyname(argv[1]);\r
126 \r
127   if (!hp){\r
128    addr = inet_addr(argv[1]);\r
129   }\r
130   if ((!hp)  && (addr == INADDR_NONE) )\r
131   {\r
132    printf("Unable to resolve %s\n",argv[1]);\r
133    exit(-1);\r
134   }\r
135 \r
136   sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
137   if (!sock)\r
138   { \r
139    printf("socket() error...\n");\r
140    exit(-1);\r
141   }\r
142   \r
143   if (hp != NULL)\r
144    memcpy(&(smbtcp.sin_addr),hp->h_addr,hp->h_length);\r
145   else\r
146    smbtcp.sin_addr.s_addr = addr;\r
147 \r
148   if (hp)\r
149    smbtcp.sin_family = hp->h_addrtype;\r
150   else\r
151    smbtcp.sin_family = AF_INET;\r
152 \r
153   smbtcp.sin_port=htons(smbport);\r
154  \r
155   infobuf=malloc(256);\r
156   memset(infobuf,0,256);\r
157 \r
158   printf("\n[*] Connecting Port 139....\n");\r
159  \r
160   rc=connect(sock, (struct sockaddr *) &smbtcp, sizeof (struct sockaddr_in));\r
161   if(rc==0)\r
162   {\r
163     printf("[*] Sending session request....\n");\r
164     send(sock,sessionrequest,sizeof(sessionrequest)-1,0);\r
165     Sleep(500);\r
166     rc=recv(sock,infobuf,256,0);\r
167     if(rc<0)\r
168     {\r
169         printf("error = %d (rc=%u)\n\n",WSAGetLastError(),rc);\r
170         return (-1);\r
171     }\r
172     memset(infobuf,0,256);\r
173     printf("[*] Sending negotiation request....\n");\r
174     send(sock,negotiate,sizeof(negotiate)-1,0);\r
175     Sleep(500);\r
176     rc=recv(sock,infobuf,256,0);\r
177     if(rc<0)\r
178     {\r
179      printf("error = %d (rc=%u)\n\n",WSAGetLastError(),rc);\r
180      return (-2);\r
181     }\r
182     memset(infobuf,0,256);\r
183     printf("[*] Sending setup account request....\n");\r
184     send(sock,setupaccount,sizeof(setupaccount)-1,0);\r
185     Sleep(500);\r
186     rc=recv(sock,infobuf,256,0);\r
187     if(rc<0)\r
188     {\r
189      printf("error = %d (rc=%u)\n\n",WSAGetLastError(),rc);\r
190      return (-3);\r
191     }\r
192     else if (rc==0)\r
193     {\r
194      printf("[*] Successful....\n");    \r
195      printf("\nRemote OS:\n");\r
196      printf("----------");\r
197      printf("\nI got back a null buffer ! WINXP sometimes does it\n");\r
198     } \r
199     else\r
200     {\r
201      printf("[*] Successful....\n");    \r
202      printf("\nRemote OS:\n");\r
203      printf("----------");\r
204      i=rc;\r
205      while ((--i>0)&&(zeroc<4)) \r
206      {\r
207       if (infobuf[i]==0x00)\r
208       {\r
209        printf("%s\n",(char *)&(infobuf[i+1]));\r
210        zeroc++;\r
211       }\r
212      }\r
213     }\r
214     \r
215     printf("\n\n");\r
216   }\r
217   else\r
218    printf("can't connect to smb port 139!\n");\r
219   \r
220   shutdown(sock,1);\r
221   closesocket(sock);\r
222   free(infobuf);\r
223   exit(0);\r
224 }\r