Как стать автором
Обновить

Комментарии 162

Есть компьютер с чистой копией Windows, без доступа в интернет и без каких‑либо установленных средств разработки. Только одна чистая пользовательская «венда».
Заходите в папку Windows на вашем компьютере, вот сюда:

И видим установленный FAR ;)

А по поводу использованию штатной библиотеки из нормального полноценного языка "нативного" для винды С#n - не совсем понятно в чем должно быть удивление..

Полноценная работа с WindowsAPI возможно наверное из любого утюга. Тот же poweshell вполне умеет это делать, можно накатать скрипт, выполнить его в повершелле и обратиться к функциям ОС


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

PowerShell это все же про скрипты, а тут полноценный компилятор, который выдает .exe с интересным функционалом.

Если описанного про выключение мало, представьте эту же логику, только запускаемую в фоне со случайным промежутком и прописыванием в автозагрузку у пользователя.

Работаете себе, через 15 минут компьютер выключается. Перезапускаете - выключается через полчаса.

А что представлять-то? Обычный пранк, я таких много помню. Не понимаю, что тут уникально интересного.

У разных людей сильно разное отношение с реальностью, как и осознание происходящего с ними. А у описанного в статье «внезапного выключения» есть предыстория:

Я тоже когда-то был студентом, жил интересно и развлекался всеми доступными способами. Однажды как раз и сделал такой вот "пранк" с отключением компьютера одногруппника в случайное время через примерно такую же логику с поправкой на другие годы.

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

Несмотря на то что считался «компьютерным специалистом» и вообще был на хорошем счету.

Так что кому пранк а кому шиза — все зависит от восприятия реальности.

Мы вроде на техническом сайте, так что лично меня интересуют технические аспекты, а не то, как люди реагируют на издевательства.

Ну тогда рад что столь сложная техническая статья, материал для которой я собирал не один год оказалась для вас не более чем "пранком".

Вы "не один год" собирали материал о том, что в любой современной инсталляции винды есть csc?

Угу, но разумеется столь крутой профессионал как вы сможет написать что-то покруче. Так что ждем ваших статей.

Он уже написал, и покруче вашей, ещё 10 лет назад )

Тогда тем более - столь великому мастеру не стоит отвлекаться на пустопорожнюю переписку, пусть занимается делом и пишет еще статьи )

Ну да, можно и просто в Task Scheduler на какой-нибудь ивент повесить, да еще и с задержкой по времени, чтоб еще менее очевидно было :) Но такие пранки смешные были бы лет 20 назад, да и то не факт.

Так если даже из скрипта можно обратиться к нативной библиотеке, понятно что из компилируемого, еще и нативного для винды С# это можно сделать.
Таким образом суть статьи в том, что оказывается простой компилятор С# входит в поставку винды?

Что же касается выключения компьютера, у меня есть некоторые сомнения, что данное возможно от regular пользователя у которого нет прав на выключение компа, то есть там нет никаких специальных "повышений привилегий".
Если права есть, есть и штатная утилита shutdown.exe, которую тоже можно вызвать по расписанию, и которая вдобавок подписанная ключом от MS, не будет вызывать лишних вопросов у антивирусов.

Лет 15 назад я это решал батником

shutdown /s /t 0

И оно всё ещё работает. Зачем вам C#, компилятор и прочее?

ПС: ну и если злоумышленник может писать в систему (чтобы создать файл исходников) и запускать компиляцию, то наличие или отсутствие компилятора никого не остановит. А антивирус проверяет всё, что внешние файлы, что созданные в системе.

Лет 15 назад я это решал батником

15 лет назад еще выпускался журнал "Хакер" и все было несколько проще в плане компьютерной безопасности.

. А антивирус проверяет всё, что внешние файлы, что созданные в системе.

Если я вам перешлю готовый бинарник, то при попытке запуска появится окно с подтверждением и сообщением о "доверенном источнике". Если вы соберете этот же бинарник локально и затем запустите - такого сообщения не будет.

Все тоже самое с антивирусом, локально собранные бинарники он пропустит, даже если внутри будет эскалация привилегий или эксплоит, по той простой причине что эвристика осталась видимо только у Касперского а все остальные работают по сигнатурам бинарной сборки - т.е тупо по слепкам бинарников.

Очевидно что слепок локально собранного будет отличаться.

Все тоже самое с антивирусом, локально собранные бинарники он пропустит, даже если внутри будет эскалация привилегий или эксплоит, по той простой причине что эвристика осталась видимо только у Касперского а все остальные работают по сигнатурам бинарной сборки - т.е тупо по слепкам бинарников.

Кто-то вас обманул. Время от времени разработчики жалуются, что у них один и тот же код на разных базах антивируса начинает выдавать срабатывания. Прямо при билде, на их машинах.

И чаще всего речь как раз про касперского, т.к. он у нас самый популярный в России.

Ну да, вы описали как раз работу эвристического алгоритма, я и написал что по ощущениям такое осталось только у Касперского - "визжит свиньей" по поводу и без только он один.

Накидал на C# код, который портит exe файлы. При попытке тронуть этот файл в проводнике получил от защитника виндовс такую маркировку вируса:

Trojan:MSIL/Zilla.AMMB!MTB

После чего дефендер файл удалил.

Так что дело не только в касперском. Могли бы и сами проверить, а не просто кидаться своими догадками.

Тут сложно что-то сказать не видя код, судя по поиску эта сигнатура какая-то сильно общая и срабатывает на много чего.

А проверять я вообщем-то проверял, но статья-то как-бы не об этом ))

А о чём статья? Вы же пишите, что если взять и скомпилировать "вредносный код" на чужой машине, то антивирус не заметит.

