Compare commits

..

8 Commits
gin ... main

Author SHA1 Message Date
Johannes Bülow 31a5e09ecd
New blogpost about nullbulge-ranner in German
ci/woodpecker/push/woodpecker Pipeline was successful Details
2024-06-03 22:50:51 +02:00
Johannes Bülow fc1540a738
publishing xz blogpost
ci/woodpecker/push/woodpecker Pipeline was successful Details
2024-04-04 13:41:33 +02:00
Johannes Bülow b9713badcd
added blog entry on the xz situation
ci/woodpecker/manual/woodpecker Pipeline was successful Details
2024-04-04 13:26:13 +02:00
Johannes Bülow 047623a2e0
fixed formatting error on about page
ci/woodpecker/push/woodpecker Pipeline was successful Details
2024-03-16 19:20:53 +01:00
Johannes Bülow e422c8c6c4
published Babelfish article
ci/woodpecker/push/woodpecker Pipeline was successful Details
2024-03-16 19:16:26 +01:00
Johannes Bülow 2a6727faa0
removed ppc64le and armv7 from build
ci/woodpecker/push/woodpecker Pipeline was successful Details
2024-03-16 19:06:23 +01:00
Johannes Bülow ad43152957
added new Blogpost on Babelfish
ci/woodpecker/push/woodpecker Pipeline failed Details
2024-03-16 19:00:08 +01:00
Johannes Bülow 63211c3f37
yes
ci/woodpecker/push/woodpecker Pipeline was successful Details
2024-01-12 10:51:51 +01:00
12 changed files with 335 additions and 131 deletions

View File

@ -10,22 +10,12 @@ steps:
image: git.jmbit.de/jmb/docker-hugo image: git.jmbit.de/jmb/docker-hugo
commands: commands:
- hugo --minify - hugo --minify
when:
event: [ pull-request, push]
webserver:
image: golang:alpine
commands:
- go mod download && go mod verify
- CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -buildvcs=true -o app .
when:
event: [ pull-request, push]
publish: publish:
image: woodpeckerci/plugin-docker-buildx image: woodpeckerci/plugin-docker-buildx
settings: settings:
dockerfile: *file dockerfile: *file
platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le platforms: linux/arm64/v8,linux/amd64
repo: *repo repo: *repo
registry: git.jmbit.de registry: git.jmbit.de
tags: latest tags: latest

View File

@ -4,7 +4,7 @@ RUN apk update && apk add --no-cache git
WORKDIR $GOPATH/src/www-jmbit-de WORKDIR $GOPATH/src/www-jmbit-de
COPY . . COPY . .
RUN go get -d -v RUN go get -d -v
RUN go build -o /go/bin/www RUN go build -a -installsuffix cgo -ldflags="-w -s" -o /go/bin/www
FROM scratch FROM scratch
COPY --from=builder /go/bin/www /go/bin/www COPY --from=builder /go/bin/www /go/bin/www

View File

@ -15,9 +15,6 @@ webserver:
container: container:
podman build -t $(CTNAME):latest -t $(CTNAME):$(HEAD) . podman build -t $(CTNAME):latest -t $(CTNAME):$(HEAD) .
nopub: hugo webserver container
podman run --rm -p8080:80 $(CTNAME)
run: run:
podman run --rm -p8080:80 $(CTNAME) podman run --rm -p8080:80 $(CTNAME)

View File

@ -16,7 +16,7 @@ defaultContentLanguage= "de"
[languages.de.params] [languages.de.params]
title = "Johannes Bülow IT Consulting" title = "Johannes Bülow IT Consulting"
subtitle = "Consulting & Support zu IT-Sicherheit, Linux, Hosting, Entwicklung und mehr" subtitle = "Consulting & Support zu IT-Sicherheit, Linux, Hosting, Entwicklung und mehr"
keywords = "" keywords = "linux, it, consulting, security, hosting, development, jmbit, johannes bülow"
copyright = "Johannes Bülow" copyright = "Johannes Bülow"
menuMore = "Mehr anzeigen" menuMore = "Mehr anzeigen"
readMore = "Weiterlesen" readMore = "Weiterlesen"

View File

