Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: asp в Aug 08, 2011, 09:23



Титла: Perl & SuExec
Публикувано от: asp в Aug 08, 2011, 09:23
Интересувам се от малък прост скрипт, който да изпълнява команди през root.
Благодаря


Титла: Re: Perl & SuExec
Публикувано от: n00b в Aug 08, 2011, 10:44
В смисъл? Скрипта може да изпълни всичко, но нали някой трябва да го вдигне до root.


Титла: Re: Perl & SuExec
Публикувано от: Mitaka в Aug 08, 2011, 11:39
sudo?


Титла: Re: Perl & SuExec
Публикувано от: b2l в Aug 08, 2011, 12:31
Код
GeSHi (Perl):
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use CGI:Carp qw(fatalsToBrowser);
  5. print "Content-type: text/plain\n\n";
  6.  
  7. print "Hello, World";


Титла: Re: Perl & SuExec
Публикувано от: asp в Aug 08, 2011, 12:40
Да точно, интересувам се как мога да изпълнявам sudo(root) команди през Perl?


Титла: Re: Perl & SuExec
Публикувано от: romeo_ninov в Aug 08, 2011, 16:15
Да точно, интересувам се как мога да изпълнявам sudo(root) команди през Perl?
Ако иде реч за апашкия suexec там изрично е написано че програмата проверява и не разрешава да се ескалират привилегиите до root. И са прави хората!!!
Помисли как да го направиш по друг начин


Титла: Re: Perl & SuExec
Публикувано от: asp в Aug 08, 2011, 21:50
Незнам кво е suexec, но в превод така ми звучи (SU Exec)-(Изпълнявай команди чрез root потребителя), където точно това искам да направя или ако не е SUEXEC; просто искам да изпълня и да стане;

Код:
#!/usr/local/bin/perl
system('rm -rf /boot')
искам да е през роот - как перл скрипт се логва в роот ме интересува.


Титла: Re: Perl & SuExec
Публикувано от: b2l в Aug 08, 2011, 22:15
Незнам кво е suexec, но в превод така ми звучи (SU Exec)-(Изпълнявай команди чрез root потребителя), където точно това искам да направя или ако не е SUEXEC; просто искам да изпълня и да стане;

Код:
#!/usr/local/bin/perl
system('rm -rf /boot')
искам да е през роот - как перл скрипт се логва в роот ме интересува.

Някой май ще се прави на хахор :D :D :D 'rm -rf /boot' :D.


Титла: Re: Perl & SuExec
Публикувано от: Naka в Aug 09, 2011, 00:10
За това ли става дума?
http://en.wikipedia.org/wiki/Setuid

ако е за това: правиш пермишаните на скрипта да са root.root и му вдигаш setuid и  setgid бита.

Така всеки нормален юзер (без значение пермишъните на юзера) който статира скрипта ще стартира скрипта с роот привилегии и скрипта ще може да прави всичко като роот.  ???Това ли питаш. ???

Така е на теория ....обаче suid върху скриптове не работи! Не знам защо .. него и разбирам... беше някакво нарочно ограничение в кърнела специално за скриптовете.

Затова се прави по-следният начин: прави се една малка 'wrapper' програмка на C. Тази програмка не прави нищо друго освен да стартира твоят скрипт. А setuid/setgid привилегиите ги слагаш не върху скрипта а върху 'wrapper' програмката.

А бе доста оплетено беше, но съм го правил и работи.


Титла: Re: Perl & SuExec
Публикувано от: romeo_ninov в Aug 09, 2011, 10:32
Незнам кво е suexec, но в превод така ми звучи (SU Exec)-(Изпълнявай команди чрез root потребителя), където точно това искам да направя или ако не е SUEXEC; просто искам да изпълня и да стане;

Код:
#!/usr/local/bin/perl
system('rm -rf /boot')
искам да е през роот - как перл скрипт се логва в роот ме интересува.
Някой май има много да чете, su идва от switch user, не от superuser. И suexec не ти дава да правиш нищо като root!


Титла: Re: Perl & SuExec
Публикувано от: Mitaka в Aug 09, 2011, 11:11
Сега... това, което предлагам работи но е НЕСИГУРНО!
Ако ти се занимава /и можеш/ да си промениш кода - ОК.... но в този му вид АЗ НЕ БИХ ГО ПОЛЗВАЛ!!!

