nox-openclaw-hunter 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +140 -0
  3. package/bin/nox.js +2 -0
  4. package/dist/branding.d.ts +39 -0
  5. package/dist/branding.d.ts.map +1 -0
  6. package/dist/branding.js +66 -0
  7. package/dist/branding.js.map +1 -0
  8. package/dist/cli.d.ts +15 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +94 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/export.d.ts +21 -0
  13. package/dist/commands/export.d.ts.map +1 -0
  14. package/dist/commands/export.js +616 -0
  15. package/dist/commands/export.js.map +1 -0
  16. package/dist/commands/index.d.ts +8 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +8 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/commands/isolate.d.ts +30 -0
  21. package/dist/commands/isolate.d.ts.map +1 -0
  22. package/dist/commands/isolate.js +547 -0
  23. package/dist/commands/isolate.js.map +1 -0
  24. package/dist/commands/purge.d.ts +22 -0
  25. package/dist/commands/purge.d.ts.map +1 -0
  26. package/dist/commands/purge.js +295 -0
  27. package/dist/commands/purge.js.map +1 -0
  28. package/dist/commands/scan.d.ts +23 -0
  29. package/dist/commands/scan.d.ts.map +1 -0
  30. package/dist/commands/scan.js +155 -0
  31. package/dist/commands/scan.js.map +1 -0
  32. package/dist/detector/app-bundle.d.ts +13 -0
  33. package/dist/detector/app-bundle.d.ts.map +1 -0
  34. package/dist/detector/app-bundle.js +27 -0
  35. package/dist/detector/app-bundle.js.map +1 -0
  36. package/dist/detector/cli-binary.d.ts +12 -0
  37. package/dist/detector/cli-binary.d.ts.map +1 -0
  38. package/dist/detector/cli-binary.js +66 -0
  39. package/dist/detector/cli-binary.js.map +1 -0
  40. package/dist/detector/config.d.ts +21 -0
  41. package/dist/detector/config.d.ts.map +1 -0
  42. package/dist/detector/config.js +337 -0
  43. package/dist/detector/config.js.map +1 -0
  44. package/dist/detector/detection-config.d.ts +24 -0
  45. package/dist/detector/detection-config.d.ts.map +1 -0
  46. package/dist/detector/detection-config.js +242 -0
  47. package/dist/detector/detection-config.js.map +1 -0
  48. package/dist/detector/docker.d.ts +10 -0
  49. package/dist/detector/docker.d.ts.map +1 -0
  50. package/dist/detector/docker.js +94 -0
  51. package/dist/detector/docker.js.map +1 -0
  52. package/dist/detector/index.d.ts +50 -0
  53. package/dist/detector/index.d.ts.map +1 -0
  54. package/dist/detector/index.js +155 -0
  55. package/dist/detector/index.js.map +1 -0
  56. package/dist/detector/network.d.ts +34 -0
  57. package/dist/detector/network.d.ts.map +1 -0
  58. package/dist/detector/network.js +205 -0
  59. package/dist/detector/network.js.map +1 -0
  60. package/dist/detector/process.d.ts +16 -0
  61. package/dist/detector/process.d.ts.map +1 -0
  62. package/dist/detector/process.js +47 -0
  63. package/dist/detector/process.js.map +1 -0
  64. package/dist/detector/service.d.ts +17 -0
  65. package/dist/detector/service.d.ts.map +1 -0
  66. package/dist/detector/service.js +51 -0
  67. package/dist/detector/service.js.map +1 -0
  68. package/dist/enforcer/docker-cleaner.d.ts +30 -0
  69. package/dist/enforcer/docker-cleaner.d.ts.map +1 -0
  70. package/dist/enforcer/docker-cleaner.js +163 -0
  71. package/dist/enforcer/docker-cleaner.js.map +1 -0
  72. package/dist/enforcer/file-remover.d.ts +34 -0
  73. package/dist/enforcer/file-remover.d.ts.map +1 -0
  74. package/dist/enforcer/file-remover.js +137 -0
  75. package/dist/enforcer/file-remover.js.map +1 -0
  76. package/dist/enforcer/index.d.ts +33 -0
  77. package/dist/enforcer/index.d.ts.map +1 -0
  78. package/dist/enforcer/index.js +142 -0
  79. package/dist/enforcer/index.js.map +1 -0
  80. package/dist/enforcer/process-killer.d.ts +18 -0
  81. package/dist/enforcer/process-killer.d.ts.map +1 -0
  82. package/dist/enforcer/process-killer.js +80 -0
  83. package/dist/enforcer/process-killer.js.map +1 -0
  84. package/dist/enforcer/service-stopper.d.ts +23 -0
  85. package/dist/enforcer/service-stopper.d.ts.map +1 -0
  86. package/dist/enforcer/service-stopper.js +95 -0
  87. package/dist/enforcer/service-stopper.js.map +1 -0
  88. package/dist/index.d.ts +6 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +10 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/isolator/firewall.d.ts +25 -0
  93. package/dist/isolator/firewall.d.ts.map +1 -0
  94. package/dist/isolator/firewall.js +114 -0
  95. package/dist/isolator/firewall.js.map +1 -0
  96. package/dist/isolator/index.d.ts +63 -0
  97. package/dist/isolator/index.d.ts.map +1 -0
  98. package/dist/isolator/index.js +201 -0
  99. package/dist/isolator/index.js.map +1 -0
  100. package/dist/isolator/lockdown.d.ts +22 -0
  101. package/dist/isolator/lockdown.d.ts.map +1 -0
  102. package/dist/isolator/lockdown.js +401 -0
  103. package/dist/isolator/lockdown.js.map +1 -0
  104. package/dist/isolator/quarantine.d.ts +39 -0
  105. package/dist/isolator/quarantine.d.ts.map +1 -0
  106. package/dist/isolator/quarantine.js +364 -0
  107. package/dist/isolator/quarantine.js.map +1 -0
  108. package/dist/mdm/index.d.ts +93 -0
  109. package/dist/mdm/index.d.ts.map +1 -0
  110. package/dist/mdm/index.js +414 -0
  111. package/dist/mdm/index.js.map +1 -0
  112. package/dist/mdm/intune.d.ts +69 -0
  113. package/dist/mdm/intune.d.ts.map +1 -0
  114. package/dist/mdm/intune.js +409 -0
  115. package/dist/mdm/intune.js.map +1 -0
  116. package/dist/mdm/jamf.d.ts +58 -0
  117. package/dist/mdm/jamf.d.ts.map +1 -0
  118. package/dist/mdm/jamf.js +441 -0
  119. package/dist/mdm/jamf.js.map +1 -0
  120. package/dist/mdm/jumpcloud.d.ts +73 -0
  121. package/dist/mdm/jumpcloud.d.ts.map +1 -0
  122. package/dist/mdm/jumpcloud.js +470 -0
  123. package/dist/mdm/jumpcloud.js.map +1 -0
  124. package/dist/mdm/templates/detect.ps1.d.ts +30 -0
  125. package/dist/mdm/templates/detect.ps1.d.ts.map +1 -0
  126. package/dist/mdm/templates/detect.ps1.js +463 -0
  127. package/dist/mdm/templates/detect.ps1.js.map +1 -0
  128. package/dist/mdm/templates/detect.sh.d.ts +30 -0
  129. package/dist/mdm/templates/detect.sh.d.ts.map +1 -0
  130. package/dist/mdm/templates/detect.sh.js +474 -0
  131. package/dist/mdm/templates/detect.sh.js.map +1 -0
  132. package/dist/mdm/templates/enforce.ps1.d.ts +33 -0
  133. package/dist/mdm/templates/enforce.ps1.d.ts.map +1 -0
  134. package/dist/mdm/templates/enforce.ps1.js +681 -0
  135. package/dist/mdm/templates/enforce.ps1.js.map +1 -0
  136. package/dist/mdm/templates/enforce.sh.d.ts +33 -0
  137. package/dist/mdm/templates/enforce.sh.d.ts.map +1 -0
  138. package/dist/mdm/templates/enforce.sh.js +591 -0
  139. package/dist/mdm/templates/enforce.sh.js.map +1 -0
  140. package/dist/platform/darwin.d.ts +6 -0
  141. package/dist/platform/darwin.d.ts.map +1 -0
  142. package/dist/platform/darwin.js +192 -0
  143. package/dist/platform/darwin.js.map +1 -0
  144. package/dist/platform/index.d.ts +43 -0
  145. package/dist/platform/index.d.ts.map +1 -0
  146. package/dist/platform/index.js +27 -0
  147. package/dist/platform/index.js.map +1 -0
  148. package/dist/platform/linux.d.ts +6 -0
  149. package/dist/platform/linux.d.ts.map +1 -0
  150. package/dist/platform/linux.js +134 -0
  151. package/dist/platform/linux.js.map +1 -0
  152. package/dist/platform/windows.d.ts +6 -0
  153. package/dist/platform/windows.d.ts.map +1 -0
  154. package/dist/platform/windows.js +134 -0
  155. package/dist/platform/windows.js.map +1 -0
  156. package/dist/reporter/console.d.ts +27 -0
  157. package/dist/reporter/console.d.ts.map +1 -0
  158. package/dist/reporter/console.js +431 -0
  159. package/dist/reporter/console.js.map +1 -0
  160. package/dist/reporter/index.d.ts +11 -0
  161. package/dist/reporter/index.d.ts.map +1 -0
  162. package/dist/reporter/index.js +13 -0
  163. package/dist/reporter/index.js.map +1 -0
  164. package/dist/reporter/json.d.ts +61 -0
  165. package/dist/reporter/json.d.ts.map +1 -0
  166. package/dist/reporter/json.js +75 -0
  167. package/dist/reporter/json.js.map +1 -0
  168. package/dist/reporter/webhook.d.ts +57 -0
  169. package/dist/reporter/webhook.d.ts.map +1 -0
  170. package/dist/reporter/webhook.js +230 -0
  171. package/dist/reporter/webhook.js.map +1 -0
  172. package/dist/types/config.d.ts +116 -0
  173. package/dist/types/config.d.ts.map +1 -0
  174. package/dist/types/config.js +6 -0
  175. package/dist/types/config.js.map +1 -0
  176. package/dist/types/detection.d.ts +85 -0
  177. package/dist/types/detection.d.ts.map +1 -0
  178. package/dist/types/detection.js +5 -0
  179. package/dist/types/detection.js.map +1 -0
  180. package/dist/types/enforcement.d.ts +33 -0
  181. package/dist/types/enforcement.d.ts.map +1 -0
  182. package/dist/types/enforcement.js +5 -0
  183. package/dist/types/enforcement.js.map +1 -0
  184. package/dist/types/index.d.ts +8 -0
  185. package/dist/types/index.d.ts.map +1 -0
  186. package/dist/types/index.js +8 -0
  187. package/dist/types/index.js.map +1 -0
  188. package/dist/types/isolation.d.ts +55 -0
  189. package/dist/types/isolation.d.ts.map +1 -0
  190. package/dist/types/isolation.js +5 -0
  191. package/dist/types/isolation.js.map +1 -0
  192. package/dist/utils/exec.d.ts +48 -0
  193. package/dist/utils/exec.d.ts.map +1 -0
  194. package/dist/utils/exec.js +103 -0
  195. package/dist/utils/exec.js.map +1 -0
  196. package/dist/utils/fs.d.ts +34 -0
  197. package/dist/utils/fs.d.ts.map +1 -0
  198. package/dist/utils/fs.js +111 -0
  199. package/dist/utils/fs.js.map +1 -0
  200. package/dist/utils/index.d.ts +7 -0
  201. package/dist/utils/index.d.ts.map +1 -0
  202. package/dist/utils/index.js +7 -0
  203. package/dist/utils/index.js.map +1 -0
  204. package/dist/utils/logger.d.ts +14 -0
  205. package/dist/utils/logger.d.ts.map +1 -0
  206. package/dist/utils/logger.js +48 -0
  207. package/dist/utils/logger.js.map +1 -0
  208. package/docs/intune.md +390 -0
  209. package/docs/jamf.md +400 -0
  210. package/docs/jumpcloud.md +510 -0
  211. package/package.json +65 -0
