Linux _nicht_ganz_so_ Short Tip

Aufgabenstellung:
Endlosen Datenstream verschlüsseln und über das Netzwerk verschicken.

Lösung generisch:

tail /irgendeine-datei -f | openssl aes-256-cbc -S $(openssl rand -hex 12 > salt; cat salt) -e -k $(openssl rand -hex 12 > static; cat static) -a | nc6 -l -p 1337

Was tut das:
ein Datenstrom (z.B. tail /irgendeine-datei-f) wird an openssl weitergereicht. Openssl erzeugt einmal einen Key (Datei Static) und einen Salt (gleichnamige Datei), die Dateien werden genutzt um den Stream mit aes-256-cbc zu verschlüsseln. OpenSSL reicht den verschlüsselten Stream im Anschluss an netcat weiter. Netcat läuft hier auf der lokalen IPv6 Adresse auf dem TCP Port 1337 und wartet auf eine eingehende Verbindung. Von einer beliebigen Gegenstelle aus kann der Stream nun wie folgt abgegriffen werden:
nc6 sender-ip 1337 > logdatei

Dies verbindet sich auf die angegebene IPv6-Adresse auf dem Port 1337 und schreibt alle empfangenen Daten in die Datei ‘logdatei’. Wenn der Stream beendet ist kann man die Datei mit openssl wieder entpacken und sich den Inhalt auf ausgeben lassen:
cat logdatei | openssl aes-256-cbc -S $(cat salt) -d -k $(cat static) -a
Schick wäre es wenn man ab einer Dateigröße von X bzw einem Dateialter von Y das speichern in logdatei2 beendet und in einer weiteren Datei weiterschreibt. Leider funktioniert hier kein simples Logrotate da dabei die Datei normalerweise verschoben wird und eine neue erstellt wird. Dies bewegt netcat aber dazu die Verbindung abbrechen zu lassen. Mit Netcat in eine fifo schreiben, diese dann in eine Datei catten und die Datei logrotaten funktioniert ebenfalls nicht. Sobald Logrotate die Datei verschiebt bricht netcat ab. Ebenfalls funktioniert es nicht netcat in einen symlink schreiben zu lassen und danach den symlink zu ändern, netcat ignoriert dies. Für Infos über eine funktionierende Logrotatelösung wäre ich dankbar :)

Ebenfalls wäre es schick den Stream zu komprimieren bevor er durch openssl geschickt wird. bzip2 und gzip kann man hier allerdings nicht zwischenbauen da diese Tools nur feste Chunks komprimieren können. Den Stream können Sie nicht selbstständig in Chunks einteilen somit komprimieren Sie erst wenn der Stream mit einem EOF endet (sprich das Programm das den Output erzeugt wird beendet). Auch hier bin ich für weitere Lösungsansetze offen.

