From 737b175efd183d47bc593217e120e2335b1f1d01 Mon Sep 17 00:00:00 2001 From: Dominik Date: Tue, 28 Oct 2025 18:35:52 +0100 Subject: [PATCH] Inital --- blog/.hugo_build.lock | 0 blog/archetypes/default.md | 1 + blog/content/blog/_index.md | 3 + blog/content/blog/bruteforce.md | 135 +++++++++++++++ blog/content/blog/test.md | 7 + blog/content/datenschutz.md | 72 ++++++++ blog/content/home.md | 9 + blog/content/impressum.md | 29 ++++ blog/content/whoami.md | 39 +++++ blog/hugo.toml | 36 ++++ blog/layouts/_partials/bottombar.html | 11 ++ blog/layouts/_partials/infobox.html | 10 ++ blog/layouts/_partials/topbar.html | 13 ++ blog/layouts/_partials/typed.html | 27 +++ blog/layouts/baseof.html | 24 +++ blog/layouts/blog/single.html | 13 ++ blog/layouts/index.html | 8 + blog/layouts/list.html | 11 ++ blog/layouts/single.html | 11 ++ blog/public/apple-touch-icon.png | Bin 0 -> 3452 bytes blog/public/blog/bruteforce/index.html | 160 ++++++++++++++++++ blog/public/blog/index.html | 60 +++++++ blog/public/blog/index.xml | 26 +++ blog/public/blog/test/index.html | 71 ++++++++ blog/public/categories/index.html | 56 +++++++ blog/public/categories/index.xml | 11 ++ blog/public/css/style.css | 224 +++++++++++++++++++++++++ blog/public/datenschutz/index.html | 105 ++++++++++++ blog/public/de/categories/index.html | 56 +++++++ blog/public/de/categories/index.xml | 11 ++ blog/public/de/index.html | 53 ++++++ blog/public/de/index.xml | 11 ++ blog/public/de/sitemap.xml | 41 +++++ blog/public/de/tags/index.html | 56 +++++++ blog/public/de/tags/index.xml | 11 ++ blog/public/en/index.html | 9 + blog/public/en/sitemap.xml | 59 +++++++ blog/public/favicon-96x96.png | Bin 0 -> 1696 bytes blog/public/favicon.ico | Bin 0 -> 15086 bytes blog/public/home/index.html | 63 +++++++ blog/public/impressum/index.html | 75 +++++++++ blog/public/index.html | 88 ++++++++++ blog/public/index.xml | 54 ++++++ blog/public/publickey.asc | 41 +++++ blog/public/robots.txt | 3 + blog/public/sitemap.xml | 16 ++ blog/public/tags/index.html | 56 +++++++ blog/public/tags/index.xml | 11 ++ blog/public/whoami/index.html | 85 ++++++++++ blog/static/apple-touch-icon.png | Bin 0 -> 3452 bytes blog/static/css/style.css | 224 +++++++++++++++++++++++++ blog/static/favicon-96x96.png | Bin 0 -> 1696 bytes blog/static/favicon.ico | Bin 0 -> 15086 bytes blog/static/publickey.asc | 41 +++++ blog/static/robots.txt | 3 + 55 files changed, 2239 insertions(+) create mode 100644 blog/.hugo_build.lock create mode 100644 blog/archetypes/default.md create mode 100644 blog/content/blog/_index.md create mode 100644 blog/content/blog/bruteforce.md create mode 100644 blog/content/blog/test.md create mode 100644 blog/content/datenschutz.md create mode 100644 blog/content/home.md create mode 100644 blog/content/impressum.md create mode 100644 blog/content/whoami.md create mode 100644 blog/hugo.toml create mode 100644 blog/layouts/_partials/bottombar.html create mode 100644 blog/layouts/_partials/infobox.html create mode 100644 blog/layouts/_partials/topbar.html create mode 100644 blog/layouts/_partials/typed.html create mode 100644 blog/layouts/baseof.html create mode 100644 blog/layouts/blog/single.html create mode 100644 blog/layouts/index.html create mode 100644 blog/layouts/list.html create mode 100644 blog/layouts/single.html create mode 100644 blog/public/apple-touch-icon.png create mode 100644 blog/public/blog/bruteforce/index.html create mode 100644 blog/public/blog/index.html create mode 100644 blog/public/blog/index.xml create mode 100644 blog/public/blog/test/index.html create mode 100644 blog/public/categories/index.html create mode 100644 blog/public/categories/index.xml create mode 100644 blog/public/css/style.css create mode 100644 blog/public/datenschutz/index.html create mode 100644 blog/public/de/categories/index.html create mode 100644 blog/public/de/categories/index.xml create mode 100644 blog/public/de/index.html create mode 100644 blog/public/de/index.xml create mode 100644 blog/public/de/sitemap.xml create mode 100644 blog/public/de/tags/index.html create mode 100644 blog/public/de/tags/index.xml create mode 100644 blog/public/en/index.html create mode 100644 blog/public/en/sitemap.xml create mode 100644 blog/public/favicon-96x96.png create mode 100644 blog/public/favicon.ico create mode 100644 blog/public/home/index.html create mode 100644 blog/public/impressum/index.html create mode 100644 blog/public/index.html create mode 100644 blog/public/index.xml create mode 100644 blog/public/publickey.asc create mode 100644 blog/public/robots.txt create mode 100644 blog/public/sitemap.xml create mode 100644 blog/public/tags/index.html create mode 100644 blog/public/tags/index.xml create mode 100644 blog/public/whoami/index.html create mode 100644 blog/static/apple-touch-icon.png create mode 100644 blog/static/css/style.css create mode 100644 blog/static/favicon-96x96.png create mode 100644 blog/static/favicon.ico create mode 100644 blog/static/publickey.asc create mode 100644 blog/static/robots.txt diff --git a/blog/.hugo_build.lock b/blog/.hugo_build.lock new file mode 100644 index 0000000..e69de29 diff --git a/blog/archetypes/default.md b/blog/archetypes/default.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/blog/archetypes/default.md @@ -0,0 +1 @@ + diff --git a/blog/content/blog/_index.md b/blog/content/blog/_index.md new file mode 100644 index 0000000..d590c09 --- /dev/null +++ b/blog/content/blog/_index.md @@ -0,0 +1,3 @@ +--- +title: "All Blog Entries" +--- diff --git a/blog/content/blog/bruteforce.md b/blog/content/blog/bruteforce.md new file mode 100644 index 0000000..bf5795d --- /dev/null +++ b/blog/content/blog/bruteforce.md @@ -0,0 +1,135 @@ +--- +title: "Bruteforce Analysis" +draft: true +date: "2025-10-25" +--- + +# Introduction + +Recently I set up this Website as a small side Project in order to learn a little bit of HTML, CSS and the use of static site generators. In order to host this website I used my VPS I own on [IONOS](https://www.ionos.de/). As someone who has spent a lot of time in the Cybersecurity world, I gave my best to secure the VPS as well as possible. Login via SSH is enabled only via Private/Public Key Authentification and [Fail2Ban](https://github.com/fail2ban/fail2ban) is setup to ban anyone who tries to login more than 5 Times. Once this was setup I created a way to "pull" the logs from nginx and fail2ban onto my private ProxMox server and Process these into Grafana. As I was doing this, I noticed that the fail2ban logfile has over 31.000 rows. Nothing suspicious for a public IP Adress, yet a interesting amount of data. + +After getting my hands on these files I decided that I will try to parse and analyse these brutefore attacks. Furthermore this will be written in go, because I am trying to hone my skills in it and it allows us to write extremely efficient, fast and lightweight code. + +# Data + +The dataset (fail2ban.log file) consists of relatively simple and understandable logs. Here is a snippet of the average log section: +```txt +// I will not be exposing the IP addresses for obvious reasons +2025-10-25 17:04:35,850 fail2ban.filter [77278]: INFO [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:35 +2025-10-25 17:04:36,414 fail2ban.actions [77278]: WARNING [sshd] xxx.xxx.xxx.xxx already banned +2025-10-25 17:04:37,099 fail2ban.filter [77278]: INFO [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:36 +2025-10-25 17:04:40,100 fail2ban.filter [77278]: INFO [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:39 +2025-10-25 17:04:40,420 fail2ban.actions [77278]: NOTICE [sshd] Ban xxx.xxx.xxx.xxx +``` + +There are also some error entries in the log file which are not clearly labeled, although not as important for the data analasys part, need to be considered when parsing: + +```txt +2025-10-25 17:04:40,426 fail2ban.utils [77278]: ERROR 7f57b0136b10 -- exec: { iptables -w -C f2b-sshd -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-sshd || true; iptables -w -A f2b-sshd -j RETURN; } +for proto in $(echo 'tcp' | sed 's/,/ /g'); do +{ iptables -w -C INPUT -p $proto -m multiport --dports 22 # or your custom SSH port -j f2b-sshd >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto -m multiport --dports 22 # or your custom SSH port -j f2b-sshd; } +done +``` + +# Implementation + +The following will be seperated into three sections: Parsing, Data Collection and Visualisation + +## Parsing & Regex + +I decided the most simple way to go forward is to save the logs into a JSON file, with an object for each log entry. This simplifies the writing and reading of the same file in the future. In go we do this by defining a struct with tags for how the JSON structure will look like in the future: + +```go +type Logs struct { + Timestamp string `json:"timestamp"` + Handler string `json:"handler"` + Level string `json:"level"` + Source string `json:"source"` + IpAdress string `json:"ipAdress"` + Message string `json:"message"` +} +``` + +These are the key value fields we will want to fill with the information from the log file. The log file is read with golangs `os` and `bufio` packages. With these we open the log file and pass it to a scanner instance. The scanner then gives us a multitude of functions to handle the reading of the file. +The most simple way is to create a for loop like this: + +```golang +for scanner.Scan() { + + line := scanner.Text() + + ... +} +``` + +This ensures that in each iteration of the loop, the `line` variable is given the next row until none are available. `line` now contains a row from the log file. +Now comes the parsing. I have decided that I hate myself and that I will use Regex Expressions in order to find and extract the usual values in the fail2ban logs. For this I defined a Regex Expression for each of the above mentioned json tags, these being[^2]: + +```golang +// For (probably much) better efficency these expressions can be grouped into one large expression with maching groups for each field. +// Because I do not like Regex, I will not do this. +dateRegex, _ := regexp.Compile(`\d{4}-\d{2}-\d{2}`) +handlerRegex, _ := regexp.Compile(`fail2ban\.\w+`) +ipRegex, _ := regexp.Compile(`(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}`) +levelRegex, _ := regexp.Compile(`\s*(?:[A-Z]+)\s+`) +serviceRegex, _ := regexp.Compile(`\s*(?:\[[a-z]+\])\s+`) +actionRegex, _ := regexp.Compile(`(Found|already banned|Ban|Unban)`) +``` + +In theory this ruleset applied on the `line` variable should extract values like this: + +```text +2025-10-25 17:04:35,850 fail2ban.filter [77278]: INFO [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:35 +[ dateRegex ][ handlerRegex ] [levelRegex][serviceRegex][actionRegex][ipRegex] +``` + +And therefore export it into a clean json: + +```json +... +{ + "timestamp": "2025-10-25 17:04:35,850", + "handler": "fail2ban.filter", + "level": "INFO", + "source": "[sshd]", + "ipAdress": "xxx.xxx.xxx.xxx", + "message": "Found" +} +... +``` + +While writing, rewriting and fixing my code I also kept an eye on performace. I wrapped my parser function call in two `time.Now().UnixMilli()` in order to calculate how long it would take to parse the 31.456 lines. My best result floated around `580 ms` which means my code can appropox. parse 55.000 rows in one second or given the file is 3.6MB it can parse appropox. 6.2MB per second in one stream. (Your results may vary, depending on harddrive, single core cpu performance etc.) + +And there we go, I have written a very simple fail2ban log to json parser. From now on it gets easier (and more performant). + +## Analysing + +In order to analyse the data we have collected, I will read our json file containing all the logs and creating a new file which aggregates the different log messages by IP Adress. This means we will create a new struct which looks like this: +```golang +type StatsByIp struct { + IpAdress string `json:"ipAdress"` + TotalLogs int `json:"totalLogs"` + TotalFound int `json:"totalFound"` + TotalBanned int `json:"totalBanned"` + TotalUnbanned int `json:"totalUnbanned"` + Country string `json:"county"` +} +``` +_Note: If you ever use golangs `encoding/json` to handle Marshalling and Unmarshalling of the Json files yourself, note that you **need** to name your variables with Uppercase Letters. Go uses Uppercase/Lowercase to deistinguish if your variable or function are public or private. Naming only the struct with Uppercase is not enough and if you do not do this, the inbuilt `json.Marshall()` and `json.Unmarshall` functions will not work, as well as some other quirks if you use external functions and pointers._ + +Once these values have been aggregated by IP Adress, we can see how often which IP has failed to auth on our SSH server and how often it has been Banned and Unbanned. + +For extra information I have implemented a simple script to query the source country of the IP Adress. This is done easily with public apis like [ipadress.com](https://www.ipaddress.com/apis/ip-to-country-api). Althogh this is nice information to have, it is not 100% correct, as IP adresses change and on the day we query it does not have to belong to the same user 10 or more days ago when the log found it. + +## Visualising + +I am a big sucker for Data Science and have used Python for most of my time Developing "Software". The first tool which comes to mind when thinking of visualising data is pythons matplotlib. I have used this in any Data Science adjecent project, all through to my Bachelors Thesis. Therefore I was happy to find out go had a similar package out there. For this I have used [gonum/plot](https://github.com/gonum/plot). With it I created a simple wrapper function for creating bar plots, and collected all relevant data from our analytics steps. The results were the following: + + + +# Post Scriptum + +No text, images, code, concepts or ideas were created with Slop Generators[^1]. Although I do not belive that Slop Generators are inherently bad nor do I belive that they cannot be used in a poductive matter (as do I in some cases), evrything I write on here are things which geniunly interest me and I want to create and work on by myself. I belive a person can only become better at the thing they are doing if they do not constantly search for instant gratification, which is often given to one when using Slop Generators. + +[^1]: [Slop Generators](https://asahilinux.org/docs/project/policies/slop/) +[^2]: [Thanks to ihateregex.io](https://ihateregex.io/expr/ip/) diff --git a/blog/content/blog/test.md b/blog/content/blog/test.md new file mode 100644 index 0000000..d84e026 --- /dev/null +++ b/blog/content/blog/test.md @@ -0,0 +1,7 @@ +--- +title: "Test" +draft: true +date: '2025-10-24' +--- + +Help Me diff --git a/blog/content/datenschutz.md b/blog/content/datenschutz.md new file mode 100644 index 0000000..3cee6c2 --- /dev/null +++ b/blog/content/datenschutz.md @@ -0,0 +1,72 @@ +--- +title: "Datenschutz" +--- + +## Allgemeine Hinweise + +Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz finden Sie in dieser Datenschutzerklärung. + +## Datenerfassung + +Wer ist verantwortlich für die Datenerfassung? Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Impressum dieser Website entnehmen. + +## Wie werden Ihre Daten erfasst? + +Ihre Daten werden zum einen dadurch erhoben, dass Sie mir diese mitteilen (z. B. über eine Kontaktaufnahme per E-Mail). +Es werden keine technischen Daten gespeichert und erfasst (z.B. Internetbrowser, Betriebssystem IP-Adresse oder Uhrzeit), da die Protokollierung deaktiviert ist. +Wofür nutzen wir Ihre Daten? Die von Ihnen übermittelten Daten (z. B. per E-Mail) werden ausschließlich zur Bearbeitung Ihrer Anfrage verwendet. + +Welche Rechte haben Sie? Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten. Außerdem können Sie die Berichtigung, Löschung oder Einschränkung der Verarbeitung verlangen. Darüber hinaus steht Ihnen ein Beschwerderecht bei der zuständigen Aufsichtsbehörde zu. + +# Allgemeine Hinweise und Pflichtinformationen + +## Datenschutz + +Ich behandle Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung. + +Bitte beachten Sie: Die Datenübertragung im Internet (z. B. bei der Kommunikation per E-Mail) kann Sicherheitslücken aufweisen. Ein lückenloser Schutz vor dem Zugriff durch Dritte ist nicht möglich. + +## Verantwortlich +Dominik Agreš \ +Steigerwaldstraße 30 \ +74172 Neckarsulm \ +dominik@agres.online + +## Speicherdauer + +Ihre personenbezogenen Daten werden nur so lange gespeichert, wie dies zur Bearbeitung Ihres Anliegens erforderlich ist oder wie es gesetzliche Aufbewahrungspflichten vorsehen. + +## Rechtsgrundlagen der Datenverarbeitung + +Art. 6 Abs. 1 lit. a DSGVO – Einwilligung (z. B. bei freiwilliger Kontaktaufnahme per E-Mail) +Art. 6 Abs. 1 lit. b DSGVO – Vertragserfüllung oder vorvertragliche Maßnahmen (soweit zutreffend) +Art. 6 Abs. 1 lit. f DSGVO – berechtigtes Interesse (technisch notwendige Verarbeitung zur sicheren Bereitstellung der Website) + +## Ihre Rechte + +- Widerruf einer Einwilligung: Sie können eine erteilte Einwilligung jederzeit widerrufen. +- Widerspruchsrecht: Sie können der Verarbeitung Ihrer Daten in besonderen Fällen widersprechen (Art. 21 DSGVO). +- Beschwerderecht: Sie haben das Recht, sich bei einer Aufsichtsbehörde zu beschweren. +- Auskunft, Löschung, Berichtigung, Einschränkung: Sie können jederzeit Auskunft über Ihre gespeicherten Daten verlangen und die Berichtigung, Löschung oder Einschränkung der Verarbeitung verlangen. +- Datenübertragbarkeit: Sie haben das Recht, Daten in einem maschinenlesbaren Format herauszuverlangen. + +## SSL-/TLS-Verschlüsselung + +Diese Website nutzt SSL-/TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile Ihres Browsers mit https:// beginnt und ein Schloss-Symbol angezeigt wird. + +## Hosting + +Diese Website wird auf einem virtuellen Server (VPS) bei IONOS betrieben. +Auf dieser Website werden keine Server-Logfiles gespeichert. +Der Hosting-Provider kann jedoch aus technischen Gründen Metadaten (z. B. Verbindungsdaten) zur Sicherstellung des Betriebs und der Netzwerksicherheit verarbeiten. +Weitere Informationen entnehmen Sie der Datenschutzerklärung von Strato: https://www.ionos.de/hilfe/datenschutz/ + +## Quellcode + +Das gesamte Quellcode dieser Website kann auf meinem Github-Repository aufgerufen werden unter [https://github.com/agresdominik/blog](https://github.com/agresdominik/blog) + +## Kontaktaufnahme per E-Mail + +Wenn Sie mich per E-Mail kontaktieren, werden Ihre Angaben inklusive der von Ihnen übermittelten personenbezogenen Daten (z. B. Name, E-Mail-Adresse, Inhalt der Nachricht) zum Zweck der Bearbeitung Ihres Anliegens gespeichert und verarbeitet. +- Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung oder vorvertragliche Maßnahmen) oder Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an der Bearbeitung von Anfragen). +- Ihre Daten werden nur solange gespeichert, wie es für die Bearbeitung Ihres Anliegens erforderlich ist. diff --git a/blog/content/home.md b/blog/content/home.md new file mode 100644 index 0000000..e488677 --- /dev/null +++ b/blog/content/home.md @@ -0,0 +1,9 @@ +--- +title: "Willkommen" +--- + +

+ +Links + +- [github](https://github.com/agresdominik) diff --git a/blog/content/impressum.md b/blog/content/impressum.md new file mode 100644 index 0000000..a8d1849 --- /dev/null +++ b/blog/content/impressum.md @@ -0,0 +1,29 @@ +--- +title: "Impressum" +--- + +## Angaben gemäß § 5 TMG und § 18 MStV + +**Name** \ +Dominik Agreš + +**Anschrift** \ +Steigerwaldstraße 30 \ +74172 Neckarsulm \ +DE + +**Kontakt**\ +dominik@agres.online + +## Haftung für Inhalte +Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen. + +## Haftung für Links +Mein Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen. + +## Urheberrecht & Lizens +Der Quellcode dieser Website steht unter der [MIT Lizenz](https://opensource.org/license/MIT). + +Die Inhalte (Texte, Bilder, soweit nicht anders gekennzeichnet) dieser Seite stehen unter der [CC BY-SA 4.0 Lizenz](https://creativecommons.org/licenses/by-sa/4.0/deed.de). + +Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Solltest du trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitte ich um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Inhalte umgehend entfernen. diff --git a/blog/content/whoami.md b/blog/content/whoami.md new file mode 100644 index 0000000..ef20299 --- /dev/null +++ b/blog/content/whoami.md @@ -0,0 +1,39 @@ +--- +title: "Whoami" +--- + +Hi, I’m Dominik + +I’m passionate about technology, software, and cybersecurity. + +- Studied **Software Engineering** at **Heilbronn University (HHN)** +- Worked at **Schwarz IT** in a **Cybersecurity** team during my studies +- Wrote my Bachelors Thesis about the application of Machine Learning to optimise distinct processes in the Cybersecurity world +- Love exploring nature, going on hiking trips as well as driving my motorcycle +- Love reading books about sociology, philosophy and politics + +--- + +## Books + +Here are some of my favourite books I would recommend to anyone: + +- [Homo Deus - Yuval Noah Harari](https://search.worldcat.org/title/986950078) +- [Ikigai - Ken Mogi](https://search.worldcat.org/title/1357534605?oclcNum=1357534605) +- [Mein Katalonien - George Orwell](https://search.worldcat.org/title/1259326703) +- [On Anarchism - Noam Chomsky](https://search.worldcat.org/title/872702854?oclcNum=872702854) + +Reading right now: + +- [Nexus - Yuval Noah Harari]() +- [Atomic Habits - James Clear]() + +--- + +## PGP Key + +If you want to send me encrypted messages use the following [PGP-Key](/publickey.asc). If you want to check the fingerprint: + +``` +896B 3FF1 2E82 A80C 10F6 42CB 4634 761C A7CE E0A +``` diff --git a/blog/hugo.toml b/blog/hugo.toml new file mode 100644 index 0000000..937930a --- /dev/null +++ b/blog/hugo.toml @@ -0,0 +1,36 @@ +baseURL = 'https://agres.online/' +languageCode = 'en-us' +title = 'agres.online' + +[params] + name = "Dominik Agreš" + email = "dominik@agres.online" + github = "https://github.com/agresdominik" + linkedin = "www.linkedin.com/in/dominik-agres" + browserTitle = "agres" + +[markup.goldmark.renderer] + unsafe = true + +[markup] + [markup.highlight] + codeFences = true + guessSyntax = false + lineNos = false + lineNumbersInTable = true + noClasses = false + style = "dracula" + +[languages] + [languages.de] + languageCode = 'de-DE' + languageName = 'Deutsch' + weight = 2 + [languages.de.params] + reading_speed = 179 + [languages.en] + languageCode = 'en-US' + languageName = 'English' + weight = 1 + [languages.en.params] + reading_speed = 228 diff --git a/blog/layouts/_partials/bottombar.html b/blog/layouts/_partials/bottombar.html new file mode 100644 index 0000000..e7fbe4d --- /dev/null +++ b/blog/layouts/_partials/bottombar.html @@ -0,0 +1,11 @@ + diff --git a/blog/layouts/_partials/infobox.html b/blog/layouts/_partials/infobox.html new file mode 100644 index 0000000..0142d9a --- /dev/null +++ b/blog/layouts/_partials/infobox.html @@ -0,0 +1,10 @@ +
+
+ Date Published: + {{ .Date | time.Format "January 2, 2006" }} +
+
+ Read time: + {{ printf " %d minute(s)" .ReadingTime }} +
+
diff --git a/blog/layouts/_partials/topbar.html b/blog/layouts/_partials/topbar.html new file mode 100644 index 0000000..ff39ab9 --- /dev/null +++ b/blog/layouts/_partials/topbar.html @@ -0,0 +1,13 @@ +
+ +
diff --git a/blog/layouts/_partials/typed.html b/blog/layouts/_partials/typed.html new file mode 100644 index 0000000..15ae72e --- /dev/null +++ b/blog/layouts/_partials/typed.html @@ -0,0 +1,27 @@ + + + diff --git a/blog/layouts/baseof.html b/blog/layouts/baseof.html new file mode 100644 index 0000000..cb80533 --- /dev/null +++ b/blog/layouts/baseof.html @@ -0,0 +1,24 @@ + + + + + + + + + {{ .Site.Params.browserTitle }} :: {{ .Title }} + + + + + {{ partial "topbar.html" . }} + +
+ {{ block "main" . }}{{ end }} +
+ + {{ partial "bottombar.html" . }} + + + + diff --git a/blog/layouts/blog/single.html b/blog/layouts/blog/single.html new file mode 100644 index 0000000..32d78d4 --- /dev/null +++ b/blog/layouts/blog/single.html @@ -0,0 +1,13 @@ +{{ define "main" }} + +
+ +

{{ .Title }}

+ + {{ partial "infobox.html" . }} + + {{ .Content }} + +
+ +{{ end }} diff --git a/blog/layouts/index.html b/blog/layouts/index.html new file mode 100644 index 0000000..2b4ef90 --- /dev/null +++ b/blog/layouts/index.html @@ -0,0 +1,8 @@ +{{ define "main" }} + + {{ with .Site.GetPage "page" "home" }} + {{ .Content }} + {{ partial "typed.html" . }} + {{ end }} + +{{ end }} diff --git a/blog/layouts/list.html b/blog/layouts/list.html new file mode 100644 index 0000000..df475ae --- /dev/null +++ b/blog/layouts/list.html @@ -0,0 +1,11 @@ +{{ define "main" }} + +{{ .Title }} + + + +{{ end }} diff --git a/blog/layouts/single.html b/blog/layouts/single.html new file mode 100644 index 0000000..fc4fcf4 --- /dev/null +++ b/blog/layouts/single.html @@ -0,0 +1,11 @@ +{{ define "main" }} + +
+ +

{{ .Title }}

+ + {{ .Content }} + +
+ +{{ end }} diff --git a/blog/public/apple-touch-icon.png b/blog/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..245dec682df9d678c7c0b8ca6338de64c34e7f4d GIT binary patch literal 3452 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 R?>JQfdO8N$rJ8nO{{ackSdIVy literal 0 HcmV?d00001 diff --git a/blog/public/blog/bruteforce/index.html b/blog/public/blog/bruteforce/index.html new file mode 100644 index 0000000..6539166 --- /dev/null +++ b/blog/public/blog/bruteforce/index.html @@ -0,0 +1,160 @@ + + + + + + + + + agres :: Bruteforce Analysis + + + + +
+ +
+ + +
+ + +
+ +

Bruteforce Analysis

+ +
+
+ Date Published: + October 25, 2025 +
+
+ Read time: + 7 minute(s) +
+
+ + +

Introduction

+

Recently I set up this Website as a small side Project in order to learn a little bit of HTML, CSS and the use of static site generators. In order to host this website I used my VPS I own on IONOS. As someone who has spent a lot of time in the Cybersecurity world, I gave my best to secure the VPS as well as possible. Login via SSH is enabled only via Private/Public Key Authentification and Fail2Ban is setup to ban anyone who tries to login more than 5 Times. Once this was setup I created a way to “pull” the logs from nginx and fail2ban onto my private ProxMox server and Process these into Grafana. As I was doing this, I noticed that the fail2ban logfile has over 31.000 rows. Nothing suspicious for a public IP Adress, yet a interesting amount of data.

+

After getting my hands on these files I decided that I will try to parse and analyse these brutefore attacks. Furthermore this will be written in go, because I am trying to hone my skills in it and it allows us to write extremely efficient, fast and lightweight code.

+

Data

+

The dataset (fail2ban.log file) consists of relatively simple and understandable logs. Here is a snippet of the average log section:

+
// I will not be exposing the IP addresses for obvious reasons
+2025-10-25 17:04:35,850 fail2ban.filter         [77278]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:35
+2025-10-25 17:04:36,414 fail2ban.actions        [77278]: WARNING [sshd] xxx.xxx.xxx.xxx already banned
+2025-10-25 17:04:37,099 fail2ban.filter         [77278]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:36
+2025-10-25 17:04:40,100 fail2ban.filter         [77278]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:39
+2025-10-25 17:04:40,420 fail2ban.actions        [77278]: NOTICE  [sshd] Ban xxx.xxx.xxx.xxx
+

There are also some error entries in the log file which are not clearly labeled, although not as important for the data analasys part, need to be considered when parsing:

+
2025-10-25 17:04:40,426 fail2ban.utils          [77278]: ERROR   7f57b0136b10 -- exec: { iptables -w -C f2b-sshd -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-sshd || true; iptables -w -A f2b-sshd -j RETURN; }
+for proto in $(echo 'tcp' | sed 's/,/ /g'); do
+{ iptables -w -C INPUT -p $proto -m multiport --dports 22  # or your custom SSH port -j f2b-sshd >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto -m multiport --dports 22  # or your custom SSH port -j f2b-sshd; }
+done
+

Implementation

+

The following will be seperated into three sections: Parsing, Data Collection and Visualisation

+

Parsing & Regex

+

I decided the most simple way to go forward is to save the logs into a JSON file, with an object for each log entry. This simplifies the writing and reading of the same file in the future. In go we do this by defining a struct with tags for how the JSON structure will look like in the future:

+
type Logs struct {
+	Timestamp string  `json:"timestamp"`
+	Handler   string  `json:"handler"`
+	Level     string  `json:"level"`
+	Source    string  `json:"source"`
+	IpAdress  string  `json:"ipAdress"`
+	Message   string  `json:"message"`
+}
+

These are the key value fields we will want to fill with the information from the log file. The log file is read with golangs os and bufio packages. With these we open the log file and pass it to a scanner instance. The scanner then gives us a multitude of functions to handle the reading of the file. +The most simple way is to create a for loop like this:

+
for scanner.Scan() {
+
+  line := scanner.Text()
+
+  ...
+}
+

This ensures that in each iteration of the loop, the line variable is given the next row until none are available. line now contains a row from the log file. +Now comes the parsing. I have decided that I hate myself and that I will use Regex Expressions in order to find and extract the usual values in the fail2ban logs. For this I defined a Regex Expression for each of the above mentioned json tags, these being1:

+
// For (probably much) better efficency these expressions can be grouped into one large expression with maching groups for each field.
+// Because I do not like Regex, I will not do this.
+dateRegex, _ := regexp.Compile(`\d{4}-\d{2}-\d{2}`)
+handlerRegex, _ := regexp.Compile(`fail2ban\.\w+`)
+ipRegex, _ := regexp.Compile(`(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}`)
+levelRegex, _ := regexp.Compile(`\s*(?:[A-Z]+)\s+`)
+serviceRegex, _ := regexp.Compile(`\s*(?:\[[a-z]+\])\s+`)
+actionRegex, _ := regexp.Compile(`(Found|already banned|Ban|Unban)`)
+

In theory this ruleset applied on the line variable should extract values like this:

+
2025-10-25 17:04:35,850 fail2ban.filter         [77278]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2025-10-25 17:04:35
+[       dateRegex      ][ handlerRegex ]         [levelRegex][serviceRegex][actionRegex][ipRegex]
+

And therefore export it into a clean json:

+
...
+{
+   "timestamp": "2025-10-25 17:04:35,850",
+   "handler": "fail2ban.filter",
+   "level": "INFO",
+   "source": "[sshd]",
+   "ipAdress": "xxx.xxx.xxx.xxx",
+   "message": "Found"
+}
+...
+

While writing, rewriting and fixing my code I also kept an eye on performace. I wrapped my parser function call in two time.Now().UnixMilli() in order to calculate how long it would take to parse the 31.456 lines. My best result floated around 580 ms which means my code can appropox. parse 55.000 rows in one second or given the file is 3.6MB it can parse appropox. 6.2MB per second in one stream. (Your results may vary, depending on harddrive, single core cpu performance etc.)

+

And there we go, I have written a very simple fail2ban log to json parser. From now on it gets easier (and more performant).

+

Analysing

+

In order to analyse the data we have collected, I will read our json file containing all the logs and creating a new file which aggregates the different log messages by IP Adress. This means we will create a new struct which looks like this:

+
type StatsByIp struct {
+	IpAdress       string  `json:"ipAdress"`
+	TotalLogs      int     `json:"totalLogs"`
+	TotalFound     int     `json:"totalFound"`
+	TotalBanned    int     `json:"totalBanned"`
+	TotalUnbanned  int     `json:"totalUnbanned"`
+	Country        string  `json:"county"`
+}
+

Note: If you ever use golangs encoding/json to handle Marshalling and Unmarshalling of the Json files yourself, note that you need to name your variables with Uppercase Letters. Go uses Uppercase/Lowercase to deistinguish if your variable or function are public or private. Naming only the struct with Uppercase is not enough and if you do not do this, the inbuilt json.Marshall() and json.Unmarshall functions will not work, as well as some other quirks if you use external functions and pointers.

+

Once these values have been aggregated by IP Adress, we can see how often which IP has failed to auth on our SSH server and how often it has been Banned and Unbanned.

+

For extra information I have implemented a simple script to query the source country of the IP Adress. This is done easily with public apis like ipadress.com. Althogh this is nice information to have, it is not 100% correct, as IP adresses change and on the day we query it does not have to belong to the same user 10 or more days ago when the log found it.

+

Visualising

+

I am a big sucker for Data Science and have used Python for most of my time Developing “Software”. The first tool which comes to mind when thinking of visualising data is pythons matplotlib. I have used this in any Data Science adjecent project, all through to my Bachelors Thesis. Therefore I was happy to find out go had a similar package out there. For this I have used gonum/plot. With it I created a simple wrapper function for creating bar plots, and collected all relevant data from our analytics steps. The results were the following:

+

Post Scriptum

+

No text, images, code, concepts or ideas were created with Slop Generators2. Although I do not belive that Slop Generators are inherently bad nor do I belive that they cannot be used in a poductive matter (as do I in some cases), evrything I write on here are things which geniunly interest me and I want to create and work on by myself. I belive a person can only become better at the thing they are doing if they do not constantly search for instant gratification, which is often given to one when using Slop Generators.

+ + + +
+ + +
+ + + + + + + diff --git a/blog/public/blog/index.html b/blog/public/blog/index.html new file mode 100644 index 0000000..1cdb459 --- /dev/null +++ b/blog/public/blog/index.html @@ -0,0 +1,60 @@ + + + + + + + + + agres :: All Blog Entries + + + + +
+ +
+ + +
+ + +All Blog Entries + + + + +
+ + + + + + + diff --git a/blog/public/blog/index.xml b/blog/public/blog/index.xml new file mode 100644 index 0000000..0870f97 --- /dev/null +++ b/blog/public/blog/index.xml @@ -0,0 +1,26 @@ + + + + All Blog Entries on agres.online + http://localhost:1313/blog/ + Recent content in All Blog Entries on agres.online + Hugo + en-US + Sat, 25 Oct 2025 00:00:00 +0000 + + + Bruteforce Analysis + http://localhost:1313/blog/bruteforce/ + Sat, 25 Oct 2025 00:00:00 +0000 + http://localhost:1313/blog/bruteforce/ + <h1 id="introduction">Introduction</h1> <p>Recently I set up this Website as a small side Project in order to learn a little bit of HTML, CSS and the use of static site generators. In order to host this website I used my VPS I own on <a href="https://www.ionos.de/">IONOS</a>. As someone who has spent a lot of time in the Cybersecurity world, I gave my best to secure the VPS as well as possible. Login via SSH is enabled only via Private/Public Key Authentification and <a href="https://github.com/fail2ban/fail2ban">Fail2Ban</a> is setup to ban anyone who tries to login more than 5 Times. Once this was setup I created a way to &ldquo;pull&rdquo; the logs from nginx and fail2ban onto my private ProxMox server and Process these into Grafana. As I was doing this, I noticed that the fail2ban logfile has over 31.000 rows. Nothing suspicious for a public IP Adress, yet a interesting amount of data.</p> + + + Test + http://localhost:1313/blog/test/ + Fri, 24 Oct 2025 00:00:00 +0000 + http://localhost:1313/blog/test/ + <p>Help Me</p> + + + diff --git a/blog/public/blog/test/index.html b/blog/public/blog/test/index.html new file mode 100644 index 0000000..440abe5 --- /dev/null +++ b/blog/public/blog/test/index.html @@ -0,0 +1,71 @@ + + + + + + + + + agres :: Test + + + + +
+ +
+ + +
+ + +
+ +

Test

+ +
+
+ Date Published: + October 24, 2025 +
+
+ Read time: + 1 minute(s) +
+
+ + +

Help Me

+ + +
+ + +
+ + + + + + + diff --git a/blog/public/categories/index.html b/blog/public/categories/index.html new file mode 100644 index 0000000..3915fae --- /dev/null +++ b/blog/public/categories/index.html @@ -0,0 +1,56 @@ + + + + + + + + + agres :: Categories + + + + +
+ +
+ + +
+ + +Categories + +
    + +
+ + +
+ + + + + + + diff --git a/blog/public/categories/index.xml b/blog/public/categories/index.xml new file mode 100644 index 0000000..1a04c2b --- /dev/null +++ b/blog/public/categories/index.xml @@ -0,0 +1,11 @@ + + + + Categories on agres.online + http://localhost:1313/categories/ + Recent content in Categories on agres.online + Hugo + en-US + + + diff --git a/blog/public/css/style.css b/blog/public/css/style.css new file mode 100644 index 0000000..520466b --- /dev/null +++ b/blog/public/css/style.css @@ -0,0 +1,224 @@ +/* ---------- Base ---------- */ +:root { + --color-bg: #111; + --color-fg: #fafafa; + --color-accent: #222; + + --light-yellow: color(display-p3 1 1 0.7) + + --link: #fff; + --link-hover: color(display-p3 1 1 0.7); + + --font-base: 'Inter', sans-serif; + --font-weight-regular: 400; + --font-weight-bold: 600; + + --max-width: 700px; + --padding-page: 1rem; + + font-feature-settings: 'liga' 1, 'calt' 1; + font-size: 11pt; +} + +html, body { + margin: 0; + padding: var(--padding-page); + background: var(--color-bg); + color: var(--color-fg); + font-family: var(--font-base); + font-weight: var(--font-weight-regular); + line-height: 1.6; + max-width: var(--max-width); + margin-inline: auto; +} + +/* ---------- Typography ---------- */ +main h1, main h2, main h3, main h4 { + color: var(--color-fg); + font-weight: var(--font-weight-bold); + line-height: 1.8; + display: inline; + background-image: linear-gradient(120deg, #355c48 0%, #5f8261 100%); + background-repeat: no-repeat; + background-size: 100% 0.6em; + background-position: 0 88%; + transition: background-size 0.5s ease; +} + +a { + color: var(--link); + text-decoration: underline; + transition: color 0.1s ease; +} + +a:hover { + color: var(--link-hover); + text-decoration: underline; + transition: color 0.1s ease; +} + +p { + text-align: justify; + text-justify: inter-word; + margin: 1rem 0; +} + +/* ---------- Top Bar ---------- */ +.topbar { + background: var(--color-bg); + width: 100%; + padding: 0.75rem 1.5rem; + border-bottom: 3px solid var(--color-accent); +} + +.topbar-content { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 900px; + margin: 0 auto; +} + +.site-title { + font-size: 1.2rem; + font-weight: var(--font-weight-bold); + color: var(--link); + text-decoration: none; +} + +.site-title:hover { + color:var(--link-hover); +} + +.nav-links a { + color: var(--link); + margin-left: 1rem; + text-decoration: none; +} + +.nav-links a:hover { + color:var(--link-hover); + text-decoration: underline; +} + +/* ---------- Bottom Bar ---------- */ +.bottombar { + background: var(--color-bg); + width: 100%; + border-top: 3px solid var(--color-accent); + padding: 0.75rem 1.5rem; + text-align: center; + box-shadow: 0 -1px 3px rgba(0,0,0,0.5); +} + +.bottombar-content { + max-width: 900px; /* same as .topbar-content */ + margin: 0 auto; +} + +.bottombar a { + color: var(--link); + margin: 0 0.5rem; +} + +.bottombar a:hover { + color: var(--link-hover); +} + +/* ---------- Content ---------- */ +main { + padding-left: 1.5rem; + margin-top: 2rem; + margin-bottom: 1rem; +} + +article { + margin-bottom: 2rem; +} + +ul, ol { + list-style: none; + padding-left: 0.1rem; +} + +li { + margin-bottom: 0.01em; +} + +ul li::before { + content: "• "; + color: var(--color-fg); + font-size: 1.1rem; +} + +img { + max-width: 100%; + height: auto; + display: block; +} + +/* ---------- Infobox Styling ---------- */ + +.infobox { + margin: 1rem; + padding: 1rem; + padding-left: 30px; + background-color: var(--color-accent); + border: 1.5px solid; + border-color: var(--color-fg); + border-radius: 10px; +} + +.infobox-content { + display: flex; + margin: 10px 0; + display: grid; + grid-template-columns: 150px 1fr; + row-gap: 8px; +} + +.infobox-label { + font-weight: bold; + margin-right: 10px; +} + +.infobox-value { + font-style: italic; +} + + +/* ---------- Responsive Adjustments ---------- */ +@media (max-width: 600px) { + body { + padding: 5rem 1rem 5rem; + } + + .topbar-content { + flex-direction: column; + gap: 0.5rem; + } +} + +/* ---------- Codeblock Styling ---------- */ +pre, +pre.chroma { + background: var(--color-accent); + color: var(--color-fg); + padding: 1em; + border-radius: 0.5rem; + overflow-x: scroll; +} + +code { + font-family: 'Fira Code', monospace; + font-size: 1rem; +} + +.chroma .k { color: #ff79c6; } /* Keywords */ +.chroma .s { color: #f1fa8c; } /* Strings */ +.chroma .n { color: #f8f8f2; } /* Names */ +.chroma .p { color: #bd93f9; } /* Punctuation */ +.chroma .c { color: #6272a4; font-style: italic; } /* Comments */ +.chroma .m { color: #8be9fd; } /* Numbers */ +.chroma .o { color: #ffb86c; } /* Operators */ +.chroma .err { color: #ff5555; background: #2e2e2e; } /* Errors */ diff --git a/blog/public/datenschutz/index.html b/blog/public/datenschutz/index.html new file mode 100644 index 0000000..cecc9b0 --- /dev/null +++ b/blog/public/datenschutz/index.html @@ -0,0 +1,105 @@ + + + + + + + + + agres :: Datenschutz + + + + +
+ +
+ + +
+ + +
+ +

Datenschutz

+ +

Allgemeine Hinweise

+

Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz finden Sie in dieser Datenschutzerklärung.

+

Datenerfassung

+

Wer ist verantwortlich für die Datenerfassung? Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Impressum dieser Website entnehmen.

+

Wie werden Ihre Daten erfasst?

+

Ihre Daten werden zum einen dadurch erhoben, dass Sie mir diese mitteilen (z. B. über eine Kontaktaufnahme per E-Mail). +Es werden keine technischen Daten gespeichert und erfasst (z.B. Internetbrowser, Betriebssystem IP-Adresse oder Uhrzeit), da die Protokollierung deaktiviert ist. +Wofür nutzen wir Ihre Daten? Die von Ihnen übermittelten Daten (z. B. per E-Mail) werden ausschließlich zur Bearbeitung Ihrer Anfrage verwendet.

+

Welche Rechte haben Sie? Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten. Außerdem können Sie die Berichtigung, Löschung oder Einschränkung der Verarbeitung verlangen. Darüber hinaus steht Ihnen ein Beschwerderecht bei der zuständigen Aufsichtsbehörde zu.

+

Allgemeine Hinweise und Pflichtinformationen

+

Datenschutz

+

Ich behandle Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.

+

Bitte beachten Sie: Die Datenübertragung im Internet (z. B. bei der Kommunikation per E-Mail) kann Sicherheitslücken aufweisen. Ein lückenloser Schutz vor dem Zugriff durch Dritte ist nicht möglich.

+

Verantwortlich

+

Dominik Agreš
+Steigerwaldstraße 30
+74172 Neckarsulm
+dominik@agres.online

+

Speicherdauer

+

Ihre personenbezogenen Daten werden nur so lange gespeichert, wie dies zur Bearbeitung Ihres Anliegens erforderlich ist oder wie es gesetzliche Aufbewahrungspflichten vorsehen.

+

Rechtsgrundlagen der Datenverarbeitung

+

Art. 6 Abs. 1 lit. a DSGVO – Einwilligung (z. B. bei freiwilliger Kontaktaufnahme per E-Mail) +Art. 6 Abs. 1 lit. b DSGVO – Vertragserfüllung oder vorvertragliche Maßnahmen (soweit zutreffend) +Art. 6 Abs. 1 lit. f DSGVO – berechtigtes Interesse (technisch notwendige Verarbeitung zur sicheren Bereitstellung der Website)

+

Ihre Rechte

+
    +
  • Widerruf einer Einwilligung: Sie können eine erteilte Einwilligung jederzeit widerrufen.
  • +
  • Widerspruchsrecht: Sie können der Verarbeitung Ihrer Daten in besonderen Fällen widersprechen (Art. 21 DSGVO).
  • +
  • Beschwerderecht: Sie haben das Recht, sich bei einer Aufsichtsbehörde zu beschweren.
  • +
  • Auskunft, Löschung, Berichtigung, Einschränkung: Sie können jederzeit Auskunft über Ihre gespeicherten Daten verlangen und die Berichtigung, Löschung oder Einschränkung der Verarbeitung verlangen.
  • +
  • Datenübertragbarkeit: Sie haben das Recht, Daten in einem maschinenlesbaren Format herauszuverlangen.
  • +
+

SSL-/TLS-Verschlüsselung

+

Diese Website nutzt SSL-/TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile Ihres Browsers mit https:// beginnt und ein Schloss-Symbol angezeigt wird.

+

Hosting

+

Diese Website wird auf einem virtuellen Server (VPS) bei IONOS betrieben. +Auf dieser Website werden keine Server-Logfiles gespeichert. +Der Hosting-Provider kann jedoch aus technischen Gründen Metadaten (z. B. Verbindungsdaten) zur Sicherstellung des Betriebs und der Netzwerksicherheit verarbeiten. +Weitere Informationen entnehmen Sie der Datenschutzerklärung von Strato: https://www.ionos.de/hilfe/datenschutz/

+

Quellcode

+

Das gesamte Quellcode dieser Website kann auf meinem Github-Repository aufgerufen werden unter https://github.com/agresdominik/blog

+

Kontaktaufnahme per E-Mail

+

Wenn Sie mich per E-Mail kontaktieren, werden Ihre Angaben inklusive der von Ihnen übermittelten personenbezogenen Daten (z. B. Name, E-Mail-Adresse, Inhalt der Nachricht) zum Zweck der Bearbeitung Ihres Anliegens gespeichert und verarbeitet.

+
    +
  • Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung oder vorvertragliche Maßnahmen) oder Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an der Bearbeitung von Anfragen).
  • +
  • Ihre Daten werden nur solange gespeichert, wie es für die Bearbeitung Ihres Anliegens erforderlich ist.
  • +
+ + +
+ + +
+ + + + + + + diff --git a/blog/public/de/categories/index.html b/blog/public/de/categories/index.html new file mode 100644 index 0000000..3915fae --- /dev/null +++ b/blog/public/de/categories/index.html @@ -0,0 +1,56 @@ + + + + + + + + + agres :: Categories + + + + +
+ +
+ + +
+ + +Categories + +
    + +
+ + +
+ + + + + + + diff --git a/blog/public/de/categories/index.xml b/blog/public/de/categories/index.xml new file mode 100644 index 0000000..e0659c4 --- /dev/null +++ b/blog/public/de/categories/index.xml @@ -0,0 +1,11 @@ + + + + Categories on agres.online + http://localhost:1313/de/categories/ + Recent content in Categories on agres.online + Hugo + de-DE + + + diff --git a/blog/public/de/index.html b/blog/public/de/index.html new file mode 100644 index 0000000..780a124 --- /dev/null +++ b/blog/public/de/index.html @@ -0,0 +1,53 @@ + + + + + + + + + + agres :: agres.online + + + + +
+ +
+ + +
+ + + + + +
+ + + + + + + diff --git a/blog/public/de/index.xml b/blog/public/de/index.xml new file mode 100644 index 0000000..db97cd3 --- /dev/null +++ b/blog/public/de/index.xml @@ -0,0 +1,11 @@ + + + + agres.online + http://localhost:1313/de/ + Recent content on agres.online + Hugo + de-DE + + + diff --git a/blog/public/de/sitemap.xml b/blog/public/de/sitemap.xml new file mode 100644 index 0000000..fbcf8bb --- /dev/null +++ b/blog/public/de/sitemap.xml @@ -0,0 +1,41 @@ + + + + http://localhost:1313/de/ + + + + http://localhost:1313/de/categories/ + + + + http://localhost:1313/de/tags/ + + + + diff --git a/blog/public/de/tags/index.html b/blog/public/de/tags/index.html new file mode 100644 index 0000000..88dec10 --- /dev/null +++ b/blog/public/de/tags/index.html @@ -0,0 +1,56 @@ + + + + + + + + + agres :: Tags + + + + +
+ +
+ + +
+ + +Tags + +
    + +
+ + +
+ + + + + + + diff --git a/blog/public/de/tags/index.xml b/blog/public/de/tags/index.xml new file mode 100644 index 0000000..850d46e --- /dev/null +++ b/blog/public/de/tags/index.xml @@ -0,0 +1,11 @@ + + + + Tags on agres.online + http://localhost:1313/de/tags/ + Recent content in Tags on agres.online + Hugo + de-DE + + + diff --git a/blog/public/en/index.html b/blog/public/en/index.html new file mode 100644 index 0000000..7626212 --- /dev/null +++ b/blog/public/en/index.html @@ -0,0 +1,9 @@ + + + + http://localhost:1313/ + + + + + diff --git a/blog/public/en/sitemap.xml b/blog/public/en/sitemap.xml new file mode 100644 index 0000000..ac7b344 --- /dev/null +++ b/blog/public/en/sitemap.xml @@ -0,0 +1,59 @@ + + + + http://localhost:1313/ + 2025-10-25T00:00:00+00:00 + + + + http://localhost:1313/blog/ + 2025-10-25T00:00:00+00:00 + + http://localhost:1313/blog/bruteforce/ + 2025-10-25T00:00:00+00:00 + + http://localhost:1313/blog/test/ + 2025-10-24T00:00:00+00:00 + + http://localhost:1313/categories/ + + + + http://localhost:1313/datenschutz/ + + http://localhost:1313/impressum/ + + http://localhost:1313/tags/ + + + + http://localhost:1313/whoami/ + + http://localhost:1313/home/ + + diff --git a/blog/public/favicon-96x96.png b/blog/public/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1f804384273ff41b93df1f49133d2d5b962188 GIT binary patch literal 1696 zcmb7FSv=eM9{v3jl1iK85*<3V+|rIp+M-5=8Y5L}D)wDeiqulHwKbVo(j{7IokoXJ zR1q{ZmKe(zx$V>v)C_7$G^N#{qpFsXA)@2n$NO~e!}pxe=RBNqp3XPJ&BXzY`WyuS zKs!0wdh9Um-?s~~gRcuOn*)Fdcd|X{#W=HA5?RCb*6aC*>t2z} zVu>YPEyFZ(UcDF^i)M74cC_T6u^ChL3wUQ1uPQ{r6B<(%>(zm)0M)U%D zv-S;4i`@wCd6%MO4nmPxqw-xBK@UcgCsUmUS=z=fOZp;6(~?#qbzsAdlSJlSx&LKg zWeP(e5IGZ-zs}1~hrbY?Yu;#ciF){l3MkB#Wj|s>^IFcEfh5l;3cU+99YGCHn;-j$ z#4r<3;+T&BLp}VQQb#-zxL~7iQ%kKtby>`%xBGSWBRf`2H{D5YsnJUIxd)e&!JNke z<U`0{XuQJEw3QqrC(XtogLJJ-VryxbR{7@gv z_XJQRe`{L4@Kn;C_P{=rWgDmw$xJZ;=LiW-hbAD}W`3tmyZl#b9LsRC2(^46!X7@O z!66nMbO0Kjisxix^?gZ3FPyB11Z|$R6ukje5guRWM^%V&v+d*6JL(z9y{DS}WXHie zA?Kb;{@$JXhTQG+rY*Zd=GBNu*&bJ9VvK>zI+=EnQXbTO++ne43QRdaojd&S8#R61 zSjfD1E|9zU`{;+bs@5cbB4B6?$UVmuW|Ew=n;8AH7)Y~s^=?iq`lGmm+&tMZs3KB* zv37Ii=ns2V?W_}^k1^YY{AlZfbt6NeP#gynaLKtIKCI&isTE8_-?9px*giH{RyQ_| zAAph0OWg15CVG1jaG6uXX_he2hb_g2>27pc{N&HvMRLY+r(SUVcT~{#`$mkIY$+wf zR^mh6*JPRQ2e%3)C&StSgM*T}`!H2|f?m1oW^=aWOtCrPW_+PXVDX?9sLtkfJcst? z^tQR40C^XBh7CjMjX_0lurbZWx(x|Ys|JZ`t+DjCfy>0Zw1^WqU(n^^CM|G1+VYGt z`*f!_`nsHvk~30-&EWa1yV(;Cm@2dVn~tr9kh*0(f&yhQ>*Es}Df}%gr1e8-3+44Y zKGY|kH5A8<)42TPq%L;HA=m^(5?y)mW!x_U-_O)!TNQ1IU9kx8AgptFw@%!eTYP`Y zC;8%akLyz#k1qFDl=8oeYA}KX*X;dn^r(rBpinaFxNn#;BG7J$LCYC#YpSYF3)&%$4?HSN4IV4BgiFpT_{^KEV~Cepr&Fp)@aX zdYiY@0GX^KZTeOmN%QEcTBr}I3x$81ta2^_8!1E&)Z89bi;J>hy*%~ocFXI!jxb?bVDMTb$Xs;oKJ>`N@9uKLsmIQqK2nZ4e9<;kkw%5U2X;(wfiZCX<^p{84jbP~Ww8x#dBZg5M2M1OvS z$DHjZmJe4|)`Dc`C1T-lC;zI{b-6KBw{=|epZsaVumGo~Ab(4MdUfk@FgBSrs6?9o zlrv(ctT4y@tNx0j(8gMdipCvug=l!I6UH^Z+38z#%RCX$4)o}mpHImzK^!Z5Q(C1f xEIm-KO>)M4%5BtQn|LGt$FcoC*4l)f25AQ8UL5z%e!25`fRmkzZG#Q%>fa@L6W#y- literal 0 HcmV?d00001 diff --git a/blog/public/favicon.ico b/blog/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b9b9046bd4ea683b2fa7857721ef260ce2112d13 GIT binary patch literal 15086 zcmeI3O^6&t6vt~aCNUVPZFS*5oB8Y6nKtu)6OEBQ>67(R5 zAozg;*f*nkQ`hwxMOyv%irs+>glfSnQq&j53wq|ef3_w zkAJ=C?y0G+C{uG27VG|Ry0OgyC4W&AYa%5{&x5$ z4gFHlnAm<3Iyrx+!(!1GW$j40$4MKCU}{4<^5SB1ZI-{$?aA}6Vw_xGh54e=o7AB& zmlq%7r^G=%yJTZtpXK>hHBR0qlDTak4DaRTz-GzXcX>FQqj|nnjg$8(=u$U-)C+X2 zMQ^zufxo@MF9_DqUs)BtB5}ZQ#>G)q2K(tEIjgkM>-un6yh%TE3mvKwTaj2`*i7Ai zOJXV9Pu#r3IFDbwNY1Kl$opDh%&wuC1NdLA8duSHK)TC?70R{Xc{c_)U&*x9TDBTS z*1*(sae?(a7ZAF08Ft^hcEgszbs~k!+>q!S77OEhQ#MAx<{4`?kg>-q>kvM#;gkWN{_<=N1#=KP2>F7u|<;eAFC3a~b&LGr0zw4R=gr^bd|2 zx6Kcn?ciB+aiTkh?s$g&4|JQY|2S~)yc6T3^5%y4NOwBXS~VV&j(TexFefnp>b?|2 z1nR%;>WsWU={pX6aMi#oYXMt(19byyjsxB-4B&rh16r%-{??h#@*M}AzCzz(;r8J} z`Hfh%9()Gh_QC#X*|@{<1N+lvOCoC;j|~e)**w&LCzSackqK=t8+Vv~;M@nL_PCJu z4ikgV$ER8?6b68}o_PP;O1EHbftDr9!!_)Qsp| z9w;?0`k=lXa$V>B0#R+k4p-)f4kg;=~QP=X)i_Ublv3 zpYqkBd3xDt{pSH2Q+S}&PrYo(|Esk%`S^2Hlw&^vuumL-t}kvR-4=K%Ju_^ z$9Gb?1@3Mn(9E1eL%ys|xERaI1k60!5hF5*ZGJunX}inj%km@M7pV!x$(;^$VD2kf zG5(E?ERQ>xj@WqY5I^aRJ!;3Q;>4fS9TlIA;4Rk&Ha4|cvia%D`;LL^XA$>|z3$i) z|BGDPpdC=WuSS1hXBMO6W!Mk*OO$>^YFZDdOSPUP^UL?7iVZQFgAn%lZ9MqiMxa8jOJVtliwHuVI z*V4~p<}R($=WQN#=DQzat+7Sc8+Yf~`*B|ZUxD$f0QYY1w)L#mmQJql)MI5OBwHRU zCnJ*W4okAdA=GMgsXe3nHQA@&znF!46@H(h`1L_eKaslf+`r#?AwDEJ+Q(Mci(~VM zSwnrv{*!#4EfDK#afUzK%g^eyK6p9jaxaQ~*vwBOexF^uPU~&ft{*4Q+qx5eiQlVR z`jC0Qe5#*Ma*VtOO?EjidCK$;ByIBgVE9F=;2iuy& + + + + + + + + agres :: Willkommen + + + + +
+ +
+ + +
+ + +
+ +

Willkommen

+ +

+

Links

+ + + +
+ + +
+ + + + + + + diff --git a/blog/public/impressum/index.html b/blog/public/impressum/index.html new file mode 100644 index 0000000..be15eac --- /dev/null +++ b/blog/public/impressum/index.html @@ -0,0 +1,75 @@ + + + + + + + + + agres :: Impressum + + + + +
+ +
+ + +
+ + +
+ +

Impressum

+ +

Angaben gemäß § 5 TMG und § 18 MStV

+

Name
+Dominik Agreš

+

Anschrift
+Steigerwaldstraße 30
+74172 Neckarsulm
+DE

+

Kontakt
+dominik@agres.online

+

Haftung für Inhalte

+

Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.

+ +

Mein Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen.

+

Urheberrecht & Lizens

+

Der Quellcode dieser Website steht unter der MIT Lizenz.

+

Die Inhalte (Texte, Bilder, soweit nicht anders gekennzeichnet) dieser Seite stehen unter der CC BY-SA 4.0 Lizenz.

+

Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Solltest du trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitte ich um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Inhalte umgehend entfernen.

+ + +
+ + +
+ + + + + + + diff --git a/blog/public/index.html b/blog/public/index.html new file mode 100644 index 0000000..addb25e --- /dev/null +++ b/blog/public/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + agres :: agres.online + + + + +
+ +
+ + +
+ + + +

+

Links

+ + + + + + + + + +
+ + + + + + + diff --git a/blog/public/index.xml b/blog/public/index.xml new file mode 100644 index 0000000..96a3818 --- /dev/null +++ b/blog/public/index.xml @@ -0,0 +1,54 @@ + + + + agres.online + http://localhost:1313/ + Recent content on agres.online + Hugo + en-US + Sat, 25 Oct 2025 00:00:00 +0000 + + + Bruteforce Analysis + http://localhost:1313/blog/bruteforce/ + Sat, 25 Oct 2025 00:00:00 +0000 + http://localhost:1313/blog/bruteforce/ + <h1 id="introduction">Introduction</h1> <p>Recently I set up this Website as a small side Project in order to learn a little bit of HTML, CSS and the use of static site generators. In order to host this website I used my VPS I own on <a href="https://www.ionos.de/">IONOS</a>. As someone who has spent a lot of time in the Cybersecurity world, I gave my best to secure the VPS as well as possible. Login via SSH is enabled only via Private/Public Key Authentification and <a href="https://github.com/fail2ban/fail2ban">Fail2Ban</a> is setup to ban anyone who tries to login more than 5 Times. Once this was setup I created a way to &ldquo;pull&rdquo; the logs from nginx and fail2ban onto my private ProxMox server and Process these into Grafana. As I was doing this, I noticed that the fail2ban logfile has over 31.000 rows. Nothing suspicious for a public IP Adress, yet a interesting amount of data.</p> + + + Test + http://localhost:1313/blog/test/ + Fri, 24 Oct 2025 00:00:00 +0000 + http://localhost:1313/blog/test/ + <p>Help Me</p> + + + Datenschutz + http://localhost:1313/datenschutz/ + Mon, 01 Jan 0001 00:00:00 +0000 + http://localhost:1313/datenschutz/ + <h2 id="allgemeine-hinweise">Allgemeine Hinweise</h2> <p>Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz finden Sie in dieser Datenschutzerklärung.</p> <h2 id="datenerfassung">Datenerfassung</h2> <p>Wer ist verantwortlich für die Datenerfassung? Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Impressum dieser Website entnehmen.</p> <h2 id="wie-werden-ihre-daten-erfasst">Wie werden Ihre Daten erfasst?</h2> <p>Ihre Daten werden zum einen dadurch erhoben, dass Sie mir diese mitteilen (z. B. über eine Kontaktaufnahme per E-Mail). Es werden keine technischen Daten gespeichert und erfasst (z.B. Internetbrowser, Betriebssystem IP-Adresse oder Uhrzeit), da die Protokollierung deaktiviert ist. Wofür nutzen wir Ihre Daten? Die von Ihnen übermittelten Daten (z. B. per E-Mail) werden ausschließlich zur Bearbeitung Ihrer Anfrage verwendet.</p> + + + Impressum + http://localhost:1313/impressum/ + Mon, 01 Jan 0001 00:00:00 +0000 + http://localhost:1313/impressum/ + <h2 id="angaben-gemäß--5-tmg-und--18-mstv">Angaben gemäß § 5 TMG und § 18 MStV</h2> <p><strong>Name</strong> <br> Dominik Agreš</p> <p><strong>Anschrift</strong> <br> Steigerwaldstraße 30 <br> 74172 Neckarsulm <br> DE</p> <p><strong>Kontakt</strong><br> <a href="mailto:dominik@agres.online">dominik@agres.online</a></p> <h2 id="haftung-für-inhalte">Haftung für Inhalte</h2> <p>Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.</p> + + + Whoami + http://localhost:1313/whoami/ + Mon, 01 Jan 0001 00:00:00 +0000 + http://localhost:1313/whoami/ + <p>Hi, I’m Dominik</p> <p>I’m passionate about technology, software, and cybersecurity.</p> <ul> <li>Studied <strong>Software Engineering</strong> at <strong>Heilbronn University (HHN)</strong></li> <li>Worked at <strong>Schwarz IT</strong> in a <strong>Cybersecurity</strong> team during my studies</li> <li>Wrote my Bachelors Thesis about the application of Machine Learning to optimise distinct processes in the Cybersecurity world</li> <li>Love exploring nature, going on hiking trips as well as driving my motorcycle</li> <li>Love reading books about sociology, philosophy and politics</li> </ul> <hr> <h2 id="books">Books</h2> <p>Here are some of my favourite books I would recommend to anyone:</p> + + + Willkommen + http://localhost:1313/home/ + Mon, 01 Jan 0001 00:00:00 +0000 + http://localhost:1313/home/ + <h1 id="typedText" data-text="Test"></h1> <p>Links</p> <ul> <li><a href="https://github.com/agresdominik">github</a></li> </ul> + + + diff --git a/blog/public/publickey.asc b/blog/public/publickey.asc new file mode 100644 index 0000000..e3c8c85 --- /dev/null +++ b/blog/public/publickey.asc @@ -0,0 +1,41 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +HK+dEsiN2r/KxgpAych6xtyuxQ== +=OLgg +-----END PGP PUBLIC KEY BLOCK----- diff --git a/blog/public/robots.txt b/blog/public/robots.txt new file mode 100644 index 0000000..f8cd5d5 --- /dev/null +++ b/blog/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://surname.online/sitemap.xml diff --git a/blog/public/sitemap.xml b/blog/public/sitemap.xml new file mode 100644 index 0000000..3d3dd35 --- /dev/null +++ b/blog/public/sitemap.xml @@ -0,0 +1,16 @@ + + + + + http://localhost:1313/en/sitemap.xml + + 2025-10-25T00:00:00+00:00 + + + + + http://localhost:1313/de/sitemap.xml + + + + diff --git a/blog/public/tags/index.html b/blog/public/tags/index.html new file mode 100644 index 0000000..88dec10 --- /dev/null +++ b/blog/public/tags/index.html @@ -0,0 +1,56 @@ + + + + + + + + + agres :: Tags + + + + +
+ +
+ + +
+ + +Tags + +
    + +
+ + +
+ + + + + + + diff --git a/blog/public/tags/index.xml b/blog/public/tags/index.xml new file mode 100644 index 0000000..ef06e75 --- /dev/null +++ b/blog/public/tags/index.xml @@ -0,0 +1,11 @@ + + + + Tags on agres.online + http://localhost:1313/tags/ + Recent content in Tags on agres.online + Hugo + en-US + + + diff --git a/blog/public/whoami/index.html b/blog/public/whoami/index.html new file mode 100644 index 0000000..e845b75 --- /dev/null +++ b/blog/public/whoami/index.html @@ -0,0 +1,85 @@ + + + + + + + + + agres :: Whoami + + + + +
+ +
+ + +
+ + +
+ +

Whoami

+ +

Hi, I’m Dominik

+

I’m passionate about technology, software, and cybersecurity.

+
    +
  • Studied Software Engineering at Heilbronn University (HHN)
  • +
  • Worked at Schwarz IT in a Cybersecurity team during my studies
  • +
  • Wrote my Bachelors Thesis about the application of Machine Learning to optimise distinct processes in the Cybersecurity world
  • +
  • Love exploring nature, going on hiking trips as well as driving my motorcycle
  • +
  • Love reading books about sociology, philosophy and politics
  • +
+
+

Books

+

Here are some of my favourite books I would recommend to anyone:

+ +

Reading right now:

+ +
+

PGP Key

+

If you want to send me encrypted messages use the following PGP-Key. If you want to check the fingerprint:

+
896B 3FF1 2E82 A80C 10F6  42CB 4634 761C A7CE E0A
+
+ +
+ + +
+ + + + + + + diff --git a/blog/static/apple-touch-icon.png b/blog/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..245dec682df9d678c7c0b8ca6338de64c34e7f4d GIT binary patch literal 3452 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 R?>JQfdO8N$rJ8nO{{ackSdIVy literal 0 HcmV?d00001 diff --git a/blog/static/css/style.css b/blog/static/css/style.css new file mode 100644 index 0000000..520466b --- /dev/null +++ b/blog/static/css/style.css @@ -0,0 +1,224 @@ +/* ---------- Base ---------- */ +:root { + --color-bg: #111; + --color-fg: #fafafa; + --color-accent: #222; + + --light-yellow: color(display-p3 1 1 0.7) + + --link: #fff; + --link-hover: color(display-p3 1 1 0.7); + + --font-base: 'Inter', sans-serif; + --font-weight-regular: 400; + --font-weight-bold: 600; + + --max-width: 700px; + --padding-page: 1rem; + + font-feature-settings: 'liga' 1, 'calt' 1; + font-size: 11pt; +} + +html, body { + margin: 0; + padding: var(--padding-page); + background: var(--color-bg); + color: var(--color-fg); + font-family: var(--font-base); + font-weight: var(--font-weight-regular); + line-height: 1.6; + max-width: var(--max-width); + margin-inline: auto; +} + +/* ---------- Typography ---------- */ +main h1, main h2, main h3, main h4 { + color: var(--color-fg); + font-weight: var(--font-weight-bold); + line-height: 1.8; + display: inline; + background-image: linear-gradient(120deg, #355c48 0%, #5f8261 100%); + background-repeat: no-repeat; + background-size: 100% 0.6em; + background-position: 0 88%; + transition: background-size 0.5s ease; +} + +a { + color: var(--link); + text-decoration: underline; + transition: color 0.1s ease; +} + +a:hover { + color: var(--link-hover); + text-decoration: underline; + transition: color 0.1s ease; +} + +p { + text-align: justify; + text-justify: inter-word; + margin: 1rem 0; +} + +/* ---------- Top Bar ---------- */ +.topbar { + background: var(--color-bg); + width: 100%; + padding: 0.75rem 1.5rem; + border-bottom: 3px solid var(--color-accent); +} + +.topbar-content { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 900px; + margin: 0 auto; +} + +.site-title { + font-size: 1.2rem; + font-weight: var(--font-weight-bold); + color: var(--link); + text-decoration: none; +} + +.site-title:hover { + color:var(--link-hover); +} + +.nav-links a { + color: var(--link); + margin-left: 1rem; + text-decoration: none; +} + +.nav-links a:hover { + color:var(--link-hover); + text-decoration: underline; +} + +/* ---------- Bottom Bar ---------- */ +.bottombar { + background: var(--color-bg); + width: 100%; + border-top: 3px solid var(--color-accent); + padding: 0.75rem 1.5rem; + text-align: center; + box-shadow: 0 -1px 3px rgba(0,0,0,0.5); +} + +.bottombar-content { + max-width: 900px; /* same as .topbar-content */ + margin: 0 auto; +} + +.bottombar a { + color: var(--link); + margin: 0 0.5rem; +} + +.bottombar a:hover { + color: var(--link-hover); +} + +/* ---------- Content ---------- */ +main { + padding-left: 1.5rem; + margin-top: 2rem; + margin-bottom: 1rem; +} + +article { + margin-bottom: 2rem; +} + +ul, ol { + list-style: none; + padding-left: 0.1rem; +} + +li { + margin-bottom: 0.01em; +} + +ul li::before { + content: "• "; + color: var(--color-fg); + font-size: 1.1rem; +} + +img { + max-width: 100%; + height: auto; + display: block; +} + +/* ---------- Infobox Styling ---------- */ + +.infobox { + margin: 1rem; + padding: 1rem; + padding-left: 30px; + background-color: var(--color-accent); + border: 1.5px solid; + border-color: var(--color-fg); + border-radius: 10px; +} + +.infobox-content { + display: flex; + margin: 10px 0; + display: grid; + grid-template-columns: 150px 1fr; + row-gap: 8px; +} + +.infobox-label { + font-weight: bold; + margin-right: 10px; +} + +.infobox-value { + font-style: italic; +} + + +/* ---------- Responsive Adjustments ---------- */ +@media (max-width: 600px) { + body { + padding: 5rem 1rem 5rem; + } + + .topbar-content { + flex-direction: column; + gap: 0.5rem; + } +} + +/* ---------- Codeblock Styling ---------- */ +pre, +pre.chroma { + background: var(--color-accent); + color: var(--color-fg); + padding: 1em; + border-radius: 0.5rem; + overflow-x: scroll; +} + +code { + font-family: 'Fira Code', monospace; + font-size: 1rem; +} + +.chroma .k { color: #ff79c6; } /* Keywords */ +.chroma .s { color: #f1fa8c; } /* Strings */ +.chroma .n { color: #f8f8f2; } /* Names */ +.chroma .p { color: #bd93f9; } /* Punctuation */ +.chroma .c { color: #6272a4; font-style: italic; } /* Comments */ +.chroma .m { color: #8be9fd; } /* Numbers */ +.chroma .o { color: #ffb86c; } /* Operators */ +.chroma .err { color: #ff5555; background: #2e2e2e; } /* Errors */ diff --git a/blog/static/favicon-96x96.png b/blog/static/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1f804384273ff41b93df1f49133d2d5b962188 GIT binary patch literal 1696 zcmb7FSv=eM9{v3jl1iK85*<3V+|rIp+M-5=8Y5L}D)wDeiqulHwKbVo(j{7IokoXJ zR1q{ZmKe(zx$V>v)C_7$G^N#{qpFsXA)@2n$NO~e!}pxe=RBNqp3XPJ&BXzY`WyuS zKs!0wdh9Um-?s~~gRcuOn*)Fdcd|X{#W=HA5?RCb*6aC*>t2z} zVu>YPEyFZ(UcDF^i)M74cC_T6u^ChL3wUQ1uPQ{r6B<(%>(zm)0M)U%D zv-S;4i`@wCd6%MO4nmPxqw-xBK@UcgCsUmUS=z=fOZp;6(~?#qbzsAdlSJlSx&LKg zWeP(e5IGZ-zs}1~hrbY?Yu;#ciF){l3MkB#Wj|s>^IFcEfh5l;3cU+99YGCHn;-j$ z#4r<3;+T&BLp}VQQb#-zxL~7iQ%kKtby>`%xBGSWBRf`2H{D5YsnJUIxd)e&!JNke z<U`0{XuQJEw3QqrC(XtogLJJ-VryxbR{7@gv z_XJQRe`{L4@Kn;C_P{=rWgDmw$xJZ;=LiW-hbAD}W`3tmyZl#b9LsRC2(^46!X7@O z!66nMbO0Kjisxix^?gZ3FPyB11Z|$R6ukje5guRWM^%V&v+d*6JL(z9y{DS}WXHie zA?Kb;{@$JXhTQG+rY*Zd=GBNu*&bJ9VvK>zI+=EnQXbTO++ne43QRdaojd&S8#R61 zSjfD1E|9zU`{;+bs@5cbB4B6?$UVmuW|Ew=n;8AH7)Y~s^=?iq`lGmm+&tMZs3KB* zv37Ii=ns2V?W_}^k1^YY{AlZfbt6NeP#gynaLKtIKCI&isTE8_-?9px*giH{RyQ_| zAAph0OWg15CVG1jaG6uXX_he2hb_g2>27pc{N&HvMRLY+r(SUVcT~{#`$mkIY$+wf zR^mh6*JPRQ2e%3)C&StSgM*T}`!H2|f?m1oW^=aWOtCrPW_+PXVDX?9sLtkfJcst? z^tQR40C^XBh7CjMjX_0lurbZWx(x|Ys|JZ`t+DjCfy>0Zw1^WqU(n^^CM|G1+VYGt z`*f!_`nsHvk~30-&EWa1yV(;Cm@2dVn~tr9kh*0(f&yhQ>*Es}Df}%gr1e8-3+44Y zKGY|kH5A8<)42TPq%L;HA=m^(5?y)mW!x_U-_O)!TNQ1IU9kx8AgptFw@%!eTYP`Y zC;8%akLyz#k1qFDl=8oeYA}KX*X;dn^r(rBpinaFxNn#;BG7J$LCYC#YpSYF3)&%$4?HSN4IV4BgiFpT_{^KEV~Cepr&Fp)@aX zdYiY@0GX^KZTeOmN%QEcTBr}I3x$81ta2^_8!1E&)Z89bi;J>hy*%~ocFXI!jxb?bVDMTb$Xs;oKJ>`N@9uKLsmIQqK2nZ4e9<;kkw%5U2X;(wfiZCX<^p{84jbP~Ww8x#dBZg5M2M1OvS z$DHjZmJe4|)`Dc`C1T-lC;zI{b-6KBw{=|epZsaVumGo~Ab(4MdUfk@FgBSrs6?9o zlrv(ctT4y@tNx0j(8gMdipCvug=l!I6UH^Z+38z#%RCX$4)o}mpHImzK^!Z5Q(C1f xEIm-KO>)M4%5BtQn|LGt$FcoC*4l)f25AQ8UL5z%e!25`fRmkzZG#Q%>fa@L6W#y- literal 0 HcmV?d00001 diff --git a/blog/static/favicon.ico b/blog/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b9b9046bd4ea683b2fa7857721ef260ce2112d13 GIT binary patch literal 15086 zcmeI3O^6&t6vt~aCNUVPZFS*5oB8Y6nKtu)6OEBQ>67(R5 zAozg;*f*nkQ`hwxMOyv%irs+>glfSnQq&j53wq|ef3_w zkAJ=C?y0G+C{uG27VG|Ry0OgyC4W&AYa%5{&x5$ z4gFHlnAm<3Iyrx+!(!1GW$j40$4MKCU}{4<^5SB1ZI-{$?aA}6Vw_xGh54e=o7AB& zmlq%7r^G=%yJTZtpXK>hHBR0qlDTak4DaRTz-GzXcX>FQqj|nnjg$8(=u$U-)C+X2 zMQ^zufxo@MF9_DqUs)BtB5}ZQ#>G)q2K(tEIjgkM>-un6yh%TE3mvKwTaj2`*i7Ai zOJXV9Pu#r3IFDbwNY1Kl$opDh%&wuC1NdLA8duSHK)TC?70R{Xc{c_)U&*x9TDBTS z*1*(sae?(a7ZAF08Ft^hcEgszbs~k!+>q!S77OEhQ#MAx<{4`?kg>-q>kvM#;gkWN{_<=N1#=KP2>F7u|<;eAFC3a~b&LGr0zw4R=gr^bd|2 zx6Kcn?ciB+aiTkh?s$g&4|JQY|2S~)yc6T3^5%y4NOwBXS~VV&j(TexFefnp>b?|2 z1nR%;>WsWU={pX6aMi#oYXMt(19byyjsxB-4B&rh16r%-{??h#@*M}AzCzz(;r8J} z`Hfh%9()Gh_QC#X*|@{<1N+lvOCoC;j|~e)**w&LCzSackqK=t8+Vv~;M@nL_PCJu z4ikgV$ER8?6b68}o_PP;O1EHbftDr9!!_)Qsp| z9w;?0`k=lXa$V>B0#R+k4p-)f4kg;=~QP=X)i_Ublv3 zpYqkBd3xDt{pSH2Q+S}&PrYo(|Esk%`S^2Hlw&^vuumL-t}kvR-4=K%Ju_^ z$9Gb?1@3Mn(9E1eL%ys|xERaI1k60!5hF5*ZGJunX}inj%km@M7pV!x$(;^$VD2kf zG5(E?ERQ>xj@WqY5I^aRJ!;3Q;>4fS9TlIA;4Rk&Ha4|cvia%D`;LL^XA$>|z3$i) z|BGDPpdC=WuSS1hXBMO6W!Mk*OO$>^YFZDdOSPUP^UL?7iVZQFgAn%lZ9MqiMxa8jOJVtliwHuVI z*V4~p<}R($=WQN#=DQzat+7Sc8+Yf~`*B|ZUxD$f0QYY1w)L#mmQJql)MI5OBwHRU zCnJ*W4okAdA=GMgsXe3nHQA@&znF!46@H(h`1L_eKaslf+`r#?AwDEJ+Q(Mci(~VM zSwnrv{*!#4EfDK#afUzK%g^eyK6p9jaxaQ~*vwBOexF^uPU~&ft{*4Q+qx5eiQlVR z`jC0Qe5#*Ma*VtOO?EjidCK$;ByIBgVE9F=;2iuy&