PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sh: case mit regex? ! builtin abfangen?



403
12-08-2005, 17:12
Hallo ;

ich versuche mit einem sh-wrapper das ! der shell
abzufangen. Spaeter soll der Input mal ausgefuehrt werden.

Wenn ich in der Console folgendes eingebe funktioniert das nur
halb:


rtfmt:~ # sh ./echo-wrapper.sh at!d restart
sh ./echo-wrapper.sh atdate restart

atdate restart
rtfmt:~ # sh ./echo-wrapper.sh at\!d restart
atd restart


Dazu gibt es bisher folgendes:



#!/bin/bash --restricted

BAR=`echo "$@"|sed -e s'/!//g'|sed -e s'/\!//g'|sed -e s'/[^0-9,A-Z,a-z ]//g'`


case "$@" in

ls*)
/bin/ls
;;
*restart*)
echo $BAR
# sh -c "/etc/init.d/$SSH_ORIGINAL_COMMAND"
;;
*)
/bin/echo "not allowed and forbidden by the nsa:"$SSH_ORIGINAL_COMMAND"
;;
esac



Bin dankbar fuer jeden Hint.
gruss 403

Joghurt
13-08-2005, 00:05
Alle Ersetzungen nimmt die Shell vor, bevor das Programm ausgeführt wird, und dem Programm werden dann die Ergebnisse übergeben. Wenn du z.B
cat * schreibst, wird
cat foo bar baz aufgerufen, wenn diese 3 Dateiein im Verzeichnis sind.

Du wirst das also so nicht umgehen können.

403
13-08-2005, 13:51
Hallo :-)

warum sollte man * nicht durch s'/[^a-zA-Z0-9]//g' ersetzen keonnen?

bzw, die einzelnen Metazeiuchen wie ! usw. ?


Vermutlich ist es das beste nur "command " explizit zu erlauben statt mit
einem Regex alles auszuschliessen?


gruss 403

Und Danke fuer die Hilfe/Zeit

Joghurt
13-08-2005, 15:07
Ich verstehe nicht!? * und ! werden, wenn sie ersetzt werden, vor dem Aufruf ersetzt, $@ enthält bereits das Ergebnis dieser Ersetzung.

403
15-08-2005, 14:39
Es geht darum Shell Builtins abzustellen.


$@ enthält bereits das Ergebnis dieser Ersetzung...

Deshalb sollte ja $@ auch nochmal gerippt werden.

Ich glaube, was ich suche heisst einfach set -o noglob bzw.
enable -n noglob...

Im schlimmsten Fall wuerde man eben eine Bash neukompilieren, oder
wie bereits gesagt, die Moeglichkeiten explizit angeben.

( case in $SSH-ORIGINAL-COMMAND
atd restart
;;
nscd restart
;;
)

usw.

Joghurt
15-08-2005, 14:58
Ich denke, es ist besser, wenn du uns mitteilst, welches Problem du lösen willst, und nicht wie; was du da vorhast verstehe ich nicht ganz. Wenn du das Shellbuiltin test ausschaltest, nehme ich als /bin/test.

Also, welches Problem möchtest du lösen? Da gibt es sicherlich eine einfacherere udn sicherere Methode.

403
15-08-2005, 15:20
Ich denke, es ist besser, wenn du uns mitteilst, welches Problem du lösen willst, und nicht wie; was du da vorhast verstehe ich nicht ganz. Wenn du das Shellbuiltin test ausschaltest, nehme ich als /bin/test.

Also, welches Problem möchtest du lösen? Da gibt es sicherlich eine einfacherere udn sicherere Methode.

Also folgendes Scenario:

1) Ein User logt sich ein via SSH-PublickeyAuthorization mit forced commands
2) Statt einer Shell oder einem Command wird ein Wrapper gestartet
3) Das vom User uebertragene <Keyword> wird an den Wrapper uerbermittelt
4) der Wrapper startet den Dienst <Dienst> neu , oder stellt ihn aus usw.

5) Was verhindert werden soll ist, wenn jemand den Client cracked, dass
jemand dann z.B. /bin/bash -c "/bin/cat /etc/shadow" oder aehnliches
eingibt, weil im wrapper steht:


case in bla

*restart*)
/etc/init.d/$dienst restart


Dabei geht es um das erste *, was aus meiner sich eine potentielle Luecke
darstellt, die mit oben genannten Wegen geschlossen werden sollte.
natuerlich kann "*" nicht mehr verwendet werden, wenn noglob aktiv ist.
;)