<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OpenOffice</title><link>https://terokarvinen.com/tags/openoffice/</link><description>OpenOffice</description><language>en-us</language><lastBuildDate>Fri, 02 Oct 2026 17:04:19 +0300</lastBuildDate><image><url>https://terokarvinen.com/img/favicon.png</url><title>OpenOffice</title><link>https://terokarvinen.com/tags/openoffice/</link></image><atom:link href="https://terokarvinen.com/tags/openoffice/index.xml" rel="self" type="application/rss+xml"/><item><title>tBar for LibreOffice Impress</title><link>https://terokarvinen.com/tbar-for-impress/</link><pubDate>Fri, 02 Oct 2026 17:04:19 +0300</pubDate><guid>https://terokarvinen.com/tbar-for-impress/</guid><description>
&lt;p>Hide slide overflow.&lt;/p>
&lt;p>Change slide layout from toolbar, don't waste 10% of screen for sidebar.&lt;/p>
&lt;p>&lt;img src="tbar.png" alt="">&lt;/p>
&lt;p>An extension for LibreOffice Impress.&lt;/p>
&lt;p>&lt;a href="tbar-impress.oxt">Download tbar-impress.oxt&lt;/a>. LibreOffice Impress: Tools: Extensions: Add.&lt;/p>
&lt;p>&lt;br>&lt;br>&lt;br>&lt;br>&lt;/p>
&lt;div class=pad>
&lt;a href="tbar-impress.oxt" class="downloadAButton pad">Download &lt;b>tbar-impress.oxt&lt;/b>&lt;/a>
&lt;/div>
&lt;p>&lt;br>&lt;br>&lt;br>&lt;br>&lt;/p>
&lt;p>Beta. Tested with LibreOffice Impress 25.2.3.2. It's the one that comes with Debian stable, 13-trixie. Or just 'sudo apt-get update; sudo apt-get install libreoffice-impress'. Created with the assistance of artificial intelligence.&lt;/p>
&lt;h2 id="readmemd">README.md&lt;/h2>
&lt;p>&lt;strong>Change a slide's layout in one click, and see at a glance what is hanging off the edge of your slide.&lt;/strong>&lt;/p>
&lt;p>&lt;a href="#big-screenshot">&lt;img src="screenshot-755.png" alt="">&lt;/a>&lt;/p>
&lt;p>tBar Impress adds one toolbar to Impress with two things:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Slide layout toolbar buttons&lt;/strong> – the 12 standard slide layouts (Blank, Title Slide, Title and Content, two columns, …) as one-click buttons. No more hunting in the sidebar or in &lt;em>Slide ▸ Layout&lt;/em>.&lt;/li>
&lt;li>&lt;strong>Hide slide overflow&lt;/strong> – one button that shades everything outside the slide. Pictures, charts or text boxes that stick out past the edge become obvious, and what is left bright is exactly what your audience will see. The shading exists only on screen: it is never printed, never exported, never saved, never in Undo, and it does not mark your file as changed.&lt;/li>
&lt;/ul>
&lt;h2 id="start-using-it">Start using it&lt;/h2>
&lt;ol>
&lt;li>Download the latest &lt;code>tbar-impress-VERSION.oxt&lt;/code> (for example &lt;code>tbar-impress-0.0.3.oxt&lt;/code>).&lt;/li>
&lt;li>In LibreOffice: &lt;strong>Tools ▸ Extensions ▸ Add…&lt;/strong>, choose the downloaded &lt;code>.oxt&lt;/code> file, then restart LibreOffice.&lt;/li>
&lt;li>Open or create a presentation. The &lt;strong>tBar Impress&lt;/strong> toolbar appears under the other toolbars. If you don't see it: &lt;strong>View ▸ Toolbars ▸ tBar Impress&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>Using it:&lt;/p>
&lt;ul>
&lt;li>Click a layout button to apply that layout to the current slide. Hover for its name.&lt;/li>
&lt;li>Click &lt;strong>Hide slide overflow&lt;/strong> (the last button) to turn the shading on or off.&lt;/li>
&lt;li>Click the small arrow next to it to pick how dark the shading is (10 %–100 %, default 50 %). Picking a level also turns the shading on. The level is remembered.&lt;/li>
&lt;li>The same commands are in the menu: &lt;strong>View ▸ Hide slide overflow&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>If you used the earlier &lt;em>Quick Layouts&lt;/em> or &lt;em>Dim Non-Visible Area&lt;/em> extensions, remove them in &lt;strong>Tools ▸ Extensions&lt;/strong>; tBar Impress replaces both.&lt;/p>
&lt;p>To remove tBar Impress: &lt;strong>Tools ▸ Extensions&lt;/strong>, select it, &lt;strong>Remove&lt;/strong>.&lt;/p>
&lt;p>Requires LibreOffice 7.0 or later with Python support (included in the official installers; on Linux distributions it may be a separate package such as &lt;code>libreoffice-script-provider-python&lt;/code>). Tested on LibreOffice 24.2.&lt;/p>
&lt;h2 id="verify-the-code">Verify the code&lt;/h2>
&lt;p>You don't have to trust this extension blindly. There is no separate source download, because there doesn't need to be one. &lt;code>tbar-impress-VERSION.oxt&lt;/code> is an ordinary ZIP file containing only text files (Python, XML, Markdown) and PNG images; there is no compiled code. The &lt;code>.oxt&lt;/code> &lt;em>is&lt;/em> the complete source, including this README, the tests and the build tool.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>unzip tbar-impress-*.oxt -d tbar-impress
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#366">cd&lt;/span> tbar-impress
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="whats-inside">What's inside&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>File&lt;/th>
&lt;th>What it is&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tbar.py&lt;/code>&lt;/td>
&lt;td>&lt;strong>The only code LibreOffice runs&lt;/strong> (~480 lines, heavily commented). Implements Hide slide overflow.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Addons.xcu&lt;/code>&lt;/td>
&lt;td>Declares the toolbar buttons, the View-menu entries and which icon goes with which button. Plain data.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>ProtocolHandler.xcu&lt;/code>&lt;/td>
&lt;td>Routes commands starting with &lt;code>com.terokarvinen.tbar-impress:&lt;/code> to &lt;code>tbar.py&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>WindowState.xcu&lt;/code>&lt;/td>
&lt;td>Shows the toolbar docked at the top on first start.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>META-INF/manifest.xml&lt;/code>&lt;/td>
&lt;td>The list of files LibreOffice registers: exactly the four above.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>description.xml&lt;/code>&lt;/td>
&lt;td>Name (tBar Impress), version, publisher, identifier &lt;code>com.terokarvinen.tbar-impress&lt;/code>, minimum LibreOffice version.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>icons/*.png&lt;/code>&lt;/td>
&lt;td>26 toolbar icons (13 buttons × 2 sizes).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>README.md&lt;/code>, &lt;code>docs/screenshot.png&lt;/code>&lt;/td>
&lt;td>This document.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tests/&lt;/code>, &lt;code>tools/&lt;/code>&lt;/td>
&lt;td>Checks and build tool (below). LibreOffice does not run these; it only registers what &lt;code>META-INF/manifest.xml&lt;/code> lists.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>LICENSES/&lt;/code>, &lt;code>REUSE.toml&lt;/code>&lt;/td>
&lt;td>Both license texts (GPL-3.0-or-later, MPL-2.0), and licensing info for the PNG files.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The Slide layout toolbar buttons contain &lt;strong>no code&lt;/strong>. Each one runs LibreOffice's own built-in command &lt;code>.uno:AssignLayout&lt;/code> with a layout number, exactly as the sidebar's Layouts panel does.&lt;/p>
&lt;h3 id="1-check-that-the-oxt-contains-nothing-but-these-files">1. Check that the &lt;code>.oxt&lt;/code> contains nothing but these files&lt;/h3>
&lt;p>The build is reproducible, so rebuilding from the unzipped files must give a byte-identical package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>python3 tools/build.py &lt;span style="color:#09f;font-style:italic"># writes dist/tbar-impress-VERSION.oxt, prints its SHA-256&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sha256sum ../tbar-impress-*.oxt &lt;span style="color:#09f;font-style:italic"># the file you downloaded&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If both hashes match, the package holds exactly the files you just unzipped and can read, and nothing hidden.&lt;/p>
&lt;p>To confirm the file really comes from the author, compare its SHA-256 with the one published next to the download at &lt;a href="https://TeroKarvinen.com">https://TeroKarvinen.com&lt;/a>.&lt;/p>
&lt;h3 id="2-read-what-the-code-is-able-to-do">2. Read what the code is able to do&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>grep -nE &lt;span style="color:#c30">&amp;#34;^import|^from&amp;#34;&lt;/span> tbar.py &lt;span style="color:#09f;font-style:italic"># json, os, re + LibreOffice&amp;#39;s own uno modules only&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grep -n &lt;span style="color:#c30">&amp;#34;open(&amp;#34;&lt;/span> tbar.py &lt;span style="color:#09f;font-style:italic"># one settings file, nothing else&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The comment block at the top of &lt;code>tbar.py&lt;/code> lists everything the code touches.&lt;/p>
&lt;h3 id="3-static-checks-no-libreoffice-needed">3. Static checks (no LibreOffice needed)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>python3 tests/check_static.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This prints one PASS/FAIL line per check. It verifies that:&lt;/p>
&lt;ul>
&lt;li>all XML is well-formed;&lt;/li>
&lt;li>the manifest registers exactly the expected files;&lt;/li>
&lt;li>identifier, name and publisher are correct, and the version is digits and dots only;&lt;/li>
&lt;li>the toolbar has the 12 layouts in order, with the layout numbers from LibreOffice's source (the source location is given in the script), then a separator, then Hide slide overflow;&lt;/li>
&lt;li>every button has an icon and no icon is unused;&lt;/li>
&lt;li>names agree between &lt;code>tbar.py&lt;/code> and the &lt;code>.xcu&lt;/code> files;&lt;/li>
&lt;li>&lt;code>tbar.py&lt;/code> imports nothing beyond &lt;code>json&lt;/code>, &lt;code>os&lt;/code>, &lt;code>re&lt;/code> and LibreOffice's own modules, contains no eval/exec/shell/network calls, and opens no file except its settings file;&lt;/li>
&lt;li>every file carries the copyright and license tags.&lt;/li>
&lt;/ul>
&lt;h3 id="4-live-test-in-a-real-libreoffice">4. Live test in a real LibreOffice&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>python3 tools/build.py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python3 tests/live_test.py &lt;span style="color:#09f;font-style:italic"># tests dist/tbar-impress-VERSION.oxt&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This needs LibreOffice and a Python that can &lt;code>import uno&lt;/code>. On Linux that is the &lt;code>python3-uno&lt;/code> package; on Windows or macOS, use the Python inside LibreOffice. It does not touch your own LibreOffice setup: it creates a temporary profile, installs the &lt;code>.oxt&lt;/code> there with &lt;code>unopkg add&lt;/code>, and opens a window for about 30 seconds. It then checks, among other things:&lt;/p>
&lt;ul>
&lt;li>LibreOffice registers only the four manifest files, so the README, tests and tools inside the package are inert;&lt;/li>
&lt;li>the toolbar shows the 14 expected items in order;&lt;/li>
&lt;li>every layout button applies its layout;&lt;/li>
&lt;li>the shading appears, follows slide changes (also in &lt;em>Window ▸ New Window&lt;/em>), and its darkness can be picked;&lt;/li>
&lt;li>with real mouse clicks: the arrow opens the dropdown with all ten levels, picking one works, and a plain click then toggles. This part needs &lt;code>xdotool&lt;/code> on X11; elsewhere it is reported as SKIP;&lt;/li>
&lt;li>the shading never marks the document modified and never enters Undo;&lt;/li>
&lt;li>it is absent from files written by Save, Save As, Save a Copy (&lt;code>.odp&lt;/code>, &lt;code>.pptx&lt;/code>) and PDF export, and comes back afterwards;&lt;/li>
&lt;li>unknown commands are ignored;&lt;/li>
&lt;li>the toolbar does not appear in Draw.&lt;/li>
&lt;/ul>
&lt;p>Result on LibreOffice 24.2.7: 38 of 38 checks pass.&lt;/p>
&lt;h3 id="5-licensing">5. Licensing&lt;/h3>
&lt;p>Everything is Copyright 2026 Tero Karvinen &lt;a href="https://TeroKarvinen.com">https://TeroKarvinen.com&lt;/a> and dual-licensed &lt;strong>GPL-3.0-or-later OR MPL-2.0&lt;/strong>. Every file carries both SPDX tags: &lt;code>SPDX-FileCopyrightText&lt;/code> and &lt;code>SPDX-License-Identifier: GPL-3.0-or-later OR MPL-2.0&lt;/code>. Text files have them in a comment. PNG images have them embedded as PNG text metadata (&lt;code>python3 tools/png_spdx.py show icons/*.png&lt;/code>) and also listed in &lt;code>REUSE.toml&lt;/code>. &lt;code>reuse lint&lt;/code> reports the project as compliant with REUSE 3.3. Both license texts are the official ones: &lt;code>LICENSES/GPL-3.0-or-later.txt&lt;/code> from gnu.org (SHA-256 &lt;code>3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986&lt;/code>) and &lt;code>LICENSES/MPL-2.0.txt&lt;/code> from mozilla.org (SHA-256 &lt;code>3f3d9e0024b1921b067d6f7f88deb4a60cbe7a78e76c64e3f1d7fc3b779b9d04&lt;/code>).&lt;/p>
&lt;hr>
&lt;p>Don't hurt your precious eyes - artificial intelligence has helped creating this addon.&lt;/p>
&lt;h2 id="security-implications">Security implications&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Extensions run with your full user rights.&lt;/strong> LibreOffice does not sandbox extensions, so &lt;code>tbar.py&lt;/code> could in principle do anything you can do. That is why the checks above exist. In fact, it imports no network, process or system modules (step 2, enforced by step 3).&lt;/li>
&lt;li>&lt;strong>Not signed.&lt;/strong> LibreOffice extensions are normally unsigned. Use step 1 to confirm the package holds only what you can read, and the published checksum to confirm where it came from.&lt;/li>
&lt;li>&lt;strong>One file written:&lt;/strong> &lt;code>&amp;lt;your LibreOffice profile&amp;gt;/config/tbar-impress.json&lt;/code>, containing only &lt;code>{&amp;quot;darkness&amp;quot;: NN}&lt;/code>. Only the ten values 10, 20, …, 100 are accepted on reading and on writing; anything else falls back to 50.&lt;/li>
&lt;li>&lt;strong>Your documents:&lt;/strong> while the shading is on, tBar Impress adds one shape and one layer, both named &amp;quot;tBar Impress…&amp;quot;, to the open presentation, and removes both before every save, export and autorecovery copy. If you copy a slide while the shading is on and paste it into &lt;em>another&lt;/em> presentation, the shading shape is pasted with it. Delete it there (Navigator, or turn the shading on and off once in that file).&lt;/li>
&lt;li>&lt;strong>Commands from documents:&lt;/strong> like any LibreOffice command, tBar Impress commands could be triggered by a macro or link inside a document you open. The worst they can do is toggle the shading or change its darkness.&lt;/li>
&lt;li>&lt;strong>Layout buttons:&lt;/strong> no code; they call LibreOffice's built-in layout command.&lt;/li>
&lt;li>&lt;strong>Files that are not run:&lt;/strong> the test and build scripts inside the package are ordinary Python you would run yourself. LibreOffice never runs them (checked by the live test).&lt;/li>
&lt;/ul>
&lt;h2 id="how-it-works-briefly">How it works (briefly)&lt;/h2>
&lt;p>&lt;strong>Slide layout toolbar buttons.&lt;/strong> &lt;code>Addons.xcu&lt;/code> defines a toolbar whose buttons run &lt;code>.uno:AssignLayout?WhatLayout:long=N&lt;/code>, where &lt;code>N&lt;/code> is LibreOffice's &lt;code>AutoLayout&lt;/code> number (&lt;code>include/xmloff/autolayout.hxx&lt;/code>). For example, 20 = Blank, 0 = Title Slide, 1 = Title and Content, 34 = Title and 6 Content. Icons are mapped in the &lt;code>Images&lt;/code> section.&lt;/p>
&lt;p>&lt;strong>Hide slide overflow.&lt;/strong> &lt;code>tbar.py&lt;/code> is a UNO protocol handler for &lt;code>com.terokarvinen.tbar-impress:&lt;/code> URLs. Turning it on draws a black polygon with a slide-shaped hole, five times the slide size, on top of the current slide, with transparency 100 − darkness. The polygon sits on its own locked, non-printable layer. Every edit is done with Undo locked and the modified flag restored. Listeners move it to whichever slide a window shows. A document-event listener removes it on &lt;code>OnSave&lt;/code>, &lt;code>OnSaveAs&lt;/code> and &lt;code>OnCopyTo&lt;/code> (Save a Copy, exports, autorecovery) and puts it back on the matching &lt;code>…Done&lt;/code>/&lt;code>…Failed&lt;/code> events. The toolbar button is a &lt;code>ToggleDropdownButton&lt;/code>; the dropdown list is sent to it with a &lt;code>SetList&lt;/code> control command.&lt;/p>
&lt;h3 id="changes-compared-with-the-two-earlier-extensions">Changes compared with the two earlier extensions&lt;/h3>
&lt;p>tBar Impress merges &lt;em>Quick Layouts&lt;/em> and &lt;em>Dim Non-Visible Area&lt;/em>, with new names. Fixed along the way:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Shading leaked into files.&lt;/strong> Save a Copy, PDF/PPTX export and autorecovery copies included the shading shape. Those saves raise the event &lt;code>OnCopyTo&lt;/code>, but the old code listened for &lt;code>OnSaveTo&lt;/code>, which is LibreOffice's internal name that listeners never receive. Found by the live test.&lt;/li>
&lt;li>A second window of the same presentation (&lt;em>Window ▸ New Window&lt;/em>) did not get the shading.&lt;/li>
&lt;li>After a second window was closed, the shading's layer could not be removed (a LibreOffice quirk: layers are removed through the &amp;quot;current view&amp;quot;, which is empty until a window is activated). tBar Impress now activates the window and retries.&lt;/li>
&lt;li>Unknown commands, including the View-menu submenu title, were treated as &amp;quot;toggle&amp;quot;. They are now ignored.&lt;/li>
&lt;li>Invalid darkness values are refused before they are stored.&lt;/li>
&lt;/ul>
&lt;h2 id="making-a-release">Making a release&lt;/h2>
&lt;ol>
&lt;li>Increase the version in &lt;code>description.xml&lt;/code> for every release, even a small fix. LibreOffice offers an update only when the version is higher. Use digits and dots only (&lt;code>0.0.3&lt;/code>, &lt;code>0.0.4&lt;/code>, …, &lt;code>0.1.0&lt;/code>); LibreOffice compares each part as a number and does not understand suffixes like &lt;code>-beta&lt;/code>.&lt;/li>
&lt;li>&lt;code>python3 tests/check_static.py&lt;/code>, then &lt;code>python3 tools/build.py&lt;/code>, then &lt;code>python3 tests/live_test.py&lt;/code>.&lt;/li>
&lt;li>Publish &lt;code>dist/tbar-impress-VERSION.oxt&lt;/code> together with its SHA-256 (&lt;code>sha256sum tbar-impress-VERSION.oxt &amp;gt; tbar-impress-VERSION.oxt.sha256&lt;/code>).&lt;/li>
&lt;/ol>
&lt;p>Only the published file names carry the version. Files inside the package (including this README) do not.&lt;/p>
&lt;h2 id="copyright-and-license">Copyright and license&lt;/h2>
&lt;p>Copyright 2026 Tero Karvinen &lt;a href="https://TeroKarvinen.com">https://TeroKarvinen.com&lt;/a>&lt;/p>
&lt;p>tBar Impress is dual-licensed. You may use, modify and redistribute it under &lt;strong>either&lt;/strong> of these licenses, at your choice:&lt;/p>
&lt;ul>
&lt;li>the GNU General Public License, version 3 or (at your option) any later version (&lt;code>LICENSES/GPL-3.0-or-later.txt&lt;/code>), or&lt;/li>
&lt;li>the Mozilla Public License, version 2.0 (&lt;code>LICENSES/MPL-2.0.txt&lt;/code>).&lt;/li>
&lt;/ul>
&lt;p>The MPL-2.0 option is there so that tBar Impress, or parts of it, can be taken into LibreOffice itself, whose own code is under MPL-2.0. The GPL option stays for anyone who prefers it.&lt;/p>
&lt;p>tBar Impress is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license texts for details.&lt;/p>
&lt;h2 id="big-screenshot">Big screenshot&lt;/h2>
&lt;p>&lt;a href="#top">Back to #top&lt;/a>&lt;/p>
&lt;p>&lt;a href="#top">&lt;img src="screenshot.png" alt="">&lt;/a>&lt;/p>
&lt;p>&lt;a href="#top">Back to #top&lt;/a>&lt;/p>
&lt;h2 id="download">Download&lt;/h2>
&lt;div class=pad>
&lt;a href="tbar-impress.oxt" class="downloadAButton pad">Download &lt;b>tbar-impress.oxt&lt;/b>&lt;/a>
&lt;/div></description></item><item><title>0x54ask - Todo.txt manager for Android. Offline, works with syncthing.</title><link>https://terokarvinen.com/0x54ask/</link><pubDate>Sun, 30 Aug 2026 22:24:37 +0300</pubDate><guid>https://terokarvinen.com/0x54ask/</guid><description>
&lt;p>0x54ask is a todo.txt manager. It supports context (@W at work, @H at home...) and tags (+linux, +bank, +tero).&lt;/p>
&lt;img src="https://terokarvinen.com/0x54ask/icon_hu13913cafbecb2848a587fe3829526372_2804_200x200_fit_box_3.png" width="200" height="200" alt=" " class="imgOne right padSides">
&lt;p>0x54ask forks SimpleTask Cloudless. It provides passive perks: data safety, automerge, filesystem protection - and it never connects Internet, at all.&lt;/p>
&lt;p>Update: &lt;a href="https://f-droid.org/en/packages/com.terokarvinen.x54ask/">Install on F-Droid!&lt;/a>&lt;/p>
&lt;h2 id="install-on-f-droid">Install on F-Droid&lt;/h2>
&lt;p>&lt;a href="https://f-droid.org/en/packages/com.terokarvinen.x54ask/">&lt;img src="get-it-on-80h.png" alt="Get it on F-Droid">&lt;/a>&lt;/p>
&lt;p>ps. Hey Google! Don't be evil. &lt;a href="https://keepandroidopen.org">KeepAndroidOpen.org&lt;/a>.&lt;/p>
&lt;h2 id="download">Download&lt;/h2>
&lt;p>&lt;a href="x54ask-cloudless-debug.apk">Download 0x54ask installer apk&lt;/a> or read &lt;a href="https://gitlab.com/terokarvinen/x54ask">sources on GitLab&lt;/a>.&lt;/p>
&lt;h2 id="what-is-0x54ask">What is 0x54ask?&lt;/h2>
&lt;p>0x54ask is a &lt;em>todo.txt&lt;/em> manager. It supports context (@W at work, @H at home...) and tags (+linux, +bank, +tero).&lt;/p>
&lt;p>0x54ask forks SimpleTask Cloudless. It provides passive perks: data safety, automerge, filesystem protection - and it never connects Internet, at all.&lt;/p>
&lt;p>
&lt;img src="https://terokarvinen.com/0x54ask/1_hudc175824c101a12acfa2644337e8b025_197058_550x550_fit_box_3.png" width="248" height="550" alt="list" class="imgOne someImg">
&lt;img src="https://terokarvinen.com/0x54ask/2_hueb1e6c5184d00c96732cf15fabc5ce07_76342_550x550_fit_box_3.png" width="248" height="550" alt="quick filter" class="imgOne someImg">
&lt;img src="https://terokarvinen.com/0x54ask/3_hue291d8cff53b79c9dc7530d6557d2860_192717_550x550_fit_box_3.png" width="248" height="550" alt="menu" class="imgOne someImg">
&lt;/p>
&lt;p>Copyright 2026 Tero Karvinen &lt;a href="https://TeroKarvinen.com">https://TeroKarvinen.com&lt;/a> , Mark Janssen, Willem W and other contributors.&lt;/p>
&lt;h2 id="todotxt-manager---context-and-tags">Todo.txt manager - context and tags&lt;/h2>
&lt;p>&lt;em>Context&lt;/em>: You write down a task. If it was the only thing, what would be the next action? Drill a hole for picture? If the wall is in your home, you've got to do it there. Thus, @H (at home).&lt;/p>
&lt;p>&lt;em>Tags&lt;/em>: I'll be working on +linuxeu project for the next 5 hours. Show me all tasks I can bill on that. Thus, filter by +linuxeu.&lt;/p>
&lt;p>&lt;em>Plain text&lt;/em>: Todo.txt is - surprise - plain text. You can edit it with vim, emacs, micro or nano. Todo.txt and calendar.txt use the same +plustags and @Contexts.&lt;/p>
&lt;p>Fully offline, or synchronize how you like.&lt;/p>
&lt;h2 id="0x54ask-passive-perks">0x54ask passive perks&lt;/h2>
&lt;p>What does 0x54ask fork bring to the table? Data safety, better sync, smaller attack surface, modern interfaces. These benefits work passively. You don't have to do anything to use them.&lt;/p>
&lt;p>0x54ask:&lt;/p>
&lt;ul>
&lt;li>&lt;em>Keeps your data safe&lt;/em>. It automatically detects if todo.txt has been modified by other programs (such as text editor or syncthing). Modifications appear as soon as 0x54ask sees them. Changes are stored as soon as they are made. At the time of writing, current state of file is checked again.&lt;/li>
&lt;li>&lt;em>Automatic merge&lt;/em>. If a conflict is detected, 0x54ask can often automatically merge the changes. This is possible, because todo.txt is a line based format, and many changes appear in different lines. Main approach to auto merge is generic and works, no matter which program made the changes. There is additional support for automatic resolution of Syncthing conflicts. Special support is needed, because these sync conflicts can happen while 0x54ask is not running.&lt;/li>
&lt;li>&lt;em>Filesystem protection&lt;/em>: You can pick the directory where todo.txt is. This will be the only directory available for the app. This restriction is enforced by the operating system. The whole filesystem backend was updated to use modern SAF, the Storage Access Framework.&lt;/li>
&lt;li>&lt;em>No Internet&lt;/em>, ever. There is no INTERNET permission, so the operating system prevents app from accessing the Internet. Any synchronization is handled by other applications of your choice, Syncthing (Syncthing fork) recommended. You can also use the app completely offline. Also, all networking related code was removed from the app.&lt;/li>
&lt;/ul>
&lt;p>And of course, 0x54ask is &lt;em>Free, Open Source Software&lt;/em> under GPL 3 license. I used new name and app id for 0x54ask, while also giving credit to upstreams of this fork. This way, upstream gets credit for their work, but not reports for my bugs.&lt;/p>
&lt;h2 id="background">Background&lt;/h2>
&lt;p>The original &lt;em>SimpleTask Cloudless&lt;/em> aka &lt;a href="https://github.com/mpcjanssen/simpletask-android">simpletask-android&lt;/a> was developed by &lt;a href="https://github.com/mpcjanssen">Mark Janssen&lt;/a>. The original is now archived and removed from F-Droid. The design and UI felt great, and I could not find an alternative that could compete.&lt;/p>
&lt;p>0x54ask is a fork of &lt;a href="https://github.com/willemw12/simpletask-android">willemw12/simpletask-android&lt;/a> by Willem W, a fork of the original SimpleTask. Forking made sense, since some of the changes were large (SAF backend), some removed code (networking), and a key promise is not necessarily shared (no Internet in 0x54ask, no plans for Internet in 0x54ask). Like original SimpleTask, willemw12 fork still asked for access to all files and photos on the phone. The fork had many improvements over the original, so it felt like a good starting point.&lt;/p>
&lt;p>Artificial intelligence was used to help create the improvements after forking.&lt;/p>
&lt;p>The task format is &lt;a href="http://todotxt.com">todo.txt&lt;/a> by Gina Trapani. Todo.txt works well
with &lt;a href="https://terokarvinen.com/2021/calendar-txt/">calendar.txt&lt;/a>.&lt;/p>
&lt;h2 id="download-1">Download&lt;/h2>
&lt;p>&lt;a href="x54ask-cloudless-debug.apk">Download 0x54ask installer apk&lt;/a> or read &lt;a href="https://gitlab.com/terokarvinen/x54ask">sources on GitLab&lt;/a>.&lt;/p>
&lt;h2 id="adminstrivia">Adminstrivia&lt;/h2>
&lt;p>&amp;quot;Get it on&amp;quot; F-Droid logo property of F-Droid contributors.&lt;/p></description></item><item><title>Sovellusten hakkerointi</title><link>https://terokarvinen.com/application-hacking/</link><pubDate>Tue, 18 Aug 2026 15:03:30 +0300</pubDate><guid>https://terokarvinen.com/application-hacking/</guid><description>
&lt;p>Find vulnerabilities in your app - before criminals do.&lt;/p>
&lt;p>This is &amp;quot;Application hacking&amp;quot; in Finnish: &amp;quot;Sovellusten hakkerointi ja haavoittuvuudet&amp;quot;. In nerd speak, it's reverse engineering. You'll learn Ghidra, gdb and similar.&lt;/p>
&lt;p>Co-taught with Lari Iso-Anttila. Sold out, queue started.&lt;/p>
&lt;p>Visitor: Otto Ebeling hacked crypto and got big money - legally and ethically. (Maybe OSINT his Ltd 2023)&lt;/p>
&lt;p>&lt;em>Update: Extra group started!&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Course name&lt;/td>
&lt;td>Sovellusten hakkerointi ja haavoittuvuudet&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Study guide&lt;/td>
&lt;td>&lt;a href="https://opinto-opas.haaga-helia.fi/course/ICI012AS3A">Sovellusten hakkerointi ja haavoittuvuudet ICI012AS3A kurssikuvaus&lt;/a>, toteutus &lt;a href="https://opinto-opas.haaga-helia.fi/realization/ICI012AS3A-3004">ICI012AS3A-3004&lt;/a>;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Timing&lt;/td>
&lt;td>2026 &lt;strong>period 1&lt;/strong>, early autumn (w34-w41) (&lt;a href="#schedule">schedule&lt;/a>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Credits&lt;/td>
&lt;td>5 ECTS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Classes&lt;/td>
&lt;td>Pasila, classroom pa5001 (Tero) and pa3005 (Lari), bring your laptop. Thu 14:00-16:45.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Max students&lt;/td>
&lt;td>30, &lt;del>sold out, queue started&lt;/del> Extra group, good change for a place.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Language&lt;/td>
&lt;td>Finnish (+reading and writing in English)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Remote&lt;/td>
&lt;td>No, fully contact in Pasila classroom, mandatory participation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Feedback&lt;/td>
&lt;td>4.3 - 4.8 / 5 &lt;strong>Excellent feedback&lt;/strong> &lt;img src="https://terokarvinen.com/img/five-stars-15.png" alt="Five star experience">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Services&lt;/td>
&lt;td>&lt;a href="https://hhmoodle.haaga-helia.fi/course/view.php?id=48775">Moodle: Sovellusten hakkerointi ja haavoittuvuudet&lt;/a>. Laksu. Voluntary extra: &lt;a href="https://terokarvinen.com/newsletter/">Tero's list&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Teachers&lt;/td>
&lt;td>&lt;a href="https://TeroKarvinen.com">Tero Karvinen&lt;/a> and &lt;a href="https://github.com/lisoant">Lari Iso-Anttila&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>First class&lt;/td>
&lt;td>2026-08-20 w34 Thu 14:30 pa5001, bring your laptop. (Yes, first time starts half an hour later)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Enroll&lt;/td>
&lt;td>Extra group starting, come to the first class! &lt;del>Sold out. For a change at a place from the queue, enroll in Peppi and come to the first class.&lt;/del>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>This page will be updated before and during the course.&lt;/p>
&lt;a name=aikataulu>
&lt;a name=agenda>
&lt;a name=schedule>
&lt;h2 id="schedule">Schedule&lt;/h2>
&lt;p>Thursdays 14:00-16:45 in Pasila, classroom pa5001 &amp;amp; pa3005. Bring your laptop! Check your &lt;a href="https://hhmoodle.haaga-helia.fi/mod/page/view.php?id=3834577">group (Leijona or Mänty)&lt;/a> from Moodle.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Day&lt;/th>
&lt;th>Topic (mänty)&lt;/th>
&lt;th>Topic (leijona)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>2026-08-20 w34 Thu&lt;/td>
&lt;td>1. Introduction. Warm-up. Overview. &lt;em>16:00 Visitor: Janne&lt;/em>: Standards and frameworks.&lt;/td>
&lt;td>Intro.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-08-27 w35 Thu&lt;/td>
&lt;td>2. &lt;em>14:00 normal start time.&lt;/em> Hacking in and fixing vulnerabilities from source code pa5001 T. h2&lt;/td>
&lt;td>Dynamic analysis. pa3005 L. h5.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-03 w36 Thu&lt;/td>
&lt;td>3. Vierailija Otto Ebeling. Web hacking teardown. pa5001 T h3&lt;/td>
&lt;td>Otto. Dynamic analysis 2 [or Crypto] 2. pa3005.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-10 w37 Thu&lt;/td>
&lt;td>4. Ghidra. pa5001 T. h4&lt;/td>
&lt;td>Embedded. pa3005. h6.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-17 w38 Thu&lt;/td>
&lt;td>5. Dynamic analysis. Debuggers and gdb. pa3005. h5.&lt;/td>
&lt;td>Hack &amp;amp; fix from source. pa5001. h2.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-24 w39 Thu&lt;/td>
&lt;td>6. Embedded systems. pa3005. h6&lt;/td>
&lt;td>Web hacking teardown. Ghidra. pa5001. h4.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-10-01 w40 Thu&lt;/td>
&lt;td>7. Happy Hacking Day &lt;em>No regular classes - visit Happy Hacking Day instead.&lt;/em>&lt;/td>
&lt;td>Happy hacking day.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-10-08 w41 Thu&lt;/td>
&lt;td>8. Capture the Flag. Tero and Lari.&lt;/td>
&lt;td>CTF.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>This is an advanced course, so topics may change as the course progresses. We expect only the topics change, the dates and the hours are expected to stay unchanged.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;p>At the start of the course, you should know:&lt;/p>
&lt;ul>
&lt;li>Programming basics&lt;/li>
&lt;li>Linux basics&lt;/li>
&lt;li>Installing Linux on a virtual machine on your own laptop&lt;/li>
&lt;/ul>
&lt;p>For this Finnish implementation, you should be able to speak Finnish fluently; and read and write Finnish and English.&lt;/p>
&lt;p>Prior knowledge acquired in any way is acceptable. Knowledge can be obtained, for example, from &amp;quot;Linux Servers&amp;quot; or &amp;quot;Programming 1&amp;quot; courses, but self-study is also fine.&lt;/p>
&lt;p>Prerequisites may be verified with a survey if necessary, and course participants may be selected based on an initial test if needed.&lt;/p>
&lt;p>You can review or learn the skills below before the course if you wish. If you already know the topics, you don't need the &lt;a href="#review">review package&lt;/a>.&lt;/p>
&lt;a name=review>
&lt;a name=kertauspaketti>
&lt;h2 id="review-package">Review Package&lt;/h2>
&lt;p>&lt;em>If you already know these things, you don't need the review package. You don't have to learn these specific languages. If an initial test is held during the course, questions won't be limited to the review package content.&lt;/em>&lt;/p>
&lt;h3 id="programming-basics">Programming Basics&lt;/h3>
&lt;ul>
&lt;li>The course involves coding and reading code&lt;/li>
&lt;li>Any language works (e.g., Python or C).&lt;/li>
&lt;li>Some students say that C is new to them but very useful in reverse engineering.&lt;/li>
&lt;li>Variable, data types (int, float, string, array/list), conditional statement (if-else), loops (for, while), function, class (class, object), execution order&lt;/li>
&lt;li>You can write simple programs&lt;/li>
&lt;li>You can read programming language and library manuals; and search the web for solutions to simple problems&lt;/li>
&lt;/ul>
&lt;p>If you want to review Python on Linux, you can start writing code like this:&lt;/p>
&lt;pre>&lt;code>$ python3
&amp;gt;&amp;gt;&amp;gt; print(&amp;quot;Hello, Tero!&amp;quot;)
&amp;gt;&amp;gt;&amp;gt; exit()
$ nano hello.py
&lt;/code>&lt;/pre>
&lt;p>And here you can write your program:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-py" data-lang="py">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#366">print&lt;/span>(&lt;span style="color:#c30">&amp;#34;Hello, Tero!&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Save in nano with ctrl-X, y, enter. I personally install the 'micro' editor when I code more.&lt;/p>
&lt;pre>&lt;code>$ python3 hello.py
Hello, Tero!
&lt;/code>&lt;/pre>
&lt;p>And the language basics are explained here:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.python.org/3/tutorial/introduction.html">3. An Informal Introduction to Python&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.python.org/3/tutorial/controlflow.html">4. More Control Flow Tools&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.python.org/3/tutorial/classes.html">9. Classes&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I often review languages by writing a bunch of easy warm-up programs.&lt;/p>
&lt;h3 id="linux-basics">Linux Basics&lt;/h3>
&lt;p>Linux is used as a tool. Basic skills are sufficient. The course does not require extensive Linux administration skills.&lt;/p>
&lt;ul>
&lt;li>Using the command line&lt;/li>
&lt;li>Root privileges (sudo)&lt;/li>
&lt;li>Package management (apt-get)&lt;/li>
&lt;li>Directory structure (e.g., /home/tero/, /etc/, /, /var/log, /usr/bin/, /usr/local/bin/)&lt;/li>
&lt;li>Logs (sudo journalctl -n 20; /var/log/apache2/error.log)&lt;/li>
&lt;/ul>
&lt;p>Learn the commands from: &lt;a href="https://terokarvinen.com/2020/command-line-basics-revisited/">Karvinen 2020: Command Line Basics Revisited&lt;/a>&lt;/p>
&lt;p>The easiest way to review is to install Linux on a virtual machine and play with it.&lt;/p>
&lt;h3 id="installing-linux-on-a-virtual-machine">Installing Linux on a Virtual Machine&lt;/h3>
&lt;ul>
&lt;li>For example, installing Debian in VirtualBox (instructions below)&lt;/li>
&lt;li>You can use other virtualization solutions if you can adapt and solve related challenges yourself (e.g., QEMU, lib-virt, virt-manager...)&lt;/li>
&lt;/ul>
&lt;p>Students have installed hundreds of Linuxes with this installation guide: &lt;a href="https://terokarvinen.com/2021/install-debian-on-virtualbox/">Install Debian on Virtualbox - Updated 2024&lt;/a>&lt;/p>
&lt;p>&lt;small>(For Macintosh users: Apple Macintosh M1, M2, M3, M4... is not suitable for the course. Macs use arm64 architecture, course requires amd64 (x86-64). It's recommended to bring a regular PC laptop for the course, as many applications and virtual machines used in exercises are only available for this more common amd64 architecture. We recommend bringing an amd64-based laptop running Linux or Windows.)&lt;/small>&lt;/p>
&lt;h2 id="previous-implementations">Previous Implementations&lt;/h2>
&lt;p>&lt;a href="https://terokarvinen.com/2026/application-hacking--ici012as3ae--ici012as3a--2026p3/">Application Hacking and Vulnerabilities ICI012AS3AE-3001 (English) ja ICI012AS3A-3003 (Finnish) 2026p3 alkukevät&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/tags/sovellusten-hakkerointi-ja-haavoittuvuudet/">All implementations &amp;quot;Application Hacking and Vulnerabilities&amp;quot;&lt;/a>&lt;/p>
&lt;a name=laksyt>
&lt;h2 id="homework">Homework&lt;/h2>
&lt;p>Homework report links are submitted to Laksu 24 hours before the contact session. After submitting your own assignment, you peer-assess two classmates' assignments.&lt;/p>
&lt;p>Homework is done and reported after each class. Assignments can be published anywhere and the link submitted to Laksu. Homework reports must be in a format viewable directly in a browser, as a regular HTML web page. No odt, no odp, no ppt, no docx, no doc, no pdf. Homework cannot be submitted by email. Links are submitted to Laksu and then two works are peer-assessed. Free web hosting is available from WordPress.com, GitHub.com, and Gitlab.com.&lt;/p>
&lt;p>Assignments are official only after they are given at the end of class. Even if the assignment might sometimes be on the web page before class, they should not be done in advance, as they are evaluated according to the given assignment. Significant changes may be made before confirmation.&lt;/p>
&lt;p>Homework is reviewed at the next meeting, problems are solved together, and oral feedback is given. The grade for the homework package is given only at the end of the course, but assignments must still be submitted 24 hours before the next class. Those who don't start completing the course by submitting assignments will be removed from the course. Publishing is voluntary but highly recommended. If for some reason you don't dare or otherwise don't want to publish, you can put the work on a web page behind a password (the same password for all homework) and share this password with classmates. If tests on homework topics are held during classes, their points are included in the homework assessment.&lt;/p>
&lt;p>Homework must be done by experimenting on a computer and reporting the course of events, unless otherwise stated in the specific subsection. Reports must contain information that can verify the exercises were done and not fabricated.&lt;/p>
&lt;p>All sources used must be cited in the report: course assignment page, classmates' reports, man pages, books. The citation must show which information came from which source. If you ask AI for advice, it must be cited as a source, naming the AI model and specifics. AIs hallucinate; it's recommended to verify the information. Summaries or essays must not be generated with AI or similar techniques; they must be written yourself. It is forbidden to generate text with AI, as your classmates will be reading what you wrote.&lt;/p>
&lt;h2 id="homework-tasks">Homework Tasks&lt;/h2>
&lt;p>&lt;em>We embed homework here in a new way, email teacher if you cannot see the tasks.&lt;/em>&lt;/p>
&lt;div id=homeworkEmbed>Loading homework with JavaScript. You can also &lt;a href="https://app.terokarvinen.com/embed/course/54/tasks/">read homework directly&lt;/a>, without JavaScript. &lt;/div>
&lt;script>fetch("https://app.terokarvinen.com/embed/course/54/tasks/").then(e=>e.text()).then(e=>document.getElementById("homeworkEmbed").innerHTML=e)&lt;/script>
&lt;p>&lt;em>Adminstrivia: This page will update before and during the course. Human verified machine translation was used for parts of this page.&lt;/em>&lt;/p></description></item><item><title>Tunkeutumistestaus</title><link>https://terokarvinen.com/tunkeutumistestaus/</link><pubDate>Wed, 12 Aug 2026 10:17:12 +0300</pubDate><guid>https://terokarvinen.com/tunkeutumistestaus/</guid><description>
&lt;p>Learn to hack computers to protect your own. In the course, you will break into target computers.&lt;/p>
&lt;p>Excellent feedback, reached 5.0 out of 5.
&lt;img src="https://terokarvinen.com/img/five-stars-15.png" alt="Full five stars">&lt;/p>
&lt;p>&lt;em>Update: Visitors confirmed: Buuri (pentesting banks), Särökaari (attacking identity?), joohoi (creator of ffuf).&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Course name and code&lt;/td>
&lt;td>Tunkeutumistestaus ICI005AS3A-3007 (&lt;a href="https://opinto-opas.haaga-helia.fi/course/ICI005AS3A">study guide&lt;/a>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Timing&lt;/td>
&lt;td>2026 &lt;strong>period 1&lt;/strong> early autumn, w34-w41&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Credits&lt;/td>
&lt;td>5 cr&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Classes&lt;/td>
&lt;td>&lt;strong>Thursdays 11:00&lt;/strong>-13:45, Pasila &lt;strong>pa5001&lt;/strong>, bring your &lt;strong>laptop&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Max students&lt;/td>
&lt;td>30&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Language&lt;/td>
&lt;td>Finnish (+reading material in English)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Remote&lt;/td>
&lt;td>No, fully contact in Pasila classroom&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Feedback&lt;/td>
&lt;td>&lt;strong>4.8&lt;/strong> / 5 Excellent feedback* &lt;img src="https://terokarvinen.com/img/five-stars-15.png" alt="Five star experience"> (Best instance 5.0/5)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Services&lt;/td>
&lt;td>&lt;a href="https://hhmoodle.haaga-helia.fi/course/view.php?id=49132">Moodle: Tunkeutumistestaus&lt;/a>, Laksu. Voluntary extra: &lt;a href="https://terokarvinen.com/newsletter/">Tero's list&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>First class&lt;/td>
&lt;td>2026-08-20 w34 Thu 11:00, pa5001, bring your laptop.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>* Best instance 5.0/5, every student gave feedback and every feedback was 5. Lowest 4.5/5 excellent, typical 4.9/5 excellent.
&lt;em>Use of penetration testing techniques requires legal and ethical considerations. To safely use these tools, tactics and procedures, you might need to obtain contracts and permissions; and posses adequate technical skills. Check your local laws.&lt;/em>&lt;/p>
&lt;p>&lt;em>Teaching is in Finnish, so the rest of this page will be in Finnish.&lt;/em>&lt;/p>
&lt;p>&lt;em>Tunkeutumistestaus on eettisen hakkeroinnin kurssi. Opit, miten murtaudutaan tietokoneille, jotta voisit suojata omat ja toimeksiantajan järjestelmät. Nämä tekniikat, ohjelmat ja taktiikat ovat luvallisia vain tietyissä tilanteissa. Usein pitää hankkia lupia ja tehdä sopimuksia. Lisäksi näiden tekniikoiden turvalliseen käyttöön tarvitaan teknistä taitoa. Perehdy itse paikallisiin lakeihin.&lt;/em>&lt;/p>
&lt;h2 id="oppimistavoitteet">Oppimistavoitteet&lt;/h2>
&lt;p>Opintojakson suoritettuaan opiskelija&lt;/p>
&lt;ul>
&lt;li>Tuntee tunkeutumistestauksen prosessin pääpiirteissään&lt;/li>
&lt;li>Tietää, että tunkeutumistestaukselle on lailliset ja eettiset rajat&lt;/li>
&lt;li>Osaa kartoittaa kohdejärjestelmän haavoittuvuuksia&lt;/li>
&lt;li>Osaa hyödyntää valmiita hyökkäyksiä (exploit) ja liittää niihin hyötykuorman käyttäen kurssille valittua työkalua&lt;/li>
&lt;li>Osaa soveltaa tavallisimpia hyökkäyksiä weppisovelluksia vastaan, kun kohdeohjelmistot ovat helppoja ja haavoittuvia.&lt;/li>
&lt;li>Osaa hankkia tunkeutumistestauksessa tarvittavia ohjelmistoja&lt;/li>
&lt;/ul>
&lt;p>Kurssilta ei saa mukaansa ilmaista pakettia nollapäivähaavoittuvuuksia, eikä kurssi anna mitään erityisoikeuksia eikä ammattinimikkeitä.&lt;/p>
&lt;img src="https://terokarvinen.com/tunkeutumistestaus/its-raining-shells_hu2c3b7a67c2932fbb741bb11b3701e922_3206_200x200_fit_box_3.png" width="139" height="134" alt=" " class="imgOne right">
&lt;h2 id="aikataulu">Aikataulu&lt;/h2>
&lt;p>Torstaisin 11:00 - 13:45 Pasila pa5001.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Päivä&lt;/th>
&lt;th>Aihe&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>2026-08-20 w34 Thu&lt;/td>
&lt;td>1. Tunkeutumisen yleiskuva. Järjestäytyminen. Kybertappoketju. &lt;em>Lopetamme poikkeuksellisesti jo 13:00&lt;/em>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-08-27 w35 Thu&lt;/td>
&lt;td>2. Vierailija &lt;em>Marko Buuri, cybersecurity adviser, Suomen Pankki: DORA &amp;amp; threat lead penetration testing&lt;/em> (11:00). Harjoitusympäristöt, ulkopuoliset ja oma virtuaalilaboratorio.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-03 w36 Thu&lt;/td>
&lt;td>3. Aktiivinen tiedustelu. Porttiskannaus ja oheistekniikat. Valvonta snifferillä.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-10 w37 Thu&lt;/td>
&lt;td>4. Vierailija &lt;em>Niklas Särökaari, lead cybersecurity operations engineer, KONE: Attacking identity (topic to be confirmed)&lt;/em> (11:00). Weppiin murtautuminen. IDOR, path traversal, SSRF. Välimiesproxyt, ZAP tai mitmproxy. Harjoitusympäristöt weppiin.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-17 w38 Thu&lt;/td>
&lt;td>5. Weppiin murtautuminen. SQLi. Keksit. CSRF. Oman TLS-salatun liikenteen purkaminen.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-09-24 w39 Thu&lt;/td>
&lt;td>6. Vierailija &lt;em>Joona joohoi Hoikkala, creator of ffuf&lt;/em>, ffuf + hacking CSRF with preflight, 11:00).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-10-01 w40 Thu&lt;/td>
&lt;td>7. &lt;em>Happy Hacking Day normaalien tuntien tilalta&lt;/em>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2026-10-08 w41 Thu&lt;/td>
&lt;td>8. Lipunryöstö, arvioitava laboratorioharjoitus.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Tämä on edistynyt kurssi, joten tuntien aiheisiin voi tulla muutoksia kurssin edetessä.&lt;/p>
&lt;h2 id="kertausmateriaalia">Kertausmateriaalia&lt;/h2>
&lt;p>Tämä materiaali on vapaaehtoista, jos osaat ne jo. Lähteet ovat esimerkkejä, voit osata/opetella nuo asiat mistä vain haluat. Esimerkiksi ohjelmoinnin alkeita harjoitella tai osata aivan millä vain kielellä (Python, C...). Jos kurssilla järjestetään alkutesti, kysymykset eivät rajoitu kertauspaketin materiaaliin.&lt;/p>
&lt;ul>
&lt;li>TCP/IP-pino: &lt;a href="https://en.wikipedia.org/wiki/Internet_protocol_suite">Wikipedia: Internet protocol suite&lt;/a>&lt;/li>
&lt;li>Linuxin komentokehote: &lt;a href="https://terokarvinen.com/2020/command-line-basics-revisited/">Command Line Basics Revisited&lt;/a> (ja Linuxin asennus &lt;a href="https://terokarvinen.com/2021/install-debian-on-virtualbox/">Install Debian on VirtualBox&lt;/a>)&lt;/li>
&lt;li>Tietokantojen alkeet (millä vain alustalla): &lt;a href="http://terokarvinen.com/2016/postgresql-install-and-one-table-database-sql-crud-tutorial-for-ubuntu">PostgreSQL Install and One Table Database - SQL CRUD tutorial for Ubuntu&lt;/a>&lt;/li>
&lt;li>Ohjelmoinnin alkeet (millä vain kielellä). Python on myös hyvä vaihtoehto. FreeCodeCamp.org: Javascript Algorithms And Data Structures Certification: Basic JavaScript: &lt;a href="https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript">Introduction to JavaScript&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="luettavaa-ja-linkkeja">Luettavaa ja linkkejä&lt;/h2>
&lt;p>€ Maksulliset aineistot saattavat näkyä ilmaiseksi &lt;a href="http://libguides.haaga-helia.fi/az.php">Haaga-Helian tunnuksilla kirjaston&lt;/a> kautta. &lt;a href="https://www.oreilly.com/library/view/temporary-access/">Haaga-Helialla on käyttöoikeus O'Reilly Learning -kirjoihin (ent. Safari)&lt;/a>.&lt;/p>
&lt;p>Työkaluja kurssille&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://terokarvinen.com/2021/install-debian-on-virtualbox/">Install Debian on VirtualBox&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://terokarvinen.com/2020/remote-learning-tools-for-my-courses/">Remote Learning Tools for Tero's Courses&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.kali.org/">Kali Linux&lt;/a>. Uusi levykuva &lt;a href="https://cdimage.kali.org/kali-2021.1/kali-linux-2021.1-live-amd64.iso">kali-linux-2021.1-live-amd64.iso&lt;/a> (vanha levykuva &lt;a href="https://cdimage.kali.org/kali-2020.3/kali-linux-2020.3-live-amd64.iso">kali-linux-2020.3-live-amd64.iso&lt;/a>).
Kun linkki menee vanhaksi, etsi Kalin kotisivulta tuorein amd64-arkkitehtuurin live-tikun iso-kuva.&lt;/li>
&lt;/ul>
&lt;p>&lt;a id="L2">L2 weppihyökkäyksiä - tukee läksyä h2&lt;/a>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/OWASP/Top10/raw/master/2017/OWASP%20Top%2010-2017%20(en).pdf">OWASP 10 2017 (pdf)&lt;/a>, erityisesti ne hyökkäykset, joita aiot kohta tehdä eli A2 Broken Authentication, A3 Sensitive Data Exposure, A7 Cross Site Scripting; sekä viime kerralla harjoiteltu A1 Injection.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>€ Santos et al 2018: Hacking Web Applications The Art of Hacking Series LiveLessons (video): Security Penetration Testing for Today's DevOps and Cloud Environments: &lt;a href="https://learning.oreilly.com/videos/hacking-web-applications/9780135261422/9780135261422-hwap_01_06_03_00">6.3 Understanding SQL Injection&lt;/a> ja &lt;a href="https://learning.oreilly.com/videos/hacking-web-applications/9780135261422/9780135261422-hwap_01_06_04_00">6.4 Exploiting SQL Injection Vulnerabilities&lt;/a> sekä &lt;a href="https://learning.oreilly.com/videos/hacking-web-applications/9780135261422/9780135261422-hwap_01_05_00_00">Lesson 5: Authentication and Session Management Vulnerabilities&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>€ Percival &amp;amp; Samancioglu 2020: The Complete Ethical Hacking Course (video): &lt;a href="https://learning.oreilly.com/videos/the-complete-ethical/9781839210495/9781839210495-video21_1">Chapter 21: Cross Site Scripting&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://lockheedmartin.com/content/dam/lockheed-martin/rms/documents/cyber/LM-White-Paper-Intel-Driven-Defense.pdf">Hutchins et al 2011: Intelligence-Driven Computer Network Defense
Informed by Analysis of Adversary Campaigns and Intrusion Kill Chains&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Yleiskuva, harjoitusmaaleja, web&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://attack.mitre.org/">MITRE ATT&amp;amp;CK&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://darknetdiaries.com/">Darknet Diaries&lt;/a> . Podcastien kuunteluun
kännykällä &lt;a href="https://f-droid.org/en/packages/de.danoeh.antennapod/">AntennaPod löytyy F-Droidista&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://terokarvinen.com/2019/mitmproxy-on-kali-and-xubuntu-attack-and-testing">MitmProxy on Kali and Xubuntu&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://terokarvinen.com/2020/install-webgoat-web-pentest-practice-target">Install Webgoat 8 - Learn Web Pentesting&lt;/a>. (It's also possible to install &lt;a href="http://terokarvinen.com/2019/install-webgoat-pentest-learning-tool-on-ubuntu-with-docker">old version&lt;/a> 7 of WebGoat with Docker).&lt;/li>
&lt;li>&lt;a href="https://github.com/OWASP/Top10/raw/master/2017/OWASP%20Top%2010-2017%20(en).pdf">OWASP 10 2017 (pdf)&lt;/a>. Tällä hetkellä 2021-02-02 uusin versio.&lt;/li>
&lt;/ul>
&lt;p>Aktiivinen tiedustelu. HackTheBox.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>€ Santos et al: &lt;a href="https://learning.oreilly.com/videos/the-art-of/9780135767849">The Art of Hacking (Video Collection)&lt;/a>: [..] &lt;a href="https://learning.oreilly.com/videos/security-penetration-testing/9780134833989/9780134833989-sptt_00_04_03_00">4.3 Surveying Essential Tools for Active Reconnaissance: Port Scanning and Web Service Review&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>man nmap (laaja, silmäily riittää)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Kokonaisia blogeja ja videokanavia, vilkaise, ei tarvitse katsoa 200 h videota:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://tools.kali.org/tools-listing">https://tools.kali.org/tools-listing&lt;/a>&lt;/li>
&lt;li>0xdf &lt;a href="https://0xdf.gitlab.io/">https://0xdf.gitlab.io/&lt;/a>&lt;/li>
&lt;li>ippsec &lt;a href="https://www.youtube.com/channel/UCa6eh7gCkpPo5XXUDfygQQA/videos">https://www.youtube.com/channel/UCa6eh7gCkpPo5XXUDfygQQA/videos&lt;/a>&lt;/li>
&lt;li>John Hammond &lt;a href="https://www.youtube.com/user/RootOfTheNull/videos?sort=p">https://www.youtube.com/user/RootOfTheNull/videos?sort=p&lt;/a>&lt;/li>
&lt;li>Youtube-videoiden katseluun kännykällä &lt;a href="https://f-droid.org/packages/org.schabi.newpipe/">NewPipe F-Droidista&lt;/a>. Youtube-videoiden nopeuden säätöön &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/videospeed/">codebicycle Video Speed Controller&lt;/a> addon Firefoxille.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Passwords, Learning to Learn tools&lt;/p>
&lt;ul>
&lt;li>infosecn1nja 2020: &lt;a href="https://github.com/infosecn1nja/Red-Teaming-Toolkit">Red-Teaming-Toolkit&lt;/a>&lt;/li>
&lt;li>Taylor et al 2018: The Art of Hacking: &lt;a href="https://learning.oreilly.com/videos/the-art-of/9780135767849/9780135767849-SPTT_06_00">Hacking User Credentials&lt;/a> €&lt;/li>
&lt;/ul>
&lt;p>Web Fuzzing, Second to Last Words&lt;/p>
&lt;ul>
&lt;li>Hoikkala &amp;quot;joohoi&amp;quot; 2020: &lt;a href="https://github.com/ffuf/ffuf">ffuf - Fast web fuzzer written in Go&lt;/a>&lt;/li>
&lt;li>Hoikkala &amp;quot;joohoi&amp;quot; 2020: Still Fuzzing Faster (U fool). In &lt;a href="https://www.twitch.tv/helsec">HelSec Virtual Meetup #1&lt;/a>.&lt;/li>
&lt;li>Miettinen 2020: iPhone BFU Acquisition and Analysis. In &lt;a href="https://www.twitch.tv/helsec">HelSec Virtual Meetup #1&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Metasploit&lt;/p>
&lt;ul>
&lt;li>
&lt;p>€ Jaswal 2020: Mastering Metasploit - 4ed: &lt;a href="https://learning.oreilly.com/library/view/mastering-metasploit-/9781838980078/B15076_01_Final_ASB_ePub.xhtml#_idParaDest-30">Chapter 1: Approaching a Penetration Test Using Metasploit&lt;/a> (kohdasta &amp;quot;Conducting a penetration test with Metasploit&amp;quot; luvun loppuun)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Karvinen 2018: &lt;a href="https://terokarvinen.com/2018/install-metasploitable-3-vulnerable-target-computer/">Install Metasploitable 3 – Vulnerable Target Computer&lt;/a> (Article uses rapid7/metasploitable3-ub1404 , see also &amp;quot;rapid7/metasploitable3-win2k8&amp;quot;)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="vanhoja-toteutuksia">Vanhoja toteutuksia&lt;/h2>
&lt;p>&lt;a href="https://terokarvinen.com/2026/tunkeutumistestaus--ici005as3a-3004--2026p4/">Tunkeutumistestaus ICI005AS3A-3004 - 2026 loppukevät&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2024/tunkeutumistestaus-ici001as3a-3002-2024p4-loppusyksy-pentest/">Tunkeutumistestaus ICI001AS3A-3002 - 2024p4-loppusyksy&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2024/tunkeutumistestaus-2024p2/">Tunkeutumistestaus 2024p2&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2024/eettinen-hakkerointi-2024/">Tunkeutumistestaus ici005as3a-3001 loppukevät pa2004&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2023/eettinen-hakkerointi-2023/">Tunkeutumistestaus ict4tn027-3012 loppusyksy online&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2023/tunkeutumistestaus-2023-kevat/">Tunkeutumistestaus ict4tn027-3009&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2022/tunkeutumistestaus-ict4tn027-3010-syksylla-2022/">Tunkeutumistestaus ict4tn027-3010 - Syksy 2022&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2021/penetration-testing-course-2022-spring/">Tunkeutumistestaus ict4tn027-3007 - 2022p4 late spring&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2021/penetration-testing-course-2021-autumn/">Tunkeutumistestaus ict4tn027-3008 - 2021 Autumn&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2021/hakkerointi-kurssi-tunkeutumistestaus-ict4tn027-3005/">itc4tn027-3005: Tunkeutumistestaus eli eettinen hakkerointi -kurssi&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3006-autumn-2020/">Penetration Testing Course 2020 Autumn - Tunkeutumistestaus ict4tn027-3006&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/2020/tunkeutumistestaus-kurssi-pentest-course-ict4tn027-3003/">Penetration Testing Course 2020 Spring - Tunkeutumistestaus ict4tn027-3003&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/search/?q=tunkeutumistestaus">Haku &amp;quot;Tunkeutumistestaus&amp;quot;&lt;/a>&lt;/p>
&lt;h2 id="laksyt">Läksyt&lt;/h2>
&lt;p>Palauta linkki Laksuun 24 h ennen seuraavaa lukujärjestykseen merkittyä kurssivarausta. Tehtävät ovat pakollinen ja tärkeä osa kurssia.&lt;/p>
&lt;p>Läksyt ovat virallisia vasta, kun ne on vahvistettu (yleensä oppitunnin päätteeksi). Tämä on edistynyt kurssi, joten ohjelmaan tulee yleensä muutoksia kurssin aikana. Osa tehtävistä edellyttää huolellisuuden lisäksi tietoja ja taitoja työkalujen käytöstä, jottei synny vahinkoja - tee vasta, kun tiedät oikeat työtavat.&lt;/p>
&lt;p>Läksyt käydään läpi seuraavalla tapaamiskerralla, ratkotaan yhdessä ongelmia ja annetaan suullista palautetta. Arvosana kotitehtäväpaketista tulee vasta kurssin lopuksi, mutta tehtävät tulee silti palauttaa aina vuorokautta ennen seuraavia tunteja. Julkaiseminen on vapaaehtoista, mutta erittäin suositeltavaa. Jos et jostain syystä uskalla tai muuten halua julkaista, voit laittaa työn weppisivulle salasanan taakse (kaikille kotitehtäville sama salasana) ja jakaa tämän salasanan kurssilaisten kanssa. Jos tuntien yhteydessä järjestetään testejä läksyjen aiheista, niiden pisteet sisältyvät arvostelun kohtaan läksyt.&lt;/p>
&lt;p>Läksyt pitää tehdä tietokoneella kokeilemalla ja raportoida tapahtumien kulku, ellei kyseisessä alakohdassa erikseen muuta lue. Raportti tulee kirjoittaa samalla, kun työskentelee.&lt;/p>
&lt;p>Kaikki käytetyt lähteet tulee merkitä raporttiin: kurssin tehtäväsivu, kurssikavereiden raportit, man-sivut, kirjat.&lt;/p>
&lt;p>Tiivistelmiä tai esseitä ei saa generoida tekoälyllä eikä muilla vastaavilla tekniikoilla, vaan ne on kirjoitettava itse. Mikäli tekoälyltä kysyy neuvoa, se on merkittävä lähteeksi. Tekoälyt hallusinoivat, tiedot on suositeltavaa tarkistaa. Tehtävät tulee tehdä itse, eikä niitä tule antaa suurelta osin tekoälyn ratkaistavaksi. Sehän olisi sama kuin ostaa punttisjäsennyys - ja nokkelasti jättää käymättä punttisalilla.&lt;/p>
&lt;p>Kaksi ristiinarviota (vähintään) per palautettu tehtävä. Ristiinarvioilla harjoitellaan palautteen antamista ja analyysia. Anna sisällöllisiä kommentteja, parannusehdotuksia, neuvoja.&lt;/p>
&lt;p>Tehtäviä saa aloittaa vasta, kun on hyväksynyt kurssin säännöt.&lt;/p>
&lt;h3 id="h1-kybertappoketju">h1 Kybertappoketju&lt;/h3>
&lt;p>&lt;em>Tehtäviä saa aloittaa vasta, kun on hyväksynyt kurssin säännöt. Koneet on eristettävä Internetistä hyökkäysten harjoittelun ajaksi.&lt;/em>&lt;/p>
&lt;p>&lt;em>Tehtävät ovat virallisia vasta, kun ne on annettu tehtäväksi. Niitä ei tule aloittaa etukäteen, koska niiden sisältö voi vielä muuttua olennaisesti.&lt;/em>&lt;/p>
&lt;ul>
&lt;li>x) Lue/katso/kuuntele ja tiivistä. (Tässä x-alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen tai kuunteleminen ja tiivistelmä riittää. Tiivistämiseen riittää muutama ranskalainen viiva. Kannataa lisätä kustakin oma huomio, idea tai kysymys.)
&lt;ul>
&lt;li>&lt;a href="https://herrasmieshakkerit.fi/">Herrasmieshakkerit&lt;/a> (&lt;a href="https://hakkerit.libsyn.com/rss">RSS&lt;/a>) tai &lt;a href="https://darknetdiaries.com/episode/">Darknet Diaries&lt;/a> (&lt;a href="https://podcast.darknetdiaries.com/">RSS&lt;/a>) , yksi vapaavalintainen jakso jommasta kummasta. Voi kuunnella myös lenkillä, pyykiä viikatessa tms. Siisti koti / hyvä kunto kaupan päälle.&lt;/li>
&lt;li>&lt;a href="https://lockheedmartin.com/content/dam/lockheed-martin/rms/documents/cyber/LM-White-Paper-Intel-Driven-Defense.pdf">Hutchins et al 2011: Intelligence-Driven Computer Network Defense Informed by Analysis of Adversary Campaigns and Intrusion Kill Chains&lt;/a>, chapters &lt;em>Abstract&lt;/em>, 3.2 &lt;em>Intrusion Kill Chain&lt;/em>.&lt;/li>
&lt;li>€ Santos et al: The Art of Hacking (Video Collection): &lt;a href="https://learning.oreilly.com/videos/the-art-of/9780135767849/9780135767849-SPTT_04_00">4.3 Surveying Essential Tools for Active Reconnaissance&lt;/a>. Sisältää porttiskannauksen. 5 videota, yhteensä noin 20 min.&lt;/li>
&lt;li>&lt;a href="https://finlex.fi/fi/oikeus/kko/kko/2003/20030036">KKO 2003:36&lt;/a>. (Vain silmäily, ei tarvitse lukea kokonaan eikä varsinkaan tehdä syvällistä analyysia).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>a) Asenna Kali virtuaalikoneeseen. (Jos asennuksessa ei ole mitään ongelmia tai olet asentanut jo aiemmin, tarkkaa raporttia tästä alakohdasta ei tarvita. Kerro silloin kuitenkin, mikä versio ja millä asennustavalla. Jos on ongelmia, niin tarkka ja toistettava raportti).&lt;/li>
&lt;li>b) Irrota Kali-virtuaalikone verkosta. Todista testein, että kone ei saa yhteyttä Internetiin (esim. 'ping 8.8.8.8')&lt;/li>
&lt;li>c) Porttiskannaa 1000 tavallisinta tcp-porttia omasta koneestasi (nmap -T4 -A localhost). Selitä komennon paramterit. Analysoi ja selitä tulokset.&lt;/li>
&lt;li>d) Asenna kaksi vapaavalintaista demonia ja skannaa uudelleen. Analysoi ja selitä erot.&lt;/li>
&lt;li>e) Ratkaise vapaavalintainen kone HackTheBoxista. Omalle tasolle sopiva, useimmille varmaan Starting Pointista. Valitse kone, jota et ole ratkaissut vielä. Ei tunnilla näytetty Meow. (Propellihatuille: jos teet vaikeampia ei-starting-point koneita, niin retired tai vastaava kone, josta saa julkaista writeupin).&lt;/li>
&lt;/ul>
&lt;p>Vinkkejä&lt;/p>
&lt;ul>
&lt;li>Sivun tekeminen wepiin onnistuu helposti Githubilla. Karvinen 2023: &lt;a href="https://terokarvinen.com/2023/create-a-web-page-using-github/">Create a Web Page Using Github&lt;/a>&lt;/li>
&lt;li>Podcastien kuunteluun &lt;a href="https://antennapod.org/">AntennaPod&lt;/a> löytyy &lt;a href="https://f-droid.org/en/packages/de.danoeh.antennapod/">F-Droid:sta&lt;/a> ja Google Play:sta. Tietysti podcasteja voi kuunnella sadoilla muillakin ohjelmilla.&lt;/li>
&lt;li>Halutessasi voit käyttää myös muita virtualisointiympäristöjä kuin VirtualBoxia, esim Macilla UTM tai Linuxilla virt-manager (libvirt, qemu). Tämä edellyttää toki omaa soveltamista.&lt;/li>
&lt;li>Suosittelen Kaliin 4 GB muistia&lt;/li>
&lt;li>OffSec Ltd 2023: &lt;a href="https://www.kali.org/get-kali/#kali-virtual-machines">Prebuilt Virtual Machines&lt;/a>&lt;/li>
&lt;li>Tutustu tarvittaessa itse etsimiisi lähteisiin, kuten man-sivuihin ja ohjelmien dokumentaatioon.&lt;/li>
&lt;li>HackTheBox:n OpenVPN-yhteyden asennus (ulkomuistista)
&lt;ul>
&lt;li>Oikea HackTheBoxin alue on &amp;quot;Practice hands-on Labs&amp;quot; &lt;a href="https://app.hackthebox.com/home">https://app.hackthebox.com/home&lt;/a> (ei Academy)&lt;/li>
&lt;li>Tallenna ruutukaappaus säännöistä ennen aloitusta. HTB oikealla ylhäällä, kysymysmerkin alla.&lt;/li>
&lt;li>Lataa Starting Point foo.ovpn
&lt;ul>
&lt;li>Connect-nappi, HackTheBoxin oikeassa yläreunassa&lt;/li>
&lt;li>Oikealla ylhäällä &amp;quot;Connect&amp;quot;, &amp;quot;Starting point&amp;quot;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Tuo (import) yhteys Network Manager:iin
&lt;ul>
&lt;li>Network manager - Linuxissa ala/yläpalkissa tarjottimella (tray, notification area), naaras ethernet-portin kuva tai koneet haalaavat -ikoni (riippuen versiosta). Tai komentoriviltä 'nmcli'.&lt;/li>
&lt;li>VPN Connections: Create. &amp;quot;Import&amp;quot; on alimmaisena, ja valikkoa pitää kelata alaspäin.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>VPN päälle, testaus.
&lt;ul>
&lt;li>VPN päälle löytyy samasta Network Manager -kuvakkeesta.&lt;/li>
&lt;li>'ping 8.8.8.8' - pitäisi toimia (vastata) VPN pois päältä, ja lakata vastaamasta kun laitat VPN päälle.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Muista laittaa lähdeviitteet. Viittaa joka tehtävästä kurssiin ja kaikkiin muihinkin käyttämiisi lähteisiin.&lt;/li>
&lt;li>O'Reilly Learning videot ja kirjat pääset lukemaan ilmaiseksi HH tunnuksilla, kun kirjaudut kirjaston &lt;a href="https://libguides.haaga-helia.fi/az/databases">Haaga-Helia A-Z&lt;/a> kautta.&lt;/li>
&lt;li>Kun olet irroittanut Internetin ja valmiina skannaamaan, varmista. Kokeile, että Google tai DuckDuckGo ei aukea selaimella, että et voi pingata esim 8.8.8.8. Kokeile, että maalikoneesi vastaa pingiin. Jos maalikoneella on weppipalvelin, kannattaa katsoa selaimella, että sieltä aukeaa olettamasi sivu.&lt;/li>
&lt;li>Tietoja verkosta
&lt;ul>
&lt;li>ip a; ifconfig&lt;/li>
&lt;li>ip route&lt;/li>
&lt;li>ipcalc 10.0.0.1/24&lt;/li>
&lt;li>ping 8.8.8.8&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ole huolellinen, irrota harjoituskoneet Internetistä skannausten ja hyökkäysten ajaksi. Mitään ulkopuolisia koneita ei saa skannata eikä mihinkään ulkopuolisiin koneisiin saa tunkeutua.&lt;/li>
&lt;li>Jokin tehtävä voi olla vaikea. Tee ja raportoi silloin kaikki mitä osaat. Listaa lähteet, joista hait ohjeita. Onko jotain vielä kokeiltavana? Mitä haasteita on vielä ratkaisun tiellä? Mitä virheimoituksia tai vastaavia tulee? Voit myös katsoa wepistä esimerkkiratkaisun - muista viitata lähteeseen ja merkitä, missä kohdassa katsoit ratkaisua. Ja katsotaan yhdessä tunnilla loput.&lt;/li>
&lt;li>Ongelmallisista kohdista raportoidaan erityisen tarkasti, jotta voimme antaa vinkkejä haasteisiin.&lt;/li>
&lt;/ul>
&lt;h3 id="h2-dora-the-explora">h2 DORA the Explora&lt;/h3>
&lt;p>&lt;em>Can you say TIBER-FI?&lt;/em>&lt;/p>
&lt;ul>
&lt;li>x) Lue/katso/kuuntele ja tiivistä. (Tässä x-alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen tai kuunteleminen ja tiivistelmä riittää. Tiivistämiseen riittää muutama ranskalainen viiva. Lisää mukaan jokin oma havainto, idea tai kysymys)
&lt;ul>
&lt;li>Buuri 2026: &lt;a href="https://terokarvinen.com/buuri-2026-dora-and-threat-lead-penetration-testing/buuri-2026-dora-and-threat-lead-penetration-testing--teros-pentest-course.pdf">DORA and TLPT testing - Lecture for Haaga-Helia on 31 March 2026&lt;/a> (pdf, 2 MB)&lt;/li>
&lt;li>&lt;a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj/eng">DORA (Regulation ... on digital operational resilience for the financial sector)&lt;/a> (vain nämä kaksi artiklaa):
&lt;ul>
&lt;li>Article 26 &amp;quot;Advanced testing of ICT tools, systems and processes based on TLPT&amp;quot;&lt;/li>
&lt;li>Article 27 &amp;quot;Requirements for testers for the carrying out of TLPT&amp;quot;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.suomenpankki.fi/globalassets/bof/en/money-and-payments/the-bank-of-finland-as-catalyst-payments-council/tiber-fi/tiber-fi-2.0-procedures-and-guidelines.pdf">TIBER-FI procedures and guidelines&lt;/a> (pdf, 1 MB) (vain tämä kohta):
&lt;ul>
&lt;li>5.4 Testing phase: Red team testing (johdantokappale suoraan 5.4 alta, &amp;quot;5.4.1 Red team test plan creation&amp;quot; alkuun asti)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Vapaaehtoinen bonus: Buuri 2026: &lt;a href="https://youtu.be/z6KIEEknKjM?si=7n8cNWynzMrEwdWZ">D26 - Releasing Your Inner TIBER in Regulated Adversary Simulations&lt;/a>. Video, 45 min. Disobey 2026.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>a) Asenna Metasploitable 2 virtuaalikoneeseen.&lt;/li>
&lt;li>b) Tee Kalin ja Metasploitablen välille virtuaaliverkko. Jos säätelet VirtualBoxista
&lt;ul>
&lt;li>Kali saa yhteyden Internettiin, mutta sen voi laittaa pois päältä&lt;/li>
&lt;li>Kalin ja Metasploitablen välillä on host-only network, niin että porttiskannatessa ym. koneet on eristetty intenetistä, mutta ne saavat yhteyden toisiinsa&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>c) Harjoittelemme omassa virtuaaliverkossa, jossa on Kali ja Metaspoitable. Osoita testein, että 1) koneet eivät saa yhteyttä Internetiin 2) Koneet saavat yhteyden toisiinsa.&lt;/li>
&lt;li>d) Etsi Metasploitable porttiskannaamalla (nmap -sn). Tarkista selaimella, että löysit oikean IP:n - Metasploitablen weppipalvelimen etusivulla lukee Metasploitable.&lt;/li>
&lt;li>e) Porttiskannaa Metasploitable huolellisesti ja kaikki portit (nmap -A -T4 -p-). Poimi 2-3 hyökkääjälle kiinnostavinta porttia. Analysoi ja selitä tulokset näiden porttien osalta. Voit hakea analyysin tueksi tietoa verkosta, muista merkitä lähteet.&lt;/li>
&lt;li>f) Vapaaehtoinen bonus: Sisään vaan. Pääsetkö murtautumaan Metasploitableen?&lt;/li>
&lt;li>g) Vapaaehtoinen bonus: jos haluat, voit jo kokeilla metasploit-hyökkäysohjelmaa omaan harjoitusmaaliisi. Tätä katsotaan myöhemmin yhdessäkin. (Muista irrottaa kone Internetistä kokeilujen ajaksi. 'sudo msfdb init', 'sudo msfconsole').&lt;/li>
&lt;/ul>
&lt;p>Vinkkejä&lt;/p>
&lt;ul>
&lt;li>Virtuaalikoneiisin voi asentaa uusia verkkokortteja vain, kun ne ovat sammuksissa&lt;/li>
&lt;li>Kannattaa lukea Valkamon artikkelista VirtualBox-osuus ennenkuin ryhdyt asentamaan virtuaalikoneita. Valkamo 2022: &lt;a href="https://tuomasvalkamo.com/PenTestCourse/week-2/">Hacking into a Target Using Metasploit&lt;/a>: Metasploitable&lt;/li>
&lt;li>VirtualBoxissa host-only-networking on kätevä. Voit laittaa Kaliin kaksi verkkokorttia, toinen NAT:lla Internetiin ja toinen host-only-network:n. Verkkoasetusten advanced-kohdasta voi vetää virtuaalisen verkkokaapelin irti ja kiinni, vaikka kone on päällä.&lt;/li>
&lt;li>Jos Metasploitable 2 -maali ei löydy omasta verkosta (arp, arpwatch, netdiscover, nmap -sn...), voit kirjatua sisään (msfadmin:msfadmin) ja 'ifconfig' tai 'ip addr'. Metasploitable 2:n kannattaa laittaa vain yksi &amp;quot;Host only networking&amp;quot; verkkokortti, se ei toimi itsestään kahden verkkokortin kanssa.&lt;/li>
&lt;/ul>
&lt;h3 id="h3-eternalhomework">h3 EternalHomework&lt;/h3>
&lt;ul>
&lt;li>x) Lue/katso/kuuntele ja tiivistä. (Tässä x-alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen tai kuunteleminen ja tiivistelmä riittää. Tiivistämiseen riittää muutama ranskalainen viiva.)
&lt;ul>
&lt;li>€ Jaswal 2020: Mastering Metasploit - 4ed: Chapter 1: Approaching a Penetration Test Using Metasploit&lt;/a> (kohdasta &lt;a href="https://learning.oreilly.com/library/view/mastering-metasploit/9781838980078/B15076_01_Final_ASB_ePub.xhtml#_idParaDest-31">Conducting a penetration test with Metasploit&lt;/a> luvun loppuun eli &amp;quot;Summary&amp;quot; loppuun)&lt;/li>
&lt;li>Mitä 'nmap -sn' tekee? Älä arvaa, vaan perustele lähteillä. Mistä tiedät, että käyttämäsi lähde on luotettava?&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>b) Tallenna porttiskannauksen tuloksia Metasploitin tietokantoihin. Skannaa niin, että Metasploitable tulee mukaan. Kannattaa ottaa mukaan ainakin versioskannaus -sV (joka on banner grabbing plus).&lt;/li>
&lt;li>c) Tarkastele Metasploitin tietokantoihin tallennettuja tietoja komennoilla &amp;quot;hosts&amp;quot; ja &amp;quot;services&amp;quot;. Kokeile suodattaa näitä listoja tai hakea niistä.&lt;/li>
&lt;li>d) Internet famous. Etsi Metasploitablen mukana tulevista hyökkäyksistä (en: exploits; search) sellainen, joka on ollut julkisuudessa.&lt;/li>
&lt;li>e) Vertaile nmap:n omaa tiedostoon tallennusta (-oA foo) ja db_nmap:n tallennusta tietokantoihin. Mitkä ovat eri tiedostomuotojen ja Metasploitin tietokannan hyvät puolet?&lt;/li>
&lt;li>f) Murtaudu Metasploitablen vsftpd-palveluun&lt;/li>
&lt;li>g) Kerää levittäytymisessä (lateral movement) tarvittavaa tietoa metasploitablesta. Analysoi tiedot. Selitä, miten niitä voisi hyödyntää.&lt;/li>
&lt;li>h) Murtaudu Metasploitableen jollain toisella tavalla. (Jos tämä kohta on vaikea, voit tarvittaessa turvautua verkosta löytyviin läpikävelyohjeisiin. Merkitse silloin raporttiin, missä määrin tarvitsit niitä).&lt;/li>
&lt;li>i) Demonstroi Meterpretrin ominaisuuksia.&lt;/li>
&lt;li>j) Tallenna shell-sessio tekstitiedostoon script-työkalulla (script -fa log001.txt) tai tmux:lla.&lt;/li>
&lt;li>k) Pivot point. Laita kaikki harjoituksen tiedostot (script -fa, nmap -oA...) samaan kansioon. Hae sopiva pivot point (sovellus, versio, osoite, MAC-numero) 'grep -r' -komennolla. Keksi uskottava esimerkkikysymys, johon haet vastausta.&lt;/li>
&lt;li>l) Attaaack! Mitä Mitre Attack taktiikoita ja tekniikoita käytit tässä harjoituksessa? (Tässä alakohdassa &amp;quot;Attaack!&amp;quot; ei tarvitse tehdä lisää testejä koneella, koska testit on jo tehty.)&lt;/li>
&lt;li>m) Vapaaehtoinen: Etsi esimerkki Mitre Attack proseduurista (procedure), jossa joku uhkatoimija on käyttänyt samoja tekniikoita.&lt;/li>
&lt;li>n) Vapaaehtoinen: Titityy. Saatko Metasploitableen tty-shellin, eli esimerkiksi avattua koko ruudulle piirtävän nano:n?&lt;/li>
&lt;li>o) Vapaaehtoinen, vaikea: Kokeile jotain kilpailevaa hyökkäystyökalua tai vihamielistä etäkäyttötyökalua, kuten &lt;a href="https://sliver.sh/">Sliver&lt;/a> tai Scarecrow.&lt;/li>
&lt;li>p) Vapaaehtoinen: Asenna ja korkkaa Metasploitable 3. Karvinen 2018: &lt;a href="https://terokarvinen.com/2018/install-metasploitable-3-vulnerable-target-computer/">Install Metasploitable 3 – Vulnerable Target Computer&lt;/a>&lt;/li>
&lt;li>q) Vapaaehtoinen: Peekaboo. Demonstroi, kuinka hyökkääjä vakoilee meterpreterillä. Kuuntele mikrofonilla, ota kuvia tai videota kameralla. (Huolehdi, ettei ulkopuolisia joudu kuunnelluksi tai katselluksi.)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Vinkkejä&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>O'Reilly Learning videot ja kirjat pääset lukemaan ilmaiseksi HH tunnuksilla, kun kirjaudut kirjaston kautta.&lt;/li>
&lt;li>Jos Metasploitable 2 -maali ei löydy omasta verkosta (arp, arpwatch, netdiscover, nmap -sn...), voit kirjatua sisään (msfadmin:msfadmin) ja 'ifconfig' tai 'ip addr'. Metasploitable 2:n kannattaa laittaa vain yksi &amp;quot;Host only networking&amp;quot; verkkokortti, se ei toimi itsestään kahden verkkokortin kanssa.&lt;/li>
&lt;li>Murtautumiseen Metasploitable 2:n löytyy esimerkkiratkaisuja &lt;a href="https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide">Metasploitable 2 Exploitability Guide&lt;/a>. Tämä on läpikävelyohje, joten kannattaa yrittää ensin itse.&lt;/li>
&lt;li>&lt;a href="https://attack.mitre.org/">Mitre Attack Enterprise Matrix&lt;/a>
&lt;ul>
&lt;li>Tactic, välitavoitteita, esim. &lt;a href="https://attack.mitre.org/tactics/TA0003/">TA0003 Persistence&lt;/a>&lt;/li>
&lt;li>Techique, keinoja, esim. &lt;a href="https://attack.mitre.org/techniques/T1189/">T1189 Drive-by Compromise&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://attack.mitre.org/resources/faq/">Mitre FAQ&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>grep -ir
&lt;ul>
&lt;li>grep -ir -C 3 --color=always terokarvinen.com|less -R&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>MsfConsole vinkit (ulkomuistista)&lt;/strong>&lt;/p>
&lt;p>Tässä siis ulkomuistista, voit etsiä näistä lisätietoa ja oikean kirjoitusasun.&lt;/p>
&lt;pre>&lt;code>$ sudo msfdb init
$ sudo msfconsole
msf&amp;gt; db_nmap localhost
msf&amp;gt; services
msf&amp;gt; hosts
msf&amp;gt;
msf&amp;gt; workspaces
msf&amp;gt; sessions
msf&amp;gt; sessions --help
msf&amp;gt;
msf&amp;gt; search vsftpd
msf&amp;gt; use 0
msf&amp;gt; setg RHOSTS 127.0.0.1 # huolellisesti, tähän hyökätään kohta
msf&amp;gt;
msf&amp;gt; show options
msf&amp;gt; exploit
msf&amp;gt;
msf&amp;gt; sessions 1
shell
ctrl-Z
msf&amp;gt; session -u 1
&lt;/code>&lt;/pre>
&lt;h3 id="h4-taysin-laillinen-sertifikaatti">h4 Täysin Laillinen Sertifikaatti&lt;/h3>
&lt;ul>
&lt;li>x) Lue/katso ja tiivistä. (Tässä x-alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen tai kuunteleminen ja tiivistelmä riittää. Tiivistämiseen riittää muutama ranskalainen viiva kustakin artikkelista - ei pitkiä esseitä. Kannattaa lisätä myös jokin oma ajatus, idea, huomio tai kysymys.)
&lt;ul>
&lt;li>OWASP 2021: OWASP Top 10:2021
&lt;ul>
&lt;li>&lt;a href="https://owasp.org/Top10/A01_2021-Broken_Access_Control/">A01:2021 – Broken Access Control &lt;/a> (IDOR ja path traversal ovat osa tätä)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>PortSwigget Academy:
&lt;ul>
&lt;li>&lt;a href="https://portswigger.net/web-security/access-control/idor">Insecure direct object references (IDOR)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://portswigger.net/web-security/file-path-traversal">Path traversal&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://portswigger.net/web-security/cross-site-scripting">Cross-site scripting&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>a) Totally Legit Sertificate. Asenna OWASP ZAP, generoi CA-sertifikaatti ja asenna se selaimeesi. Laita ZAP proxyksi selaimeesi. Laita ZAP sieppaamaan myös kuvat, niitä tarvitaan tämän kerran kotitehtävissä. Osoita, että hakupyynnöt ilmestyvät ZAP:n käyttöliittymään. (Voi vaatia Firefox about:config network.proxy.allow_hijacking_localhost. Foxyproxy laittoi tämän aiemmin päälle itse. Kalin Firefox ESR oli viimeksi ongelmia Foxyproxyn kanssa - vaihtoehtona on asettaa Proxy käsin Settings, hakusana &amp;quot;proxy&amp;quot;)&lt;/li>
&lt;li>b) Kettumaista. Asenna &amp;quot;FoxyProxy Standard&amp;quot; Firefox Addon, ja lisää ZAP proxyksi siihen. Käytä FoxyProxyn &amp;quot;Patterns&amp;quot; -toimintoa, niin että vain valitsemasi weppisivut ohjataan Proxyyn. (Läksyssä ohjataan varmaankin PortSwigger Labs ja localhost.)&lt;/li>
&lt;li>PortSwigger Labs. Ratkaise tehtävät. Selitä ratkaisusi: mitä palvelimella tapahtuu, mitä eri osat tekevät, miten hyökkäys löytyi, mistä vika johtuu. Kannattaa käyttää ZAPia, vaikka malliratkaisut käyttävät harjoitusten tekijän maksullista ohjelmaa. Monet tehtävät voi ratkaista myös pelkällä selaimella. Malliratkaisun kopioiminen ZAP:n tai selaimeen ei ole vastaus tehtävään, vaan ratkaisu ja haavoittuvuuden etsiminen on selitettävä ja perusteltava.
&lt;ul>
&lt;li>Cross Site Scripting (XSS)
&lt;ul>
&lt;li>c) &lt;a href="https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded">Reflected XSS into HTML context with nothing encoded&lt;/a>&lt;/li>
&lt;li>d) &lt;a href="https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded">Stored XSS into HTML context with nothing encoded&lt;/a>&lt;/li>
&lt;li>e) Selitä esimerkin avulla, mitä hyökkääjä hyötyy XSS-hyökkäyksestä. Alert(&amp;quot;Hei Tero!&amp;quot;) ei vielä tarjoa kummoista pääsyä. (Tässä alakohdassa ei tarvitse tehdä testejä tietokoneella, pelkkä lyhyt ja selkeä selitys riittää.)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Path traversal
&lt;ul>
&lt;li>f) &lt;a href="https://portswigger.net/web-security/file-path-traversal/lab-simple">File path traversal, simple case&lt;/a>. Laita tarvittaessa Zapissa kuvien sieppaus päälle.&lt;/li>
&lt;li>g) &lt;a href="https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass">File path traversal, traversal sequences blocked with absolute path bypass&lt;/a>&lt;/li>
&lt;li>h) &lt;a href="https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively">File path traversal, traversal sequences stripped non-recursively&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Insecure Direct Object Reference (IDOR)
&lt;ul>
&lt;li>i) &lt;a href="https://portswigger.net/web-security/access-control/lab-insecure-direct-object-references">Insecure direct object references&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>j) Vapaaehtoinen, helppo: Asenna &lt;a href="https://github.com/ffuf/pencode">pencode&lt;/a> ja muunna sillä jokin merkkijono (encode a string).&lt;/li>
&lt;li>k) Vapaaehtoinen: Mitmproxy. Asenna MitmProxy. Esittele sitä terminaalissa (TUI). Ota TLS-purku käyttöön. Poimi historiasta hakupyyntö, muokkaa sitä ja lähetä uudelleen.&lt;/li>
&lt;li>l) Vapaaehtoinen: Ratkaise lisää PortSwigger Labs -tehtäviä. Kannattaa tehdä helpoimmat &amp;quot;Apprentice&amp;quot; -tason tehtävät ensin.&lt;/li>
&lt;/ul>
&lt;p>Vinkit&lt;/p>
&lt;ul>
&lt;li>Firefox ei enää ohjaa proxyyn liikennettä mihinkään 127-alkuiseen IP-osoitteeseen eikä localhostiin. Foxyproxy tai about:config network.proxy.allow_hijacking_localhost auttaa&lt;/li>
&lt;li>Zap asennus
&lt;ul>
&lt;li>Nykyisin Kalissa 'sudo apt-get install zaproxy', 'zaproxy' näytti toimivan, joten kannattaa kokeilla sitä ensin.&lt;/li>
&lt;li>&lt;a href="https://www.zaproxy.org/download/">OWASP ZAP Download-sivun&lt;/a> sopivin JAR on &amp;quot;Cross Platform Package&amp;quot;, noin 250 MB.&lt;/li>
&lt;li>Kalissa 'sudo apt-get install zaproxy'&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Proxya voi testata vaikkapa Metasploitablen weppipalveluiden kanssa. Tai &lt;a href="https://terokarvinen.com/2024/webgoat-podman/">asentaa WebGoatin Podmaniin&lt;/a>. Tai käyttää läksyn PortSwigger Labsin harjoituksia.
&lt;ul>
&lt;li>Älä tee hyökkäyksiä mihinkään muualle kuin harjoitusmaaleihin&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ZAP TLS-yhteyksien avaamiseen CA-sertifikaatti
&lt;ul>
&lt;li>Löytyy Tools: Options: Network alta, hakusanaksi &amp;quot;Certificate&amp;quot;.
&lt;ul>
&lt;li>Joissain versioissa haku ei suodata listaa, vaan värittää osumat oranssilla. Ja tietysti oikea sertifikaatti on piilossa, niin että pitää klikkaamalla avata listaa. Sertifikaattikohtia on kaksi, tässä turha asiakkaan sertifikaatti ja oikea, tarvittava palvelimen sertifikaatti (Server Certificate tms).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Firefoxissa Settings ja hakusanaksi &amp;quot;Certificate&amp;quot;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ZAP:n tärkein toiminto: Requester tab.
&lt;ul>
&lt;li>Löytyy historiasta oikeaa nappia painamalla. Myös Ctrl-W.&lt;/li>
&lt;li>Muokkaa hakupyyntöä ja lähetä. Vastaus näkyy vieresssä. Korjaa ja lähetä uudelleen.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ZAP hakupyynnön pysäytys
&lt;ul>
&lt;li>Vain, jos Requester eli saman pyynnön uudelleenlähetys ei toimi.&lt;/li>
&lt;li>Puussa olevista osoitteista oikeaa nappia, menusta &amp;quot;Break...&amp;quot;&lt;/li>
&lt;li>Tee pyyntö selaimella&lt;/li>
&lt;li>Pyyntö näkyy ZAPissa oikealla ylhäällä &amp;quot;Break&amp;quot; välilehdellä.&lt;/li>
&lt;li>Muokaa pyynnön tekstiä, lähetä eteenpäin yläreunan työkalupallin Play-symbolia klikkaamalla&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ZAP kuvien sieppaus muistaakseni Options: Display: ...images.
&lt;ul>
&lt;li>Osa tässäkin läksynä olevista harjoituksista edellyttää, että kuvien sieppaus on päällä.&lt;/li>
&lt;li>Monissa ZAP:n versioissa jättää kokonaan kuvat näyttämättä oletuksena.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>PortSwiggerin tehtävissä voi käyttää välimiesproxyna ZAP:ia tai MitmProxya. Ei siis tarvitse ostaa noiden harjoitusten tekijän kuuluisaa ohjelmaa.&lt;/li>
&lt;li>Pencoder - loistava ohjelma stringien muunteluun fuff:n tekijältä. Esim. URLEncode, base64...
&lt;ul>
&lt;li>Pencoder asennus ulkomuistista: hae Github-sivu &amp;quot;fuff pencode&amp;quot;, Releases, pencode*linux_amd64.tar.gz, pura paketti, aja valmis binääri, kopioi se /usr/local/bin/.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Viittaa
&lt;ul>
&lt;li>Viittasithan kurssiin ja tehtäväsivuun?&lt;/li>
&lt;li>Viittasithan kaikkiin käyttämiisi artikkeleihin?&lt;/li>
&lt;li>Viittasithan muiden tehtäväraportteihin, jos käytit lähteenä?&lt;/li>
&lt;li>Videoihin, man-sivuihin, ohjelmiin, StackOverflowhun...&lt;/li>
&lt;li>Viittasithan kaikkiin muihinkin lähteisiin?&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Hakkeroimaan oppii hakkeroimalla.&lt;/li>
&lt;/ul>
&lt;h3 id="h5-elokuu2026">h5 Elokuu2026!&lt;/h3>
&lt;p>&lt;em>Nyt levitään! Opit murtamaan salasanoja.&lt;/em>&lt;/p>
&lt;ul>
&lt;li>x) Lue/katso ja tiivistä. (Tässä x-alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen tai kuunteleminen ja tiivistelmä riittää. Tiivistämiseen riittää muutama ranskalainen viiva kustakin artikkelista. Kannattaa lisätä myös jokin oma ajatus, idea, huomio tai kysymys.)
&lt;ul>
&lt;li>Karvinen 2022: &lt;a href="https://terokarvinen.com/2022/cracking-passwords-with-hashcat/">Cracking Passwords with Hashcat&lt;/a>&lt;/li>
&lt;li>Karvinen 2023: &lt;a href="https://terokarvinen.com/2023/crack-file-password-with-john/">Crack File Password With John&lt;/a>&lt;/li>
&lt;li>Vapaaehtoinen: € Santos et al 2017: Security Penetration Testing - The Art of Hacking Series LiveLessons: &lt;a href="https://learning.oreilly.com/videos/security-penetration-testing/9780134833989/9780134833989-sptt_00_06_00_00">Lesson 6: Hacking User Credentials&lt;/a> (8 videos, about 30 min)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>a) Asenna Hashcat ja testaa sen toiminta murtamalla esimerkkisalasana.&lt;/li>
&lt;li>c) Asenna John the Ripper ja testaa sen toiminta murtamalla jonkin esimerkkitiedoston salasana.&lt;/li>
&lt;li>e) Tiedosto. Tee itse tai etsi verkosta jokin salakirjoitettu tiedosto, jonka saat auki. Murra sen salaus. (Jokin muu formaatti kuin aiemmissa alakohdissa kokeilemasi).&lt;/li>
&lt;li>f) Tiiviste. Tee itse tai etsi verkosta salasanan tiiviste, jonka saat auki. Murra sen salaus. (Jokin muu formaatti kuin aiemmissa alakohdissa kokeilemasi. Voit esim. tehdä käyttäjän Linuxiin ja murtaa sen salasanan.)&lt;/li>
&lt;li>g) Sanakirja. Oman sanakirjan teko parantaa onnistumismahdollisuuksia. Demonstroi, kuinka teet oman sanakirjan hashcat:n tai john:iin.&lt;/li>
&lt;li>h) Hash rules. Näytä esimerkki HashCatin sääntöjen käytöstä (rules).&lt;/li>
&lt;/ul>
&lt;p>Vinkit&lt;/p>
&lt;ul>
&lt;li>Sanakirjan teko, vaihtoehtoja
&lt;ul>
&lt;li>cewl (verbose, limit depth)&lt;/li>
&lt;li>copy-paste, sanat erilleen, duplikaatit pois&lt;/li>
&lt;li>Elokuu2026!, Syyskuu2026!...&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Hashcatin säännöistä best64 on kokeilemisen arvoinen&lt;/li>
&lt;li>O'Reilly Learning videot ja kirjat pääset lukemaan &lt;a href="https://libguides.haaga-helia.fi/az/databases">ilmaiseksi HH tunnuksilla, kun kirjaudut kirjaston kautta&lt;/a>.&lt;/li>
&lt;/ul>
&lt;h3 id="h6-fuzzy-feeling-upon-finding">h6 Fuzzy Feeling Upon Finding&lt;/h3>
&lt;p>&lt;em>Opit käyttämään maailman johtavaa weppifuzzeria: ffuf. Ja tunnilla sen opetti joohoi.&lt;/em>&lt;/p>
&lt;ul>
&lt;li>x) Lue/katso/kuuntele. (Tässä x-alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen tai kuunteleminen ja tiivistelmä riittää. Tiivistämiseen riittää muutama ranskalainen viiva kustakin artikkelista. Kannattaa lisätä myös jokin oma ajatus, idea, huomio tai kysymys. [Päivitys 2026-09-25 w39 Fri: laitoin Hoikkalan kalvot tähän mukaan, kun sain luvan.]
&lt;ul>
&lt;li>&lt;a href="hoikkala-2026-fuzzing-with-ffuf.pdf">Hoikkala 2026: Fuzzing with Fuff&lt;/a>, kalvot joohoin esityksestä kurssilta.&lt;/li>
&lt;li>Vapaaehtoista lisälukemistoa
&lt;ul>
&lt;li>Karvinen 2023: &lt;a href="https://terokarvinen.com/2023/fuzz-urls-find-hidden-directories/">Find Hidden Web Directories - Fuzz URLs with ffuf&lt;/a>&lt;/li>
&lt;li>Hoikkala 2026: &lt;a href="https://github.com/ffuf/ffuf/blob/master/README.md">ffuf README.md&lt;/a>&lt;/li>
&lt;li>Hoikkala &amp;quot;joohoi&amp;quot; 2020: &lt;a href="https://www.youtube.com/watch?v=mbmsT3AhwWU">Still Fuzzing Faster (U fool)&lt;/a>. In HelSec Virtual meetup #1. (Noin tunnin mittainen)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Vaultline &lt;a href="https://ffuf.io.fi/play">https://ffuf.io.fi/play&lt;/a>
&lt;ul>
&lt;li>a) Tallenna itsellesi kopio säännöistä. Kirjoita omin sanoin,
&lt;ul>
&lt;li>Scope. Mikä on kohde?&lt;/li>
&lt;li>Rules of engagement. Mitä sille saa tehdä, eli mitä tai millaisia menetelmiä saa käyttää?&lt;/li>
&lt;li>Mihin oikeutesi tehdä tietoturvatestausta tähän kohteeseen perustuu?&lt;/li>
&lt;li>Riskit ja mitigointi. Tuo palvelin on Internetissä. Tunnista lyhyesti riskit ja niiden mitigointi ennen käytännön harjoittelua.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>b) Asenna ffuf versio, joka tukee aivan uutta preflight-ominaisuutta.&lt;/li>
&lt;li>c1) Content discovery (Vaultline &lt;a href="https://ffuf.io.fi/play">https://ffuf.io.fi/play&lt;/a> tehtävät on numeroitu näin, käytetään tässä samoja.).&lt;/li>
&lt;li>c2) The interesting non-200&lt;/li>
&lt;li>c3) Recursion&lt;/li>
&lt;li>c4) Virtual hosts&lt;/li>
&lt;li>c9) The login you cannot replay (Has preflight! Has CSRF token!)&lt;/li>
&lt;li>Vapaaehtoisena muut Vaultlinen tehtävät&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Vapaaehtoinen: mainosta kavereille &lt;a href="https://www.haaga-helia.fi/en/happy-hacking-day-2026">Happy Hacking Day&lt;/a>:ta! Linkkiä saa jakaa.&lt;/li>
&lt;/ul>
&lt;p>Vinkit&lt;/p>
&lt;ul>
&lt;li>Koneiden fuzzaaminen vaati etukäteisen kirjallisen luvan. Testaamisen mikään osa ei saa kohdistua kohteen (scope) ulkopuolisiin palveluihin. Tässä harjoituksessa fuzzataan julkisen verkon yli vain joohoin &lt;a href="https://ffuf.io.fi/play">https://ffuf.io.fi/play&lt;/a> -sivua&lt;/li>
&lt;li>Preflight
&lt;ul>
&lt;li>Preflight avulla voit hyökätä CSRF-suojattuihin lomakkeisiin, vaikkapa renkuttaa salasanoja netin yli. Kiitos joohoi, tämä ominaisuus oli minun toiveeni!&lt;/li>
&lt;li>Vaultline: &amp;quot;preflight shipped in ffuf v2.3.0. Older builds do not have the flag at all: ffuf -h|grep -c preflight should not print 0.&amp;quot;&lt;/li>
&lt;li>Viimeisin versio löytyy ffuf:n Github-reposta. Releases-kohdasta saa valmiin binäärin.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="hx-koita-simpukoita">hx Koita simpukoita&lt;/h3>
&lt;p>&lt;em>Mitä kirjainta pitää painaa? Missä on &amp;quot;any key&amp;quot;? Nyt joudut itse hakemaan ohjeita verkosta työkalujen käyttöön, mikä tekee monesta kohdasta haastavamman.&lt;/em>&lt;/p>
&lt;p>&lt;em>Mikään tässä harjoituksessa tehty tai käytetty ohjelma ei saa olla itsestään leviävä (ei virus, ei mato).&lt;/em>&lt;/p>
&lt;p>&lt;em>Useimmat tehtävät eivät edellytä haittaohjelman binäärin liittämistä raporttiin. Mikäli laitat binäärin verkkoon, pakkaa se salakirjoitettuun zip-pakettiin ja laita salasanaksi yleisen käytännön mukaan &amp;quot;infected&amp;quot;. Latauslinkin yhteydessä on oltava selkeä varoitus siitä, että kyseessä on haittaohjelma (malware), jota ei tule ajaa tuotantokoneilla. Salasanan voit halutessasi kertoa varoitusten yhteydessä.&lt;/em>&lt;/p>
&lt;ul>
&lt;li>a) Venom. Tee msfvenom-työkalulla haittaohjelma, joka soittaa kotiin (reverse shell). Ota yhteys vastaan metasploitin multi/handler -työkalulla.&lt;/li>
&lt;li>b) Snif venom! Tarkastele ja analysoi msfvenomin muodostamaa reverse shell -yhteyttä. Käytä snifferiä, kuten Wireshark. Mitä havaitset? Mistä ominaisuuksista yhteyden voi tunnistaa? Millä muutoksilla tunnistamista voi vaikeuttaa?&lt;/li>
&lt;li>c) Hello, Sliver. Näytä esimerkki http-yhteydestä Sliverillä.&lt;/li>
&lt;li>d) Sniff Sliver! Tarkastele Sliverin http-yhteyttä snifferillä. Mitä havaitset? Mistä ominaisuuksista yhteyden voi tunnistaa?&lt;/li>
&lt;li>e) Sliverillä voit muuttaa yhteyden ominaisuuksia. Kokeile ja näytä esimerkki. Muista todeta testein, että muutokset toimivat.&lt;/li>
&lt;li>f) Sliverillä voi tehdä monenlaista kohteessa, ruutukaappauksista alkaen. Näytä esimerkkejä toiminnoista.&lt;/li>
&lt;li>g) Vapaaehtoinen: Kokeile Sliver-binääriä Windowsissa.&lt;/li>
&lt;li>h) Vapaaehtoinen: Tee Windows-asennusohjelma, joka asentaa jonkin tavallisen ohjelman ja sen yhteydessä Sliver-haitakkeen.&lt;/li>
&lt;li>i) Vapaaehtoinen: Kokeile Veil.&lt;/li>
&lt;li>j) Vapaaehtoinen: Kokeile ScareCrow.&lt;/li>
&lt;li>k) Vapaaehtoinen: Tee PoshC2-työkalulla haittaohjelma, joka soittaa kotiin.&lt;/li>
&lt;li>l) Vapaaehtoinen: Tee Mythic-työkalulla haittaohjelma, joka soittaa kotiin.&lt;/li>
&lt;li>m) Vapaaehtoinen: Asenna Windows-virtuaalikone ja tee kotiin soittava haittaohjelma siihen. Itse tykkään Linuxista ja käytän paljon sitä, tässä hieman vaihtelua. Windows-käyttäjät ovat myös usein tottuneet (paketinhallinnan puutteessa) lataamaan ohjelmia weppisivuilta.&lt;/li>
&lt;/ul>
&lt;p>Vinkit&lt;/p>
&lt;ul>
&lt;li>Irrota tarvittasessa koneet netistä testien ajaksi.&lt;/li>
&lt;li>Metasploit msfconsole multi/handler
&lt;ul>
&lt;li>laita samat asetukset kuin msfvenom&lt;/li>
&lt;li>muista 'set payload'&lt;/li>
&lt;li>'run -j' ajaa taustalla, sessiot ovat 'sessions'&lt;/li>
&lt;li>prosessoriarkkitehtuuri kohteen mukaan&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Reverse shell:
&lt;ul>
&lt;li>Palvelimen päässä pitää olla reikä tulimuurissa.&lt;/li>
&lt;li>Reverse shell tarkoittaa, että palvelin (server, kuunteleva portti) on hyökkäyskoneella.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Sliveriin kannattaa tarvittaessa hakea ohjeita myös tekoälyllä. Vielä joitakin kuukausia sitten Sliverin omissa ohjeissa oli ärsyttäviä virheitä - toivottavasti ne on jo korjattu.&lt;/li>
&lt;li>Jos liität haittaohjelmien binäärejä raporttiin, pitää estää niiden asentaminen vahingossa
&lt;ul>
&lt;li>Salakirjoitettu zip-paketti, salasana &amp;quot;infected&amp;quot;&lt;/li>
&lt;li>Varoitus lautauslinkin yhteyteen: haittaohjelma / malware&lt;/li>
&lt;li>Jos testaat eristetyissä laboratorioympäristöissä virustorjunnan ohitusta, niin tietysti siinä käytetään vain sisältöä ja vältetään pahoja sanoja &amp;quot;malware&amp;quot;, &amp;quot;infected&amp;quot;, &amp;quot;meterpreter&amp;quot;...&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Muista ht8 lipunryöstöä aloittelijoille&lt;/li>
&lt;/ul>
&lt;p>Esimerkki ulkomuistista, pitää itse soveltaa&lt;/p>
&lt;pre>&lt;code>$ msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=8080 -o infected
&lt;/code>&lt;/pre>
&lt;h3 id="lippuvalmistelu">Lippuvalmistelu&lt;/h3>
&lt;ul>
&lt;li>Lippuvalmistelu. Valmistele kone ensi viikon lipunryöstöön. Tästä kohdasta ei tarvita kattavaa raporttia, riittää pelkkä luettelo siitä, miten ratkaisit allaolevat kysymykset. Jos sinulla on esimerkiksi valmis, toimiva Kali VM tavallisella PC:llä, tässä ei tarvitse tehdä juuri mitään.
&lt;ul>
&lt;li>amd64. Haasteet voivat sisältää amd64-binäärejä. Nämä toimivat itsestään perus-PC:ssä, joita lähes kaikkien koneet ovat. Macintosheissa (M1, M2, M3...) hankala tehdä tehtävää, joten kannattaa ottaa tavallinen amd64-kone.&lt;/li>
&lt;li>Netti. Koneesta pitää päästä nettiin, jotta voit palauttaa liput. Voi olla kätevää, että saat nettiyhteyden katkaistuksi, jotta porttiskannailu ym. on huoletonta.&lt;/li>
&lt;li>Too many secrets. Opettaja voi tarkastaa lipunryöstön koneesi ja tutkia kaikkia siellä olevia tiedostoja. Jos käytät pelkästään virtuaalikonetta (myös selailu, muistiinpanot ym virtuaalikoneesta), tarkastaminen koskee vain sitä. Katso, ettei tällä koneella ole luottamuksellisia tietoja.&lt;/li>
&lt;li>Koneella saa olla haluamasi ohjelmat ja työkalut. Työkaluista ja ohjelmista pitää antaa opettajalle kopio, jos ne eivät ole yleisesti käytettyjä, tunnettuja ja saatavilla olevia vapaita ohjelmia.&lt;/li>
&lt;li>Jos lipunryöstön koneella on muistiinpanoja, niistä on annettava kopio opettajalle sähköpostilla. Omia muistiinpanoja saa olla, mutta ei ole pakko. Lipunryöstössä saa lukea julkisia lähteitä, kuten opettajan kotisivuja sekä omia ja toisten julkisia raportteja.&lt;/li>
&lt;li>Paikallinen tekoäly. Omaa tekoälyä ei tarvita lipunryöstössä, eikä siitä todennäköisesti ole juuri hyötyä. Mutta siltä varalta, että joku miettii tätä: Paikallisen tekoälyn käyttö lipunryöstössä on sallittu, jos ilmoittaa Terolle etukäteen sähköpostilla siitä, antaa opettajalle sähköpostitse täydellisen kopion keskustelusta tekoälyn kanssa ja kaikki paramaterit, sekä kopion tekoälyn koodista ja painoista tai linkin niihin. Ulkopuolisen tekoälyn käyttö verkon yli on lipunryöstössä kielletty.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="h8-bonus">h8 Bonus&lt;/h3>
&lt;p>Vapaaehtoinen bonus: luettele ja linkitä tähän tekemäsi&lt;/p>
&lt;ul>
&lt;li>a) Vapaaehtoiset tehtävät&lt;/li>
&lt;li>b) Ristiinarvioinnin jälkeen olennaisesti parannetut tehtävät&lt;/li>
&lt;li>c) Kurssin ulkopuolella tekemäsi kiinnostavat hakkerointihaasteet, esimerkiksi
&lt;ul>
&lt;li>Projektit&lt;/li>
&lt;li>HackTheBox korkatut koneet, mukaan ruutukaappaus pistesivustasi. Erottele retired ja non-retired. (Ei non-retired boksien läpikävelyohjeita julkiseen weppiin)&lt;/li>
&lt;li>Lipunryöstöt&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Tehtävän määräaika on 24 h ennen viimeisen opetuskerran alkua. Tämä bonustehtävä on kokonaan vapaaehtoinen.&lt;/p>
&lt;p>&lt;em>Onnea lipunryöstöön!&lt;/em>&lt;/p></description></item><item><title>Card Size Gallery</title><link>https://terokarvinen.com/card-size-gallery/</link><pubDate>Mon, 03 Aug 2026 20:22:31 +0300</pubDate><guid>https://terokarvinen.com/card-size-gallery/</guid><description>
&lt;p>List of products is often shown as images on a grid. This pattern is called &amp;quot;cards&amp;quot;.&lt;/p>
&lt;p>Card Size Gallery allows you to test what different card formats look like.&lt;/p>
&lt;p>&lt;a href="card-sizes-grid.html">Try Card Size Gallery&lt;/a> - right in your browser.&lt;/p>
&lt;p>Clanker warning: I created this AI-assisted.&lt;/p>
&lt;p>&lt;a href="card-sizes-grid.html">
&lt;img src="https://terokarvinen.com/card-size-gallery/Test%20card%20sizes%20-%20grid%20of%20images_hucf46fc4697ff326a2efb2256be0582d9_254872_850x850_fit_box_3.png" width="775" height="850" alt=" " class="imgOne right">
&lt;/a>&lt;/p></description></item><item><title>Kokoro TTS - Voice Comparison</title><link>https://terokarvinen.com/kokoro-foss-tts-voice-comparison/</link><pubDate>Wed, 08 Jul 2026 17:10:54 +0300</pubDate><guid>https://terokarvinen.com/kokoro-foss-tts-voice-comparison/</guid><description>
&lt;p>Free, open weight models can generate speech. On your local machine.&lt;/p>
&lt;p>Listen to &lt;a href="https://terokarvinen.com/kokoro-voice-comparison/">voice samples of all Kokoro TTS voices&lt;/a> on the web.&lt;/p>
&lt;p>Optionally, install Kokoro with Podman.&lt;/p>
&lt;h2 id="listen-and-compare-voices-in-your-browser">Listen and Compare Voices in Your Browser&lt;/h2>
&lt;p>Search and filter by gender and language. The demo text is currently only in English.&lt;/p>
&lt;p>Kokoro is a free text-to-speech engine, architected by Li, Han, Raghavan, Mischler and Mesgarani; and trained by @rzvnzn. I just created the samples and the page to filter them. Their default flagship voice is af_heart (English, female), but there are many other interesting voices.&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/kokoro-voice-comparison/">Listen Kokoro samples now&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/kokoro-voice-comparison/">&lt;img src="kokoro-tts-foss-voice-comparison-samples-english-female.png" class="pad">&lt;/a>&lt;/p>
&lt;h2 id="run-kokoro-with-podman">Run Kokoro with Podman&lt;/h2>
&lt;p>These commands assume you already have Podman installed. Podman runs containers like Docker. It's safer than Docker, as it does not require root (or the infamous root-equivalent docker group).&lt;/p>
&lt;p>Let's download and run Brauns ready-made Kokoro container:&lt;/p>
&lt;pre>&lt;code>$ podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu
&lt;/code>&lt;/pre>
&lt;p>Web user interface: &lt;a href="http://localhost:8880/web/">http://localhost:8880/web/&lt;/a>&lt;/p>
&lt;img src="fast-kokoro-web.jpg" class="pad">
&lt;p>API, usable with Python requests http://localhost:8880/v1&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;p>Hacker News 2026: &lt;a href="https://news.ycombinator.com/item?id=48821576">Local, CPU-Friendly, High-Quality TTS (Text-to-Speech) with Kokoro&lt;/a>&lt;/p>
&lt;p>Li, Han, Raghavan, Mischler and Mesgarani, @rzvnzn 2026: &lt;a href="https://huggingface.co/hexgrad/Kokoro-82M">hexgrad/Kokoro-82M on HuggingFace&lt;/a>&lt;/p>
&lt;p>Braun 2026: &lt;a href="https://github.com/remsky/Kokoro-FastAPI">remsky / Kokoro-FastAPI on Github&lt;/a>&lt;/p></description></item><item><title>cdu - Jump up to project directory</title><link>https://terokarvinen.com/cdu-change-dir-up-to-project-dir/</link><pubDate>Mon, 06 Jul 2026 11:58:45 +0300</pubDate><guid>https://terokarvinen.com/cdu-change-dir-up-to-project-dir/</guid><description>
&lt;p>You're five levels deep in your git repo. You would like to get to the top level. 'cdu'.&lt;/p>
&lt;p>An up only directory jumper for zsh and bash. Nicely complements other directory jumpers, like zoxide, autojump or fasd.&lt;/p>
&lt;h2 id="usage-example">Usage example&lt;/h2>
&lt;pre>&lt;code>$ pwd
/home/tero/code/revincom/doc/design/subsystems/nav/fallbacks/sun
$ cdu
/home/tero/code/revincom
Found .git
&lt;/code>&lt;/pre>
&lt;p>If you have really deep repos, such as monorepos, cdu can help you even more.&lt;/p>
&lt;p>Deep in a Django project, cdu jumps to manage.py level first. The next cdu will take you to repo root.&lt;/p>
&lt;h2 id="a-new-cdu-change-dir-up">A new 'cdu', change dir up&lt;/h2>
&lt;p>I have used a longer bash version for years. This is a rewrite to support both zsh and bash. It's also shorter. Prettier and more features, but less tested than the old one.&lt;/p>
&lt;p>Save the source code to a dir where it runs (e.g. /usr/local/bin/changedirup). Make runnable (chmod ugo+rx /usr/local/bin/changedirup). Add to your .bashrc and .zshrc: 'alias cdu=&amp;quot;source changedirup&amp;quot;'. Log out and back.&lt;/p>
&lt;p>And now you can jump up with 'cdu'.&lt;/p>
&lt;h2 id="source-code-gpl">Source code, GPL&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#099">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#099">&lt;/span>&lt;span style="color:#09f;font-style:italic"># changedirup - cd up to project top dir, &amp;#39;alias cdu=&amp;#34;source changedirup&amp;#34;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#09f;font-style:italic"># To persist it, add the alias to .zshrc or .bashrc&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#09f;font-style:italic"># Single usage also works with &amp;#39;source cdu&amp;#39; or &amp;#39;. cdu&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#09f;font-style:italic"># Can be run again to go to even higher project dir. &lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#09f;font-style:italic"># cdu works with zsh and bash. Shebang #! is just for syntax highlight.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#09f;font-style:italic"># SPDX-License-Identifier: GPL-3.0-or-later&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#09f;font-style:italic"># SPDX-FileCopyrightText: Copyright 2020-2026 Tero Karvinen https://TeroKarvinen.com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#033">CDU_PWD_WAS&lt;/span>&lt;span style="color:#555">=&lt;/span>&lt;span style="color:#c30">&amp;#34;&lt;/span>&lt;span style="color:#069;font-weight:bold">$(&lt;/span>&lt;span style="color:#366">pwd&lt;/span>&lt;span style="color:#069;font-weight:bold">)&lt;/span>&lt;span style="color:#c30">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#366">cd&lt;/span> ..
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#069;font-weight:bold">while&lt;/span> true; &lt;span style="color:#069;font-weight:bold">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">for&lt;/span> f in .git Makefile .profile .bashrc README.md requirements.txt go.mod manage.py hosts.ini .project project.godot Dockerfile Cargo.toml index.theme config.toml default.gpr DICOMDIR ansible.cfg site.yml Vagrantfile package.json pyproject.toml zowe.yaml pom.xml build.gradle Gemfile composer.json docker-compose.yml compose.yaml .cobaltstrike.beacon_keys flake.nix .zshrc .ssh .sliver .sliver-client .msf4 havoc_default.yaotl .projectile .svn .hg .fossil .jj .editorconfig _darcs .bzr Cargo.lock .bash_profile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">if&lt;/span> &lt;span style="color:#555">[&lt;/span> -e &lt;span style="color:#c30">&amp;#34;&lt;/span>&lt;span style="color:#033">$f&lt;/span>&lt;span style="color:#c30">&amp;#34;&lt;/span> &lt;span style="color:#555">]&lt;/span>; &lt;span style="color:#069;font-weight:bold">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">echo&lt;/span> &lt;span style="color:#c30">&amp;#34;Found &lt;/span>&lt;span style="color:#033">$f&lt;/span>&lt;span style="color:#c30">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">pwd&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">break&lt;/span> &lt;span style="color:#f60">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">if&lt;/span> &lt;span style="color:#555">[&lt;/span> &lt;span style="color:#c30">&amp;#34;&lt;/span>&lt;span style="color:#069;font-weight:bold">$(&lt;/span>&lt;span style="color:#366">pwd&lt;/span>&lt;span style="color:#069;font-weight:bold">)&lt;/span>&lt;span style="color:#c30">&amp;#34;&lt;/span> &lt;span style="color:#555">=&lt;/span> &lt;span style="color:#c30">&amp;#34;/&amp;#34;&lt;/span> &lt;span style="color:#555">]&lt;/span>; &lt;span style="color:#069;font-weight:bold">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">cd&lt;/span> &lt;span style="color:#c30">&amp;#34;&lt;/span>&lt;span style="color:#033">$CDU_PWD_WAS&lt;/span>&lt;span style="color:#c30">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">echo&lt;/span> &lt;span style="color:#c30">&amp;#34;No project files found above. Working directory unchanged.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">pwd&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">break&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#069;font-weight:bold">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#366">cd&lt;/span> .. &lt;span style="color:#555">||&lt;/span> &lt;span style="color:#366">break&lt;/span> &lt;span style="color:#09f;font-style:italic"># prevent infinite loop in the rare case cd fails for permissions&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#069;font-weight:bold">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>ppp Personal Project Portfolio</title><link>https://terokarvinen.com/ppp-personal-project-portfolio/</link><pubDate>Thu, 02 Jul 2026 11:52:15 +0300</pubDate><guid>https://terokarvinen.com/ppp-personal-project-portfolio/</guid><description>
&lt;p>Arrange your ideas into a skill tree.&lt;/p>
&lt;ul>
&lt;li>Pick little wins on your way to big goals&lt;/li>
&lt;li>Ship something at every step&lt;/li>
&lt;li>Turn ambition into output&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://terokarvinen.com/ppp/">Open ppp in your browser&lt;/a>. Free, no login.&lt;/p>
&lt;h2 id="talk-nerd-to-me">Talk nerd to me&lt;/h2>
&lt;p>Single 50 kB HTML file with no dependencies. Use online or 100% offline. Your data stays yours: JSON export and import. Fully usable with keyboard-only - or mouse-only with keyboard just for typing names. A vibe-coded GUI editor for a directed acyclic graph with project-specific attributes: costs, deliverables, soft benefits. Public beta.&lt;/p>
&lt;p>Gain a bird's-eye view with ppp. I hope you have more ideas than time to do them. Use ppp to decide which path to pick next. Once you're committed, use &lt;a href="https://terokarvinen.com/2021/calendar-txt/">calendar.txt&lt;/a> and todo.txt for day-to-day and hour-to-hour.&lt;/p>
&lt;h2 id="try-ppp">Try ppp&lt;/h2>
&lt;p>&lt;a href="https://terokarvinen.com/ppp/">Try ppp&lt;/a>. Free web access, no login required. Optionally save the 50 kB HTML file for 100% offline use. Looking forward to your &lt;a href="#comments">comments&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://terokarvinen.com/ppp/">
&lt;img src="https://terokarvinen.com/ppp-personal-project-portfolio/ppp%20Personal%20Portfolio%20Manager%20-%20A%20skill%20tree%20for%20life_hu1fdde610736e2f1bce27e11014b13464_169827_1000x1000_fit_box_3.png" width="1000" height="477" alt=" " class="imgOne pad">
&lt;/a>&lt;/p></description></item><item><title>Apache installed with Ansible - quick notes</title><link>https://terokarvinen.com/apache-ansible/</link><pubDate>Thu, 09 Apr 2026 16:10:04 +0300</pubDate><guid>https://terokarvinen.com/apache-ansible/</guid><description>
&lt;img src="https://terokarvinen.com/apache-ansible/apache-httpd-logo_hu0274bb063ced1072a70ec8e201c9b197_74947_400x400_fit_box_3.png" width="206" height="400" alt=" " class="imgOne right">
&lt;p>Install Apache 2 web server automatically. Serves a web site on the front page of http://localhost. Pages can be edited as a normal user - without root or sudo.&lt;/p>
&lt;p>Simplified Ansible role. An example of &lt;em>package-file-server&lt;/em> pattern. Just notes, no tutorial.&lt;/p>
&lt;p>Using these short notes require a working Ansible configuration - &lt;a href="https://terokarvinen.com/hello-ansible/">Hello Ansible&lt;/a>.&lt;/p>
&lt;h2 id="package-file-service-pattern">Package-file-service pattern&lt;/h2>
&lt;p>Daemons, like Apache2 web server, are somewhat similar. They are configured with package-file-service pattern. Install the daemon, change configuration by editing files, start it.&lt;/p>
&lt;ul>
&lt;li>package - sudo apt-get install apache2&lt;/li>
&lt;li>files - sudoedit /etc/apache2/...&lt;/li>
&lt;li>service - sudo systemctl restart apache2&lt;/li>
&lt;/ul>
&lt;p>Changes to configuration files only take effect after you kick the daemon. Thus, &lt;em>file&lt;/em> in tasks/main.yml &lt;em>notify&lt;/em> the &lt;em>handler&lt;/em> &amp;quot;restart apache2&amp;quot;.&lt;/p>
&lt;h2 id="tree-of-rolesapache2">tree of roles/apache2/&lt;/h2>
&lt;pre>&lt;code>roles/apache2/ # All files related to &amp;quot;apache2&amp;quot; role
├── files/ # Master copies of files
│   └── example.com.conf
├── handlers/ # restarting services
│   └── main.yml
└── tasks/ # most ansible code
└── main.yml
&lt;/code>&lt;/pre>
&lt;h2 id="tasksmainyml">tasks/main.yml&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#309;font-weight:bold">apt&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>apache2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">state&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>present&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>- &lt;span style="color:#309;font-weight:bold">copy&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">dest&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;/etc/apache2/sites-available/example.com.conf&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">src&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;example.com.conf&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">owner&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;root&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">group&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;root&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">mode&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;0644&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">notify&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>restart apache2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>- &lt;span style="color:#309;font-weight:bold">file&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">src&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>/etc/apache2/sites-available/example.com.conf&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">dest&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>/etc/apache2/sites-enabled/example.com.conf&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">owner&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>root&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">group&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>root&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">state&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>link&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">notify&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>restart apache2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="handlersmainyml">handlers/main.yml&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#309;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>restart apache2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">systemd&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>apache2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">state&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>restarted&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="filesexamplecomconf">files/example.com.conf&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span># Managed file, changes will be overwritten
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;VirtualHost *:80&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ServerName example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DocumentRoot /home/tero/publicsite/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;Directory /home/tero/publicsite/&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> require all granted
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/Directory&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/VirtualHost&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="adminstrivia">Adminstrivia&lt;/h2>
&lt;p>Apache httpd logo is a trademark of The Apache Software Foundation.&lt;/p></description></item><item><title>Passwordless Sudo with Ansible</title><link>https://terokarvinen.com/passwordless-sudo-with-ansible/</link><pubDate>Thu, 02 Apr 2026 16:44:50 +0300</pubDate><guid>https://terokarvinen.com/passwordless-sudo-with-ansible/</guid><description>
&lt;p>Sudo without password, automatically. Short example role for ansible.&lt;/p>
&lt;p>The role&lt;/p>
&lt;ul>
&lt;li>creates a new user in &amp;quot;sudoless&amp;quot; group&lt;/li>
&lt;li>adds a sudoers.d/ NOPASSWD rule for the group&lt;/li>
&lt;/ul>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;p>Applying this example file requires you to have &lt;a href="https://terokarvinen.com/hello-ansible/">Ansible working&lt;/a>.&lt;/p>
&lt;p>Tero's rule #1 for IaC: &lt;em>Manual before auto.&lt;/em>&lt;/p>
&lt;p>So it's a good idea to try creating &lt;a href="https://terokarvinen.com/passwordless-sudo/">passwordless sudo manually&lt;/a> first.&lt;/p>
&lt;p>&lt;em>Draft: This article has commands written from memory. It has not gone trough quality assuarance and testing yet.&lt;/em>&lt;/p>
&lt;h2 id="tree">Tree&lt;/h2>
&lt;pre>&lt;code>$ tree -F
./
├── ansible.cfg
├── hosts.ini
├── roles/
│   ├── antero/
│   │   └── tasks/
│   │   └── main.yml
│   └── world/
│   └── tasks/
│   └── main.yml
└── site.yml
&lt;/code>&lt;/pre>
&lt;h2 id="role---antero">Role - antero&lt;/h2>
&lt;p>cat roles/antero/tasks/main.yml&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#309;font-weight:bold">group&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;sudoless&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">state&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>present&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>- &lt;span style="color:#309;font-weight:bold">user&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;antero&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">state&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>present&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">groups&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>[&lt;span style="color:#c30">&amp;#34;sudoless&amp;#34;&lt;/span>,&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;sudo&amp;#34;&lt;/span>,&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;adm&amp;#34;&lt;/span>]&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>- &lt;span style="color:#309;font-weight:bold">authorized_key&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">user&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;antero&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">key&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;ssh-ed25519 U2VlIHlvdSBhdCBUZXJvS2FydmluZW4uY29tIQ== tero@example.com&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>- &lt;span style="color:#309;font-weight:bold">copy&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">dest&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;/etc/sudoers.d/sudoless&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">content&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;%sudoless ALL = (ALL) NOPASSWD: ALL\n&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">owner&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;root&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">group&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;root&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">mode&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#c30">&amp;#34;0644&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="first-run---chicken-or-egg">First run - chicken or egg?&lt;/h2>
&lt;p>For the first run, you don't yet have sudo without password.&lt;/p>
&lt;p>Let's make ansible try for sudo rights. Add &amp;quot;become: true&amp;quot; in the correct block in site.yml:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f3f3;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#309;font-weight:bold">hosts&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>all&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">become&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#069;font-weight:bold">true&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#309;font-weight:bold">roles&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- world&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- antero&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>$ ansible-playbook site.yml
&lt;/code>&lt;/pre>
&lt;p>Now it should complain that sudo needs password. Ansible asks this with -K aka --ask-become-password.&lt;/p>
&lt;pre>&lt;code>$ ansible-playbook site.yml --ask-become-password
&lt;/code>&lt;/pre>
&lt;h2 id="tips">Tips&lt;/h2>
&lt;p>When you got it to work manually, you have your example. Copy it to automation!&lt;/p>
&lt;ul>
&lt;li>Copy paste paths.&lt;/li>
&lt;li>Copy files or file contents.&lt;/li>
&lt;li>Use 'stat' to check for modes (permissions). Do not guess octal permissions, you have to understand them to avoid privesc worries.&lt;/li>
&lt;/ul>
&lt;p>Some IaC programs only reliably understand octal modes (numbers), and only as strings. I would also recommend explicit leading zero meaning no special permissions (no setgid...). So &amp;quot;0644&amp;quot;, in quotes. Maybe it has improved over the years? Who knows.&lt;/p></description></item></channel></rss>