<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Stupid Security Blog</title><link href="https://blog.xn--sb-lka.org/" rel="alternate"/><link href="https://blog.xn--sb-lka.org/feeds/all.atom.xml" rel="self"/><id>https://blog.xn--sb-lka.org/</id><updated>2026-04-02T00:00:00+02:00</updated><subtitle>A blog with random ramblings on internet security</subtitle><entry><title>Simple firewalld watcher</title><link href="https://blog.xn--sb-lka.org/simple-firewalld-watcher.html" rel="alternate"/><published>2026-04-02T00:00:00+02:00</published><updated>2026-04-02T00:00:00+02:00</updated><author><name>Nicolai Søborg</name></author><id>tag:blog.xn--sb-lka.org,2026-04-02:/simple-firewalld-watcher.html</id><summary type="html">&lt;p&gt;While doing HackTheBox, &lt;span class="caps"&gt;CTF&lt;/span&gt;&amp;#8217;s or similar stuff, I sometimes need a &lt;em&gt;reverse shell&lt;/em&gt; to connect back to my&amp;nbsp;computer.&lt;/p&gt;
&lt;p&gt;This is almost always using a &lt;span class="caps"&gt;VPN&lt;/span&gt;, so I don&amp;#8217;t have to think about &lt;span class="caps"&gt;NAT&lt;/span&gt;, firewall openings,&amp;nbsp;etc&lt;/p&gt;
&lt;p&gt;But more than once I&amp;#8217;ve struggled to get a rev …&lt;/p&gt;</summary><content type="html">&lt;p&gt;While doing HackTheBox, &lt;span class="caps"&gt;CTF&lt;/span&gt;&amp;#8217;s or similar stuff, I sometimes need a &lt;em&gt;reverse shell&lt;/em&gt; to connect back to my&amp;nbsp;computer.&lt;/p&gt;
&lt;p&gt;This is almost always using a &lt;span class="caps"&gt;VPN&lt;/span&gt;, so I don&amp;#8217;t have to think about &lt;span class="caps"&gt;NAT&lt;/span&gt;, firewall openings,&amp;nbsp;etc&lt;/p&gt;
&lt;p&gt;But more than once I&amp;#8217;ve struggled to get a rev shell to connect back. Why? My computer has a local firewall&amp;nbsp;🤦&lt;/p&gt;
&lt;p&gt;The solution is&amp;nbsp;simple: &lt;code&gt;sudo systemctl stop firewalld.service&lt;/code&gt; - but I actually want firewalld running most of the time, so this is not a good long-term&amp;nbsp;solution.&lt;/p&gt;
&lt;p&gt;Instead wouldn&amp;#8217;t it be nice to get a notification&amp;nbsp;whenever &lt;code&gt;firewalld&lt;/code&gt; blocked something, to quickly diagnose the&amp;nbsp;problem?&lt;/p&gt;
&lt;p&gt;&lt;img alt="firewalld alert using script below" src="https://blog.xn--sb-lka.org/firewalld-alert.png"&gt;&lt;/p&gt;
&lt;p&gt;We can do that by first&amp;nbsp;configuring &lt;code&gt;firewalld&lt;/code&gt; to log all blocked&amp;nbsp;connections:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--set-log-denied&lt;span class="o"&gt;=&lt;/span&gt;all&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# or: unicast, broadcast, multicast&lt;/span&gt;
firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--runtime-to-permanent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By&amp;nbsp;watching &lt;code&gt;journalctl&lt;/code&gt; &lt;sup&gt;fun-fact: users aren&amp;#8217;t allowed to&amp;nbsp;read &lt;code&gt;dmesg&lt;/code&gt; directly (&lt;em&gt;why is that??&lt;/em&gt;),&amp;nbsp;but &lt;code&gt;journalctl --dmesg&lt;/code&gt; exposes it&lt;/sup&gt; for &lt;span class="caps"&gt;REJECT&lt;/span&gt; log entries, we can&amp;nbsp;use &lt;code&gt;notify-send&lt;/code&gt; to spawn a &lt;span class="caps"&gt;GUI&lt;/span&gt;&amp;nbsp;alert!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;journalctl&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt; &lt;/span&gt;--dmesg&lt;span class="w"&gt; &lt;/span&gt;--grep&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;FINAL_REJECT|REJECT&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-oP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SRC=\K\S+&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;dpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-oP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DPT=\K\d+&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;notify-send&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;network-error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;firewalld blocked&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;src=&lt;/span&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="s2"&gt; port=&lt;/span&gt;&lt;span class="nv"&gt;$dpt&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The above is a long-running process which will &amp;#8220;hang&amp;#8221; your terminal. If you background it, it will still be a child process, so it stops when your terminal&amp;nbsp;dies.&lt;/p&gt;
&lt;p&gt;We can solve this&amp;nbsp;by &lt;code&gt;disown&lt;/code&gt;&lt;span class="quo"&gt;&amp;#8216;&lt;/span&gt;ing the process, but now we also need to make sure we don&amp;#8217;t end up spawning multiple processes that monitors the same thing. One ugly hack is simply&amp;nbsp;to &lt;code&gt;pgrep&lt;/code&gt; the somewhat unique string, &lt;em&gt;if it works, it works&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The full script to put in&amp;nbsp;your &lt;code&gt;~/.*rc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;firewall-watcher&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--get-log-denied&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;firewalld log-denied is not set to &amp;#39;all&amp;#39;.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Please run: firewall-cmd --set-log-denied=all&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;pgrep&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;journalctl.*REJECT&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;journalctl&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt; &lt;/span&gt;--dmesg&lt;span class="w"&gt; &lt;/span&gt;--grep&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;REJECT&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-oP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SRC=\K\S+&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;dpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-oP&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DPT=\K\d+&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;notify-send&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;network-error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;firewalld blocked&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;src=&lt;/span&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="s2"&gt; port=&lt;/span&gt;&lt;span class="nv"&gt;$dpt&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;disown&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Security"/></entry><entry><title>DTU Studiestarten</title><link href="https://blog.xn--sb-lka.org/dtu-studiestarten-da.html" rel="alternate"/><published>2019-01-01T00:00:00+01:00</published><updated>2019-01-01T00:00:00+01:00</updated><author><name>Nicolai Søborg</name></author><id>tag:blog.xn--sb-lka.org,2019-01-01:/dtu-studiestarten-da.html</id><summary type="html">&lt;p&gt;En liste af tools jeg har lavet til &lt;span class="caps"&gt;DTU&lt;/span&gt;&amp;nbsp;studiestarten:&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://badger.xn--sb-lka.org/"&gt;Badger&amp;nbsp;v3&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En webapp til at lave badges (6 stk per A4).
Lavet til at man kan lave ét &amp;#8220;tema badge&amp;#8221; og så lave en masse kopier, hvor man skifter navnet i&amp;nbsp;midten.&lt;/p&gt;
&lt;p&gt;(En ældre version findes her: &lt;a href="https://nicolaisoeborg.github.io/badger/"&gt;Badger v1 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;En liste af tools jeg har lavet til &lt;span class="caps"&gt;DTU&lt;/span&gt;&amp;nbsp;studiestarten:&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://badger.xn--sb-lka.org/"&gt;Badger&amp;nbsp;v3&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En webapp til at lave badges (6 stk per A4).
Lavet til at man kan lave ét &amp;#8220;tema badge&amp;#8221; og så lave en masse kopier, hvor man skifter navnet i&amp;nbsp;midten.&lt;/p&gt;
&lt;p&gt;(En ældre version findes her: &lt;a href="https://nicolaisoeborg.github.io/badger/"&gt;Badger v1&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://bedstforalle.xn--sb-lka.org/"&gt;Er Det Bedst For Alle&amp;nbsp;?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Er det bedst for alle hvis vi tager een sidste øl? Lets find&amp;nbsp;out!&lt;/p&gt;
&lt;h2&gt;&lt;a href="https://github.com/NicolaiSoeborg/eduroam"&gt;Eduroam without installer (&lt;span class="caps"&gt;DTU&lt;/span&gt;&amp;nbsp;guide)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Undgå kode-eksekvering for at komme på&amp;nbsp;nettet.&lt;/p&gt;</content><category term="misc"/></entry></feed>