Я отмечаю, что заметит - вы мне в ответ, что статья не о том.

Ну не буду же я блин постить на Хабре серьезный работающий зловред - это уже перебор ))

Поэтому озвучиваю лишь идеи и риски, не более того.

Что с этой информацией делать решать читателям. Кому надо тот поймет.

Статья писалась прежде всего из спортивного интереса самой возможности разработки на чистой ОС и без установленных средств, описанное про антивирус не более чем возможный побочный эффект.

Касперский тут ничем не выделяется из ряда других антивирусов. Локальные сборки мне "ломали" и Nod32 и Дефендер, прямо на моменте генерации объектных файлов.

Упражнение любопытное, но не понятно, почему это должно пугать. Ну да, голая винда включает в себя компилятор. Это нормально и даже хорошо, многие линукса тоже включают. А локальный пользователь имеет право выключить компьютер, в том числе и программным образом. Опять же - что странного?

А PowerShell это тот же дотнет, с теми же возможностями. Ничуть не менее страшен, чем exe. Я как-то видел оконную программу, написанную целиком на PowerShell. Изврат, но так тоже можно, работает.

Всё это можно сделать с PowerShell.

Лично я не знал, что .Net фреймворк в стандартной инсталлляции Windows кроме рантайма включает и компилятор, стоит иметь в виду.

А включает он по смешной причине - у них ASP.NET изначально работал через генерацию кода и запуска компилятора прямо в рантайме. В какой-то момент майкрософт попыталась разделить фреймворки на 2 (Client и Full), но забила по причине бесполезности и путаницы с тем что надо ставить

а разве скомпилированный экзешник не будет проверен антивирем? всё равно что содержит cs файл, главное во что он скомпилируется и какое подозрение вызовет. в чём прикол такого использования? по заголовку статьи: "разработка без всего" - ну ок, в составе винды есть компиль и дальше что? писать в блокноте? я думаю я не один такой, который пользуется студией, потому что в ней куча утилит ускоряющих работу, а не невозможность программирования без неё в принципе.

в составе винды есть компиль и дальше что? писать в блокноте? я думаю я не один такой, который пользуется студией

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

Задумайтесь, если увидите любимую венду на атомной станции

Так получилось, что я видел. Все компьютеры, которые управляли хоть чем-то "интересным" работали в отдельных сетях, физически отвязанных даже от внутреннего интранета

И даже на "офисных" компах туториал обрывался бы на "Заходите в папку Windows"

Надеюсь что виденные объекты располагались далеко от Ленинградской области или Москвы с подмосковьем.

а какой потенциально опасный сценарий вы видите при работе на ПК с windows под пользователем, ограниченным в правах вплоть до белых списков ПО и с полным отсутствием доступа к системному диску, в плане влияния на соседний компьютер АСУТП, подключенного к другому не то, что ЛВС, а а даже к источнику 220?

а какой потенциально опасный сценарий

если на машине есть работающий компилятор, любой пользователь вне зависимости от прав и уровня доступа всегда может натворить дел.

Не существует защищенного окружения по определению и всегда можно выйти за рамки песочницы.

Кстати насчет системного диска: обычной (не embedded) Windows для работы нужен доступ на запись в системный диск, это не отключается и не настраивается в принципе.

А если есть такой доступ, то ограничение остается лишь на уровне вызовов API - через описанный в статье механизм привилегий и соответственно всегда остается возможность эскалации.

Не существует защищенного окружения по определению и всегда можно выйти за рамки песочницы.

Существует, и компилятор тут не причем.

любой пользователь вне зависимости от прав и уровня доступа всегда может натворить дел.

Так можно сразу взять топор и по реактору...

Существует, и компилятор тут не причем.

"Блажен кто верует", лишь скромно надеюсь что вы не имеете отношения к РВСН и вообще далеко от Питера и Москвы :)

Ну, вам как бы стоило бы взглянуть на ник пользователя, которому вы написали про РВСН и расстояния.

Ну а вам бы стоило хоть раз по делу написать, хоть один комментарий про разбор логики работы, про код и внутренее устройство.

Было бы гораздо лучше, честное слово.

Да вам и без меня уже всё написали, разве ещё что-то не понятно? Впрочем, уверен, однажды вы станете автором интересного и полезного сообществу материала.

Без вас к сожалению получается как обычно: два сообщения (с натяжкой) по делу, что крайне печалит с учетом сложности статьи.

Так что все также жду чего-то по делу.

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

Если покажете "Hello world" набитый опкодами в блокноте - пожму руку. Честно.

т.е. вы хотите сказать, что это невозможно? :) вы разве не видите в подходе с компилятором, что проблема вовсе не в компиляторе?

Возможно, но я хочу на это поглядеть )

ну вот смотрите. я не программист на ассемблере, и максимум что до этого на нём делал - это как раз хеллоуворлд, но вот вам PoC.

допустим вы хотите сделать что-то на аэс паловерде в арканзасе. это довольно серьёзно и у вас очень сильная мотивация, а значит трудности вас не остановят.

вы подготовили сначала программу, например вот такую: http://blog.code-cop.org/2015/07/hello-world-windows-32-assembly.html

скомпилировали у себя на машине (по ссылке есть описание как сделать). готовый экзешник занимает приблизительно 5 кило.

вы старательно, используя стеганографию, естественно, записываете все значения байт на листочки А4, в блокнот или просто запоминаете. (вы же не забыли, что миссия у вас очень ответственная)

затем на рабочем месте вы используете скажем команду echo:

echo 4D5A90000300000004000000FFFF > in.hex

если нужно, то куски объединяете при помощи copy.

или просто вот так текстом накидываете в блокнот. да не быстро, но это возможно и не сложно даже не особо подготовленному плохишу.

