Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2009-03-22 11:58:20

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Witam wszystkich

Ostatnio, zostawiłem kompa na noc aby "possał" trochę torrentów. Jak to czasami bywa - zostałem rozłączony parę minut po tym jak zasnąłem i tyle z tego "ssania" było ;]

Powiedziałem dość - postanowiłem napisać sobie programik do autoconnecta.

No i dało bezproblemowo radę (jak ktoś chce mogę zamieścić - napisany w QT). Polecenia sprawdzające (ifconfig | grep ppp) oraz łączące z netem (pppd call ppp0) wykonuje za pomocą zapytania system() (czyli system("pppd call ppp0 >> /dev/null") (null żeby mi konsoli nie zaśmiecał)). Ale.. no właśnie - program wymaga uprawnień root'a, a chciałem go sobie umieścić w toolbarze iceWM i móc odpalać bezproblemowo net. Z tego co widzę SUID nie działa dla poleceń wewnętrznych wywołanych poprzez system”coś-tam”) :( - tutaj pytanie do Was - czy ktoś wie w jaki sposób mogę wywołać polecenie wewnątrz programu w C++ aby miało ono uprawnienia root'a poprzez SUID? Z wyłączeniem nadania SUID'ów każdemu wywoływanemu prze zemnie poleceniu... bo raczej nie oto tutaj chodzi – chodzi aby SUID'a miał tylko „exec” mojego programu.

Z góry dzięki.

Offline

 

#2  2009-03-22 12:02:27

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

chown root binarka,
chmod u+s binarka i 
man setuid ;-]

Ostatnio edytowany przez urug (2009-03-22 12:03:42)


Pozdrawiam, Tomek

Offline

 

#3  2009-03-22 12:41:29

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

skoro jak piszesz system() gubi uprawnienia root'a (nie sprawdzalem) to bedziesz musial zrobic fork() i exec() ... ewentualnie mozesz w system() wywolac komende przez sudo - wtedy zamiast SUID dajesz uzytkownikowi ktory odpala ten program prawo do wykonania odpowiednich komend przez sudo bez podawania hasla (to chyba nawet ladniejsze rozwiazanie)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#4  2009-03-22 12:42:48

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

@Urug:

W ten sposób już próbowałem

Niestety albo coś źle robię, albo - co bardziej prawdopodobne - polecenia wewnątrz programu wywołane poprzez system("XXX") nie działają już jako root.

zresztą chyba najprostszy przykład:

Kod:

#include <iostream>
#include <cstdlib>

int main()
{
    int status=system("ifconfig | grep ppp");
    std::cout << status << "\n";
    return status;
}

Po daniu chown root test i chmod u+s test, ls -l zwraca:

Kod:

-rwxr-xr-x  1 root  james      7831 2009-03-22 12:37 test

No i wykonuję jako zwykły user:

Kod:

./test
sh: ifconfig: command not found
256

A teraz jako root:

Kod:

 sudo ./test
ppp0      Link encap:Point-to-Point Protocol  
0

Jak widać SUID nie zadziałał :(

P.S

Kod:

man suid
No manual entry for suid

;]

@bercik:

Hmm tego nie znałem... postaram się przetestować jak najszybciej (choć dzisiaj mogę nie dać rady). Dzieki za info.

Ostatnio edytowany przez Huk (2009-03-22 12:44:35)

Offline

 

#5  2009-03-22 13:03:33

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Kod:

urug@smigacz:Desktop$ ./test 
uid=0(root) gid=1000(urug) grupy=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),112(powerdev),1000(urug)
urug@smigacz:Desktop$

Kod:

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
          
using namespace std;          
          
int main() {
    setuid(0);
    system("id");
}

Kod:

-rwsr-xr-x 1 root urug 10254 mar 22 13:03 test

Ostatnio edytowany przez urug (2009-03-22 13:05:23)


Pozdrawiam, Tomek

Offline

 

#6  2009-03-22 13:03:37

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Huk napisał(-a):

Kod:

#include <iostream>
#include <cstdlib>

int main()
{
    int status=system("ifconfig | grep ppp");
    std::cout << status << "\n";
    return status;
}

Po daniu chown root test i chmod u+s test, ls -l zwraca:

Kod:

-rwxr-xr-x  1 root  james      7831 2009-03-22 12:37 test

