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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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
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)
Offline
@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:
#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:
-rwxr-xr-x 1 root james 7831 2009-03-22 12:37 test
No i wykonuję jako zwykły user:
./test sh: ifconfig: command not found 256
A teraz jako root:
sudo ./test ppp0 Link encap:Point-to-Point Protocol 0
Jak widać SUID nie zadziałał :(
P.S
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
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$
#include <iostream> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> using namespace std; int main() { setuid(0); system("id"); }
-rwsr-xr-x 1 root urug 10254 mar 22 13:03 test
Ostatnio edytowany przez urug (2009-03-22 13:05:23)
Offline
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 testNo 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
Offline
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:
/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
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)
Offline
@Huk
username ALL =NOPASSWD: /cmd/path
@urug:
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:
#include <stdlib.h> int main() { system("id; cat /proc/1/syscall"); }
jak widac wystarcza euid=0
Offline
@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:
james ALL=(ALL) ALL
jak zmieniłem na to co podałeś:
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
james ALL=PASSWD: ALL, NOPASSWD:/cmd/path
Offline
@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
Strony: 1