<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Maverick Kaung</title>
    <link>https://www.mavjs.org/</link>
      <atom:link href="https://www.mavjs.org/index.xml" rel="self" type="application/rss+xml" />
    <description>Maverick Kaung</description>
    <generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Mon, 07 Nov 2022 17:24:26 +0200</lastBuildDate>
    <image>
      <url>https://www.mavjs.org/media/icon_hu268191f709183466a438488e2ba784b7_1058813_512x512_fill_lanczos_center_3.png</url>
      <title>Maverick Kaung</title>
      <link>https://www.mavjs.org/</link>
    </image>
    
    <item>
      <title>Automatic backup with restic and systemd service</title>
      <link>https://www.mavjs.org/post/automatic-backup-restic-systemd-service/</link>
      <pubDate>Mon, 07 Nov 2022 17:24:26 +0200</pubDate>
      <guid>https://www.mavjs.org/post/automatic-backup-restic-systemd-service/</guid>
      <description>&lt;p&gt;Ever since I read the &lt;a href=&#34;https://fedoramagazine.org/automate-backups-with-restic-and-systemd/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Automate backups with restic and systemd&lt;/a&gt; on &lt;a href=&#34;https://fedoramagazine.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora Magazine&lt;/a&gt;, I have been meaning to practice the &lt;code&gt;3-2-1&lt;/code&gt; backup strategy.&lt;/p&gt;
&lt;p&gt;For a while, that did not come to fruition. Ultimately, that was down to laziness first of all; secondly, figuring out how and where the backups should be was also another struggle.&lt;/p&gt;
&lt;p&gt;However, I finally sat down one weekend and figured out the works.&lt;/p&gt;
&lt;h2 id=&#34;what-is-the-3-2-1-backup-strategy&#34;&gt;What is the &lt;code&gt;3-2-1&lt;/code&gt; backup strategy?&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;3-2-1&lt;/code&gt; strategy boils down to&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; copies of data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; different media&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; copy being off-site&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tutorial in the Fedora Magazine showcased how one can use &lt;code&gt;restic&lt;/code&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; and trigger the backup periodically via a systemd service unit file, instead of using cron. This also gave me the opportunity to learn a bit more about creating systemd service and timer units, so I decided to follow this.&lt;/p&gt;
&lt;p&gt;However, the tutorial made use of an offsite backup solution provided by &lt;a href=&#34;https://www.backblaze.com/b2/cloud-storage.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;BackBlaze B2 Cloud storage&lt;/a&gt;. That solution was not one I was comfortable using just yet.&lt;/p&gt;
&lt;p&gt;Mainly due to not wanting to use a service that did not provide Unix/Linux native tools, such as &lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;rsync&lt;/code&gt; and or &lt;code&gt;sftp&lt;/code&gt; capabilities.&lt;/p&gt;
&lt;p&gt;Therefore, I came up with these requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 x local LAN server backup&lt;/li&gt;
&lt;li&gt;1 x local external drive backup&lt;/li&gt;
&lt;li&gt;1 x Unix/Linux native tool capable offsite backup&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lan-server-backup&#34;&gt;LAN server backup&lt;/h3&gt;
&lt;p&gt;This one was pretty easy, I already had a desktop computer which I use as a Virtual Machine host, that was connected via &lt;a href=&#34;https://tailscale.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;tailscale&lt;/a&gt; and had a lot of disk space using traditional hard disks.&lt;/p&gt;
&lt;p&gt;So all I had to do was initialise a folder on this host via restic using SFTP as described in: &lt;a href=&#34;https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html#sftp&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html#sftp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Problem #1 solved!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;local-drive-backup&#34;&gt;Local drive backup&lt;/h3&gt;
&lt;p&gt;My laptop is connected to a dock and has a couple of USB-C. I also had a couple of external storage drives, especially the Samsung Portable SSD T7 - 1TB drive.&lt;/p&gt;
&lt;p&gt;So all I had to do was make sure that the backup service runs &lt;code&gt;if and only if&lt;/code&gt; this drive was mounted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Problem #2 solved!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In fact, this already in some way, satisfies #1 + #2 of the &lt;code&gt;3-2-1&lt;/code&gt; strategy.&lt;/p&gt;
&lt;p&gt;However, I still needed to make the similar copy backed up offsite. As per my requirements #3, BackBlaze B2 was off the list, sadly. 🤕&lt;/p&gt;
&lt;p&gt;A while back, I read an article titled &lt;a href=&#34;https://console.dev/interviews/rsync-john-kozubik/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Interview with John Kozubkik&lt;/a&gt; - John is the CEO of rsync.net which is a cloud storage in the form of a UNIX filesytem available over SSH. Ever since then I have been meaning to use this service somehow.&lt;/p&gt;
&lt;p&gt;So for my #3 requirement, I researched using rsync.net and luckily enough, they have a special pricing for restic - &lt;a href=&#34;https://rsync.net/products/restic.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://rsync.net/products/restic.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not only that what makes rsync.net interesting is that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;there is no app or API - it simply gives you an empty UNIX filesystem accessible with any SSH tool.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;P-e-r-f-e-c-t!&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s piece the things together.&lt;/p&gt;
&lt;h2 id=&#34;systemd-service-and-timer-units&#34;&gt;Systemd service and timer units&lt;/h2&gt;
&lt;p&gt;Systemd services (ends in &lt;code&gt;.service&lt;/code&gt;) can be triggered periodically by Systemd timer units (ends in &lt;code&gt;.timer&lt;/code&gt;). This separates the actual command / script that does the work with the timer configuration. I consider this to be neat!&lt;/p&gt;
&lt;p&gt;Furthermore, as pointed out by the great ArchLinux wiki&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, the benefits are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jobs can be easily started independently of their timers. This simplifies debugging.&lt;/li&gt;
&lt;li&gt;Each job can be configured to run in a specific environment (see systemd.exec(5)).&lt;/li&gt;
&lt;li&gt;Jobs can be attached to cgroups.&lt;/li&gt;
&lt;li&gt;Jobs can be set up to depend on other systemd units.&lt;/li&gt;
&lt;li&gt;Jobs are logged in the systemd journal for easy debugging.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So how would this look like in practice?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say that your backup command is as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;restic backup /home/user/secret-stuff &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --repo&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;sftp:backup1-host.rsync.net:backups &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --verbose &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --one-file-system &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/home/user/blah 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The systemd service file, let&amp;rsquo;s call it, &lt;code&gt;offsite-backup.service&lt;/code&gt; would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Offsite backup with restic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Restart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;on-failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;RestartSec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;restic unlock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;restic backup /home/user/secret-stuff \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --repo=sftp:backup1-host.rsync.net:backups \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --verbose \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --one-file-system \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --exclude=/home/user/blah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ExecStopPost&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;restic unlock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;offsite-backup.timer&lt;/code&gt; would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Offsite backup with restic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Timer]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;OnCalendar&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;daily UTC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Persistent&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;RandomizedDelaySec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;timers.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Repeat the above steps similarly for different configurations for different backup medium. For example, to backup locally to an external drive &lt;code&gt;if and only if&lt;/code&gt; it is mounted, I have a service like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Local Restic backup service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ConditionPathIsMountPoint&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/run/media/user/BackupDriveName/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Restart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;on-failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;RestartSec&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;restic backup /home/user/secret-stuff \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --repo=sftp:backup1-host.rsync.net:backups \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --verbose \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --one-file-system \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    --exclude=/home/user/blah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you are running the services for yourself under your own user, you can put them in &lt;code&gt;~/.config/systemd/user/&lt;/code&gt; folder, otherwise it will have to go into &lt;code&gt;/etc/systemd/system/&lt;/code&gt; or system-wide user units in &lt;code&gt;/etc/systemd/user/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After that first reload the systemd daemon so that it knows there are new services available.
&lt;strong&gt;Note:&lt;/strong&gt; For user services include the &lt;code&gt;--user&lt;/code&gt; argument after &lt;code&gt;systemctl&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enable the timer unit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable --now offsite-backup.timer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To check when is the next scheduled run of your service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl list-timers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💯 🔥 Now you have an automatic backup job that runs according to the schedule you have setup, meaning you can sleep soundly while it does its job. 😄 🎉&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.veeam.com/blog/321-backup-rule.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.veeam.com/blog/321-backup-rule.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://restic.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://restic.net/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.archlinux.org/title/systemd/Timers#Benefits&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://wiki.archlinux.org/title/systemd/Timers#Benefits&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Blog setup with Hugo, Github and Netlify</title>
      <link>https://www.mavjs.org/post/blog-setup-hugo-github-netlify/</link>
      <pubDate>Mon, 31 Oct 2022 20:29:34 +0100</pubDate>
      <guid>https://www.mavjs.org/post/blog-setup-hugo-github-netlify/</guid>
      <description>&lt;p&gt;I have had this website / blog (going forward it shall be, &lt;em&gt;the&lt;/em&gt; blog) on this current setup since about 2016, it has not always been a smooth ride. Always tinkering, always messing around with it when I do feel like it. However, I have enjoyed writing them.&lt;/p&gt;
&lt;p&gt;The oldest post&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; was first written back in 2011 on blogspot.com (called: &lt;strong&gt;FLOSS Bytes&lt;/strong&gt;) , right around the time I got into Linux&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; and open source communities. However, I wanted to move away from the clunky user interface of blogspot, which also included, as far as I remember, very difficult in theming. I was also very sold on the idea of a static site generator and hosting my own website, back then.&lt;/p&gt;
&lt;p&gt;Finally, the popularity of Jeklly based Github pages and other static site generator tools like &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt; pushed me to pursue that route. The only requirement back then was for the setup to use a static site generator and not a content management system (CMS)&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h1 id=&#34;overview-of-setup&#34;&gt;Overview of setup&lt;/h1&gt;
&lt;p&gt;I write my blog posts in &lt;a href=&#34;https://daringfireball.net/projects/markdown/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Markdown&lt;/a&gt; using a text editor. This allows me to just concentrate on my writing and not get distracted by the view of the contents being rendered.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/blog-setup-flow.png&#34; alt=&#34;A simple flow diagram of how this blog is built and served to the internet&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;The &lt;code&gt;Computer &amp;amp; File System&lt;/code&gt; on the far left represents the computer where I write my posts on, be that my laptop or desktop, or even on Github itself. I write the content and make sure any other contents like pictures are then stored in the right folders.&lt;/p&gt;
&lt;p&gt;Once I am somewhat satisfied with my work, I push out the contents to my &lt;a href=&#34;https://git-scm.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Git&lt;/a&gt; repository which is hosted on [Github][https://github.com/]. This allows me to revert/rollback my changes if I ever need to, create different branches for the contents or theme changes in its own branches in order for the main blog on &lt;code&gt;mavjs.org&lt;/code&gt; to not be effected. You could call this modern day DevOps style blogging. 😄&lt;/p&gt;
&lt;p&gt;When the contents get into git, pretty much instantly, Netlify app gets notified to build the site, and then makes the resulting built contents available on &lt;code&gt;mavjs.org&lt;/code&gt; using its content delivery network. Netlify internally uses a Ubuntu Linux container with hugo in the background to create the build.&lt;/p&gt;
&lt;p&gt;One of the advantages of using Git and its branching model, coupled with a platform like Netlify is that, because this blog was written in a different working branch once the work in progress contents are pushed to it, Netlify will create a preview of the content in its own URL. This way, you can use multi-branch model of Git to create multiple parallel experiments or writing content, while checking how the visuals would look in its final form.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/blog-prod-deploy-preview.png&#34; alt=&#34;Netlify&amp;#39;s dashboard view showing sections for production and deploy previews&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;



















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/blog-deploy-preview.png&#34; alt=&#34;A deploy preview&amp;#39;s detail page which allows the user to browse to a preview website&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Once you click on the &lt;code&gt;Open deploy preview&lt;/code&gt; button, it takes you to a URL in a following format: &lt;code&gt;https://deploy-preview-&amp;lt;pull request number&amp;gt;--&amp;lt;project-name&amp;gt;.netlify.app/&lt;/code&gt; and you can browse the contents as you would on the main live website. 😊&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/blog-preview.png&#34; alt=&#34;The view of the built and rendered preview website&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;What is even better about this setup? It costs nothing, literally 0 EUR were spent on this setup, other than making accounts and using the free tier of each service. 😆 👍 👌&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://mavjs.blogspot.com/2011/12/hello-world_4159.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://mavjs.blogspot.com/2011/12/hello-world_4159.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Of course, that also invovled lots of Linux distribution (or as the cool kids say: distro) hopping from Ubuntu to Arch Linux, back to Ubuntu and then finally landing on Fedora since then. 😆&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com/en-gb/learning/performance/static-site-generator/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.cloudflare.com/en-gb/learning/performance/static-site-generator/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>pushnotifier</title>
      <link>https://www.mavjs.org/project/pushnotifier/</link>
      <pubDate>Sat, 08 Oct 2022 15:10:54 +0200</pubDate>
      <guid>https://www.mavjs.org/project/pushnotifier/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Using Podman pods Instead of docker-compose</title>
      <link>https://www.mavjs.org/post/podman-pods-instead-of-docker-compose/</link>
      <pubDate>Mon, 03 Oct 2022 17:18:46 +0200</pubDate>
      <guid>https://www.mavjs.org/post/podman-pods-instead-of-docker-compose/</guid>
      <description>&lt;p&gt;Nowadays, it is common for developers to provide their (web) application in container for ease of setup. These applications usually consists of multiple inter-connecting parts. For example, the main application interacting with a database to store, read and write data.&lt;/p&gt;