затем попробуете, скажем, вот такую команду в cmd:

certutil -decodehex in.hex hello.exe

и внезапно у вас рабочий бинарник.

данная инфа была собрана гуглежом и испробована меньше чем за 15 минут (естественно без учёта набора байтиков).

а теперь представьте, что вы действительно занимаетесь такими серьёзными вещами на аэс в арканзасе. разве наличие и отсутствие компилятора как-то повлияет на этот процесс?

Байты текстом умещаются на один экран

ну вот смотрите. я не программист на ассемблере

вот в том и проблема, что «не владея и не являясь» вы тем не менее считаете возможным поучать других.

Думаю вам самому стоит перечитать результат вашего же гугления и оценить возможность «разработки на опкодах».

не понял сути претензий. опкоды есть? есть. в блокноте? в блокноте. без компиля на целевой машине? без компиля. так что не так то? или вы хотели от меня увидеть как я вспоминаю структуру pe заголовков, красочно расписываю как я по табличке набиваю x86 опкоды? а смысл? опкоды вспоминаешь только когда что-то крякнуть нужно, вряд ли чаще :) я вам показал, что компилятор в том виде, в котором он поставляется в Винде не может навредить больше, чем его отсутствие. вам привели PoC как это можно сделать имея на том конце даже не очень шарящего агента. и БЕЗ компилятора.

вы хотели от меня увидеть как я вспоминаю структуру pe заголовков, красочно расписываю как я по табличке набиваю x86 опкоды?

именно этого.

Звучит смешно и несерьезно? Только так это происходит всегда когда кто-то предлагает "поработать в опкодах".

Но рад что вы хотя-бы понимаете процесс а не пустословите.

это было в вашей фантазии. вы сами придумали и сами обиделись :)

Кто мешает написать код и скомпилировать его на другой машине, напечатать готовые опкоды на листике и принести листик и вручную вбить его на целевой машине?

Между прочим таким образом когда-то для БК и спектрума программы в журналах печатались. Тупо 1-2 страницы дамп.

Никто не мешает, осталось только это сделать )

о да! спектрум так забивать было интересно! жаль я не понимал в детстве всю глубину глубин данного колдовства!)))

Ну так я вам и говорю: повторите это в современном окружении и напишите статью - зумеры от разработки будут в восторге, для них же это магия.

я повторил это в самом современном окружении при вас. шаги описал. зумеры не полезут на палоальто на рабочую станцию управления ядрён реактором. а тот кто имеет планы на сие - и без моей статьи разберётся

Блин, прочитал, интересная статья, думаю, поставлю плюсик автору. Поставил. Пошел читать комменты. Поменял плюсик на минус.

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

Если покажете "Hello world" набитый опкодами в блокноте - пожму руку. Честно.

TVprZXJuZWwzMgAAUEUAAEwBAwAAAAAAAAAAAAAAAAB4AA8DCwEAAAAAAAAAAAAAAAAAABQxAAAA
AAAADAAAAAAAQAAAEAAAAAIAAAQAAAABAAAABAAAAAAAAACmMQAAFAEAAAAAAAADAAAAAAAQAAAQ
AAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAB+MQAASwAAAAAAR2V0U3RkSGFuZGxlAAABAAAAABAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAwwHh4eHh4eHgAAQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAEAAMMB4eHh4eHh4AKYBAAAAMAAAkAEAAAIAAAAAAAAAAAAAAAAAAAAgADDgavX/FVsxQABQ
ieFqAFFqD2g4MUAAUP8VXzFAAGoA/xVXMUAASGVsbG8sIFdvcmxkIQ0KZTEAAJQwAAByMQAAAAAA
AGUxAACUMAAAcjEAAAAAAABFeGl0UHJvY2VzcwAAV3JpdGVGaWxlAEcxAAAAAAAAAAAAAAIwAABX
MQAA

Так подойдет?
Чтобы превратить в exe, просто сохраните в hello.txt и напишите в консоли
certutil -decode hello.txt hello.exe

любой пользователь вне зависимости от прав и уровня доступа всегда может натворить дел

И куда он после этого денется?

В подобных местах - пропускной режим. Кто работает за каким рабочим местом - все знают.

В таких условиях некому "натворить дел".

всегда может натворить дел

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

При попытке запуска левого (отсутствующего в правильном списке) файла, к вам через 5 минут прибегают злые мордовороты, у которых алярм прервал просмотр футбола.

Эманацию даёт.

А ведь в современных Linux-дистрибутивах компиляторы и утилиты для разработки не всегда поставляются. Windows 1 — 0 Linux.

утилиты для разработки не всегда поставляются

Если есть возможность запускать скрипты - то ведь можно запустить и apt-get install -y build-essential

Все же в статье речь идет о свежеустановленной ОС без доступа в интернет.

Если речь про Ubuntu где из базового дистрибутива убрали gcc - наверное да, но вообще для Linux всегда было характерным иметь в базовой системе все средства разработки вплоть до IDE. Уж emacs какой-нибудь точно был всегда.

То есть?
Баш, перл, питон, awk, sed, hexdump и другие - доступны из коробки
Да, gcc может отсутствовать, так он и не нужен в рантайме. Тут тогда вопросы к безопасности виндовс.

Основной вопрос, может я пропустил - а как же мне на чужом компе запустить скрипт на сборку чего-либо?

Например, воткнуть в USB порт девайс, представившийся клавиатурой, который откроет шелл и набъёт команды. Если подключение внешних дисков отключают часто, то вот подключение новой клавиатуры - далеко не всегда.

Вообще это первая часть и тут речь про один только голый компилятор csc.exe.

