MeshCentral/agents/meshcmd.js

611 lines
423 KiB
JavaScript
Raw Normal View History

2018-01-30 21:23:57 -05:00
/*
Copyright 2018 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @description MeshCmd, command line tool for Intel AMT and MeshCentral.
* @author Ylian Saint-Hilaire
* @version v0.2.0
*/
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;
2018-01-30 21:23:57 -05:00
var meshCmdVersion = '***Mesh*Cmd*Version***'; // Dynamically replaced with MeshCentral 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
// Check the server certificate fingerprint
function onVerifyServer(clientName, certs) {
2018-01-26 20:01:38 -05:00
if (certs == null) { certs = clientName; } // Temporary thing until we fix duktape
2017-10-31 19:19:58 -04:00
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;
}
2018-01-30 21:23:57 -05:00
// Parse the incoming arguments
2017-10-31 19:19:58 -04:00
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); }
2018-01-25 19:12:53 -05:00
if ((typeof args.out) == 'string') { settings.output = args.out; }
if ((typeof args.output) == 'string') { settings.output = args.output; }
if ((typeof args.debug) == 'string') { settings.debugLevel = parseInt(args.debug); }
2018-01-25 19:28:52 -05:00
if (args.noconsole) { settings.noconsole = true; }
if (args.nocommander) { settings.noconsole = true; }
2018-01-25 19:12:53 -05:00
if (args.lmsdebug) { settings.lmsdebug = true; }
if (args.tls) { settings.tls = true; }
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));
2018-01-30 21:23:57 -05:00
if (settings.action == 'route') {
// MeshCentral Router, port map local TCP port to a remote computer
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
2018-01-30 21:23:57 -05:00
// Intel AMT 11.6+ Load MeshCommander into firmware
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')) {
2018-01-30 21:23:57 -05:00
// Display Intel AMT versions
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + 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') {
2018-01-30 21:23:57 -05:00
// Display Intel AMT list of trusted hashes
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + 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) {
2018-01-25 19:28:52 -05:00
console.log(result.name + ', (' + (result.isDefault ? 'Default' : '') + (result.isActive ? ', Active' : ', Disabled') + ')\r\n ' + result.hashAlgorithmStr + ': ' + result.certificateHash);
if (--exitOnCount == 0) { exit(1); }
});
}
});
});
} else if (settings.action == 'meinfo') {
2018-01-30 21:23:57 -05:00
// Display Intel AMT version and activation state
var amtMeiModule = require('amt-mei');
var amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + 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') {
2018-01-30 21:23:57 -05:00
// Save the entire state of Intel AMT info a JSON file
2018-01-25 19:12:53 -05:00
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'; }
if ((settings.output == null) || (typeof settings.output != 'string') || (settings.output == '')) { console.log('No or invalid \"output\" file specified, use --output [filename].'); exit(1); return; }
settings.protocol = 'http:';
settings.localport = 16992;
debug(1, "Settings: " + JSON.stringify(settings));
2018-01-02 19:52:49 -05:00
saveEntireAmtState();
2017-12-15 16:43:04 -05:00
} else if (settings.action == 'amtlms') {
2018-01-30 21:23:57 -05:00
// Start Intel AMT MicroLMS
startLms(function (state) { console.log(['MicroLMS did not start. MicroLMS must run as administrator or LMS any already be active.', 'MicroLMS started.', 'MicroLMS started, MeshCommander on HTTP/16994.', 'MEI error'][state]); if (state == 0) { exit(0); } });
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-30 21:23:57 -05:00
//
// FETCH ALL INTEL AMT STATE
//
2018-01-02 19:52:49 -05:00
// Save the entire Intel AMT state
function saveEntireAmtState() {
2018-01-25 19:28:52 -05:00
// See if MicroLMS needs to be started
if ((settings.hostname == '127.0.0.1') || (settings.hostname.toLowerCase() == 'localhost')) { settings.noconsole = true; startLms(); }
2018-01-25 19:12:53 -05:00
console.log('Fetching all Intel AMT state, this may take a few minutes...');
2018-01-30 21:23:57 -05:00
var transport = require('amt-wsman-duk');
var wsman = require('amt-wsman');
var amt = require('amt');
2018-01-25 19:12:53 -05:00
wsstack = new wsman(transport, settings.hostname, settings.tls?16993:16992, settings.username, settings.password, settings.tls);
2018-01-02 19:52:49 -05:00
amtstack = new amt(wsstack);
2018-01-25 19:28:52 -05:00
amtstack.onProcessChanged = onWsmanProcessChanged;
//var AllWsman = "AMT_GeneralSystemDefenseCapabilities".split(',');
2018-01-02 19:52:49 -05:00
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
2018-01-25 19:28:52 -05:00
IntelAmtEntireStateProgress = 101;
2018-01-02 19:52:49 -05:00
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);
}
2018-01-25 19:28:52 -05:00
function onWsmanProcessChanged(a, b) { var x = Math.floor((a * 100) / b); if (x < IntelAmtEntireStateProgress) { IntelAmtEntireStateProgress = x; console.log((100 - x) + '%'); } }
2018-01-02 19:52:49 -05:00
//function onWsmanResponse(stack, name, responses, status) { console.log('onWsmanResponse', JSON.stringify(responses), status); exit(1); }
2018-01-25 19:28:52 -05:00
function saveEntireAmtStateOk2(stack, name, responses, status) { if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); exit(2); } IntelAmtEntireState['wsmanenums'] = responses; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk3(stack, messages, status) { if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); exit(2); } IntelAmtEntireState['auditlog'] = messages; saveEntireAmtStateDone(); }
function saveEntireAmtStateOk4(stack, messages, tag, status) { if (status == 600) { console.log('ERROR: Unable to connect to Intel(R) AMT.'); exit(2); } IntelAmtEntireState['eventlog'] = messages; saveEntireAmtStateDone(); }
2018-01-02 19:52:49 -05:00
2018-01-30 21:23:57 -05:00
// Called when the entire state of Intel AMT is fetched.
2018-01-02 19:52:49 -05:00
function saveEntireAmtStateDone() {
if (--IntelAmtEntireStateCalls != 0) return;
2018-01-25 19:12:53 -05:00
var out = fs.openSync(settings.output, 'w');
fs.writeSync(out, new Buffer(JSON.stringify(IntelAmtEntireState), 'utf8'));
fs.closeSync(out);
console.log('Done, results written to ' + settings.output + '.');
2018-01-02 19:52:49 -05:00
exit(1);
}
2018-01-30 21:23:57 -05:00
//
// FETCH ALL INTEL AMT MEI STATE
//
// 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); }
}
});
}
2018-01-30 21:23:57 -05:00
//
// MicroLMS
//
2018-01-25 19:28:52 -05:00
function startLms(func) {
2018-01-30 21:23:57 -05:00
var lme_heci = require('amt-lme');
var amtLms = null;
var http = require('http');
2018-01-30 21:23:57 -05:00
// MeshCommander LMS v0.5.9
var _IntelAmtWebApp_etag = "Ybdr/RTCufHq9moOpAJi";
var _IntelAmtWebApp = "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
var amtMeiModule = require('amt-mei');
amtMei = new amtMeiModule();
2018-01-25 19:28:52 -05:00
amtMei.on('error', function (e) { console.log('ERROR: ' + e); exit(1); return; });
//console.log('PTHI Connecting...');
amtMei.on('connect', function () {
//console.log("PTHI Connected.");
2018-01-25 19:12:53 -05:00
amtLms = new lme_heci({ debug: settings.lmsdebug });
2018-01-25 19:28:52 -05:00
amtLms.on('error', function (e) {
//console.log('LME connection failed', e);
2018-01-30 21:23:57 -05:00
if (func) { func(amtLms.connected == false?0:3); }
});
amtLms.on('notify', function (data, options, str) {
if (str != null) { console.log(str); } else { console.log(JSON.stringify(data)); }
2018-01-25 19:28:52 -05:00
});
//console.log('LME Connecting...');
amtLms.on('connect', function () {
2018-01-30 21:23:57 -05:00
amtLms.connected = true;
//console.log("LME Connected.");
2018-01-25 19:28:52 -05:00
if (settings.noconsole !== true) {
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)
socket.ws = socket.upgradeWebSocket();
socket.ws.on('data', processLmsControlData);
break;
case '/webrelay.ashx': // MeshCommander data channel (LME)
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
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;
}
2018-01-25 19:28:52 -05:00
});
//console.log("LMS started, MeshCommander on HTTP/16994.");
if (func) { func(2); }
} else {
//console.log("LMS started.");
if (func) { func(1); }
}
});
});
}
2018-01-30 21:23:57 -05:00
// Process commands in the LMS control channel
function processLmsControlData(data) {
if (data.length < 2) return;
var cmdid = data.readUInt16LE(0);
switch (cmdid) {
case 1: // Request basic Intel AMT information (CMD = 1)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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)
2018-01-30 21:23:57 -05:00
{ 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
}
2018-01-30 21:23:57 -05:00
//
// MeshCentral TCP port router
//
2017-10-31 19:19:58 -04:00
function startRouter() {
tcpserver = net.createServer(OnTcpClientConnected);
2018-01-26 20:01:38 -05:00
tcpserver.on('error', function (e) { console.log('ERRORa: ' + JSON.stringify(e)); 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;
2018-01-26 20:01:38 -05:00
options.rejectUnauthorized = false;
2017-10-31 19:19:58 -04:00
c.websocket = http.request(options);
c.websocket.tcp = c;
c.websocket.tunneling = false;
c.websocket.upgrade = OnWebSocket;
2018-01-26 20:01:38 -05:00
c.websocket.on('error', function (e) { console.log('ERROR: ' + JSON.stringify(e)); });
2017-10-31 19:19:58 -04:00
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();
}
}
2018-01-30 21:23:57 -05:00
//
// PUSH MESHCOMMANDER INTO FIRMWARE
//
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; }
2018-01-25 19:12:53 -05:00
var req = digest.request({ protocol: settings.protocol, method: "PUT", host: settings.hostname, path: ("/amt-storage/" + name + ((ptr != 0) ? '?append=' : '')), port: settings.localport } );
req.on('error', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });
2018-01-25 19:12:53 -05:00
req.on('response', 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); } }
});
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) {
2018-01-25 19:12:53 -05:00
var req = digest.request({ protocol: settings.protocol, method: "GET", host: settings.hostname, path: ("/amt-storage/" + name), port: settings.localport });
req.on('error', function (e) { console.log("Verify error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });
2018-01-25 19:12:53 -05:00
req.on('response', function (response) {
response.ptr = 0;
response.ok = true;
2018-01-26 20:01:38 -05:00
response.on('data', function (data2) { if (data2.toString('hex') != data.slice(response.ptr, response.ptr + data2.length).toString('hex')) { response.ok = false; console.log('Verifiy failed (' + response.ptr + ', ' + data2.length + ').'); } response.ptr += data2.length; });
2018-01-25 19:12:53 -05:00
response.on('end', function () { if (func != null) { func(response.ok); } });
});
req.end();
}
// Fetch the Intel AMT storage document
function deleteStorage(name, func, noretry) {
2018-01-25 19:12:53 -05:00
var req = digest.request({ protocol: settings.protocol, method: "DELETE", host: settings.hostname, path: "/amt-storage/" + name, port: settings.localport } );
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); } } } });
2018-01-25 19:12:53 -05:00
req.on('response', function (response) { if (func != null) { func(response.statusCode); } });
req.end();
}
2018-01-30 21:23:57 -05:00
// Run MeshCmd
2018-01-25 19:28:52 -05:00
try { run(process.argv); } catch (e) { console.log('ERROR: ' + e); }