Compare commits
No commits in common. "main" and "gin" have entirely different histories.
|
@ -10,12 +10,22 @@ 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/arm64/v8,linux/amd64
|
platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le
|
||||||
repo: *repo
|
repo: *repo
|
||||||
registry: git.jmbit.de
|
registry: git.jmbit.de
|
||||||
tags: latest
|
tags: latest
|
||||||
|
|
|
@ -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 -a -installsuffix cgo -ldflags="-w -s" -o /go/bin/www
|
RUN go build -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
|
||||||
|
|
3
Makefile
3
Makefile
|
@ -15,6 +15,9 @@ 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)
|
||||||
|
|
||||||
|
|
|
@ -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 = "linux, it, consulting, security, hosting, development, jmbit, johannes bülow"
|
keywords = ""
|
||||||
copyright = "Johannes Bülow"
|
copyright = "Johannes Bülow"
|
||||||
menuMore = "Mehr anzeigen"
|
menuMore = "Mehr anzeigen"
|
||||||
readMore = "Weiterlesen"
|
readMore = "Weiterlesen"
|
||||||
|
|
|
@ -9,7 +9,6 @@ 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>
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
---
|
|
||||||
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.
|
|
|
@ -1,70 +0,0 @@
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
|
@ -1,218 +0,0 @@
|
||||||
---
|
|
||||||
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&CK Tactic │ ATT&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
29
go.mod
|
@ -1,3 +1,32 @@
|
||||||
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
86
go.sum
|
@ -0,0 +1,86 @@
|
||||||
|
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.
Before Width: | Height: | Size: 291 KiB |
Binary file not shown.
Before Width: | Height: | Size: 220 KiB |
Loading…
Reference in New Issue