В качестве спойлера для второй части скажу, что нашелся и msbuild (те самые скрипты сборки) и реляционная СУБД и парсеры JSON/XML и HTTP-сервер с вебсокетами - все это внутри обычной пользовательской венды.

Так что дальше будет веселее.

Что помешало написать это в одной статье? Сейчас статья сводится к твиту "в Windows предустановлен компилятор C#".

Помешали масштабы, даже этот "твит" растянулся на 20 минут чтения.

Непонятно в чём масштабы. Указать путь к компилятору? Для таких "масштабов" есть формат постов.

Каждый раз, когда рассказываю о привилегиях и о привилегии SeShutdownPrivilege вижу непонимающие глаза. Зачем нам какие-то привилегии, если можно сделать shutdown /t 0 или ткнуть кнопку в пуске.

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

Ну а часть про csc... Эх, надеюсь автору не потребуется еще полтора года на то, чтобы посмотреть на LOLBAS.

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

В статье именно это и происходит - привилегия SeShutdownPrivilege выставляется искусственно.

Включается у процесса, без права на выключение вы её не включите.

И shutdown.exe тоже так делает.

Имеется ввиду полагаю серверная версия Windows, где это право есть только у администратора?

имеется ввиду любая версия Windows, где это право есть у конкретного юзера.
Дефолтные настройки это уже вторично.
Если я могу запустить штатный shutdown.exe, то я могу потушить машину через него. Если не могу запусить штатный shutdown.exe то и скомпилированную тулзу тоже не смогу.

То есть прикол с компилятором который есть в поставке - это правильный посыл статьи, а то, что компилятор позволяет что-то там взломать просто потому что вызов библиотечных функций через скомпилированный код - такого нет, и функции можно вызывать проще, через повершелл скрипт

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

Так ее может не быть только в серверной версии Windows у пользователя, в статье речь про обычную.

Это настраивается через gpedit, так что можно ограниченно сказать, что в домашних версиях это нельзя настроить. Хотя очевидно, что можно, просто не так удобно.

а разве вся обвязка политик из домашней версии не вырезана?

Смотря что вы понимаете под обвязкой. Убрана только mmc-оснастка.

Так а управление правами происходит разве не через нее? gpedit.msc же?

она лишь интерфейс.

Управление да, а хранится то где? Можно же напрямую, просто не так удобно.

Не может. shutdown делает ровно то же. что и в код статье - включает привилегию, если она есть и вызывает функцию. Если привилегии нет, то не выключает компьютер.

Не очень понял при чем тут LOLBAS но за наводку спасибо :)

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

Каждый раз, когда рассказываю о привилегиях и о привилегии SeShutdownPrivilege вижу непонимающие глаза

Я все же программист а не злобный хацкер и рассказываю про разработку а не взломы, поэтому пример с выключением это всего лишь пример кода, чуть длинее "Hello world" с вызовами WinAPI, чтобы разбор уместился в масштаб статьи а не книги.

Очень много спорного, nasm редко где есть при установке, чтобы на нем стоял аж suid бит не видел ни разу.

Все же для Linux подобный сайт собирать бессмысленно - очень много зависит от дистрибутива и набора установленного ПО.

Видимо просто поясняют, что если вдруг есть права запустить с рут правами какую-то штатную утилиту, то как при помощи этой утилиты "выйти из песочницы", типа как при помощи такой утилиты запустить баш или прочитать и вывести на консоль файл, к которому у юзера не должно быть доступа.

Как запустить шелл через top:

echo -e 'pipe\tx\texec /bin/sh 1>&0 2>&0' >>~/.config/procps/toprc
top


(Примеры типа как раньше в винде через справку можно было запустить процесс, например обычный проводник в киоск-режиме - есть доступ в какой-нить утилите к справке - вперед)

Автор: рассказывает про утилиту из LOLBAS, которая выполняет функции LOLBAS

Тоже автор: Не очень понял при чем тут LOLBAS

Компилятор csc.exe как-то не тянет на "утилитку". И по LOLBAS я раньше не знал )

если вы сидите на рабочей станции, где вместе с вами еще 30 пользователей

то это никакая не рабочая станция, а скорее всего терминальный сервер.

попытки снять ограничение с rdp на десктопной винде были, но работает нестабильно и в общем отвратительно.

за LOLBAS ловите +.

Да, я возможно неаккуратно назвал это дело рабочей станцией, но суть вы поняли правильно - я хотел противопоставить стандартному десктопу с одним пользователем.

Я когда-то собирался попробовать добиться стандартными средствами Винды создания графики, но руки не дошли. Есть только Пэйнт, но в ней нет таких функций:

-в какой-то старой версии ОС (98 или 2000) при выключении экран медленно терял цвет и становился черно-белым.

-в заголовках окон можно было выбирать цвета, чтобы создавать между ними переход.

-при выделении рамкой она добавляет синий оттенок фоновому слою.

-при перетаскивании картинок курсором в Проводнике они становятся как полупрозрачные спрайты.

-Aero - слой за заголовком окна виден, но размыт.

И т.д.

Т.е., по идее, можно ставить свою работу фоном, применять эти эффекты, скриншотить и переносить на саму работу.

А с какой целью полноценный компилятор C# ставится вместе с библиотеками .NET? Просто на всякий случай? Или же сами эти библиотеки нуждаются в этом компиляторе, например, для JIT-компиляции кода?

Вопрос к Microsoft. Кстати обычно стоит еще и несколько разных версий .NET - поищите csc.exe поиском в папке Windows.

ну да, в винде есть полноценный .NET Framework, HTTP.SYS и иже с ними. Доступен PowerShell(и не важно, скрипт не скрипт, в нем доступен весь .NET)