@ -9,6 +9,7 @@ GPG-Key: [https://www.jmbit.de/gpg.asc.txt](/gpg.asc.txt)
SSH-RSA-Key: [https://www.jmbit.de/id_rsa.pub](/id_rsa.pub) SSH-RSA-Key: [https://www.jmbit.de/id_rsa.pub](/id_rsa.pub)
SSH-ED25519-Key: [https://www.jmbit.de/id_ed25519.pub](/id_ed25519.pub) SSH-ED25519-Key: [https://www.jmbit.de/id_ed25519.pub](/id_ed25519.pub)
Email: kontakt @ jmbit.de Email: kontakt @ jmbit.de
Github: [jmbit](https://github.com/jmbit/)
{{< rawhtml >}} {{< rawhtml >}}
<a target="_blank" rel="noreferrer noopener" href="https://nextcloud.com/sharing#jmb@cloud.jmbit.de" style="padding:10px;background-color:#0082c9;color:#ffffff;border-radius:3px;padding-left:4px;"> <a target="_blank" rel="noreferrer noopener" href="https://nextcloud.com/sharing#jmb@cloud.jmbit.de" style="padding:10px;background-color:#0082c9;color:#ffffff;border-radius:3px;padding-left:4px;">
<span style="background-image:url(https://cloud.jmbit.de/core/img/logo/logo.svg?v=7);width:50px;height:30px;position:relative;top:8px;background-size:contain;display:inline-block;background-repeat:no-repeat; background-position: center center;"></span> <span style="background-image:url(https://cloud.jmbit.de/core/img/logo/logo.svg?v=7);width:50px;height:30px;position:relative;top:8px;background-size:contain;display:inline-block;background-repeat:no-repeat; background-position: center center;"></span>

View File

@ -0,0 +1,43 @@
---
title: "Babelfish für Postgresql - MSSQL-Kompatibilität für Postgres"
date: 2024-03-16
draft: false
---
[Babelfish](https://babelfishpg.org/) ist ein Projekt, das die Verwendung von Postgresql für Software erlaubt, die
eigentlich für MSSQL (Microsoft SQL Server) geschrieben wurden. Dies erlaubt zum einen das einsparen von Lizenzkosten,
die bei MSSQL, insbesondere für hochverfügbare Umgebungen, leicht sehr hoch werden können, zum anderen aber auch, das
größere und modernere Postgres-Ökosystem verwenden zu können.
## Was ist Babelfish?
Ähnlich wie sein [Namensvorbild](https://de.wikipedia.org/wiki/Babelfisch), ist Babelfish kein migrationstool o.ä.,
sondern eine Kompatibilitäts/Übersetzungsschicht, vergleichbar etwa mit [Wine](https://www.winehq.org/). Im Optimalfall
kann man also eine Applikation, die eine MSSQL-Datenbank benötigt, mit einem Postgres-DB-Server betreiben, ohne die
Applikation umbauen zu müssen. Das kann einerseits für eine vereinfachte Migration sein, andererseits aber auch für die
Ablösung bestehender MSSQL-Server durch Postgres-Server.
## Was ist Babelfish nicht?
Babelfish ist aktuell NICHT 100% MSSQL-Kompatibel. Es fehlen vor allem Funktionalitäten, die mit dem DB-Server selbst zu
tun haben (bestimmte tabellen in Systemdatenbanken, manche Stored Procedures...) oder mit dem darunterliegenden OS
(CLR/Assebly Module). Dadurch ist Babelfish nicht plug&play, sollte die Applikation eher exotische Funktionen verwenden.
Ebenfalls sollte es nicht als einfaches Drop-In-Replacement gesehen werden.
## Wie finde ich heraus, ob Babelfish für meine Anwendung funktioniert?
Es gibt mehrere Ressourcen, mit deren Hilfe es möglich ist, die Kompatibilität mit Babelfish zu testen:
- Dokumentation: Es gibt sowohl von AWS für ihre SAAS-Version
[Informationen](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/babelfish-compatibility.tsql.limitations-unsupported.html),
als auch vom [Babelfish Projekt selbst](https://babelfishpg.org/docs/limitations/limitations-of-babelfish/).
Letztere tendieren leider dazu, etwas veraltet zu sein.
- [Babelfish-Compass](https://github.com/babelfish-for-postgresql/babelfish_compass): Compass ist ein Tool, mit dessen
Hilfe es möglich ist, die Kompatibilität sowohl von Skripten, als auch Software und bestehender Datenbanken zu
messen.
## Welche Alternativen gibt es?
Sollte es nicht möglich sein, eine Applikation von MSSQL auf Babelfish & Postgres zu migrieren, gibt es noch ein paar
andere Möglichkeiten, die Datenbank zu modernisieren. Seit Version 2019 kann MSSQL auch unter Linux betrieben werden,
was abgesehen von der Möglichkeit, Windows Lizenzen einzusparen, die Möglichkeit bietet, die Server mit den üblichen
Verwaltungstools zu verwalten, sowie Dateisysteme und Storage-Backends zu verwenden, die Windows nicht unterstützt.
Andererseits erlaubt es auch den Betrieb der Datenbank auf einem Kubernetes-Cluster, das dann Skalierung, Resilienz und
Verwaltung der DB-Engine übernimmt.
Sollten Sie nach dieser Einleitung weitere Fragen zu Babelfish haben, können Sie mich gerne kontaktieren.

View File

@ -0,0 +1,70 @@
---
title: "Gedanken zu XZ"
date: 2024-04-04
draft: false
---
Dieser Blogpost ist dazu da, meine Gedanken zu der XZ-Situation zusammenzufassen.
## 1. Die Entdeckung
Die [Entdeckung der Backdoor in liblzma](https://www.openwall.com/lists/oss-security/2024/03/29/4)
war einerseits ein purer Glücksgriff, andererseits auch ein Beispiel dafür, warum
Open Source so wichtig für die Entdeckung und Analyse von Schwachstellen ist. In diesem Fall war es dem Entdecker -
trotz der Tatsache, dass er eigentlich Datenbank-Entwickler ist - in verhältnismäßig kurzer Zeit möglich, die Ursache
der "langsamen" SSH-Logins (800 statt 300 ms) zu ermitteln und zu analysieren. Im Vergleich dazu hatte ich deutlich mehr
Zeit investiert in die letztlich erfolglose Analyse eines Memory leaks unter Microsoft Windows.
## 2. Die potenziellen Auswirkungen
Wäre die Backdoor erfolgreich verbreitet worden, wäre früher oder später -
[abhängig vom Patchzyklus](https://infosec.exchange/@SecureOwl/112181879860988729) - ein großer Teil der Server im
Internet verwundbar gewesen:
![Shodan zeigt 19 698 358 OpenSSH Server](/img/blog/shodan-openssh-2024-04-04.png)
Der Angreifer hätte ähnlichen Zugriff auf diese Server gehabt wie damals mit Ethernal Blue auf Windows-Server... Nur
dass laut Shodan nur etwa 420 000 Windows Server mit offenem SMB-Port im Internet stehen.
## 3. Analyse
Die Analyse der Backdoor (abgesehen von dem nicht gerade hilfreichen Takedown durch Github) hat einige interessante
Informationen zu Tage befördert. Einmal die Tatsache, dass diese Backdoor sehr gut versteckt war, enthalten in einer
Testfile, mit dem "Aktivierungscode" nicht in der Versionskontrolle enthalten[^1]. Ebenso auffällig ist, dass die
Backdoor/RCE einen bestimmtes SSH-Zertifikat benötigt, um aktiviert zu werden, und die Payload innerhalb dieses
Zertifikats (genauer, dem CA-Teil) enthalten ist, wo binäre Daten kaum auffallen [^2] . Später ist ebenfalls aufgefallen, dass
der Name "Jia Cheong Tan" zwar chinesisch klingt, aber eine Mischung aus Kantonesisch und Mandarin ist[^3]. Aus der
Analyse der Git commit logs geht ebenfalls heraus, dass die Commits zu UrzeitenSch gemacht wurden, die für China eher
unüblich sind[^4]. Die Vermutung liegt also nahe, dass die tatsächliche Person (oder Personen?) hinter der Backdoor
vermutlich eher in Osteuropa oder dem Nahen Osten (UTC+2/3) zu finden ist.
## 4. Lessons Learned
- Die XZ-Backdoor ist eine seltene Möglichkeit, in die Vorgehensweise und den Code von möglichen staatlichen Akteuren oder
anderen APTs[^5] hineinsehen zu können und sein Sicherheitsvorgehen dahingehend zu optimieren.
- Interessant ist, dass die Backdoor nicht im eigentlichen Source Code des Git trees enthalten war,
sondern in binären Testdateien (für deren
Generierung kein Sourcecode verfügbar war) versteckt war und der Code zur Aktivierung nur im Release-Tarball enthalten
war, nicht jedoch im Git tree, was in Kombination dafür spricht, dass der Urheber der Sicherheitslücke versucht hat, so
wenig "permanente" Spuren wie möglich zu hinterlassen, die von (automatischer) Code-Analyse einfach gefunden worden
wären.
- Ebenfalls stellt sich die Frage, in wie vielen anderen Projekten (Open Source wie proprietär), ähnliche Angriffe
versucht wurden und vielleicht sogar erfolgreich waren. In Zukunft werde zumindest ich deutlich mehr Vorsicht gegenüber
binären Dateien in Source Code walten lassen. Möglich wäre z.B., dass eine Backdoor in einem binary blob Treiber
enthalten ist, der von einem Hardware-Hersteller veröffentlicht wird. Sollte dieser Treiber statisch (also nicht als
Kernel Modul) in den Kernel compiliert werden, wäre es möglich, diese Schwachstelle auf Millionen von Geräten zu
installieren.
- Ähnliches Vorgehen in proprietärer Software (z.B. Microsoft Exchange) dürfte in ähnlicher Weise umsetzbar sein. Das
Plazieren eines Maulwurfs in einem solchen Entwicklerteam könnte sogar einfacher sein, da das Vertrauen einem anderen
Mitarbeiter gegenüber deutlich schneller anwächst als einem Fremden gegenüber.[^6]
- Mobbing und Burnout können ein echtes Sicherheitsrisiko sein. "Jia Tan" wäre vermutlich nie in diese Position gekommen,
wäre der eigentliche Maintainer und Entwickler von xz nicht von Burnout betroffen und effektiv dazu gemobbt worden,
"Jia Tan" zum Co-Maintainer und sogar primären Maintainer zu machen.
[^1]: https://gynvael.coldwind.pl/?id=782
[^2]: https://bsky.app/profile/filippo.abyssdomain.expert/post/3kowjkx2njy2b
[^3]: https://boehs.org/node/everything-i-know-about-the-xz-backdoor
[^4]: https://rheaeve.substack.com/p/xz-backdoor-times-damned-times-and
[^5]: https://en.wikipedia.org/wiki/Advanced_persistent_threat
[^6]: https://infosec.exchange/@SecureOwl/112181879860988729

View File

@ -0,0 +1,218 @@
---
title: "Nullbulge-Ranner - Compiled Python Malware"
date: 2024-06-03
draft: false
---
Ich bin in den letzten Tagen über [Eric Parker](https://www.youtube.com/@EricParker) auf Malware gestößen, über BeamNG-Mods verteilt wurde.
Das interessante an dieser Malware ist, dass sie zwar in Python geschrieben ist, aber mithilfe von Pyinstaller[^1] kompiliert wurde.
Dadurch, in Verbindung mit der gewählten Python-Version, ist die Malware effektiv nicht dekompilierbar und nur schwer zu reverse engineeren.
Die meisten Informationen über die Malware mussten daher über dynamische Analyse in Sandboxen und VMs gewonnen werden.
## Oberflächliche statische Analyse
Der Erste Schritt war, die Datei "statisch" zu analysieren, das heißt, sich die Eigenschaften der Malware anzuschauen ohne die Malware selbst auszuführen.
Dafür habe ich initial die Tools "capa"[^2], "detect-it-easy"[^3] und "yara"[^4] verwendet.
Detect-It-Easy gibt uns genauere Informationen über die Datei, vor allem, dass sie mit PyInstaller "gepackt" wurde.
```
PE64
Linker: Microsoft Linker(14.36.33135)
Compiler: Microsoft Visual C/C++(19.36.33135)[C]
Tool: Visual Studio(2022 version 17.6)
Packer: PyInstaller
```
Capa findet schon sehr viele Informationen:
{{< rawhtml >}}
<pre>
┍━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑
│ ATT&amp;CK Tactic │ ATT&amp;CK Technique │
┝━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
<font color="#06989A">DEFENSE EVASION</font><font color="#06989A">Obfuscated Files or Information</font> T1027 │
│ │ <font color="#06989A">Virtualization/Sandbox Evasion</font>::System Checks T1497.001 │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">DISCOVERY</font><font color="#06989A">File and Directory Discovery</font> T1083 │
│ │ <font color="#06989A">System Information Discovery</font> T1082 │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">EXECUTION</font><font color="#06989A">Command and Scripting Interpreter</font> T1059 │
│ │ <font color="#06989A">Shared Modules</font> T1129 │
┕━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙
┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑
│ MBC Objective │ MBC Behavior │
┝━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
<font color="#06989A">ANTI-BEHAVIORAL ANALYSIS</font><font color="#06989A">Virtual Machine Detection</font> [B0009] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">DATA</font><font color="#06989A">Checksum</font>::Adler [C0032.005] │
│ │ <font color="#06989A">Compress Data</font> [C0024] │
│ │ <font color="#06989A">Compression Library</font> [C0060] │
│ │ <font color="#06989A">Encode Data</font>::XOR [C0026.002] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">DEFENSE EVASION</font><font color="#06989A">Obfuscated Files or Information</font>::Encoding-Standard Algorithm [E1027.m02] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">DISCOVERY</font><font color="#06989A">Analysis Tool Discovery</font>::Process detection [B0013.001] │
│ │ <font color="#06989A">File and Directory Discovery</font> [E1083] │
│ │ <font color="#06989A">System Information Discovery</font> [E1082] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">EXECUTION</font><font color="#06989A">Command and Scripting Interpreter</font> [E1059] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">FILE SYSTEM</font><font color="#06989A">Create Directory</font> [C0046] │
│ │ <font color="#06989A">Delete Directory</font> [C0048] │
│ │ <font color="#06989A">Delete File</font> [C0047] │
│ │ <font color="#06989A">Read File</font> [C0051] │
│ │ <font color="#06989A">Writes File</font> [C0052] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">OPERATING SYSTEM</font><font color="#06989A">Environment Variable</font>::Set Variable [C0034.001] │
├─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤
<font color="#06989A">PROCESS</font><font color="#06989A">Create Process</font> [C0017] │
│ │ <font color="#06989A">Terminate Process</font> [C0018] │
┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙
┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑
│ Capability │ Namespace │
┝━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥
<font color="#06989A">reference analysis tools strings</font> │ anti-analysis │
<font color="#06989A">reference anti-VM strings targeting Qemu</font> │ anti-analysis/anti-vm/vm-detection │
<font color="#06989A">reference anti-VM strings targeting Xen</font> │ anti-analysis/anti-vm/vm-detection │
<font color="#06989A">compute adler32 checksum</font> │ data-manipulation/checksum/adler32 │
<font color="#06989A">compress data via ZLIB inflate or deflate</font> │ data-manipulation/compression │
<font color="#06989A">encode data using XOR</font> (6 matches) │ data-manipulation/encoding/xor │
<font color="#06989A">accept command line arguments</font> │ host-interaction/cli │
<font color="#06989A">query environment variable</font> (4 matches) │ host-interaction/environment-variable │
<font color="#06989A">set environment variable</font> (4 matches) │ host-interaction/environment-variable │
<font color="#06989A">get common file path</font> │ host-interaction/file-system │
<font color="#06989A">create directory</font> (2 matches) │ host-interaction/file-system/create │
<font color="#06989A">delete directory</font> │ host-interaction/file-system/delete │
<font color="#06989A">delete file</font> │ host-interaction/file-system/delete │
<font color="#06989A">enumerate files on Windows</font> │ host-interaction/file-system/files/list │
<font color="#06989A">get file size</font> │ host-interaction/file-system/meta │
<font color="#06989A">read file on Windows</font> (10 matches) │ host-interaction/file-system/read │
<font color="#06989A">write file on Windows</font> (2 matches) │ host-interaction/file-system/write │
<font color="#06989A">get disk information</font> (2 matches) │ host-interaction/hardware/storage │
<font color="#06989A">create process on Windows</font> │ host-interaction/process/create │
<font color="#06989A">terminate process</font> │ host-interaction/process/terminate │
<font color="#06989A">link many functions at runtime</font> (2 matches) │ linking/runtime-linking │
<font color="#06989A">linked against ZLIB</font> │ linking/static/zlib │
<font color="#06989A">parse PE header</font> (3 matches) │ load-code/pe │
<font color="#06989A">resolve function by parsing PE exports</font> │ load-code/pe │
┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙
</pre>
{{</ rawhtml >}}
Auch Yara findet einige Pattern in der Datei:
```
DebuggerException__SetConsoleCtrl
anti_dbg
screenshot
win_token
win_files_operation
Big_Numbers1
CRC32_poly_Constant
CRC32_table
MachO_File_pyinstaller
IsPE64
IsWindowsGUI
IsPacked
HasOverlay
HasDigitalSignature
HasDebugData
HasRichSignature
Microsoft_Visual_Cpp_80
Microsoft_Visual_Cpp_80_DLL
```
Zusammenfassend können wir aus dieser statischen Analyse also sagen, dass die Malware es versucht, einem die Analyse schwerer zu machen und möglicherweise ein
RAT ist (kann laut YARA screenshots machen).
## Dynamische Analyse mit CAPE
Eine [CAPE-Sandbox-Umgebung](https://www.jmbit.de/blog/2023-11-30-capev2-sandbox/) ist eine gute Möglichkeit, lokal dynamische Analysen von Malware oder potenzieller
Malware durchzuführen. In diesem Fall enthält die zu analysierende Datei zwar keine sensiblen Daten, sollte das aber der Fall sein, ist es ggf. nicht sinnvoll,
die Datei auf eine Cloud-Platform hochzuladen.
Hier fielen vor allem die Anti-Analyse-Funktionen sowie die Requests zu Discord auf. Da die Malware jedoch ohne Verbindung zu Discord relativ inaktiv ist und keine user-interaktion bietet, ist die
dynamische analyse hier abgesehen von den Informationen über die installation der Software und ihr Verhalten gegenüber Virtualisierung und Debuggern nicht besonders ergibig.
[REPORT](https://cloud.jmbit.de/s/qLtzrFyjY3TfQmX)
## Analyse des Webtraffic mithilfe von MITMProxy
Um den Webtraffic genauer anzusehen und mitlesen zu können und eventuelle API-Keys abfangen zu können, habe ich die Malware in einer VM gestartet, die über mitmproxy[^5] ins Internet gegangen ist.
Hier wurde aber lediglich versucht, sich als ein Bot in Discord einzuloggen, der Zugriff wurde jedoch abgelehnt:
```http
GET /api/v10/users/@me HTTP/1.1
Host: discord.com
User-Agent: DiscordBot (https://github.com/Rapptz/discord.py 2.3.2) Python/3.10 aiohttp/3.9.5
Authorization: Bot <REDACTED>
HTTP/1.1 401 Unauthorized
{"message": "401: Unauthorized", "code": 0}
```
## Analyse des Programmcodes
Nachdem ich der Malware in der Dynamischen Analyse kaum Informationen entlocken konnte, ging es an die statische Analyse. Da Python 3.10 leider zu neu für die meisten Decompiler ist[^6], musste ich mich mit dem
Ergebnis eines Disassemblers zufrieden geben. Aus dem Output dieses (Immerhin 21355 Zeilen!) lies sich der Verdacht, dass es sich bei der Malware um eine Version von PySilon handelt, bestätigen.
Es wurden jedoch einige zusätzliche Funktionen eingefügt, so zum Beispiel Ransomware und die Möglichkeit des Nachladens eines Cryptominers. Ebenfalls bin ich über während der Analyse auf andere Malware der
gleichen Gruppe gestoßen.
Die Ransomware-Mitteilung `NULLBULGE-RANSOMWARE-NOTE.TXT` würde diesen Text enthalten:
```
READ THIS ENTIRELY BEFORE ACTING, IF YOU SHUT DOWN NOW, ALL WILL BE LOST.
Your computer is now infected with ransomware. Your file are encrypted with a secure algorithm that is impossible to crack.
By now it has moved from your main drive, and has started encrypting other drives.
DONT PANIC! IF YOU START LOOKING FOR THE VIRUS, YOU WILL NOT GET ANY FILES ALREADY ENCRYPTED BACK! BUT THEY CAN BE SAVED!
To recover your files you need a key. This key is generated once your file have been encrypted. To obtain the key, you must purchase it.
You can do this by sending 100 USD to this monero address:
45i7kjWZuzJ4PdSbandaaE8S6mQATmneTYEpgsaaCqDmc7foEJDXwxd3ABR8bn6YE4c7hZ2dYEEr1CwG48gAknPL6zUpYyV
Don't know how to get monero? Here are some websites:
https://www.kraken.com/learn/buy-monero-xmr
https://localmonero.co/?language=en
https://www.bestchange.com/visa-mastercard-usd-to-monero.html
Cant get monero and want to pay via giftcards instead? contact the email below.
Once you have sent the ransom to the monero address you must write an email this this email address: ZeCBMail@proton.me
In this email you will include your personal ID so we know who you are. Your personal ID is:
<ID>
Payment is flexable, if you want to discuss pricing send an email with your discord username and I will contact you.
Be warned... pricing can go up too!
Once you have completeted all of the steps, you will be provided with the key to decrypt your files.
Don't know how ransomware works? Read up here:
https://www.trellix.com/en-us/security-awareness/ransomware/what-is-ransomware.html
https://www.checkpoint.com/cyber-hub/threat-prevention/ransomware/
https://www.trendmicro.com/vinfo/us/security/definition/Ransomware
Note: Messing with the ransomware will simply make your files harder to decrypt. Deleting the virus will make it impossible, as the key can not be generated.
Good luck
-NullBulge
```
Der Crypto-Miner ist XMRIG und mined für den Pool "xmrpool.eu".
Der Bot wird sowohl über Discord-Reactions als auch über direkte Befehle gesteuert. Die Reactions können einfachere Funktionen abbilden, wie z.B. das wipen der Malware vom System.
Interessanter sind jedoch die "richtigen" Befehle, z.B.:
* '.ss' -> Macht einen Screenshot vom Bildschirm des Opfers
* '.screenrec' -> zeichnet 15 Sekunden den Bildschirm auf
* '.join' -> Tritt einem Voice Channel bei und überträgt die Aufnahmen des Mikrofons
* '.show' -> Zeigt informationen, z.B. alle laufenden Prozesse
* '.kill' -> Beendet einen Prozesse
* '.block-input' -> Deaktiviert Tastatur- und Mauseingaben
* '.break-windows' -> Bennent den Boot-Manager um und verhindert damit, dass Windows rebooten kann
* '.xmrig' -> Führt den Cryptominer aus
* '.webcam photo' -> Macht ein Bild mit der Webcam
* '.encrypt' -> Verschlüsselt alle Dateien im angegebenen Verzeichnis
* '.cmd' -> Führt beliebigen Befehl aus
* '.admin' -> Kann Funktionen ausführen wie Defender, Taskmanager oder UAC deaktiveren.
[^1]: Pyinstaller ist Software, die es ermöglicht, in Python geschriebene Programme so zu compilen und bundlen, dass sie auf Systemen ohne Python-Interpreter
benutzt werden können. Das kann z.B. als PE-File (Windows .exe) oder ELF (Linux/Unix) sein.
[^2]: [mandiant/capa](https://github.com/mandiant/capa), ein Tool, das eine Datei analysiert und versucht, deren Fähigkeiten (capabilities) zu erfassen.
[^3]: [horsicq/Detect-It-Easy](https://github.com/horsicq/Detect-It-Easy) gibt einem die Eigenschaften einer Datei zurück.
[^4]: [Yara](https://virustotal.github.io/yara/) ist eine Bibliothek zur Analyse von Malware anhand von Pattern/Eigenschaften der Dateien.
[^5]: [MITMProxy](https://mitmproxy.org/) ist ein Forward-Proxy, der alle Verbindungen die über ihn laufen aufzeichnet
[^6]: Weder [pycdc](https://github.com/zrax/pycdc) noch [unpyc37-3.10](https://github.com/greyblue9/unpyc37-3.10) konnten den Bytecode decompilen.

29
go.mod
View File

@ -1,32 +1,3 @@
module git.jmbit.de/jmb/www-jmbit-de module git.jmbit.de/jmb/www-jmbit-de
go 1.21.5 go 1.21.5
require github.com/gin-gonic/gin v1.9.1
require (
github.com/bytedance/sonic v1.9.1 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

86
go.sum
View File

@ -1,86 +0,0 @@
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB