32 fprintf(stderr,
"flags: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
73 if (memcmp(hdr->
signature,
"NTLMSSP", 8) != 0) {
74 fprintf(stderr,
"ntlmCheckHeader: bad header signature\n");
82 debug(
"ntlm_validate_packet: type is %d, wanted %d\n",
le32toh(hdr->
type), type);
112 debug(
"ntlm_fetch_string: insane string length (pkt-sz: %d, fetch len: %d, offset: %d)\n", packet_size,l,o);
115 else if (o <= 0 || o > packet_size) {
116 debug(
"ntlm_fetch_string: insane string offset (pkt-sz: %d, fetch len: %d, offset: %d)\n", packet_size,l,o);
119 else if (l > packet_size - o) {
120 debug(
"ntlm_fetch_string: truncated string data (pkt-sz: %d, fetch len: %d, offset: %d)\n", packet_size,l,o);
124 rv.
str = (
char *)packet + o;
128 unsigned short *s = (
unsigned short *)rv.
str;
131 for (uint32_t len = (l>>1); len; ++s, --len) {
133 if (c > 254 || c ==
'\0') {
134 fprintf(stderr,
"ntlmssp: bad unicode: %04x\n", c);
137 *d =
static_cast<char>(c&0xFF);
145 for (; l>0; ++sc, --l) {
146 const auto c =
static_cast<unsigned char>(*sc);
148 fprintf(stderr,
"ntlmssp: bad ascii: %04x\n", c);
170 const uint16_t toadd_length)
172 int l = (*payload_length);
173 memcpy(payload + l, toadd, toadd_length);
177 const off_t o = l +
reinterpret_cast<const ntlmhdr *
>(payload) - packet_hdr;
179 (*payload_length) += toadd_length;
198 static std::mt19937 mt(time(
nullptr));
199 static std::uniform_int_distribution<uint8_t> dist;
202 nonce[i] =
static_cast<char>(dist(mt) & 0xFF);
211 const char *domain,
const char *,
212 const char *challenge_nonce,
const int challenge_nonce_len,
213 const uint32_t flags)
219 if (domain !=
nullptr) {
222 const uint16_t dlen = strlen(domain) & 0xFFFF;
228 memcpy(ch->
challenge, challenge_nonce, challenge_nonce_len);
252 fprintf(stderr,
"ntlm_unpack_auth: header check fails\n");
255 debug(
"ntlm_unpack_auth: size of %d\n",
size);
266 debug(
"ntlm_unpack_auth: Domain length %d too big for %d byte packet.\n", rv.
l,
size);
271 memcpy(domain, rv.
str, dcopy);
272 domain[dcopy] =
'\0';
273 debug(
"ntlm_unpack_auth: Domain '%s' (len=%zu).\n", domain, dcopy);
280 debug(
"ntlm_unpack_auth: Username length %d too big for %d byte packet.\n", rv.
l,
size);
285 memcpy(user, rv.
str, ucopy);
287 debug(
"ntlm_unpack_auth: Username '%s' (len=%zu).\n", user, ucopy);
void debug(const char *format,...)
NtlmError ntlm_unpack_auth(const ntlm_authenticate *auth, char *user, char *domain, const int32_t size)
NtlmError ntlm_validate_packet(const ntlmhdr *hdr, const int32_t type)
void ntlm_make_challenge(ntlm_challenge *ch, const char *domain, const char *, const char *challenge_nonce, const int challenge_nonce_len, const uint32_t flags)
void ntlm_dump_ntlmssp_flags(uint32_t flags)
lstring ntlm_fetch_string(const ntlmhdr *packet, const int32_t packet_size, const strhdr *str, const uint32_t flags)
void ntlm_add_to_payload(const ntlmhdr *packet_hdr, char *payload, int *payload_length, strhdr *hdr, const char *toadd, const uint16_t toadd_length)
void ntlm_make_nonce(char *nonce)
#define NTLM_REQUEST_ACCEPT_RESPONSE
#define NTLM_MAX_FIELD_LENGTH
#define NTLM_REQUEST_NON_NT_SESSION_KEY
#define NTLM_NEGOTIATE_REQUEST_SEAL
#define NTLM_AUTHENTICATE
#define NTLM_NEGOTIATE_UNICODE
#define NTLM_NEGOTIATE_DOMAIN_SUPPLIED
#define NTLM_NEGOTIATE_REQUEST_TARGET
#define NTLM_NEGOTIATE_USE_NTLM
#define NTLM_NEGOTIATE_USE_NETWARE
#define NTLM_NEGOTIATE_REQUEST_SIGN
#define NTLM_NEGOTIATE_DATAGRAM_STYLE
#define NTLM_NEGOTIATE_USE_LM
#define NTLM_CHALLENGE_TARGET_IS_SHARE
#define NTLM_NEGOTIATE_THIS_IS_LOCAL_CALL
#define NTLM_NEGOTIATE_ASCII
#define NTLM_CHALLENGE_TARGET_IS_SERVER
#define NTLM_REQUEST_INIT_RESPONSE
#define NTLM_NEGOTIATE_WORKSTATION_SUPPLIED
#define NTLM_CHALLENGE_TARGET_IS_DOMAIN
#define NTLM_NEGOTIATE_ALWAYS_SIGN
u_char challenge[NTLM_NONCE_LEN]