0
|
1 |
--- kcrap-0.2.3/test/Makefile.in 2007-12-13 15:52:14.000000000 -0500
|
|
2 |
+++ kcrap-0.2.3-patched/test/Makefile.in 2013-01-08 16:39:00.915926616 -0500
|
|
3 |
@@ -5,7 +5,7 @@
|
|
4 |
|
|
5 |
SRCS=kcraptest.c
|
|
6 |
|
|
7 |
-all: test-ntlm test-ntlmv2 test-ntlmv2s
|
|
8 |
+all: test-ntlm test-ntlmv2 test-ntlmv2s kcrapclient
|
|
9 |
|
|
10 |
test-ntlm: $(SRCS)
|
|
11 |
$(CC) -o $@ $(CFLAGS) -DT_NTLM $(SRCS) $(LDFLAGS) $(LIBS)
|
|
12 |
@@ -16,10 +16,13 @@
|
|
13 |
test-ntlmv2s: $(SRCS)
|
|
14 |
$(CC) -o $@ $(CFLAGS) -DT_NTLM2S $(SRCS) $(LDFLAGS) $(LIBS)
|
|
15 |
|
|
16 |
+kcrapclient: kcrapclient.c
|
|
17 |
+ $(CC) -o $@ $(CFLAGS) kcrapclient.c $(LDFLAGS) $(LIBS)
|
|
18 |
+
|
|
19 |
install:
|
|
20 |
|
|
21 |
clean:
|
|
22 |
- rm -f *.o *~ test-ntlm test-ntlmv2 test-ntlmv2s
|
|
23 |
+ rm -f *.o *~ test-ntlm test-ntlmv2 test-ntlmv2s kcrapclient
|
|
24 |
|
|
25 |
distclean: clean
|
|
26 |
rm -f Makefile
|
|
27 |
--- kcrap-0.2.3/test/kcrapclient.c 1969-12-31 19:00:00.000000000 -0500
|
|
28 |
+++ kcrap-0.2.3-patched/test/kcrapclient.c 2012-12-02 22:12:14.000000000 -0500
|
|
29 |
@@ -0,0 +1,130 @@
|
|
30 |
+/*
|
|
31 |
+ * Little KCRAP client based on kcraptest.c
|
|
32 |
+ * from http://www.spock.org/kcrap/
|
|
33 |
+ */
|
|
34 |
+
|
|
35 |
+/*
|
|
36 |
+ * Test KCRAP server with known challange/response pairs
|
|
37 |
+ * from http://davenport.sourceforge.net/ntlm.html
|
|
38 |
+ */
|
|
39 |
+
|
|
40 |
+#include <stdio.h>
|
|
41 |
+#include <string.h>
|
|
42 |
+#include <unistd.h>
|
|
43 |
+#include <stdlib.h>
|
|
44 |
+#include <sys/types.h>
|
|
45 |
+#include <sys/socket.h>
|
|
46 |
+#include <netinet/in.h>
|
|
47 |
+#include <arpa/inet.h>
|
|
48 |
+#include <netdb.h>
|
|
49 |
+#include <string.h>
|
|
50 |
+#include <strings.h>
|
|
51 |
+#include <errno.h>
|
|
52 |
+#include <time.h>
|
|
53 |
+#include <poll.h>
|
|
54 |
+
|
|
55 |
+#include "../config.h"
|
|
56 |
+#include "kcrap.h"
|
|
57 |
+
|
|
58 |
+// #define OSTREAM stderr
|
|
59 |
+#define OSTREAM stdout
|
|
60 |
+
|
|
61 |
+#define SDATA(VAR,VAL) (VAR).data = (VAL), (VAR).length = strlen((VAR).data)
|
|
62 |
+
|
|
63 |
+static int fillhex(char *dst, char *src) {
|
|
64 |
+ int i = 0;
|
|
65 |
+ char tb[3];
|
|
66 |
+ tb[2] = 0;
|
|
67 |
+ for (i = 0; i*2 < strlen(src); i++) {
|
|
68 |
+ memcpy(tb, src+(i*2), 2);
|
|
69 |
+ if ((!isxdigit(tb[0])) || (!isxdigit(tb[1]))) return -1;
|
|
70 |
+ dst[i] = strtol(tb, NULL, 16);
|
|
71 |
+ }
|
|
72 |
+ return 0;
|
|
73 |
+}
|
|
74 |
+
|
|
75 |
+int main(int argc, char* argv[]) {
|
|
76 |
+ struct kcrap_context *context;
|
|
77 |
+ struct kcrap_auth_req_data req;
|
|
78 |
+ int ret;
|
|
79 |
+ char schal[8];
|
|
80 |
+ char cchal[130];
|
|
81 |
+ char resp[24];
|
|
82 |
+ int auth_status;
|
|
83 |
+
|
|
84 |
+ if (argc != 4) {
|
|
85 |
+ fprintf(OSTREAM, "Error: Invalid parameters...\n");
|
|
86 |
+ fprintf(OSTREAM, "Usage: %s <username> <challenge> <response>\n", argv[0]);
|
|
87 |
+ exit(1);
|
|
88 |
+ }
|
|
89 |
+
|
|
90 |
+ if (strlen(argv[2]) != 16) {
|
|
91 |
+ fprintf(OSTREAM, "Erroe: Invalid challenge length.\n");
|
|
92 |
+ exit(1);
|
|
93 |
+ }
|
|
94 |
+
|
|
95 |
+ if (strlen(argv[3]) != 48) {
|
|
96 |
+ fprintf(OSTREAM, "Error: Invalid response length.\n");
|
|
97 |
+ exit(1);
|
|
98 |
+ }
|
|
99 |
+
|
|
100 |
+ bzero(&req, sizeof(req));
|
|
101 |
+ bzero(&schal, sizeof(schal));
|
|
102 |
+ bzero(&cchal, sizeof(cchal));
|
|
103 |
+ bzero(&resp, sizeof(resp));
|
|
104 |
+ SDATA(req.chal_type, "NTLM");
|
|
105 |
+
|
|
106 |
+ // SDATA(req.principal, "user");
|
|
107 |
+ req.principal.data = argv[1];
|
|
108 |
+ req.principal.length = strlen(argv[1]);
|
|
109 |
+
|
|
110 |
+ req.server_challenge.length = 8;
|
|
111 |
+ req.server_challenge.data = schal;
|
|
112 |
+ // FILL(schal, "0123456789abcdef");
|
|
113 |
+ if (fillhex(schal, argv[2])) {
|
|
114 |
+ fprintf(OSTREAM, "Error: Invalid challenge string.\n");
|
|
115 |
+ exit(1);
|
|
116 |
+ }
|
|
117 |
+
|
|
118 |
+ req.response.length = 24;
|
|
119 |
+ req.response.data = resp;
|
|
120 |
+ // FILL(resp, "25a98c1c31e81847466b29b2df4680f39958fb8c213a9cc6");
|
|
121 |
+ if (fillhex(resp, argv[3])) {
|
|
122 |
+ fprintf(OSTREAM, "Error: Invalid response string.\n");
|
|
123 |
+ exit(1);
|
|
124 |
+ }
|
|
125 |
+
|
|
126 |
+ context = kcrap_init(NULL, NULL);
|
|
127 |
+ if (context == NULL) {
|
|
128 |
+ fprintf(OSTREAM, "Error: %s\n", kcrap_errmsg());
|
|
129 |
+ exit(1);
|
|
130 |
+ }
|
|
131 |
+
|
|
132 |
+ ret = kcrap_try(context, &req, &auth_status);
|
|
133 |
+ if (ret != 0) {
|
|
134 |
+ fprintf(OSTREAM, "Error: %s\n", kcrap_errmsg());
|
|
135 |
+ } else if (auth_status == 0) {
|
|
136 |
+ fprintf(OSTREAM, "Error: %s\n", kcrap_errmsg());
|
|
137 |
+ } else {
|
|
138 |
+ // fprintf(OSTREAM, "Authentication OK\n");
|
|
139 |
+
|
|
140 |
+ struct kcrap_data extra = kcrap_get_extra_data();
|
|
141 |
+
|
|
142 |
+ // echo "NT_KEY: 68ba2d7c88299a123457f6b11c97772f"
|
|
143 |
+
|
|
144 |
+ printf("NT_KEY: ");
|
|
145 |
+
|
|
146 |
+ int my_cnt = 0;
|
|
147 |
+ while (my_cnt < extra.length) printf("%02x", (unsigned char)extra.data[my_cnt++]);
|
|
148 |
+
|
|
149 |
+ printf("\n");
|
|
150 |
+
|
|
151 |
+ // Cancelliamo la chiave (md4(key21)) puntato dalla struttura "extra"
|
|
152 |
+ if (extra.length) {
|
|
153 |
+ memset(extra.data, 0, extra.length);
|
|
154 |
+ }
|
|
155 |
+ }
|
|
156 |
+
|
|
157 |
+ kcrap_free(context);
|
|
158 |
+ exit((ret!=0) || (auth_status==0));
|
|
159 |
+}
|