Поиграться можно, но что вы хотите этим сказать?

Не понятно поверхность атаки, имея на компе возможность запускать скрипты у вас и без этого достаточно векторов атаки.(кто мешает накидать не код, а по HEX'у передать бинарник)

PS: антивиры проверяют обычно совсем все, + отпечаток приложения зависит не от того где собран, а от версий инструментов.

ну да, в винде есть полноценный .NET Framework, HTTP.SYS и иже с ними. Доступен PowerShell(и не важно, скрипт не скрипт, в нем доступен весь .NET)

Поиграться можно, но что вы хотите этим сказать?

Что про данный факт мало кто знает.

По крайней мере никто из знакомых разработчиков (!) на .NET или админов Windows про такое не знал, а у меня их достаточно много.

На практике никто не задумывается, я давненько замечал это.

Потому что когда вы разрабатываете вы ставите IDE и она уже проверяет все что нужно обычно.

Описанная в статье проблема, вообще говоря, заключается не в наличии в системе компилятора полноценного языка программирования, а в самом механизме работы Windows. Там любая пользовательская программа может делать очень многое даже без прав администратора - читать и писать пользовательские файлы, лезть в интернет (ну или не совсем, смотря как Brandmauer настроен), создавать окна, в т. ч. полноэкранные, и даже как показано в данной статье выключать компьютер.

На популярных дистрибутивах GNU/Linux ситуация аналогична, кстати говоря. Без прав root всё ещё много чего можно делать.

По-хорошему это должно быть кардинально пересмотрено - чтобы какой-то непонятный exe имел минимум прав, вроде запрета на чтения пользовательских файлов, создания файлов вообще, выхода в интернет и вообще какого-либо взаимодействия с системой кроме создания не более одного окна. Потребление ресурсов тоже должно быть лимитировано - память/процессорное время.
Для нормальных программ (которые устанавливают) в каком-нибудь манифесте должен быть прописан набор разрешений, при чём некоторые из них могут быть принципиально несовместимыми (вроде доступа в интернет и чтения произвольных файлов). В этом нет ничего нового, мобильные ОС уже давно имеют такую систему прав.

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

Описанная в статье проблема, вообще говоря, заключается не в наличии в системе компилятора полноценного языка программирования

Именно что в этом наличии.

Первое что делал нормальный линуксовый сисадмин до эпохи виртуализации это удаление компиляторов с сервера, чтобы нельзя было локально собрать эксплоит для эскалации привилегий.

В Windows же получается что всегда есть неотключаемый и неудаляемый компилятор с полным доступом к WinAPI.

Первое что делал нормальный линуксовый сисадмин до эпохи виртуализации это удаление компиляторов с сервера, чтобы нельзя было локально собрать эксплоит для эскалации привилегий.

Увольте его пожалуйста.

Абсолютно не важно в каком виде придет эксплоит.

Именно что в этом наличии.

Это самообман.

Если вы говорите про безопасность, она кончилась на момент как у вас злоумышленник получил доступ к ПК с возможность создавать (не важно как файл запущен) и запускать файлы.

Вы можете скомпилировать у себя на компе бинарник заранее и так же записать его по байтам.

Для линукса в те времена (до эпохи виртуализации) было стабильно два шага:

1) проникновение с загрузкой файла

2) эскалация

Эксплоит делающий эскалацию до рута попадал на машину как раз в виде исходника и затем компилировался локально. Готовые бинарники плохо работали из-за разницы в библиотеках между дистрибутивами, так что загружали именно исходник.

Сейчас это уже не так актуально из-за повсеместной виртуализации и контейнеров, вылезать из которых сильно сложнее.

Готовые бинарники плохо работали из-за разницы в библиотеках между дистрибутивами, так что загружали именно исходник.

основные библиотеки совместимы довольно широко. Или у вас при обновлении любой библиотеки вся система пересобиралась?

Плюс большинство эксплоитов так же идет под определенные версии библиотек.

у меня сейчас бинарник виктории метрикс работает как под CentOS7 так и под Убунтами начиная с 20.04(тот же бинарник).

Так же и .Net Core

То есть для экспоита вам придется или изучать систему, или тупо тыкаться на наличие дырки.

Готовые бинарники плохо работали из-за разницы в библиотеках между дистрибутивами, так что загружали именно исходник.

С обратной совместимостью винды этой проблемы не возникает

Если вы говорите про безопасность, она кончилась на момент как у вас злоумышленник получил доступ к ПК с возможность создавать (не важно как файл запущен) и запускать файлы.

Вы можете скомпилировать у себя на компе бинарник заранее и так же записать его по байтам.

В ветке выше речь про линукс и сервер а не Windows и ПК. То что вы описали это проблематика все же больше вендов.

Обрезание прав до невозможности создания файла с битом запуска конечно возможно но сильно неудобно, поэтому я такого давно не видел.

Повторюсь что все эти «навороты» в прошлом, сейчас балом правит виртуализация а вся ОС целиком воспринимается как песочница — твори что хочешь, лишь бы из контейнера не вылезал.

В Windows же получается что всегда есть неотключаемый и неудаляемый компилятор с полным доступом к WinAPI.

Ну опять вы топите за "компилятор с полным доступом к WinAPI"
Еще раз. Винапи доступен из штатного повершелла, без всяких компиляторов.
Компилятор можно юзать для других вещей, но уж точно не стоит хайлайтить что только компилятор может что-то такое сделать с winapi, что не может повершелл. Тем боле что сейчас в винду несколько скриптовых языков встроено, и какие-то функции можно просто в cmd выполнить, какие-то из встроенного vbasic или jscript

Винапи доступен из штатного повершелла, без всяких компиляторов.