&lt;p&gt;To make the experience of setting up databases, developers also provide ways to bring them up automatically. One of the most used and well-known ways of doing this is to provide a &lt;a href=&#34;https://www.docker.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Docker&lt;/a&gt; compose configuration for the application and its required services.&lt;/p&gt;
&lt;h2 id=&#34;what-is-docker-compose&#34;&gt;What is Docker Compose?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;how-does-a-docker-compose-configuration-look-like&#34;&gt;How does a Docker Compose configuration look like?&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-YAML&#34; data-lang=&#34;YAML&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3.9&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# optional since v1.27.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;web&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8000:5000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;.:/code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;logvolume01:/var/log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;redis&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;logvolume01&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;While in the same directory as this configuration file (named: &lt;code&gt;docker-compose.yaml&lt;/code&gt;), you can bring up these applications by executing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When &lt;a href=&#34;https://podman.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;podman&lt;/a&gt; came out, there was a tool created later on called &lt;a href=&#34;https://github.com/containers/podman-compose&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;podman-compose&lt;/code&gt;&lt;/a&gt; to help ease transition from &lt;code&gt;docker&lt;/code&gt; &amp;amp; &lt;code&gt;docker-compose&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-is-podman&#34;&gt;What is Podman?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Podman is a daemonless, open source, Linux native tool designed to make it easy to find, run, build, share and deploy applications using Open Containers Initiative (OCI) Containers and Container Images. Podman provides a command line interface (CLI) familiar to anyone who has used the Docker Container Engine. Most users can simply alias Docker to Podman (alias docker=podman) without any problems.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As mentioned above, &lt;code&gt;podman&lt;/code&gt; was easily usable for people already familiar with &lt;code&gt;docker&lt;/code&gt; without having to re-learn all the command arguments.&lt;/p&gt;
&lt;p&gt;I have used &lt;code&gt;podman-compose&lt;/code&gt; before, however, while looking at an application recently, I wanted to learn to use the more native solution with &lt;code&gt;podman&lt;/code&gt;. Thus, learning about how I could make use of &lt;code&gt;podman pod&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-is-a-pod&#34;&gt;What is a Pod?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod&amp;rsquo;s contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific &amp;ldquo;logical host&amp;rdquo;: it contains one or more application containers which are relatively tightly coupled. In non-cloud contexts, applications executed on the same physical or virtual machine are analogous to cloud applications executed on the same logical host.&lt;/p&gt;
&lt;p&gt;A Pod is similar to a set of containers with shared namespaces and shared filesystem volumes.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking again at the example Compose configuration, you will notice that the port from the container &lt;code&gt;5000&lt;/code&gt; is forwarded to the host&amp;rsquo;s port, i.e., &lt;code&gt;8000&lt;/code&gt;, meaning ports in Docker are mapped from containers. This is also true for normal containers in Podman as well. However, things work differently in a pod, as stated above about a Pod.&lt;/p&gt;
&lt;p&gt;Therefore, for a pod the port is mapped from it, rather than from a container directly. Thus, when you create a pod you also declare the port(s) you want to map to your host.&lt;/p&gt;
&lt;p&gt;To understand this better, let&amp;rsquo;s look at the application I used: &lt;a href=&#34;https://miniflux.app&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;miniflux&lt;/a&gt; - a minimalist and opinionated feed reader, to convert their provided &lt;a href=&#34;https://miniflux.app/docs/installation.html#docker&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;docker installation&lt;/a&gt; method in &lt;code&gt;docker-compose&lt;/code&gt; to using Podman pods.&lt;/p&gt;
&lt;p&gt;The Docker compose configuration for miniflux could look like below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;3.4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;miniflux&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;miniflux/miniflux:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;80:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;RUN_MIGRATIONS=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;CREATE_ADMIN=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;ADMIN_USERNAME=admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;ADMIN_PASSWORD=test123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;healthcheck&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;test&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CMD&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/bin/miniflux&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-healthcheck&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;postgres:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;POSTGRES_USER=miniflux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;POSTGRES_PASSWORD=secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;miniflux-db:/var/lib/postgresql/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;healthcheck&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;test&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CMD&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pg_isready&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-U&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;miniflux&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;interval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;start_period&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;30s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;miniflux-db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Breaking it down, you will notice that there are 2 containers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the application: &lt;code&gt;miniflux/miniflux&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;the postgres database: &lt;code&gt;postgres&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means we will have to pull the 2 images to our local registry:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman pull ghcr.io/miniflux/miniflux:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman pull docker.io/library/postgres:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The only port mapped is &lt;code&gt;8080&lt;/code&gt; from the &lt;code&gt;miniflux&lt;/code&gt; container to port &lt;code&gt;80&lt;/code&gt; on the host. Therefore, creating a pod would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman pod create --name minifluxapp -p 80:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You will also notice that the &lt;code&gt;postgres&lt;/code&gt; container uses a named volume, we will replicate that in podman by:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman volume create miniflux-db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since the &lt;code&gt;miniflux&lt;/code&gt; container depends on &lt;code&gt;db&lt;/code&gt;, we will first create the &lt;code&gt;db&lt;/code&gt; container inside the pod as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman run --name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;db -d --restart always --pod&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;minifluxapp &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--volume&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;miniflux-db:/var/lib/postgresql/data &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e POSTGRES_USER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;miniflux-db-admin&amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e POSTGRES_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;miniflux-db-password&amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--health-start-period&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;30s &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--health-interval&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;10s &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--health-cmd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CMD-SHELL pg_isready -U miniflux&amp;#34;&lt;/span&gt; docker.io/library/postgres:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, the &lt;code&gt;miniflux&lt;/code&gt; container itself:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman run --name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;miniflux -d --restart&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;always --pod&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;minifluxapp &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e DATABASE_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;postgres://&amp;lt;db-user&amp;gt;:&amp;lt;db-pass&amp;gt;@localhost/miniflux?sslmode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;disable &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e RUN_MIGRATIONS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e CREATE_ADMIN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e ADMIN_USERNAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;admin-user&amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-e ADMIN_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;admin-pass&amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--health-cmd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CMD-SHELL /usr/bin/miniflux -healthcheck auto&amp;#34;&lt;/span&gt; ghcr.io/miniflux/miniflux:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If all goes well, your containers should come up inside the pod, and the application is accessible via: &lt;code&gt;http://127.0.0.1&lt;/code&gt; or &lt;code&gt;http://localhost&lt;/code&gt;.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/miniflux-pod-running.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;From here, you could either generate a kubernetes pod definition&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; to make it more reusable or systemd unit&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; files to go together with your system administration.&lt;/p&gt;
&lt;h3 id=&#34;pod-definition&#34;&gt;pod definition&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman generate kube minifluxapp &amp;gt;&amp;gt; minifluxapp.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;systemd-units&#34;&gt;systemd units&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ podman generate systemd &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--container-prefix minifluxapp &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--pod-prefix minifluxpod &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--name minifluxapp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.docker.com/compose/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.docker.com/compose/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.podman.io/en/latest/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.podman.io/en/latest/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://kubernetes.io/docs/concepts/workloads/pods/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.podman.io/en/latest/markdown/podman-kube-generate.1.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.podman.io/en/latest/markdown/podman-kube-generate.1.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.podman.io/en/latest/markdown/podman-generate-systemd.1.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.podman.io/en/latest/markdown/podman-generate-systemd.1.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>First time experience with Atomic Red Team</title>
      <link>https://www.mavjs.org/post/experience-atomic-red-team/</link>
      <pubDate>Fri, 29 Oct 2021 19:08:24 +0200</pubDate>
      <guid>https://www.mavjs.org/post/experience-atomic-red-team/</guid>
      <description>&lt;h1 id=&#34;what-is-atomic-red-team&#34;&gt;What is Atomic Red Team?&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Atomic Red Team™ is a library of simple tests mapped to the MITRE ATT&amp;amp;CK® framework that every security team can execute to test their defenses. Tests are focused, have few dependencies, and are defined in a structured format that can be used by automation frameworks.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; - RedCanaryCo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Atomic Red Team is the main testing repository in the Atomic Family, created by the esteemed folks from Red Canary.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; The Atomic Family also provides a couple of utility tools to help execute the tests, namely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Invoke-AtomicRedTeam - A PowerShell-based framework for developing and executing atomic tests.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;AtomicTestHarnesses - A PowerShell module for executing many variations of an attack technique at once.&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Chain Reactor - A tool for testing detection and response coverage on Linux machines.&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post it will only be about Atomic Red Team - the library of tests &amp;amp; &lt;code&gt;Invoke-AtomicRedTeam&lt;/code&gt; - the powershell framework to run the tests.&lt;/p&gt;
&lt;h2 id=&#34;security-monitoring-and-role-of-testing-defenses&#34;&gt;Security Monitoring and role of testing defenses&lt;/h2&gt;
&lt;p&gt;Security monitoring involves collection and analysis of information to detect suspicious behaviour and or unauthorised system changes on an organization&amp;rsquo;s network. This includes defining what types of behaviour and changes should trigger (an) alert(s), and what actions are to be taken.&lt;/p&gt;
&lt;p&gt;Think of it this way, just because an organization has put up gates around the building and also have guards, does not mean other essential entrances are without locks. There would still be regular maintenance on the physical structures of the gates, door locks, reviewing of policies and background checks of guards, etc.&lt;/p&gt;
&lt;p&gt;Similarly here, just because there are network and host security monitoring setup with triggers and actions for alerts defined, the work does not stop here. The organization will have to stay up to date with new vulnerabilities, techniques and regularly reassess whether those triggers and or actions are enough.&lt;/p&gt;
&lt;p&gt;This is where a test framework like Atomic Red Team comes in, especially, for organizations that cannot spend a lot of resources around research on vulnerabilities and techniques, can make use of such a test framework to help in developing more security monitoring alert triggers, use cases or to create tests for already deployed triggers to make sure those work as intended regularly.&lt;/p&gt;
&lt;h1 id=&#34;lab-overview&#34;&gt;Lab Overview&lt;/h1&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/lab-example.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;pfSense acts as the router and the firewall - rules are set to disallow communication with the Internet, unless explicitly allowed.&lt;/li&gt;
&lt;li&gt;Windows Server Domain Controller provides DHCP and DNS for internal domain.&lt;/li&gt;
&lt;li&gt;RHEL 8 server running Splunk 8 - for centralised logging.&lt;/li&gt;
&lt;li&gt;Fedora 34 client as administrator workstation - allowed to connect to the Internet. Main test execution management platform.&lt;/li&gt;
&lt;li&gt;Windows 10 client - main test execution host.


&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;div&gt;
    For this test, an existing lab was reused, which is closed off of from the Internet. This may not have been the most convenient setup as Atomic Red Team downloads certain scripts from the repo for execution, thus not all tests might run properly.
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;setting-up-pre-requisites&#34;&gt;Setting up pre-requisites&lt;/h1&gt;
&lt;p&gt;To execute tests remotely from a Linux machine (which was done here), it requires PowerShell core to be installed.&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&#34;setting-up-openssh-remoting&#34;&gt;Setting up openssh remoting&lt;/h2&gt;
&lt;p&gt;OpenSSH&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt; remoting feature now built-in to Windows can also be used here. This feature is available in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Windows Server 2019&lt;/li&gt;
&lt;li&gt;Windows Server 2022&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Steps to enable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click Windows Icon&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Apps &amp;gt; Apps &amp;amp; Features &amp;gt; Optional Features&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Find &lt;code&gt;OpenSSH Server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To connect to the machine, execute:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh username@machine-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;div&gt;
    &lt;p&gt;From observation, a machine that is joined to a domain (other than &lt;code&gt;WORKGROUP&lt;/code&gt;), the way to connect is slightly different. Like so:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ssh domain\\username@machine-ip
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;pswsman-module-for-winrm-psremoting-on-linux&#34;&gt;PSWSMan module for WinRM PSRemoting on Linux&lt;/h2&gt;
&lt;p&gt;

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;div&gt;
    In this test, WinRM remoting was used as the author encountered a problem with using the SSH remoting feature. It may have something to do with passing in the domain with the username and &lt;code&gt;New-PSSession&lt;/code&gt; not being happy about it.
Although, it works if using plain old &lt;code&gt;ssh&lt;/code&gt; command as seen above.
  &lt;/div&gt;
&lt;/div&gt;

