Diskussion [SH] Command-Injection in echo möglich?

Mat

Aktives Mitglied
Moin Leute,

mich würde interessieren, ob mein .bashrc mich anfällig für command injection Angriffe macht oder ob echo schon automatisch escaped ist.

Skript:​

Bash:
# Anstelle der CGI-Version
alias php='/opt/RZphp74/bin/php-cli'

# Aufrufen zB per: composer -d $PWD update
alias composer='php ~/bin/composer'

# docroot der aktuellen live-Seite
export DOCROOT_LIVE="/XYZ/htdocs/live"
alias gotopub="cd $LIVE"

# Ab hier Einstellungen fuer interaktive Shells
[[ $- != *i* ]] && return

# Buntbunt
alias ls='ls --color=auto'
PS1='\[\e[1;34m\]\w \[\e[0m\]\$ '; PROMPT_DIRTRIM=2

alias hilfe="vim -M $HOME/skripte/README.md"

# Letzter Login
LAST_LOGIN_FILE="$HOME/.lastlogin"
SERVER_TIME="$(date +"%Y-%m-%d %T")"
if [ ! -e $LAST_LOGIN_FILE ]
then
    echo $SERVER_TIME > $LAST_LOGIN_FILE
    LAST_LOGIN=$SERVER_TIME
else
    LAST_LOGIN=$(cat $LAST_LOGIN_FILE)
fi

echo -e "\e[1;36m######################################################\033[0m"
echo -e "\e[1;36m       SYSTEM: \e[0;32m$(uname -a)\033[0m"
echo -e "\e[1;36m        SHELL: \e[0;34m$(bash --version | head -1)\033[0m"
echo -e "\e[1;36m          PWD: \e[1;33m$(pwd)\033[0m"
echo -e "\e[1;36m   SERVERZEIT: \e[3;32m$SERVER_TIME\033[0m"
echo -e "\e[1;36mLETZTER LOGIN: \e[3;31m$LAST_LOGIN\033[0m"
echo -e "\e[1;36m      BEFEHLE: \e[0;32mphp, composer, gotopub, hilfe\033[0m"
echo -e "\e[1;36m######################################################\033[0m"

echo $SERVER_TIME > $LAST_LOGIN_FILE

So sieht das dann als Ergebnis aus:
2022-10-13 22_16_29-Clipboard.png


Szenario:​

Bisschen weit hergeholt, aber ein mögliches Szenario:
  1. es gibt 1 ssh-admin und mehrere normale ssh-user
  2. admin und user teilen sich das homeverzeichnis
  3. nur ssh-admin hat Schreibrechte im home
  4. alle haben Ausführungsrechte im home
  5. normale user haben Schreibrechte in einem Unterordner
  6. .lastlogin: ups, jeder hat Schreibrechte
  7. unberechtigte Person gelangt an Zugangsdaten eines normalen users
  8. person schreibt etwas in .lastlogin
  9. admin loggt sich ein und .bashrc wird mit dem manipulierten .lastlogin ausgeführt
Eine weitere Schwachstelle könnte der Hilfe-Befehl sein. Ich erinnere mich vage daran, dass man durch einen Bug in more (Fenstergröße ändern) Systembefehle in vim ausführen konnte.

Kontext:​

Ich habe auf einem Webserver SSH-Zugang, den ich manchmal für Webseitenupdates benutze.
Weil die Rechte auf dem Server stark eingeschränkt sind, gibt es keine MOTD-Funktionalität und man kann sie auch nicht aktivieren.
Deswegen habe ich mir behelfsmäßig eine MOTD für Arme gebastelt. Nur ich habe Zugang, aber ich wollte prinzipiell wissen, ob das Skript auch für andere Fälle so OK ist. Recycling ist wichtig. :p
 
Zuletzt bearbeitet:
Ok, LAST_LOGIN=$(more -1 $LAST_LOGIN_FILE) statt cat ist schon mal ganz gut.

Hab aber bei der Gelegenheit gesehen, dass man auch den letzten Dateizugriff mit date ausgeben kann. Ich hatte das zuvor mit stat probiert und das hat keine Änderungsdaten angezeigt.

Also jetzt nehme ich LAST_LOGIN=$(date --reference=$LAST_LOGIN_FILE '+%Y-%m-%d %H:%M:%S')

Alternativ müsste ich sonst alles, was ich in echo rein kriege, vorher selber bereinigen.. und da könnte ich unmöglich an alle Fälle denken.

Edit: Der Code sieht jetzt aus wie folgt:​

Bash:
LAST_LOGIN_FILE="$HOME/.lastlogin"
SERVER_TIME="$(date +"%Y-%m-%d %T")"
if [ ! -e $LAST_LOGIN_FILE ]; then
    LAST_LOGIN=$SERVER_TIME
else
    LAST_LOGIN=$(date --reference=$LAST_LOGIN_FILE +'%Y-%m-%d %T')
fi

echo -e "\e[1;36m######################################################\033[0m"
echo -e "\e[1;36m       SYSTEM: \e[0;32m$(uname -a)\033[0m"
echo -e "\e[1;36m        SHELL: \e[0;34m$(bash --version | head -1)\033[0m"
echo -e "\e[1;36m          PWD: \e[1;33m$(pwd)\033[0m"
echo -e "\e[1;36m   SERVERZEIT: \e[3;32m$SERVER_TIME\033[0m"
echo -e "\e[1;36mLETZTER LOGIN: \e[3;31m$LAST_LOGIN\033[0m"
echo -e "\e[1;36m      BEFEHLE: \e[0;32mphp, composer, gotopub, hilfe\033[0m"
echo -e "\e[1;36m######################################################\033[0m"

echo $SERVER_TIME >$LAST_LOGIN_FILE
 
Zuletzt bearbeitet:
Zurück
Oben Unten