MeshCentral/agents/meshcmd.js

569 lines
420 KiB
JavaScript
Raw Normal View History

2017-10-31 19:19:58 -04:00
var fs = require('fs');
var os = require('os');
var net = require('net');
var http = require('http');
var dgram = require('dgram');
var httpHeaders = require('http-headers');
var tcpserver = null;
var broadcastSockets = {};
var multicastSockets = {};
var discoveryInterval = null;
var membershipIPv4 = '239.255.255.235';
var membershipIPv6 = 'FF02:0:0:0:0:0:0:FE';
var settings = null;
var meshCmdVersion = '***Mesh*Cmd*Version***';
var amtLms = null, amtMei = null, amtMeiState = null;
// MeshCommander for Firmware (GZIP'ed, Base64)
var Small_IntelAmtWebApp = "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
var Medium_IntelAmtWebApp = "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
var Large_IntelAmtWebApp = "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
2017-10-31 19:19:58 -04:00
2018-01-02 19:52:49 -05:00
2017-10-31 19:19:58 -04:00
/*
// Route Settings
var settings = {
action: 'route',
localPort: 1234,
remoteName: 'AmtMachine7',
remoteNodeId: 'node//nmiPnDhT3vHKu$zg296YC5RjK53Trgh3Cimx3K8GVrFh$xch0UAAett2rbJpeddc',
remotePort: 3389,
username: 'a',
password: 'a',
serverUrl: 'wss://devbox.mesh.meshcentral.com:443/meshrelay.ashx',
serverId: 'D99362D5ED8BAEA8BF9E743B34B242256370C460FD66CB62373C6CFCB204D6D707403E396CF0EF6DC2B3A42F735135FD', // SHA384 of server HTTPS public key
serverHttpsHash: 'D9DE9E27A229B5355708A3672FB23237CC994A680B3570D242A91E36B4AE5BC9', // SHA256 of server HTTPS certificate
debugLevel: 0
}
*/
// Check the server certificate fingerprint
function onVerifyServer(clientName, certs) {
try { for (var i in certs) { if (certs[i].fingerprint.replace(/:/g, '') == settings.serverHttpsHash) { return; } } } catch (e) { }
if (serverhash != null) { console.log('Error: Failed to verify server certificate.'); throw 'Invalid server certificate'; }
2017-10-31 19:19:58 -04:00
}
// Print a debug message
function debug(level, message) { if ((settings.debugLevel != null) && (settings.debugLevel >= level)) { console.log(message); } }
function exit(status) { if (status == null) { status = 0; } try { process.exit(status); } catch (e) { } }
2017-10-31 19:19:58 -04:00
2017-11-02 21:44:27 -04:00
// Parse the input arguments into an object
function parceArguments(argv) {
var r = {};
for (var i in argv) {
i = parseInt(i);
if (argv[i].startsWith('--') == true) {
var key = argv[i].substring(2).toLowerCase(), val = true;
if (((i + 1) < argv.length) && (argv[i + 1].startsWith('--') == false)) { val = argv[i + 1]; }
r[key] = val;
}
}
return r;
}
2017-10-31 19:19:58 -04:00
// Start the router, start by listening to the local port
function run(argv) {
if (meshCmdVersion[0] == '*') { meshCmdVersion = ''; } else { meshCmdVersion = ' v' + meshCmdVersion; }
2017-11-02 21:44:27 -04:00
var args = parceArguments(argv);
console.log('MeshCentral Command' + meshCmdVersion);
//console.log('addedModules = ' + JSON.stringify(addedModules));
2017-10-31 19:19:58 -04:00
var actionpath = 'meshaction.txt';
2017-11-02 21:44:27 -04:00
if (args.actionfile != null) { actionpath = args.actionfile; }
2018-01-02 19:52:49 -05:00
var actions = ['ROUTE', 'AMTLMS', 'AMTLOADWEBAPP', 'AMTLOADSMALLWEBAPP', 'AMTLOADLARGEWEBAPP', 'AMTCLEARWEBAPP', 'AMTSTORAGESTATE', 'MEINFO', 'MEVERSIONS', 'MEHASHES', 'AMTSAVESTATE'];
2017-10-31 19:19:58 -04:00
// Load the action file
var actionfile = null;
try { actionfile = fs.readFileSync(actionpath); } catch (e) { }
if ((actionpath != 'meshaction.txt') && (actionfile == null)) { console.log('Unable to load \"' + actionpath + '\". Create this file or specify the location using --actionfile [filename].'); exit(1); return; }
if (actionfile != null) { try { settings = JSON.parse(actionfile); } catch (e) { console.log(actionpath, e); exit(1); return; } } else { if (argv.length >= 2) { settings = { action: argv[1] } } }
2017-12-15 16:43:04 -05:00
if (settings == null) { settings = {}; }
2017-10-31 19:19:58 -04:00
2017-11-02 21:44:27 -04:00
// Set the arguments
2017-12-15 16:43:04 -05:00
if ((typeof args.action) == 'string') { settings.action = args.action; }
2017-11-02 21:44:27 -04:00
if ((typeof args.localport) == 'string') { settings.localport = parseInt(args.localport); }
if ((typeof args.remotenodeid) == 'string') { settings.remoteNodeId = args.remotenodeid; }
if ((typeof args.username) == 'string') { settings.username = args.username; }
if ((typeof args.password) == 'string') { settings.password = args.password; }
if ((typeof args.user) == 'string') { settings.username = args.user; }
if ((typeof args.pass) == 'string') { settings.password = args.pass; }
if ((typeof args.host) == 'string') { settings.hostname = args.host; }
if ((typeof args.hostname) == 'string') { settings.hostname = args.hostname; }
2017-11-02 21:44:27 -04:00
if ((typeof args.serverid) == 'string') { settings.serverId = args.serverid; }
if ((typeof args.serverhttpshash) == 'string') { settings.serverHttpsHash = args.serverhttpshash; }
if ((typeof args.remoteport) == 'string') { settings.remotePort = parseInt(args.remoteport); }
if ((typeof args.debug) == 'string') { settings.debugLevel = parseInt(args.debug); }
2017-12-15 16:43:04 -05:00
if ((argv.length > 1) && (actions.indexOf(argv[1].toUpperCase()) >= 0)) { settings.action = argv[1]; }
2017-11-02 21:44:27 -04:00
2017-10-31 19:19:58 -04:00
// Validate meshaction.txt
2017-12-15 16:43:04 -05:00
if (settings.action == null) { console.log('No action specified, valid actions are ' + actions.join(', ') + '.'); exit(1); return; }
2017-10-31 19:19:58 -04:00
settings.action = settings.action.toLowerCase();
debug(1, "Settings: " + JSON.stringify(settings));
if (settings.action == 'route') { // MeshCentral Router
if ((settings.localPort == null) || (typeof settings.localPort != 'number') || (settings.localPort < 0) || (settings.localPort > 65535)) { console.log('No or invalid \"localPort\" specified, use --localport [localport].'); exit(1); return; }
if ((settings.remoteNodeId == null) || (typeof settings.remoteNodeId != 'string')) { console.log('No or invalid \"remoteNodeId\" specified.'); exit(1); return; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { console.log('No or invalid \"username\" specified, use --username [username].'); exit(1); return; }
if ((settings.password == null) || (typeof settings.password != 'string') || (settings.password == '')) { console.log('No or invalid \"password\" specified, use --password [password].'); exit(1); return; }
if ((settings.serverId == null) || (typeof settings.serverId != 'string') || (settings.serverId.length != 96)) { console.log('No or invalid \"serverId\" specified.'); exit(1); return; }
if ((settings.serverHttpsHash == null) || (typeof settings.serverHttpsHash != 'string') || (settings.serverHttpsHash.length != 96)) { console.log('No or invalid \"serverHttpsHash\" specified.'); exit(1); return; }
if ((settings.remotePort == null) || (typeof settings.remotePort != 'number') || (settings.remotePort < 0) || (settings.remotePort > 65535)) { console.log('No or invalid \"remotePort\" specified, use --remoteport [remoteport].'); exit(1); return; }
if (settings.serverUrl != null) { startRouter(); } else { discoverMeshServer(); } // Start MeshCentral Router
}
2017-12-15 16:43:04 -05:00
else if ((settings.action == 'amtloadwebapp') || (settings.action == 'amtloadsmallwebapp') || (settings.action == 'amtloadlargewebapp') || (settings.action == 'amtclearwebapp') || (settings.action == 'amtstoragestate')) { // Intel AMT Web Application Actions
if ((settings.password == null) || (typeof settings.password != 'string') || (settings.password == '')) { console.log('No or invalid \"password\" specified, use --password [password].'); exit(1); return; }
if ((settings.hostname == null) || (typeof settings.hostname != 'string') || (settings.hostname == '')) { settings.hostname = '127.0.0.1'; }
if ((settings.username == null) || (typeof settings.username != 'string') || (settings.username == '')) { settings.username = 'admin'; }
settings.protocol = 'http:';
settings.localport = 16992;
debug(1, "Settings: " + JSON.stringify(settings));
digest = require('http-digest').create(settings.username, settings.password);
digest.http = require('http');
2017-12-15 16:43:04 -05:00
if (settings.action == 'amtstoragestate') {
getAmtStorage(function (statusCode, data) { if (statusCode == 200) { console.log("Storage State: " + JSON.stringify(data, null, 2)); exit(); return; } else { console.log("Unable to read storage state."); exit(); return; } });
} else {
2017-12-15 16:43:04 -05:00
if (settings.action == 'amtloadwebapp') { settings.webapp = Medium_IntelAmtWebApp; }
else if (settings.action == 'amtloadsmallwebapp') { settings.webapp = Small_IntelAmtWebApp; }
else if (settings.action == 'amtloadlargewebapp') { settings.webapp = Large_IntelAmtWebApp; }
else if (settings.action == 'amtclearwebapp') { settings.webapp = null; }
nextStepStorageUpload();
}
} else if ((settings.action == 'meversion') || (settings.action == 'meversions') || (settings.action == 'mever')) {
var amtMeiModule = require('amt_heci');
var amtMei = new amtMeiModule();
amtMei.on('error', function (e) { console.log(e); exit(1); return; });
amtMei.on('connect', function () {
this.getVersion(function (val) {
console.log("MEI Version = " + val.BiosVersion.toString());
for (var version in val.Versions) { console.log(val.Versions[version].Description + " = " + val.Versions[version].Version); }
exit(1); return;
});
});
} else if (settings.action == 'mehashes') {
var amtMeiModule = require('amt_heci');
var amtMei = new amtMeiModule();
amtMei.on('error', function (e) { console.log(e); exit(1); return; });
amtMei.on('connect', function () {
this.getHashHandles(function (handles) {
exitOnCount = handles.length;
for (var i = 0; i < handles.length; ++i) {
this.getCertHashEntry(handles[i], function (result) {
2017-12-15 16:43:04 -05:00
console.log('----------\r\n' + result.name + ', (' + (result.isDefault ? 'Default' : '') + (result.isActive ? ', Active' : ', Disabled') + ')\r\n' + result.hashAlgorithmStr + ': ' + result.certificateHash);
if (--exitOnCount == 0) { console.log('----------'); exit(1); }
});
}
});
});
} else if (settings.action == 'meinfo') {
var amtMeiModule = require('amt_heci');
var amtMei = new amtMeiModule();
amtMei.on('error', function (e) { console.log(e); exit(1); return; });
amtMei.on('connect', function () {
mestate = {};
this.getVersion(function (val) { for (var version in val.Versions) { if (val.Versions[version].Description == 'AMT') { mestate.ver = val.Versions[version].Version; } } });
this.getProvisioningState(function (result) { mestate.ProvisioningState = result; });
this.getProvisioningMode(function (result) { mestate.ProvisioningMode = result; });
this.getEHBCState(function (result) { mestate.ehbc = result; });
this.getControlMode(function (result) { mestate.controlmode = result; });
this.getMACAddresses(function (result) { mestate.mac = result; });
this.getDnsSuffix(function (result) {
mestate.dns = result;
var str = 'Intel AMT v' + mestate.ver;
2017-12-15 16:43:04 -05:00
if (mestate.ProvisioningState.stateStr == 'PRE') { str += ', pre-provisioning state'; }
else if (mestate.ProvisioningState.stateStr == 'IN') { str += ', in-provisioning state'; }
else if (mestate.ProvisioningState.stateStr == 'POST') { if (mestate.ProvisioningMode.modeStr == 'ENTERPRISE') { str += ', activated in ' + ["none", "client control mode", "admin control mode", "remote assistance mode"][mestate.controlmode.controlMode]; } else { str += ', activated in ' + mestate.ProvisioningMode.modeStr; } }
if (mestate.ehbc.EHBC == true) { str += ', EHBC enabled'; }
console.log(str + '.');
exit(1);
});
});
2018-01-02 19:52:49 -05:00
} else if (settings.action == 'amtsavestate') {
saveEntireAmtState();
2017-12-15 16:43:04 -05:00
} else if (settings.action == 'amtlms') {
startLms();
2017-10-31 19:19:58 -04:00
} else {
console.log('Invalid \"action\" specified.'); exit(1); return;
2017-10-31 19:19:58 -04:00
}
}
2017-10-31 19:19:58 -04:00
2018-01-02 19:52:49 -05:00
// Save the entire Intel AMT state
function saveEntireAmtState() {
console.log('Fetching Intel AMT state...');
var transport = require('amt-wsman-duk-0.2.0');
var wsman = require('amt-wsman-0.2.0');
var amt = require('amt-0.2.0');
wsstack = new wsman(transport, "localhost", 16992, 'admin', 'P@ssw0rd', false);
amtstack = new amt(wsstack);
//amtstack.onProcessChanged = onWsmanProcessChanged;
//amtstack.BatchEnum(null, ['*AMT_GeneralSettings', '*IPS_HostBasedSetupService'], onWsmanResponse);
var AllWsman = "AMT_8021xCredentialContext,AMT_8021XProfile,AMT_ActiveFilterStatistics,AMT_AgentPresenceCapabilities,AMT_AgentPresenceInterfacePolicy,AMT_AgentPresenceService,AMT_AgentPresenceWatchdog,AMT_AgentPresenceWatchdogAction,AMT_AlarmClockService,IPS_AlarmClockOccurrence,AMT_AssetTable,AMT_AssetTableService,AMT_AuditLog,AMT_AuditPolicyRule,AMT_AuthorizationService,AMT_BootCapabilities,AMT_BootSettingData,AMT_ComplexFilterEntryBase,AMT_CRL,AMT_CryptographicCapabilities,AMT_EACCredentialContext,AMT_EndpointAccessControlService,AMT_EnvironmentDetectionInterfacePolicy,AMT_EnvironmentDetectionSettingData,AMT_EthernetPortSettings,AMT_EventLogEntry,AMT_EventManagerService,AMT_EventSubscriber,AMT_FilterEntryBase,AMT_FilterInSystemDefensePolicy,AMT_GeneralSettings,AMT_GeneralSystemDefenseCapabilities,AMT_Hdr8021Filter,AMT_HeuristicPacketFilterInterfacePolicy,AMT_HeuristicPacketFilterSettings,AMT_HeuristicPacketFilterStatistics,AMT_InterfacePolicy,AMT_IPHeadersFilter,AMT_KerberosSettingData,AMT_ManagementPresenceRemoteSAP,AMT_MessageLog,AMT_MPSUsernamePassword,AMT_NetworkFilter,AMT_NetworkPortDefaultSystemDefensePolicy,AMT_NetworkPortSystemDefenseCapabilities,AMT_NetworkPortSystemDefensePolicy,AMT_PCIDevice,AMT_PETCapabilities,AMT_PETFilterForTarget,AMT_PETFilterSetting,AMT_ProvisioningCertificateHash,AMT_PublicKeyCertificate,AMT_PublicKeyManagementCapabilities,AMT_PublicKeyManagementService,AMT_PublicPrivateKeyPair,AMT_RedirectionService,AMT_RemoteAccessCapabilities,AMT_RemoteAccessCredentialContext,AMT_RemoteAccessPolicyAppliesToMPS,AMT_RemoteAccessPolicyRule,AMT_RemoteAccessService,AMT_SetupAndConfigurationService,AMT_SNMPEventSubscriber,AMT_StateTransitionCondition,AMT_SystemDefensePolicy,AMT_SystemDefensePolicyInService,AMT_SystemDefenseService,AMT_SystemPowerScheme,AMT_ThirdPartyDataStorageAdministrationService,AMT_ThirdPartyDataStorageService,AMT_TimeSynchronizationService,AMT_TLSCredentialContext,AMT_TLSProtocolEndpoint,AMT_TLSProtocolEndpointCollection,AMT_TLSSettingData,AMT_TrapTargetForService,AMT_UserInitiatedConnectionService,AMT_WebUIService,AMT_WiFiPortConfigurationService,CIM_AbstractIndicationSubscription,CIM_Account,CIM_AccountManagementCapabilities,CIM_AccountManagementService,CIM_AccountOnSystem,CIM_AdminDomain,CIM_AlertIndication,CIM_AssignedIdentity,CIM_AssociatedPowerManagementService,CIM_AuthenticationService,CIM_AuthorizationService,CIM_BIOSElement,CIM_BIOSFeature,CIM_BIOSFeatureBIOSElements,CIM_BootConfigSetting,CIM_BootService,CIM_BootSettingData,CIM_BootSourceSetting,CIM_Capabilities,CIM_Card,CIM_Chassis,CIM_Chip,CIM_Collection,CIM_Component,CIM_ComputerSystem,CIM_ComputerSystemPackage,CIM_ConcreteComponent,CIM_ConcreteDependency,CIM_Controller,CIM_CoolingDevice,CIM_Credential,CIM_CredentialContext,CIM_CredentialManagementService,CIM_Dependency,CIM_DeviceSAPImplementation,CIM_ElementCapabilities,CIM_ElementConformsToProfile,CIM_ElementLocation,CIM_ElementSettingData,CIM_ElementSoftwareIdentity,CIM_ElementStatisticalData,CIM_EnabledLogicalElement,CIM_EnabledLogicalElementCapabilities,CIM_EthernetPort,CIM_Fan,CIM_FilterCollection,CIM_FilterCollectionSubscription,CIM_HostedAccessPoint,CIM_HostedDependency,CIM_HostedService,CIM_Identity,CIM_IEEE8021xCapabilities,CIM_IEEE8021xSettings,CIM_Indication,CIM_IndicationService,CIM_InstalledSoftwareIdentity,CIM_KVMRedirectionSAP,CIM_LANEndpoint,CIM_ListenerDestination,CIM_ListenerDestinationWSManagement,CIM_Location,CIM_Log,CIM_LogEntry,CIM_LogicalDevice,CIM_LogicalElement,CIM_LogicalPort,CIM_LogicalPortCapabilities,CIM_LogManagesRecord,CIM_ManagedCredential,CIM_ManagedElement,CIM_ManagedSystemElement,CIM_MediaAccessDevice,CIM_MemberOfCollection,CIM_Memory,CIM_MessageLog,CIM_NetworkPort,CIM_NetworkPortCapabilities,CIM_NetworkPortConfigurationService,CIM_OrderedComponent,CIM_OwningCollectionElement,CIM_OwningJobElement,CIM_PCIController,CIM_PhysicalComponent,CIM_PhysicalElement,CIM_PhysicalElementLocation,CIM_PhysicalFrame,CIM_PhysicalMemory,CIM_PhysicalPackage,CIM_Policy,CIM_PolicyAction,CIM_PolicyCondition,CIM_PolicyInSystem,CIM_PolicyRule,CIM_PolicyR
IntelAmtEntireStateCalls = 3;
IntelAmtEntireState = { 'localtime': Date(), 'utctime': new Date().toUTCString(), 'isotime': new Date().toISOString() };
amtstack.BatchEnum(null, AllWsman, saveEntireAmtStateOk2, null, true);
amtstack.GetAuditLog(saveEntireAmtStateOk3);
amtstack.GetMessageLog(saveEntireAmtStateOk4);
//exit(1);
}
//function onWsmanProcessChanged(a, b) { console.log('onWsmanProcessChanged', a, b); }
//function onWsmanResponse(stack, name, responses, status) { console.log('onWsmanResponse', JSON.stringify(responses), status); exit(1); }
function saveEntireAmtStateOk2(stack, name, responses, status) { IntelAmtEntireState['wsmanenums'] = responses; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk3(stack, messages) { IntelAmtEntireState['auditlog'] = messages; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk4(stack, messages) { IntelAmtEntireState['eventlog'] = messages; saveEntireAmtStateDone(); }
function saveEntireAmtStateDone() {
if (--IntelAmtEntireStateCalls != 0) return;
console.log('saveEntireAmtStateDone: ' + JSON.stringify(IntelAmtEntireState));
// TODO: Save state to file
exit(1);
}
// Get Intel AMT information using MEI
function getAmtInfo(func, tag) {
if (amtMei == null) { if (func != null) { func(null, tag); } return; }
2018-01-02 19:52:49 -05:00
amtMeiTmpState = { Flags: 0 }; // Flags: 1=EHBC, 2=CCM, 4=ACM
amtMei.getProtocolVersion(function (result) { if (result != null) { amtMeiTmpState.MeiVersion = result; } });
amtMei.getVersion(function (val) {
amtMeiTmpState.Versions = {};
if (val != null) {
for (var version in val.Versions) { amtMeiTmpState.Versions[val.Versions[version].Description] = val.Versions[version].Version; }
amtMei.getProvisioningMode(function (result) { if (result != null) { amtMeiTmpState.ProvisioningMode = result.mode; } });
amtMei.getProvisioningState(function (result) { if (result != null) { amtMeiTmpState.ProvisioningState = result.state; } });
amtMei.getEHBCState(function (result) { if ((result != null) && (result.EHBC == true)) { amtMeiTmpState.Flags += 1; } });
amtMei.getControlMode(function (result) { if (result != null) { if (result.controlMode == 1) { amtMeiTmpState.Flags += 2; } if (result.controlMode == 2) { amtMeiTmpState.Flags += 4; } } });
//amtMei.getMACAddresses(function (result) { if (result != null) { amtMeiTmpState.mac = result; } });
amtMei.getDnsSuffix(function (result) { if (result != null) { amtMeiTmpState.dns = result; } });
amtMei.getHashHandles(function (handles) {
amtMeiTmpState.TrustedHashes = [];
exitOnCount = handles.length;
for (var i = 0; i < handles.length; ++i) {
amtMei.getCertHashEntry(handles[i], function (result) {
amtMeiTmpState.TrustedHashes.push({ Active: result.isActive, Default: result.isDefault, HashAlgorithm: result.hashAlgorithm, Name: result.name, Hash: result.certificateHash });
if (--exitOnCount == 0) { amtMeiState = amtMeiTmpState; if (func != null) { func(amtMeiTmpState, tag); } }
});
}
});
} else {
amtMeiState = amtMeiTmpState;
amtMeiState.ProvisioningMode = -858993460;
amtMeiState.TrustedHashes = {};
if (func != null) { func(amtMeiState, tag); }
}
});
}
// Start LMS
function startLms() {
var lme_heci = require('lme_heci');
var amtLms = null;
var http = require('http');
2018-01-02 19:52:49 -05:00
var _IntelAmtWebApp_etag = "p/m4qB4kvhXmEYCw/8KB";
var _IntelAmtWebApp = "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
var amtMeiModule = require('amt_heci');
amtMei = new amtMeiModule();
amtMei.on('error', function (e) { console.log(e); exit(1); return; });
//console.log('PTHI Connecting...');
amtMei.on('connect', function () {
//console.log("PTHI Connected.");
amtLms = new lme_heci();
amtLms.on('error', function (e) { console.log('LME connection failed', e); });
//console.log('LME Connecting...');
amtLms.on('connect', function () {
//console.log("LME Connected.");
2018-01-02 19:52:49 -05:00
amtLms.meshCommander = http.createServer();
amtLms.meshCommander.listen(16994);
amtLms.meshCommander.on('upgrade', function (req, socket, head) {
//console.log("WebSocket for " + req.url.split('?')[0]);
switch (req.url.split('?')[0]) {
case '/lms.ashx': // MeshCommander control channel (PTHI)
2018-01-19 21:04:54 -05:00
socket.ws = socket.upgradeWebSocket();
socket.ws.on('data', processLmsControlData);
break;
case '/webrelay.ashx': // MeshCommander data channel (LME)
2018-01-19 21:04:54 -05:00
socket.ws = socket.upgradeWebSocket();
amtLms.bindDuplexStream(socket.ws, 'IPv4', 16992);
break;
default:
socket.end();
break;
}
});
amtLms.meshCommander.on('request', function (req, rsp) {
//console.log("WebRequest for " + req.url.split('?')[0]);
switch (req.url.split('?')[0]) {
case '/': // Serve MeshCommander Web Application for LMS
2018-01-19 21:04:54 -05:00
rsp.writeHead(200, 'OK', { Server: 'JSLMS', 'Cache-Control': 'max-age=0, no-cache', 'X-Frame-Options': 'DENY', 'Content-Type': 'text/html', 'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', ETag: _IntelAmtWebApp_etag });
rsp.end(Buffer.from(_IntelAmtWebApp, 'base64'));
break;
default: // Unknown request
rsp.statusCode = 404;
rsp.statusMessage = "Not Found";
rsp.end();
break;
}
});
console.log("LMS started, MeshCommander on HTTP/16994.");
});
});
}
function processLmsControlData(data) {
if (data.length < 2) return;
var cmdid = data.readUInt16LE(0);
switch (cmdid) {
case 1: // Request basic Intel AMT information (CMD = 1)
{
getAmtInfo(function (meinfo, socket) { meinfo.LoginMode = 2; socket.write(Buffer.concat([Buffer.from('0100', 'hex'), Buffer.from(JSON.stringify(meinfo))])); }, this);
break;
}
case 2: // Intel AMT MEI Unprovision (CMD = 2)
{
if (data.length < 6) break;
amtMei.unprovision(data.readUInt32LE(2), function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(2, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this);
break;
}
case 3: // Intel AMT MEI GetLocalSystemAccount (CMD = 3)
{
amtMei.getLocalSystemAccount(function (account, socket) {socket.write(Buffer.concat([Buffer.from('030000000000', 'hex'), account.raw])); }, this);
break;
}
case 4: // Instruct Intel AMT to start remote configuration (CMD = 4)
{
amtMei.startConfiguration(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this);
break;
}
case 5: // Instruct Intel AMT to stop remote configuration (CMD = 5)
{
amtMei.stopConfiguration(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this);
break;
}
case 6: // Instruct Intel AMT connect CIRA (CMD = 6)
{
amtMei.openUserInitiatedConnection(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this);
break;
}
case 7: // Instruct Intel AMT disconnect CIRA (CMD = 7)
{
amtMei.closeUserInitiatedConnection(function (status, socket) { var data = new Buffer(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this);
break;
}
case 8: // Get Intel AMT CIRA State (CMD = 8)
{
amtMei.getRemoteAccessConnectionStatus(function (state, socket) { var data = new Buffer(6); data.writeUInt16LE(8, 0); data.writeUInt32LE(state.status, 2); socket.write(Buffer.concat([data, state.raw])); }, this);
break;
}
}
2017-10-31 19:19:58 -04:00
}
// Starts the router
function startRouter() {
tcpserver = net.createServer(OnTcpClientConnected);
tcpserver.on('error', function (err) { console.log(err); exit(0); return; });
2017-10-31 19:19:58 -04:00
tcpserver.listen(settings.localPort, function () {
// We started listening.
if (settings.remoteName == null) {
console.log('Redirecting local port ' + settings.localPort + ' to remote port ' + settings.remotePort + '.');
} else {
console.log('Redirecting local port ' + settings.localPort + ' to ' + settings.remoteName + ':' + settings.remotePort + '.');
}
console.log('Press ctrl-c to terminal.');
// If settings has a "cmd", run it now.
//process.exec("notepad.exe");
});
}
// Called when a TCP connect is received on the local port. Launch a tunnel.
function OnTcpClientConnected(c) {
try {
// 'connection' listener
debug(1, 'Client connected');
c.on('end', function () { disconnectTunnel(this, this.websocket, 'Client closed'); });
c.pause();
try {
options = http.parseUri(settings.serverUrl + '?user=' + settings.username + '&pass=' + settings.password + '&nodeid=' + settings.remoteNodeId + '&tcpport=' + settings.remotePort);
} catch (e) { console.log('Unable to parse \"serverUrl\".'); process.exit(1); return; }
2017-10-31 19:19:58 -04:00
options.checkServerIdentity = onVerifyServer;
c.websocket = http.request(options);
c.websocket.tcp = c;
c.websocket.tunneling = false;
c.websocket.upgrade = OnWebSocket;
c.websocket.on('error', function (msg) { console.log(msg); });
c.websocket.end();
} catch (e) { debug(2, e); }
}
// Disconnect both TCP & WebSocket connections and display a message.
function disconnectTunnel(tcp, ws, msg) {
if (ws != null) { try { ws.end(); } catch (e) { debug(2, e); } }
if (tcp != null) { try { tcp.end(); } catch (e) { debug(2, e); } }
debug(1, 'Tunnel disconnected: ' + msg);
}
// Called when the web socket gets connected
function OnWebSocket(msg, s, head) {
debug(1, 'Websocket connected');
s.on('data', function (msg) {
if (this.parent.tunneling == false) {
msg = msg.toString();
if (msg == 'c') {
this.parent.tunneling = true; this.pipe(this.parent.tcp); this.parent.tcp.pipe(this); debug(1, 'Tunnel active');
} else if ((msg.length > 6) && (msg.substring(0, 6) == 'error:')) {
console.log(msg.substring(6));
disconnectTunnel(this.tcp, this, msg.substring(6));
}
}
});
s.on('error', function (msg) { disconnectTunnel(this.tcp, this, 'Websocket error'); });
s.on('close', function (msg) { disconnectTunnel(this.tcp, this, 'Websocket closed'); });
s.parent = this;
}
// Try to discover the location of the mesh server
function discoverMeshServer() { console.log('Looking for server...'); discoveryInterval = setInterval(discoverMeshServerOnce, 5000); discoverMeshServerOnce(); }
// Try to discover the location of the mesh server only once
function discoverMeshServerOnce() {
var interfaces = os.networkInterfaces();
for (var adapter in interfaces) {
if (interfaces.hasOwnProperty(adapter)) {
for (var i = 0; i < interfaces[adapter].length; ++i) {
2017-10-31 19:19:58 -04:00
var addr = interfaces[adapter][i];
multicastSockets[i] = dgram.createSocket({ type: (addr.family == "IPv4" ? "udp4" : "udp6") });
multicastSockets[i].bind({ address: addr.address, exclusive: false });
if (addr.family == "IPv4") {
multicastSockets[i].addMembership(membershipIPv4);
//multicastSockets[i].setMulticastLoopback(true);
multicastSockets[i].once('message', OnMulticastMessage);
multicastSockets[i].send(settings.serverId, 16989, membershipIPv4);
}
}
}
}
}
// Called when a multicast packet is received
function OnMulticastMessage(msg, rinfo) {
var m = msg.toString().split('|');
if ((m.length == 3) && (m[0] == 'MeshCentral2') && (m[1] == settings.serverId)) {
settings.serverUrl = m[2].replace('%s', rinfo.address).replace('/agent.ashx', '/meshrelay.ashx');
console.log('Found server at ' + settings.serverUrl + '.');
if (discoveryInterval != null) { clearInterval(discoveryInterval); discoveryInterval = null; }
startRouter();
}
}
// Start
function nextStepStorageUpload() {
debug(3, "nextStepStorageUpload");
getAmtStorage(function (statusCode, data) {
if (statusCode == 200) {
debug(2, "getAmtStorage: " + JSON.stringify(data, null, 2));
if ((data['content'] != null) && (data['content']['index.htm'] != null)) { nextStepStorageUpload3('index.htm'); }
else if ((data['content'] != null) && (data['content']['logon.htm'] != null)) { nextStepStorageUpload3('logon.htm'); }
else if ((data['content'] != null) && (data['content']['logon.htm'] != null)) { nextStepStorageUpload3('logon.htm'); }
else { nextStepStorageUpload2('index.htm', null); }
} else {
console.log("Unable to read storage state.");
exit();
return;
}
});
}
function nextStepStorageUpload2(uploadName, linkName) {
debug(3, "nextStepStorageUpload2");
if (settings.webapp == null) { console.log("Done."); exit(); return; } else {
console.log("Uploading MeshCommander...");
pushToStorage(uploadName, linkName, Buffer.from(settings.webapp, 'base64'), function (statusCode) {
if (statusCode == 500) { console.log("Error, check that computer is powered on."); exit(); return; }
if (statusCode != 200) {
if (uploadName == 'index.htm') {
nextStepStorageUpload2('mesh/commander/console', 'MeshCommander');
} else {
console.log("Unable to upload MeshCommander, status = " + statusCode + "."); exit(); return;
}
} else {
console.log("Verifying MeshCommander...");
verifyStorage(uploadName, Buffer.from(settings.webapp, 'base64'), function (verified) {
if (verified == true) { console.log('Done.'); } else { console.log('MeshCommander verification failed.'); }
exit(); return;
});
}
});
}
}
function nextStepStorageUpload3(deleteName) {
console.log("Deleting " + deleteName + " from storage...");
deleteStorage(deleteName, function (statusCode) {
if (statusCode == 500) { console.log("Error, check that computer is powered on."); exit(); return; }
if (statusCode == 200) { nextStepStorageUpload(); } else { console.log("Unable to delete " + deleteName + "."); exit(); return; }
});
}
// Fetch the Intel AMT storage document
function getAmtStorage(func, noretry) {
var req = digest.request({ protocol: settings.protocol, method: "GET", host: settings.hostname, path: "/amt-storage/", port: settings.localport },
function (response) {
if (response.statusCode != 200) { console.log("Unable to connect to Intel(R) AMT."); func(response.statusCode, null); }
response.on('data', function (chunk) { if (response.acc == null) { response.acc = chunk; } else { response.acc += chunk; } });
response.on('end', function () {
var data = response.acc.toString(), len, data2, amtstorage = null;
try {
do { len = data.length; data2 = data; data = data2.replace('\x00', ''); } while (data != data2); // Remove all zero's, this is needed because firmware sometimes returns garbage we must fix.
do { len = data.length; data2 = data; data = data2.replace('\x22\x01\x22', '\x22\x22'); } while (data != data2); // "\x01", this is needed because firmware sometimes returns garbage we must fix.
amtstorage = JSON.parse(data);
} catch (e) { console.log("Error: Unable to parse Intel AMT response."); func(null); }
if (func != null) { func(response.statusCode, amtstorage); }
});
});
req.on('error', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (noretry == true) { if (func != null) { func(null); } } else { getAmtStorage(func, true); } });
req.end();
}
// Fetch the Intel AMT storage document
function pushToStorage(name, linkname, data, func, ptr) {
if (ptr == null) { ptr = 0; }
var req = digest.request({ protocol: settings.protocol, method: "PUT", host: settings.hostname, path: ("/amt-storage/" + name + ((ptr != 0) ? '?append=' : '')), port: settings.localport },
function (response) {
debug(1, 'Chunk Done', data.length, ptr);
if ((response.statusCode == 200) && (ptr < data.length)) { pushToStorage(name, linkname, data, func, ptr); } else { if (func != null) { func(response.statusCode); } }
}
);
req.on('error', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });
var header = (ptr > 0) ? '<metadata></metadata>' : '<metadata><headers><h>Content-Encoding:gzip</h><h>Content-Type:text/html</h></headers>' + ((linkname != null) ? ('<link>' + linkname + '</link>') : '') + '</metadata>';
var blocklen = ((data.length - ptr) > (7000 - header.length)) ? (7000 - header.length) : (data.length - ptr);
req.write(Buffer.concat([new Buffer(header), data.slice(ptr, ptr + blocklen)]));
ptr += blocklen;
req.end();
}
// Fetch the Intel AMT storage document
function verifyStorage(name, data, func) {
var req = digest.request({ protocol: settings.protocol, method: "GET", host: settings.hostname, path: ("/amt-storage/" + name), port: settings.localport },
function (response) {
response.ptr = 0;
response.ok = true;
response.on('data', function (data2) { if (data2 != new Buffer(data.slice(response.ptr, response.ptr + data2.length))) { response.ok = false; console.log('Verifiy failed (' + response.ptr + ', ' + data2.length + ').'); } response.ptr += data2.length; });
response.on('end', function () { if (func != null) { func(response.ok); } });
}
);
req.on('error', function (e) { console.log("Verify error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });
req.end();
}
// Fetch the Intel AMT storage document
function deleteStorage(name, func, noretry) {
var req = digest.request({ protocol: settings.protocol, method: "DELETE", host: settings.hostname, path: "/amt-storage/" + name, port: settings.localport }, function (response) { if (func != null) { func(response.statusCode); } });
req.on('error', function (e) { if ((e == 'Error: Socket was unexpectedly closed') && (noretry != true)) { deleteStorage(name, func, true); } else { if (func != null) { if (e.statusCode) { func(e.statusCode); } else { func(null); } } } });
req.end();
}
2017-11-02 21:44:27 -04:00
try { run(process.argv); } catch (e) { console.log(e); }