"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;
|