Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Linux/UNIX Linuxverfechter finden hier Weggefährten.

/proc in BASH script bearbeiten

Diskussion: /proc in BASH script bearbeiten im Forum Linux/UNIX, in der Kategorie Operating Systems; Anzeige Hi, ich möchte als unprivilegierter User in der Lage sein Bluetooth an / aus zu schalten. Dazu habe ich ...

Antwort
Alt 11.04.09, 17:03   #1 (permalink)
Senior Member
 
Registriert seit: 26.03.06
Serow Leistung: 8086
Likes: 16
Standard /proc in BASH script bearbeiten

Anzeige

Hi,

ich möchte als unprivilegierter User in der Lage sein Bluetooth an / aus zu schalten. Dazu habe ich folgendes mini-script:

/usr/bin/bluetoothctl

Code:
#!/bin/bash
if [ "$1" = "on" ]; then
	echo "on"
	echo 1 > /sys/devices/platform/thinkpad_acpi/bluetooth_enable 
fi

if [ "$1" = "off" ]; then
	echo "off"
	echo 0 > /sys/devices/platform/thinkpad_acpi/bluetooth_enable 
fi
Ich habe also das SUID bit und "root" als Owner gesetzt:
Code:
mathias@apprentice:~$ ls -l /usr/bin/bluetoothctl 
-rwsr-xr-x 1 root root 222 2009-04-11 11:00 /usr/bin/bluetoothctl
mathias@apprentice:~$
Allerdings bekommt ich immernoch permission denied:
Code:
mathias@apprentice:~$ id
uid=1000(mathias) gid=1000(mathias) groups=20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),111(netdev),116(powerdev),1000(mathias)
mathias@apprentice:~$ bluetoothctl off
off
/usr/bin/bluetoothctl: line 10: /sys/devices/platform/thinkpad_acpi/bluetooth_enable: Permission denied
mathias@apprentice:~$
Ich verstehe nicht wieso ... Sollte doch eigentlich also root laufen!?!?!

cu
serow
Serow ist offline   Mit Zitat antworten
Alt 11.04.09, 17:12   #2 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Solange dein Skript nirgendwo root-Rechte annimmt, ist es logisch, dass du auch keine root-Rechte hast beim Ausführen der Befehle. Das SUID-Flag macht nur Sinn, wenn das damit versehene Programm auch setuid()-Aufrufe nutzt. Du wirst also um sudo nicht herum kommen, wenn es unbedingt ein Shell-Skript sein muss.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 11.04.09, 17:27   #3 (permalink)
Senior Member
Themenstarter
 
Registriert seit: 26.03.06
Serow Leistung: 8086
Likes: 16
Standard

Es kann auch Perl sein. Wie mache ich das dann in Perl? Bin noch nicht lange mit Perl vertraut.

Was sind setuid Aufrufe?

cu
serow
Serow ist offline   Mit Zitat antworten
Alt 11.04.09, 17:44   #4 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

setuid()-Aufrufe sind Systemaufrufe zum Ändern der aktuellen UID. Damit ein Programm diesen Systemruf nutzen kann, muss es das setuid-Flag haben. Bei Perl kann man es mit dem sogenannten setuid-Perl machen. Ein Beispiel dazu hatte ich mal im Thread -> zu SUID <- gepostet.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Alt 11.04.09, 17:47   #5 (permalink)
Senior Member
Themenstarter
 
Registriert seit: 26.03.06
Serow Leistung: 8086
Likes: 16
Standard

thx -läuft!
Serow ist offline   Mit Zitat antworten
Alt 12.04.09, 09:57   #6 (permalink)
 
Registriert seit: 12.04.09
CiscoKid Leistung: Z3
Likes: 2
Standard

Jetzt, wo das Problem erfolgreich gelöst wurde, kann ich mal nach herzenslust klugscheißen .

Zitat:
Das SUID-Flag macht nur Sinn, wenn das damit versehene Programm auch setuid()-Aufrufe nutzt.
Ähmm, nein. Bei einem mit SUID-Bit versehenen Executable wird die effektive UID durch die des Besitzers der Executable ersetzt; setuid(2) setzt nur die effektive UID, und ist deshalb, bei solchen Vorhaben, relativ sinnlos (bzw. unnötig redundant) .

Das erklärt aber noch nicht, warum Serow's Script nicht funktioniert. Eigentlich sollte es ja funktionieren,
aber es wird ja nicht das Script ausgeführt, *sondern* der Interpreter (bash)!
Und der ist _NICHT_ suid! (Wäre ja auch selten dämlich bash SUID-root zu haben...).