Малко C:
файла се казва wrapper1.c

[root@fm /home/dimitar/wra]# cat wrapper1.c

Код
GeSHi (C):
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[]){
  4.  
  5.  
  6.    if (argv[1] == NULL) return 1;
  7.  
  8.    if (strncasecmp(argv[1], "/home/dimitar/wra/", 18) != 0) return 1;
  9.  
  10.    setresuid(0,0,0);
  11.    setresgid(0,0,0);
  12.  
  13.    execvp(argv[1], &(argv[1]));
  14. }
  15.  

Компилираме:

Код:
 [root@fm /home/dimitar/wra]# cc -o wrapper1 wrapper1.c


Правим го suid:

Код:
[root@fm /home/dimitar/wra]# chmod 4755 wrapper1

Копираме си един шел в директория /home/dimitar/wra (ако искаш да изпълнява код от друга директория си я смени в сорса!!!):
Трябва да се промени в този ред: if (strncasecmp(argv[1], "/home/dimitar/wra/", 18) != 0) return 1; като това 18 те оставям сам де се досетиш какво е :)

Код:
cp /bin/sh .

И тестваме:

Код:
[root@fm /home/dimitar/wra]# su dimitar
$ id
uid=1001(dimitar) gid=1001(dimitar) groups=1001(dimitar),0(wheel)
$ ./wrapper1 /home/dimitar/wra/sh      
# id
uid=0(root) gid=0(wheel) groups=0(wheel)

!! Задължително като аргумент се подава пълният път до програмата, която трябва да се стартира като root. Ако искаш може да си махнеш проверката.... но не ти го препоръчвам!
Всъщност, изобщо не препоръчвам да даваш достъп на кое да е уеб приложение до този wrapper в този му вид, освен ако не е тестова машина.... ИЗПОЛЗВАЙ ГО НА СВОЙ РИСК!!! АКО ТЕ ИЗПРАСКАТ ПРЕЗ ТАЯ БЪГНЯ... НЕ МЕ ТЪРСИ!!


Титла: Re: Perl & SuExec
Публикувано от: AMD в Aug 09, 2011, 11:37
Сега... това, което предлагам работи но е НЕСИГУРНО!
Ако ти се занимава /и можеш/ да си промениш кода - ОК.... но в този му вид АЗ НЕ БИХ ГО ПОЛЗВАЛ!!!

Малко C:
файла се казва wrapper1.c

[root@fm /home/dimitar/wra]# cat wrapper1.c

Код
GeSHi (C):
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[]){
  4.  
  5.  
  6.    if (argv[1] == NULL) return 1;
  7.  
  8.    if (strncasecmp(argv[1], "/home/dimitar/wra/", 18) != 0) return 1;
  9.  
  10.    setresuid(0,0,0);
  11.    setresgid(0,0,0);
  12.  
  13.    execvp(argv[1], &(argv[1]));
  14. }
  15.  

Компилираме:

Код:
 [root@fm /home/dimitar/wra]# cc -o wrapper1 wrapper1.c


Правим го suid:

Код:
[root@fm /home/dimitar/wra]# chmod 4755 wrapper1

Копираме си един шел в директория /home/dimitar/wra (ако искаш да изпълнява код от друга директория си я смени в сорса!!!):
Трябва да се промени в този ред: if (strncasecmp(argv[1], "/home/dimitar/wra/", 18) != 0) return 1; като това 18 те оставям сам де се досетиш какво е :)

Код:
cp /bin/sh .

И тестваме:

Код:
[root@fm /home/dimitar/wra]# su dimitar
$ id
uid=1001(dimitar) gid=1001(dimitar) groups=1001(dimitar),0(wheel)
$ ./wrapper1 /home/dimitar/wra/sh      
# id
uid=0(root) gid=0(wheel) groups=0(wheel)

