Archivi tag: jailroot

tux-jail-banner

Rompere una jailroot

A volte capita che su appliance o semplicemente su sistemi con sicurezza molto elevata il nostro utente sia collocato in una jailroot, ossia in un ambiente isolato dal root filesystem e con un ristretto numero di comandi disponibili.

Ovviamente stiamo parlando di una situazione in ambiente Linux (ovvero un qualsiasi sistema basato su un kernel linux, ed in particolare superiore o equivalente alla version 2.4).

Ebbene non essendo possibile mantenere questo isolamento  (per varie ragioni, ma essenzialmente per la necessaria gestione dei processi) per quanto riguarda il filesystem virtuale /proc, questo ci consente di rompere parzialmente l’isolamento della jailroot e conoscere molto del sistema reale che l’isolamento presunto ci voleva nascondere.

Essenzialmente la rimozione di molti comandi amministrativi (e molte utilità) vorrebbero impedire la lettura di quelle configurazioni che di norma potrebbero essere lette (ma non manipolate) da un utente normale; altre configurazioni non sono accessibili per la sicurezza intrinseca del filesystem. Ma stiamo parlando delle configurazioni statiche. La configurazione in essere (running) risiede (per molte componenti del sistema essenzialmente) nel kernel, ed il kernel è accessibile tramite il filesystem virtuale /proc, in moltissime sue parti anche da utenti non privilegiati.

Mediante questo assunto possiamo portare quindi due esempi su come accedere a informazioni quali tabella di routing (in assenza del comando route) oppure alla lista dei processi (in assenza del comando ps) facendo uso solo del filesystem virtuale /proc e di soli comandi interni ad una bash.

Tabella di routing

Se non ci hanno voluto fornire il comando route, possiamo ovviare mediante:

while read IFA DST GW FL REF USE MET MSK MTU WIN IRTT do
if [ $IFA != "Iface" ]; then
echo -ne "$IFA\t ${DST:4:2}${DST:6:2}${DST:2:2}${DST:0:2}"
echo -e "\t${GW:4:2}${GW:6:2}${GW:2:2}${GW:0:2}"
fi
done < /proc/net/route

Unico neo di questo approccio è il non poter contare su un comando tipo ipcalc per tradurre da formato esadecimale a dotted-quad. Però questo può essere fatto in un secondo momento: quello che conta è che il dato è perfettamente accessibile.

Lista processi

Se non ci hanno voluto fornire il comando ps,  possiamo ovviare con:

 for pid in /proc/[0-9]* do
[ -f $pid/cmdline ] && read CMD < $pid/cmdline while read TAG VALUE REST; do
[ "$TAG" = "Pid:" ] && echo -ne $VALUE"\t"
[ "$TAG" = "PPid:" ] && echo -ne $VALUE"\t"
[ "$TAG" = "Name:" ] && echo -ne $VALUE"\t"
[ "$TAG" = "State:" ] && echo -ne $VALUE $REST"\t"
[ "$TAG" = "Uid:" ] && echo -ne $VALUE"\t"
done < $pid/status
[ -n "$CMD" ] && echo -n $CMD
echo done

Potremmo continuare a ricercare e decodificare informazioni da /proc.

Ma è sufficiente per indicare il senso di questo approccio.