Вы точно программист а не сисадмин и понимаете что такое вызов процедур?

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

Даже в этой статье с максимально упрощенным кодом большая часть логики про заполнение структур данных, их передачу и получение в ответ такой же структуры данных - как вы собрались все это делать на PowerShell ?

Покажите, повторите хотя-бы описанную в статье логику на PowerShell.

@saboteur_kievчеловек просто не знает что такое powershell и думает что это рескин cmd, а тут вы со своими вопросами.

@alex0x08ну держите пример. Хотя думаю, что вы все равно будете ныть, что это не то.

Вот в этом и отличие между практикой и теорией:

$definition = @'
using System;
...
'@

Вы ведь не понимаете как оно работает правда? И что делает код на C# одной строкой забитый внутрь скрипта? Никаких вопросов это не вызвало?

А вы понимаете, как работает PowerShell?

Туда столько всего понапихано что наверное скорее нет чем да.

Но вызов динамической компиляции кода на С#, забитого внутрь строкой точно не повод говорить о «поддержке работы с WinAPI», извините.

Вам говорят, что WinAPI доступен из PowerShell. Примеры кода показывают, что доступен. Не вижу противоречия.

"Пусть говорят" , вам-то лично какое дело?

Лично мне как разработчику - большое: я знаю, что можно сделать из PS, если припрет. Лично мне как админу (если бы я был админом) - тоже больше: я знаю, что PS надо опасаться не меньше, чем любого приложения на .NET.

Нууу тут сложно однозначно сказать что страшнее.

C моей программисткой точки зрения доступ к компилятору безусловно опасней, поскольку даже без игр с API всегда можно устроить DDOS перегрузкой процессора или забить диск случайными данными, что точно также может вызвать аварийную ситуацию.

Но как бы для PowerShell есть готовые скрипты и векторы атак, создаваемые и обкатываемые именно со злонамеренными целями.

Так что однозначного ответа тут нет.

Вы не верите, что на скриптовом языке можно написать точно такую же программу, которая забьет диск случайными данными или загрузить процессор?
Скриптовый язык не умеет в файлы писать или расчеты делать что ли? Или с устройстваим не умеет взаимодействовать?

Есть ощущение, что вы недооцениваете что скриптовые языки и компилируемые языки отличаются не возможностями, а архитектурой исполнения. По возможностям они плюс-минус равны.

Не очень понимаю какая вам разница во что я верю, тут же техническая дискуссия а не церковь.

Но думаю сопоставлять по возможностям скриптовый и компилируемый языки все же не стоит, иначе может возникнуть дух г-на Луговского со всей его свитой.

И тут будет настолько адский срач что забрызгает вообще всех.

Можете привести тогда ваш пример, что скриптовый язык не может сделать по сравнению с компилируемым? по функционалу?

Гуглится в один клик (как пример):

FuzzySecurity | Low-Level Windows API Access From PowerShell

P.S. Была бы занятная статья, если б вы не претендовали на срыв покровов про безопасность и надежность. Ибо по сути вы описали, как с помощью компилятора пользователь может сделать то, что может сделать и так безо всякого компилятора.

А пойти чуть дальше гугления не смогли?

Я выше по треду уже ответил что на самом деле это не PowerShell такой умный, это код на C# с динамической компиляцией внутри. Но для вас полагаю разницы нет.

Я выше по треду уже ответил что на самом деле это не PowerShell такой умный, это код на C# с динамической компиляцией внутри

...и что? Речь как раз о том, что из PS можно вызвать любой код на .NET, в том числе динамически скомилированный. Поэтому, как вам и пишут, из PS можно получить (и люди регулярно получают) доступ к WinAPI.

Угу, а отлаживать этот код вы как собираетесь? С божьей помощью? Как взаимодействовать с ним после запуска?

Люди пишут дословно «полная замена компилятору» и «вызов любых функций и методов», чем вводят в заблуждение, поскольку вызывается на самом деле динамически скомпилированная программа, не имеющая никакого отношения к самому скрипту на PowerShell.

Угу, а отлаживать этот код вы как собираетесь?

Так же, как и код на C#, написанный в блокноте - с помощью вывода в консоль и такой-то матери. И это я в свое время как раз делал, так что не понимаю, в чем тут вопрос.

Как взаимодействовать с ним после запуска?

А зачем мне с ним взаимодействовать?

Люди пишут дословно «полная замена компилятору» и «вызов любых функций и методов», чем вводят в заблуждение, поскольку вызывается на самом деле динамически скомпилированная программа, не имеющая никакого отношения к самому скрипту на PowerShell.

Я вас еще раз спрашиваю: вы понимаете, что такое powershell, когда говорите, что вызов кода на .net не имеет к нему никакого отношения?

Так же, как и код на C#, написанный в блокноте - с помощью вывода в консоль и такой-то матери.

Что и событийную обработку? И асинхронщину с многопоточностью? Неужели до работы с отладчиком так и не дошли за годы практики?

А зачем мне с ним взаимодействовать?

Ну там ввод-вывод, передача данных. Через внешние файлы будете реализовывать?

вы понимаете, что такое powershell,

Я же написал уже что неграмотный, так что поделитесь откровением.

Что и событийную обработку? И асинхронщину с многопоточностью? Неужели до работы с отладчиком так и не дошли за годы практики?

А откуда это внезапно взялось? Речь шла про то, что можно написать код на C# в блокноте на машине, где нет ничего другого, и вам сказали, что можно с равным успехом это сделать в PowerShell.

Ну там ввод-вывод, передача данных. Через внешние файлы будете реализовывать?

Если понадобится - то да. Или можно HTTP-сервер внутри поднять. Если кому-то хочется развлекаться, то там всё есть.

