push to prod (1/2)

This commit is contained in:
nihilist 2025-05-07 16:21:53 +02:00
parent ff44033d47
commit 0969c49c48
8 changed files with 975 additions and 1 deletions

View file

@ -1 +1,30 @@
v2
# Nihilist OPSEC blog
mkdocs-material markdown edition
# How to run
## Docker
To run the blog yourself, you'll need a Tor daemon running with socks5 proxy at `localhost:9050`. It will be used to clone/pull the repository from Docker container.
You also need an onionv3 domain and hidden service exposing `localhost:7080`as HTTP.
Download 3 files from the `deploy/` directory. You only need to edit the `SITE_URL` in `docker-compose.yml` to the vanity domain you generated.
Then run:
```
$ docker compose up -d && docker compose logs -f
```
It will automatically clone the repository and start serving it with nginx on the URL you provided.
## Local development
You need to install [mkdocs-material package](https://pkgs.org/search/?q=mkdocs-material) from your distro's repository or [from pip](https://squidfunk.github.io/mkdocs-material/getting-started/).
Then from the main directory run:
```
$ mkdocs serve
```
It should be served on `http://locahost:8000`

4
blogfix.sh Normal file
View file

@ -0,0 +1,4 @@
#!/bin/sh
# url-encode '%' char: https://github.com/gohugoio/hugo/issues/4586
sed -i 's/#51%_attack/#51%25_attack/g' ./content/posts/monerop2pool/index.md

197
convert_old_blog.py Normal file
View file

@ -0,0 +1,197 @@
import os
import re
import sys
import json
import shutil
import requests
import html2text
OLLAMA_HOST = 'http://ollama:11434/'
OLLAMA_PROMPT = """Analyze the blog post and give answer to following questions:
* Who wrote it? (usually occurs at the beginning)
* When was it written? (2001-12-30 format)
The response format should be JSON. You can not output anything else other than JSON. If the response can't be found, add `null` value. Here's an example how output should look like:
```
{"author": "nihilist", "date": "2024-03-01"}
```
Important: do not output anything else!
"""
NIHILIST_XMR = '8AUYjhQeG3D5aodJDtqG499N5jXXM71gYKD8LgSsFB9BUV1o7muLv3DXHoydRTK4SZaaUBq4EAUqpZHLrX2VZLH71Jrd9k8'
# make generation somewhat deterministic
OLLAMA_SEED = 17
OLLAMA_MODEL = 'gemma3:12b'
def is_webp(fpath: str) -> bool:
with open(fpath, 'rb') as f:
f.seek(8)
return f.read(8) == b'WEBPVP8L'
def html_to_papermod(html_data: str) -> str:
# try to find author, date and other metadata in html file
h = html2text.HTML2Text()
# disable random wrapping
h.body_width = 0
return h.handle(html_data)
def extract_blog_info(html_string: str) -> dict[str, str]:
match = re.search(r'<p><img.*?<ba>(.*?)</ba>.*?<h1>(.*?)</h1>', html_string, re.DOTALL)
user = None
title = None
if match:
user = match.group(1).strip()
title = match.group(2).strip()
return user, title
def extract_git_issue_number(html_string: str) -> int:
match = re.search(r'issues/(\d+)">git issue<', html_string)
if match:
return int(match.group(1))
else:
return 0
def extract_xmr_address(md_string: str) -> int:
xmrs = re.findall(r":_.*([1-9A-HJ-NP-Za-km-z]{95})", md_string)
print(xmrs)
#xmrs = [x[-95:] for x in xmrs]
try:
# found 2 xmr addresses, extract the authors probable one
if len(xmrs) == 2:
xmrs.remove(NIHILIST_XMR)
except:
pass
if len(xmrs) != 0:
return xmrs[0]
return None
def extract_blog_info_ai(md_string: str) -> dict[str, str]:
print(f"Extracting info from {len(md_string)} bytes.")
#num_ctx = 8192 if len(md_string) < (8192*2.5) else 16384
#num_ctx = (int(len(md_string)/(8192*2.5))+1)*8192
num_ctx = 2048
r = requests.post(OLLAMA_HOST+'/api/generate', json={
"model": OLLAMA_MODEL,
"system": OLLAMA_PROMPT,
"prompt": md_string[:1024], # 1024 first bytes is enough
"format": "json",
"options": {"num_ctx": num_ctx, "seed": OLLAMA_SEED}, #len(md_string)//2},
"stream": False
})
resp = r.json()
if resp.get('prompt_eval_count', 0) == num_ctx:
print('WARNING: LLM context saturated, may give wrong answer')
return resp
# remove unnecessary header and footer, git issue reference, some other stuff
def do_markdown_fixes(md_string: str) -> str:
# there are 3 paragraphs in the footer: Nihilism, My Links, About
# some customize that tho
for _ in range(3):
foot_str = "#### "
found_at = md_string.rfind(foot_str)
#print('footer found at:', found_at)
if found_at >= 0:
md_string = md_string[:found_at]
else:
break
# remove git issue reference from the issue
git_regex = r'!\[\]\(\.\.\/logos\/daturagit\.png\).*?\s*directly!'
md_string = re.sub(git_regex, "", md_string, flags=re.DOTALL)
# remove header
git_regex = r'\[The Nihilism Opsec Blog\].*?\s*\(\.\.\/index\.html\)'
md_string = re.sub(git_regex, "", md_string, flags=re.DOTALL)
# remove weird backticks html2text lefts sometimes after code blocks
md_string = md_string.replace('\n`\n', '')
# to make mkdocs happy, we replace all links to html to md. may break some links if external website uses index.html
md_string = md_string.replace('/index.html', '/index.md')
return md_string
def cut_until_title(md_string: str) -> str:
return md_string[md_string.find('# '):]
def make_papermod_post(post_dir: str, md_string: str, blog_info: dict[str, str]) -> None:
header = f"""---
author: {blog_info['author']}
date: {blog_info['date']}
gitea_url: "http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/blog-contributions/issues/{blog_info.get('git', 0)}"
xmr: {blog_info['xmr']}
---
"""
f = open(os.path.join(post_dir, 'index.md'), 'w', encoding='utf-8')
f.write(header)
f.write(md_string)
f.close()
def walk_all_blogs(old_opsec_path: str) -> None:
for root, _, files in os.walk(old_opsec_path):
rel_name = root[root.find('opsec/')+6:]
post_dir = os.path.join('./docs/opsec', rel_name)
os.makedirs(post_dir, exist_ok=True)
for fi in files:
#print(fi)
# skip the index site
if os.path.basename(root) == '' and fi == 'index.html':
continue
if fi.endswith(('.png', '.jpg', '.jpeg', '.mp4')):
#print(f"Copying asset {fi}")
shutil.copy(os.path.join(root, fi), os.path.join(post_dir, fi))
continue
# only accept index.html at this point
if not fi.endswith('.html'):
continue
f = open(os.path.join(root, fi), 'r', encoding='utf-8')
fc = f.read()
f.close()
print(os.path.basename(root), extract_blog_info(fc))
blog_info = {}
blog_md_raw = html_to_papermod(fc)
blog_info['git'] = extract_git_issue_number(fc)
blog_info['xmr'] = extract_xmr_address(blog_md_raw)
# remove unnecessary stuff we'll include anyway in hugo
blog_md = do_markdown_fixes(blog_md_raw)
ai_extract = extract_blog_info_ai(blog_md)
print(ai_extract.get('response'), ai_extract.get('prompt_eval_count'))
blog_md = cut_until_title(blog_md)
try:
blog_info.update(json.loads(ai_extract.get('response')))
if blog_info['date'] in ('0000-00-00', None):
blog_info['date'] = '2001-01-30'
# in case model acts dumb
blog_info['date'] = blog_info['date'].replace('/', '-')
make_papermod_post(post_dir, blog_md, blog_info)
except Exception as e:
print(e)
if __name__ == '__main__':
if len(sys.argv) != 2:
print('Usage: convert_old_blog.py /path/to/blog-contributions/opsec')
exit(1)
old_opsec_path = sys.argv[1]
walk_all_blogs(old_opsec_path)

28
deploy/docker-compose.yml Normal file
View file

@ -0,0 +1,28 @@
services:
blogmk-puller:
image: alpine:latest
container_name: blogmk_puller
environment:
- SITE_URL=http://mkdocsjdd76rvqxrgykpywpsxoij734ycf34767dmfmfqjmqcj7hurad.onion
- BRANCH=main
- REPO_URL=http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/opsec-blog-v2
- REFRESH_SEC=900
volumes:
- ./repo:/repo
- ./servable:/servable
- ./entry.sh:/entry.sh:ro
extra_hosts:
- "host.docker.internal:host-gateway"
entrypoint: ["sh", "/entry.sh"]
network_mode: "host"
restart: unless-stopped
blogmk-server:
image: nginx:alpine
container_name: blogmk_server
volumes:
- ./nginx.conf:/etc/nginx/sites-enabled/default:ro
- ./servable:/usr/share/nginx/html:ro
ports:
- "7080:80"
restart: unless-stopped

31
deploy/entry.sh Normal file
View file

@ -0,0 +1,31 @@
#!/bin/sh
apk add --no-cache git wget mkdocs-material py3-regex py3-requests py3-colorama
mkdir -p /repo
cd /repo
#rm -rf -- /repo/..?* /repo/.[!.]* /repo/*
while true; do
echo "$(date): Cloning or updating the repository..."
git config --global --add safe.directory /repo
git config --global --add http.proxy socks5h://localhost:9050
if [ -d "/repo/.git" ]; then
git restore .
git pull origin "${BRANCH}"
else
git clone -b "${BRANCH}" "${REPO_URL}" /repo
fi;
sed -i "s/^site_url:.*//g" /repo/mkdocs.yml
echo "site_url: ${SITE_URL}" >> /repo/mkdocs.yml
echo "Building mkdocs site..."
# remove old contents
rm -rf /servable/*
## do necessarry transition related fixes
#sh blogfix.sh
mkdocs build -d /servable
sleep $REFRESH_SEC
done

12
deploy/nginx.conf Normal file
View file

@ -0,0 +1,12 @@
server {
listen 80;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}

105
exp/blogtranslate.py Normal file
View file

@ -0,0 +1,105 @@
#!/usr/bin/python3
# experimental script converting all blog posts into given language using ollama
import requests
import shutil
import os
LANG = 'spanish'
OLLAMA_HOST = 'http://ollama:11434/'
OLLAMA_MODEL = 'qwen3:1.7b'
OLLAMA_PROMPT = f'''Translate the blog post into {LANG}, keep the technical language as well as Linux commands in english. Keep the overall structure - source code tags, metadata key names (like "author", "title", "date", ...) but translate the values of metadata fields. Only output the translated blog.
For example this fragment:
```
---
author: XMRonly
title: "How to Get an Email Account Anonymously (Emails as a Service)"
date: 2024-10-16
description: "This blog post explains how to sign up for an anonymous email account using Proton Mail and Tor, focusing on privacy and avoiding personal information input. It highlights the limitations of traditional email and the need for privacy-focused alternatives.."
summary: "This blog post explains how to sign up for an anonymous email account using Proton Mail and Tor, focusing on privacy and avoiding personal information input. It highlights the limitations of traditional email and the need for privacy-focused alternatives.."
tags: ['email', 'anonymous', 'privacy', 'protonmail', 'tor', 'opsec']
ShowToc: true
TocOpen: true
editPost:
URL: "http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/blog-contributions/issues/26"
Text: "Suggest Changes"
appendFilePath: false
---
![](../../assets/img/user.png) XMRonly - 2024 / 10 / 16
# How to Get an Email Account Anonymously (Emails as a Service)
![](0.png)
## **Introduction**
Email is one of the most widely used forms of online communication, both for personal and professional interactions. With billions sent daily, you would expect email to be secure, accessible, and readable by only the intended recipient. Unfortunately, email is an old technology and this is not always the case. With metadata being visible, large email providers scanning emails, as well as potential government surveillance in some parts of the world, it is no surprise that email is hardly considered private. As such, you may want to send an email that is not tied to your real identity. In this article, we will explore how to sign up for email account anonymously. Specifically, we will explore a privacy-focused email provider, **Proton Mail** , and how to sign up using Tor without inputting any additional information whatsoever.```
Should become:
```
---
author: XMRonly
title: "Cómo Obtener una Cuenta de Correo Electrónico Anónimamente (Servicios de Correo Electrónico)"
date: 2024-10-16
description: "Este artículo explica cómo registrarse para una cuenta de correo electrónico anónima utilizando Proton Mail y Tor, centrándose en la privacidad y evitando introducir información personal. Destaca las limitaciones del correo tradicional y la necesidad de alternativas centradas en la privacidad."
summary: "Este artículo explica cómo registrarse para una cuenta de correo electrónico anónima utilizando Proton Mail y Tor, centrándose en la privacidad y evitando introducir información personal. Destaca las limitaciones del correo tradicional y la necesidad de alternativas centradas en la privacidad."
tags: ['correo', 'anónimo', 'privacidad', 'protonmail', 'tor', 'opsec']
ShowToc: true
TocOpen: true
editPost:
URL: "http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/blog-contributions/issues/26"
Text: "Sugerir Cambios"
appendFilePath: false
---
![](../../assets/img/user.png) XMRonly - 2024 / 10 / 16
# Cómo Obtener una Cuenta de Correo Electrónico Anónimamente (Servicios de Correo Electrónico)
![](0.png)
## **Introducción**
El correo electrónico es uno de los métodos más utilizados para la comunicación en línea, tanto en interacciones personales como profesionales. Con miles de millones enviados diariamente, se esperaría que el correo sea seguro, accesible y legible únicamente por el destinatario previsto. Desafortunadamente, el correo electrónico es una tecnología antigua y esto no siempre es el caso. Dado que la metadatos son visibles, los grandes proveedores de correo escanean correos electrónicos y existe la posibilidad de vigilancia gubernamental en algunas partes del mundo, no es sorprendente que el correo electrónico rara vez se considere privado. Como resultado, podrías querer enviar un correo electrónico que no esté vinculado a tu identidad real. En este artículo, exploraremos cómo registrarse para una cuenta de correo electrónica anónimamente. Específicamente, examinaremos un proveedor centrado en la privacidad, **Proton Mail**, y cómo registrarse usando Tor sin introducir ninguna información adicional.```'''
new_content_dir = f'content.{LANG}'
for root, _, files in os.walk('./content'):
for fi in files:
infpath = os.path.join(root, fi)
outfpath = os.path.join(root.replace('./content', new_content_dir), fi)
os.makedirs(os.path.dirname(outfpath), exist_ok=True)
if fi != 'index.md':
shutil.copy(infpath, outfpath)
continue
f = open(infpath, encoding='utf-8')
fc = f.read()
f.close()
num_ctx = (int(len(fc)/(8192*2))+1)*8192
r = requests.post(OLLAMA_HOST+'/api/generate', json={
"model": OLLAMA_MODEL,
"system": OLLAMA_PROMPT,
"prompt": fc,
"options": {"num_ctx": num_ctx, "seed": 14},
"stream": False
})
resp = r.json()
print(root, num_ctx, resp.get('prompt_eval_count', 0))
fo = open(outfpath, 'w', encoding='utf-8')
data = resp.get('response')
startidx = data.index('</think>')+10
fo.write(data[startidx:])
fo.close()

568
mkdocs.yml Normal file
View file

@ -0,0 +1,568 @@
site_name: The Nihilism OPSEC blog
site_url: http://blog.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/
theme:
name: material
custom_dir: docs/opsec
palette:
# Palette toggle for dark mode
- scheme: slate
primary: indigo
accent: indigo
toggle:
icon: material/brightness-4
name: Switch to light mode
# Palette toggle for light mode
- scheme: default
primary: indigo
accent: indigo
toggle:
icon: material/brightness-7
name: Switch to dark mode
features:
- navigation.tabs
- navigation.prune
- navigation.footer
logo: assets/logo.png
favicon: assets/logo.png
nav:
- OPSEC:
- opsec/index.md
- OPSEC Introduction:
- 📝 Explaining Concepts:
- opsec/aps/index.md
- opsec/governments/index.md
- opsec/govfear/index.md
- 📝 Explaining OPSEC ⭐:
- opsec/opsec4levels/index.md
- opsec/internetsegmentation/index.md
- opsec/opsec/index.md
- opsec/multiple_identities/index.md
- opsec/chats/index.md
- Level 1 | Privacy:
- 📝 Explaining Privacy:
- opsec/privacy/index.md
- opsec/closedsource/index.md
- opsec/openhardware/index.md
- opsec/serversideencryption/index.md
- 💻 Getting Started:
- opsec/linux/index.md
- opsec/graphene/index.md
- opsec/privatesimplex/index.md
- opsec/qubesos/index.md
- 💻 File Sharing:
- opsec/syncthingvpn/index.md
- opsec/p2ptorrents/index.md
- 💻 Maintaining Privacy:
- opsec/compilation/index.md
- opsec/hypervisorsetup/index.md
- opsec/passwordmanagement/index.md
- opsec/pgp/index.md
- opsec/qubesosnetwork/index.md
- 💻 Privacy from your ISP:
- opsec/vpn/index.md
- opsec/vpnqemu/index.md
#- 💻 Monitoring that your Privacy is intact:
#- ⚠️ Miscellaneous - In real life:
- 💻 Serverside Privacy:
- opsec/selfhosting/index.md
- Level 2 | Anonymity:
- 📝 Explaining Anonymity:
- opsec/anonymityexplained/index.md
- opsec/anonuse/index.md
- opsec/phonenumbers/index.md
- opsec/anonymitymetadata/index.md
- opsec/torvsvpns/index.md
- opsec/torthroughvpn/index.md
- opsec/clearnetvsdarknet/index.md
- opsec/darknetexploration/index.md
- 💻 Clientside - Anonymity:
- opsec/whonixqemuvms/index.md
- opsec/torbrowsing/index.md
- opsec/whentorisblocked/index.md
- opsec/anonproxy/index.md
- opsec/anonsimplex/index.md
- opsec/anonsms/index.md
- opsec/anonemail/index.md
- 💻 Using AI for Anonymity:
- opsec/openwebuilocalllms/index.md
- opsec/stylometry/index.md
- 💻 Clientside - Censorship Evasion:
- opsec/vpnqemu/index.md
- opsec/v2ray/index.md
- 💻 File Sharing:
- opsec/onionshare/index.md
- opsec/syncthinganon/index.md
- opsec/i2ptorrents/index.md
- 💻 Clientside - Decentralized Finances ⭐:
- opsec/finances/index.md
- opsec/monero2024/index.md
- opsec/monerowallet/index.md
- opsec/chainalysisattempts/index.md
- opsec/monerofirst/index.md
- opsec/haveno-client-f2f/index.md
- opsec/haveno-arbitrator/index.md
- opsec/haveno-sepa/index.md
- opsec/haveno-cashbymail/index.md
- opsec/haveno-crypto/index.md
- opsec/anoncreditcard/index.md
- opsec/moneroinheritance/index.md
- 🧅 Serverside - Contributing to Anonymity:
- opsec/tor/relay/index.md
- opsec/tor/bridge/index.md
- opsec/tor/exit_node/index.md
- opsec/monero2024/index.md
- opsec/monerop2pool/index.md
- opsec/haveno-seednode/index.md
- opsec/darknetlantern/index.md
- 🧅 Serverside - Anonymous Hidden Services:
- opsec/hiddenservice/index.md
- opsec/anonymousremoteserver/index.md
- opsec/torwebsite/index.md
- opsec/pgpcanary/index.md
- opsec/forgejo-anon/index.md
- opsec/nextcloud/index.md
- 🧅 Serverside - Anonymous Clearnet Services:
- opsec/anonclearnetservices/index.md
- opsec/anondomain/index.md
- opsec/anonaccess/index.md
- opsec/dns/index.md
- opsec/mailprivate/index.md
- ⚠️ Miscellaneous - In real life:
- opsec/anonprotest/index.md
- Level 3 | Deniability:
- 📝 Explaining Plausible Deniability:
- opsec/stancesensitive/index.md
- opsec/deniability/index.md
- opsec/anonsensitive/index.md
- 💻 Clientside - Getting Started:
- opsec/tailsqemuvm/index.md
- opsec/livemode/index.md
- opsec/veracrypt/index.md
- opsec/sensitivevm/index.md
- opsec/plausiblydeniabledataprotection/index.md
- 💻 Steganography - Hiding secrets in plain sight:
- opsec/steganography/index.md
- opsec/steghide/index.md
- opsec/anonzulucrypt/index.md
- 💻 Decentralised Finances:
- opsec/monerowealth/index.md
- 🧅 Serverside - Plausible Deniability at Home:
- opsec/failovers/index.md
- opsec/physicalsecurity/index.md
- 🧅 Serverside - Remote Plausible Deniability:
- opsec/sensitiveremotevshome/index.md
- opsec/cloud_provider_adversary/index.md
- opsec/anonymous_server_monitoring/index.md
- 🧅 Serverside - High Availability for Deniability:
- opsec/high_availability/index.md
- opsec/tornginxphpmysql/index.md
- opsec/mysqlmastermaster/index.md
- opsec/onionbalancelb/index.md
- opsec/endgame/index.md
#- ⚠️ Miscellaneous - In real life:
- Contributing to the project:
- opsec/criticism/index.md
- opsec/contribute/index.md
- opsec/qualitystandard/index.md
- opsec/maintainers/index.md
- opsec/runtheblog/index.md
- Productivity:
- Productivity Introduction:
- productivity/poisonofmoderntimes/index.md
- productivity/discipline/index.md
- Preparing the Body and Mind:
- productivity/yoga/index.md
- productivity/diet-n-mental-health/index.md
- Nihilism:
- productivity/nihilism/index.md
- productivity/opus-nihil/index.md
- productivity/scio-nihil/index.md
- productivity/sum-nihil/index.md
- productivity/coldshowers/index.md
- Planning the Work:
- productivity/rightthing/index.md
- productivity/macroworkflow/index.md
- productivity/macrotime/index.md
- productivity/microworkflow/index.md
- productivity/kanban/index.md
- productivity/zeroemail/index.md
- Doing the Work:
- productivity/mentalenergy/index.md
- productivity/mentalopti/index.md
- productivity/morningroutine/index.md
- productivity/pomodoro/index.md
- Reflecting on the Work:
- productivity/graphs/index.md
- productivity/reflecting/index.md
- Self-Hosting:
- selfhosting/0_lainradio/index.md
- selfhosting/4get/index.md
- selfhosting/Gitea/index.md
- selfhosting/RustDesk/index.md
- selfhosting/Zabbix/index.md
- selfhosting/anonymousoverflow/index.md
- selfhosting/ansible/index.md
- selfhosting/apt-cacher/index.md
- selfhosting/bedrock/index.md
- selfhosting/borg/index.md
- selfhosting/borg_auto/index.md
- selfhosting/checkmk/index.md
- selfhosting/codimd/index.md
- selfhosting/composite/index.md
- selfhosting/cron/index.md
- selfhosting/cryptpad/index.md
- selfhosting/cyberchef/index.md
- selfhosting/db/index.md
- selfhosting/debianupgrade/index.md
- selfhosting/dillinger/index.md
- selfhosting/dozzle/index.md
- selfhosting/e4/index.md
- selfhosting/etherpad/index.md
- selfhosting/fail2banssh/index.md
- selfhosting/freshrss/index.md
- selfhosting/glpi/index.md
- selfhosting/gomez/index.md
- selfhosting/haproxy/index.md
- selfhosting/hatsh/index.md
- selfhosting/hls/index.md
- selfhosting/hmail/index.md
- selfhosting/hydrus/index.md
- selfhosting/invidious/index.md
- selfhosting/irc/index.md
- selfhosting/irc_tor/index.md
- selfhosting/jitsi/index.md
- selfhosting/kanboard/index.md
- selfhosting/kutt/index.md
- selfhosting/kvm/index.md
- selfhosting/lainsafe/index.md
- selfhosting/lc0/index.md
- selfhosting/librenms/index.md
- selfhosting/librex/index.md
- selfhosting/luks/index.md
- selfhosting/mail2/index.md
- selfhosting/matrix/index.md
- selfhosting/matrixnew/index.md
- selfhosting/minecraft/index.md
- selfhosting/motd/index.md
- selfhosting/mymind/index.md
- selfhosting/neko/index.md
- selfhosting/nextcloud/index.md
- selfhosting/nginx/index.md
- selfhosting/nginx_fail/index.md
- selfhosting/nginx_loadb/index.md
- selfhosting/nginx_p_mngr/index.md
- selfhosting/nitter/index.md
- selfhosting/observium/index.md
- selfhosting/openvpn/index.md
- selfhosting/ovpn_tor/index.md
- selfhosting/pcipassthrough2/index.md
- selfhosting/perlite/index.md
- selfhosting/pf_prox/index.md
- selfhosting/pf_vpn/index.md
- selfhosting/phpfilesafe/index.md
- selfhosting/pihole/index.md
- selfhosting/plainpad/index.md
- selfhosting/portainer/index.md
- selfhosting/portforwarding/index.md
- selfhosting/privatebin/index.md
- selfhosting/progra/index.md
- selfhosting/proxitok/index.md
- selfhosting/proxmox/index.md
- selfhosting/raid1disks/index.md
- selfhosting/rainloop/index.md
- selfhosting/rdp/index.md
- selfhosting/rss/index.md
- selfhosting/rsync/index.md
- selfhosting/safetwitch/index.md
- selfhosting/searx/index.md
- selfhosting/searx_docker/index.md
- selfhosting/searxng/index.md
- selfhosting/sharelatex/index.md
- selfhosting/snmp/index.md
- selfhosting/stablediffusion/index.md
- selfhosting/stablediffusion2/index.md
- selfhosting/surveillance/index.md
- selfhosting/teddit/index.md
- selfhosting/tf2srv/index.md
- selfhosting/thelounge/index.md
- selfhosting/tor_ssh_tunnel_port_forwarding/index.md
- selfhosting/tordns/index.md
- selfhosting/torproxy/index.md
- selfhosting/tpot/index.md
- selfhosting/unattendedupgrades/index.md
- selfhosting/uptimekuma/index.md
- selfhosting/virtual/index.md
- selfhosting/w0/index.md
- selfhosting/w1_dns/index.md
- selfhosting/w2_ad/index.md
- selfhosting/w3_users/index.md
- selfhosting/w5/index.md
- selfhosting/w6_ldaps/index.md
- selfhosting/w7/index.md
- selfhosting/watchtower/index.md
- selfhosting/wazuh/index.md
- selfhosting/whoogle/index.md
- selfhosting/wikiless/index.md
- selfhosting/wireguard/index.md
- selfhosting/wireguard_auto/index.md
- selfhosting/xmpp2024/index.md
- selfhosting/xrdp/index.md
- Hacking:
- hacking/index.md
- HackTheBox Writeups:
- Easy Boxes:
- hacking/Easy/0.md
- hacking/Easy/1.md
- hacking/Easy/10.md
- hacking/Easy/11.md
- hacking/Easy/12.md
- hacking/Easy/13.md
- hacking/Easy/14.md
- hacking/Easy/15.md
- hacking/Easy/16.md
- hacking/Easy/17.md
- hacking/Easy/18.md
- hacking/Easy/19.md
- hacking/Easy/2.md
- hacking/Easy/20.md
- hacking/Easy/21.md
- hacking/Easy/22.md
- hacking/Easy/23.md
- hacking/Easy/24.md
- hacking/Easy/25.md
- hacking/Easy/26.md
- hacking/Easy/27.md
- hacking/Easy/28.md
- hacking/Easy/29.md
- hacking/Easy/3.md
- hacking/Easy/30.md
- hacking/Easy/31.md
- hacking/Easy/32.md
- hacking/Easy/33.md
- hacking/Easy/34.md
- hacking/Easy/35.md
- hacking/Easy/36.md
- hacking/Easy/37.md
- hacking/Easy/38.md
- hacking/Easy/39.md
- hacking/Easy/4.md
- hacking/Easy/40.md
- hacking/Easy/41.md
- hacking/Easy/42.md
- hacking/Easy/43.md
- hacking/Easy/44.md
- hacking/Easy/45.md
- hacking/Easy/46.md
- hacking/Easy/47.md
- hacking/Easy/48.md
- hacking/Easy/49.md
- hacking/Easy/5.md
- hacking/Easy/50.md
- hacking/Easy/51.md
- hacking/Easy/52.md
- hacking/Easy/53.md
- hacking/Easy/54.md
- hacking/Easy/55.md
- hacking/Easy/56.md
- hacking/Easy/57.md
- hacking/Easy/58.md
- hacking/Easy/59.md
- hacking/Easy/6.md
- hacking/Easy/60.md
- hacking/Easy/61.md
- hacking/Easy/62.md
- hacking/Easy/63.md
- hacking/Easy/64.md
- hacking/Easy/65.md
- hacking/Easy/66.md
- hacking/Easy/67.md
- hacking/Easy/68.md
- hacking/Easy/69.md
- hacking/Easy/7.md
- hacking/Easy/70.md
- hacking/Easy/71.md
- hacking/Easy/8.md
- hacking/Easy/9.md
- Medium Boxes:
- hacking/Medium/0.md
- hacking/Medium/1.md
- hacking/Medium/10.md
- hacking/Medium/11.md
- hacking/Medium/12.md
- hacking/Medium/13.md
- hacking/Medium/14.md
- hacking/Medium/15.md
- hacking/Medium/16.md
- hacking/Medium/17.md
- hacking/Medium/18.md
- hacking/Medium/19.md
- hacking/Medium/2.md
- hacking/Medium/20.md
- hacking/Medium/21.md
- hacking/Medium/22.md
- hacking/Medium/23.md
- hacking/Medium/24.md
- hacking/Medium/25.md
- hacking/Medium/26.md
- hacking/Medium/27.md
- hacking/Medium/28.md
- hacking/Medium/29.md
- hacking/Medium/3.md
- hacking/Medium/30.md
- hacking/Medium/31.md
- hacking/Medium/32.md
- hacking/Medium/33.md
- hacking/Medium/34.md
- hacking/Medium/35.md
- hacking/Medium/36.md
- hacking/Medium/37.md
- hacking/Medium/38.md
- hacking/Medium/39.md
- hacking/Medium/4.md
- hacking/Medium/40.md
- hacking/Medium/41.md
- hacking/Medium/42.md
- hacking/Medium/43.md
- hacking/Medium/44.md
- hacking/Medium/45.md
- hacking/Medium/46.md
- hacking/Medium/47.md
- hacking/Medium/48.md
- hacking/Medium/49.md
- hacking/Medium/5.md
- hacking/Medium/50.md
- hacking/Medium/51.md
- hacking/Medium/52.md
- hacking/Medium/53.md
- hacking/Medium/54.md
- hacking/Medium/55.md
- hacking/Medium/56.md
- hacking/Medium/57.md
- hacking/Medium/58.md
- hacking/Medium/59.md
- hacking/Medium/6.md
- hacking/Medium/60.md
- hacking/Medium/61.md
- hacking/Medium/62.md
- hacking/Medium/63.md
- hacking/Medium/64.md
- hacking/Medium/65.md
- hacking/Medium/66.md
- hacking/Medium/67.md
- hacking/Medium/68.md
- hacking/Medium/7.md
- hacking/Medium/8.md
- hacking/Medium/9.md
- Hard Boxes:
- hacking/Hard/0.md
- hacking/Hard/1.md
- hacking/Hard/10.md
- hacking/Hard/11.md
- hacking/Hard/12.md
- hacking/Hard/13.md
- hacking/Hard/14.md
- hacking/Hard/15.md
- hacking/Hard/16.md
- hacking/Hard/17.md
- hacking/Hard/18.md
- hacking/Hard/19.md
- hacking/Hard/2.md
- hacking/Hard/20.md
- hacking/Hard/21.md
- hacking/Hard/22.md
- hacking/Hard/23.md
- hacking/Hard/24.md
- hacking/Hard/25.md
- hacking/Hard/26.md
- hacking/Hard/27.md
- hacking/Hard/28.md
- hacking/Hard/29.md
- hacking/Hard/3.md
- hacking/Hard/30.md
- hacking/Hard/31.md
- hacking/Hard/32.md
- hacking/Hard/33.md
- hacking/Hard/34.md
- hacking/Hard/35.md
- hacking/Hard/36.md
- hacking/Hard/37.md
- hacking/Hard/38.md
- hacking/Hard/39.md
- hacking/Hard/4.md
- hacking/Hard/5.md
- hacking/Hard/6.md
- hacking/Hard/7.md
- hacking/Hard/8.md
- hacking/Hard/9.md
- hacking/Hard/prg/9/linpeas.md
- Recurrent Tricks:
- hacking/Tools/0/index.md
- hacking/Tools/burp/index.md
- hacking/Tools/files/index.md
- hacking/Tools/sshtunnels/index.md
- hacking/Tools/xc/index.md
- Binary Exploitation Writeups:
- hacking/binexp.md
- Learning Assembly:
- hacking/asm/0.md
- hacking/asm/1.md
- hacking/asm/2.md
- hacking/asm/3.md
- hacking/asm/4.md
- hacking/asm/5.md
- hacking/asm/6.md
- hacking/asm/7.md
- hacking/0/0.md
- hacking/0/gdb.md
- hacking/0/ghidra.md
- hacking/0/pwntools.md
- hacking/1/0.md
- hacking/1/beleaf.md
- hacking/1/heli.md
- hacking/1/strings.md
- hacking/2/0.md
- hacking/2/bboi.md
- hacking/2/boi.md
- hacking/2/calc.md
- hacking/2/feed.md
- hacking/2/get.md
- hacking/2/hs.md
- hacking/2/just.md
- hacking/2/overf.md
- hacking/2/pilot.md
- hacking/2/pwn1.md
- hacking/2/pwn3.md
- hacking/2/shella.md
- hacking/2/shme.md
- hacking/2/speed.md
- hacking/2/svc.md
- hacking/2/vuln.md
- hacking/2/warm.md
- hacking/3/0.md
- hacking/3/h3.md
- hacking/3/prep.md
- hacking/3/tux.md
copyright: "Creative Commons Zero: [No Rights Reserved](opsec/runtheblog/index.md)"
extra_css:
- stylesheets/extra.css
plugins:
- privacy
- search
#markdown-extensions:
# - meta
repo_url: http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/blog-contributions
repo_name: nihilist/blog-contributions