tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
72 lines (67 loc) • 3.05 kB
JavaScript
"use strict";
const NTLMFlags = {
NTLM_NegotiateUnicode: 0x00000001,
NTLM_NegotiateOEM: 0x00000002,
NTLM_RequestTarget: 0x00000004,
NTLM_Unknown9: 0x00000008,
NTLM_NegotiateSign: 0x00000010,
NTLM_NegotiateSeal: 0x00000020,
NTLM_NegotiateDatagram: 0x00000040,
NTLM_NegotiateLanManagerKey: 0x00000080,
NTLM_Unknown8: 0x00000100,
NTLM_NegotiateNTLM: 0x00000200,
NTLM_NegotiateNTOnly: 0x00000400,
NTLM_Anonymous: 0x00000800,
NTLM_NegotiateOemDomainSupplied: 0x00001000,
NTLM_NegotiateOemWorkstationSupplied: 0x00002000,
NTLM_Unknown6: 0x00004000,
NTLM_NegotiateAlwaysSign: 0x00008000,
NTLM_TargetTypeDomain: 0x00010000,
NTLM_TargetTypeServer: 0x00020000,
NTLM_TargetTypeShare: 0x00040000,
NTLM_NegotiateExtendedSecurity: 0x00080000,
NTLM_NegotiateIdentify: 0x00100000,
NTLM_Unknown5: 0x00200000,
NTLM_RequestNonNTSessionKey: 0x00400000,
NTLM_NegotiateTargetInfo: 0x00800000,
NTLM_Unknown4: 0x01000000,
NTLM_NegotiateVersion: 0x02000000,
NTLM_Unknown3: 0x04000000,
NTLM_Unknown2: 0x08000000,
NTLM_Unknown1: 0x10000000,
NTLM_Negotiate128: 0x20000000,
NTLM_NegotiateKeyExchange: 0x40000000,
NTLM_Negotiate56: 0x80000000
};
function createNTLMRequest(options) {
const domain = escape(options.domain.toUpperCase());
const workstation = options.workstation ? escape(options.workstation.toUpperCase()) : '';
let type1flags = NTLMFlags.NTLM_NegotiateUnicode + NTLMFlags.NTLM_NegotiateOEM + NTLMFlags.NTLM_RequestTarget + NTLMFlags.NTLM_NegotiateNTLM + NTLMFlags.NTLM_NegotiateOemDomainSupplied + NTLMFlags.NTLM_NegotiateOemWorkstationSupplied + NTLMFlags.NTLM_NegotiateAlwaysSign + NTLMFlags.NTLM_NegotiateVersion + NTLMFlags.NTLM_NegotiateExtendedSecurity + NTLMFlags.NTLM_Negotiate128 + NTLMFlags.NTLM_Negotiate56;
if (workstation === '') {
type1flags -= NTLMFlags.NTLM_NegotiateOemWorkstationSupplied;
}
const fixedData = Buffer.alloc(40);
const buffers = [fixedData];
let offset = 0;
offset += fixedData.write('NTLMSSP', offset, 7, 'ascii');
offset = fixedData.writeUInt8(0, offset);
offset = fixedData.writeUInt32LE(1, offset);
offset = fixedData.writeUInt32LE(type1flags, offset);
offset = fixedData.writeUInt16LE(domain.length, offset);
offset = fixedData.writeUInt16LE(domain.length, offset);
offset = fixedData.writeUInt32LE(fixedData.length + workstation.length, offset);
offset = fixedData.writeUInt16LE(workstation.length, offset);
offset = fixedData.writeUInt16LE(workstation.length, offset);
offset = fixedData.writeUInt32LE(fixedData.length, offset);
offset = fixedData.writeUInt8(5, offset);
offset = fixedData.writeUInt8(0, offset);
offset = fixedData.writeUInt16LE(2195, offset);
offset = fixedData.writeUInt8(0, offset);
offset = fixedData.writeUInt8(0, offset);
offset = fixedData.writeUInt8(0, offset);
fixedData.writeUInt8(15, offset);
buffers.push(Buffer.from(workstation, 'ascii'));
buffers.push(Buffer.from(domain, 'ascii'));
return Buffer.concat(buffers);
}
module.exports.createNTLMRequest = createNTLMRequest;