Я же написал уже что неграмотный, так что поделитесь откровением.

Ключевое - вот: "PowerShell accepts and returns .NET objects". Поэтому взаимодействие с .NET - неотъемлемая часть работы в PowerShell (а командлеты просто это прячут под удобный синтаксис).

Если понадобится - то да. Или можно HTTP-сервер внутри поднять. Если кому-то хочется развлекаться, то там всё есть.

Inter-process communication через HTTP-сервер? Я думал вы сильно старше и уже прошли этот этап )

"PowerShell accepts and returns .NET objects". Поэтому взаимодействие с .NET - неотъемлемая часть работы в PowerShell (а командлеты просто это прячут под удобный синтаксис).

Тут уже ничего не скажу — до такого уровня использования PS не доходил.

Но если сделаете тестовый пример с двусторонней коммуникацией - будет интересно почитать. И наверное не только мне.

Inter-process communication через HTTP-сервер?

Вы говорили про ввод-вывод и передачу данных.

Внутри себя PowerShell передаёт объекты как и шарп.

Ну я же написал что до такой глубины использования PS не дошел.

По показанным примерам могу судить что взаимодействие между PS-скриптом и частью на C# примерно как между родительским и дочерним процессом, просто перед запуском дочернего происходит еще компиляция inline-кода.

Скорее всего вся обработка из PS заключается в перехвате стандарных потоков ввода-вывода для дочернего процесса в виде строк.

Но опять же всплыла тема с передачей объектов — непонятно тогда как это работает и в каком объеме, например есть ли там сериализация ( что автоматически исключает вещи вроде ссылок).

Если есть опыт с таким — показывайте примеры, будем разбирать.

Нет там дочернего процесса.

Подключается как обычная библиотека .net

Inter-process communication через HTTP-сервер? Я думал вы сильно старше и уже прошли этот этап )

Я уже достаточно "старше", чтобы не стесняться использовать то, что мне удобно.

Тут уже ничего не скажу — до такого уровня использования PS не доходил.

Это цитата из вступительного раздела, а операции с объектами и их свойствами - третья глава в 101. Так что это где-то в районе базового уровня.

это код на C# с динамической компиляцией внутри

Ну да, это общеизвестно примерно любому, кто плотно работает с PS.

Я могу сделать из PS вызов к WinAPI? Могу. Он сработает точно так же, как сработал бы, если бы я написал код с доступом к той же самой функции на произвольном языке и скомпилировал в экзешник? Да. Так в чем конкретно суть ваших претензий, можете объяснить?

Я могу сделать из PS вызов к WinAPI? Могу. 

Еще можете писать против ветра, только проверять не советую.

Речь не о том что можно а что нет, речь о полной замене компилятора csc.exe (видимо вместе с дебагером) на скрипт PowerShell — вот эту мысль пытаются продвигать комментаторы.

Что для меня звучит как откровенная дичь.

Это код на powershell с динамической компиляцией кода C#, поддержка которого рантаймом .NET известна.

когда называешь вещи своими имена выглядит немного иначе, не так ли?

Это вы меня жизни учите чтоли? Не стоит, я уже старенький.

Я воспринял статью не как описание проблемы, а как возможность использовать голую Windows без интернета для игрушечной разработки. В том, что при это можно написать эквивалент стандартной команды shutdown, ничего необычного нет.

И в итоге вы получаете два семейства компьютеров: основное -- в котором можно только то, что разрешил производитель исходя из тз. заказчика и дополнительное -- с использованием которого возможно разработка и настройка ПО для компьютеров основного семейства. Что-то такое, вроде как, делает IBM.

Слушайте, я не хочу такого. честно.

У меня есть железка, на которой я запускаю всякое, компилирую всякое. Пусть оно работает как железка со всякими кодами.

Это не "продукт" для банковских операций, безопасного серфинга и тп.

Если кому нужен такой продукт - я не против, пусть ставят себе что-то мобильно-безопасное и пользуются. Но ведь ПК создавался совсем не как домашнее устройство, и все эти ограничения на нем - как на корове седло.

Когда я увидел название статьи, то решил, что будет инструкция по созданию супер лёгкого образа Windows 10, которая в состоянии работать "из коробки" на компьютере без интернета. А так же использовать все возможности такой системы с полной отдачей. Так уж совпало, что пару минут назад на глаза попался ролик, в которм показан запуск IBM PC 486. Это вызвало ностальгические чувства по тем системам и корпусам. Так вот, считаю, что автор чуть не дожал. Идею я вам подкинул.

Напишу отдельно.

Вы молодец что нашли что чистая винда без интернета что-то умеет. Нашли куски компонента о наличии которых обычно никто не задумывается.

Но, пожалуйста, перестаньте приплетать безопасность. Наличие/отсутствие компилятора мало что меняет в этом плане. Считать что раз у меня нет компиляторов, то у меня не запустят эксплоит это Security through obscurity.

Считать что раз у меня нет компиляторов, то у меня не запустят эксплоит это Security through obscurity.

«Взломать можно все что угодно» — звучит разумеется страшно, но это лишь теория. «Использовать для взлома готовые эксплоиты А,Б и С» — звучит обыденно, но это практика, которая работает.

Небольшой вопрос: требуется именно SDK, или прям достаточно Runtime версии .net? версия 4.5 в целом поставляется на десятке автоматом.

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

Компилятор C# (там еще компиляторы Visual Basic и JScript) есть только в .NET SDK, поэтому без него скомпилировать .exe не выйдет.

Но вот с рантаймом все сложнее: сам запуск осуществляет ОС по сигнатуре исполняемого файла, вне зависимости от того есть ли на машине установленный рантайм .NET. А вот уже дальше если рантайма нужной версии нет то произойдет ошибка.