@@ -0,0 +1,616 @@
1
+ /**
2
+ * Export command - generate MDM deployment scripts.
3
+ */
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { printBanner, EXIT_CODES } from '../branding.js';
9
+ import { logger, setLogLevel } from '../utils/logger.js';
10
+ import { printStatus } from '../reporter/index.js';
11
+ /**
12
+ * Validate MDM platform option.
13
+ */
14
+ function validatePlatform(platform) {
15
+ return ['jamf', 'intune', 'jumpcloud'].includes(platform.toLowerCase());
16
+ }
17
+ /**
18
+ * Validate script mode option.
19
+ */
20
+ function validateMode(mode) {
21
+ return ['detect', 'purge'].includes(mode.toLowerCase());
22
+ }
23
+ /**
24
+ * Generate detection shell script for Unix-like systems.
25
+ */
26
+ function generateDetectShellScript(webhookUrl, webhookToken) {
27
+ const webhookSection = webhookUrl
28
+ ? `
29
+ # Webhook configuration
30
+ WEBHOOK_URL="${webhookUrl}"
31
+ ${webhookToken ? `WEBHOOK_TOKEN="${webhookToken}"` : ''}
32
+
33
+ send_webhook() {
34
+ local status="$1"
35
+ local details="$2"
36
+ local payload="{\\"event\\":\\"openclaw.detection\\",\\"status\\":\\"$status\\",\\"hostname\\":\\"$(hostname)\\",\\"details\\":\\"$details\\"}"
37
+
38
+ curl -s -X POST "$WEBHOOK_URL" \\
39
+ -H "Content-Type: application/json" \\
40
+ ${webhookToken ? '-H "Authorization: Bearer $WEBHOOK_TOKEN"' : ''} \\
41
+ -d "$payload" > /dev/null 2>&1 || true
42
+ }
43
+ `
44
+ : '';
45
+ return `#!/bin/bash
46
+ # Nox OpenClaw Detection Script
47
+ # Generated by nox-openclaw-detector
48
+ # https://nox.security
49
+
50
+ set -euo pipefail
51
+
52
+ OPENCLAW_FOUND=0
53
+ DETAILS=""
54
+ ${webhookSection}
55
+ # Check if nox CLI is installed
56
+ if command -v nox &>/dev/null; then
57
+ if nox scan --quiet --json > /tmp/nox_scan_result.json 2>/dev/null; then
58
+ SUMMARY=$(cat /tmp/nox_scan_result.json | grep -o '"summary":"[^"]*"' | cut -d'"' -f4 || echo "")
59
+ if [[ "$SUMMARY" != "not-installed" ]]; then
60
+ OPENCLAW_FOUND=1
61
+ DETAILS="Detected via nox CLI: $SUMMARY"
62
+ fi
63
+ rm -f /tmp/nox_scan_result.json
64
+ fi
65
+ ${webhookUrl ? 'send_webhook "$([[ $OPENCLAW_FOUND -eq 1 ]] && echo "detected" || echo "clean")" "$DETAILS"' : ''}
66
+ exit $OPENCLAW_FOUND
67
+ fi
68
+
69
+ # Fallback: direct detection
70
+
71
+ # Check CLI binary
72
+ for cli_path in /usr/local/bin/openclaw /opt/homebrew/bin/openclaw /usr/bin/openclaw; do
73
+ if [[ -f "$cli_path" ]]; then
74
+ OPENCLAW_FOUND=1
75
+ DETAILS="CLI found at $cli_path"
76
+ break
77
+ fi
78
+ done
79
+
80
+ # Check config directory
81
+ if [[ -d "$HOME/.openclaw" ]] || [[ -d "/Users/*/.openclaw" ]]; then
82
+ OPENCLAW_FOUND=1
83
+ DETAILS="$DETAILS; Config directory found"
84
+ fi
85
+
86
+ # Check macOS app bundle
87
+ if [[ -d "/Applications/OpenClaw.app" ]]; then
88
+ OPENCLAW_FOUND=1
89
+ DETAILS="$DETAILS; App bundle found"
90
+ fi
91
+
92
+ # Check gateway port
93
+ if command -v nc &>/dev/null && nc -z localhost 18789 2>/dev/null; then
94
+ OPENCLAW_FOUND=1
95
+ DETAILS="$DETAILS; Gateway port 18789 listening"
96
+ fi
97
+
98
+ # Check running processes
99
+ if pgrep -x "openclaw" > /dev/null 2>&1 || pgrep -f "openclaw" > /dev/null 2>&1; then
100
+ OPENCLAW_FOUND=1
101
+ DETAILS="$DETAILS; Process running"
102
+ fi
103
+ ${webhookUrl ? '\nsend_webhook "$([[ $OPENCLAW_FOUND -eq 1 ]] && echo "detected" || echo "clean")" "$DETAILS"' : ''}
104
+
105
+ exit $OPENCLAW_FOUND
106
+ `;
107
+ }
108
+ /**
109
+ * Generate detection PowerShell script for Windows.
110
+ */
111
+ function generateDetectPowerShellScript(webhookUrl, webhookToken) {
112
+ const webhookSection = webhookUrl
113
+ ? `
114
+ # Webhook configuration
115
+ $WebhookUrl = "${webhookUrl}"
116
+ ${webhookToken ? `$WebhookToken = "${webhookToken}"` : ''}
117
+
118
+ function Send-Webhook {
119
+ param([string]$Status, [string]$Details)
120
+ $payload = @{
121
+ event = "openclaw.detection"
122
+ status = $Status
123
+ hostname = $env:COMPUTERNAME
124
+ details = $Details
125
+ } | ConvertTo-Json
126
+
127
+ try {
128
+ $headers = @{ "Content-Type" = "application/json" }
129
+ ${webhookToken ? '$headers["Authorization"] = "Bearer $WebhookToken"' : ''}
130
+ Invoke-RestMethod -Uri $WebhookUrl -Method Post -Headers $headers -Body $payload -ErrorAction SilentlyContinue
131
+ } catch {}
132
+ }
133
+ `
134
+ : '';
135
+ return `# Nox OpenClaw Detection Script (PowerShell)
136
+ # Generated by nox-openclaw-detector
137
+ # https://nox.security
138
+
139
+ $ErrorActionPreference = "SilentlyContinue"
140
+ $OpenClawFound = $false
141
+ $Details = @()
142
+ ${webhookSection}
143
+ # Check common installation paths
144
+ $CliPaths = @(
145
+ "$env:LOCALAPPDATA\\Programs\\openclaw\\openclaw.exe",
146
+ "$env:ProgramFiles\\OpenClaw\\openclaw.exe",
147
+ "$env:ProgramFiles(x86)\\OpenClaw\\openclaw.exe"
148
+ )
149
+
150
+ foreach ($path in $CliPaths) {
151
+ if (Test-Path $path) {
152
+ $OpenClawFound = $true
153
+ $Details += "CLI found at $path"
154
+ break
155
+ }
156
+ }
157
+
158
+ # Check config directory
159
+ $ConfigPaths = @(
160
+ "$env:USERPROFILE\\.openclaw",
161
+ "$env:APPDATA\\OpenClaw"
162
+ )
163
+
164
+ foreach ($path in $ConfigPaths) {
165
+ if (Test-Path $path) {
166
+ $OpenClawFound = $true
167
+ $Details += "Config directory found at $path"
168
+ }
169
+ }
170
+
171
+ # Check running processes
172
+ $processes = Get-Process -Name "*openclaw*" -ErrorAction SilentlyContinue
173
+ if ($processes) {
174
+ $OpenClawFound = $true
175
+ $Details += "Process running: $($processes.Name -join ', ')"
176
+ }
177
+
178
+ # Check gateway port
179
+ $portCheck = Test-NetConnection -ComputerName localhost -Port 18789 -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
180
+ if ($portCheck.TcpTestSucceeded) {
181
+ $OpenClawFound = $true
182
+ $Details += "Gateway port 18789 listening"
183
+ }
184
+
185
+ # Check Windows service
186
+ $service = Get-Service -Name "*openclaw*" -ErrorAction SilentlyContinue
187
+ if ($service) {
188
+ $OpenClawFound = $true
189
+ $Details += "Service found: $($service.Name) ($($service.Status))"
190
+ }
191
+
192
+ $DetailsString = $Details -join "; "
193
+ ${webhookUrl ? '\nSend-Webhook -Status $(if ($OpenClawFound) { "detected" } else { "clean" }) -Details $DetailsString' : ''}
194
+
195
+ if ($OpenClawFound) {
196
+ Write-Host "OpenClaw DETECTED: $DetailsString"
197
+ exit 1
198
+ } else {
199
+ Write-Host "OpenClaw not detected"
200
+ exit 0
201
+ }
202
+ `;
203
+ }
204
+ /**
205
+ * Generate purge shell script for Unix-like systems.
206
+ */
207
+ function generatePurgeShellScript(webhookUrl, webhookToken) {
208
+ const webhookSection = webhookUrl
209
+ ? `
210
+ # Webhook configuration
211
+ WEBHOOK_URL="${webhookUrl}"
212
+ ${webhookToken ? `WEBHOOK_TOKEN="${webhookToken}"` : ''}
213
+
214
+ send_webhook() {
215
+ local status="$1"
216
+ local details="$2"
217
+ local payload="{\\"event\\":\\"openclaw.purge\\",\\"status\\":\\"$status\\",\\"hostname\\":\\"$(hostname)\\",\\"details\\":\\"$details\\"}"
218
+
219
+ curl -s -X POST "$WEBHOOK_URL" \\
220
+ -H "Content-Type: application/json" \\
221
+ ${webhookToken ? '-H "Authorization: Bearer $WEBHOOK_TOKEN"' : ''} \\
222
+ -d "$payload" > /dev/null 2>&1 || true
223
+ }
224
+ `
225
+ : '';
226
+ return `#!/bin/bash
227
+ # Nox OpenClaw Purge Script
228
+ # Generated by nox-openclaw-detector
229
+ # https://nox.security
230
+ #
231
+ # WARNING: This script will remove OpenClaw installations!
232
+ # Run with sudo for full purge capabilities.
233
+
234
+ set -euo pipefail
235
+
236
+ PURGE_RESULTS=""
237
+ ${webhookSection}
238
+ log_action() {
239
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
240
+ PURGE_RESULTS="$PURGE_RESULTS; $1"
241
+ }
242
+
243
+ # Check if running as root
244
+ if [[ $EUID -ne 0 ]]; then
245
+ echo "Warning: Not running as root. Some actions may fail."
246
+ fi
247
+
248
+ # Kill running processes
249
+ log_action "Killing OpenClaw processes..."
250
+ pkill -9 -f "openclaw" 2>/dev/null || log_action "No processes to kill"
251
+
252
+ # Stop and disable launchd service (macOS)
253
+ if [[ "$(uname)" == "Darwin" ]]; then
254
+ for plist in ~/Library/LaunchAgents/bot.molt.* /Library/LaunchAgents/bot.molt.* /Library/LaunchDaemons/bot.molt.*; do
255
+ if [[ -f "$plist" ]]; then
256
+ launchctl unload "$plist" 2>/dev/null || true
257
+ rm -f "$plist"
258
+ log_action "Removed launchd plist: $plist"
259
+ fi
260
+ done
261
+ fi
262
+
263
+ # Stop and disable systemd service (Linux)
264
+ if command -v systemctl &>/dev/null; then
265
+ systemctl stop openclaw.service 2>/dev/null || true
266
+ systemctl disable openclaw.service 2>/dev/null || true
267
+ rm -f /etc/systemd/system/openclaw.service 2>/dev/null || true
268
+ systemctl daemon-reload 2>/dev/null || true
269
+ log_action "Stopped and disabled systemd service"
270
+ fi
271
+
272
+ # Remove CLI binary
273
+ for cli_path in /usr/local/bin/openclaw /opt/homebrew/bin/openclaw /usr/bin/openclaw; do
274
+ if [[ -f "$cli_path" ]]; then
275
+ rm -f "$cli_path"
276
+ log_action "Removed CLI: $cli_path"
277
+ fi
278
+ done
279
+
280
+ # Remove macOS app bundle
281
+ if [[ -d "/Applications/OpenClaw.app" ]]; then
282
+ rm -rf "/Applications/OpenClaw.app"
283
+ log_action "Removed app bundle: /Applications/OpenClaw.app"
284
+ fi
285
+
286
+ # Remove config directories
287
+ for config_dir in ~/.openclaw /Users/*/.openclaw; do
288
+ if [[ -d "$config_dir" ]]; then
289
+ rm -rf "$config_dir"
290
+ log_action "Removed config: $config_dir"
291
+ fi
292
+ done
293
+
294
+ # Remove Docker containers and images
295
+ if command -v docker &>/dev/null; then
296
+ docker ps -a --filter "name=openclaw" --format "{{.ID}}" | xargs -r docker rm -f 2>/dev/null || true
297
+ docker images --filter "reference=*openclaw*" --format "{{.ID}}" | xargs -r docker rmi -f 2>/dev/null || true
298
+ log_action "Cleaned Docker artifacts"
299
+ fi
300
+
301
+ log_action "Purge complete"
302
+ ${webhookUrl ? '\nsend_webhook "purged" "$PURGE_RESULTS"' : ''}
303
+
304
+ echo "Purge complete. Results: $PURGE_RESULTS"
305
+ exit 0
306
+ `;
307
+ }
308
+ /**
309
+ * Generate purge PowerShell script for Windows.
310
+ */
311
+ function generatePurgePowerShellScript(webhookUrl, webhookToken) {
312
+ const webhookSection = webhookUrl
313
+ ? `
314
+ # Webhook configuration
315
+ $WebhookUrl = "${webhookUrl}"
316
+ ${webhookToken ? `$WebhookToken = "${webhookToken}"` : ''}
317
+
318
+ function Send-Webhook {
319
+ param([string]$Status, [string]$Details)
320
+ $payload = @{
321
+ event = "openclaw.purge"
322
+ status = $Status
323
+ hostname = $env:COMPUTERNAME
324
+ details = $Details
325
+ } | ConvertTo-Json
326
+
327
+ try {
328
+ $headers = @{ "Content-Type" = "application/json" }
329
+ ${webhookToken ? '$headers["Authorization"] = "Bearer $WebhookToken"' : ''}
330
+ Invoke-RestMethod -Uri $WebhookUrl -Method Post -Headers $headers -Body $payload -ErrorAction SilentlyContinue
331
+ } catch {}
332
+ }
333
+ `
334
+ : '';
335
+ return `# Nox OpenClaw Purge Script (PowerShell)
336
+ # Generated by nox-openclaw-detector
337
+ # https://nox.security
338
+ #
339
+ # WARNING: This script will remove OpenClaw installations!
340
+ # Run as Administrator for full purge capabilities.
341
+
342
+ #Requires -RunAsAdministrator
343
+
344
+ $ErrorActionPreference = "SilentlyContinue"
345
+ $PurgeResults = @()
346
+ ${webhookSection}
347
+ function Log-Action {
348
+ param([string]$Message)
349
+ Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Message"
350
+ $script:PurgeResults += $Message
351
+ }
352
+
353
+ # Kill running processes
354
+ Log-Action "Killing OpenClaw processes..."
355
+ Get-Process -Name "*openclaw*" | Stop-Process -Force -ErrorAction SilentlyContinue
356
+ Log-Action "Processes terminated"
357
+
358
+ # Stop and remove Windows service
359
+ $service = Get-Service -Name "*openclaw*" -ErrorAction SilentlyContinue
360
+ if ($service) {
361
+ Stop-Service -Name $service.Name -Force -ErrorAction SilentlyContinue
362
+ sc.exe delete $service.Name 2>$null
363
+ Log-Action "Stopped and removed service: $($service.Name)"
364
+ }
365
+
366
+ # Remove CLI binaries
367
+ $CliPaths = @(
368
+ "$env:LOCALAPPDATA\\Programs\\openclaw",
369
+ "$env:ProgramFiles\\OpenClaw",
370
+ "$env:ProgramFiles(x86)\\OpenClaw"
371
+ )
372
+
373
+ foreach ($path in $CliPaths) {
374
+ if (Test-Path $path) {
375
+ Remove-Item -Path $path -Recurse -Force -ErrorAction SilentlyContinue
376
+ Log-Action "Removed: $path"
377
+ }
378
+ }
379
+
380
+ # Remove config directories
381
+ $ConfigPaths = @(
382
+ "$env:USERPROFILE\\.openclaw",
383
+ "$env:APPDATA\\OpenClaw"
384
+ )
385
+
386
+ foreach ($path in $ConfigPaths) {
387
+ if (Test-Path $path) {
388
+ Remove-Item -Path $path -Recurse -Force -ErrorAction SilentlyContinue
389
+ Log-Action "Removed config: $path"
390
+ }
391
+ }
392
+
393
+ # Remove scheduled tasks
394
+ Get-ScheduledTask -TaskName "*openclaw*" | Unregister-ScheduledTask -Confirm:$false -ErrorAction SilentlyContinue
395
+ Log-Action "Removed scheduled tasks"
396
+
397
+ # Clean Docker (if installed)
398
+ if (Get-Command docker -ErrorAction SilentlyContinue) {
399
+ docker ps -a --filter "name=openclaw" --format "{{.ID}}" | ForEach-Object { docker rm -f $_ 2>$null }
400
+ docker images --filter "reference=*openclaw*" --format "{{.ID}}" | ForEach-Object { docker rmi -f $_ 2>$null }
401
+ Log-Action "Cleaned Docker artifacts"
402
+ }
403
+
404
+ $ResultsString = $PurgeResults -join "; "
405
+ ${webhookUrl ? '\nSend-Webhook -Status "purged" -Details $ResultsString' : ''}
406
+
407
+ Write-Host ""
408
+ Write-Host "Purge complete. Results: $ResultsString"
409
+ exit 0
410
+ `;
411
+ }
412
+ /**
413
+ * Generate scripts for the specified MDM platform.
414
+ */
415
+ function generateScripts(platform, mode, webhookUrl, webhookToken) {
416
+ const scripts = [];
417
+ if (mode === 'detect') {
418
+ if (platform === 'intune') {
419
+ // Intune primarily uses PowerShell
420
+ scripts.push({
421
+ filename: 'nox-scan.ps1',
422
+ content: generateDetectPowerShellScript(webhookUrl, webhookToken),
423
+ description: 'PowerShell detection script for Microsoft Intune',
424
+ });
425
+ }
426
+ else {
427
+ // Jamf and JumpCloud use shell scripts (and optionally PowerShell for Windows)
428
+ scripts.push({
429
+ filename: 'nox-scan.sh',
430
+ content: generateDetectShellScript(webhookUrl, webhookToken),
431
+ description: 'Shell detection script for macOS/Linux',
432
+ });
433
+ scripts.push({
434
+ filename: 'nox-scan.ps1',
435
+ content: generateDetectPowerShellScript(webhookUrl, webhookToken),
436
+ description: 'PowerShell detection script for Windows',
437
+ });
438
+ }
439
+ }
440
+ else {
441
+ // Purge mode
442
+ if (platform === 'intune') {
443
+ scripts.push({
444
+ filename: 'nox-purge.ps1',
445
+ content: generatePurgePowerShellScript(webhookUrl, webhookToken),
446
+ description: 'PowerShell purge script for Microsoft Intune',
447
+ });
448
+ }
449
+ else {
450
+ scripts.push({
451
+ filename: 'nox-purge.sh',
452
+ content: generatePurgeShellScript(webhookUrl, webhookToken),
453
+ description: 'Shell purge script for macOS/Linux',
454
+ });
455
+ scripts.push({
456
+ filename: 'nox-purge.ps1',
457
+ content: generatePurgePowerShellScript(webhookUrl, webhookToken),
458
+ description: 'PowerShell purge script for Windows',
459
+ });
460
+ }
461
+ }
462
+ return scripts;
463
+ }
464
+ /**
465
+ * Generate README for the exported scripts.
466
+ */
467
+ function generateReadme(platform, mode) {
468
+ const platformName = platform === 'jamf'
469
+ ? 'Jamf Pro'
470
+ : platform === 'intune'
471
+ ? 'Microsoft Intune'
472
+ : 'JumpCloud';
473
+ const modeDescription = mode === 'detect' ? 'detection (scan)' : 'removal (purge)';
474
+ return `# Nox OpenClaw ${mode === 'detect' ? 'Scan' : 'Purge'} Scripts
475
+
476
+ Generated by nox-openclaw-detector for ${platformName}.
477
+
478
+ ## Overview
479
+
480
+ These scripts provide OpenClaw ${modeDescription} capabilities for deployment via ${platformName}.
481
+
482
+ ## Exit Codes
483
+
484
+ | Code | Meaning |
485
+ |------|---------|
486
+ | 0 | ${mode === 'detect' ? 'OpenClaw not detected (clean)' : 'Purge successful'} |
487
+ | 1 | ${mode === 'detect' ? 'OpenClaw detected' : 'Purge failed'} |
488
+ | 2 | Script error |
489
+
490
+ ## Deployment Instructions
491
+
492
+ ${platform === 'jamf' ? `
493
+ ### Jamf Pro
494
+
495
+ 1. Navigate to **Settings > Computer Management > Scripts**
496
+ 2. Click **New** and paste the script content
497
+ 3. Set appropriate **Priority** and **Parameter Labels**
498
+ 4. Create a **Policy** to deploy the script:
499
+ - Trigger: Recurring Check-in (for ongoing monitoring)
500
+ - Execution Frequency: Once per day (recommended)
501
+ - Scope: Target computers/groups
502
+ ` : ''}
503
+
504
+ ${platform === 'intune' ? `
505
+ ### Microsoft Intune
506
+
507
+ 1. Navigate to **Devices > Scripts**
508
+ 2. Click **Add > Windows 10 and later**
509
+ 3. Upload the PowerShell script
510
+ 4. Configure script settings:
511
+ - Run script in 64-bit PowerShell: Yes
512
+ - Run script as administrator: Yes (for purge)
513
+ 5. Assign to device groups
514
+ ` : ''}
515
+
516
+ ${platform === 'jumpcloud' ? `
517
+ ### JumpCloud
518
+
519
+ 1. Navigate to **Device Management > Commands**
520
+ 2. Click **+** to create a new command
521
+ 3. Select the appropriate OS type
522
+ 4. Paste the script content
523
+ 5. Configure:
524
+ - Command Type: Script
525
+ - Run As: Root (for purge)
526
+ - Timeout: 120 seconds (recommended)
527
+ 6. Assign to device groups or systems
528
+ ` : ''}
529
+
530
+ ## Webhook Integration
531
+
532
+ The scripts support webhook notifications for SIEM/alerting integration.
533
+ Configure the webhook URL and token when generating scripts with:
534
+
535
+ \`\`\`bash
536
+ nox export --platform ${platform} --mode ${mode} --webhook https://your-siem.example.com/webhook --webhook-token YOUR_TOKEN
537
+ \`\`\`
538
+
539
+ ## Support
540
+
541
+ For issues or questions, contact support@nox.security
542
+ `;
543
+ }
544
+ /**
545
+ * Export command handler.
546
+ */
547
+ export async function exportCommand(options) {
548
+ // Handle debug mode
549
+ const parentOpts = options.parent?.opts() ?? {};
550
+ if (parentOpts.debug) {
551
+ setLogLevel('debug');
552
+ }
553
+ printBanner();
554
+ // Validate platform
555
+ if (!validatePlatform(options.platform)) {
556
+ console.log(chalk.red(`Invalid platform: ${options.platform}`));
557
+ console.log();
558
+ console.log('Supported platforms:');
559
+ console.log(' jamf - Jamf Pro');
560
+ console.log(' intune - Microsoft Intune');
561
+ console.log(' jumpcloud - JumpCloud');
562
+ process.exit(EXIT_CODES.ERROR);
563
+ }
564
+ // Validate mode
565
+ if (!validateMode(options.mode)) {
566
+ console.log(chalk.red(`Invalid mode: ${options.mode}`));
567
+ console.log();
568
+ console.log('Supported modes:');
569
+ console.log(' detect - Scan/detection scripts');
570
+ console.log(' purge - Removal/purge scripts');
571
+ process.exit(EXIT_CODES.ERROR);
572
+ }
573
+ const platform = options.platform.toLowerCase();
574
+ const mode = options.mode.toLowerCase();
575
+ const outputDir = options.output;
576
+ const spinner = ora(`Generating ${mode} scripts for ${platform}...`).start();
577
+ try {
578
+ // Generate scripts
579
+ const scripts = generateScripts(platform, mode, options.webhook, options.webhookToken);
580
+ const readme = generateReadme(platform, mode);
581
+ // Create output directory
582
+ await fs.mkdir(outputDir, { recursive: true });
583
+ // Write scripts
584
+ for (const script of scripts) {
585
+ const filePath = path.join(outputDir, script.filename);
586
+ await fs.writeFile(filePath, script.content, 'utf-8');
587
+ // Make shell scripts executable
588
+ if (script.filename.endsWith('.sh')) {
589
+ await fs.chmod(filePath, 0o755);
590
+ }
591
+ }
592
+ // Write README
593
+ await fs.writeFile(path.join(outputDir, 'README.md'), readme, 'utf-8');
594
+ spinner.succeed('Scripts generated successfully');
595
+ // Display results
596
+ console.log();
597
+ console.log(chalk.bold('Generated files:'));
598
+ console.log();
599
+ for (const script of scripts) {
600
+ console.log(` ${chalk.green('●')} ${path.join(outputDir, script.filename)}`);
601
+ console.log(` ${chalk.dim(script.description)}`);
602
+ }
603
+ console.log(` ${chalk.blue('●')} ${path.join(outputDir, 'README.md')}`);
604
+ console.log(` ${chalk.dim('Deployment instructions')}`);
605
+ console.log();
606
+ printStatus(`Scripts exported to ${outputDir}`, 'success');
607
+ process.exit(EXIT_CODES.CLEAN);
608
+ }
609
+ catch (error) {
610
+ spinner.fail('Failed to generate scripts');
611
+ const message = error instanceof Error ? error.message : 'Unknown error';
612
+ logger.error(`Export error: ${message}`);
613
+ process.exit(EXIT_CODES.ERROR);
614
+ }
615
+ }
616
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Command exports for Nox OpenClaw Detector CLI.
3
+ */
4
+ export { scanCommand } from './scan.js';
5
+ export { purgeCommand } from './purge.js';
6
+ export { isolateApplyCommand, isolateRevertCommand, isolateListCommand, } from './isolate.js';
7
+ export { exportCommand } from './export.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Command exports for Nox OpenClaw Detector CLI.
3
+ */
4
+ export { scanCommand } from './scan.js';
5
+ export { purgeCommand } from './purge.js';
6
+ export { isolateApplyCommand, isolateRevertCommand, isolateListCommand, } from './isolate.js';
7
+ export { exportCommand } from './export.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Isolate command - isolate device from OpenClaw.
3
+ */
4
+ interface BaseCommandOptions {
5
+ json?: boolean;
6
+ quiet?: boolean;
7
+ force?: boolean;
8
+ parent?: {
9
+ parent?: {
10
+ opts(): {
11
+ debug?: boolean;
12
+ };
13
+ };
14
+ };
15
+ }
16
+ interface IsolateApplyOptions extends BaseCommandOptions {
17
+ port?: number;
18
+ dryRun?: boolean;
19
+ webhook?: string;
20
+ webhookToken?: string;
21
+ }
22
+ export declare function isolateApplyCommand(options: IsolateApplyOptions): Promise<void>;
23
+ export declare function isolateListCommand(options: BaseCommandOptions): Promise<void>;
24
+ interface IsolateRevertOptions extends BaseCommandOptions {
25
+ port?: number;
26
+ dryRun?: boolean;
27
+ }
28
+ export declare function isolateRevertCommand(options: IsolateRevertOptions): Promise<void>;
29
+ export {};
30
+ //# sourceMappingURL=isolate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolate.d.ts","sourceRoot":"","sources":["../../src/commands/isolate.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE;YACP,IAAI,IAAI;gBAAE,KAAK,CAAC,EAAE,OAAO,CAAA;aAAE,CAAC;SAC7B,CAAC;KACH,CAAC;CACH;AAED,UAAU,mBAAoB,SAAQ,kBAAkB;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAsED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiLrF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCnF;AA6FD,UAAU,oBAAqB,SAAQ,kBAAkB;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6LvF"}