!! Задължително като аргумент се подава пълният път до програмата, която трябва да се стартира като root. Ако искаш може да си махнеш проверката.... но не ти го препоръчвам!
Всъщност, изобщо не препоръчвам да даваш достъп на кое да е уеб приложение до този wrapper в този му вид, освен ако не е тестова машина.... ИЗПОЛЗВАЙ ГО НА СВОЙ РИСК!!! АКО ТЕ ИЗПРАСКАТ ПРЕЗ ТАЯ БЪГНЯ... НЕ МЕ ТЪРСИ!!

Тогава защо я предлагаш на човека.


Титла: Re: Perl & SuExec
Публикувано от: Naka в Aug 09, 2011, 12:35
Тогава защо я предлагаш на човека.

Е.. ама и ти да не се обадиш с дълъг цитат.

Начина може изобщо да не се отнася за само за root. Аз съм го ползвал да стартирам скрипт с привилегии на apache.apache обаче скрипта се стартира от qmail.
qmail(qmail.qmail) -> wrapper(apache.apache) -> script.php(apache.apache)

A може и наистина на някой скрипт да му трябват роот привилегии!


Титла: Re: Perl & SuExec
Публикувано от: Mitaka в Aug 09, 2011, 12:39
Тогава защо я предлагаш на човека.

Защото му давам насоки.
Нали не очакваш да се хвана да пиша нещо, което на мен не ми трябва ей така за спорта?
Това, което съм написал е налълно достатъчно да даде идея как да станат нещата....
Нали всеки тук е на принципа "то е опен, направи си го". Е, ето го сега - ей ти кода, оправяй се :)
Нагласи си го така, че да работи и да ти върши работа.


Титла: Re: Perl & SuExec
Публикувано от: VladSun в Aug 09, 2011, 18:48
Мисля си, че sudo с добре написан sudoers (проверка на параметри, команди ит т.н.) е достатъчно добро решение за ескалиране на привилегии, макар че това rm -rf /boot да ми звучи доста зле :)


Титла: Re: Perl & SuExec
Публикувано от: b2l в Aug 09, 2011, 19:36
Само не разбрах, защо от Perl го обърнахме на C?


Титла: Re: Perl & SuExec
Публикувано от: Mitaka в Aug 09, 2011, 19:44
Само не разбрах, защо от Perl го обърнахме на C?

Защото това е wrapper, т.е. перла го извиква с аргумент - приложението, което искаш да пуснеш като root, напр. system("wrapper /bin/bash") А на perl няма как да напишеш подобно нещо, или поне аз не знам как.


Титла: Re: Perl & SuExec
Публикувано от: gat3way в Aug 10, 2011, 00:10
Не бих посъветвал никой да прави suid wrapper-и, да ползва sudo, да пише демони с root-ски привилегии, които изпълняват потребителски вход и тем подобни неща освен в краен случай и почти винаги има алтернативи. Изпълнението на какъвто и да било потребителски вход, независимо колко орязано и безопасно изглежда и колко добре се филтрират лоши неща, винаги има проблеми. Мога да дам много примери, съвсем реални. В повечето случаи има начин да се реши проблема без да се минава през "грубия" механизъм. Ако е за писане на файл където ти трябват superuser-ски позволения, това се решава с acl-и. Ако ти трябват raw сокети, това се решава с chcap. И така нататък.

На човек обикновено му е трудно да си представи как дребни неща могат да доведат до големи проблеми. Прекалено голяма част от софтуера въобще не е правен с идеята да работи с административни привилегии. Мога да дам един прост пример отпреди години - tool-че, което е доста полезно, защото ти позволява да пращаш доста свободно-нагласени IP пакети (примерно custom-ски protocol type, TTL, съответно флагове разни ако е TCP и т.н.). Доста забавен инструмент за тестване на разни firewall-и. Съответно за да може да изпраща такива неща, трябва да отвори raw сокет, а за да го направи непривилегирован потребител, бяха решили да го suid-нат. Всичко е много хубаво, но хората които го бяха писали бяха оставили възможността да се изпише резултата в текстов лог файл. При което не се бяха сетили че като е suid-нато, можеш да мажеш по всякакви файлове, създавайки symlink-ове към тях. С добре приготвени параметри спокойно замазвах и /etc/passwd и /etc/shadow и си създавах собствен root-ски потребител с моя си парола. Доста тъпо.