Als Beispiel, um die Theorie ein bisschen greifbarer zu machen :
Code:
$ id
uid=1000 gid=1000
$ cat > id.sh <<EOF
#!/bin/bash -p
id
EOF
$ sudo chown root:root id.sh
$ sudo chmod 4755 id.sh
$ ./id.sh
uid=1000 gid=1000
// Aha, SUID bei dem sript bringt nichts.. (wussten wir schon, aber egal...)
// probieren wir was anderes:
$ sudo chmod 4755 /bin/bash
$ ./id.sh
uid=1000 gid=1000 euid=0 
// die effektive UID ist also 0, hmm, was könnten wir damit jetzt bloss alles machen..
// (dient nur zur Verdeutlichung , dass wir auch wirklich root-Privilegien haben)
$ /bin/bash -p -c 'tail -1 /etc/shadow' 
tcpdump:!:14330:0:99999:7:::
// wichtig! folgende zeile nicht vergessen...
$ sudo chmod 755 /bin/bash
Anmerkung: die Option "-p" wird benötigt, weil bash ansonsten seine Privilegien wieder abgibt ("man 1 bash" für näheres).


grüße
__________________
Code:
# define B f[a]
char  f[2][26][82],i,j,a=0,c[]="_o",n;main(){B[3][3]=B[3][2]=B[3][1]=B[2][3]=B[1][2]=1;for
(;;){system("clear");for(i=1;i< 25;i++){for(j=1; j<81;j++){printf("%c",c[f[!a][i][j]]);n=B
[i-1][j-1]+B[i-1][j]+B[i-1][j+1]+B[i][j-1]+B[i][j+1]+B[i+1][j-1]+B[i+1][j]+B[i+1][j+1];f[!
a][i][j]=(!B[i][j]&&n==3) ||(B[i][j]&&n>1&&n<4);}puts("");}sleep(1);a=!a;}}
CiscoKid ist offline   Mit Zitat antworten
Alt 12.04.09, 12:13   #7 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Und dann werfen wir mal einen Blick in die Quelltexte der Bash und was finden wir dort?

Code:
/* Is this shell running setuid? */
static int running_setuid;
...
  running_setuid = uidget ();
...
  if (running_setuid && privileged_mode == 0)
    disable_priv_mode ();
...
  setuid (current_user.uid);
  setgid (current_user.gid);
...
Es würde die Bash recht wenig stören ob das setuid-Flag gesetzt ist, wenn es keine entsprechenden setuid-Calls gäbe.

Edit: Im übrigen muss bei Serows Skript nicht der Interpreter mit root-Rechten laufen, sondern die echo-Befehle.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Alt 12.04.09, 12:46   #8 (permalink)
 
Registriert seit: 12.04.09
CiscoKid Leistung: Z3
Likes: 2
Standard

Zitat:
Es würde die Bash recht wenig stören ob das setuid-Flag gesetzt ist, wenn es keine entsprechenden setuid-Calls gäbe.
Es würde die Bash recht wenig stören, ob das SUID-Flag gesetzt ist, wenn es nicht seine Privilegien droppen wollte.

Wie bereits erwähnt, droppt bash seine Privilegien, wenn nicht der "-p"-Switch übergeben wird. Das ist der einzige Grund, warum bash setuid(2) in seinem Code hat. Um seine Privilegein zu droppen. Nicht mehr und auch nicht weniger.

grüße

Edit:
Zitat:
Edit: Im übrigen muss bei Serows Skript nicht der Interpreter mit root-Rechten laufen, sondern die echo-Befehle.
Nein, ">" wird von dem Interpreter (bash) interpretiert. Ergo muss der Interpreter als root laufen; kann man auch schön an der Fehlermeldung erkennen:
Code:
/usr/bin/bluetoothctl: line 10: /sys/devices/platform/thinkpad_acpi/bluetooth_enable: Permission denied
__________________
Code:
# define B f[a]
char  f[2][26][82],i,j,a=0,c[]="_o",n;main(){B[3][3]=B[3][2]=B[3][1]=B[2][3]=B[1][2]=1;for
(;;){system("clear");for(i=1;i< 25;i++){for(j=1; j<81;j++){printf("%c",c[f[!a][i][j]]);n=B
[i-1][j-1]+B[i-1][j]+B[i-1][j+1]+B[i][j-1]+B[i][j+1]+B[i+1][j-1]+B[i+1][j]+B[i+1][j+1];f[!
a][i][j]=(!B[i][j]&&n==3) ||(B[i][j]&&n>1&&n<4);}puts("");}sleep(1);a=!a;}}
CiscoKid ist offline   Mit Zitat antworten
Alt 12.04.09, 12:58   #9 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Stimmt, hab das gerade mal mit einem Test-Programm ausprobierte. Da hast du wohl recht. Dieses Verhalten beim setuid-Flag war mir bisher so nie bewusst. Wieder ein Grund mehr, warum man Linux besser nur mit RBAC (oder garnicht) nutzen sollte.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Operating Systems » Linux/UNIX » /proc in BASH script bearbeiten
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe bei Bash Script Anpassung Serow Linux/UNIX 0 30.09.08 10:06
[BASH] Im Script Benutzer wechseln Eydeet Code Kitchen 4 08.04.08 17:37
KeinZugriff auf /proc/acpi/wakeup versus1 Linux/UNIX 4 15.06.07 15:54
farbiger Akkustatus in Bash - Script naked_chef Linux/UNIX 6 03.09.06 15:55
Datei online bearbeiten oder ich brauche nen neues Script beantworten , zitieren , editieren Sr01 (Web-) Design und webbasierte Sprachen 4 15.04.04 13:57


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61