При этом рантайм .NET это динамическая библиотека (несколько), разные версии которой обязательно присутствуют в Windows.

Компилятор C# (там еще компиляторы Visual Basic и JScript) есть только в .NET SDK

В этот момент у меня все-таки есть два вопроса.

  1. Компилятор есть только в SDK или в рантайме тоже?

  2. На обычной пользовательской винде из коробки стоит только рантайм или SDK тоже?

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

Компилятор есть только в SDK или в рантайме тоже?

Запускабельные бинарники вроде csc.exe точно есть только в SDK, но сами функции динамической компиляции скорее всего есть и в самом рантайме, который в виде библиотеки.

На обычной пользовательской винде из коробки стоит только рантайм или SDK тоже?

Присутствует (не установлен как компонент и не удаляем стандартными средствами) и .NET SDK и рантайм, причем нескольких версий.

Запускабельные бинарники вроде csc.exe точно есть только в SDK
Присутствует (не установлен как компонент и не удаляем стандартными средствами) и .NET SDK и рантайм

Как формально вы разделяете SDK и рантайм? На основании чего вы говорите, что csc есть только в SDK, хотя он лежит в C:\Windows\Microsoft.NET\Framework64 (это, насколько я помню, папка именно рантайма)?

C:\Windows\Microsoft.NET\Framework64

Не совсем так. Внутри этой папки есть еще с номерами версий, вот то что внутри уже SDK.

Рантайм для приложения на .NET это просто библиотека, либо поставляемая вместе с приложением либо взятая из системы.

Разделение на SDK и рантайм ни разу не формальное а очень даже реальное, можете посмотреть внутрь .cab архива обновления с обоими чтобы увидеть разницу.

Не совсем так. Внутри этой папки есть еще с номерами версий, вот то что внутри уже SDK.

Нет, то, что внутри - это разные версии .NET framework.

Рантайм для приложения на .NET это просто библиотека, либо поставляемая вместе с приложением либо взятая из системы.

Вы говорите про .NET (который современный, который раньше был .NET Core), или про .NET Framework (в котором это совершенно точно не так)?

Разделение на SDK и рантайм ни разу не формальное а очень даже реальное

Я спрашиваю, как вы отличаете, что есть что.

Версия v4 это точно не Core, внутренних версий старше 4й внутри Windows я пока не встречал, так что видимо оно называется Net Framework.

Я спрашиваю, как вы отличаете, что есть что.

Мне лично внутренний голос подсказывает. Так в чем вопрос?

Версия v4 это точно не Core, внутренних версий старше 4й внутри Windows я пока не встречал, так что видимо оно называется Net Framework.

Тогда утверждение "Рантайм для приложения на .NET это просто библиотека, либо поставляемая вместе с приложением либо взятая из системы." - неверно. Рантайм для .NET framework приложения - это .NET Framework, и он существенно больше, чем "просто библиотека".

Так в чем вопрос?

В том, с чего вы решили, что с Windows поставляется SDK, а не рантайм.

Слушайте этот .NET SDK найденный внутри Windows не отображается в списке системных компонентов. Визуально внутри больше библиотек чем в обычном, скачиваемом с сайта Microsoft, поэтому как официально он называется понятия не имею.

Внутри также есть определенные нестыковки, например лежат части ASP.NET (в частности админка) и компилятор ASP страниц, но нет самого сервера приложений, те собрать полноценное ASP.NET приложение не получится.

Так что ".NET SDK" это скорее условное название, чтобы хоть как-то это обозначать.

Какой-либо официальной информации по этой версии нет, описания тоже. Если у вас получится раскопать больше деталей по этой штуке — дайте знать, буду благодарен.

Слушайте этот .NET SDK

...почему вы считаете, что это SDK?

не отображается в списке системных компонентов

А почему должен?

Так что ".NET SDK" это скорее условное название, чтобы хоть как-то это обозначать.

Это называется .NET Framework

Какой-либо официальной информации по этой версии нет

Есть. Идете вот сюда и смотрите, какие версии имеют зеленую галочку (поставлены по умолчанию): https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/versions-and-dependencies#version-information

(я, кстати, был неправ, и рантаймом правильно называть CLR, но это еще более третья вещь, которая у вас вообще нигде не упоминается)

Ну кстати в установке и удалении компонетов(от старого списка программ) отображаются 3.5 и 4.8

Я это не могу проверить, у меня нет чистой лабораторной машины (ну и это для меня не важно, на самом деле).

А чистота уже не важна.

Это там где HyperV включается и тп.

Там записи зависят от версии видны поидее

Чистота важна в том смысле, что если я попробую на своей (разработческой) машине, то я не могу быть уверен, что записи, которые я там увижу, не от тех паков, которые я сам ставил после.

Там разница лишь в наличии галочки.

В том меню от ваших действий не может ничего добавится.

Это не список программ или установленного.

Это список доступного(плюс галочка если установлено)

Все что ставите позже находится в обычных программах.

Microsoft официально предоставляет виртуальные образы со всеми текущими версиями Windows.

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

Microsoft официально предоставляет виртуальные образы со всеми текущими версиями Windows.

Я в курсе. Я просто не хочу тратить время на их установку, мне это не нужно в моей повседневной работе.

мне это не нужно в моей повседневной работе.

А устроить срач на 100 постов по поводу правильного написания - часть вашей работы? Вам за это деньги платят?

Нет, и нет.

А я вот почему-то думаю что да.

Вы же не ответили по существу ни на один вопрос, не привнесли ничего нового — так смысл дальше с вами дискутировать?

нет они есть в рантайме, так как System.CodeDom часть рантайма.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории