Есть компьютер с чистой копией Windows, без доступа в интернет и без каких‑либо установленных средств разработки. Только одна чистая пользовательская «венда». Не поверите, но даже в таких спартанских условиях возможно написать и запустить полноценную программу. И сейчас я расскажу как.
Ужасы познания
На самом деле в ОС семейства Windows с самого их начала было внутри столько всякого интересного, что никакой статьи не хватит описать, так что выпусков будет много ;)
Но почему-то мало кто об этом знает даже из разработчиков, особенно современных.
Спросите ради интереса знакомых разработчиков, возможно ли программировать на «чистой» пользовательской Windows без установки Visual Studio — удивитесь ответам.
Ну и разумеется насаждаемый «пользовательский» подход самой Microsoft, которая ковыряние во внутренностях своих продуктов мягко говоря никогда не поощряла, создал эдакий ореол простоты и надежности, без необходимости разбираться как оно внутри устроено.
Поэтому описанное ниже наверное вызовет определенный ужас как у обычных пользователей так и некоторых разработчиков — особенно если они обучались по видеокурсам ничего не знают об истории ОС Windows.
Начну с цитаты из одной интересной статьи:
Over the past few months, I've received several variations on this question for other operating systems and all of the released versions of the .NET Framework. When the .NET Framework is installed as a part of the OS, it does not appear in the Programs and Features (or Add/Remove Programs) control panel. The following is a complete list of which version of the .NET Framework is included in which version of the OS
И ниже длинный такой список с версиями. А вот еще один если вдруг первого оказалось недостаточно.
Ну казалось бы и.. что? Чего тут такого?
Про .NET SDK все и так знают, временами его необходимо установить «для запуска игор», временами он сам ставится в виде зависимой библиотеки и никому не мешает.
Все так, да.
Только что-то мне подсказывает внутрь вы не заглядывали, правда? Поэтому на что эта штука на самом деле способна не представляете.
А я представляю и сейчас расскажу.
Заходите в папку Windows на вашем компьютере, вот сюда:
Файлт csc.exe — самый настоящий компилятор, фактически портал в ад на вашем обычном домашнем компьютере.
Почему все так страшно?
Потому что через какое-то время вы обнаружите себя сильно заросшим, с бородой и красными глазами, проводящим ночи за компьютером и медленно мутирующим в программиста.
Шучу.
А если серьезно:
появляется возможность создания нативных программ сразу на вашем компьютере, минуя стадию проверки электронной подписи, проверки антивирусом, проверки электронного письма и так далее.
В отличие от VB или PowerShell-скриптов, которые анализируются перед запуском любым приличным антивирусом, антивирусы не анализируют исходный код программ на C# и куда лояльнее относятся к программам собранным локально на этой же машине.
Так что веселье начинается.
Простой пример
Для начала будет простой пример, который просто показывает стандартный диалог с сообщением. Именно его в запущенном виде вы можете видеть на заглавной картинке в статье.
Весь процесс от кода до запуска я записал на видео:
Исходный код тут казалось бы максимально простой, но с одним интересным нюансом про который ниже:
using System;
using System.Runtime.InteropServices;
namespace yoba
{
class Program
{
// импортирование нативной WinAPI функции MessageBox.
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);
static void Main(string[] args)
{
//вызываем и показываем диалог
MessageBox(IntPtr.Zero, "Йоу!", "Добро пожаловать в разработку!", 0);
}
}
}
Сохраняете этот текст обычным «блокнотом» в файл yoba.cs и запускаете сборку:
c:\Windows\Microsoft.NET\Framework\v3.5\csc.exe yoba.cs
Таким образом я запускал сборку на Windows 10, но имейте ввиду что версия системного .NET SDK может отличаться и например в Windows 11 уже будет:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe yoba.cs
После сборки рядом с исходным файлом yoba.cs появится и запускабельный бинарник yoba.exe, который вы сможете запустить.
А теперь про нюанс.
Нюанс
Существует определенное предубеждение по отношению к managed‑языкам вроде Java и С# — они не подходят для серьезных дел вроде написания эксплоитов, использования 0day‑уязвимостей и пенетрации ядра.
Что все подобные вещи творят
в глубокой тайнена чистом Си, в крайнем случае на C++ а все эти ваши Java/C# не более чем «погремушки для детей», не достойные даже косого взгляда серьезного профессионала.
Вот тут и начинается нюанс, посмотрите на эту радость:
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd,
string lpText, string lpCaption, uint uType);
Это мои дорогие читатели, ни что иное как вызов нативного WinAPI, с помощью которого творили всякое нехорошее в далекие 90е.
C# и .NET имеет оооочень глубокую интеграцию с Windows, несмотря на всю свою «безопасность» и управляемость, поэтому легко и просто может заменить собой и Си и С++ в качестве инструмента для нехороших дел.
И оно живет на вашем компьютере, дома и в офисе, с постоянной пропиской и регистрацией.
Но разумеется столь простого примера несколько мало для осознания глубины проблемы, поэтому я подготовил кое-что более серьезное.
Сложный пример: выключаем Windows
Итак, это будет относительно небольшое приложение на C#, выключающее компьютер без предупреждения и подтверждения пользователя. И само собой без прав администратора.
Просто так, внезапно.
Последствия думаю каждый из читателей сможет оценить для себя сам.
Весь процесс на видео (разумеется это виртуальная машина):
А теперь код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using System.Diagnostics;
using System.Management;
using System.Security.Permissions;
using System.Runtime.InteropServices;
namespace yoba
{
// See http://www.developmentnow.com/g/33_2004_12_0_0_33290/Access-Denied-on-ManagementEventWatcher-Start.htm
// Calling this code on backup/restore seems to enable BCD
public class TokenHelper
{
// PInvoke stuff required to set/enable security privileges
[DllImport("advapi32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(
System.IntPtr ProcessHandle, // handle to process
int DesiredAccess, // desired access to process
ref IntPtr TokenHandle // handle to open access token
);
[DllImport("kernel32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int AdjustTokenPrivileges(
IntPtr TokenHandle,
int DisableAllPrivileges,
IntPtr NewState,
int BufferLength,
IntPtr PreviousState,
ref int ReturnLength);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool LookupPrivilegeValue(
string lpSystemName,
string lpName,
ref LUID lpLuid);
[StructLayout(LayoutKind.Sequential)]
internal struct LUID
{
internal int LowPart;
internal int HighPart;
}
[StructLayout(LayoutKind.Sequential)]
struct LUID_AND_ATTRIBUTES
{
LUID Luid;
int Attributes;
}
[StructLayout(LayoutKind.Sequential)]
struct _PRIVILEGE_SET
{
int PrivilegeCount;
int Control;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=1)] // ANYSIZE_ARRAY = 1
LUID_AND_ATTRIBUTES [] Privileges;
}
[StructLayout(LayoutKind.Sequential)]
internal struct TOKEN_PRIVILEGES
{
internal int PrivilegeCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
internal int[] Privileges;
}
const int SE_PRIVILEGE_ENABLED = 0x00000002;
const int TOKEN_ADJUST_PRIVILEGES = 0X00000020;
const int TOKEN_QUERY = 0X00000008;
const int TOKEN_ALL_ACCESS = 0X001f01ff;
const int PROCESS_QUERY_INFORMATION = 0X00000400;
public static bool SetPrivilege (string lpszPrivilege, bool
bEnablePrivilege )
{
bool retval = false;
int ltkpOld = 0;
IntPtr hToken = IntPtr.Zero;
TOKEN_PRIVILEGES tkp = new TOKEN_PRIVILEGES();
tkp.Privileges = new int[3];
TOKEN_PRIVILEGES tkpOld = new TOKEN_PRIVILEGES();
tkpOld.Privileges = new int[3];
LUID tLUID = new LUID();
tkp.PrivilegeCount = 1;
if (bEnablePrivilege)
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
else
tkp.Privileges[2] = 0;
if(LookupPrivilegeValue(null , lpszPrivilege , ref tLUID))
{
Process proc = Process.GetCurrentProcess();
if(proc.Handle != IntPtr.Zero)
{
if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
ref hToken) != 0)
{
tkp.PrivilegeCount = 1;
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
tkp.Privileges[1] = tLUID.HighPart;
tkp.Privileges[0] = tLUID.LowPart;
const int bufLength = 256;
IntPtr tu = Marshal.AllocHGlobal( bufLength );
Marshal.StructureToPtr(tkp, tu, true);
if(AdjustTokenPrivileges(hToken, 0, tu, bufLength, IntPtr.Zero, ref
ltkpOld) != 0)
{
// successful AdjustTokenPrivileges doesn't mean privilege could be changed
if (Marshal.GetLastWin32Error() == 0)
{
retval = true; // Token changed
}
}
TOKEN_PRIVILEGES tokp = (TOKEN_PRIVILEGES) Marshal.PtrToStructure(tu,
typeof(TOKEN_PRIVILEGES) );
Marshal.FreeHGlobal( tu );
}
}
}
if (hToken != IntPtr.Zero)
{
CloseHandle(hToken);
}
return retval;
}
}
class ShutDown
{
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool ExitWindowsEx(int flg, int rea);
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
static void Main(string[] args)
{
TokenHelper.SetPrivilege("SeShutdownPrivilege",true);
ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
}
}
}
Обращаю внимание что это не эксплоит, не дыра, не баг и не уявимость а вполне себе стандартный функционал. Просто так получилось что о нем мало кто знает.
Собирается по аналогии с предыдущим примером:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Shutdown.cs
После запуска компьютер практически немедленно выключится:
проверено и в виртуальной машине и на железе, на 10й и 11й Windows.
Рассказываю как это работает.
Ключевая функция — ExitWindowsEx, которая и отвечает за завершение работы ОС. Эта функция очень старая и известная, существует еще со времен Windows 95.
Но для ее вызова нужны «привилегии», которые и выставляет программно класс TokenHelper.
Константы ниже:
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
используются вместе с "побитовым или" для указания на требуемое действие.
Вот еще допустимые варианты:
internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;
internal const int EWX_FORCEIFHUNG = 0x00000010;
Описание их всех находится все там же — в официальном руководстве, не поверите.
Теперь давайте разбираться как же работает столь жесткое забивание на систему защиты еще и стандартными средствами:
TokenHelper.SetPrivilege("SeShutdownPrivilege",true);
И начнем мы с импортов.
Первое что импортируется это функция OpenProcessToken:
[DllImport("advapi32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(
System.IntPtr ProcessHandle, // handle to process
int DesiredAccess, // desired access to process
ref IntPtr TokenHandle // handle to open access token
);
Функция отвечает за получение данных о наборе «привилегий», связанных с конкретным процессом. Собственно набор таких привилегий и называется «токеном».
Вот как эта функция вызывается:
if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
ref hToken) != 0)
{
..
Тут надо отметить передачу по ссылке в стиле Си (ref hToken), когда в функцию передается ссылка на объект C#, дальше функция этот объект заполняет данными. А возвращает она просто true или false — статус выполнения, отработала функция или нет.
Дальше импортируется простая и банальная функция освобождения ресурсов:
[DllImport("kernel32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
Вызывается она в самом конце, после всей логики и нужна только для освобождения использованной памяти под токен привилегий:
if (hToken != IntPtr.Zero)
{
CloseHandle(hToken);
}
Наконец главная функция, непосредственно отвечающая за переключение привилегий:
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int AdjustTokenPrivileges(
IntPtr TokenHandle,
int DisableAllPrivileges,
IntPtr NewState,
int BufferLength,
IntPtr PreviousState,
ref int ReturnLength);
Вот весь ключевой блок логики смены привилегий:
if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
ref hToken) != 0)
{
tkp.PrivilegeCount = 1;
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
tkp.Privileges[1] = tLUID.HighPart;
tkp.Privileges[0] = tLUID.LowPart;
const int bufLength = 256;
IntPtr tu = Marshal.AllocHGlobal( bufLength );
Marshal.StructureToPtr(tkp, tu, true);
if(AdjustTokenPrivileges(hToken, 0, tu, bufLength, IntPtr.Zero, ref
ltkpOld) != 0)
{
// successful AdjustTokenPrivileges doesn't mean privilege could be changed
if (Marshal.GetLastWin32Error() == 0)
{
retval = true; // Token changed
}
}
TOKEN_PRIVILEGES tokp = (TOKEN_PRIVILEGES) Marshal.PtrToStructure(tu,
typeof(TOKEN_PRIVILEGES) );
Marshal.FreeHGlobal( tu );
}
Как видите вызов достаточно сложный, используется Сишный процедурный подход к заполнению полей структуры и передачи его по ссылке в вызываемую функцию.
После вызова проверяется наличие ошибки, также в стиле Си:
if (Marshal.GetLastWin32Error() == 0)
{
retval = true; // Token changed
}
0 это код возрата для успешного вызова, если он есть — считается что операция смены привилегий была выполнена успешно.
Наконец последняя функция, про которую стоит рассказать:
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool LookupPrivilegeValue(
string lpSystemName,
string lpName,
ref LUID lpLuid);
Она отвечает за поиск привилегии по имени, полагаю ведь заметили что мы передаем некое кодовое наименование при вызове TokenHelper:
TokenHelper.SetPrivilege("SeShutdownPrivilege",true);
Именно эта функция отвечает за поиск конкретной привилегии по названию «SeShutdownPrivilege», вот так выглядит ее вызов:
if (bEnablePrivilege)
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
else
tkp.Privileges[2] = 0;
if(LookupPrivilegeValue(null , lpszPrivilege , ref tLUID))
{
..
Переменная bEnablePrivilege булевая, это и есть то самое true передаваемое в качестве второго аргумента, а блок:
if (bEnablePrivilege)
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
else
tkp.Privileges[2] = 0;
отвечает за формирование правильного вызова с использованием системных констант (SE_PRIVILEGE_ENABLED).
При вызове также передается ссылка (ref tLUID) на объект LUID, который будет содержать после вызова указание на найденную привилегию.
Вот такие дела.
Итого
Все описанное не призыв к немедленным действиям, а лишь повод к размышлению о смысле бытия. Ну там насчет надежности, безопасности и всего такого — что вам продает большая иностранная корпорация.
Задумайтесь, если увидите любимую венду на атомной станции или военном объекте — без всяких ЦРУ и хакеров в ОС Windows адова гора функционала, который легко и просто можно использовать во вред.
Я много еще чего могу рассказать про мир Windows и его внутренее устройство, так что будут еще статьи на эту тему. И надеюсь хоть кто-то задумается, сделает выводы и поймет что «массовому» продукту не место в серьезных местах, где нужна настоящая защита и настоящая безопасность.
Это немного отцезурированная версия моей статьи, оригинал доступен в нашем блоге. Сейчас готовится вторая часть этой статьи, где будет рассказ про современную веб‑разработку в таких же условиях — следите за анонсами!
0x08 Software
Мы небольшая команда ветеранов ИТ‑индустрии, создаем и дорабатываем самое разнообразное программное обеспечение, наш софт автоматизирует бизнес‑процессы на трех континентах, в самых разных отраслях и условиях.
Оживляем давно умершее, чиним никогда не работавшее и создаем невозможное — затем рассказываем об этом в своих статьях.
Комментарии (160)
aaoo
21.08.2024 12:37а разве скомпилированный экзешник не будет проверен антивирем? всё равно что содержит cs файл, главное во что он скомпилируется и какое подозрение вызовет. в чём прикол такого использования? по заголовку статьи: "разработка без всего" - ну ок, в составе винды есть компиль и дальше что? писать в блокноте? я думаю я не один такой, который пользуется студией, потому что в ней куча утилит ускоряющих работу, а не невозможность программирования без неё в принципе.
uuger
21.08.2024 12:37+9Задумайтесь, если увидите любимую венду на атомной станции
Так получилось, что я видел. Все компьютеры, которые управляли хоть чем-то "интересным" работали в отдельных сетях, физически отвязанных даже от внутреннего интранета
И даже на "офисных" компах туториал обрывался бы на "Заходите в папку Windows"
alex0x08 Автор
21.08.2024 12:37Надеюсь что виденные объекты располагались далеко от Ленинградской области или Москвы с подмосковьем.
uuger
21.08.2024 12:37+4а какой потенциально опасный сценарий вы видите при работе на ПК с windows под пользователем, ограниченным в правах вплоть до белых списков ПО и с полным отсутствием доступа к системному диску, в плане влияния на соседний компьютер АСУТП, подключенного к другому не то, что ЛВС, а а даже к источнику 220?
alex0x08 Автор
21.08.2024 12:37а какой потенциально опасный сценарий
если на машине есть работающий компилятор, любой пользователь вне зависимости от прав и уровня доступа всегда может натворить дел.
Не существует защищенного окружения по определению и всегда можно выйти за рамки песочницы.
Кстати насчет системного диска: обычной (не embedded) Windows для работы нужен доступ на запись в системный диск, это не отключается и не настраивается в принципе.
А если есть такой доступ, то ограничение остается лишь на уровне вызовов API - через описанный в статье механизм привилегий и соответственно всегда остается возможность эскалации.
saboteur_kiev
21.08.2024 12:37+7Не существует защищенного окружения по определению и всегда можно выйти за рамки песочницы.
Существует, и компилятор тут не причем.
любой пользователь вне зависимости от прав и уровня доступа всегда может натворить дел.
Так можно сразу взять топор и по реактору...
alex0x08 Автор
21.08.2024 12:37Существует, и компилятор тут не причем.
"Блажен кто верует", лишь скромно надеюсь что вы не имеете отношения к РВСН и вообще далеко от Питера и Москвы :)
maikuss
21.08.2024 12:37+2Ну, вам как бы стоило бы взглянуть на ник пользователя, которому вы написали про РВСН и расстояния.
alex0x08 Автор
21.08.2024 12:37Ну а вам бы стоило хоть раз по делу написать, хоть один комментарий про разбор логики работы, про код и внутренее устройство.
Было бы гораздо лучше, честное слово.
maikuss
21.08.2024 12:37+2Да вам и без меня уже всё написали, разве ещё что-то не понятно? Впрочем, уверен, однажды вы станете автором интересного и полезного сообществу материала.
alex0x08 Автор
21.08.2024 12:37Без вас к сожалению получается как обычно: два сообщения (с натяжкой) по делу, что крайне печалит с учетом сложности статьи.
Так что все также жду чего-то по делу.
aaoo
21.08.2024 12:37+6ерунда. если уж сильно хочется натворить дел на такой машине, то и компилятор не нужен. опкоды в зубы и погнали в блокноте накидывать. уязвимости тут нет
alex0x08 Автор
21.08.2024 12:37Если покажете "Hello world" набитый опкодами в блокноте - пожму руку. Честно.
aaoo
21.08.2024 12:37т.е. вы хотите сказать, что это невозможно? :) вы разве не видите в подходе с компилятором, что проблема вовсе не в компиляторе?
alex0x08 Автор
21.08.2024 12:37Возможно, но я хочу на это поглядеть )
aaoo
21.08.2024 12:37+10ну вот смотрите. я не программист на ассемблере, и максимум что до этого на нём делал - это как раз хеллоуворлд, но вот вам 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 минут (естественно без учёта набора байтиков).
а теперь представьте, что вы действительно занимаетесь такими серьёзными вещами на аэс в арканзасе. разве наличие и отсутствие компилятора как-то повлияет на этот процесс?
Байты текстом умещаются на один экран
alex0x08 Автор
21.08.2024 12:37ну вот смотрите. я не программист на ассемблере
вот в том и проблема, что «не владея и не являясь» вы тем не менее считаете возможным поучать других.
Думаю вам самому стоит перечитать результат вашего же гугления и оценить возможность «разработки на опкодах».
aaoo
21.08.2024 12:37+3не понял сути претензий. опкоды есть? есть. в блокноте? в блокноте. без компиля на целевой машине? без компиля. так что не так то? или вы хотели от меня увидеть как я вспоминаю структуру pe заголовков, красочно расписываю как я по табличке набиваю x86 опкоды? а смысл? опкоды вспоминаешь только когда что-то крякнуть нужно, вряд ли чаще :) я вам показал, что компилятор в том виде, в котором он поставляется в Винде не может навредить больше, чем его отсутствие. вам привели PoC как это можно сделать имея на том конце даже не очень шарящего агента. и БЕЗ компилятора.
alex0x08 Автор
21.08.2024 12:37вы хотели от меня увидеть как я вспоминаю структуру pe заголовков, красочно расписываю как я по табличке набиваю x86 опкоды?
именно этого.
Звучит смешно и несерьезно? Только так это происходит всегда когда кто-то предлагает "поработать в опкодах".
Но рад что вы хотя-бы понимаете процесс а не пустословите.
saboteur_kiev
21.08.2024 12:37+2Кто мешает написать код и скомпилировать его на другой машине, напечатать готовые опкоды на листике и принести листик и вручную вбить его на целевой машине?
Между прочим таким образом когда-то для БК и спектрума программы в журналах печатались. Тупо 1-2 страницы дамп.
aaoo
21.08.2024 12:37+1о да! спектрум так забивать было интересно! жаль я не понимал в детстве всю глубину глубин данного колдовства!)))
alex0x08 Автор
21.08.2024 12:37Ну так я вам и говорю: повторите это в современном окружении и напишите статью - зумеры от разработки будут в восторге, для них же это магия.
aaoo
21.08.2024 12:37я повторил это в самом современном окружении при вас. шаги описал. зумеры не полезут на палоальто на рабочую станцию управления ядрён реактором. а тот кто имеет планы на сие - и без моей статьи разберётся
vvzvlad
21.08.2024 12:37+3Блин, прочитал, интересная статья, думаю, поставлю плюсик автору. Поставил. Пошел читать комменты. Поменял плюсик на минус.
saboteur_kiev
21.08.2024 12:37Ну это как раз одна из тех статей, где в комментариях можно узнать много интересного. Я вот тоже узнал парочку интересных моментов больше из комментариев, чем из статьи
saboteur_kiev
21.08.2024 12:37+2Если покажете "Hello world" набитый опкодами в блокноте - пожму руку. Честно.
TVprZXJuZWwzMgAAUEUAAEwBAwAAAAAAAAAAAAAAAAB4AA8DCwEAAAAAAAAAAAAAAAAAABQxAAAA AAAADAAAAAAAQAAAEAAAAAIAAAQAAAABAAAABAAAAAAAAACmMQAAFAEAAAAAAAADAAAAAAAQAAAQ AAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAB+MQAASwAAAAAAR2V0U3RkSGFuZGxlAAABAAAAABAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAwwHh4eHh4eHgAAQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAA AAAAAEAAMMB4eHh4eHh4AKYBAAAAMAAAkAEAAAIAAAAAAAAAAAAAAAAAAAAgADDgavX/FVsxQABQ ieFqAFFqD2g4MUAAUP8VXzFAAGoA/xVXMUAASGVsbG8sIFdvcmxkIQ0KZTEAAJQwAAByMQAAAAAA AGUxAACUMAAAcjEAAAAAAABFeGl0UHJvY2VzcwAAV3JpdGVGaWxlAEcxAAAAAAAAAAAAAAIwAABX MQAA
Так подойдет?
Чтобы превратить в exe, просто сохраните в hello.txt и напишите в консоли
certutil -decode hello.txt hello.exe
Zenitchik
21.08.2024 12:37любой пользователь вне зависимости от прав и уровня доступа всегда может натворить дел
И куда он после этого денется?
В подобных местах - пропускной режим. Кто работает за каким рабочим местом - все знают.
В таких условиях некому "натворить дел".
Quarc
21.08.2024 12:37всегда может натворить дел
Ни черта у вас не получится, точнее запускать компилятор вы можете сколько угодно и клепать екзешники в любых количествах, но запустить наклепанное у вас не получится.
При попытке запуска левого (отсутствующего в правильном списке) файла, к вам через 5 минут прибегают злые мордовороты, у которых алярм прервал просмотр футбола.
Ukrainskiy
21.08.2024 12:37+3А ведь в современных Linux-дистрибутивах компиляторы и утилиты для разработки не всегда поставляются. Windows 1 — 0 Linux.
codecity
21.08.2024 12:37утилиты для разработки не всегда поставляются
Если есть возможность запускать скрипты - то ведь можно запустить и apt-get install -y build-essential
Raidenyn
21.08.2024 12:37Так-то связка find и mkdir утилит тьюринг полная. Если что-то надо заскриптовать, то и этого будет достаточно.
alex0x08 Автор
21.08.2024 12:37Если речь про Ubuntu где из базового дистрибутива убрали gcc - наверное да, но вообще для Linux всегда было характерным иметь в базовой системе все средства разработки вплоть до IDE. Уж emacs какой-нибудь точно был всегда.
saboteur_kiev
21.08.2024 12:37То есть?
Баш, перл, питон, awk, sed, hexdump и другие - доступны из коробки
Да, gcc может отсутствовать, так он и не нужен в рантайме. Тут тогда вопросы к безопасности виндовс.
codecity
21.08.2024 12:37Основной вопрос, может я пропустил - а как же мне на чужом компе запустить скрипт на сборку чего-либо?
MountainGoat
21.08.2024 12:37+1Например, воткнуть в USB порт девайс, представившийся клавиатурой, который откроет шелл и набъёт команды. Если подключение внешних дисков отключают часто, то вот подключение новой клавиатуры - далеко не всегда.
alex0x08 Автор
21.08.2024 12:37+3Вообще это первая часть и тут речь про один только голый компилятор csc.exe.
В качестве спойлера для второй части скажу, что нашелся и msbuild (те самые скрипты сборки) и реляционная СУБД и парсеры JSON/XML и HTTP-сервер с вебсокетами - все это внутри обычной пользовательской венды.
Так что дальше будет веселее.
qark
21.08.2024 12:37+6Что помешало написать это в одной статье? Сейчас статья сводится к твиту "в Windows предустановлен компилятор C#".
xi-tauw
21.08.2024 12:37+6Каждый раз, когда рассказываю о привилегиях и о привилегии SeShutdownPrivilege вижу непонимающие глаза. Зачем нам какие-то привилегии, если можно сделать shutdown /t 0 или ткнуть кнопку в пуске.
Рассказываю, что если вы сидите на рабочей станции, где вместе с вами еще 30 пользователей, то, вероятно, они бы не хотели, чтобы вы могли выключить систему. И это делается как раз забиранием этой самой привилегии и все - даже случайно не выключите теперь.
Ну а часть про csc... Эх, надеюсь автору не потребуется еще полтора года на то, чтобы посмотреть на LOLBAS.
saboteur_kiev
21.08.2024 12:37Вы хотите сказать, что используя библиотечный вызов функции пользователь может обойти безопасность и вызвать шатдаун, даже если у него нет этой привилегии?
alex0x08 Автор
21.08.2024 12:37В статье именно это и происходит - привилегия SeShutdownPrivilege выставляется искусственно.
lamerAlex
21.08.2024 12:37+3Включается у процесса, без права на выключение вы её не включите.
И shutdown.exe тоже так делает.
alex0x08 Автор
21.08.2024 12:37Имеется ввиду полагаю серверная версия Windows, где это право есть только у администратора?
saboteur_kiev
21.08.2024 12:37+2имеется ввиду любая версия Windows, где это право есть у конкретного юзера.
Дефолтные настройки это уже вторично.
Если я могу запустить штатный shutdown.exe, то я могу потушить машину через него. Если не могу запусить штатный shutdown.exe то и скомпилированную тулзу тоже не смогу.То есть прикол с компилятором который есть в поставке - это правильный посыл статьи, а то, что компилятор позволяет что-то там взломать просто потому что вызов библиотечных функций через скомпилированный код - такого нет, и функции можно вызывать проще, через повершелл скрипт
xi-tauw
21.08.2024 12:37+3Привилегии в Windows устроены интересно. Привилегия или отсутствует, или есть. Если она есть, то может быть включена или выключена. Ваш код только включает привилегию, если она есть. Если ее изначально нет, то нет способа ее получить в рамках своего токена.
alex0x08 Автор
21.08.2024 12:37Так ее может не быть только в серверной версии Windows у пользователя, в статье речь про обычную.
xi-tauw
21.08.2024 12:37Это настраивается через gpedit, так что можно ограниченно сказать, что в домашних версиях это нельзя настроить. Хотя очевидно, что можно, просто не так удобно.
alex0x08 Автор
21.08.2024 12:37а разве вся обвязка политик из домашней версии не вырезана?
xi-tauw
21.08.2024 12:37+1Смотря что вы понимаете под обвязкой. Убрана только mmc-оснастка.
alex0x08 Автор
21.08.2024 12:37Так а управление правами происходит разве не через нее? gpedit.msc же?
saboteur_kiev
21.08.2024 12:37Управление да, а хранится то где? Можно же напрямую, просто не так удобно.
xi-tauw
21.08.2024 12:37Не может. shutdown делает ровно то же. что и в код статье - включает привилегию, если она есть и вызывает функцию. Если привилегии нет, то не выключает компьютер.
alex0x08 Автор
21.08.2024 12:37Не очень понял при чем тут LOLBAS но за наводку спасибо :)
Не знал что кто-то додумался собрать в одном месте вообще все системные утилиты с векторами атак, думаю этот сайт стоит один раз посмотреть любому безопаснику чтобы навсегда удалить любые венды с объекта - лучшая реклама линукса из возможных.
Каждый раз, когда рассказываю о привилегиях и о привилегии SeShutdownPrivilege вижу непонимающие глаза
Я все же программист а не злобный хацкер и рассказываю про разработку а не взломы, поэтому пример с выключением это всего лишь пример кода, чуть длинее "Hello world" с вызовами WinAPI, чтобы разбор уместился в масштаб статьи а не книги.
Bizonozubr
21.08.2024 12:37+2Так для линукса тоже самое есть, там же ссылка на главной - https://gtfobins.github.io/
alex0x08 Автор
21.08.2024 12:37Очень много спорного, nasm редко где есть при установке, чтобы на нем стоял аж suid бит не видел ни разу.
Все же для Linux подобный сайт собирать бессмысленно - очень много зависит от дистрибутива и набора установленного ПО.
saboteur_kiev
21.08.2024 12:37Видимо просто поясняют, что если вдруг есть права запустить с рут правами какую-то штатную утилиту, то как при помощи этой утилиты "выйти из песочницы", типа как при помощи такой утилиты запустить баш или прочитать и вывести на консоль файл, к которому у юзера не должно быть доступа.
Как запустить шелл через top:
echo -e 'pipe\tx\texec /bin/sh 1>&0 2>&0' >>~/.config/procps/toprc top
(Примеры типа как раньше в винде через справку можно было запустить процесс, например обычный проводник в киоск-режиме - есть доступ в какой-нить утилите к справке - вперед)
jackchickadee
21.08.2024 12:37+2если вы сидите на рабочей станции, где вместе с вами еще 30 пользователей
то это никакая не рабочая станция, а скорее всего терминальный сервер.
попытки снять ограничение с rdp на десктопной винде были, но работает нестабильно и в общем отвратительно.
за LOLBAS ловите +.
xi-tauw
21.08.2024 12:37Да, я возможно неаккуратно назвал это дело рабочей станцией, но суть вы поняли правильно - я хотел противопоставить стандартному десктопу с одним пользователем.
perfect_genius
21.08.2024 12:37Я когда-то собирался попробовать добиться стандартными средствами Винды создания графики, но руки не дошли. Есть только Пэйнт, но в ней нет таких функций:
-в какой-то старой версии ОС (98 или 2000) при выключении экран медленно терял цвет и становился черно-белым.
-в заголовках окон можно было выбирать цвета, чтобы создавать между ними переход.
-при выделении рамкой она добавляет синий оттенок фоновому слою.
-при перетаскивании картинок курсором в Проводнике они становятся как полупрозрачные спрайты.
-Aero - слой за заголовком окна виден, но размыт.
И т.д.
Т.е., по идее, можно ставить свою работу фоном, применять эти эффекты, скриншотить и переносить на саму работу.
Panzerschrek
21.08.2024 12:37А с какой целью полноценный компилятор C# ставится вместе с библиотеками .NET? Просто на всякий случай? Или же сами эти библиотеки нуждаются в этом компиляторе, например, для JIT-компиляции кода?
alex0x08 Автор
21.08.2024 12:37Вопрос к Microsoft. Кстати обычно стоит еще и несколько разных версий .NET - поищите csc.exe поиском в папке Windows.
ColdPhoenix
21.08.2024 12:37+1ну да, в винде есть полноценный .NET Framework, HTTP.SYS и иже с ними. Доступен PowerShell(и не важно, скрипт не скрипт, в нем доступен весь .NET)
Поиграться можно, но что вы хотите этим сказать?
Не понятно поверхность атаки, имея на компе возможность запускать скрипты у вас и без этого достаточно векторов атаки.(кто мешает накидать не код, а по HEX'у передать бинарник)
PS: антивиры проверяют обычно совсем все, + отпечаток приложения зависит не от того где собран, а от версий инструментов.
alex0x08 Автор
21.08.2024 12:37ну да, в винде есть полноценный .NET Framework, HTTP.SYS и иже с ними. Доступен PowerShell(и не важно, скрипт не скрипт, в нем доступен весь .NET)
Поиграться можно, но что вы хотите этим сказать?
Что про данный факт мало кто знает.
По крайней мере никто из знакомых разработчиков (!) на .NET или админов Windows про такое не знал, а у меня их достаточно много.
ColdPhoenix
21.08.2024 12:37На практике никто не задумывается, я давненько замечал это.
Потому что когда вы разрабатываете вы ставите IDE и она уже проверяет все что нужно обычно.
Panzerschrek
21.08.2024 12:37+1Описанная в статье проблема, вообще говоря, заключается не в наличии в системе компилятора полноценного языка программирования, а в самом механизме работы Windows. Там любая пользовательская программа может делать очень многое даже без прав администратора - читать и писать пользовательские файлы, лезть в интернет (ну или не совсем, смотря как Brandmauer настроен), создавать окна, в т. ч. полноэкранные, и даже как показано в данной статье выключать компьютер.
На популярных дистрибутивах GNU/Linux ситуация аналогична, кстати говоря. Без прав root всё ещё много чего можно делать.
По-хорошему это должно быть кардинально пересмотрено - чтобы какой-то непонятный exe имел минимум прав, вроде запрета на чтения пользовательских файлов, создания файлов вообще, выхода в интернет и вообще какого-либо взаимодействия с системой кроме создания не более одного окна. Потребление ресурсов тоже должно быть лимитировано - память/процессорное время.
Для нормальных программ (которые устанавливают) в каком-нибудь манифесте должен быть прописан набор разрешений, при чём некоторые из них могут быть принципиально несовместимыми (вроде доступа в интернет и чтения произвольных файлов). В этом нет ничего нового, мобильные ОС уже давно имеют такую систему прав.
К сожалению эти пожелания так и останутся таковыми, ибо ради обратной совместимости в Windows уже ничего не будут менять. Если начать вводить какие-либо новые ограничения, то значительное количество существующих программ сломаются.alex0x08 Автор
21.08.2024 12:37Описанная в статье проблема, вообще говоря, заключается не в наличии в системе компилятора полноценного языка программирования
Именно что в этом наличии.
Первое что делал нормальный линуксовый сисадмин до эпохи виртуализации это удаление компиляторов с сервера, чтобы нельзя было локально собрать эксплоит для эскалации привилегий.
В Windows же получается что всегда есть неотключаемый и неудаляемый компилятор с полным доступом к WinAPI.
ColdPhoenix
21.08.2024 12:37Первое что делал нормальный линуксовый сисадмин до эпохи виртуализации это удаление компиляторов с сервера, чтобы нельзя было локально собрать эксплоит для эскалации привилегий.
Увольте его пожалуйста.
Абсолютно не важно в каком виде придет эксплоит.
Именно что в этом наличии.
Это самообман.
Если вы говорите про безопасность, она кончилась на момент как у вас злоумышленник получил доступ к ПК с возможность создавать (не важно как файл запущен) и запускать файлы.
Вы можете скомпилировать у себя на компе бинарник заранее и так же записать его по байтам.
alex0x08 Автор
21.08.2024 12:37Для линукса в те времена (до эпохи виртуализации) было стабильно два шага:
1) проникновение с загрузкой файла
2) эскалация
Эксплоит делающий эскалацию до рута попадал на машину как раз в виде исходника и затем компилировался локально. Готовые бинарники плохо работали из-за разницы в библиотеках между дистрибутивами, так что загружали именно исходник.
Сейчас это уже не так актуально из-за повсеместной виртуализации и контейнеров, вылезать из которых сильно сложнее.
ColdPhoenix
21.08.2024 12:37Готовые бинарники плохо работали из-за разницы в библиотеках между дистрибутивами, так что загружали именно исходник.
основные библиотеки совместимы довольно широко. Или у вас при обновлении любой библиотеки вся система пересобиралась?
Плюс большинство эксплоитов так же идет под определенные версии библиотек.
у меня сейчас бинарник виктории метрикс работает как под CentOS7 так и под Убунтами начиная с 20.04(тот же бинарник).
Так же и .Net Core
То есть для экспоита вам придется или изучать систему, или тупо тыкаться на наличие дырки.
vvzvlad
21.08.2024 12:37Готовые бинарники плохо работали из-за разницы в библиотеках между дистрибутивами, так что загружали именно исходник.
С обратной совместимостью винды этой проблемы не возникает
alex0x08 Автор
21.08.2024 12:37Если вы говорите про безопасность, она кончилась на момент как у вас злоумышленник получил доступ к ПК с возможность создавать (не важно как файл запущен) и запускать файлы.
Вы можете скомпилировать у себя на компе бинарник заранее и так же записать его по байтам.
В ветке выше речь про линукс и сервер а не Windows и ПК. То что вы описали это проблематика все же больше вендов.
Обрезание прав до невозможности создания файла с битом запуска конечно возможно но сильно неудобно, поэтому я такого давно не видел.
Повторюсь что все эти «навороты» в прошлом, сейчас балом правит виртуализация а вся ОС целиком воспринимается как песочница — твори что хочешь, лишь бы из контейнера не вылезал.
saboteur_kiev
21.08.2024 12:37В Windows же получается что всегда есть неотключаемый и неудаляемый компилятор с полным доступом к WinAPI.
Ну опять вы топите за "компилятор с полным доступом к WinAPI"
Еще раз. Винапи доступен из штатного повершелла, без всяких компиляторов.
Компилятор можно юзать для других вещей, но уж точно не стоит хайлайтить что только компилятор может что-то такое сделать с winapi, что не может повершелл. Тем боле что сейчас в винду несколько скриптовых языков встроено, и какие-то функции можно просто в cmd выполнить, какие-то из встроенного vbasic или jscriptalex0x08 Автор
21.08.2024 12:37Винапи доступен из штатного повершелла, без всяких компиляторов.
Вы точно программист а не сисадмин и понимаете что такое вызов процедур?
Из PowerShell доступен вызов только того что поддерживается авторами PowerShell, думать что с его помощью можно реализовать вообще любой вызов WinAPI — откровенный перебор.
Даже в этой статье с максимально упрощенным кодом большая часть логики про заполнение структур данных, их передачу и получение в ответ такой же структуры данных - как вы собрались все это делать на PowerShell ?
Покажите, повторите хотя-бы описанную в статье логику на PowerShell.
xi-tauw
21.08.2024 12:37+1@saboteur_kievчеловек просто не знает что такое powershell и думает что это рескин cmd, а тут вы со своими вопросами.
@alex0x08ну держите пример. Хотя думаю, что вы все равно будете ныть, что это не то.
alex0x08 Автор
21.08.2024 12:37Вот в этом и отличие между практикой и теорией:
$definition = @' using System; ... '@
Вы ведь не понимаете как оно работает правда? И что делает код на C# одной строкой забитый внутрь скрипта? Никаких вопросов это не вызвало?
lair
21.08.2024 12:37+1А вы понимаете, как работает PowerShell?
alex0x08 Автор
21.08.2024 12:37Туда столько всего понапихано что наверное скорее нет чем да.
Но вызов динамической компиляции кода на С#, забитого внутрь строкой точно не повод говорить о «поддержке работы с WinAPI», извините.
lair
21.08.2024 12:37+1Вам говорят, что WinAPI доступен из PowerShell. Примеры кода показывают, что доступен. Не вижу противоречия.
alex0x08 Автор
21.08.2024 12:37"Пусть говорят" , вам-то лично какое дело?
lair
21.08.2024 12:37+1Лично мне как разработчику - большое: я знаю, что можно сделать из PS, если припрет. Лично мне как админу (если бы я был админом) - тоже больше: я знаю, что PS надо опасаться не меньше, чем любого приложения на .NET.
alex0x08 Автор
21.08.2024 12:37Нууу тут сложно однозначно сказать что страшнее.
C моей программисткой точки зрения доступ к компилятору безусловно опасней, поскольку даже без игр с API всегда можно устроить DDOS перегрузкой процессора или забить диск случайными данными, что точно также может вызвать аварийную ситуацию.
Но как бы для PowerShell есть готовые скрипты и векторы атак, создаваемые и обкатываемые именно со злонамеренными целями.
Так что однозначного ответа тут нет.
saboteur_kiev
21.08.2024 12:37+1Вы не верите, что на скриптовом языке можно написать точно такую же программу, которая забьет диск случайными данными или загрузить процессор?
Скриптовый язык не умеет в файлы писать или расчеты делать что ли? Или с устройстваим не умеет взаимодействовать?
Есть ощущение, что вы недооцениваете что скриптовые языки и компилируемые языки отличаются не возможностями, а архитектурой исполнения. По возможностям они плюс-минус равны.
alex0x08 Автор
21.08.2024 12:37Не очень понимаю какая вам разница во что я верю, тут же техническая дискуссия а не церковь.
Но думаю сопоставлять по возможностям скриптовый и компилируемый языки все же не стоит, иначе может возникнуть дух г-на Луговского со всей его свитой.
И тут будет настолько адский срач что забрызгает вообще всех.
saboteur_kiev
21.08.2024 12:37+1Можете привести тогда ваш пример, что скриптовый язык не может сделать по сравнению с компилируемым? по функционалу?
ildarz
21.08.2024 12:37+3Гуглится в один клик (как пример):
FuzzySecurity | Low-Level Windows API Access From PowerShell
P.S. Была бы занятная статья, если б вы не претендовали на срыв покровов про безопасность и надежность. Ибо по сути вы описали, как с помощью компилятора пользователь может сделать то, что может сделать и так безо всякого компилятора.
alex0x08 Автор
21.08.2024 12:37А пойти чуть дальше гугления не смогли?
Я выше по треду уже ответил что на самом деле это не PowerShell такой умный, это код на C# с динамической компиляцией внутри. Но для вас полагаю разницы нет.
lair
21.08.2024 12:37Я выше по треду уже ответил что на самом деле это не PowerShell такой умный, это код на C# с динамической компиляцией внутри
...и что? Речь как раз о том, что из PS можно вызвать любой код на .NET, в том числе динамически скомилированный. Поэтому, как вам и пишут, из PS можно получить (и люди регулярно получают) доступ к WinAPI.
alex0x08 Автор
21.08.2024 12:37Угу, а отлаживать этот код вы как собираетесь? С божьей помощью? Как взаимодействовать с ним после запуска?
Люди пишут дословно «полная замена компилятору» и «вызов любых функций и методов», чем вводят в заблуждение, поскольку вызывается на самом деле динамически скомпилированная программа, не имеющая никакого отношения к самому скрипту на PowerShell.
lair
21.08.2024 12:37+2Угу, а отлаживать этот код вы как собираетесь?
Так же, как и код на C#, написанный в блокноте - с помощью вывода в консоль и такой-то матери. И это я в свое время как раз делал, так что не понимаю, в чем тут вопрос.
Как взаимодействовать с ним после запуска?
А зачем мне с ним взаимодействовать?
Люди пишут дословно «полная замена компилятору» и «вызов любых функций и методов», чем вводят в заблуждение, поскольку вызывается на самом деле динамически скомпилированная программа, не имеющая никакого отношения к самому скрипту на PowerShell.
Я вас еще раз спрашиваю: вы понимаете, что такое powershell, когда говорите, что вызов кода на .net не имеет к нему никакого отношения?
alex0x08 Автор
21.08.2024 12:37Так же, как и код на C#, написанный в блокноте - с помощью вывода в консоль и такой-то матери.
Что и событийную обработку? И асинхронщину с многопоточностью? Неужели до работы с отладчиком так и не дошли за годы практики?
А зачем мне с ним взаимодействовать?
Ну там ввод-вывод, передача данных. Через внешние файлы будете реализовывать?
вы понимаете, что такое powershell,
Я же написал уже что неграмотный, так что поделитесь откровением.
lair
21.08.2024 12:37+2Что и событийную обработку? И асинхронщину с многопоточностью? Неужели до работы с отладчиком так и не дошли за годы практики?
А откуда это внезапно взялось? Речь шла про то, что можно написать код на C# в блокноте на машине, где нет ничего другого, и вам сказали, что можно с равным успехом это сделать в PowerShell.
Ну там ввод-вывод, передача данных. Через внешние файлы будете реализовывать?
Если понадобится - то да. Или можно HTTP-сервер внутри поднять. Если кому-то хочется развлекаться, то там всё есть.
Я же написал уже что неграмотный, так что поделитесь откровением.
Ключевое - вот: "PowerShell accepts and returns .NET objects". Поэтому взаимодействие с .NET - неотъемлемая часть работы в PowerShell (а командлеты просто это прячут под удобный синтаксис).
alex0x08 Автор
21.08.2024 12:37Если понадобится - то да. Или можно HTTP-сервер внутри поднять. Если кому-то хочется развлекаться, то там всё есть.
Inter-process communication через HTTP-сервер? Я думал вы сильно старше и уже прошли этот этап )
"PowerShell accepts and returns .NET objects". Поэтому взаимодействие с .NET - неотъемлемая часть работы в PowerShell (а командлеты просто это прячут под удобный синтаксис).
Тут уже ничего не скажу — до такого уровня использования PS не доходил.
Но если сделаете тестовый пример с двусторонней коммуникацией - будет интересно почитать. И наверное не только мне.
ColdPhoenix
21.08.2024 12:37+1Inter-process communication через HTTP-сервер?
Вы говорили про ввод-вывод и передачу данных.
Внутри себя PowerShell передаёт объекты как и шарп.
alex0x08 Автор
21.08.2024 12:37Ну я же написал что до такой глубины использования PS не дошел.
По показанным примерам могу судить что взаимодействие между PS-скриптом и частью на C# примерно как между родительским и дочерним процессом, просто перед запуском дочернего происходит еще компиляция inline-кода.
Скорее всего вся обработка из PS заключается в перехвате стандарных потоков ввода-вывода для дочернего процесса в виде строк.
Но опять же всплыла тема с передачей объектов — непонятно тогда как это работает и в каком объеме, например есть ли там сериализация ( что автоматически исключает вещи вроде ссылок).
Если есть опыт с таким — показывайте примеры, будем разбирать.
lair
21.08.2024 12:37Inter-process communication через HTTP-сервер? Я думал вы сильно старше и уже прошли этот этап )
Я уже достаточно "старше", чтобы не стесняться использовать то, что мне удобно.
Тут уже ничего не скажу — до такого уровня использования PS не доходил.
Это цитата из вступительного раздела, а операции с объектами и их свойствами - третья глава в 101. Так что это где-то в районе базового уровня.
ildarz
21.08.2024 12:37+2это код на C# с динамической компиляцией внутри
Ну да, это общеизвестно примерно любому, кто плотно работает с PS.
Я могу сделать из PS вызов к WinAPI? Могу. Он сработает точно так же, как сработал бы, если бы я написал код с доступом к той же самой функции на произвольном языке и скомпилировал в экзешник? Да. Так в чем конкретно суть ваших претензий, можете объяснить?
alex0x08 Автор
21.08.2024 12:37Я могу сделать из PS вызов к WinAPI? Могу.
Еще можете писать против ветра, только проверять не советую.
Речь не о том что можно а что нет, речь о полной замене компилятора csc.exe (видимо вместе с дебагером) на скрипт PowerShell — вот эту мысль пытаются продвигать комментаторы.
Что для меня звучит как откровенная дичь.
ColdPhoenix
21.08.2024 12:37Это код на powershell с динамической компиляцией кода C#, поддержка которого рантаймом .NET известна.
когда называешь вещи своими имена выглядит немного иначе, не так ли?
unreal_undead2
21.08.2024 12:37+2Я воспринял статью не как описание проблемы, а как возможность использовать голую Windows без интернета для игрушечной разработки. В том, что при это можно написать эквивалент стандартной команды shutdown, ничего необычного нет.
lz961
21.08.2024 12:37И в итоге вы получаете два семейства компьютеров: основное -- в котором можно только то, что разрешил производитель исходя из тз. заказчика и дополнительное -- с использованием которого возможно разработка и настройка ПО для компьютеров основного семейства. Что-то такое, вроде как, делает IBM.
AndrewBond
21.08.2024 12:37Слушайте, я не хочу такого. честно.
У меня есть железка, на которой я запускаю всякое, компилирую всякое. Пусть оно работает как железка со всякими кодами.
Это не "продукт" для банковских операций, безопасного серфинга и тп.
Если кому нужен такой продукт - я не против, пусть ставят себе что-то мобильно-безопасное и пользуются. Но ведь ПК создавался совсем не как домашнее устройство, и все эти ограничения на нем - как на корове седло.
stanislavskijvlad
21.08.2024 12:37+1Когда я увидел название статьи, то решил, что будет инструкция по созданию супер лёгкого образа Windows 10, которая в состоянии работать "из коробки" на компьютере без интернета. А так же использовать все возможности такой системы с полной отдачей. Так уж совпало, что пару минут назад на глаза попался ролик, в которм показан запуск IBM PC 486. Это вызвало ностальгические чувства по тем системам и корпусам. Так вот, считаю, что автор чуть не дожал. Идею я вам подкинул.
ColdPhoenix
21.08.2024 12:37+6Напишу отдельно.
Вы молодец что нашли что чистая винда без интернета что-то умеет. Нашли куски компонента о наличии которых обычно никто не задумывается.
Но, пожалуйста, перестаньте приплетать безопасность. Наличие/отсутствие компилятора мало что меняет в этом плане. Считать что раз у меня нет компиляторов, то у меня не запустят эксплоит это Security through obscurity.
alex0x08 Автор
21.08.2024 12:37Считать что раз у меня нет компиляторов, то у меня не запустят эксплоит это Security through obscurity.
«Взломать можно все что угодно» — звучит разумеется страшно, но это лишь теория. «Использовать для взлома готовые эксплоиты А,Б и С» — звучит обыденно, но это практика, которая работает.
Wolfdp
21.08.2024 12:37Небольшой вопрос: требуется именно SDK, или прям достаточно Runtime версии .net? версия 4.5 в целом поставляется на десятке автоматом.
Насчет повышения прав и "не дыра" не согласен. Либо таки в винде дыра, и пользователь с отсутсвием прав на какое-то действие может их получить, либо где-то забыли в политике прав запретить нужные действия для пользователя.
alex0x08 Автор
21.08.2024 12:37Компилятор C# (там еще компиляторы Visual Basic и JScript) есть только в .NET SDK, поэтому без него скомпилировать .exe не выйдет.
Но вот с рантаймом все сложнее: сам запуск осуществляет ОС по сигнатуре исполняемого файла, вне зависимости от того есть ли на машине установленный рантайм .NET. А вот уже дальше если рантайма нужной версии нет то произойдет ошибка.
При этом рантайм .NET это динамическая библиотека (несколько), разные версии которой обязательно присутствуют в Windows.
lair
21.08.2024 12:37Компилятор C# (там еще компиляторы Visual Basic и JScript) есть только в .NET SDK
В этот момент у меня все-таки есть два вопроса.
Компилятор есть только в SDK или в рантайме тоже?
На обычной пользовательской винде из коробки стоит только рантайм или SDK тоже?
Я просто хорошо помню, как я каждый раз при подготовке себе рабочей машины ставил туда SDK.
alex0x08 Автор
21.08.2024 12:37Компилятор есть только в SDK или в рантайме тоже?
Запускабельные бинарники вроде csc.exe точно есть только в SDK, но сами функции динамической компиляции скорее всего есть и в самом рантайме, который в виде библиотеки.
На обычной пользовательской винде из коробки стоит только рантайм или SDK тоже?
Присутствует (не установлен как компонент и не удаляем стандартными средствами) и .NET SDK и рантайм, причем нескольких версий.
lair
21.08.2024 12:37Запускабельные бинарники вроде csc.exe точно есть только в SDK
Присутствует (не установлен как компонент и не удаляем стандартными средствами) и .NET SDK и рантаймКак формально вы разделяете SDK и рантайм? На основании чего вы говорите, что csc есть только в SDK, хотя он лежит в
C:\Windows\Microsoft.NET\Framework64
(это, насколько я помню, папка именно рантайма)?alex0x08 Автор
21.08.2024 12:37C:\Windows\Microsoft.NET\Framework64
Не совсем так. Внутри этой папки есть еще с номерами версий, вот то что внутри уже SDK.
Рантайм для приложения на .NET это просто библиотека, либо поставляемая вместе с приложением либо взятая из системы.
Разделение на SDK и рантайм ни разу не формальное а очень даже реальное, можете посмотреть внутрь .cab архива обновления с обоими чтобы увидеть разницу.
lair
21.08.2024 12:37Не совсем так. Внутри этой папки есть еще с номерами версий, вот то что внутри уже SDK.
Нет, то, что внутри - это разные версии .NET framework.
Рантайм для приложения на .NET это просто библиотека, либо поставляемая вместе с приложением либо взятая из системы.
Вы говорите про .NET (который современный, который раньше был .NET Core), или про .NET Framework (в котором это совершенно точно не так)?
Разделение на SDK и рантайм ни разу не формальное а очень даже реальное
Я спрашиваю, как вы отличаете, что есть что.
alex0x08 Автор
21.08.2024 12:37Версия v4 это точно не Core, внутренних версий старше 4й внутри Windows я пока не встречал, так что видимо оно называется Net Framework.
Я спрашиваю, как вы отличаете, что есть что.
Мне лично внутренний голос подсказывает. Так в чем вопрос?
lair
21.08.2024 12:37Версия v4 это точно не Core, внутренних версий старше 4й внутри Windows я пока не встречал, так что видимо оно называется Net Framework.
Тогда утверждение "Рантайм для приложения на .NET это просто библиотека, либо поставляемая вместе с приложением либо взятая из системы." - неверно. Рантайм для .NET framework приложения - это .NET Framework, и он существенно больше, чем "просто библиотека".
Так в чем вопрос?
В том, с чего вы решили, что с Windows поставляется SDK, а не рантайм.
alex0x08 Автор
21.08.2024 12:37Слушайте этот .NET SDK найденный внутри Windows не отображается в списке системных компонентов. Визуально внутри больше библиотек чем в обычном, скачиваемом с сайта Microsoft, поэтому как официально он называется понятия не имею.
Внутри также есть определенные нестыковки, например лежат части ASP.NET (в частности админка) и компилятор ASP страниц, но нет самого сервера приложений, те собрать полноценное ASP.NET приложение не получится.
Так что ".NET SDK" это скорее условное название, чтобы хоть как-то это обозначать.
Какой-либо официальной информации по этой версии нет, описания тоже. Если у вас получится раскопать больше деталей по этой штуке — дайте знать, буду благодарен.
lair
21.08.2024 12:37+1Слушайте этот .NET SDK
...почему вы считаете, что это SDK?
не отображается в списке системных компонентов
А почему должен?
Так что ".NET SDK" это скорее условное название, чтобы хоть как-то это обозначать.
Это называется .NET Framework
Какой-либо официальной информации по этой версии нет
Есть. Идете вот сюда и смотрите, какие версии имеют зеленую галочку (поставлены по умолчанию): https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/versions-and-dependencies#version-information
(я, кстати, был неправ, и рантаймом правильно называть CLR, но это еще более третья вещь, которая у вас вообще нигде не упоминается)
ColdPhoenix
21.08.2024 12:37Ну кстати в установке и удалении компонетов(от старого списка программ) отображаются 3.5 и 4.8
lair
21.08.2024 12:37Я это не могу проверить, у меня нет чистой лабораторной машины (ну и это для меня не важно, на самом деле).
ColdPhoenix
21.08.2024 12:37А чистота уже не важна.
Это там где HyperV включается и тп.
Там записи зависят от версии видны поидее
lair
21.08.2024 12:37Чистота важна в том смысле, что если я попробую на своей (разработческой) машине, то я не могу быть уверен, что записи, которые я там увижу, не от тех паков, которые я сам ставил после.
ColdPhoenix
21.08.2024 12:37Там разница лишь в наличии галочки.
В том меню от ваших действий не может ничего добавится.
Это не список программ или установленного.
Это список доступного(плюс галочка если установлено)
Все что ставите позже находится в обычных программах.
alex0x08 Автор
21.08.2024 12:37Microsoft официально предоставляет виртуальные образы со всеми текущими версиями Windows.
Я эту статью писал используя в качестве тестовой среды виртуальную машину с чистой копией, потому что основная точно также засрана компонентами и средствами разработки.
lair
21.08.2024 12:37Microsoft официально предоставляет виртуальные образы со всеми текущими версиями Windows.
Я в курсе. Я просто не хочу тратить время на их установку, мне это не нужно в моей повседневной работе.
alex0x08 Автор
21.08.2024 12:37мне это не нужно в моей повседневной работе.
А устроить срач на 100 постов по поводу правильного написания - часть вашей работы? Вам за это деньги платят?
alex0x08 Автор
21.08.2024 12:37А я вот почему-то думаю что да.
Вы же не ответили по существу ни на один вопрос, не привнесли ничего нового — так смысл дальше с вами дискутировать?
saboteur_kiev
И видим установленный FAR ;)
А по поводу использованию штатной библиотеки из нормального полноценного языка "нативного" для винды С#n - не совсем понятно в чем должно быть удивление..
Полноценная работа с WindowsAPI возможно наверное из любого утюга. Тот же poweshell вполне умеет это делать, можно накатать скрипт, выполнить его в повершелле и обратиться к функциям ОС
Что касается уязвимостей, мне кажется что там вообще не столько привязка к каким-то языка программирования, сколько к пониманию архитектуры, и писать код можно почти на чем угодно.
alex0x08 Автор
PowerShell это все же про скрипты, а тут полноценный компилятор, который выдает .exe с интересным функционалом.
Если описанного про выключение мало, представьте эту же логику, только запускаемую в фоне со случайным промежутком и прописыванием в автозагрузку у пользователя.
Работаете себе, через 15 минут компьютер выключается. Перезапускаете - выключается через полчаса.
lair
А что представлять-то? Обычный пранк, я таких много помню. Не понимаю, что тут уникально интересного.
alex0x08 Автор
У разных людей сильно разное отношение с реальностью, как и осознание происходящего с ними. А у описанного в статье «внезапного выключения» есть предыстория:
Единственное чего я не ожидал так это последствий: одногруппник тогда разбил свой компьютер об стену, выкинул системный блок из окна а сам уехал отдыхать в дурку с острым психозом.
Несмотря на то что считался «компьютерным специалистом» и вообще был на хорошем счету.
Так что кому пранк а кому шиза — все зависит от восприятия реальности.
lair
Мы вроде на техническом сайте, так что лично меня интересуют технические аспекты, а не то, как люди реагируют на издевательства.
alex0x08 Автор
Ну тогда рад что столь сложная техническая статья, материал для которой я собирал не один год оказалась для вас не более чем "пранком".
lair
Вы "не один год" собирали материал о том, что в любой современной инсталляции винды есть
csc
?alex0x08 Автор
Угу, но разумеется столь крутой профессионал как вы сможет написать что-то покруче. Так что ждем ваших статей.
censor2005
Он уже написал, и покруче вашей, ещё 10 лет назад )
alex0x08 Автор
Тогда тем более - столь великому мастеру не стоит отвлекаться на пустопорожнюю переписку, пусть занимается делом и пишет еще статьи )
KMiNT21
Ну да, можно и просто в Task Scheduler на какой-нибудь ивент повесить, да еще и с задержкой по времени, чтоб еще менее очевидно было :) Но такие пранки смешные были бы лет 20 назад, да и то не факт.
saboteur_kiev
Так если даже из скрипта можно обратиться к нативной библиотеке, понятно что из компилируемого, еще и нативного для винды С# это можно сделать.
Таким образом суть статьи в том, что оказывается простой компилятор С# входит в поставку винды?
Что же касается выключения компьютера, у меня есть некоторые сомнения, что данное возможно от regular пользователя у которого нет прав на выключение компа, то есть там нет никаких специальных "повышений привилегий".
Если права есть, есть и штатная утилита shutdown.exe, которую тоже можно вызвать по расписанию, и которая вдобавок подписанная ключом от MS, не будет вызывать лишних вопросов у антивирусов.
MonkAlex
Лет 15 назад я это решал батником
И оно всё ещё работает. Зачем вам C#, компилятор и прочее?
ПС: ну и если злоумышленник может писать в систему (чтобы создать файл исходников) и запускать компиляцию, то наличие или отсутствие компилятора никого не остановит. А антивирус проверяет всё, что внешние файлы, что созданные в системе.
alex0x08 Автор
15 лет назад еще выпускался журнал "Хакер" и все было несколько проще в плане компьютерной безопасности.
Если я вам перешлю готовый бинарник, то при попытке запуска появится окно с подтверждением и сообщением о "доверенном источнике". Если вы соберете этот же бинарник локально и затем запустите - такого сообщения не будет.
Все тоже самое с антивирусом, локально собранные бинарники он пропустит, даже если внутри будет эскалация привилегий или эксплоит, по той простой причине что эвристика осталась видимо только у Касперского а все остальные работают по сигнатурам бинарной сборки - т.е тупо по слепкам бинарников.
Очевидно что слепок локально собранного будет отличаться.
MonkAlex
Кто-то вас обманул. Время от времени разработчики жалуются, что у них один и тот же код на разных базах антивируса начинает выдавать срабатывания. Прямо при билде, на их машинах.
И чаще всего речь как раз про касперского, т.к. он у нас самый популярный в России.
alex0x08 Автор
Ну да, вы описали как раз работу эвристического алгоритма, я и написал что по ощущениям такое осталось только у Касперского - "визжит свиньей" по поводу и без только он один.
MonkAlex
Накидал на C# код, который портит exe файлы. При попытке тронуть этот файл в проводнике получил от защитника виндовс такую маркировку вируса:
После чего дефендер файл удалил.
Так что дело не только в касперском. Могли бы и сами проверить, а не просто кидаться своими догадками.
alex0x08 Автор
Тут сложно что-то сказать не видя код, судя по поиску эта сигнатура какая-то сильно общая и срабатывает на много чего.
А проверять я вообщем-то проверял, но статья-то как-бы не об этом ))
MonkAlex
А о чём статья? Вы же пишите, что если взять и скомпилировать "вредносный код" на чужой машине, то антивирус не заметит.
Я отмечаю, что заметит - вы мне в ответ, что статья не о том.
alex0x08 Автор
Ну не буду же я блин постить на Хабре серьезный работающий зловред - это уже перебор ))
Поэтому озвучиваю лишь идеи и риски, не более того.
Что с этой информацией делать решать читателям. Кому надо тот поймет.
Статья писалась прежде всего из спортивного интереса самой возможности разработки на чистой ОС и без установленных средств, описанное про антивирус не более чем возможный побочный эффект.
Quarc
Касперский тут ничем не выделяется из ряда других антивирусов. Локальные сборки мне "ломали" и Nod32 и Дефендер, прямо на моменте генерации объектных файлов.
eldog
Упражнение любопытное, но не понятно, почему это должно пугать. Ну да, голая винда включает в себя компилятор. Это нормально и даже хорошо, многие линукса тоже включают. А локальный пользователь имеет право выключить компьютер, в том числе и программным образом. Опять же - что странного?
А PowerShell это тот же дотнет, с теми же возможностями. Ничуть не менее страшен, чем exe. Я как-то видел оконную программу, написанную целиком на PowerShell. Изврат, но так тоже можно, работает.
Cyborg707
Всё это можно сделать с PowerShell.
unreal_undead2
Лично я не знал, что .Net фреймворк в стандартной инсталлляции Windows кроме рантайма включает и компилятор, стоит иметь в виду.