Nachtrag:
Wie folgt kann man zumindest Logrotate implementieren (netcat übergibt output an while Schleife die stdin zeilenweise einliest, guckt ob bestimmte Zeilengröße erreicht wurde und dann ggf. logrotate mit der passenden Config für /var/log/logfile ausführt. Danach wird die Zeile in die Datei logfile geschrieben. Um Ressourcen zu sparen wird hier die Dateigröße in bash geprüft und nicht bei jedem Schleifendurchlauf von logrotate. Wichtig ist das die logrotate Config nicht wie üblich unter /etc/logrotate.d/* liegt, sonst würde diese bei jedem normalen logrotate durchlauf ausgeführt werden, dies könnte sich negativ auf den Einzeiler auswirken):
nc6 2sender-ip 1337 | while read line; do if [ $(stat -c%s /var/log/logfile) -ge 5242880 ]; then /usr/sbin/logrotate /root/logrotate-logfile.conf; fi; echo $line >> /var/log/logfile; done

und die zugehörige /root/logrotate-logfile.conf:
/var/log/logfile
{
rotate 14 # 14 alte logs aufbewahren
missingok # nicht explodieren falls die datei nicht existiert
notifempty # wenn die datei leer ist nicht rotaten
delaycompress
compress # gzippe die alten logs
create 644 root root # leere /var/log/logfile erstellen
}

das ganze lässt sich dann so ausgeben:
zcat /var/log/logfile.2.gz | openssl aes-256-cbc -S $(cat salt) -d -k $(cat static) -a

Hier sollte man nur mal überlegen in wie weit TCP sinnvoll ist wenn man über einen langen Zeitraum die Verbindung betreiben will. Sofern diese einmal abbricht muss sie manuell neugestartet werden. Man sollte das genetcatte in einer Screensession starten, es in den background forken mit & resultiert in regelmäßig abbrechenden Verbindungen. Falls noch jemand eine Idee hat wie man nicht erst die Logs gzipt sondern den Stream bevor man Ihn überhaupt erst mit openssl verschlüsselt => melden bei mir Kontakt :)

Noch ein Nachtrag:

Logrotate hat die Option ‘copytruncate’, damit kopiert logrotate die Datei und setzt danach den Inhalt der Ursprungsdatei auf 0. Damit funktioniert das Logrotate direkt, allerdings kann man dann mit OpenSSL die Datei nicht mehr entschlüsseln:
root@misc03:~# zcat /var/log/tcpdump.3.gz | openssl aes-256-cbc -S $(cat salt) -d -k $(cat static) -a
bad magic number
root@misc03:~#

Lösung für Netzwerktraffic 1:
daemonlogger :). Das Programm clont den kompletten Traffic einer Netzwerkschnittstelle oder speichert ihn in einer Logdatei. Installation erfolgt wie folgt:
wget http://www.snort.org/downloads/463
mv 463 463.tar.gz
gunzip 463.tar.gz
tar xfv 463.tar
cd daemonlogger-1.2.1
aptitude install libdnet
./configure
make
make install
cd ..
rm -r daeonlogger-1.2.1
rm -r 463.tar
daemonlogger -i -o

Leider ist aktuell die libdnet unter Ubuntu buggy(läuft unter Gentoo :)). Nach deren Installation hat man überhaupt kein Netzwerk mehr verfügbar.

Die schickste Lösung für Netzwerktraffic:
Man lässt einfach TCPDump loggen :D
folgendes Script (nennen wir es 1.sh) auf dem zu loggenden Server erstellen:
tcpdump -Zroot -i eth0 f -z /root/2.sh -w /root/tcpdump.pcap -C 100
Eintrag in der /etc/crontab der prüft ob das Script läuft, wenn nicht wird es gestartet
* * * * * root pidof -x /root/1.sh || /root/1.sh
tcpdump loggt hier den Traffic von eth0 in die tcpdump.pcap Datei bis zu einer Größe von 100Mb, ist die Größe erreicht wird /root/2.sh aufgerufen. tcpdump übergibt als Paramter $1 den Namen der Datei. Danach erzeugt tcpdump eine neue Datei und loggt in dieser wieder bis 100Mb.

2.sh:
cat $1 | gzip | openssl aes-256-cbc -S $(cat salt) -e -k $(cat static) -a -out $1.gz.enc | ssh "cat - >$1.gz.enc"
rm $1.gz.enc
rm $1.gz

Lezter Nachtrag:
Einfach weils so schön hässlich ist:
tcpdump -i eth0 -vvv | openssl aes-256-cbc -S $(cat salt) -d -k $(cat static) -a | ssh -carcfour "mbuffer -f -q -m64M -s1M -b64 | while read line; do if [ $(stat -c%s /var/log/tcpdump.log) -ge 5242880 ]; then /usr/sbin/logrotate /root/logrotate-logfile.conf; fi; echo $line >> /var/log/tcpdump.log; done"

This entry was posted in General, Linux, Short Tips. Bookmark the permalink.

2 Responses to Linux _nicht_ganz_so_ Short Tip

  1. Igor says:

    if you use a suffix such as .enc’ for enrycpted files, you can also use VIM to edit an enrycpted file. It asks for the password to decrypt then if you write it will ask for the password again to encrypt Add the following to your .vimrc file Edit enrycpted using openssl aes-256-cbcaugroup encautocmd!autocmd BufReadPre,FileReadPre *.enc set binautocmd BufReadPre,FileReadPre *.enc set noswapfileautocmd BufReadPost,FileReadPost *.enc set shell=shautocmd BufReadPost,FileReadPost *.enc set shellredir=>autocmd BufReadPost,FileReadPost *.enc [,’]!openssl aes-256-cbc -d -aautocmd BufReadPost,FileReadPost *.enc exe doau BufReadPost .expand( %:r )autocmd BufReadPost,FileReadPost *.enc set nobinautocmd BufReadPost,FileReadPost *.enc redraw!autocmd BufWritePre,FileWritePre *.enc mark zautocmd BufWritePre,FileWritePre *.enc set binautocmd BufWritePre,FileWritePre *.enc [,’]!openssl aes-256-cbc -a -saltautocmd BufWritePost,FileWritePost *.enc undoautocmd BufWritePost,FileWritePost *.enc set nobinautocmd BufWritePost,FileWritePost *.enc zaugroup ENDTo create a new file just start vim without a file name and then write’ it to one ending in .enc’ for example:w secret_stuff.encTo look at or modify the file just run vim secret_stuff.encWARNING: when saving make sure the file gets written correctly by looking at the output before quitting.ASIDE: The above was developed from old PGP and GPG enrycpted file techniques from vim.

  2. bastelfreak says:

    Genialer Spam, den musste ich zulassen.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.