To use WinRM remoting feature on Linux, &lt;code&gt;PSWSMan&lt;/code&gt; module needs to be installed.&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;To do so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo pwsh -Command &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Install-Module -Name PSWSMan&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo pwsh -Command &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Install-WSMan&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once this is out of the way, a session variable in a PowerShell instance that points to the test execution machine can be created, and start the Atomic Red Team tests.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Setting a session in PowerShell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PS&amp;gt; $sess = New-PSSession -ComputerName testexecutionmachine -Credentials domain\username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;div&gt;
    &lt;p&gt;If SSH remoting worked, a session can be created as follows:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  PS&amp;gt; $sess = New-PSSession -HostName testexecutionmachine -UserName username
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h1 id=&#34;test-execution---the-real-deal&#34;&gt;Test Execution - the real deal&lt;/h1&gt;
&lt;p&gt;First install the Execution Framework (&lt;code&gt;Invoke-AtomicTest&lt;/code&gt;) and Atomics folder on the test execution management platform:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  IEX (IWR &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://raw.githubusercontent.com/redcanaryco/invoke-atomicredteam/master/install-atomicredteam.ps1&amp;#39;&lt;/span&gt; -UseBasicParsing);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Install-AtomicRedTeam -getAtomics
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;

&lt;div class=&#34;alert alert-note&#34;&gt;
  &lt;div&gt;
    The imported &lt;code&gt;Invoke-AtomicTest&lt;/code&gt; module will live as long as the current PowerShell session is alive. Tp load the module on startup, it needs to be set in the &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PowerShell profile&lt;/a&gt;.
  &lt;/div&gt;
&lt;/div&gt;

Once installed, it is time to rock-n-roll.&lt;/p&gt;
&lt;p&gt;

&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;div&gt;
    The screenshots below are made on a Windows machine, as PowerShell does not seem to display all info when calling via &lt;code&gt;-ShowDetails&lt;/code&gt; argument on a Linux machine.
  &lt;/div&gt;
&lt;/div&gt;

However, here are a few commands to check out the library contents:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PS&amp;gt; Invoke-AtomicTest All -ShowDetailsBrief
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/invoke-atomictest-example1.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;To know the full details of all the tests related to &lt;strong&gt;T1003 - OS Credential Dumping&lt;/strong&gt;&lt;sup id=&#34;fnref:9&#34;&gt;&lt;a href=&#34;#fn:9&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;9&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PS&amp;gt; Invoke-AtomicTest T1003 -ShowDetails
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/invoke-atomictest-example2.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;From the details above, it shows that there are multiple test cases associated with &lt;strong&gt;T1003&lt;/strong&gt;, and it also notes the dependencies for running the test. So let&amp;rsquo;s get the dependency for test number #2 - Credential Dumping with NPPSpy.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PS&amp;gt; Invoke-AtomicTest T1003 -TestNumbers 2 -GetPrereqs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;

















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/invoke-atomictest-example3.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;



&lt;div class=&#34;alert alert-warning&#34;&gt;
  &lt;div&gt;
    In the above figure, the downloading of the prerequisite dependecy failed, as the machine is not allowed to connect to the Internet.
  &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;After transferring over the dependecy file into &lt;code&gt;C:\Users\&amp;lt;username&amp;gt;\AppData\Local\Temp&lt;/code&gt;, it is finally good to run the test again.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Executing it remotely now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PS&amp;gt; Invoke-AtomicTest T1003 -Session $sess -TestNumbers 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It will do it&amp;rsquo;s magic in the background, and let the user know what needs to be done next:


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/invoke-atomictest-example4.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As recommended, log out and log back in, and voilà! Credentials were dumped:


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/invoke-atomictest-example5.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Once the tests are done, it is time to clean it up. There is also an argument to do so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PS&amp;gt; Invoke-AtomicTest T1003 -Session $sess -TestNumbers 2 -Cleanp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once the clean-up command runs, it will delete the file with credentials at &lt;code&gt;C:\NPPSpy.txt&lt;/code&gt; and the dll which was copied to &lt;code&gt;C:\Windows\System32\NPPSpy.dll&lt;/code&gt;:


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/invoke-atomictest-example6.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id=&#34;summary&#34;&gt;Summary&lt;/h1&gt;
&lt;p&gt;If it were not for a roundabout way of doing things and just running it on a single VM setup with Internet access allowed, it should have been a bit more smooth sailing.
However, all in all, the easy of use combined with the curated list of dependencies needed to accomplish a test is a huge win.&lt;/p&gt;
&lt;p&gt;There are not a lot of technologies involved in setting it up either, just copy and paste the commands in the wiki and it&amp;rsquo;s ready to go.&lt;/p&gt;
&lt;p&gt;Next post(s) will go through a few attack scenarios that require running multiple steps of tests based on Threat Intel report(s), run the tests that correponds to them and understand what the logs tell us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;hic sunt dracones (Here be dragons!)&lt;/em&gt;&lt;/strong&gt; 🐉&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://atomicredteam.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://atomicredteam.io/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.redcanary.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.redcanary.com/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://atomicredteam.io/invokeatomic&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://atomicredteam.io/invokeatomic&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://atomicredteam.io/atomictestharnesses&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://atomicredteam.io/atomictestharnesses&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://atomicredteam.io/chainreactor&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://atomicredteam.io/chainreactor&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:8&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bloggingforlogging.com/2020/08/21/wacky-wsman-on-linux/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.bloggingforlogging.com/2020/08/21/wacky-wsman-on-linux/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:9&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://attack.mitre.org/techniques/T1003/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://attack.mitre.org/techniques/T1003/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:9&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>YAML linting and schema validation</title>
      <link>https://www.mavjs.org/post/yaml-linting-schema-validation/</link>
      <pubDate>Tue, 14 Sep 2021 19:50:19 +0200</pubDate>
      <guid>https://www.mavjs.org/post/yaml-linting-schema-validation/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Recently, we considered an approach, where in a single file document analysts are able to share SIEM (idea) queries, and some form of documentation and or notes. We also needed to make them machine parseable and transformable, in order for us to automate the parts of the queries to feed into a SIEM system.
This sort of idea is not new or ground breaking in anyway. In fact, it is pretty popular in the information security industry to share ideas for threat detection &amp;amp; hunting in YAML, TOML or markdown with code blocks.&lt;/p&gt;
&lt;p&gt;YAML and TOML file formats are used a lot in threat detection &amp;amp; hunting rule sharing communities, ever since Sigma - generic signature format for SIEM systems&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, came out, I believe. Threat detection &amp;amp; hunting enthusiasts sharing ideas are also making use of YAML file format&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.
In fact, vendors like Elastic&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; share their detection contents on GitHub as TOML files&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;This allows some form of uniformity in how the contents should be structured and also defines how the machine or automations should extract the information.&lt;/p&gt;
&lt;p&gt;If you have the team, time, development and engineering resources, it might be worth looking into just using Sigma and to get contents for different security systems ingesting them automatically.
However, our approach was that, we wanted something to mix SIEM specific queries and some documentations together, while only spending some time into writing a script that can just strip out the query so that it can then be fed into a SIEM system, so we went with our own YAML format.&lt;/p&gt;
&lt;p&gt;The downsides of coming up with your own format is that, you need to first define the structure, what field and values are mandatory, what are optional and then make a decision. This downside, however, can be overcome relatively easy in some cases. This was the case for us.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;NOTE:&lt;/em&gt; Just want the &lt;a href=&#34;#full-example-files&#34;&gt;sauce&lt;/a&gt;?&lt;/p&gt;
&lt;h1 id=&#34;the-details&#34;&gt;The Details&lt;/h1&gt;
&lt;p&gt;This is how a signature format in YAML looks like:


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/sigma-sig-format.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;It has a &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt; about the rule, the &lt;code&gt;author&lt;/code&gt;, &lt;code&gt;references&lt;/code&gt;, &lt;code&gt;logsource&lt;/code&gt;, &lt;code&gt;detection&lt;/code&gt; rules.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say, for your community or organization, you decided a YAML format inspired by Sigma, however, it is not an extension, and that you do not use a single syntax high-level abstraction for your queries. It looks like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6068c062-627f-4d7c-9250-5059f5417726&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# UUIDv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;some title for your detection rule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;description&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;a short sentence about the detection rule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;references&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;reference URL 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;reference URL 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;analyst_notes&lt;/span&gt;: &amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  When you see X, you need to check if occurances of A, B, C, D are also there?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  If not, it might indicate a false-positive or a scenario 1 like in Alpha.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  If you see at most 3 out of 4, it is surely suspicious and therefore you should
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  look for to find: K, L, M, N.&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;query&lt;/span&gt;: &amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  SELECT * FROM registry WHERE \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  key LIKE &amp;#39;HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  and name=&amp;#39;Debugger&amp;#39;;&amp;#34;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;mitre&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;T1112&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jira&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;PJ-1337&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you get to a point where these files are stored in Git for version control and some form of automation is in-place, you will need to make sure that the file is properly formatted as YAML and also compliant to your custom schema.
The former can be achieved by using a linting tool like &lt;code&gt;yamllint&lt;/code&gt;&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;. The latter with a library like &lt;code&gt;Yamale&lt;/code&gt;&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;, which is what we went with.&lt;/p&gt;
&lt;h2 id=&#34;yaml-linting&#34;&gt;YAML Linting&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;yamllint&lt;/code&gt; is a command line tool and a library you can use in your own tooling. If we run the tool on the YAML file above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ yamllint detection_rule.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detection_rule.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  2:42      warning  too few spaces before comment  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;comments&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  11:81     error    line too long &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;81&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt; characters&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;line-length&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  15:81     error    line too long &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;102&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt; characters&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;line-length&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, if you would like to combine such a linting process together with other checks your scripts are doing, you can import the library&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;. Here is an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; yamllint
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; yamllint.config &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; YamlLintConfig
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;raw_yaml &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;detection_rule.yml&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yaml_config &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; YamlLintConfig(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;extends: default&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; p &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; yamllint&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;linter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run(raw_yaml, yaml_config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(p&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;desc, p&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;line, p&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rule)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;yamale---schema-validation&#34;&gt;Yamale - schema validation&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Yamale&lt;/code&gt; is also a command line tool and a library. It comes with a few default validator&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt; functions, and is also very easily extendable. Here we will see how we could extend it for our schema.&lt;/p&gt;
&lt;p&gt;First, we need to come up with a schema dictionary that &lt;code&gt;Yamale&lt;/code&gt; can understand to use to validator your YAML files. Let&amp;rsquo;s consider the following as an initial schema dictionary:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;description&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;references&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;list(str())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;analyst_notes&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;query&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;mitre&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;list(str())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jira&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running &lt;code&gt;yamale&lt;/code&gt; and providing the above schema as follows, yields a validation success.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ yamale -s schema.yaml detection_rule.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Validating /home/user/project-x/detection_rule.yml...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Validation success! 👍
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you kept a close eye, you will have noticed that we initially told &lt;code&gt;yamale&lt;/code&gt; that &lt;code&gt;id&lt;/code&gt; is a string, however, that is not entirely true.
The validation will also pass if you wrote in a bogus string that is not a UUID. So we will need to extend &lt;code&gt;yamale&lt;/code&gt; and write our own validator.&lt;/p&gt;
&lt;p&gt;Looking at an example custom validator&lt;sup id=&#34;fnref:9&#34;&gt;&lt;a href=&#34;#fn:9&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;9&lt;/a&gt;&lt;/sup&gt; in their example, we can try a proof of concept UUID validator and also include the validation routines as well:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; yamale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; uuid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; yamale.validators &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; DefaultValidators, Validator
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;UUID&lt;/span&gt;(Validator):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34; Custom UUID validator &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uuid&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_is_valid&lt;/span&gt;(self, value):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            luuid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; uuid&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;UUID(str(value))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ValueError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;validators &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DefaultValidators&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;copy()  &lt;span style=&#34;color:#75715e&#34;&gt;# This is a dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;validators[UUID&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tag] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; UUID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;schema &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yamale&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;make_schema(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./schema.yaml&amp;#39;&lt;/span&gt;, validators&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;validators)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yamale&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;make_data(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./detection_rule.yml&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yamale&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;validate(schema, data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Validation success! 👍&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ValueError&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Validation failed!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; str(e))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the validator for &lt;code&gt;id&lt;/code&gt; in &lt;code&gt;schema.yaml&lt;/code&gt; to &lt;code&gt;uuid()&lt;/code&gt;, run the script above and it should output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ python schema-validate.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Validation success! 👍
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Say, for another custom validator, you want to check and make sure that &lt;code&gt;jira&lt;/code&gt; values do confirm to the documented JIRA project key format&lt;sup id=&#34;fnref:10&#34;&gt;&lt;a href=&#34;#fn:10&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;10&lt;/a&gt;&lt;/sup&gt;, since these are manually entered by analysts. Here we will reuse/sub-class from the built-in &lt;code&gt;Regex&lt;/code&gt; validator.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; yamale.validators &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Regex
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JIRA&lt;/span&gt;(Regex):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34; Custom JIRA Project ID validator. &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;jira&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __init__(self, &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_project_key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(kwargs&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pop(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;project_key&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        super(JIRA, self)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__init__(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_project_key) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;regexes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-\d+$&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_project_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;regexes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^([A-Z]&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{2}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;[0-9]&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{2}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)-\d+$&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^([A-Z][A-Z_0-9]+)-\d+$&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adjust &lt;code&gt;jira&lt;/code&gt; field&amp;rsquo;s value in &lt;code&gt;schema.yaml&lt;/code&gt; as &lt;code&gt;jira(project_key=&#39;JP&#39;)&lt;/code&gt; and on running the script, it should error out:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Validation failed!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error validating data &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./detection_rule.yml&amp;#39;&lt;/span&gt; with schema &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./schema.yaml&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	jira: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;PJ-1337&amp;#39;&lt;/span&gt; is not a jira match.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;challenge&#34;&gt;Challenge&lt;/h2&gt;
&lt;p&gt;Let us try writing a schema validator for the Sigma rule we mentioned at the beginning.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(min=1, max=256)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;status&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;enum(&amp;#39;stable&amp;#39;, &amp;#39;testing&amp;#39;, &amp;#39;experimental&amp;#39;, required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;description&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;author&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;date&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;modified&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;references&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;list(str(), required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;tags&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;list(str())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;logsource&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;include(&amp;#39;logsource&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;detection&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;include(&amp;#39;detection&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;falsepositives&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;any(str(), list(), required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;level&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;enum(&amp;#39;low&amp;#39;, &amp;#39;medium&amp;#39;, &amp;#39;high&amp;#39;, &amp;#39;critical&amp;#39;, required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;logsource&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;product&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;category&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;service&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;definition&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;detection&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;selection&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;any(str(), list(), map(key=str()))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;condition&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;timeframe&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str(required=False)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; At times if you compare &lt;code&gt;Yamale&lt;/code&gt; with something like &lt;code&gt;Rx&lt;/code&gt;&lt;sup id=&#34;fnref:11&#34;&gt;&lt;a href=&#34;#fn:11&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;11&lt;/a&gt;&lt;/sup&gt;, the former seems somewhat limiting for the way Sigma was designed. However, I would start with something like &lt;code&gt;Yamale&lt;/code&gt; first and then think about &lt;code&gt;Rx&lt;/code&gt; later on.&lt;/p&gt;
&lt;h2 id=&#34;full-example-files&#34;&gt;Full Example Files&lt;/h2&gt;
&lt;h3 id=&#34;detection_ruleyml&#34;&gt;&lt;code&gt;detection_rule.yml&lt;/code&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;6068c062-627f-4d7c-9250-5059f5417726&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;some title for your detection rule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;description&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;a short sentence about the detection rule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;references&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;reference URL 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;reference URL 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;analyst_notes&lt;/span&gt;: &amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  When you see X, you need to check if occurances of A, B, C, D are also there?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  If not, it might indicate a false-positive or a scenario 1 like in Alpha.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  If you see at most 3 out of 4, it is surely suspicious and therefore you should
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  look for to find: K, L, M, N.&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;query&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;SELECT * FROM registry WHERE \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;key LIKE &amp;#39;HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%&amp;#39; \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;and name=&amp;#39;Debugger&amp;#39;;&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;mitre&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;T1112&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jira&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;PJ-1337&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;schemayaml&#34;&gt;&lt;code&gt;schema.yaml&lt;/code&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;uuid()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;description&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;references&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;list(str())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;analyst_notes&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;query&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;str()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;mitre&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;list(str())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jira&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jira()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;validatorpy&#34;&gt;&lt;code&gt;validator.py&lt;/code&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; yamale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; uuid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; yamale.validators &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; DefaultValidators, Validator, Regex
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;UUID&lt;/span&gt;(Validator):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34; Custom UUID validator &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uuid&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __init__(self, &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        super(UUID, self)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__init__(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_version &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(kwargs&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pop(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;version&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_is_valid&lt;/span&gt;(self, value):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            luuid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; uuid&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;UUID(str(value), version&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_version)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ValueError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JIRA&lt;/span&gt;(Regex):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34; Custom JIRA Project ID validator. &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;jira&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __init__(self, &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_project_key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(kwargs&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pop(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;project_key&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        super(JIRA, self)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__init__(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_project_key) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;regexes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-\d+$&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_project_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;regexes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^([A-Z]&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{2}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;[0-9]&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{2}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)-\d+$&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^([A-Z][A-Z_0-9]+)-\d+$&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;validators &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DefaultValidators&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;copy()  &lt;span style=&#34;color:#75715e&#34;&gt;# This is a dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;validators[UUID&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tag] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; UUID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;validators[JIRA&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tag] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; JIRA
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;schema &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yamale&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;make_schema(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./schema.yaml&amp;#39;&lt;/span&gt;, validators&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;validators)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; yamale&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;make_data(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./detection_rule.yml&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yamale&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;validate(schema, data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Validation success! 👍&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ValueError&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Validation failed!&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; str(e))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/SigmaHQ/sigma&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/SigmaHQ/sigma&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/vadim-hunter/Detection-Ideas-Rules&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/vadim-hunter/Detection-Ideas-Rules&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/siem/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.elastic.co/siem/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elastic/detection-rules/tree/main/rules&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/elastic/detection-rules/tree/main/rules&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://yamllint.readthedocs.io/en/stable/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://yamllint.readthedocs.io/en/stable/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/23andMe/Yamale&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/23andMe/Yamale&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://yamllint.readthedocs.io/en/stable/development.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://yamllint.readthedocs.io/en/stable/development.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:8&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/23andMe/Yamale#validators&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/23andMe/Yamale#validators&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:9&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/23andMe/Yamale#custom-validators&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/23andMe/Yamale#custom-validators&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:9&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:10&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://confluence.atlassian.com/adminjiraserver/changing-the-project-key-format-938847081.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://confluence.atlassian.com/adminjiraserver/changing-the-project-key-format-938847081.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:10&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:11&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://rx.codesimply.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://rx.codesimply.com/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:11&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Contributing to Kali Linux using toolbox on Fedora</title>
      <link>https://www.mavjs.org/post/contribute-kali-via-fedora-toolbox/</link>
      <pubDate>Sat, 14 Nov 2020 22:24:11 +0100</pubDate>
      <guid>https://www.mavjs.org/post/contribute-kali-via-fedora-toolbox/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;While working on &lt;a href=&#34;https://www.offensive-security.com/pwk-oscp/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Penetration Testing with Kali Linux (PWK)&lt;/a&gt; training offered by &lt;a href=&#34;https://www.offensive-security.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Offensive Security&lt;/a&gt;, I came across a tool called &lt;a href=&#34;http://pentestmonkey.net/tools/user-enumeration/smtp-user-enum&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;smtp-user-enum&lt;/code&gt;&lt;/a&gt;. It is a perl script to enumerate OS-level user accounts on Solaris via the SMTP service (sendmail).&lt;/p&gt;
&lt;p&gt;In its usage documentation, it mentions an option to pass a list of hostnames running the SMTP service via a file, to use for enumeration. When trying out that option, I noticed that it didn&amp;rsquo;t work. Upon taking a close look at the script, I noticed that although it looks for the option &lt;code&gt;-T&lt;/code&gt; in the arguments list&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, it was never part of the &lt;code&gt;getopts&lt;/code&gt; evaluation&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, thus erroring out.&lt;/p&gt;
&lt;p&gt;As it stands, I do not like having SSH keys tied to GitHub/Gitlab accounts on my Kali Linux virtual machine, so instead, I found a way to use a Debian container via &lt;a href=&#34;https://github.com/containers/toolbox&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;toolbox&lt;/code&gt;&lt;/a&gt; on my regular workstation using Fedora, to create the necessary patches to conform to Debian packaging standards and submitting a pull request on &lt;a href=&#34;https://gitlab.com/kalilinux/packages/smtp-user-enum&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Kali Linux&amp;rsquo;s &lt;code&gt;stmp-user-enum&lt;/code&gt; package repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This post recounts of the steps I used, in case someone finds it useful or for my own reference in the future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;I chose to use a Debian image here as I plan to work on other things via the same toolbox. We could have chosen to use &lt;a href=&#34;https://hub.docker.com/r/kalilinux/kali&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Kali Linux docker image&lt;/a&gt; instead as well.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&#34;the-details&#34;&gt;The Details&lt;/h1&gt;
&lt;h2 id=&#34;how-toolbox-works&#34;&gt;How &lt;code&gt;toolbox&lt;/code&gt; works&lt;/h2&gt;
&lt;p&gt;We can create the first &amp;ldquo;toolbox&amp;rdquo; by invoking &lt;code&gt;toolbox enter&lt;/code&gt; on Fedora. This will use the same Fedora version as our running host. That is, if the running host is &lt;code&gt;Fedora 33&lt;/code&gt;, it will download the same container image via &lt;a href=&#34;https://registry.fedoraproject.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://registry.fedoraproject.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, we will see that the registry does not have a Debian image from which we can work from.&lt;/p&gt;
&lt;h2 id=&#34;using-debian-docker-image&#34;&gt;Using Debian Docker image&lt;/h2&gt;
&lt;p&gt;Toolbox uses &lt;code&gt;podman&lt;/code&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; in the background instead of docker. However, we can still pull a &lt;a href=&#34;https://hub.docker.com/_/debian&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Debian docker image&lt;/a&gt; from Docker Hub.&lt;/p&gt;
&lt;p&gt;First create a Debian &amp;ldquo;toolbox&amp;rdquo; named &amp;ldquo;debtest&amp;rdquo; as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;toolbox create -c debtest --image docker.io/debian:testing
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once it has finished downloading the docker image, we can enter the toolbox as:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;toolbox enter debtest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We notice that we have entered our toolbox via the change in shell prompt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;⬢&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;user@toolbox ~&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;creating-the-patch&#34;&gt;Creating the patch&lt;/h2&gt;
&lt;p&gt;Here we will use the Debian &lt;a href=&#34;https://packages.debian.org/search?keywords=git-buildpackage&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;git-buildpackage&lt;/code&gt; (gbp)&lt;/a&gt; (Found a nice guide on &lt;code&gt;gbp&lt;/code&gt;&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; mentioned in another pull request&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;) to create and apply our changes according to Debian packaging standards.
So install the package:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install git-buildpackage -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fork the &lt;code&gt;smtp-user-enum&lt;/code&gt; package on Gitlab.
Clone the forked repository and enter the directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone git@gitlab.com:&amp;lt;your-username&amp;gt;/smtp-user-enum.git &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd smtp-user-enum
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create our feature branch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout -b getopts-Targets-file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apply the previous patches by executing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gbp pq import
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will move us to a patch queue branch called &lt;code&gt;patch-queue/getopts-Targets-file&lt;/code&gt;.
We can check this by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can create our changes and commit them.
Afterwards, we regenerate the patches in &lt;code&gt;debian/patches/&lt;/code&gt; by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gbp pq export
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will drop us back into our original branch &lt;code&gt;getopts-Targets-file&lt;/code&gt;.
Now we add &lt;code&gt;debian/patches&lt;/code&gt; to git and commit them:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add debian/patches
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then push those changes to your repository:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push -u origin getopts-Targets-file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then we create a pull request at the original repository, wait for the Gitlab CI jobs to run and turn green, and hope that one of the Kali Linux developers merges it. 😄&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/kalilinux/packages/smtp-user-enum/-/blob/kali/master/smtp-user-enum.pl#L98&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitlab.com/kalilinux/packages/smtp-user-enum/-/blob/kali/master/smtp-user-enum.pl#L98&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/kalilinux/packages/smtp-user-enum/-/blob/kali/master/smtp-user-enum.pl#L87&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitlab.com/kalilinux/packages/smtp-user-enum/-/blob/kali/master/smtp-user-enum.pl#L87&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://podman.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://podman.io/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.patches.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.patches.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/kalilinux/packages/smtp-user-enum/-/merge_requests/1&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://gitlab.com/kalilinux/packages/smtp-user-enum/-/merge_requests/1&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>2018 FLARE-On Challenges Writeup</title>
      <link>https://www.mavjs.org/post/flareon5-writeup/</link>
      <pubDate>Mon, 08 Oct 2018 19:42:33 +0200</pubDate>
      <guid>https://www.mavjs.org/post/flareon5-writeup/</guid>
      <description>&lt;p&gt;I decided to participate in this year&amp;rsquo;s edition of &lt;a href=&#34;https://www.fireeye.com/blog/threat-research/2018/08/announcing-the-fifth-annual-flare-on-challenge.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;FLARE-On challenge&lt;/a&gt;. It is made by the fine folks from FireEye Labs Advanced Reverse Engineering (FLARE) team.&lt;/p&gt;
&lt;p&gt;I wanted to see how far I could go. I did not set any goals nor did I took it as seriously as I would have liked.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/1-flareon.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;The challenge is now over and I only managed to make it to the 2 challenge, as expected (you can see the reason why above 😆 ). Let&amp;rsquo;s get on with the challenges.&lt;/p&gt;
&lt;h1 id=&#34;minesweeper-championship-registration&#34;&gt;Minesweeper Championship Registration&lt;/h1&gt;
&lt;p&gt;Simple challenge. Once you open the zipped file, you&amp;rsquo;ll get a &lt;code&gt;jar&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;These days I mostly use &lt;a href=&#34;https://bytecodeviewer.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Bytecode Viewer&lt;/a&gt; when it comes to &lt;code&gt;APK&lt;/code&gt; or &lt;code&gt;jar&lt;/code&gt; files.
Once you open the challenge &lt;code&gt;jar&lt;/code&gt; file with it and navigate to the only class file in there you&amp;rsquo;ll see the following code:&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/2-flareon.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Rest is history! 😉&lt;/p&gt;
&lt;h1 id=&#34;ultimate-minesweeper&#34;&gt;Ultimate Minesweeper&lt;/h1&gt;
&lt;p&gt;Boy, was I in for a challenge with this one. 😅&lt;/p&gt;
&lt;p&gt;Figured out it was a &lt;code&gt;.NET&lt;/code&gt; binary and remembered a friend of mine talking about their experience decompiling them a few months back, I took this opportunity to try it out.
There might have been an easier way than what I will be describing below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opened up the binary using &lt;em&gt;Jetbrains&lt;/em&gt;&amp;rsquo;s &lt;a href=&#34;https://www.jetbrains.com/decompiler/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;dotPeek&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Exported it to a Visual Studio project.&lt;/li&gt;
&lt;/ul&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/3-1-flareon.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;Opened up the solution/project with Visual Studio.&lt;/li&gt;
&lt;li&gt;Started looking into the main class.&lt;/li&gt;
&lt;li&gt;Found a function &lt;code&gt;SquareRevealedCallback&lt;/code&gt; that is used as a callback after each click on the minefield tiles.&lt;/li&gt;
&lt;/ul&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/3-2-flareon.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;Got to another function &lt;code&gt;BombRevealed&lt;/code&gt; that checks if any minefields were revealed, which returns &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; to the callback function above.&lt;/li&gt;
&lt;/ul&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/3-3-flareon.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;Modified the &lt;code&gt;if&lt;/code&gt; statement in &lt;code&gt;BombRevealed&lt;/code&gt; as below and rest is some clicking. 😆&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (!&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.MinesPresent[index2, index1])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.Console.WriteLine(index1 + &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.Console.WriteLine(index2 + &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/3-4-flareon.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Definitely going to hone my skills before next year&amp;rsquo;s FLARE-on challenge! 💪 😎&lt;/p&gt;
&lt;p&gt;Also check out a more in-depth thorough writeup of the challenges from the authors: &lt;a href=&#34;https://www.fireeye.com/blog/threat-research/2018/10/2018-flare-on-challenge-solutions.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://www.fireeye.com/blog/threat-research/2018/10/2018-flare-on-challenge-solutions.html&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Swap Control and Caps Lock on Windows</title>
      <link>https://www.mavjs.org/post/swap-ctrl-and-capslock-on-windows/</link>
      <pubDate>Sat, 11 Aug 2018 19:12:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/swap-ctrl-and-capslock-on-windows/</guid>
      <description>&lt;p&gt;Whenever I finish installing a fresh operating system, be it Windows or a Linux distribution, I always remap ctrl and caps lock on my keyboard.
As I use the &lt;code&gt;Control&lt;/code&gt; key a lot more than &lt;code&gt;Caps Lock&lt;/code&gt;, I like having the former on the same line as my home row keys. So, this is what I normally do on Windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I have only tested this on Windows 10.&lt;/p&gt;
&lt;h3 id=&#34;manually-editing-the-registry-key&#34;&gt;Manually editing the registry key&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Open up the Windows &lt;code&gt;Run&lt;/code&gt; prompt via pressing the &lt;code&gt;Windows&lt;/code&gt; and &lt;code&gt;r&lt;/code&gt; on the keyboard.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;regedit&lt;/code&gt; to bring up the &lt;strong&gt;Registry Editor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;code&gt;Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Either edit &lt;code&gt;Scancode Map&lt;/code&gt; or create it by pressing &lt;code&gt;Edit-&amp;gt;New-&amp;gt;Binary Value&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enter these values in &lt;code&gt;Scancode Map&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;00 00 00 00
00 00 00 00
03 00 00 00
1d 00 3a 00
3a 00 1d 00
00 00 00 00
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;explanation-for-the-values&#34;&gt;Explanation for the values&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;The header version, which is always 0.&lt;/li&gt;
&lt;li&gt;The header flag, which is always 0.&lt;/li&gt;
&lt;li&gt;The sum of number of key entries to change and the extra NULL terminator line. In this case 2 key entries changed, therefore, 3.&lt;/li&gt;
&lt;li&gt;Sends &lt;strong&gt;LEFT CTRL&lt;/strong&gt; key code (&lt;code&gt;0x001d&lt;/code&gt;) when pressing &lt;strong&gt;CAPS LOCK&lt;/strong&gt; (&lt;code&gt;0x003a&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Reverse of step 4, as we are swapping them around and not entirely disabling the use of caps lock.&lt;/li&gt;
&lt;li&gt;NULL terminator line&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This can also be put into a powershell script instead of manually editing the registry key as above. See the code below:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$hexified = &amp;#34;00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,3a,00,1d,00,00,00,00,00&amp;#34;.Split(&amp;#34;,&amp;#34;) | % { &amp;#34;0x$_&amp;#34;};

$kbLayout = &amp;#39;HKLM:\SYSTEM\CurrentControlSet\Control\Keyboard Layout&amp;#39;;

New-ItemProperty -Path $kbLayout -Name &amp;#34;Scancode Map&amp;#34; -PropertyType Binary -Value ([byte[]]$hexified)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;p&gt;Kudos to these answers on Stackoverflow.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://superuser.com/a/1264295&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://superuser.com/a/1264295&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://superuser.com/a/997448&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://superuser.com/a/997448&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;updates&#34;&gt;Updates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;added &lt;code&gt;t&lt;/code&gt; in &lt;code&gt;.Spli(&amp;quot;,&amp;quot;)&lt;/code&gt; and removed the space inbetween &lt;code&gt;- Value&lt;/code&gt; (Kudos to &lt;a href=&#34;https://twitter.com/syk0saje&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@syk0saje&lt;/a&gt; for spotting the typos.)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>goPwned</title>
      <link>https://www.mavjs.org/project/gopwned/</link>
      <pubDate>Fri, 12 Aug 2016 17:21:51 +0200</pubDate>
      <guid>https://www.mavjs.org/project/gopwned/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Running GUI apps from Fedora Docker containers</title>
      <link>https://www.mavjs.org/post/running-gui-apps-from-fedora-docker-containers/</link>
      <pubDate>Sun, 10 May 2015 15:50:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/running-gui-apps-from-fedora-docker-containers/</guid>
      <description>&lt;p&gt;After reading &lt;a href=&#34;https://twitter.com/jessfraz&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Jessie Frazelle&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://blog.jessfraz.com/post/docker-containers-on-the-desktop&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Docker Containers on the Desktop&lt;/a&gt; post I was quite interested in making some Fedora image based docker containers for some apps I want to use.&lt;/p&gt;
&lt;p&gt;Ones, I wouldn&amp;rsquo;t normally install on my main machines, like Google Chrome with the Google Talk plugins and flash. So, I did make one with chrome and the talk plugin and followed the guide on Jessie&amp;rsquo;s blog to run the GUI app, it worked, &lt;em&gt;but&lt;/em&gt; there was no sound.&lt;/p&gt;
&lt;p&gt;But of course, I forgot Fedora use PulseAudio, so I looked for a solution on the internet as usual and stumbled upon a stackoverflow question: &lt;a href=&#34;https://stackoverflow.com/questions/28985714/run-apps-using-audio-in-a-docker-container&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;qt - run apps using audio in a docker container&lt;/a&gt; and now has a working Fedora docker container which runs Google Chrome with the Google Talk plugin.&lt;/p&gt;
&lt;p&gt;Dockerfile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM fedora:latest
MAINTAINER &amp;quot;Ye Myat Kaung (Maverick)&amp;quot; &amp;lt;mavjs@mavjs.org&amp;gt;

RUN yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm -y &amp;amp;&amp;amp; \
yum install https://dl.google.com/linux/direct/google-talkplugin_current_x86_64.rpm -y

ENTRYPOINT [ &amp;quot;/usr/bin/google-chrome&amp;quot; ]
CMD [ &amp;quot;--user-data-dir=/data&amp;quot;] 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Docker command to run container:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker run -it --rm\
    --net host \
    --cpuset 0 \
    --memory 512mb \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=unix$DISPLAY \
    -v /dev/snd:/dev/snd --privileged \
    -v /dev/shm:/dev/shm \
    -v /etc/machine-id:/etc/machine-id \
    -v /var/lib/dbus:/var/lib/dbus \
    -v /run/user/`id -u`/pulse/native:/run/user/`id -u`/pulse/native \
    -v ~/.pulse:/home/$dockerUsername/.pulse \
    --name chrome \
    mavjs/chrome
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My Fedora Dockerfiles can be found on my github &amp;amp; docker images on docker registery: &lt;a href=&#34;https://github.com/mavjs/fedora-dockerfiles&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fedora-dockerfiles&lt;/a&gt; &amp;amp; &lt;a href=&#34;https://hub.docker.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;docker hub&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Fedora 21 Workstation HiDPI on retina macbook pro</title>
      <link>https://www.mavjs.org/post/f21-hidpi-on-retina-macbookpro/</link>
      <pubDate>Mon, 06 Apr 2015 02:10:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/f21-hidpi-on-retina-macbookpro/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been happily using F21 since it&amp;rsquo;s release announcement on &lt;a href=&#34;https://fedoramagazine.org/announcing-fedora-21&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora Magazine&lt;/a&gt;,especially with the support for high resolution displays (HiDPI) since I&amp;rsquo;ve been converted back to using Fedora full time on my retina macbook pro. Although most of the GNOME apps work on my retina display, browsers and third-party apps are still lacking. Web pages&amp;rsquo; fonts seems too tiny and I&amp;rsquo;ve to zoom in on them to see them better all the time.&lt;/p&gt;
&lt;p&gt;But recently I came across a nice resource - &lt;a href=&#34;https://wiki.archlinux.org/index.php/HiDPI&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://wiki.archlinux.org/index.php/HiDPI&lt;/a&gt; about enabling HiDPI support on various apps. Mostly my main used apps daily are &lt;strong&gt;Firefox&lt;/strong&gt;, &lt;strong&gt;Chromium&lt;/strong&gt; and I&amp;rsquo;ve been trying to use &lt;a href=&#34;https://www.jetbrains.com/pycharm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pycharm&lt;/a&gt; (&amp;amp; various JetBrains apps) but with HiDPI everything seems so small, so as suggested in the wiki, I changed my settings as follows:&lt;/p&gt;
&lt;p&gt;On Firefox (play around with the value):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;about:config -&amp;gt; layout.css.devPixelsPerPx -&amp;gt; 1.5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thunderbird (same as Firefox):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Edit -&amp;gt; Preferences -&amp;gt; Advanced -&amp;gt; Config Editor -&amp;gt; layout.css.devPixelsPerPx -&amp;gt; 1.5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PyCharm and any JetBrains products (the file should be in &lt;strong&gt;bin&lt;/strong&gt; sub
directory in the folder you extracted the app):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;appname|appname64&amp;gt;.vmoptions -&amp;gt; -Dhidpi=true
&lt;/code&gt;&lt;/pre&gt;


















&lt;figure  id=&#34;figure-clion-before-hidpi-tweak&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/CLionBefore.png&#34; alt=&#34;CLion before HiDPI tweak&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      CLion before HiDPI tweak
    &lt;/figcaption&gt;&lt;/figure&gt;



















&lt;figure  id=&#34;figure-clion-after-hidpi-tweak&#34;&gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/CLionAfter.png&#34; alt=&#34;CLion after HiDPI tweak&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;figcaption&gt;
      CLion after HiDPI tweak
    &lt;/figcaption&gt;&lt;/figure&gt;

</description>
    </item>
    
    <item>
      <title>World of Warcraft on Fedora 20 via wine</title>
      <link>https://www.mavjs.org/post/world-of-warcraft-on-f20-via-wine/</link>
      <pubDate>Fri, 14 Nov 2014 14:26:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/world-of-warcraft-on-f20-via-wine/</guid>
      <description>&lt;p&gt;Install wine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # sudo yum install wine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Download World of Warcraft Setup Installer from &lt;a href=&#34;https://us.battle.net/account/download/?show=wow&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://us.battle.net/account/download/?show=wow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Run the installer with wine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # cd ~/Downloads/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # wine World-of-Warcraft-Setup-enGB.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After the installation completes, it will ask you to login to your Battlenet Account. Instead, quit the application. Then tell it to use software rendered OpenGL by executing (it has a bug where the interface is just black canvas on some intel cards):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    % export LIBGL_ALWAYS_SOFTWARE=1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    % wine ~/.wine/drive_c/Program\ Files\ (x86)/Battle.net/Battle.net\ Launcher.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Battlenet actually allows you to play even though it hasn&amp;rsquo;t finished downloading if it has reached a certain downloaded size. Either wait to finish or open the game. When you run it the first time it will take a while and FPS is not that great. Quit the game. Modify &lt;strong&gt;SET gxApi &amp;ldquo;D3D9&amp;rdquo;&lt;/strong&gt; to &lt;strong&gt;SET gxApi &amp;ldquo;Opengl&amp;rdquo;&lt;/strong&gt; in the following file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $ ~/.wine/drive_c/Program\ Files\ (x86)/World\ of\ Warcraft/WTF/Config.wtf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that your game should work in decent FPS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have not tried the gameplay yet, since my subscription expired. :-(&lt;/li&gt;
&lt;li&gt;Fedora 20 running on a 13&amp;quot;, 2.8Ghz retina macbookpro, 2013 edition.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sources&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://appdb.winehq.org/objectManager.php?sClass=version&amp;amp;iId=30545&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://appdb.winehq.org/objectManager.php?sClass=version&amp;iId=30545&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.webupd8.org/2014/10/partial-workaround-for-black-distorted.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://www.webupd8.org/2014/10/partial-workaround-for-black-distorted.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Compiling Voxelands on Mac OSX</title>
      <link>https://www.mavjs.org/post/compiling-voxelands-on-mac-osx/</link>
      <pubDate>Fri, 26 Sep 2014 22:25:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/compiling-voxelands-on-mac-osx/</guid>
      <description>&lt;h1 id=&#34;what-is-voxelands&#34;&gt;What is Voxelands?&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;http://voxelands.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Voxelands&lt;/a&gt; - the Fun-Focused Free Software Voxel World Game. Voxelands is a sandbox construction game based on &lt;a href=&#34;http://minetest.net&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Minetest&lt;/a&gt;, which was inspired by earlier &amp;ldquo;voxel world&amp;rdquo; games such as Infiniminer.&lt;/p&gt;
&lt;p&gt;We already have the precompiled mac app for the latest stable release that you can install at: http://voxelands.com/downloads/voxelands-1408.00-osx.dmg&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; The above &lt;strong&gt;voxelands-1408.00-os.dmg&lt;/strong&gt; would still need the mentions dependencies installed from brew below, with the exception of git, cmake, Xcode, Xcode Command Line Tools. This post is mostly meant for people that want the latest new features in the development branch. I&amp;rsquo;m working on a proper mac app that wouldn&amp;rsquo;t need to install dependencies, in the next release.&lt;/p&gt;
&lt;p&gt;To start off with getting a voxelands-1408.00:next-os.dmg (which is the branch for the next release, where most fixes that didn&amp;rsquo;t make it to the latest stable release gets committed to), you&amp;rsquo;d need a few more softwares to help. First off, you need `Homebrew - The missing package manager for OSX &lt;a href=&#34;http://brew.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://brew.sh&lt;/a&gt;, to install it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ruby -e &amp;#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After installing brew, you need to install these dependencies (that
are in the brew repositories):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;libpng&lt;/li&gt;
&lt;li&gt;libvorbis&lt;/li&gt;
&lt;li&gt;libogg&lt;/li&gt;
&lt;li&gt;jpeg-turbo&lt;/li&gt;
&lt;li&gt;gettext&lt;/li&gt;
&lt;li&gt;irrlicht&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;cmake&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Issue brew install on all of them&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    brew install libpng libvorbis libogg jpeg-turbo gettext irrlicht git cmake
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That will install the most needed dependencies for Voxelands on Mac OSX. But you will also need the &lt;a href=&#34;http://xquartz.macosforge.org/landing/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;XQuartz&lt;/a&gt; - A version of the X.Org X Window System that runs on Mac OSX, `&lt;a href=&#34;https://developer.apple.com/xcode/downloads&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Xcode&lt;/a&gt;, &lt;a href=&#34;https://developer.apple.com/downloads/index.action&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Command Line Tools for Xcode&lt;/a&gt; and you can start compiling.&lt;/p&gt;
&lt;p&gt;Get the voxelands source from git first (voxelands&amp;rsquo; former name was minetest-classic)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    git clone https://gitorious.org/minetest-classic/minetest-classic.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cd minetest-classic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    git checkout next
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s start off with telling &lt;a href=&#34;http://www.cmake.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cmake&lt;/a&gt; - which is the cross-platform, open-source build system that Voxelands uses, about the extra dependencies that we installed via brew (do make sure you supply the correct paths with the versions).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cmake -DIRRLICHT_INCLUDE_DIR=/usr/local/Cellar/irrlicht/1.8.1/include/irrlicht/ \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -DIRRLICHT_LIBRARY=/usr/local/Cellar/irrlicht/1.8.1/lib/libIrrlicht.a \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -DJPEG_INCLUDE_DIR=/usr/local/Cellar/jpeg-turbo/1.3.1/include \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -DJPEG_LIBRARY=/usr/local/Cellar/jpeg-turbo/1.3.1/lib/libturbojpeg.a \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -DBUILD_SERVER=0 -DRUN_IN_PLACE=0 \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -DCUSTOM_GETTEXT_PATH=/usr/local/Cellar/gettext/0.19.2/ \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -DCMAKE_OSX_ARCHITECTURES=x86_64 \-G Xcode .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It will make a &lt;strong&gt;voxelands.xcodeproj&lt;/strong&gt; inside the git cloned project directory. Then we can build using Xcode commandline tools.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xcodebuild -verbose -project voxelands.xcodeproj -target package
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It tells xcodebuild command to build the project with target of package, which makes the .dmg file that we will get in the end, if it successfully compiles.&lt;/p&gt;
&lt;p&gt;If you need help or just want to hang out, come onto our IRC channel &lt;a href=&#34;http://webchat.freenode.net/?channels=%23voxelands&amp;amp;uio=d4&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;#voxelands at chat.freenode.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATED:&lt;/strong&gt; forgot to add jpeg-turbo as one of the dependencies&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting up searx  with gunicorn and supervisor</title>
      <link>https://www.mavjs.org/post/setting-up-searx-with-gunicorn-and/</link>
      <pubDate>Fri, 19 Sep 2014 21:09:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/setting-up-searx-with-gunicorn-and/</guid>
      <description>&lt;h2 id=&#34;what-is-searx&#34;&gt;What is searx?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/asciimoo/searx&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;searx&lt;/a&gt; is a privacy-respecting, hackable metasearch engine&lt;/p&gt;
&lt;p&gt;I have been using my own instance of searx at https://searx.gliderswirley.org/ mostly because I can. :)&lt;/p&gt;
&lt;p&gt;For some reason, my instance seems to go down at some random time, and I assumed it was uwsgi. :P And also because I wanted to try &lt;a href=&#34;http://gunicorn.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;gunicorn&lt;/a&gt; and &lt;a href=&#34;http://supervisord.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;supervisor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most of the setup steps are already documented on the wiki at https://github.com/asciimoo/searx/wiki/Installation, but I&amp;rsquo;ll recount the steps here anyways.&lt;/p&gt;
&lt;p&gt;Install packages (extra package: supervisor):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sudo apt-get install git build-essential libxslt-dev python-dev python-virtualenv python-pybabel zlib1g-dev supervisor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install searx:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cd /usr/localsudo 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    git clone https://github.com/asciimoo/searx.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sudo useradd searx -d /usr/local/searx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sudo chown searx:searx -R /usr/local/searx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install dependencies in a virtualenv (extra package: gunicorn):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sudo -u searx -icd /usr/local/searx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    virtualenv searx-ve. 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ./searx-ve/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pip install gunicorn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    python setup.py install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configure secretkey:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sed -i -e &amp;#34;s/ultrasecretkey/`openssl rand -hex 16`/g&amp;#34; searx/settings.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make a configuration file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sudo touch /etc/supervisor/conf.d/searx.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the above conf to include:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;[program:searx]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;command&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/usr/local/searx/searx-ve/bin/gunicorn searx.webapp:app
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    directory=/usr/local/searx/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    user=searx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    group=searx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    autostart=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    autorestart=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    stdout_logfile=/var/log/supervisor/%(program_name)s-access.log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    stderr_logfile=/var/log/supervisor/%(program_name)s-error.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then start the supervisor service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sudo service supervisor start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Community-ness in Malaysia at its last breath?</title>
      <link>https://www.mavjs.org/post/community-ness-in-malaysia-at-its-last/</link>
      <pubDate>Wed, 30 Apr 2014 12:47:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/community-ness-in-malaysia-at-its-last/</guid>
      <description>&lt;p&gt;It has been almost close to 5 years that I have set my foot on the
Malaysian soil. Came over to Malaysia in July, 2009 with the aim of
studying a bachelor, and now that I have completed, the journey in
Malaysia is almost coming to an end in 2 months.&lt;/p&gt;
&lt;p&gt;I have moved around quite a bit, so, it&amp;rsquo;s pretty easy to not give much
thoughts when leaving. But Malaysia is one which I spent the better half
of my teenage years, and the one where I got into free &amp;amp; open source
software (more of the ideology and appreciation, than contributing) and
volunteering at events.&lt;/p&gt;
&lt;p&gt;I have worked/volunteer for/with notable communities in Malaysia in the
span of the last 3 or so years. I even helped grow a community with &lt;a href=&#34;https://twitter.com/@maxthatsme&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Beard-0&lt;/a&gt;, the notable &lt;a href=&#34;https://www.facebook.com/apucsfc&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cyber Security &amp;amp; Forensics Club of A.P.U&lt;/a&gt;. I helped make Fedora Users&amp;rsquo; and Developers Conference APAC happen in Malaysia, along with &lt;a href=&#34;http://www.kagesenshi.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Izhar&lt;/a&gt;, as the main event owner and many other volunteers. And I helped organise a few Fedora events in Kuala Lumpur and at my previous university. Also, me, Beard-0, &lt;a href=&#34;https://twitter.com/naavinm&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;naavinm&lt;/a&gt; and &lt;a href=&#34;http://blog.intm.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;KE&lt;/a&gt; started a Capture The Flag (CTF) team called, (GliderSwirley)[http://www.gliderswirley.org]. We still try to play most CTF(s) that we could (please pardon the 0xn00bness, if you see us on CTFTime :P ). I also volunteer at &lt;a href=&#34;http://hitb.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hack In The Box Security Conference&lt;/a&gt; and manage most of &lt;a href=&#34;http://haxpo.nl/hitb2014ams-hackweekday&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HackWEEKDAY&lt;/a&gt; (Hopefully, the sponsors and participants were happy about it).&lt;/p&gt;
&lt;p&gt;Being a part of these communities have been the best extracurricular activities I could ask for. I know there are others like music, martial arts and whatever clubs in the university, but they don&amp;rsquo;t align with my real interests. :P&lt;/p&gt;
&lt;p&gt;The problem(s) I find in the way communities are running (not in any particular order);&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the community leaders are &amp;gt;mid 20s-30s, they have full time jobs,&lt;/li&gt;
&lt;li&gt;needs to be backed by a larger corp&lt;/li&gt;
&lt;li&gt;not much passion for knowledge sharing (they just want to suck us dry :P )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you look at communities like Python Malaysia, Fedora Malaysia and others, the real notable faces of the community have full time jobs. Although, they are pretty active at different events and theirs, there is no other person, especially from college/university students, to take over the leadership or just helping out at organizing events. I try to help most free and open source software (FOSS) communities because look at almost all the software(s) that we use, it&amp;rsquo;s somehow based on FOSS, one way or another.&lt;/p&gt;
&lt;p&gt;I find that college/university students like being a part of communities that are backed by larger corps (I will not name them here, don&amp;rsquo;t want to offend anyone). I can&amp;rsquo;t blame them though, they get good SWAG(s)!! like all the time. I&amp;rsquo;m not exactly sure if every other communities need to start distributing swag(s) just to attract more members? It&amp;rsquo;s something I have not figure out yet. Or is it that there is no monetary rewards involved and students are not motivated because of that? :(&lt;/p&gt;
&lt;p&gt;I have done quite a bit of workshops at CSFC, especially python. Because I find that the programming classes in the uni isn&amp;rsquo;t on par with making students actually want to program and I find that python is easier to teach to/learn for beginners. Also, since a lot of security software(s)/scripts are based on python, I hopped that would kill 2 birds with 1 stone, by helping students learn a (new) programming language as well as be able to extend the security software(s), if they find lacking in features. Obviously, I did not have a full-on course figured out like how most classes are, the workshop(s) are aimed more towards motivating the members to start learning programming language(s) and understand how software(s) work, and are mostly 1session/week. I have only recently found out you could get funding from the Python Software Foundation, but now I have other adventures away from Malaysia. :(&lt;/p&gt;
&lt;p&gt;It so happens that students just want to learn the stuff they learn at workshop, go back home and come back the next time without much thoughts about it. Although, some are really talented/works hard and comes up with questions/errors that I have not come across. Whenever a discussion takes place on a particular problem, not many wants to chime in with their ideas, they like to just keep quiet or agree to it. Not sure if the agreeing part is for the sake of agreeing or they&amp;rsquo;re just afraid to voice out their opinions?&lt;/p&gt;
&lt;p&gt;Also, I guess most students visioned that coming to CSFC means we will teach them which buttons to click on vulnerability/exploit finding software(s) and they can start being 1337 H4x0rs. But the sad reality of life is that being good at something doesn&amp;rsquo;t just come from learning to click buttons and knowing how to use a mouse. I, myself, is not a security professional, there are a ton of knowledge I need to gather too, but I am pretty sure it doesn&amp;rsquo;t always just involve clicking buttons and moving your mouse here and there.&lt;/p&gt;
&lt;p&gt;So, after being a part of various communities in Malaysia for awhile, I have come to believe and decided (after thinking hard about it for the past ~4months, having discussed various times with Beard-0 and having talked to a few folks) that the community-ness in Malaysia is certainly at its last breath, don&amp;rsquo;t want to call it dead though. Maybe some still believes it is still growing strong. But to me, it&amp;rsquo;s at its last breath. I&amp;rsquo;d be lucky to attend/help out a few more community events in June (I know there is one in planning for Fedora Malaysia, if you&amp;rsquo;re interested, please have a look at the &lt;a href=&#34;https://fedoraproject.org/wiki/Ambassadors/MalaysianTeam/Events/Fedora_Malaysia_Planning_Meeting_2014&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;agenda&lt;/a&gt;, we&amp;rsquo;re still getting the date/venue sorted)&lt;/p&gt;
&lt;p&gt;Although, my inner voice do hope that someone from the &amp;ldquo;younger/college/university&amp;rdquo; group in the community step-up and rekindle that community-ness fire in Malaysia. But I know that if I ever need to take a vacation in Malaysia and wants to meet the community folks, I can always find the Fedora/Python/Mozilla Malaysia, &lt;a href=&#34;http://codeequality.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Code Equality&lt;/a&gt; (they&amp;rsquo;re AWESOME!) and some of the HITB folks. :)&lt;/p&gt;
&lt;p&gt;So long and thanks for all the fish!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>[Nullcon HackIM 2014] Forensics 2 Writeup</title>
      <link>https://www.mavjs.org/post/nullcon-hackim-2014-forensics-2-writeup/</link>
      <pubDate>Fri, 31 Jan 2014 09:27:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/nullcon-hackim-2014-forensics-2-writeup/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Points: 200&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description: There was a zip file on the desktop. I can&amp;rsquo;t remember the password for it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We saw a zip file named: &lt;strong&gt;&amp;ldquo;null password.zip&amp;rdquo;&lt;/strong&gt; on the desktop. When
opened, there are 2 files which are encrypted. So it was clear that we
needed to crack the zip.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-forensics-2-writeup_s1600_Selection_271.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;First we looked at some hints from the challenge creator ;)&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/hashtag/Hint?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Hint&lt;/a&gt; for FOR2 &amp;quot;User was too dumb to store the password in the protected zip file itself&amp;quot;  &lt;a href=&#34;https://twitter.com/hashtag/HackIM?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#HackIM&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/ForensicChallenge?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#ForensicChallenge&lt;/a&gt; &lt;a href=&#34;https://twitter.com/nullcon?ref_src=twsrc%5Etfw&#34;&gt;@nullcon&lt;/a&gt; &lt;a href=&#34;https://twitter.com/null0x00?ref_src=twsrc%5Etfw&#34;&gt;@null0x00&lt;/a&gt;&lt;/p&gt;&amp;mdash; Prince Komal Boonlia (@boonlia) &lt;a href=&#34;https://twitter.com/boonlia/status/426989036436078592?ref_src=twsrc%5Etfw&#34;&gt;January 25, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/hashtag/Hint?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Hint&lt;/a&gt; for FOR2 &amp;quot;Why would someone put two files if it could have been done with one file&amp;quot;  &lt;a href=&#34;https://twitter.com/hashtag/HackIM?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#HackIM&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/ForensicChallenge?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#ForensicChallenge&lt;/a&gt; &lt;a href=&#34;https://twitter.com/nullcon?ref_src=twsrc%5Etfw&#34;&gt;@nullcon&lt;/a&gt; &lt;a href=&#34;https://twitter.com/null0x00?ref_src=twsrc%5Etfw&#34;&gt;@null0x00&lt;/a&gt;&lt;/p&gt;&amp;mdash; Prince Komal Boonlia (@boonlia) &lt;a href=&#34;https://twitter.com/boonlia/status/426968851012530176?ref_src=twsrc%5Etfw&#34;&gt;January 25, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;So, &lt;a href=&#34;https://twitter.com/Maxthatsme&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Beard-0&lt;/a&gt; looked at a freshly booted VM of the image (since I was lazy + forgot to save the initial snapshot and was already working on another Forensic challenge) and looked at the Temp folder in AppData/Local, there he found a folder name &lt;strong&gt;Rar$DI99.160&lt;/strong&gt; inside which had one of the file &lt;strong&gt;&amp;ldquo;Null final1.pdf&amp;rdquo;&lt;/strong&gt;. From this we looked at known attacks on zip files and found https://en.wikipedia.org/wiki/Known-plaintext_attack&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-forensics-2-writeup_s1600_Selection_272.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;We zipped the &lt;strong&gt;&amp;ldquo;Null final1.pdf&amp;rdquo;&lt;/strong&gt; into a zip. Installed the evaluation edition of Ultimate Zip Cracker - http://download.cnet.com/Ultimate-ZIP-Cracker/3000-2092_4-10040839.html&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-forensics-2-writeup_s1600_Selection_273.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt; Selected the &amp;ldquo;Plaintext attack&amp;rdquo; recovery method.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-forensics-2-writeup_s1600_Selection_274.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Chose the &amp;ldquo;Null final1.pdf&amp;rdquo; zip file as plaintext file.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-forensics-2-writeup_s1600_Selection_275.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;And finally we had the unzip&amp;rsquo;d archive.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>[Nullcon HackIM 2014] Forensics 5 Writeup</title>
      <link>https://www.mavjs.org/post/nullcon-hackim-2014-forensics-5-writeup/</link>
      <pubDate>Mon, 27 Jan 2014 15:24:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/nullcon-hackim-2014-forensics-5-writeup/</guid>
      <description>&lt;p&gt;I play security competitions called Capture The Flag (CTF) with a
group called &lt;a href=&#34;http://gliderswirley.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Glider Swirley&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Points: 500&lt;/strong&gt;
&lt;strong&gt;Description: The client says that the system was compromise. There was no evidence found for the same. The client claims that some anti-forensics tool was used to remove the evidences. Our investigator agrees to it. Can you find out what was the command that was executed and at what time it was done?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There was a hint for it by one of the organizers.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/hashtag/Hint?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Hint&lt;/a&gt; for FOR5 &amp;quot;it crashed when it was being cleaned up&amp;quot;  &lt;a href=&#34;https://twitter.com/hashtag/HackIM?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#HackIM&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/ForensicChallenge?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#ForensicChallenge&lt;/a&gt; &lt;a href=&#34;https://twitter.com/nullcon?ref_src=twsrc%5Etfw&#34;&gt;@nullcon&lt;/a&gt; &lt;a href=&#34;https://twitter.com/null0x00?ref_src=twsrc%5Etfw&#34;&gt;@null0x00&lt;/a&gt;&lt;/p&gt;&amp;mdash; Prince Komal Boonlia (@boonlia) &lt;a href=&#34;https://twitter.com/boonlia/status/427135133129269248?ref_src=twsrc%5Etfw&#34;&gt;January 25, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;Since all the forensics challenges were based on 1 VM image, it was already known that the image is Windows 7 SP1 x86, thus the profile to use for volatility - &lt;a href=&#34;https://code.google.com/p/volatility/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://code.google.com/p/volatility/&lt;/a&gt; was &lt;strong&gt;Win7SP1x86&lt;/strong&gt;. So I acquired the memory dump of the system (MEMORY.DMP)&lt;/p&gt;
&lt;p&gt;As this was the first time we (me &amp;amp; &lt;a href=&#34;https://twitter.com/Maxthatsme&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Beard-0&lt;/a&gt;) had to use volatility, I tried to get familiar with it by looking at the process list. Issued with&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [nullcon-2014] &amp;gt;&amp;gt;&amp;gt; % vol.py -f MEMORY.DMP --profile=Win7SP1x86 pslist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Showed a few processes. But clearly by that I knew it wasn&amp;rsquo;t show me anything about a command being executed or a process crashing. Beard-0 looked through a few usage of volatility and found &lt;strong&gt;cmdscan&lt;/strong&gt;. So I tried it out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [nullcon-2014] &amp;gt;&amp;gt;&amp;gt; % vol.py -f MEMORY.DMP --profile=Win7SP1x86 cmdscan 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Volatility Foundation Volatility Framework 2.3.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    **************************************************
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandProcess: conhost.exe Pid: 2200
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandHistory: 0x292a70 Application: TPAutoConnect.exe Flags: Allocated
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandCount: 0 LastAdded: -1 LastDisplayed: -1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    FirstCommand: 0 CommandCountMax: 50
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ProcessHandle: 0x58
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    **************************************************
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandProcess: conhost.exe Pid: 2996
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandHistory: 0x5f04f8 Application: cmd.exe Flags: Allocated, Reset
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandCount: 2 LastAdded: 1 LastDisplayed: 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    FirstCommand: 0 CommandCountMax: 50
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ProcessHandle: 0x58
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Cmd #0 @ 0x5ed400: cd desktop
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Cmd #1 @ 0x5f4730: sdelete -c -z c:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Cmd #36 @ 0x5c00c4: ^?_?\???\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Cmd #37 @ 0x5ed108: _?\????
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    **************************************************
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandProcess: conhost.exe Pid: 2996
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandHistory: 0x5f0698 Application: sdelete.exe Flags: Allocated
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CommandCount: 0 LastAdded: -1 LastDisplayed: -1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    FirstCommand: 0 CommandCountMax: 50
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ProcessHandle: 0x50
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So it seems the process we want is &lt;strong&gt;sdelete -c -z c:&lt;/strong&gt;, but the flag format requires, the command and the time. So definitely it seems, we need a screenshot of when the process crashed. Now does volatility have a screenshot feature? Well, since it&amp;rsquo;s so awesome it does.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [nullcon-2014] &amp;gt;&amp;gt;&amp;gt; % vol.py -f MEMORY.DMP --profile=Win7SP1x86 screenshot --dump-dir shots/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It just needs a directory to dump the screenshots and voila, one of
the screenshots shows up:


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-forensics-5-writeup_s1600_session_1.WinSta0.Default.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Zeromutarts CTF Crypto Challenges</title>
      <link>https://www.mavjs.org/post/zeromutarts-ctf-crypto-challenges/</link>
      <pubDate>Mon, 27 Jan 2014 15:08:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/zeromutarts-ctf-crypto-challenges/</guid>
      <description>&lt;h2 id=&#34;the-magic-of-rsa-100&#34;&gt;The magic of rsa (100)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;You were able to hear some whispering on the last crypto party!
*whisper* $d$ is 35181901. Keep it secret or we are doomed!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We were given 2 files for the challenge.&lt;/p&gt;
&lt;h3 id=&#34;1-rsapy&#34;&gt;1) rsa.py&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65354147&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    e &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;??&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open( sys&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;argv[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] , &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; f: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# you&amp;#39;ll have to insert the decrypt function for each line(number) here!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#dec = ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print chr(dec)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-rsatxt&#34;&gt;2) rsa.txt&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    32588732
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    56947340
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16730166
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16529146
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    17037091
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    9958499
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    18895626
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    49410873
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    58063242
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16529146
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    18895626
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    30273022
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    58063242
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    30273022
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    60194095
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    9956852
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    58063242
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    44337129
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16730166
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    5059543
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    40999214
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    39158796
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    5059543
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    58063242
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    54302449
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    9958499
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    58063242
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    8646641
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16730166
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    51307370
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16730166
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    57845836
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    16730166
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    34996934
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    32762958
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you read up about &lt;a href=&#34;https://en.wikipedia.org/wiki/RSA_%28cryptosystem%29#Decryption&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RSA decryption&lt;/a&gt; on Wikipedia, it&amp;rsquo;s pretty
simple and straightforward to solve this challenge. You need $C$ =
ciphertext (we got loads of it there in rsa.txt, just need to use one by
one), $d$ = private key exponent (we got that as well), $n$ = modulus for
both private and public keys. Thus, $M \equiv C^{d} \bmod n$&lt;/p&gt;
&lt;p&gt;Here, I used &lt;a href=&#34;https://cloud.sagemath.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;sagemath&lt;/a&gt; cloud application to solve it as follows. You could actually save the following into a python script and run it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65354147&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;35181901&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ctuple &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;32588732&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;56947340&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16730166&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16529146&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;17037091&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;9958499&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;18895626&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;49410873&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;58063242&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16529146&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;18895626&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;30273022&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;58063242&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;30273022&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;60194095&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;9956852&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;58063242&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;44337129&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16730166&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5059543&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;40999214&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;39158796&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5059543&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;58063242&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;54302449&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;9958499&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5806&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;3242&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;8646641&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16730166&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;51307370&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16730166&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;57845836&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;16730166&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;34996934&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;32762958&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; ctuple:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lol &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pow(i, d, n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; chr(lol)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Result for http://zeromutarts.de/task/rsa_magic : &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; result
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;rivest-shamir-adleman-250&#34;&gt;rivest-shamir-adleman (250)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;*This one is important, we have no clue how to decrypt the secret message! Can you help us?*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We were given 2 files for this challenge as well.&lt;/p&gt;
&lt;h3 id=&#34;1-rivestpy&#34;&gt;1) rivest.py&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80646413&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    e &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# You&amp;#39;ll have to find the d yourself..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; unknown
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; open( sys&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;argv[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] , &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; f: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# you&amp;#39;ll have to insert the decrypt function for each line(number) here!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;#dec = ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print chr(dec)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# might come handy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xgcd&lt;/span&gt;(a,b):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extended GCD:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        Returns (gcd, x, y) where gcd is the greatest common divisor of a and b
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        with the sign of b if b is nonzero, and with the sign of a if b is 0.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        The numbers x,y are such that gcd = ax+by.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        prevx, x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;  prevy, y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; b:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            q, r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; divmod(a,b)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            x, prevx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; prevx &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; q&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;x, x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            y, prevy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; prevy &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; q&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;y, y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            a, b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; b, r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; a, prevx, prevy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;modinv&lt;/span&gt;(a, m):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Modular multiplicative inverse, i.e. a^-1 = 1 (mod m)&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        a, u, v &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xgcd(a, m)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;No inverse: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; (mod &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (a, m))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; u
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-rivesttxt&#34;&gt;2) rivest.txt&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    72895864
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    15633602
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    38820479
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    60303684
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    7458706
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    60299530
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    20682371
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    54642689
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    26066811
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    32615038
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    35349196
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    38820479
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    56463813
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    80491201
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    35349196
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    69567074
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    26066811
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    74270178
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76127647
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76127647
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    15633602
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    60303684
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    38820479
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    56463813
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    60303684
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    72844764
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76127647
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    69302434
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    15633602
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    80491201
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    6809712
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    26066811
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76400140
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    42498798
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    60299530
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    76127647
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    69302434
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    80491201
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    33234011
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This time we seriously need sagemath to solve it. :) Since we don&amp;rsquo;t know the $d$ to decrypt the messages for this challenge, we first need to
find the $p$ &amp;amp; $q$ to get $d$. The most straightforward way to get that is to
use &lt;a href=&#34;https://en.wikipedia.org/wiki/Fermat%27s_factorization_method&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fermat&amp;rsquo;s Factorization method&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I used the formula from here: http://facthacks.cr.yp.to/fermat.html to
get $p$ &amp;amp; $q$.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80646413&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    e &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ctuple &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;72895864&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;15633602&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;38820479&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;60303684&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;7458706&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;60299530&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;20682371&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;54642689&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;26066811&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;32615038&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;35349196&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;38820479&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;56463813&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;80491201&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;35349196&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;69567074&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;26066811&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;74270178&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76127647&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76127647&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;15633602&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;60303684&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;38820479&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;56463813&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;60303684&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;72844764&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76127647&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;69302434&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;15633602&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;80491201&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;6809712&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;26066811&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76400140&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;42498798&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;60299530&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;76127647&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;69302434&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;80491201&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;33234011&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fermatfactor&lt;/span&gt;(N):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; N &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [N]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; is_even(N): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,N&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ceil(sqrt(N))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; is_square(a&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;N):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(a&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;N)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [a &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; b,a &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; b]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    p, q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fermatfactor(n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    phi&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(p&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(q&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;pow(e,&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,phi)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; ctuple:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lol&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;pow(i,d,n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;chr(lol)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Result for result http://zeromutarts.de/task/rivest-shamir-adleman : &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; result
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>[Nullcon HackIM 2014] Misc 1 Writeup</title>
      <link>https://www.mavjs.org/post/nullcon-hackim-2014-misc-1-writeup/</link>
      <pubDate>Mon, 27 Jan 2014 20:02:01 +0800</pubDate>
      <guid>https://www.mavjs.org/post/nullcon-hackim-2014-misc-1-writeup/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This post was orginally posted on apucsfc.org&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, which was a university security club where the author was a part of the CTF team and wrote this post back in 2014.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Points: 100&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description: Sam has parked his car in front of a store. Find the name of the store.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File: Level 1.pcap&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As the usual, opened up the pcap file with wireshark. Looked around for some packet data that were interesting. Found an HTTP packet that had an image data in it. Exported the data by clicking &lt;code&gt;File-&amp;gt;Export Objects-&amp;gt;HTTP&lt;/code&gt;, select the packet and save it as &lt;code&gt;.png&lt;/code&gt;. And we get this image.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-misc-1-writeup_carved-file.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;First tried looking at hex and fiddling with the colours. Then, read the description again and thought of GPS, so we looked into the metadata of the image using ImageMagick’s &lt;code&gt;identify&lt;/code&gt; tool.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ identify -verbose blah2.png
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Got the stuff below (snipped).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Properties:
date:create: 2014-01-27T19:46:46+08:00
date:modify: 2014-01-27T19:46:46+08:00
exif:GPSAltitude: 100000/100
exif:GPSAltitudeRef: 0
exif:GPSInfo: 46
exif:GPSLatitude: 38/1, 51598/1000, 0/1
exif:GPSLatitudeRef: N
exif:GPSLongitude: 77/1, 3371/1000, 0/1
exif:GPSLongitudeRef: W
exif:GPSMapDatum: WGS-84
exif:GPSVersionID: 2, 2, 0, 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Converted the 2 GPS coordinates to proper ones that map applications could use. &lt;code&gt;38.859967,-77.056183&lt;/code&gt;. Put that into Google Maps and got the following;&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/nullcon-hackim-2014-misc-1-writeup_sam-car.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The domain has ceased to exist for a while, possibly until about 2017. You can find the archive of it here: &lt;a href=&#34;https://web.archive.org/web/20161026194658/http://www.apucsfc.org/nullcon-hackim-2014-misc-1-writeup/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://web.archive.org/web/20161026194658/http://www.apucsfc.org/nullcon-hackim-2014-misc-1-writeup/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Analysis of iWebSpace Android Application</title>
      <link>https://www.mavjs.org/post/analysis-of-iwebspace-android/</link>
      <pubDate>Thu, 26 Sep 2013 07:41:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/analysis-of-iwebspace-android/</guid>
      <description>&lt;p&gt;If you follow me enough on twitter (&lt;a href=&#34;https://twitter.com/@mavjs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@mavjs&lt;/a&gt;), read my home page or follows my Fedora Ambassador wiki page, you&amp;rsquo;ll probably know that I study at the &lt;a href=&#34;http://apu.edu.my/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Asia Pacific University of Technology and Innovation&lt;/a&gt;, Malaysia. This is my account of the n00b analysis done in my free time on the university&amp;rsquo;s android application.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=edu.my.apiit.iWebSpace&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;iWebSpace android application&lt;/a&gt; is, as quoted from its non-working Google Play page, &amp;ldquo;The Asia Pacific University APP provides convenient access to important information and to most of our services in your hand&amp;rdquo; - pretty cool and convenient for most students.&lt;/p&gt;
&lt;p&gt;The only thing in my mind was to do an analysis before actually using it and mostly because this is the first time the university&amp;rsquo;s &lt;a href=&#34;http://www.apu.edu.my/cti&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Center of Technology and Innovation (CTI)&lt;/a&gt; - a R&amp;amp;D department, produced a mobile application. They have both an iPhone version and an android version. Since I don&amp;rsquo;t own a Macbook, I couldn&amp;rsquo;t do any analysis on the former version. And android was easier to read as I&amp;rsquo;m more familiar with Java. That being said about the app, let&amp;rsquo;s see my n00b findings.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I acquired the .apk from a friend. (I think it&amp;rsquo;s verion 1.0 and also I don&amp;rsquo;t own an android)&lt;/li&gt;
&lt;li&gt;Used &lt;a href=&#34;https://code.google.com/p/dex2jar/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;dex2jar&lt;/a&gt; to convert .apk to .jar.&lt;/li&gt;
&lt;li&gt;Used &lt;a href=&#34;http://jd.benow.ca/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;JD-GUI&lt;/a&gt; to open and read the .jar file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;First thing on my mind after opening the .jar file with JD-GUI was to see how the application was authentication the students. So, I scrolled through the code and found a Login class. Inside that Login class, it has a doLogin() method that logs you into the system, once you&amp;rsquo;ve your student ID and password supplied. I took a closer look at it and guess what I found?&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_169.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Yup, HTTP. Awesome. No comments there. Let&amp;rsquo;s move along. Assuming, the majority of the students don&amp;rsquo;t care about their student ID and password, this is pretty much fine, I guess. :P&lt;/p&gt;
&lt;p&gt;The app has functions to show the students, their pending/paid fees, attendance, timetable and exam timetables. Pretty cool and convenient, definitely. So, I did further look at those functions. Firstly, let&amp;rsquo;s look at Fee function. The Fee class has an onCreate() function, that sets up the view. Further look at it suggests that, it uses a md5 string + student ID to query the Fee status of a particular student. Have a look.&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_170.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;So, I took a closer look at the md5 string. The developers from CTI loves to keep their variable naming short (i, j, k, m, str1, str2). What does &lt;strong&gt;str1&lt;/strong&gt; actually md5-ing?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;int i is getting the YEAR
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;int j is getting the MONTH
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;int k is getting the DATE , which is day of the month
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;int m is getting the HOUR_OF_DAY
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From the above, if you reconstruct the md5 string with the current datetime on my system (26-09-2013 15:00:00), you get the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    md5(&lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Student ID&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2013&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1640a3e25cc45123c5e234606aefbeb2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the same for the attendance function. The timetable and exam schedule functions aren&amp;rsquo;t that interesting, so I&amp;rsquo;ll not write about it here. When reported about the above, the only reply was that they will secure the web services. Does that mean they will keep sending the student ID and password over plain HTTP? I&amp;rsquo;ve no idea. :D I looked at the Google Play store page for the app and found that it couldn&amp;rsquo;t be found. What&amp;rsquo;s up?&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_167.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;But the most interesting part about the whole app is the ActiveWebspace class. It seems to register the device using the application to the server so that they can see what&amp;rsquo;s the count of devices using the app and to send push notifications to them. The server is registered with some unique regId, name and email to a web application residing at the following:&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_171.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Once I found that URL, the only logical thing for me to do was to go one directory up, and see if I could find anything. And I did. This is what I found;&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_164.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;There was no authentication or whatsoever needed to access that, although they&amp;rsquo;ve 403&amp;rsquo;d the service after some hour that I reported about it. The reply they sent me was accordingly;&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_166.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Cool story - &amp;ldquo;illustration purpose&amp;rdquo;. But it seems the message box can be used to send push notification from the look of the JavaScript function they were using:&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/analysis-of-iwebspace-android_s1600_Selection_165.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;Hey, at least this isn&amp;rsquo;t as bad as the iMessage Chat for android where it could possibly &lt;a href=&#34;http://grahamcluley.com/2013/09/imessage-android-trust/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;download malicious&lt;/a&gt; stuff, right? :P
I think I&amp;rsquo;ll probably only use those services via web. Maybe some other day when I&amp;rsquo;m free, I&amp;rsquo;ll try looking at the iPhone version and see what kind of stuff they coded in. XD
On another note, this was all done on a &lt;a href=&#34;https://getfedora.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora 19&lt;/a&gt; laptop. Ciao!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Steam fail to start</title>
      <link>https://www.mavjs.org/post/steam-fail-to-start/</link>
      <pubDate>Sat, 14 Sep 2013 04:43:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/steam-fail-to-start/</guid>
      <description>&lt;p&gt;Last night I was playing some games on Steam and closed it after I finished playing. Then I browsed around the &lt;a href=&#34;https://www.humblebundle.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Humble Bundle&lt;/a&gt; and bought the Humble Indie Bundle 9 since I wanted  &lt;a href=&#34;http://www.markoftheninja.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Mark of the Ninja&lt;/a&gt;, so to redeem it I switched on Steam. But it wasn&amp;rsquo;t starting up. So, opened it from terminal and got some errors, but those were there since ages and doesn&amp;rsquo;t actually affected the start up last time.&lt;/p&gt;
&lt;p&gt;So, this morning, I was talking to a friend on IRC about it and he mentioned that you could just do&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    /usr/bin/steam --reset
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to reinstall and start again..and voilà it was indeed working again. :)&lt;/p&gt;
&lt;p&gt;[Note]: Another friend suggested to restart the router, not sure how effective that would have been though. :P&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Zsh Autocomplete Function to change and auto complete directories&#39; name</title>
      <link>https://www.mavjs.org/post/zsh-autocomplete-function-to-change-and/</link>
      <pubDate>Sat, 27 Oct 2012 05:01:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/zsh-autocomplete-function-to-change-and/</guid>
      <description>&lt;p&gt;About some weeks ago, I was trying to find a way to alias my favourite directory (~/Programming/Pythons) in zsh, and it should show me the directories contained inside it. But aliasing doesn&amp;rsquo;t work, except to &lt;code&gt;cd&lt;/code&gt; me to that directory. Or a function can help me get into the directories inside ~/Programming/Pythons but I&amp;rsquo;d have to type out the directories&amp;rsquo; name manually. That wasn&amp;rsquo;t an option either.&lt;/p&gt;
&lt;p&gt;So I turned to &amp;ldquo;Uncle Google&amp;rdquo; :P for it. Also what I remembered from Zsh is that it&amp;rsquo;s auto completion is really awesome. So I searched for &amp;ldquo;zsh autocomplete function&amp;rdquo; and read some stackoverflow examples and stuff. But I had some errors if I was using &lt;a href=&#34;https://github.com/robbyrussell/oh-my-zsh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;oh-my-zsh&lt;/a&gt;&amp;lsquo;s functions.zsh to store/write my zsh auto complete function in it.&lt;/p&gt;
&lt;p&gt;What I did was, instead of writing that auto complete function inside oh-my-zsh&amp;rsquo;s functions.zsh, I wrote it directly inside .zshrc, like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; prog&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cd ~/Programming/Pythons/$1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _prog&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _files -W ~/Programming/Pythons;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    compdef _prog prog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this code actually does is that when you type &lt;code&gt;prog&lt;/code&gt; after sourcing your .zshrc file, it expands the defined directory, in here; &amp;lsquo;~/Programming/Pythons/&amp;rsquo; and the argument $1 is based on whatever directory you selected from the expansion of the directory from the function  &lt;code&gt;_prog()&lt;/code&gt;, like this;&lt;/p&gt;


















&lt;figure  &gt;
  &lt;div class=&#34;d-flex justify-content-center&#34;&gt;
    &lt;div class=&#34;w-100&#34; &gt;&lt;img src=&#34;https://www.mavjs.org/img/zsh-autocomplete-function-to-change-and_s1600_Selection_021.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; data-zoomable /&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/figure&gt;

&lt;p&gt;This exactly did what I needed. If you got awesome auto complete
functions written, do share it at the comments. :)&lt;/p&gt;
&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://zsh.sourceforge.net/Guide/zshguide06.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://zsh.sourceforge.net/Guide/zshguide06.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://stackoverflow.com/questions/10700012/zsh-autocomplete-function-based-on-2-arguments&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://stackoverflow.com/questions/10700012/zsh-autocomplete-function-based-on-2-arguments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/Zsh#Command_Completion&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://wiki.archlinux.org/index.php/Zsh#Command_Completion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Introduction to Grok web application framework @ UCTI</title>
      <link>https://www.mavjs.org/post/introduction-to-grok-web/</link>
      <pubDate>Sun, 09 Sep 2012 06:34:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/introduction-to-grok-web/</guid>
      <description>&lt;p&gt;Hey folks, we, the &lt;a href=&#34;http://fedora.my&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora Malaysia&lt;/a&gt; community in conjunction with UCTI Free &amp;amp; Open Source Software SIG, have planned for an introductory workshop on &lt;a href=&#34;http://grok.zope.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Grok&lt;/a&gt;, a web application framework. It uses the &lt;a href=&#34;http://docs.zope.org/zopetoolkit&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Zope Toolkit (ZTK)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This session is aimed towards finding more python as well as zope/plone/FOSS developers  in Malaysia. The session is mentored by our very own &lt;a href=&#34;https://fedoraproject.org/wiki/Ambassadors&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora Ambassador&lt;/a&gt;, &lt;a href=&#34;http://blog.kagesenshi.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Izhar a.k.a KageSenshi&lt;/a&gt;, who works at a local Plone support and service company called &lt;a href=&#34;http://www.inigo-tech.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Inigo Consulting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Following are the details of the session:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Date:&lt;/strong&gt; Sun 15th July, 2012&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time:&lt;/strong&gt; 11:00-18:00&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Venue:&lt;/strong&gt; Level-2 Room-5 (L2-5), UCTI (Google Maps:
&lt;a href=&#34;http://goo.gl/maps/dI7h&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;http://goo.gl/maps/dI7h&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fee:&lt;/strong&gt; Free Of Charge ;)&lt;/p&gt;
&lt;p&gt;Folks coming to the session, (that&amp;rsquo;s you!), should bring along their own laptops (obviously!) and do not necessarily need to know &lt;a href=&#34;http://python.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python&lt;/a&gt;, but need to have programming knowledge. Learning/knowing Python can be enhanced later on. Also need to know basic/intermediate HTML/CSS/JS.&lt;/p&gt;
&lt;p&gt;Although, we prefer Unix/Linux systems like &lt;a href=&#34;https://fedoraproject.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora&lt;/a&gt;, users are welcome to use any platform that they wish, provided that they know how to install Grok or any other software packages and troubleshoot problems if they arise.&lt;/p&gt;
&lt;p&gt;We might be passing around some Fedora 17 if we happen to not finish them off at Malaysia OpenSource Conference. :P So, if you happen to know how to use *nix system and just need to boot it up to it, you can use a virtual machine to boot into a *nix system using the CDs/DVDs passed around or you can also ask me, for an ISO image before the session, if you need one. :)&lt;/p&gt;
&lt;p&gt;See you all there!&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;p&gt;Zope/Plone User Group Malaysia G+: http://goo.gl/HcM7n&lt;/p&gt;
&lt;p&gt;Zope/Plone User Group Malaysia Maliling List: http://groups.google.com/group/zplug-my&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting Python Libraries Installed The Normal Way on Windows</title>
      <link>https://www.mavjs.org/post/getting-python-libraries-installed/</link>
      <pubDate>Thu, 10 May 2012 00:38:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/getting-python-libraries-installed/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using GNU/Linux distributions for almost 2 years and with &lt;a href=&#34;https://fedoraproject.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fedora&lt;/a&gt; for about ~7-8 months.&lt;/p&gt;
&lt;p&gt;Every single day I do some experiments with &lt;a href=&#34;http://python.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;python&lt;/a&gt;, and every single time it makes me feel comfortable using Fedora to write scripts. It removes headaches from happening because I don&amp;rsquo;t have to figure out ways to install python libraries you need. I can just go forward with concentrating on coding.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a little script I wrote called; &lt;em&gt;&lt;a href=&#34;https://github.com/mavjs/ucti-timetable&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ucti-timetable&lt;/a&gt;&lt;/em&gt;. It&amp;rsquo;s used to download timetables from my university and store them locally. But since a large user base from my university are windows users, I had to make it work on windows as well. Well, to be honest it works, but only one thing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PAIN!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s so painful to install a python library on windows. It fails most of the time&amp;hellip;why is that?, you ask me..&lt;/p&gt;
&lt;p&gt;Well, it&amp;rsquo;s because the python executable path is not in your $PATH. dafuq, right? So, yeah, this is how you do it (based on Windows 7):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Right click -&amp;gt; My Computer -&amp;gt; Properties -&amp;gt; Advanced System Settings -&amp;gt; Advanced tab -&amp;gt;Environment Variables -&amp;gt; System Variables&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;after that find &lt;code&gt;PATH&lt;/code&gt; and append this or equivalent (depending on where your python gets installed): &lt;code&gt;C:\Python27\&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Only after you do this you could install &lt;a href=&#34;http://www.crummy.com/software/BeautifulSoup&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;BeautifulSoup&lt;/a&gt; the &lt;em&gt;&amp;ldquo;normal&amp;rdquo;&lt;/em&gt; way&lt;/p&gt;
&lt;p&gt;&lt;code&gt; python setup.py install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Insane, right?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Spreading Fedora Love - One At A Time</title>
      <link>https://www.mavjs.org/post/spreading-fedora-love-one-at-a-time/</link>
      <pubDate>Mon, 30 Apr 2012 03:32:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/spreading-fedora-love-one-at-a-time/</guid>
      <description>&lt;p&gt;Disclaimer: This post is actually abit overdue. Was supposed to be up
by Tuesday, but some stuff caught up.&lt;/p&gt;
&lt;p&gt;Event Details&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Time: 10:00 - 16:00&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Date: 23rd April, 2012&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Venue: UCTI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aim: Sharing knowledge/Teaching about GNU/Linux operating system(s).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This event was organized by &lt;a href=&#34;https://twitter.com/#!/rebelk0de&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;rebelk0de&lt;/a&gt; and I,
&lt;a href=&#34;https://fedoraproject.org/wiki/User:Mavjs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Maverick&lt;/a&gt;. I have been contributing to Fedora Malaysia for about ~5-7months now, while rebelk0de has long since contributed/helped Fedora MY.&lt;/p&gt;
&lt;p&gt;It was aimed at sparkling the GNU/Linux and FOSS enthusiasm in &lt;a href=&#34;http://ucti.edu.my&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;UCTI&lt;/a&gt;, the event venue for FUDCon KL. Since UCTI had thousands of students, we had to start off with something smaller. So, we look for a small group of technical folks among the students, and we found the &lt;a href=&#34;https://sites.google.com/site/uctitechnicalassistantsteam&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;UCTI Technical Assistants&lt;/a&gt; (TAs). TAs work in the UCTI computer labs to maintain approimately 300 computers running Windows operating system, daily.&lt;/p&gt;
&lt;p&gt;And as recently, I, together with rebelk0de (as advisor) and a small group of 4 people, have been working hard to get UCTI Free &amp;amp; Open Source Software Special Interest Group (FOSS SIG) back into shape and in official status. Therefore, as a recruitment drive, to share knowledge about FOSS &amp;amp; GNU/Linux and to promote &amp;amp; expand the &amp;ldquo;Fedora Love&amp;rdquo; to the folks here in UCTI, I was there at the date of the event.&lt;/p&gt;
&lt;p&gt;The event&amp;rsquo;s objective was to get Fedora and Ubuntu running with little or no headaches involved for beginners. And to understand abit about getting the installed operating system up and running with things the users needed getting installed on a as needed basis, so, mainly it was about teaching them how to make use of the &amp;ldquo;yum&amp;rdquo; and &amp;ldquo;apt-get&amp;rdquo; package management utilities.&lt;/p&gt;
&lt;p&gt;The event started around 11:00 and was headed by rebelk0de. I was the assistant ;), mainly to help out when folks couldn&amp;rsquo;t catch up or something went wrong with their Fedora installs. I mainly shared my knowledge about &amp;ldquo;things to watch out for when installing Fedora&amp;rdquo;, especially, the different types of installation processes and some tips &amp;amp; tricks for beginners. I also distributed some leftover Fedora 16 CDs that I had from this year&amp;rsquo;s FAD, almost all of the folks that showed up got it.&lt;/p&gt;
&lt;p&gt;We took off the event by installing &amp;ldquo;Fedora&amp;rdquo; on the virtualboxes which took approximately 30mins. The installation environments were inside virtualbox on Windows hosts. The reason to take this approach was that we would have needed a lot of extra precious hard disks for this one event, the machines retains their changes after reboot (so it was easier to use virtualboxes) and most of the folks who showed up have never installed/used either Fedora or Ubunt and GNU/Linux in general. Most of the time was taken on explanining the installation process and post installation configurations such as &amp;ldquo;adding their users to the sudoers if they forgot to add it&amp;rdquo; and about using the vi text editor.&lt;/p&gt;
&lt;p&gt;Most of the tutorial/hands-on were done on Fedora. Ubuntu was just used to show how to use the package management utilities. We all had a lunch break around 14:00-15:00. And we wrapped up the event by 16:00.&lt;/p&gt;
&lt;p&gt;rebelk0de and I have promised the folks to have more continuous classes for them in the future, and they have agreed. So, on with more classes/events then! :D&lt;/p&gt;
&lt;p&gt;P.S. Will share the event photos after getting uploaded to Fedora My&amp;rsquo;s Albums. ;)&lt;/p&gt;
&lt;p&gt;Edit: Here is the photos from the event: &lt;a href=&#34;https://plus.google.com/photos/109153510244556917522/albums/5735474293982143825&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GNU/Linux Intro Class at UCTI&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blogger CLI Posting Tip</title>
      <link>https://www.mavjs.org/post/blogger-cli-posting-tip_5796/</link>
      <pubDate>Sat, 21 Apr 2012 15:01:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/blogger-cli-posting-tip_5796/</guid>
      <description>&lt;p&gt;What do you do when you&amp;rsquo;re a geek who uses Fedora, needs to write blog posts on blogspot.com and like only command line based clients?&lt;/p&gt;
&lt;p&gt;Well, you do a &amp;lsquo;yum search&amp;rsquo;, of course. And then there you will find something called &amp;lsquo;googlecl&amp;rsquo;. So you do&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # yum install googlecl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, you could just write a blog post within a text file and post to the blog by doing;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell-session&#34; data-lang=&#34;shell-session&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    % blogger post --tags &amp;#34;GoogleCl, Fedora&amp;#34; --src /path/to/post/file --title &amp;#34;your post title&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it! :)&lt;/p&gt;
&lt;p&gt;posted from &lt;strong&gt;googlecl&lt;/strong&gt; on fedora 16 :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello World!</title>
      <link>https://www.mavjs.org/post/hello-world_4159/</link>
      <pubDate>Fri, 13 Apr 2012 19:22:00 +0000</pubDate>
      <guid>https://www.mavjs.org/post/hello-world_4159/</guid>
      <description>&lt;p&gt;Welp, this is the first post on this blog. :)&lt;/p&gt;
&lt;p&gt;Watch this blog for some #GNU/Linux, #FLOSS, #InfoSec &amp;amp; #Coding tips
&amp;rsquo;n tricks!&lt;/p&gt;
&lt;p&gt;//posted from googlecl on fedora ;)&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