No i wykonuję jako zwykły user:

Kod:

./test
sh: ifconfig: command not found
256

1. po ls widac ze SUID nie nadales - sproboj chmod numerycznie i pamietaj ze chown (zazwyczaj) znosi nadany wczesniej SUDI
2. to ze nawet cos ma SUID nie znaczy ze ma poprawna sciezke PATH - dobrym zwyczajem w SUIDowanych programach jest podawanie pelnej sciezki do wywolywanych programow
3. ifconfig w trybie informacyjnym dziala bez problemu z pod zwyklego usera


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#7  2009-03-22 15:26:59

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Hmmm pozmieniałem więc ścieżki w swoim programie tak aby były bezpośrednie, ustawiłem go na SUID (-rwsr-xr-x 1 root root 342554 2009-03-22 15:16 net-set)

I odpaliłem - byłem w stanie zabić połączenie (też dałem sobie taką opcje), ale kiedy próbowałem się połączyć ponownie to:

Kod:

/usr/sbin/pppd: Can't open options file /etc/ppp/peers/ppp0: Permission denied

Normalnie wydaje mi się dziwnym że program na uprawnieniach roota nie ma dostępu do /etc/ppp/peers/

Może na razie zamiast tego spróbował bym jednak z sudo i NOPASSWD - czy ktoś mógłby mi powiedzieć jak to ustawić dla pojedynczej komendy (pppd)? Dla reszty hasło miało by nadal być podawane. Szukałem trochę na necie ale jak na razie znalazłem tylko jak całkowicie pozbyć się hasła - co niezbyt mi pasuje...

Z góry dzięki za info.

Offline

 

#8  2009-03-22 15:34:14

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Huk, czy w Twoim programie chociaż ten bit +s używasz? Program sam jako root nie zacznie automatycznie pracować...

Ostatnio edytowany przez urug (2009-03-22 15:35:08)


Pozdrawiam, Tomek

Offline

 

#9  2009-03-22 15:46:22

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

@Huk

Kod:

username ALL =NOPASSWD: /cmd/path

@urug:

Kod:

rrp@pc-n17:/tmp$ cat /proc/1/syscall
cat: /proc/1/syscall: Brak dostępu
rrp@pc-n17:/tmp$ ./a.out
uid=1000(rrp) gid=1000(rrp) euid=0(root) grupy=6(disk),7(lp),20(dialout),24(cdrom),29(audio),44(video),46(plugdev),109(camera),113(fuse),1000(rrp)
142 0xb 0xbf809874 0x0 0x0 0xbf8099a4 0xbf8099a4 0xbf8096b0 0xb7fee430

gdzie a.out powstal z:

Kod:

#include <stdlib.h>

int main() {
    system("id; cat /proc/1/syscall");
}

jak widac wystarcza euid=0


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#10  2009-03-22 15:51:37

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Dobrze wiedzieć. To w takim razie już się nie wypowiadam ;-)

Ostatnio edytowany przez urug (2009-03-22 15:52:39)


Pozdrawiam, Tomek

Offline

 

#11  2009-03-22 16:04:51

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

@urug:

Emm... nie wiem za bardzo o co z tym "używaniem bitu +s" chodzi...

http://rapidshare.com/files/212186345/net-set.tar.gz.html

tutaj macie kod (qt-4.4.3 i 4.5 - może i na starszych działa...)

Mam nadzieję że to pomoże...

@bercik:

Obecnie mam:

Kod:

james    ALL=(ALL) ALL

jak zmieniłem na to co podałeś:

Kod:

james ALL=NOPASSWD: /cośtam

to inne komendy nie śmigały... (no chyba że nie tak miało to wyglądać...) nie da się jakoś dla pojedynczej komendy ustawić wywołanie bez hasła, a dla reszty hasło pozostawić??

Offline

 

#12  2009-03-22 17:33:48

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

Kod:

james    ALL=PASSWD: ALL,  NOPASSWD:/cmd/path

"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#13  2009-03-22 18:05:25

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C++ - system("xxx") i uprawnienia roota - w jaki sposób to zrobić?

@bercik:

Dzięki wielki - śmiga ;] później może po testuję jeszcze inne sposoby bez sudo, ale na razie może być.

Jeszcze raz dzięki.

Pozdro.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)