<?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>DEV Community: Khalif AL Mahmud</title>
    <description>The latest articles on DEV Community by Khalif AL Mahmud (@almahmudkhalif).</description>
    <link>https://dev.to/almahmudkhalif</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2248836%2F3df06cb4-bca9-419a-a92f-40933dcd6ac6.png</url>
      <title>DEV Community: Khalif AL Mahmud</title>
      <link>https://dev.to/almahmudkhalif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/almahmudkhalif"/>
    <language>en</language>
    <item>
      <title>Practical Reconnaissance and Attack Surface Discovery with Subfinder, httpx, FFUF, Katana, and AI</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Wed, 02 Sep 2026 21:22:38 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/practical-reconnaissance-and-attack-surface-discovery-with-subfinder-httpx-ffuf-katana-and-ai-2ho2</link>
      <guid>https://dev.to/almahmudkhalif/practical-reconnaissance-and-attack-surface-discovery-with-subfinder-httpx-ffuf-katana-and-ai-2ho2</guid>
      <description>&lt;p&gt;I wanted to understand what a careful, low-impact reconnaissance process looks like before any deeper security testing begins. The goal was not to “attack” a system, but to build an accurate map of publicly observable assets: domains, live hosts, technologies, directories, URLs, and authentication-related routes.&lt;/p&gt;

&lt;p&gt;This exploration used Playtika’s authorized bug-bounty scope as the example. The in-scope target was the wildcard &lt;code&gt;*.playtika.com&lt;/code&gt;, with the important restriction that only assets explicitly included by the program should be considered. Everything below focuses on discovery and documentation—not exploitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem statement
&lt;/h2&gt;

&lt;p&gt;A large organization rarely has a single website. It may have APIs, shops, content sites, staging systems, CDN hosts, game services, administrative applications, and older endpoints spread across many subdomains. Looking only at the main homepage can therefore miss most of the observable attack surface.&lt;/p&gt;

&lt;p&gt;The practical problem was to answer six questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which subdomains can be identified from public sources?&lt;/li&gt;
&lt;li&gt;Which of those hosts respond over HTTP or HTTPS?&lt;/li&gt;
&lt;li&gt;What technologies and version clues are exposed?&lt;/li&gt;
&lt;li&gt;Which directories and URLs are visible through normal discovery and crawling?&lt;/li&gt;
&lt;li&gt;Which assets deserve attention based on function and naming?&lt;/li&gt;
&lt;li&gt;Can an AI-assisted wordlist organize what has already been observed without inventing unsupported names?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-step reconnaissance workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Confirm the authorization boundary
&lt;/h3&gt;

&lt;p&gt;Before running tools, I recorded the target and scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program: Playtika bug bounty
Target: *.playtika.com
Rule: include only assets listed by the program; exclude anything outside the published scope
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fajt9nx99uin1n457q5sx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fajt9nx99uin1n457q5sx.jpg" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the program page showing the authorized `&lt;/em&gt;.playtika.com` wildcard and the exclusion notice for domains or applications not specifically included.*&lt;/p&gt;

&lt;p&gt;This scope check matters because a wildcard alone does not automatically authorize every related service, third-party hostname, or discovered dependency.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Enumerate subdomains with Subfinder
&lt;/h3&gt;

&lt;p&gt;I used Subfinder to collect publicly discoverable subdomains, then sorted and deduplicated the results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;subfinder &lt;span class="nt"&gt;-d&lt;/span&gt; playtika.com &lt;span class="nt"&gt;-silent&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; | &lt;span class="nb"&gt;tee &lt;/span&gt;playtika_subdomains.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The document shows examples such as &lt;code&gt;api.playtika.com&lt;/code&gt;, &lt;code&gt;account.hof-dsa.playtika.com&lt;/code&gt;, &lt;code&gt;admin.cc-api-dsa.playtika.com&lt;/code&gt;, &lt;code&gt;assets.wsop.playtika.com&lt;/code&gt;, and many CDN, API, pre-production, and game-related names.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfw5em97ykdznmm0vzka.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgfw5em97ykdznmm0vzka.png" alt=" " width="800" height="591"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the first visible portion of the Subfinder output, including several discovered subdomains.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqaf070qcwf5u1yzwksvk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqaf070qcwf5u1yzwksvk.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: Capture the terminal command that writes sorted unique results to &lt;code&gt;playtika_subdomains.txt&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To count the result set, I used:&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;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; playtika_subdomains.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The recorded result was &lt;strong&gt;447 unique subdomains&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft0g4u2cj6wy2falkvwu8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft0g4u2cj6wy2falkvwu8.png" alt=" " width="785" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: Capture the &lt;code&gt;wc -l&lt;/code&gt; output showing &lt;code&gt;447 playtika_subdomains.txt&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Probe for live HTTP and HTTPS hosts
&lt;/h3&gt;

&lt;p&gt;Next, I reduced the subdomain list to hosts that responded to web probes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;httpx-toolkit &lt;span class="nt"&gt;-l&lt;/span&gt; playtika_subdomains.txt &lt;span class="nt"&gt;-silent&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; playtika_live_hosts.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The document records &lt;strong&gt;95 live HTTP/HTTPS hosts&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Famgzd0ugfxnstvek9sa2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Famgzd0ugfxnstvek9sa2.png" alt=" " width="799" height="308"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the live URLs produced by the HTTP probing step.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7eppev0qiyx5mrpsjnm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7eppev0qiyx5mrpsjnm.png" alt=" " width="800" height="86"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the command and output showing &lt;code&gt;95 playtika_live_hosts.txt&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For a more useful first-pass fingerprint, I also collected status codes, page titles, and detected technologies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;httpx-toolkit &lt;span class="nt"&gt;-l&lt;/span&gt; playtika_live_hosts.txt &lt;span class="nt"&gt;-silent&lt;/span&gt; &lt;span class="nt"&gt;-status-code&lt;/span&gt; &lt;span class="nt"&gt;-title&lt;/span&gt; &lt;span class="nt"&gt;-tech-detect&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; playtika_tech.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples in the output included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cdn-shop.playtika.com&lt;/code&gt; returning &lt;code&gt;200&lt;/code&gt;, with HTTP/3 and HSTS indicators.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;events.playtika.com&lt;/code&gt; returning &lt;code&gt;200&lt;/code&gt;, with Cloudflare, HTTP/3, HubSpot, HubSpot CMS Hub, and LinkedIn Ads indicators.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;octopus.playtika.com&lt;/code&gt; returning &lt;code&gt;200&lt;/code&gt;, titled &lt;strong&gt;Octopus Ad Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Several hosts returning &lt;code&gt;301&lt;/code&gt;, &lt;code&gt;404&lt;/code&gt;, or &lt;code&gt;Access Denied&lt;/code&gt;, which is still useful context during inventory building.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fopuxs4yozkodn7f8miy6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fopuxs4yozkodn7f8miy6.png" alt=" " width="799" height="308"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture representative lines from &lt;code&gt;playtika_tech.txt&lt;/code&gt; showing status codes, titles, and technology fingerprints.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Review technology fingerprints
&lt;/h3&gt;

&lt;p&gt;The identified technologies included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare and Cloudflare Bot Management&lt;/li&gt;
&lt;li&gt;HTTP/3 and HSTS&lt;/li&gt;
&lt;li&gt;Nginx and Varnish&lt;/li&gt;
&lt;li&gt;Bootstrap, jQuery, jQuery UI, and Slick&lt;/li&gt;
&lt;li&gt;HubSpot CMS Hub&lt;/li&gt;
&lt;li&gt;Google Cloud/CDN and Platform.sh&lt;/li&gt;
&lt;li&gt;Hugo &lt;code&gt;0.125.7&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nginx &lt;code&gt;1.22.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;OneTrust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Version clues are not vulnerabilities by themselves. They are useful for understanding the stack, checking documentation, and deciding where careful, authorized review may be appropriate.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Run conservative directory discovery with FFUF
&lt;/h3&gt;

&lt;p&gt;I tested the main web host with FFUF using the SecLists common directory wordlist and matched common successful or redirect status codes:&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://ww.playtika.com/FUZZ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/seclists/Discovery/Web-Content/common.txt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Mmc&lt;/span&gt; 200,204,301,302,307,308 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; playtika_dirs.json &lt;span class="nt"&gt;-of&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The recorded scan used 40 threads, a 10-second timeout, and completed 4,750 wordlist requests without errors.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzz43b8qbsgqqwrofeh7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzz43b8qbsgqqwrofeh7.png" alt=" " width="800" height="290"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture FFUF’s URL, wordlist, matcher, thread count, timeout, and completed scan summary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I also ran a second pass with a smaller directory-focused wordlist:&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://ww.playtika.com/FUZZ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/seclists/Discovery/Web-Content/common_directories.txt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-mc&lt;/span&gt; 200,204,301,302,307,308 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; playtika_dirs2.json &lt;span class="nt"&gt;-of&lt;/span&gt; json
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feg75tm6wshem2pr3tl0p.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feg75tm6wshem2pr3tl0p.png" alt=" " width="800" height="290"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the second FFUF command using &lt;code&gt;common_directories.txt&lt;/code&gt; and its completed run.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The important result was negative: these FFUF scans did &lt;strong&gt;not&lt;/strong&gt; produce additional matching directories in the recorded work. That does not prove that no other paths exist; it only describes what these wordlists and response filters found.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Check robots.txt and sitemap.xml directly
&lt;/h3&gt;

&lt;p&gt;Public metadata files often reveal useful navigation information without brute forcing. I checked their status and final URL first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code} %{url_effective}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://ww.playtika.com/robots.txt

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code} %{url_effective}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://ww.playtika.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both returned HTTP &lt;code&gt;200&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nj6euoevs41leskmdv4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nj6euoevs41leskmdv4.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the two &lt;code&gt;curl&lt;/code&gt; checks showing successful responses for &lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I then read their contents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://ww.playtika.com/robots.txt
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://ww.playtika.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The robots file pointed to the sitemap. The sitemap exposed paths including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/careers/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/get-to-know-us/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/games/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/life-at-playtika/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/in-the-press/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/press-releases/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/careers/security-it/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/careers/data-science/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/careers/research-development/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The paths most worth reviewing next were &lt;code&gt;/careers/&lt;/code&gt;, &lt;code&gt;/games/&lt;/code&gt;, &lt;code&gt;/get-to-know-us/&lt;/code&gt;, &lt;code&gt;/press-releases/&lt;/code&gt;, and &lt;code&gt;/careers/security-it/&lt;/code&gt;. The next safe step would be to inspect links, forms, parameters, JavaScript references, and access controls without attempting to bypass them.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Crawl URLs and application routes with Katana
&lt;/h3&gt;

&lt;p&gt;To discover links and client-side resources exposed through the web application, I crawled the main host with Katana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;katana &lt;span class="nt"&gt;-u&lt;/span&gt; https://www.playtika.com &lt;span class="nt"&gt;-silent&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; playtika_katana.txt
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr7pz728qp71k0qdjh44.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr7pz728qp71k0qdjh44.png" alt=" " width="799" height="429"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the Katana command and representative URLs returned by the crawl.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The crawl produced &lt;strong&gt;1,330 unique URLs&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;&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; playtika_katana.txt | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1330
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6y2s1nmuiovq8pfwompa.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6y2s1nmuiovq8pfwompa.png" alt=" " width="800" height="104"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the deduplication/count command and the &lt;code&gt;1330&lt;/code&gt; result.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I also filtered the collected URLs for JavaScript resources:&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;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; playtika_katana.txt | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Fi&lt;/span&gt; &lt;span class="s1"&gt;'\.js'&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results included JavaScript from &lt;code&gt;contactus.playtika.com&lt;/code&gt;, &lt;code&gt;news.playtika.com&lt;/code&gt;, Cloudflare Rocket Loader, OneTrust, jQuery, Bootstrap, Slick, and other application resources. JavaScript files can reveal route names and integration points, but they should be treated as clues for authorized review—not as an invitation to probe unrelated services.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8ysyjwplfg97uv0r4q0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8ysyjwplfg97uv0r4q0.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the filtered list of &lt;code&gt;.js&lt;/code&gt; resources, including application-hosted and third-party scripts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The most notable application paths were under &lt;code&gt;contactus.playtika.com&lt;/code&gt;, including login, SSO, password-reset, and other &lt;code&gt;.do&lt;/code&gt; routes. The later summary identified examples such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/contact
/amb_login.do
/login_locate_sso.do
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These routes were considered interesting because authentication and account-recovery workflows are security-sensitive, not because their names alone demonstrate a flaw.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Build an AI-assisted wordlist from observed terms
&lt;/h3&gt;

&lt;p&gt;I extracted terms from the discovered subdomains by removing the base domain, splitting on dots and hyphens, and sorting unique values:&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;cat &lt;/span&gt;playtika_subdomains.txt &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/\.playtika\.com//g'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'.-'&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; playtika_terms.txt

&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; playtika_terms.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The initial file contained &lt;strong&gt;297 terms&lt;/strong&gt;. I then filtered it to clean alphabetic/underscore-style entries:&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'^[a-zA-Z][a-zA-Z0-9_]*$'&lt;/span&gt; playtika_terms.txt &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; playtika_clean_terms.txt

&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; playtika_clean_terms.txt
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt; playtika_clean_terms.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cleaned file contained &lt;strong&gt;290 terms&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhc1hsjlvini8bf5i5ix.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhc1hsjlvini8bf5i5ix.png" alt=" " width="799" height="276"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the commands producing &lt;code&gt;playtika_terms.txt&lt;/code&gt;, the count of 297, and representative extracted terms.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbhlefst16eyv9teoy2y7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbhlefst16eyv9teoy2y7.png" alt=" " width="799" height="434"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Caption: Capture the filtering command, the count of 290 cleaned terms, and the beginning of the cleaned list.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The prompt used for organization was intentionally restrictive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are assisting with authorized bug-bounty reconnaissance for an in-scope wildcard target: *.playtika.com.

Below is a list of terms extracted from discovered subdomains:
[insert the contents of playtika_clean_terms.txt]

Create a clean, categorized reconnaissance wordlist using only terms supported by the provided data.

Categories:
1. API/authentication
2. Administrative/management
3. Development/staging
4. Web/content
5. Cloud/infrastructure
6. Game/application-specific
7. General useful terms

Remove obvious noise, duplicates, and meaningless fragments.
Do not invent organization-specific terms that are not supported by the input.
Return only the categorized wordlist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful categorized entries included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API/authentication:&lt;/strong&gt; &lt;code&gt;account&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;capi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Administrative/management:&lt;/strong&gt; &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;analystday&lt;/code&gt;, &lt;code&gt;award&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;automation&lt;/code&gt;, &lt;code&gt;achievements&lt;/code&gt;, &lt;code&gt;challenges&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development/staging:&lt;/strong&gt; &lt;code&gt;alpha&lt;/code&gt;, &lt;code&gt;beta&lt;/code&gt;, &lt;code&gt;builds&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;, &lt;code&gt;ce&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web/content:&lt;/strong&gt; &lt;code&gt;blog&lt;/code&gt;, &lt;code&gt;assets&lt;/code&gt;, &lt;code&gt;cdn&lt;/code&gt;, &lt;code&gt;chat&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud/infrastructure:&lt;/strong&gt; &lt;code&gt;aws&lt;/code&gt;, &lt;code&gt;accelerator&lt;/code&gt;, &lt;code&gt;ams&lt;/code&gt;, &lt;code&gt;autoconfig&lt;/code&gt;, &lt;code&gt;autodiscover&lt;/code&gt;, &lt;code&gt;cert&lt;/code&gt;, &lt;code&gt;analytics&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game/application-specific:&lt;/strong&gt; &lt;code&gt;bestfiends&lt;/code&gt;, &lt;code&gt;bingo&lt;/code&gt;, &lt;code&gt;bingoblitz&lt;/code&gt;, &lt;code&gt;blitz&lt;/code&gt;, &lt;code&gt;bonus&lt;/code&gt;, &lt;code&gt;card&lt;/code&gt;, &lt;code&gt;caesarsgames&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General:&lt;/strong&gt; &lt;code&gt;app&lt;/code&gt;, &lt;code&gt;android&lt;/code&gt;, &lt;code&gt;ads&lt;/code&gt;, &lt;code&gt;bot&lt;/code&gt;, &lt;code&gt;addub&lt;/code&gt;, &lt;code&gt;cc&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI did not discover a new subdomain or endpoint solely from this wordlist. Its practical value was organization and prioritization of evidence already collected.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Prioritize the attack surface without exploiting it
&lt;/h3&gt;

&lt;p&gt;Combining host names, live status, technology clues, and crawled routes produced a practical priority list.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Asset&lt;/th&gt;
&lt;th&gt;Why it stood out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;contactus.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Authentication, SSO, password-reset, and &lt;code&gt;.do&lt;/code&gt; routes were observed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clearly identified API endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prod-api-epayments.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Explicitly payment-related production API hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;preprod.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pre-production environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;events.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live application with identifiable HubSpot and Cloudflare technology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;www.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main web application with detailed technology fingerprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;shop.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live commercial web application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;news.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live content application with several JavaScript technologies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;one-prod.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Production-related service hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;octopus.playtika.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live application identified as Octopus Ad Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Manual review broadly agreed with this AI-assisted prioritization. The strongest recurring signals were authentication, APIs, payment-related naming, production/pre-production separation, and the size of the URL corpus.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;Readers reproducing this workflow should use a target they own or a program that explicitly permits the activity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the target, wildcard rules, exclusions, rate limits, and reporting requirements.&lt;/li&gt;
&lt;li&gt;Install the exact tool versions available in your environment: Subfinder, httpx-toolkit, FFUF, Katana, and SecLists.&lt;/li&gt;
&lt;li&gt;Run Subfinder and verify that the output file contains one hostname per line.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;sort -u&lt;/code&gt; and &lt;code&gt;wc -l&lt;/code&gt; to reproduce the deduplicated subdomain count.&lt;/li&gt;
&lt;li&gt;Probe only in-scope hosts with httpx-toolkit and save the live list.&lt;/li&gt;
&lt;li&gt;Compare &lt;code&gt;playtika_tech.txt&lt;/code&gt; with the recorded status codes, titles, and technology indicators.&lt;/li&gt;
&lt;li&gt;Run FFUF conservatively, keep the thread count and matchers documented, and inspect the JSON output rather than assuming every redirect is a real directory.&lt;/li&gt;
&lt;li&gt;Request &lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt; directly and compare the listed paths.&lt;/li&gt;
&lt;li&gt;Crawl the authorized main host with Katana, then run &lt;code&gt;sort -u ... | wc -l&lt;/code&gt; to verify the URL count.&lt;/li&gt;
&lt;li&gt;Extract terms only from observed hostnames, apply strict cleaning, and ensure the AI prompt forbids invented entries.&lt;/li&gt;
&lt;li&gt;Review the final inventory manually. A priority label is a hypothesis for further authorized review, not proof of a vulnerability.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;I learned that reconnaissance is most useful when it is treated as a chain of evidence rather than a collection of disconnected tool outputs. Subfinder showed the breadth of the namespace, httpx-toolkit separated names from reachable web services, and Katana connected those services to real application paths and JavaScript resources.&lt;/p&gt;

&lt;p&gt;The sitemap was also a good reminder that straightforward sources can be more valuable than aggressive guessing. FFUF did not add matching directories in this work, while &lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt; exposed meaningful content paths.&lt;/p&gt;

&lt;p&gt;The AI step was helpful, but not magical. It organized observed terms and highlighted sensible categories; it did not produce a new asset. I also came away with a stronger appreciation for scope checking and documentation. A host that looks interesting is still out of bounds if the program does not include it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Happens&lt;/th&gt;
&lt;th&gt;How to Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Treating every discovered hostname as authorized&lt;/td&gt;
&lt;td&gt;Enumeration reveals names outside the actual program boundary&lt;/td&gt;
&lt;td&gt;Check every asset against the published scope before probing it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Counting duplicate subdomains or URLs&lt;/td&gt;
&lt;td&gt;Multiple sources and crawl paths produce repeated entries&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;sort -u&lt;/code&gt; before counting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assuming a live host is a vulnerability&lt;/td&gt;
&lt;td&gt;A &lt;code&gt;200&lt;/code&gt;, &lt;code&gt;301&lt;/code&gt;, or identifiable technology only proves reachability or exposure&lt;/td&gt;
&lt;td&gt;Record it as an observation and perform only permitted follow-up checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interpreting version disclosure as an exploit&lt;/td&gt;
&lt;td&gt;Version strings feel more conclusive than they are&lt;/td&gt;
&lt;td&gt;Validate context and avoid exploit attempts unless explicitly authorized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over-trusting FFUF results&lt;/td&gt;
&lt;td&gt;Wordlists, filters, redirects, and wildcard responses can distort output&lt;/td&gt;
&lt;td&gt;Compare status, size, title, and baseline responses; review JSON results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring &lt;code&gt;robots.txt&lt;/code&gt; and sitemaps&lt;/td&gt;
&lt;td&gt;They look too ordinary to be security-relevant&lt;/td&gt;
&lt;td&gt;Read them early as low-impact sources of application paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using AI to invent names&lt;/td&gt;
&lt;td&gt;A model may fill gaps with plausible-looking terms&lt;/td&gt;
&lt;td&gt;Provide observed data only and require evidence-backed output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating login or password-reset paths as proof of weakness&lt;/td&gt;
&lt;td&gt;Sensitive functionality is interesting but not automatically insecure&lt;/td&gt;
&lt;td&gt;Document the route and stop at authorized, non-destructive verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running scans too aggressively&lt;/td&gt;
&lt;td&gt;High concurrency can affect availability and violate program rules&lt;/td&gt;
&lt;td&gt;Use conservative settings, respect rate limits, and monitor errors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A repeatable reconnaissance workflow can turn a broad wildcard into a structured inventory without crossing into exploitation. In this exploration, Subfinder identified 447 unique subdomains, httpx-toolkit found 95 live HTTP/HTTPS hosts, and Katana collected 1,330 unique URLs. Technology fingerprinting, sitemap review, and JavaScript filtering added context that raw hostnames could not provide.&lt;/p&gt;

&lt;p&gt;The most valuable outcome was not a single “magic” finding. It was the combined picture: which services exist, which ones respond, how they are built, where application paths are exposed, and which assets deserve careful authorized review. That is the foundation for responsible security testing.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>bugbounty</category>
      <category>reconnaissance</category>
      <category>ethicalhacking</category>
    </item>
    <item>
      <title>I Set Up a Fake Internet to Catch a Trojan: Analyzing FlexenseActivator.exe</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Tue, 25 Aug 2026 16:28:32 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/i-set-up-a-fake-internet-to-catch-a-trojan-analyzing-flexenseactivatorexe-1bj1</link>
      <guid>https://dev.to/almahmudkhalif/i-set-up-a-fake-internet-to-catch-a-trojan-analyzing-flexenseactivatorexe-1bj1</guid>
      <description>&lt;p&gt;There's a malware trick I'd read about but never witnessed firsthand: a trojan that checks whether it's connected to the real internet before doing anything malicious. If it detects a sandbox — no internet, wrong hardware, a debugger slowing it down — it goes quiet.&lt;/p&gt;

&lt;p&gt;So for a graduate malware analysis project, I decided to give it a real internet. A fake one.&lt;/p&gt;

&lt;p&gt;This is a walkthrough of how I analyzed &lt;strong&gt;FlexenseActivator.exe&lt;/strong&gt; — a trojan disguised as a software activation tool — inside a fully isolated two-VM lab. I'll explain what the malware does, how I caught it doing it, and what any of this means for defenders.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Safety note:&lt;/strong&gt; All analysis was conducted in isolated virtual machines with no internet access. A REMnux VM intercepted all network traffic. Nothing ran on a production system.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Sample
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File:    FlexenseActivator.exe
SHA-256: 18676ae2eaa48ac6037fa239d282acca0b6c7cd6c7d384abe6b5cd379f2c5e50
Family:  Trojan.Win32.Tiggre / Zpevdo
Packed:  UPX v0.89.6 (Delphi stub)
Score:   100/100 (Hybrid Analysis) | 33/76 AV vendors (VirusTotal)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file is distributed inside pirated RAR and ZIP archives for Flexense disk management software — SysGauge, Disk Pulse Pro, Disk Savvy. Users download what they think is a crack tool. VirusTotal shows &lt;strong&gt;151 tracked execution parent archives&lt;/strong&gt;, all pirated Flexense software bundles. The infection vector is straightforward: software piracy.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lab Setup
&lt;/h2&gt;

&lt;p&gt;Before touching the sample, I built an isolated environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────┐
│         Host Machine                │
│  ┌─────────────┐  ┌──────────────┐  │
│  │ Windows 10  │  │   REMnux     │  │
│  │ Analysis VM │←→│ Gateway VM   │  │
│  │  (AV off)   │  │ INetSim 1.3.2│  │
│  │             │  │ FakeDNS      │  │
│  └─────────────┘  └──────────────┘  │
│     192.168.56.20   192.168.56.10   │
│         Host-only network only      │
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;INetSim&lt;/strong&gt; simulates HTTP, HTTPS, and DNS services on the REMnux VM. &lt;strong&gt;FakeDNS&lt;/strong&gt; redirects every DNS query the Windows VM makes to INetSim. So when the malware asks "am I connected to the internet?" — INetSim answers yes.&lt;/p&gt;

&lt;p&gt;This matters because many modern trojans &lt;strong&gt;check for connectivity before acting&lt;/strong&gt;. On a disconnected analysis machine, they stay dormant. You see nothing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 1: Static Analysis — What Is This Thing?
&lt;/h2&gt;

&lt;p&gt;Before executing anything, I loaded the file into &lt;strong&gt;PEStudio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The first number that caught my attention: &lt;strong&gt;entropy 7.916&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Entropy measures byte randomness on a scale from 0 to 8. Normal executables land between 5 and 7. Packed or encrypted content pushes above 7.5. At 7.916, this binary is almost maximally random — direct evidence of a packer.&lt;/p&gt;

&lt;p&gt;PEStudio confirmed: &lt;strong&gt;UPX v0.89.6&lt;/strong&gt; (Delphi stub). The actual malicious code is compressed inside and only appears in memory at runtime.&lt;/p&gt;

&lt;p&gt;The PE sections told the same story:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;Raw Size&lt;/th&gt;
&lt;th&gt;Entropy&lt;/th&gt;
&lt;th&gt;What It Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UPX0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Empty placeholder — payload unpacks here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UPX1&lt;/td&gt;
&lt;td&gt;328,704 bytes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.93&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compressed actual payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.rsrc&lt;/td&gt;
&lt;td&gt;95,744 bytes&lt;/td&gt;
&lt;td&gt;7.71&lt;/td&gt;
&lt;td&gt;Resources (unusually high entropy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;UPX0 has zero raw size but 790KB virtual size. That's the decompression target — empty on disk, filled at runtime.&lt;/p&gt;

&lt;p&gt;One more detail: the binary's &lt;strong&gt;compiler timestamp is 2019&lt;/strong&gt;, but the &lt;strong&gt;resource section timestamp is 2011&lt;/strong&gt;. The icons and cursors were borrowed from an older Delphi project. This is a common fingerprint — malware authors recycle legitimate application templates to make binaries look more credible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VirusTotal cross-check:&lt;/strong&gt; 33/76 vendors detected it. The 43 who missed it are exactly why packing works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2: Dynamic Analysis — Watching It Run
&lt;/h2&gt;

&lt;p&gt;With Process Hacker open, I launched the sample.&lt;/p&gt;

&lt;p&gt;It immediately appeared highlighted in &lt;strong&gt;pink&lt;/strong&gt; — Process Hacker's color for suspicious processes. Windows Security fired a threat notification even with Defender mostly disabled. The process lived for a few seconds, did its work, and terminated. It doesn't stay resident. It sets things up and leaves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process Monitor&lt;/strong&gt; captured everything during that window. Within the first second: 6 threads created simultaneously. UPX-packed malware often launches parallel threads — one to decompress, one to inject, one to handle network.&lt;/p&gt;

&lt;h3&gt;
  
  
  The GoogleUpdater Disguise
&lt;/h3&gt;

&lt;p&gt;The most sophisticated behavior: the malware &lt;strong&gt;drops a complete fake GoogleUpdater installation&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Program Files (x86)\Google\GoogleUpdater\136.0.7079.0\
    ├── updater.exe
    ├── Crashpad\
    │   └── attachments\
    └── uninstall.cmd

C:\Program Files (x86)\Google\GoogleUpdater\137.0.7129.0\
    └── (same structure)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two versions — 136 and 137 — dropped simultaneously. This is a persistence mechanism designed to survive removal attempts. If you delete one version, the other reinstates it.&lt;/p&gt;

&lt;p&gt;Legitimate Google Update has one version directory. Multiple numbered &lt;code&gt;Google1184&lt;/code&gt;, &lt;code&gt;Google2872&lt;/code&gt;, &lt;code&gt;Google2972&lt;/code&gt; directories in Program Files are a strong indicator of compromise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Process Injection × 5
&lt;/h3&gt;

&lt;p&gt;The malware then injected its code into &lt;strong&gt;five separate GoogleUpdater processes&lt;/strong&gt; — each launched with &lt;code&gt;--update --system --enable-logging&lt;/code&gt; flags that mimic the real Google Update service signature.&lt;/p&gt;

&lt;p&gt;It also injected into &lt;code&gt;WMIADAP.EXE&lt;/code&gt; (WMI Activity Performance Data).&lt;/p&gt;

&lt;p&gt;After injection: the malware terminated all the injected processes, plus &lt;code&gt;svchost&lt;/code&gt; (WerSvcGroup) and &lt;code&gt;wmiadap&lt;/code&gt;. It cleaned up its injection targets. Its code was already running inside Windows processes — it no longer needed the hosts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 3: Catching the Fake Internet Call
&lt;/h2&gt;

&lt;p&gt;This is where INetSim paid off.&lt;/p&gt;

&lt;p&gt;Once the malware confirmed it was in a (seemingly) live environment, it made an HTTP GET request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/ncsi.txt&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.msftncsi.com&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Microsoft NCSI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NCSI&lt;/strong&gt; is Microsoft's Network Connectivity Status Indicator — the system Windows uses to show the internet icon in your taskbar. By querying this URL and getting a 200 OK response, the malware confirms internet access before proceeding with any C2 activity.&lt;/p&gt;

&lt;p&gt;INetSim's log:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[http_80_tcp] recv: GET /ncsi.txt HTTP/1.1
[http_80_tcp] info: Sending fake file configured for extension 'txt'
[http_80_tcp] send: HTTP/1.1 200 OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FakeDNS showed the full domain redirect chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fakedns[INFO]: update.googleapis.com  -&amp;gt; 192.168.56.10
fakedns[INFO]: ctldl.windowsupdate.com -&amp;gt; 192.168.56.10
fakedns[INFO]: www.msftncsi.com       -&amp;gt; 192.168.56.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wireshark then captured TCP/443 connections to Microsoft CDN IPs — the malware was doing &lt;strong&gt;SSL certificate chain verification&lt;/strong&gt; before attempting any real C2 communication. It checks the TLS infrastructure is legitimate before exposing itself.&lt;/p&gt;

&lt;p&gt;In a real analysis sandbox without INetSim, all of this either fails silently or never triggers. The malware would appear to do nothing malicious.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 4: A Look Inside with IDA Pro
&lt;/h2&gt;

&lt;p&gt;The final step: loading the binary into IDA Pro to see the UPX decompressor stub's assembly.&lt;/p&gt;

&lt;p&gt;The entry point at &lt;code&gt;0x512130&lt;/code&gt; matched what both PEStudio and Hybrid Analysis reported — consistent across all tools, which is a good sign your analysis is clean.&lt;/p&gt;

&lt;p&gt;The opening instructions are textbook UPX 3.x:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;start:&lt;/span&gt;
    &lt;span class="nf"&gt;pusha&lt;/span&gt;                               &lt;span class="c1"&gt;; save all registers&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;  &lt;span class="nb"&gt;esi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;offset&lt;/span&gt; &lt;span class="kt"&gt;dword&lt;/span&gt;&lt;span class="nv"&gt;_4C2EE0&lt;/span&gt;       &lt;span class="c1"&gt;; point to compressed data&lt;/span&gt;
    &lt;span class="nf"&gt;lea&lt;/span&gt;  &lt;span class="nb"&gt;edi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;esi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mh"&gt;0xC1EEE&lt;/span&gt;&lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="c1"&gt;; destination: UPX0 section&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;  &lt;span class="kt"&gt;dword&lt;/span&gt; &lt;span class="nv"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;edi&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mh"&gt;0xD09F4&lt;/span&gt;&lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mh"&gt;592F7785h&lt;/span&gt;  &lt;span class="c1"&gt;; write decompression seed&lt;/span&gt;
    &lt;span class="nf"&gt;push&lt;/span&gt; &lt;span class="nb"&gt;edi&lt;/span&gt;
    &lt;span class="nf"&gt;xor&lt;/span&gt;  &lt;span class="nb"&gt;ebp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0FFFFFFFFh&lt;/span&gt;               &lt;span class="c1"&gt;; init CRC counter&lt;/span&gt;
    &lt;span class="nf"&gt;jmp&lt;/span&gt;  &lt;span class="nv"&gt;loc_51215A&lt;/span&gt;                     &lt;span class="c1"&gt;; enter decompression loop&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A full reverse engineering of the unpacked payload is the next step — that requires letting the process reach its OEP (Original Entry Point) in a debugger, then dumping memory. That's for the next analysis round.&lt;/p&gt;




&lt;h2&gt;
  
  
  MITRE ATT&amp;amp;CK Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;What I Observed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;T1204&lt;/td&gt;
&lt;td&gt;User ran the file directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;T1543/T1547&lt;/td&gt;
&lt;td&gt;Fake GoogleUpdater installation + autostart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privilege Escalation&lt;/td&gt;
&lt;td&gt;T1055&lt;/td&gt;
&lt;td&gt;Process injection into GoogleUpdater × 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defense Evasion&lt;/td&gt;
&lt;td&gt;T1027&lt;/td&gt;
&lt;td&gt;UPX packing + XOR-encoded config strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defense Evasion&lt;/td&gt;
&lt;td&gt;T1497&lt;/td&gt;
&lt;td&gt;RDTSC timing check — anti-debugger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;T1082/T1057&lt;/td&gt;
&lt;td&gt;System info + process enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;td&gt;T1071&lt;/td&gt;
&lt;td&gt;HTTPS to Microsoft CDN for cert verification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Defenders Should Watch For
&lt;/h2&gt;

&lt;p&gt;If you run a SOC or manage endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple GoogleUpdater version directories&lt;/strong&gt; in &lt;code&gt;Program Files (x86)\Google\&lt;/code&gt; — legitimate installs have one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GoogleUpdater processes&lt;/strong&gt; launched with unusual session IDs or &lt;code&gt;--enable-logging&lt;/code&gt; on non-Google machines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NCSI queries repeated at intervals&lt;/strong&gt; — legitimate Windows checks this occasionally; malware polls it repeatedly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsigned executables in %TEMP%&lt;/strong&gt; re-executing themselves&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entropy &amp;gt; 7.5&lt;/strong&gt; in scanned files — flag for manual review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SHA-256 hash is your most reliable IOC: &lt;code&gt;18676ae2eaa48ac6037fa239d282acca0b6c7cd6c7d384abe6b5cd379f2c5e50&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Setting up INetSim and FakeDNS taught me something I couldn't learn from just reading: &lt;strong&gt;malware is network-aware by design&lt;/strong&gt;. Modern trojans don't just run — they check their environment, verify connectivity, validate TLS infrastructure, and only then proceed. A naïve sandbox catches none of this.&lt;/p&gt;

&lt;p&gt;The NCSI check was the most elegant evasion technique I encountered. It's not suspicious on its own — Windows does it constantly. But watching a trojan use it as a readiness gate was a clear demonstration of how blending into normal system behavior is itself a form of defense evasion.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Technical Report + IOCs
&lt;/h2&gt;

&lt;p&gt;Complete report with PEStudio output, Wireshark captures, IDA Pro screenshots, full IOC list, and ATT&amp;amp;CK mapping:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/MalwareAnalysisLabs/malware-analysis-writeups" rel="noopener noreferrer"&gt;https://github.com/MalwareAnalysisLabs/malware-analysis-writeups&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Unpack the binary dynamically in x32dbg, dump memory at OEP&lt;/li&gt;
&lt;li&gt;Reverse engineer the unpacked payload's main function&lt;/li&gt;
&lt;li&gt;Attempt to decode the XOR-obfuscated config strings (&lt;code&gt;2,/+0&amp;amp;7!4-)1#&lt;/code&gt; etc.)&lt;/li&gt;
&lt;li&gt;Compare Tiggre family behavior across different campaign variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What tools or techniques have you used for packed binary analysis?&lt;/strong&gt; Drop a comment — I'm particularly curious about approaches to Delphi-compiled malware.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>How I Analyzed NanoLocker Ransomware: A Beginner's Guide to Static &amp; Dynamic Analysis</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Tue, 25 Aug 2026 15:26:27 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/how-i-analyzed-nanolocker-ransomware-a-beginners-guide-to-static-dynamic-analysis-33fo</link>
      <guid>https://dev.to/almahmudkhalif/how-i-analyzed-nanolocker-ransomware-a-beginners-guide-to-static-dynamic-analysis-33fo</guid>
      <description>&lt;p&gt;When I started my graduate program in Computer &amp;amp; Information Science, "malware analysis" sounded intimidating — reverse engineers with years of experience, arcane assembly code, and tools I'd never heard of.&lt;/p&gt;

&lt;p&gt;Then I actually sat down and did it.&lt;/p&gt;

&lt;p&gt;This post walks through how I analyzed &lt;strong&gt;NanoLocker ransomware&lt;/strong&gt; (&lt;code&gt;lansrv.exe&lt;/code&gt;) — a real, actively-detected malware sample — using publicly available tools. If you're a beginner trying to understand how malware analysis works in practice, this is for you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Disclaimer:&lt;/strong&gt; This analysis was conducted in a controlled, isolated environment for educational purposes only. Never execute malware on a production machine.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Is NanoLocker?
&lt;/h2&gt;

&lt;p&gt;NanoLocker is a &lt;strong&gt;file-encrypting ransomware trojan&lt;/strong&gt; from the &lt;code&gt;nanolocker/rents/dynamer&lt;/code&gt; family. Despite being compiled in 2016, it was still being submitted to VirusTotal as recently as February 2026. That alone tells you something important: good evasion code has a long shelf life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The sample I analyzed:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File Name : lansrv.exe (also NanoLocker.exe)
SHA-256   : 462e30eb9cf267315e5f39e4fec4cfff78b34a5f6ebf61bad06cdfd9cbe0a06a
File Size : 196.50 KB
Detected  : 59/71 AV engines (83.1%) on VirusTotal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The name &lt;code&gt;lansrv.exe&lt;/code&gt; is intentional — it's designed to look like a LAN server service process. This is &lt;strong&gt;masquerading&lt;/strong&gt; (MITRE T1036), and it's one of the first things to notice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Static Analysis — What's Inside the File?
&lt;/h2&gt;

&lt;p&gt;Static analysis means examining the file &lt;em&gt;without running it&lt;/em&gt;. I focused on three areas:&lt;/p&gt;

&lt;h3&gt;
  
  
  PE Section Entropy
&lt;/h3&gt;

&lt;p&gt;Every Windows executable has sections. I checked entropy (randomness) values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;Entropy&lt;/th&gt;
&lt;th&gt;What It Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.text&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6.38&lt;/td&gt;
&lt;td&gt;Normal — main code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.rdata&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.79&lt;/td&gt;
&lt;td&gt;Normal — read-only data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6.40&lt;/td&gt;
&lt;td&gt;Normal — variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.rsrc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.82&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;178 KB&lt;/strong&gt; — embedded payload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;.rsrc&lt;/code&gt; section at 178KB was the red flag. That's not normal for a 196KB executable. This section stores the embedded ransomware resources that get dropped on execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imported DLLs
&lt;/h3&gt;

&lt;p&gt;What DLLs a file imports tells you a lot about its capabilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DLL&lt;/th&gt;
&lt;th&gt;Why Malicious?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crypt32.dll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encryption — generating ransom keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ws2_32.dll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Networking — C2 communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;advapi32.dll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registry — persistence setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iphlpapi.dll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Network adapter enumeration — sandbox detection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seeing &lt;code&gt;crypt32.dll&lt;/code&gt; + &lt;code&gt;ws2_32.dll&lt;/code&gt; together in ransomware is a classic pattern: encrypt files locally, send the key to attacker's server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strings Extraction
&lt;/h3&gt;

&lt;p&gt;From 334 total strings, some stood out immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;%&lt;span class="n"&gt;LOCALAPPDATA&lt;/span&gt;%\&lt;span class="n"&gt;lansrv&lt;/span&gt;.&lt;span class="n"&gt;exe&lt;/span&gt;     → &lt;span class="n"&gt;Persistence&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
%&lt;span class="n"&gt;LOCALAPPDATA&lt;/span&gt;%\&lt;span class="n"&gt;lansrv&lt;/span&gt;.&lt;span class="n"&gt;ini&lt;/span&gt;     → &lt;span class="n"&gt;Encrypted&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; (&lt;span class="m"&gt;87&lt;/span&gt;&lt;span class="n"&gt;KB&lt;/span&gt;)
&lt;span class="m"&gt;52&lt;/span&gt;.&lt;span class="m"&gt;91&lt;/span&gt;.&lt;span class="m"&gt;55&lt;/span&gt;.&lt;span class="m"&gt;122&lt;/span&gt;                  → &lt;span class="n"&gt;Hardcoded&lt;/span&gt; &lt;span class="n"&gt;C2&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;
&lt;span class="n"&gt;C&lt;/span&gt;:\&lt;span class="n"&gt;ransomware3&lt;/span&gt;.&lt;span class="n"&gt;exe&lt;/span&gt;            → &lt;span class="n"&gt;Self&lt;/span&gt;-&lt;span class="n"&gt;reference&lt;/span&gt; (&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;dropper&lt;/span&gt;)
&lt;span class="n"&gt;CoCreateInstance&lt;/span&gt;              → &lt;span class="n"&gt;COM&lt;/span&gt; &lt;span class="n"&gt;persistence&lt;/span&gt; &lt;span class="n"&gt;evasion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hardcoded C2 IPs in strings are a gift for defenders — block &lt;code&gt;52.91.55.122&lt;/code&gt; at the firewall and you've cut off one communication channel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Dynamic Analysis — What Does It Actually Do?
&lt;/h2&gt;

&lt;p&gt;Dynamic analysis means watching the malware execute in a sandbox. I used VirusTotal's dynamic analysis, Joe Sandbox, and Hybrid Analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Happened When It Ran
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Environment Check First&lt;/strong&gt;&lt;br&gt;
Before doing anything malicious, NanoLocker checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU name (is this a VM?)&lt;/li&gt;
&lt;li&gt;CPU clock timing (is execution being accelerated in a sandbox?)&lt;/li&gt;
&lt;li&gt;Executes long sleep periods to outlast sandbox timeouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why many samples show "clean" in quick sandbox scans — they just... wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Persistence Setup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copies itself → %USERPROFILE%\AppData\Local\lansrv.exe
Config file   → %LOCALAPPDATA%\lansrv.ini (87KB encrypted)
Registry      → Boot/Logon Autostart (T1547)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every reboot, it comes back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Process Injection&lt;/strong&gt;&lt;br&gt;
NanoLocker injects into &lt;code&gt;wuapihost.exe&lt;/code&gt; — a legitimate Windows Update process. This hides its activity inside a trusted process, making it harder to detect in task manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. File Discovery &amp;amp; Encryption&lt;/strong&gt;&lt;br&gt;
Using &lt;code&gt;shell32.dll&lt;/code&gt;, it enumerates user directories looking for documents, images, and personal files. It encrypts them and sends the decryption key to &lt;code&gt;52.91.55.122&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Network Communication&lt;/strong&gt;&lt;br&gt;
Six IPs contacted during execution:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;52.91.55.122&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ICMP&lt;/td&gt;
&lt;td&gt;Primary C2 — key exfiltration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;192.229.211.108&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;Unencrypted payload download&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;20.99.184.37/246&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Encrypted C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;23.216.147.64/76&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;Encrypted C2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 3: MITRE ATT&amp;amp;CK Mapping
&lt;/h2&gt;

&lt;p&gt;Mapping behavior to MITRE ATT&amp;amp;CK transforms your analysis from "here's what it does" to "here's how it fits into known attacker patterns." This is what SOC teams and threat intel analysts actually use.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;T1204&lt;/td&gt;
&lt;td&gt;User runs the file directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;T1547&lt;/td&gt;
&lt;td&gt;Boot/Logon Autostart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priv. Escalation&lt;/td&gt;
&lt;td&gt;T1055&lt;/td&gt;
&lt;td&gt;Process injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defense Evasion&lt;/td&gt;
&lt;td&gt;T1027&lt;/td&gt;
&lt;td&gt;Obfuscated config strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Defense Evasion&lt;/td&gt;
&lt;td&gt;T1036&lt;/td&gt;
&lt;td&gt;Masquerades as LAN service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;T1082&lt;/td&gt;
&lt;td&gt;CPU/environment fingerprinting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;td&gt;T1071&lt;/td&gt;
&lt;td&gt;HTTPS over port 443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact&lt;/td&gt;
&lt;td&gt;T1486&lt;/td&gt;
&lt;td&gt;Data Encrypted for Impact&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;A few things genuinely surprised me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 10-year-old malware is still relevant.&lt;/strong&gt; NanoLocker uses evasion techniques that are still effective in 2026 — sleep-based sandbox evasion, process injection into trusted processes, COM+ manipulation. Understanding "old" malware teaches you fundamentals that still apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The name is part of the attack.&lt;/strong&gt; &lt;code&gt;lansrv.exe&lt;/code&gt; is designed to look like infrastructure software. If you saw it in Task Manager, would you think twice? Social engineering isn't just phishing emails — it's also how malware names itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Hardcoded IOCs are gold for defenders.&lt;/strong&gt; The moment I saw &lt;code&gt;52.91.55.122&lt;/code&gt; in the strings, that IP becomes a firewall rule. Simple static analysis produces actionable defensive intelligence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. MITRE ATT&amp;amp;CK bridges analysis and defense.&lt;/strong&gt; Before this, ATT&amp;amp;CK felt abstract. After mapping NanoLocker's behaviors, I understand why it exists — it gives analysts and defenders a shared language.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tools I Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;VirusTotal — Multi-AV scanning + behavioral analysis&lt;/li&gt;
&lt;li&gt;Hybrid Analysis — Sandbox execution&lt;/li&gt;
&lt;li&gt;PE analysis tools — Section/entropy inspection&lt;/li&gt;
&lt;li&gt;MITRE ATT&amp;amp;CK Navigator — Framework mapping&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Full Technical Report + IOCs
&lt;/h2&gt;

&lt;p&gt;If you want the full analysis with all IOCs, PE section details, and complete ATT&amp;amp;CK mapping, I've documented everything on GitHub:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/MalwareAnalysisLabs/malware-analysis-writeups" rel="noopener noreferrer"&gt;https://github.com/MalwareAnalysisLabs/malware-analysis-writeups&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository includes the full PDF report, IOC lists in markdown format, and ATT&amp;amp;CK mapping table — ready to use for reference or learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This was my first structured malware analysis. Next, I want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run samples through Ghidra for actual disassembly&lt;/li&gt;
&lt;li&gt;Try deobfuscating that &lt;code&gt;C:!@I~wF:&lt;/code&gt; encoded config string&lt;/li&gt;
&lt;li&gt;Compare NanoLocker's encryption implementation to other ransomware families&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're also learning malware analysis, what tools or resources have helped you most? Drop a comment — I'm always looking for what to learn next.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Sysmon vs. auditd on Linux: What a Sandworm-Style Attack Actually Reveals</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Mon, 24 Aug 2026 19:22:04 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/sysmon-vs-auditd-on-linux-what-a-sandworm-style-attack-actually-reveals-2oki</link>
      <guid>https://dev.to/almahmudkhalif/sysmon-vs-auditd-on-linux-what-a-sandworm-style-attack-actually-reveals-2oki</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This article is a technical review and analysis of the following paper for my Computer System Security (CSS) course at PIEAS:&lt;br&gt;
&lt;em&gt;Joshua Keller, "Enhancing Linux Threat Detection: A Sysmon-Based Approach to Identifying Sandworm TTPs," SANS Institute, January 2026.&lt;/em&gt;&lt;br&gt;
All experimental results, lab data, and findings referenced here belong to the paper's author. My contribution is the analysis, summary, and commentary.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why This Paper Caught My Attention
&lt;/h2&gt;

&lt;p&gt;Linux runs a lot of critical infrastructure — 78.3% of internet-facing web servers, and critical workloads for 72.6% of Fortune 500 companies. And attackers have noticed: Kaspersky reported a 130% year-over-year increase in Linux exploit attacks in Q1 2024 alone.&lt;/p&gt;

&lt;p&gt;Yet most of the tooling, research, and community knowledge around endpoint detection still skews heavily toward Windows. Sysmon for Linux has existed since 2021, but there has been very little published research on how it actually performs against real APT-style activity.&lt;/p&gt;

&lt;p&gt;This SANS paper by Joshua Keller addresses that gap directly — and the results are worth understanding if you work in, or are studying, Linux security.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Paper Does
&lt;/h2&gt;

&lt;p&gt;The author ran a controlled, reproducible experiment: set up identical Ubuntu 24.04 servers, run the same 16-step Sandworm-style attack against each one, and then count what each logging configuration actually caught.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three configurations were tested:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Ruleset&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sysmon for Linux v1.4.0&lt;/td&gt;
&lt;td&gt;Generic broad config&lt;/td&gt;
&lt;td&gt;The "new" tool being evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;auditd v3.1.2&lt;/td&gt;
&lt;td&gt;DISA STIG (Ubuntu 24.04)&lt;/td&gt;
&lt;td&gt;Widely-used compliance baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;auditd v3.1.2&lt;/td&gt;
&lt;td&gt;Neo23x0 (community ruleset)&lt;/td&gt;
&lt;td&gt;Detection-focused alternative&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The attack was modelled on MITRE's ATT&amp;amp;CK evaluation for Sandworm — a well-documented APT group attributed to Russia's GRU, responsible for attacks including the three-year Centreon intrusion disclosed by France's ANSSI in 2021.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools used by the paper's author:&lt;/strong&gt; VMware Workstation Pro 17.6.2, MITRE Caldera (adversary emulation), Hydra (SSH brute-force), Elasticsearch + Kibana 8.14.3 for log analysis.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Attack Chain
&lt;/h2&gt;

&lt;p&gt;The simulated attack followed six broad stages across 16 steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Initial Access&lt;/strong&gt;&lt;br&gt;
SSH brute-force using Hydra against a weak credential (&lt;code&gt;fherbert:horses&lt;/code&gt;). This is the noisiest stage — all three tools detected it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Web Shell Deployment&lt;/strong&gt;&lt;br&gt;
Using the compromised credentials, a PHP web shell was uploaded to &lt;code&gt;/tmp/&lt;/code&gt; via SCP and then moved to the web root at &lt;code&gt;/var/www/html/&lt;/code&gt;. Suspicious, detectable — if your logging is configured for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Discovery&lt;/strong&gt;&lt;br&gt;
Via the web shell, the attacker ran &lt;code&gt;whoami&lt;/code&gt;, &lt;code&gt;uname -a&lt;/code&gt;, &lt;code&gt;ls -lsahR&lt;/code&gt;, and &lt;code&gt;cat /etc/passwd&lt;/code&gt; using &lt;code&gt;curl&lt;/code&gt;. These commands ran under the &lt;code&gt;www-data&lt;/code&gt; user — which is not normal and is a strong indicator of web shell activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Execution &amp;amp; Privilege Escalation&lt;/strong&gt;&lt;br&gt;
A Sandcat agent (Sandworm's golang-based implant) was downloaded from the Caldera C2 server on port 8888, given executable permissions, and run via a SUID binary named &lt;code&gt;/bin/backup&lt;/code&gt;. The outbound curl to a non-standard port is a detection opportunity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Persistence&lt;/strong&gt;&lt;br&gt;
Two persistence mechanisms were established:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A crontab entry to run the agent every hour and on reboot&lt;/li&gt;
&lt;li&gt;A fake systemd service file named &lt;code&gt;syslogd.service&lt;/code&gt; — deliberately named to blend in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Credential Access&lt;/strong&gt;&lt;br&gt;
With root access via the agent, the attacker read &lt;code&gt;/etc/shadow&lt;/code&gt; (all password hashes), &lt;code&gt;.bash_history&lt;/code&gt; (which contained credentials added during setup), and SSH private keys.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Each Tool Actually Saw
&lt;/h2&gt;

&lt;p&gt;This is the part of the paper that matters most.&lt;/p&gt;

&lt;h3&gt;
  
  
  After Initial Access — DISA STIG Goes Nearly Blind
&lt;/h3&gt;

&lt;p&gt;Once the attacker moved past the SSH brute-force, the DISA STIG auditd configuration generated almost no useful telemetry. It missed the web shell discovery commands, the agent download and execution, both persistence mechanisms, and the credential access stage entirely.&lt;/p&gt;

&lt;p&gt;This is striking because DISA STIG is a regulatory standard — it represents what many organizations actually deploy on production systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sysmon Caught Everything
&lt;/h3&gt;

&lt;p&gt;Sysmon logged relevant events at every stage. A few examples from the paper's data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web shell detection:&lt;/strong&gt; Sysmon Event ID 1 captured &lt;code&gt;mv /tmp/search.php /var/www/html/&lt;/code&gt; with the full command line, user (&lt;code&gt;fherbert&lt;/code&gt;), and process executable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovery stage:&lt;/strong&gt; Event ID 1 captured &lt;code&gt;sh -c -- whoami&lt;/code&gt; running under &lt;code&gt;www-data&lt;/code&gt; — a clear web shell indicator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; Event ID 11 logged the creation of the crontab temp file and the &lt;code&gt;syslogd.service&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential access:&lt;/strong&gt; &lt;code&gt;cat /etc/shadow&lt;/code&gt;, &lt;code&gt;cat .bash_history&lt;/code&gt;, &lt;code&gt;cat id_rsa&lt;/code&gt; — all captured with the user (&lt;code&gt;root&lt;/code&gt;) and full command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total logs during the attack window: &lt;strong&gt;996&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Neo23x0 Also Caught Everything — But Louder
&lt;/h3&gt;

&lt;p&gt;The community-maintained Neo23x0 auditd ruleset matched Sysmon's coverage across all stages. However, it generated &lt;strong&gt;2,624 log entries&lt;/strong&gt; — about 2.63× Sysmon's volume.&lt;/p&gt;

&lt;p&gt;There's also a usability difference: auditd often splits event context across multiple log entries (e.g., the username in a syscall log, the command arguments in a proctitle log), which requires correlation. Sysmon consolidates this into a single event.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Detection Comparison at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attack Stage&lt;/th&gt;
&lt;th&gt;Sysmon&lt;/th&gt;
&lt;th&gt;auditd (DISA STIG)&lt;/th&gt;
&lt;th&gt;auditd (Neo23x0)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initial Access (SSH)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Shell Deployment&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution / Agent Staging&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence (cron + systemd)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential Access&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Three Things Worth Taking Away
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Compliance ≠ Security&lt;/strong&gt;&lt;br&gt;
The DISA STIG is a serious, widely-applied standard. But it was built for regulatory coverage, not detection. This paper demonstrates with actual log data that passing a compliance checklist does not mean your system can detect a real intruder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Log-to-Noise Tradeoff Is Real&lt;/strong&gt;&lt;br&gt;
Sysmon's 996 logs vs. Neo23x0's 2,624 logs isn't just a number — it's analyst time, SIEM ingestion costs, and alert fatigue. Detection capability matters, but so does the signal-to-noise ratio of what you're sending to your SIEM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Sysmon Has a Genuine Advantage in Usability&lt;/strong&gt;&lt;br&gt;
For teams already familiar with Sysmon on Windows (and that number is growing, especially with Microsoft's announcement that native Sysmon functionality is coming to Windows in 2026), the Linux version offers a consistent rule syntax and consolidated event format. The barrier to adoption is lower than auditd for teams without deep Linux audit expertise.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Notable Limitation
&lt;/h2&gt;

&lt;p&gt;Sysmon does not capture SSH usernames via PAM. During the SSH brute-force stage, auditd's USER_AUTH and USER_LOGIN records included the targeted username (&lt;code&gt;fherbert&lt;/code&gt;) directly. Sysmon only saw the connection spike — to determine the affected user, you'd need to correlate with SSH application logs.&lt;/p&gt;

&lt;p&gt;This is a real gap for initial access investigation and worth knowing before deploying Sysmon as a sole detection layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Takeaway from Reviewing This Paper
&lt;/h2&gt;

&lt;p&gt;I reviewed this paper for my Computer System Security course at PIEAS, and wrote a structured summary report and class presentation based on it.&lt;/p&gt;

&lt;p&gt;The thing that stayed with me is how concrete the paper is. It doesn't argue theoretically that Sysmon is better than auditd — it runs the same attack against both and counts the logs. That methodology is simple and reproducible, and the results are clear.&lt;/p&gt;

&lt;p&gt;For anyone working toward a blue team or detection engineering role, this paper is a useful read. Not because Sysmon is a silver bullet, but because it illustrates how much detection capability is left on the table when logging is configured for compliance rather than for visibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;My summary report and class presentation slides: &lt;a href="https://github.com/Computer-System-Security/linux-threat-detection-sysmon-review/" rel="noopener noreferrer"&gt;https://github.com/Computer-System-Security/linux-threat-detection-sysmon-review/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Original SANS paper: Joshua Keller, SANS Institute Reading Room, January 2026&lt;/li&gt;
&lt;li&gt;MITRE ATT&amp;amp;CK Sandworm evaluation: &lt;a href="https://attackevals.github.io/ael/enterprise/sandworm/" rel="noopener noreferrer"&gt;https://attackevals.github.io/ael/enterprise/sandworm/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Neo23x0 auditd ruleset: &lt;a href="https://github.com/Neo23x0/auditd" rel="noopener noreferrer"&gt;https://github.com/Neo23x0/auditd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sysmon for Linux: &lt;a href="https://github.com/microsoft/SysmonForLinux" rel="noopener noreferrer"&gt;https://github.com/microsoft/SysmonForLinux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article is a review and analysis written as part of CSS coursework (MS in Cyber Security, PIEAS). All experimental findings referenced here are from the original SANS paper by Joshua Keller.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>security</category>
      <category>sysmon</category>
      <category>blueteam</category>
    </item>
    <item>
      <title>AI-Driven OSINT &amp; Active Recon: How Artificial Intelligence Is Changing Reconnaissance</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:28:10 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/ai-driven-osint-active-recon-how-artificial-intelligence-is-changing-reconnaissance-4e0i</link>
      <guid>https://dev.to/almahmudkhalif/ai-driven-osint-active-recon-how-artificial-intelligence-is-changing-reconnaissance-4e0i</guid>
      <description>&lt;p&gt;Reconnaissance has always been the first real step in any security assessment — long before anything else happens, someone has to figure out what's actually out there. Social footprints, website details, DNS records, media authenticity — all of it starts with information gathering.&lt;/p&gt;

&lt;p&gt;What's changed recently is how much artificial intelligence is now part of that process. I spent some time going through five core areas of AI-driven OSINT and active reconnaissance — social media, websites and geolocation, DNS and network recon, deepfake detection, and fully automated recon pipelines — and wanted to write up what I learned about how AI is changing the way this work gets done, along with where it still needs a human double-checking it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;AI is increasingly built into OSINT tooling, promising faster data collection and analysis across social media, websites, images, and network infrastructure. But faster isn't the same as accurate, and automated doesn't mean unsupervised. Understanding where AI genuinely helps in reconnaissance — and where its results still need human judgment — is the gap this post works through.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Social Media OSINT (SOCMINT)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SOCMINT&lt;/strong&gt; means collecting and studying information that people share publicly on social media — posts, comments, photos, and profile details. Analysts use it to understand a person, a group, or an ongoing situation without hacking anything, since the data is already public.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social media profiling&lt;/strong&gt; is building a picture of someone by putting together different pieces of their online activity — posts, followers, likes, location tags, and writing style. Over time, this can reveal habits, interests, and even daily routines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where AI helps:&lt;/strong&gt; AI can scan huge amounts of posts and comments much faster than a human, spot patterns across accounts, group similar topics together, and automatically pull out useful details like names, places, or dates. This saves a lot of manual reading and searching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-powered sentiment analysis&lt;/strong&gt; is when AI reads text and decides whether the tone is positive, negative, or neutral. On social media, it's used to see how people feel about a topic, brand, or event by looking at thousands of posts at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The risk:&lt;/strong&gt; AI can misread sarcasm, slang, or context and give a wrong conclusion about someone's intent or opinion. If that wrong result is trusted blindly, it can lead to unfair judgments about a real person.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Website OSINT &amp;amp; Geolocation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website OSINT&lt;/strong&gt; is gathering public information about a website — things like who registered the domain, what technology it runs on, its hosting server, and old versions of the site. All of this comes from open, legal sources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GEO Location OSINT&lt;/strong&gt; is the process of figuring out where a photo, video, or post was made by studying visible clues in it, such as street signs, buildings, mountains, or shadows, along with any location data attached to the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How metadata helps:&lt;/strong&gt; many photos secretly store metadata (EXIF data) like GPS coordinates, the camera model, and the exact time the photo was taken. If this data hasn't been removed, it can point almost directly to where the picture was taken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How AI assists:&lt;/strong&gt; AI can compare a photo against millions of images to find visual matches, recognize landmarks, read text in signs, and even guess a general region based on the landscape, buildings, or vegetation shown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The limitation:&lt;/strong&gt; AI can guess wrong when a place looks similar to many other locations around the world, or when the image has very few unique landmarks. The result is often a suggestion, not a guaranteed answer, and still needs human confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. DNS &amp;amp; Network Recon
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nslookup&lt;/strong&gt; is a command-line tool used to check the DNS records of a domain, mainly to find out which IP address a website name points to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dig&lt;/strong&gt; is a more detailed DNS lookup tool. It shows extra information such as mail server records, name servers, and response times, which makes it more useful for deeper DNS checks than Nslookup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS reconnaissance&lt;/strong&gt; means collecting information about a domain's DNS setup — its IP addresses, subdomains, and mail servers — to understand how a target's network is structured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS enumeration&lt;/strong&gt; is the process of finding as many subdomains, hostnames, and DNS records connected to a domain as possible, usually with automated tools that try common names or search public records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DNS information can reveal hidden parts of a network, like test servers or admin panels, which are not obvious from just visiting the main website. This helps build a full map of a target's online infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. AI Deepfake Detection
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;deepfake&lt;/strong&gt; is a fake image, video, or audio clip created by AI that makes it look or sound like a real person said or did something they never actually did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-powered deepfake detection&lt;/strong&gt; is the use of AI models to check whether a piece of media is real or artificially generated, by looking for small technical flaws left behind during the fake creation process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How AI identifies manipulation:&lt;/strong&gt; AI looks for tiny signs that are hard for humans to notice, such as unnatural blinking, odd lighting on the face, blurred edges around the face, or mismatched shadows and reflections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why manual verification matters:&lt;/strong&gt; deepfake detection tools can still make mistakes, especially with high-quality fakes or low-quality real videos. A human should always double-check the result before treating it as final proof, since a wrong call can seriously harm someone's reputation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Automated Recon Pipelines
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;automated reconnaissance pipeline&lt;/strong&gt; is a set of recon tools and steps linked together so that scanning, data gathering, and reporting happen automatically one after another, instead of an analyst running each tool by hand.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;AI recon agent&lt;/strong&gt; is a program that can plan and run reconnaissance steps on its own, deciding what to search or scan next based on what it finds, with little to no human input during the process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How AI agents automate OSINT workflows:&lt;/strong&gt; AI agents can trigger multiple tools in order, like running a DNS lookup, then searching social media, then checking a website, and automatically combine the results into one organized report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt; it saves a lot of time, covers more ground than manual work, reduces small human errors, and can run continuously to catch new information as soon as it appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risks:&lt;/strong&gt; automated tools can accidentally scan systems that were never approved, collect more data than needed, or produce inaccurate results that get trusted without a proper human review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why authorized targets only:&lt;/strong&gt; scanning or collecting data on a system without permission is illegal in most places, even if the tool is automated. Getting proper authorization first protects both the analyst and the organization from legal trouble.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compare &lt;code&gt;Nslookup&lt;/code&gt; and &lt;code&gt;Dig&lt;/code&gt; results for the same domain and confirm you can explain the extra fields &lt;code&gt;Dig&lt;/code&gt; returns&lt;/li&gt;
&lt;li&gt;Check whether a photo you took yourself still has its EXIF/GPS metadata intact&lt;/li&gt;
&lt;li&gt;Run a sentence with sarcasm through a sentiment analysis tool and see if it gets misclassified&lt;/li&gt;
&lt;li&gt;Confirm authorization/scope before treating any recon target — automated or manual — as fair game&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this helped me understand how deeply AI has become part of modern OSINT and reconnaissance work. AI tools make data collection and analysis much faster, but they are not perfect and can produce wrong results if used without human judgment. I also realized how important it is to only perform reconnaissance on authorized targets, since even automated tools can cross legal boundaries if used carelessly. Overall, this gave me a clearer picture of both the power and the responsibility that comes with using AI in cybersecurity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It's a Problem&lt;/th&gt;
&lt;th&gt;Better Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trusting AI sentiment analysis as fact&lt;/td&gt;
&lt;td&gt;Misses sarcasm, slang, and context&lt;/td&gt;
&lt;td&gt;Treat it as a signal, not a verdict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assuming an AI geolocation guess is confirmed&lt;/td&gt;
&lt;td&gt;Similar-looking places cause false confidence&lt;/td&gt;
&lt;td&gt;Cross-check against metadata and multiple visual clues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using only Nslookup for DNS recon&lt;/td&gt;
&lt;td&gt;Misses mail records, name servers, response details&lt;/td&gt;
&lt;td&gt;Use Dig alongside it for a fuller picture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating deepfake detection results as final proof&lt;/td&gt;
&lt;td&gt;Detection tools can still be wrong on tricky media&lt;/td&gt;
&lt;td&gt;Always have a human verify before acting on the result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running automated recon without checking authorization&lt;/td&gt;
&lt;td&gt;Can scan systems that were never approved&lt;/td&gt;
&lt;td&gt;Confirm authorization and scope before any automated scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letting an AI recon agent run fully unsupervised&lt;/td&gt;
&lt;td&gt;Can escalate scope or trust bad results without review&lt;/td&gt;
&lt;td&gt;Keep human review in the loop at each stage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;AI hasn't replaced the reconnaissance analyst — it's sped up the collection and first-pass analysis while making human judgment more important than ever. Whether it's reading sentiment, guessing a location, spotting a deepfake, or running an automated pipeline, the same pattern holds: let AI handle the scale, keep a human on the verification, and never skip authorization. That balance is what actually makes AI-assisted OSINT reliable.&lt;/p&gt;

</description>
      <category>osint</category>
      <category>ai</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Hidden in Plain Sight: Steganography, EXIF Geolocation, and AI-Powered Log Analysis</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Mon, 24 Aug 2026 15:00:19 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/hidden-in-plain-sight-steganography-exif-geolocation-and-ai-powered-log-analysis-4pc</link>
      <guid>https://dev.to/almahmudkhalif/hidden-in-plain-sight-steganography-exif-geolocation-and-ai-powered-log-analysis-4pc</guid>
      <description>&lt;p&gt;A few weeks back I went down a rabbit hole that started with one simple question: &lt;em&gt;how easy is it, really, to hide a secret inside an ordinary-looking JPEG — and how would a defender ever catch it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That question turned into a full weekend project covering two very different but connected corners of security work: &lt;strong&gt;steganography&lt;/strong&gt; (hiding and finding secrets inside media files) and &lt;strong&gt;log analysis&lt;/strong&gt; (finding the story hidden inside thousands of boring log lines). Along the way I leaned on AI tools to speed up both the detection and the analysis side, which turned out to be the most interesting part of the whole exercise.&lt;/p&gt;

&lt;p&gt;This post walks through everything I did — extracting a hidden message from an image, pulling GPS coordinates out of EXIF metadata, running an AI-assisted steganalysis scan, and finally using an AI assistant to triage 10,000 lines of Apache access logs for suspicious activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Two questions I wanted real, hands-on answers to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Can hidden data inside an image actually be detected and extracted reliably — and can AI meaningfully help with that detection?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When you're staring down a huge pile of raw system or web server logs, can AI actually speed up finding the anomalies, or is it just noise?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The best way to answer both was to just do it: hide/extract data myself, run it through an automated steganalysis pipeline, then separately dig through real authentication logs and a public Apache access log dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Extracting a hidden message with Steghide
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;steghide&lt;/code&gt; is a classic LSB (Least Significant Bit) steganography tool — it embeds a file inside an image or audio file by making tiny, visually imperceptible changes to pixel data. Extraction is just the reverse of that process.&lt;/p&gt;

&lt;p&gt;Given a suspicious image (&lt;code&gt;mons.jpg&lt;/code&gt;), extraction looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;steghide extract &lt;span class="nt"&gt;-sf&lt;/span&gt; /home/khalif/Desktop/mons.jpg
Enter passphrase:
the file &lt;span class="s2"&gt;"secret.txt"&lt;/span&gt; does already exist. overwrite ? &lt;span class="o"&gt;(&lt;/span&gt;y/n&lt;span class="o"&gt;)&lt;/span&gt; y
wrote extracted data to &lt;span class="s2"&gt;"secret.txt"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also point it at a specific output path with &lt;code&gt;-xf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;steghide extract &lt;span class="nt"&gt;-sf&lt;/span&gt; /home/khalif/Desktop/mons.jpg &lt;span class="nt"&gt;-xf&lt;/span&gt; /home/khalif/Desktop/secret.txt
Enter passphrase:
wrote extracted data to &lt;span class="s2"&gt;"/home/khalif/Desktop/secret.txt"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then just read it:&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;cat &lt;/span&gt;secret.txt
Every secure system is just undiscovered weak logic.
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrrftvi92u9u18ae7hyx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrrftvi92u9u18ae7hyx.jpg" alt=" " width="800" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pulling the exact location from EXIF metadata
&lt;/h3&gt;

&lt;p&gt;Images from phones often carry a lot more than pixels — camera make/model, timestamps, and sometimes precise GPS coordinates, all sitting quietly in the EXIF header. &lt;code&gt;exiftool&lt;/code&gt; makes this trivial to pull out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool /home/khalif/Desktop/picture.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buried in the output were the geolocation fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GPS Latitude    : 25 deg 43' 56.97" N
GPS Longitude   : 89 deg 15' 22.66" E
GPS Position    : 25 deg 43' 56.97" N, 89 deg 15' 22.66" E
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpg0oeqwarjtnh0rmyfj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpg0oeqwarjtnh0rmyfj.jpg" alt=" " width="800" height="434"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fel08u6sqy80favm04gyc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fel08u6sqy80favm04gyc.jpg" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a good reminder for anyone sharing photos online: metadata can leak far more than people realize, and it takes one command to pull it back out.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI-assisted steganalysis with Aperi'Solve
&lt;/h3&gt;

&lt;p&gt;Manually trying every steganalysis technique against a suspicious file gets old fast, so I ran the same image through &lt;strong&gt;Aperi'Solve&lt;/strong&gt;, a web-based tool that automates a whole pipeline of steganalysis checks — bit-plane decomposition, &lt;code&gt;zsteg&lt;/code&gt;-style extraction, &lt;code&gt;steghide&lt;/code&gt;, &lt;code&gt;outguess&lt;/code&gt;, &lt;code&gt;jsteg&lt;/code&gt;, &lt;code&gt;jpseek&lt;/code&gt;, metadata inspection, and more — all in one pass.&lt;/p&gt;

&lt;p&gt;The results confirmed what I already knew from the manual extraction, but automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decomposer / bit-plane analysis&lt;/strong&gt; — ran successfully, showing the superimposed color-channel breakdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steghide module&lt;/strong&gt; — flagged &lt;strong&gt;Success&lt;/strong&gt; and independently extracted the same &lt;code&gt;secret.txt&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jsteg&lt;/strong&gt; — reported no hidden data (correctly, since the image wasn't encoded with that method)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outguess&lt;/strong&gt; — failed to extract (also expected, wrong technique for this file)&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gfx0023u56p0g6zrsi8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gfx0023u56p0g6zrsi8.jpg" alt=" " width="799" height="413"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flsuat5d4bx8evyk4h4ia.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flsuat5d4bx8evyk4h4ia.jpg" alt=" " width="798" height="370"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyi1xecarhbpxydy4s6a7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyi1xecarhbpxydy4s6a7.jpg" alt=" " width="800" height="414"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcxwuf98b1frzyjuei9g3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcxwuf98b1frzyjuei9g3.jpg" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where AI/ML genuinely earns its keep in steganalysis: instead of manually running six different tools against every suspicious file, an automated pipeline (and increasingly, CNN-based classifiers trained on stego vs. clean images) can flag which files deserve a closer human look, at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Practicing log analysis fundamentals
&lt;/h3&gt;

&lt;p&gt;Before touching real data, I worked through two hands-on labs to build a mental model of what "normal" log activity looks like versus a genuine compromise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Log fundamentals&lt;/strong&gt; — logging sources, formats, standards, centralization, retention, and hands-on filtering practice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows incident investigation&lt;/strong&gt; — tracing an actual breach through Windows event logs: identifying the attacker's foothold, a malicious scheduled task, credential dumping via Mimikatz, the external C2 IP address, a webshell dropped through a vulnerable upload endpoint, and even DNS poisoning targeting a legitimate domain&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qrup561owxs4ke42wxl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qrup561owxs4ke42wxl.jpg" alt=" " width="799" height="427"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcuhxq32dfsyyfwvbk4r9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcuhxq32dfsyyfwvbk4r9.jpg" alt=" " width="800" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxxez33kyykzmwmi77cmf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxxez33kyykzmwmi77cmf.jpg" alt=" " width="800" height="425"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbi2j4y81igota0jvfhj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbi2j4y81igota0jvfhj.jpg" alt=" " width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Working through a real (simulated) breach start-to-finish made it obvious how much of incident response is just &lt;strong&gt;pattern recognition across timestamps&lt;/strong&gt; — which set up the next part perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Building a timeline from my own system logs
&lt;/h3&gt;

&lt;p&gt;Next I turned to my own Kali VM and filtered &lt;code&gt;journalctl&lt;/code&gt; for anything security-relevant:&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;journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"2026-08-08"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Ei&lt;/span&gt; &lt;span class="s2"&gt;"failed|failure|authentication|invalid|sudo|session opened|session closed"&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scanning the filtered output, one sequence stood out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01:08:45 - Password check failed for user khalif
01:08:45 - PAM reported authentication failure
01:08:49 - xfce4-screensaver: setuid failed: Operation not permitted
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2adt3sg8ybau3ye67c0t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2adt3sg8ybau3ye67c0t.jpg" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I laid the surrounding events out as a timeline:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Observed Event&lt;/th&gt;
&lt;th&gt;Analysis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;01:08:45&lt;/td&gt;
&lt;td&gt;Password check failed for user&lt;/td&gt;
&lt;td&gt;Authentication anomaly detected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01:08:45&lt;/td&gt;
&lt;td&gt;PAM reported authentication failure&lt;/td&gt;
&lt;td&gt;Confirms the failed authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01:08:49&lt;/td&gt;
&lt;td&gt;setuid operation failed&lt;/td&gt;
&lt;td&gt;Permission-related system error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01:09:01&lt;/td&gt;
&lt;td&gt;Root CRON session opened and closed&lt;/td&gt;
&lt;td&gt;Routine automated activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01:09:34&lt;/td&gt;
&lt;td&gt;User executed a command via sudo&lt;/td&gt;
&lt;td&gt;Administrative activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01:11:37&lt;/td&gt;
&lt;td&gt;User accessed apt history log via sudo&lt;/td&gt;
&lt;td&gt;Related to investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;01:12:41&lt;/td&gt;
&lt;td&gt;User ran journalctl via sudo&lt;/td&gt;
&lt;td&gt;Related to investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important nuance:&lt;/strong&gt; a failed login plus a setuid error doesn't automatically mean "attacker." It's just as likely to be a mistyped password followed by an unrelated desktop-session hiccup. I flagged it as &lt;em&gt;anomalous and worth a second look&lt;/em&gt;, not as confirmed malicious activity — that distinction matters a lot in real incident response, where over-alerting burns analyst trust just as fast as under-alerting does.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Turning an AI assistant loose on 10,000 log lines
&lt;/h3&gt;

&lt;p&gt;For the second half of the log analysis, I grabbed a public sample Apache access log (10,000 entries) and uploaded it straight to an AI assistant with a simple prompt: &lt;em&gt;analyze this for anomalies and suspicious activity.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo5qrydeen9qowejp0kzp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo5qrydeen9qowejp0kzp.jpg" alt=" " width="799" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The model parsed all 10,000 entries and came back with a structured breakdown covering status code distribution, top requesting IPs, User-Agent patterns, HTTP methods, and known-bad URL signatures. It surfaced three genuinely interesting findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coordinated CMS admin-panel scanning&lt;/strong&gt; — repeated hits on &lt;code&gt;/wp-login.php&lt;/code&gt; and &lt;code&gt;/administrator/index.php&lt;/code&gt; from multiple IPs, all with blank User-Agent strings (a classic automated-scanner fingerprint)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A vulnerability scan targeting the FCKeditor file-upload exploit&lt;/strong&gt; — an old but still commonly probed-for vulnerability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeated failed requests from an automated client&lt;/strong&gt; pointing at a missing file — this one turned out to be a misconfiguration, not an attack, once the requesting client was identified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of the suspicious requests returned a 403 or 404, meaning none of the scans actually succeeded — but the pattern-matching itself, done in seconds across 10,000 lines, is exactly the kind of triage work that would take a human analyst a lot longer to do by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;If you want to reproduce any of this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Steghide extraction&lt;/strong&gt; — install with &lt;code&gt;sudo apt install steghide&lt;/code&gt;, then run &lt;code&gt;steghide extract -sf &amp;lt;image&amp;gt;&lt;/code&gt; on a known stego-embedded file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EXIF metadata&lt;/strong&gt; — install with &lt;code&gt;sudo apt install libimage-exiftool-perl&lt;/code&gt;, then run &lt;code&gt;exiftool &amp;lt;image&amp;gt;&lt;/code&gt; and check for &lt;code&gt;GPS Latitude&lt;/code&gt; / &lt;code&gt;GPS Longitude&lt;/code&gt; fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aperi'Solve&lt;/strong&gt; — upload any image at aperisolve.com and check which modules return "Success" versus "No result."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;journalctl filtering&lt;/strong&gt; — adjust the &lt;code&gt;--since&lt;/code&gt; date and the &lt;code&gt;grep -Ei&lt;/code&gt; pattern to match your own system's timestamps, then confirm the flagged lines correspond to real login attempts (&lt;code&gt;last -f /var/log/wtmp&lt;/code&gt; is a good cross-check).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI log triage&lt;/strong&gt; — grab any public Apache/Nginx access log sample, upload it to an AI assistant, and compare its flagged IPs/paths against a quick manual &lt;code&gt;grep&lt;/code&gt; for &lt;code&gt;wp-login&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, or &lt;code&gt;.php&lt;/code&gt; in the same file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through both halves of this project side by side made the connection between them a lot clearer than I expected. Steganography and log analysis are really the same underlying skill wearing two different outfits: &lt;strong&gt;finding a meaningful signal buried inside a huge amount of ordinary-looking noise.&lt;/strong&gt; Whether that noise is pixel values in a JPEG or ten thousand HTTP requests, the workflow is the same — narrow the field with automated tooling, then apply human judgment to what's left.&lt;/p&gt;

&lt;p&gt;The other big takeaway was about calibration. AI tools are genuinely fast at flagging candidates — a suspicious image, a burst of failed logins, a scanning pattern in a log file — but they're not a verdict machine. The "anomalous, not confirmed malicious" framing I used for my own auth logs is the right default posture, and it's one I plan to carry into any future investigation work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It's a Problem&lt;/th&gt;
&lt;th&gt;Better Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Assuming a failed login = an attack&lt;/td&gt;
&lt;td&gt;Password typos and session glitches happen constantly&lt;/td&gt;
&lt;td&gt;Cross-reference multiple log sources before concluding malicious intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only running one steganalysis tool&lt;/td&gt;
&lt;td&gt;Different embedding techniques need different detection tools&lt;/td&gt;
&lt;td&gt;Run a multi-tool pipeline (or an automated one) so no single blind spot slips through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring EXIF metadata on shared images&lt;/td&gt;
&lt;td&gt;Photos can leak precise GPS location without anyone realizing&lt;/td&gt;
&lt;td&gt;Strip metadata (&lt;code&gt;exiftool -all=&lt;/code&gt;) before sharing sensitive images publicly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating every AI-flagged anomaly as confirmed&lt;/td&gt;
&lt;td&gt;Automated flags are a starting point, not a conclusion&lt;/td&gt;
&lt;td&gt;Always validate AI findings against raw log evidence before acting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skipping a proper timeline&lt;/td&gt;
&lt;td&gt;Isolated log lines are hard to interpret out of context&lt;/td&gt;
&lt;td&gt;Lay events out chronologically — the sequence often tells the real story&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hiding a message in an image and hiding an attack in a wall of logs turn out to require the exact same mindset: assume there's a signal in the noise, narrow it down systematically, and don't stop at the first tool's output. AI made both halves of this project noticeably faster — automated steganalysis pipelines and AI-assisted log triage both did in seconds what would've taken a lot longer by hand — but the actual judgment calls, like distinguishing "anomalous" from "confirmed malicious," still came down to careful, manual reasoning.&lt;/p&gt;

&lt;p&gt;If you're getting into digital forensics or blue-team work, I'd genuinely recommend doing both halves of this exercise yourself — hide something in an image and try to find it, then pull a public access log and go hunting. It sticks a lot better than reading about it.&lt;/p&gt;

</description>
      <category>steganography</category>
      <category>cybersecurity</category>
      <category>forensics</category>
      <category>ai</category>
    </item>
    <item>
      <title>Cracking the Code: A Hands-On Journey Through Cryptography, Hash Cracking, and Post-Quantum Security</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 08 Aug 2026 15:21:07 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/cracking-the-code-a-hands-on-journey-through-cryptography-hash-cracking-and-post-quantum-security-4eh6</link>
      <guid>https://dev.to/almahmudkhalif/cracking-the-code-a-hands-on-journey-through-cryptography-hash-cracking-and-post-quantum-security-4eh6</guid>
      <description>&lt;p&gt;I've always been fascinated by the idea that a string of random-looking characters can hide something real — a password, a message, an identity. So I decided to spend some real hands-on time with cryptography: not just reading about it, but actually cracking hashes, exploring how AI is starting to change cryptanalysis, and thinking through what happens to encryption once quantum computers become practical.&lt;/p&gt;

&lt;p&gt;This write-up walks through everything I explored — from classical ciphers like Caesar and Vigenère, to symmetric encryption (AES vs DES), to practical hash cracking with &lt;code&gt;hashcat&lt;/code&gt; and &lt;code&gt;john&lt;/code&gt;, and finally into asymmetric cryptography, RSA, and the NIST Post-Quantum Cryptography standards.&lt;/p&gt;

&lt;p&gt;If you're getting into cybersecurity and want a practical feel for how this stuff actually works (not just textbook definitions), this should be a useful walkthrough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Encryption and hashing are everywhere — logins, banking, messaging — but most people (myself included, before this) treat them as a black box. I wanted to answer a few concrete questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do classical ciphers actually work, and why are they broken so easily today?&lt;/li&gt;
&lt;li&gt;What really separates a "secure" algorithm like AES from an obsolete one like DES?&lt;/li&gt;
&lt;li&gt;Why do we salt passwords, and what does a salt actually prevent?&lt;/li&gt;
&lt;li&gt;Can AI meaningfully speed up hash identification and cracking?&lt;/li&gt;
&lt;li&gt;How does public/private key cryptography (RSA) work under the hood?&lt;/li&gt;
&lt;li&gt;Why is quantum computing considered a real threat to today's encryption, and what is the industry doing about it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make this concrete, I set up a Kali Linux VM and worked through a batch of unknown hashes, identifying and cracking each one using real tools instead of just theory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step Walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Setting Up the Environment
&lt;/h3&gt;

&lt;p&gt;I used Kali Linux (in VirtualBox) with &lt;code&gt;hashid&lt;/code&gt;, &lt;code&gt;hashcat&lt;/code&gt;, and &lt;code&gt;john the ripper&lt;/code&gt; — all pre-installed on Kali, plus the classic &lt;code&gt;rockyou.txt&lt;/code&gt; wordlist.&lt;/p&gt;

&lt;p&gt;First thing: the wordlist ships compressed and permission-locked, so it needs to be unzipped with elevated privileges:&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; /usr/share/wordlists
&lt;span class="nb"&gt;gunzip &lt;/span&gt;rockyou.txt.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you hit a &lt;code&gt;Permission denied&lt;/code&gt; error (very common), just escalate first:&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;su
&lt;span class="nb"&gt;gunzip &lt;/span&gt;rockyou.txt.gz
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4pwzbpxtx0c64tl6jzj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4pwzbpxtx0c64tl6jzj.jpg" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Identifying Unknown Hash Types
&lt;/h3&gt;

&lt;p&gt;Before you can crack a hash, you need to know what kind of hash it is. &lt;code&gt;hashid&lt;/code&gt; is great for a quick first guess:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hashid &lt;span class="s1"&gt;'3580c9267518807d14803ab6821fa067b4dba1210a4148a243b9e9383bae6a1e'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For trickier or more ambiguous hashes, I also cross-checked against an online hash identifier tool, which gave confidence scores and useful context (e.g. "this format is most commonly seen in Windows AD/NTDS dumps").&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4skmqy95btzvgpoqojh3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4skmqy95btzvgpoqojh3.jpg" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cracking with Hashcat
&lt;/h3&gt;

&lt;p&gt;Once I had a working hash-mode guess, I saved the hash to a file and ran it against &lt;code&gt;rockyou.txt&lt;/code&gt;:&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'PASTE_HASH_HERE'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; hash1.txt
hashcat &lt;span class="nt"&gt;-m&lt;/span&gt; 1400 &lt;span class="nt"&gt;-a&lt;/span&gt; 0 hash1.txt /usr/share/wordlists/rockyou.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-m 1400&lt;/code&gt; tells hashcat the hash type (in this case, SHA-256)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-a 0&lt;/code&gt; means a straight dictionary attack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To see the cracked result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hashcat &lt;span class="nt"&gt;-m&lt;/span&gt; 1400 &lt;span class="nt"&gt;--show&lt;/span&gt; hash1.txt
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv952r6oqrlxjhyocgh9q.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv952r6oqrlxjhyocgh9q.jpg" alt=" " width="800" height="233"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fme1er0yb80pnnkat6yw4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fme1er0yb80pnnkat6yw4.jpg" alt=" " width="800" height="329"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbnknqy79vs5r0edr81rm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbnknqy79vs5r0edr81rm.jpg" alt=" " width="800" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I repeated this same process for several hashes of different types — SHA-256, SHA-512, and raw MD5 — just swapping the &lt;code&gt;-m&lt;/code&gt; mode number to match each algorithm.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cracking Salted / bcrypt Hashes with John the Ripper
&lt;/h3&gt;

&lt;p&gt;Not every hash plays nicely with hashcat's default modes, especially bcrypt. For those, &lt;code&gt;john&lt;/code&gt; handled it well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;john hash5.txt &lt;span class="nt"&gt;--wordlist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/wordlists/rockyou.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bcrypt is intentionally slow (that's the point — it resists brute force), so this one took noticeably longer to crack than the SHA-based hashes. To reveal the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;john hash5.txt &lt;span class="nt"&gt;--show&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vzbxib5pgtvvrpno416.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vzbxib5pgtvvrpno416.jpg" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Practicing on TryHackMe's "Crack the Hash" Room
&lt;/h3&gt;

&lt;p&gt;To push further, I worked through TryHackMe's &lt;strong&gt;Crack the Hash&lt;/strong&gt; room ( &lt;a href="https://tryhackme.com/room/crackthehash" rel="noopener noreferrer"&gt;https://tryhackme.com/room/crackthehash&lt;/a&gt; ) , which throws a mix of easy and progressively harder hashes at you — including salted hashes where the salt is given separately and has to be appended/prepended correctly before cracking.&lt;/p&gt;

&lt;p&gt;This part really reinforced &lt;em&gt;why&lt;/em&gt; salting matters: without knowing the exact salt and how it's combined with the password, even a correct wordlist guess won't produce a matching hash.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fausuxswemeoo32mzrdt2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fausuxswemeoo32mzrdt2.png" alt=" " width="800" height="453"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9h5zlzmmbnlshpg7txbi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9h5zlzmmbnlshpg7txbi.jpg" alt=" " width="799" height="443"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgk10fe3vpd1kbyvqer36.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgk10fe3vpd1kbyvqer36.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Digging Into the Theory
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Classical Ciphers: Caesar &amp;amp; Vigenère
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Caesar Cipher&lt;/strong&gt; just shifts every letter by a fixed number of positions. With only 25 possible shifts, it's trivial to brute-force.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Vigenère Cipher&lt;/strong&gt; improves on this by using a repeating keyword, so each letter of the plaintext gets a different shift value. It resists simple brute force, but a technique called &lt;strong&gt;Kasiski examination&lt;/strong&gt; can still recover the key length by spotting repeated patterns in the ciphertext — and from there, the cipher falls.&lt;/p&gt;

&lt;h3&gt;
  
  
  AES vs DES
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;DES&lt;/th&gt;
&lt;th&gt;AES&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Key size&lt;/td&gt;
&lt;td&gt;56-bit&lt;/td&gt;
&lt;td&gt;128 / 192 / 256-bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status today&lt;/td&gt;
&lt;td&gt;Obsolete, crackable in hours&lt;/td&gt;
&lt;td&gt;Industry standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used for&lt;/td&gt;
&lt;td&gt;Legacy systems&lt;/td&gt;
&lt;td&gt;Government &amp;amp; modern encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;DES simply wasn't built for today's compute power. AES, especially at 256-bit, remains effectively unbreakable with current classical hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Salting Matters
&lt;/h3&gt;

&lt;p&gt;Without a salt, two users with the password &lt;code&gt;password123&lt;/code&gt; end up with &lt;strong&gt;identical&lt;/strong&gt; hashes — which is exactly what precomputed rainbow tables exploit. A salt is a random value mixed in before hashing, so identical passwords produce completely different hashes, forcing an attacker to crack each one individually.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where AI Fits Into Cryptanalysis
&lt;/h3&gt;

&lt;p&gt;This was the part I found most interesting. AI isn't replacing traditional tools like hashcat — it's making the &lt;em&gt;guessing&lt;/em&gt; smarter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Predicting likely hash algorithms from structure/length faster than rule-based identifiers&lt;/li&gt;
&lt;li&gt;Learning patterns from leaked password datasets to generate more realistic candidate passwords (common substitutions, suffix patterns, etc.) instead of pure brute force&lt;/li&gt;
&lt;li&gt;Speeding up the reconnaissance phase in CTF-style challenges by identifying cipher/encoding types automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also drafted a reusable prompt template for using an LLM to systematically break a Caesar Cipher — trying all 25 shifts, evaluating which output reads as real English, and clearly stating the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a cryptanalysis expert. I have an intercepted message that appears
to be encoded using a Caesar Cipher.

Encrypted message: [CIPHERTEXT HERE]

Please do the following:
1. Try all 25 possible shift values (1 through 25).
2. Show the decrypted output for each shift.
3. Identify which shift produces readable English text.
4. State the correct shift value and the final plaintext.
5. Briefly explain how you identified the correct decryption.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RSA and Public/Private Keys
&lt;/h3&gt;

&lt;p&gt;RSA relies on a simple asymmetry in difficulty: multiplying two large primes is fast, but factoring the resulting product back into those primes is extremely hard. Anyone can encrypt a message with my &lt;strong&gt;public&lt;/strong&gt; key, but only my &lt;strong&gt;private&lt;/strong&gt; key can decrypt it — which is what makes secure communication over an untrusted channel possible in the first place.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Quantum Threat
&lt;/h3&gt;

&lt;p&gt;Two quantum algorithms change the picture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shor's Algorithm&lt;/strong&gt; can factor large numbers exponentially faster than classical computers, which would break RSA outright if a sufficiently powerful quantum computer existed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grover's Algorithm&lt;/strong&gt; effectively halves the strength of symmetric keys, so a 256-bit AES key would offer roughly the security of a 128-bit key against a quantum attacker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why NIST ran a multi-year competition and, in 2024, finalized its first &lt;strong&gt;Post-Quantum Cryptography (PQC)&lt;/strong&gt; standards — &lt;strong&gt;CRYSTALS-Kyber&lt;/strong&gt; for key exchange/encryption and &lt;strong&gt;CRYSTALS-Dilithium (ML-DSA)&lt;/strong&gt; for digital signatures, both based on lattice problems believed to resist quantum attacks.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;If you want to reproduce any of this yourself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Spin up a Kali Linux VM (or use any distro with &lt;code&gt;hashcat&lt;/code&gt;, &lt;code&gt;john&lt;/code&gt;, and &lt;code&gt;hashid&lt;/code&gt; installed).&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;rockyou.txt&lt;/code&gt; and place it in &lt;code&gt;/usr/share/wordlists/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Save a hash to a &lt;code&gt;.txt&lt;/code&gt; file, identify its type with &lt;code&gt;hashid&lt;/code&gt;, then run the matching &lt;code&gt;hashcat -m &amp;lt;mode&amp;gt;&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Confirm the crack with &lt;code&gt;hashcat --show&lt;/code&gt; or &lt;code&gt;john --show&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Try TryHackMe's &lt;strong&gt;Crack the Hash&lt;/strong&gt; room yourself for a structured, escalating challenge set.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this hands-on rather than just reading about it changed how I think about "secure" systems. A few things stuck with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cryptography is only as strong as its weakest implementation detail (looking at you, missing salts).&lt;/li&gt;
&lt;li&gt;Hash cracking is really a wordlist-and-rules problem — the algorithm matters less than how predictable the underlying password is.&lt;/li&gt;
&lt;li&gt;AI's real value right now is in &lt;em&gt;speeding up identification and guessing&lt;/em&gt;, not magically breaking strong encryption.&lt;/li&gt;
&lt;li&gt;Post-quantum cryptography isn't science fiction planning anymore — NIST already has finalized standards, and the migration is already underway in parts of the industry.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Guessing the wrong hashcat mode (&lt;code&gt;-m&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Similar-length hashes (SHA-256 vs others) look alike&lt;/td&gt;
&lt;td&gt;Cross-check with a hash identifier tool before running hashcat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting to unzip/permission-fix &lt;code&gt;rockyou.txt&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Wordlist ships compressed and root-owned on Kali&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sudo gunzip rockyou.txt.gz&lt;/code&gt; before first use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring salts on salted hashes&lt;/td&gt;
&lt;td&gt;Salt isn't hashed the same way in every format&lt;/td&gt;
&lt;td&gt;Check the exact salt placement (prefix/suffix) required by that hash type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assuming AES-256 is "quantum-proof"&lt;/td&gt;
&lt;td&gt;AES resists Shor's Algorithm but not Grover's&lt;/td&gt;
&lt;td&gt;Understand Grover only &lt;em&gt;weakens&lt;/em&gt; AES, it doesn't fully break it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Treating AI hash-cracking as magic&lt;/td&gt;
&lt;td&gt;AI still needs data patterns to learn from&lt;/td&gt;
&lt;td&gt;Use AI to speed up identification/guessing, not as a silver bullet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Cryptography sits at the foundation of almost everything we trust online, and there's a real gap between knowing the definitions and actually being able to identify, crack, and reason about these systems hands-on. This exercise pushed me to close some of that gap — and it also made the post-quantum conversation feel a lot less abstract. If you're working through similar material, I'd genuinely recommend setting up a lab and cracking a few hashes yourself rather than just reading the theory.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>cryptography</category>
      <category>hashcat</category>
      <category>ethicalhacking</category>
    </item>
    <item>
      <title>What My Own Wi-Fi Traffic Looked Like Under Wireshark (And Why 88% of It Wasn't Even TLS)</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Wed, 05 Aug 2026 15:43:19 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/what-my-own-wi-fi-traffic-looked-like-under-wireshark-and-why-88-of-it-wasnt-even-tls-2991</link>
      <guid>https://dev.to/almahmudkhalif/what-my-own-wi-fi-traffic-looked-like-under-wireshark-and-why-88-of-it-wasnt-even-tls-2991</guid>
      <description>&lt;p&gt;I've used the internet every day for years without ever actually looking at what leaves my laptop when I open a webpage. So I decided to fix that: install Wireshark, capture a few minutes of completely normal browsing on my home Wi-Fi, and see what's really going on underneath.&lt;/p&gt;

&lt;p&gt;What I found surprised me. I expected mostly HTTPS/TLS traffic. Instead, the biggest chunk of data wasn't TLS at all — it was a protocol I barely knew existed.&lt;/p&gt;

&lt;p&gt;This post walks through the setup, what I captured, and the three things that changed how I think about "just browsing the web."&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;The goal was simple: capture live traffic from a normal browsing session and actually understand it — not just glance at packet counts, but dig into protocols, DNS behavior, top talkers, and anything that looked off. Before this, Wireshark was just an icon I'd never clicked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Getting Wireshark Running
&lt;/h3&gt;

&lt;p&gt;I installed Wireshark on Windows 10 and let it install &lt;strong&gt;Npcap&lt;/strong&gt; alongside it — without that driver, no network interfaces show up in the capture list at all. After a restart, I opened Wireshark and picked my &lt;strong&gt;Wi-Fi&lt;/strong&gt; interface, since that was the only one showing live activity in the little traffic graph next to each interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Generating Some Normal Traffic
&lt;/h3&gt;

&lt;p&gt;Before starting the capture, I closed every other app so the capture wouldn't get flooded with unrelated noise. Then I hit record and did a few ordinary things over 2–3 minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opened &lt;code&gt;https://www.wikipedia.org&lt;/code&gt; over HTTPS&lt;/li&gt;
&lt;li&gt;Opened &lt;code&gt;http://neverssl.com&lt;/code&gt; on purpose, just to see what plain unencrypted traffic looks like&lt;/li&gt;
&lt;li&gt;Ran a couple of terminal commands:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping 8.8.8.8
nslookup github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Played a short YouTube video for about 15 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I stopped the capture and saved it. The final file held &lt;strong&gt;11,272 packets&lt;/strong&gt; — way more than I expected from a few minutes of "light" browsing.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftq3y0yefeq6yzddmdib1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftq3y0yefeq6yzddmdib1.jpg" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Breaking Down the Protocols
&lt;/h3&gt;

&lt;p&gt;Instead of scrolling through thousands of rows one by one, I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Statistics → Protocol Hierarchy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives a percentage breakdown of every protocol in the capture, by both packet count and byte volume — which turned out to be the most important view in the whole exercise.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr4chggx5fk72m1er97l5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr4chggx5fk72m1er97l5.jpg" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I expected most of the data to be standard HTTPS over TCP. Instead, when I checked the &lt;strong&gt;Percent Bytes&lt;/strong&gt; column, almost 88% of all the data in the capture wasn't TLS/TCP — it was &lt;strong&gt;QUIC&lt;/strong&gt;, a newer transport protocol that runs over UDP instead of TCP. YouTube and other Google services use it now instead of the classic TLS-over-TCP combo, mainly because it's faster to set up and handles packet loss better.&lt;/p&gt;

&lt;p&gt;That also explained something odd: TCP accounted for a decent chunk of packets (13.4%) but almost no bytes (0.3%). Those were mostly handshake and acknowledgment packets — the real weight of the video traffic was moving through QUIC the entire time without me noticing anything different.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Looking at DNS Queries
&lt;/h3&gt;

&lt;p&gt;To isolate just the questions my laptop was asking (not the responses), I used this filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dns.flags.response == 0
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvzihfkipqo1nenyaxgs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvzihfkipqo1nenyaxgs.jpg" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some of the domains that showed up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;www.youtube.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;googleads.g.doubleclick.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yt3.ggpht.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;en.wikipedia.org&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What caught me off guard was that opening &lt;strong&gt;one&lt;/strong&gt; YouTube video triggered lookups for &lt;strong&gt;six different domains&lt;/strong&gt; within about 20 seconds: the main YouTube domain, a Google accounts domain, a thumbnail CDN, an ad-tracking domain, and the actual video CDN host. Most of these were CDNs and analytics services I never directly asked for.&lt;/p&gt;

&lt;p&gt;My DNS server was my home router (&lt;code&gt;192.168.1.1&lt;/code&gt;), and every query went out in &lt;strong&gt;plain text over UDP port 53&lt;/strong&gt;. That means anyone on the same network — or my ISP — could see exactly which sites I was visiting, even though the sites themselves were encrypted over HTTPS.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Finding the Top Talkers
&lt;/h3&gt;

&lt;p&gt;Next I checked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Statistics → Conversations
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe42d8l1tqzrlwl6n9391.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe42d8l1tqzrlwl6n9391.jpg" alt=" " width="799" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unsurprisingly, my own machine was in every conversation, but the heaviest single connection by far was the YouTube video CDN — video streaming pulls dramatically more data than loading a text-based page ever does.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Checking for Anything Unusual
&lt;/h3&gt;

&lt;p&gt;I filtered for retransmissions with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tcp.analysis.retransmission
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8fl3yo5i6r6iw1mu2wi4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8fl3yo5i6r6iw1mu2wi4.jpg" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A handful of retransmitted TCP segments, most likely from a weak Wi-Fi signal in my room&lt;/li&gt;
&lt;li&gt;A batch of RST packets — mostly my own laptop tearing down idle keep-alive connections&lt;/li&gt;
&lt;li&gt;Constant SSDP broadcast traffic from my router, plus an mDNS announcement from another device on the same network&lt;/li&gt;
&lt;li&gt;Background traffic to Microsoft telemetry endpoints even though I wasn't running any Office apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing here looked malicious. But it was a solid reminder of how much a device "talks" in the background even when it feels idle.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;If you want to reproduce this yourself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Wireshark + Npcap and pick your active network interface&lt;/li&gt;
&lt;li&gt;Start a capture, then browse normally for 2–3 minutes (mix of HTTPS, an unencrypted site, a DNS lookup, and some streaming)&lt;/li&gt;
&lt;li&gt;Stop the capture and open &lt;strong&gt;Statistics → Protocol Hierarchy&lt;/strong&gt; — check the Percent Bytes column, not just packet counts&lt;/li&gt;
&lt;li&gt;Filter with &lt;code&gt;dns.flags.response == 0&lt;/code&gt; to see outbound DNS questions only&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Statistics → Conversations&lt;/strong&gt; to find your top talkers&lt;/li&gt;
&lt;li&gt;Filter with &lt;code&gt;tcp.analysis.retransmission&lt;/code&gt; to spot connection issues&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Almost everything is encrypted now — but DNS and SNI still leak where you're going.&lt;/strong&gt; HTTPS hides the content, not the destination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single page visit is never one connection.&lt;/strong&gt; It's a dozen or more, quietly firing off to CDNs, trackers, and third-party services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filters are what make Wireshark usable.&lt;/strong&gt; Without them, 11,000+ packets are just noise; with the right filter, the same data tells a clear story.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If I had more time, I'd capture traffic from a single specific app in isolation and compare how differently apps behave on the wire — especially privacy-focused apps versus ad-supported ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Trips People Up&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Assuming HTTPS traffic is always TCP/TLS&lt;/td&gt;
&lt;td&gt;QUIC (UDP-based) is now common for major services like YouTube and Google&lt;/td&gt;
&lt;td&gt;Always check Protocol Hierarchy by bytes, not assumptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judging traffic volume by packet count&lt;/td&gt;
&lt;td&gt;Packet count and byte volume tell very different stories (see TCP handshake vs QUIC video)&lt;/td&gt;
&lt;td&gt;Sort by Percent Bytes, not Percent Packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skipping Npcap during install&lt;/td&gt;
&lt;td&gt;Wireshark shows zero interfaces without it&lt;/td&gt;
&lt;td&gt;Always let the installer add Npcap, then restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scrolling raw packet lists manually&lt;/td&gt;
&lt;td&gt;Thousands of packets are unreadable without structure&lt;/td&gt;
&lt;td&gt;Use Statistics menus and display filters from the start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring "idle" background traffic&lt;/td&gt;
&lt;td&gt;Devices talk constantly even without active use&lt;/td&gt;
&lt;td&gt;Check Conversations and DNS logs even during "quiet" periods&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Before this, I thought of the internet as just "pages loading." After actually watching the packets, it feels more like a noisy background conversation that never really stops. Encryption protects &lt;em&gt;what&lt;/em&gt; you're sending, but not &lt;em&gt;where&lt;/em&gt; you're sending it — and that gap is exactly what tools like Wireshark make visible. If you've never opened it before, I'd genuinely recommend spending twenty minutes capturing your own traffic. It's a strangely eye-opening exercise.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>wireshark</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Building My First LAN in Cisco Packet Tracer: Connecting 4 PCs Through a Switch</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sun, 26 Jul 2026 19:13:42 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/building-my-first-lan-in-cisco-packet-tracer-connecting-4-pcs-through-a-switch-11hn</link>
      <guid>https://dev.to/almahmudkhalif/building-my-first-lan-in-cisco-packet-tracer-connecting-4-pcs-through-a-switch-11hn</guid>
      <description>&lt;p&gt;Networking always felt like one of those "black box" topics to me — you know your laptop connects to Wi-Fi and somehow reaches the internet, but the actual mechanics of how devices talk to each other on a local network stay invisible. I decided to fix that by getting hands-on with Cisco Packet Tracer and building the simplest possible network from scratch: a handful of PCs, one switch, and enough IP addresses to make them all understand each other.&lt;/p&gt;

&lt;p&gt;This post walks through exactly what I did, why each step matters, and how I verified the whole thing actually worked — not just looked right on screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;The goal was straightforward on paper: connect four computers to a single switch, give each one its own IP address, and confirm they can all reach each other over the network. Simple as that sounds, it forces you to actually understand a few core networking concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why you need a specific cable type to connect a PC to a switch&lt;/li&gt;
&lt;li&gt;How IP addresses and subnet masks decide which devices can "see" each other&lt;/li&gt;
&lt;li&gt;How to prove connectivity actually works, instead of just assuming it does&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cisco Packet Tracer&lt;/li&gt;
&lt;li&gt;1x Switch (2960 series)&lt;/li&gt;
&lt;li&gt;4x PCs&lt;/li&gt;
&lt;li&gt;Copper Straight-Through cables&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Set Up the Devices
&lt;/h3&gt;

&lt;p&gt;I opened Packet Tracer and dragged a 2960 switch into the middle of the workspace, then placed four PCs around it. Nothing connected yet — just laying out the topology first so I could see the shape of the network before wiring anything up.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhav3vnuyw808ozqghsl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhav3vnuyw808ozqghsl.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Cable Everything Together
&lt;/h3&gt;

&lt;p&gt;This is where the "which cable do I use" question comes in. There are two main copper cable types in Packet Tracer: Straight-Through and Crossover. The rule of thumb is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Different device types&lt;/strong&gt; (PC ↔ Switch, PC ↔ Router) → Straight-Through cable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same device types&lt;/strong&gt; (Switch ↔ Switch, PC ↔ PC) → Crossover cable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since I was connecting PCs to a switch — two different device types — a Straight-Through cable was the correct choice. I connected each PC's FastEthernet0 port to its own port on the switch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PC0 → Switch Fa0/1
PC1 → Switch Fa0/2
PC2 → Switch Fa0/3
PC3 → Switch Fa0/4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a few seconds, every link light turned green, which confirmed the physical layer connection was solid on all four links.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F74ocxtjxizn1ing2h19q.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F74ocxtjxizn1ing2h19q.jpg" alt=" " width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Assign IP Addresses
&lt;/h3&gt;

&lt;p&gt;With cabling done, the next job was making each PC addressable on the network. I went into each PC's &lt;strong&gt;Desktop → IP Configuration&lt;/strong&gt;, switched to &lt;strong&gt;Static&lt;/strong&gt;, and assigned the following:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PC&lt;/th&gt;
&lt;th&gt;IP Address&lt;/th&gt;
&lt;th&gt;Subnet Mask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PC0&lt;/td&gt;
&lt;td&gt;192.168.1.1&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC1&lt;/td&gt;
&lt;td&gt;192.168.1.2&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC2&lt;/td&gt;
&lt;td&gt;192.168.1.3&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC3&lt;/td&gt;
&lt;td&gt;192.168.1.4&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The subnet mask is the important detail here. Using &lt;strong&gt;255.255.255.0&lt;/strong&gt; on every PC keeps them all in the same &lt;code&gt;192.168.1.0&lt;/code&gt; network, which is what allows them to talk to each other directly without needing a router. If the subnet masks didn't match, or the IPs landed in different subnets, the PCs would technically be cabled together but logically isolated — a good reminder that physical connection and network connection are two very different things.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsxsoqjk2m3nh0e1293ds.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsxsoqjk2m3nh0e1293ds.jpg" alt=" " width="800" height="713"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgd0tuelxfuuxoobykbx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgd0tuelxfuuxoobykbx.jpg" alt=" " width="800" height="645"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkwb35sdrmts5ul0j6s8x.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkwb35sdrmts5ul0j6s8x.jpg" alt=" " width="800" height="783"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jpnzz8ww2unu0pw710t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jpnzz8ww2unu0pw710t.jpg" alt=" " width="800" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;Configuring IPs is one thing — proving they actually work is another. I opened PC0's Command Prompt and ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping 192.168.1.2
ping 192.168.1.3
ping 192.168.1.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every single ping came back with a &lt;code&gt;Reply from...&lt;/code&gt; response and 0% packet loss, which confirmed PC0 could reach PC1, PC2, and PC3 without any issues.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pinging 192.168.1.2 with 32 bytes of data:
Reply from 192.168.1.2: bytes=32 time&amp;lt;1ms TTL=128
Reply from 192.168.1.2: bytes=32 time&amp;lt;1ms TTL=128
Reply from 192.168.1.2: bytes=32 time&amp;lt;1ms TTL=128
Reply from 192.168.1.2: bytes=32 time&amp;lt;1ms TTL=128

Ping statistics for 192.168.1.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6ocy1oytxyictvf0xvt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6ocy1oytxyictvf0xvt.jpg" alt=" " width="800" height="521"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6pmqehssvsb3f2eq4h6d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6pmqehssvsb3f2eq4h6d.jpg" alt=" " width="800" height="448"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tn4bm6fudidfqagwpv1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tn4bm6fudidfqagwpv1.jpg" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If a ping had failed, the next things I'd check are: cable type, whether the link light is actually green, whether the subnet masks match across devices, and whether I typo'd an IP address (it happens more often than you'd think).&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;This was a small setup, but it packed in a surprising number of fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Switches operate at Layer 2&lt;/strong&gt; — they don't care about IP addresses to forward traffic within the same network, but the PCs still need valid IPs to communicate meaningfully above that layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cable type matters more than I expected.&lt;/strong&gt; Straight-Through vs. Crossover isn't just trivia — plugging in the wrong one (in real hardware, anyway) can mean no link light at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnet masks define the "neighborhood."&lt;/strong&gt; Two devices can be cabled together perfectly and still fail to talk if their masks put them in different logical networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ping is your best friend for verification.&lt;/strong&gt; It's a simple command, but it's the fastest way to confirm connectivity actually exists rather than just looking correct visually.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Using a Crossover cable instead of Straight-Through&lt;/td&gt;
&lt;td&gt;Mixing up when each cable type applies&lt;/td&gt;
&lt;td&gt;Remember: different device types = Straight-Through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mismatched subnet masks&lt;/td&gt;
&lt;td&gt;Copy-pasting config without double-checking&lt;/td&gt;
&lt;td&gt;Verify every PC uses the same mask if they should be on one network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typo in IP address&lt;/td&gt;
&lt;td&gt;Manual entry across multiple PCs&lt;/td&gt;
&lt;td&gt;Double-check each octet before moving to the next PC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assuming green link light = full connectivity&lt;/td&gt;
&lt;td&gt;Confusing physical layer with network layer&lt;/td&gt;
&lt;td&gt;Always confirm with &lt;code&gt;ping&lt;/code&gt;, not just visual cues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting to set Static mode before entering an IP&lt;/td&gt;
&lt;td&gt;DHCP is selected by default&lt;/td&gt;
&lt;td&gt;Switch to Static first, then fill in the address fields&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building this tiny four-PC network was a great reminder that networking fundamentals aren't complicated once you actually build them out yourself instead of just reading about them. Cabling, addressing, and verifying — that's really the whole loop, and once it clicks, scaling up to routers, VLANs, and larger topologies feels a lot less intimidating.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>cisco</category>
    </item>
    <item>
      <title>Linux, Networking, Scripting, and AI: What Every Beginner Pentester Should Know</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Fri, 17 Jul 2026 17:42:50 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/linux-networking-scripting-and-ai-what-every-beginner-pentester-should-know-51jo</link>
      <guid>https://dev.to/almahmudkhalif/linux-networking-scripting-and-ai-what-every-beginner-pentester-should-know-51jo</guid>
      <description>&lt;p&gt;When I started digging deeper into cybersecurity, I quickly realized that almost everything in this field circles back to one operating system: &lt;strong&gt;Linux&lt;/strong&gt;. Whether you're running a vulnerability scan, writing a quick automation script, or asking an AI tool to explain a weird output, Linux is the environment where it all happens.&lt;/p&gt;

&lt;p&gt;I wanted to write down what I've learned so far in a way that's actually useful for someone just getting started — no fluff, just the stuff that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Linux Dominates Cybersecurity
&lt;/h2&gt;

&lt;p&gt;Linux is open-source, free, and highly customizable. Unlike Windows or macOS, it gives you full control over the system — down to the smallest configuration file. That level of control is exactly why almost every serious security tool is built for Linux first.&lt;/p&gt;

&lt;p&gt;And within the Linux world, there's one distribution that stands out for security work: &lt;strong&gt;Kali Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes Kali Linux Special
&lt;/h3&gt;

&lt;p&gt;Kali is a Linux distribution built specifically for penetration testing, maintained by Offensive Security. It comes preloaded with hundreds of tools covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network scanning&lt;/li&gt;
&lt;li&gt;Vulnerability assessment&lt;/li&gt;
&lt;li&gt;Password testing&lt;/li&gt;
&lt;li&gt;Digital forensics&lt;/li&gt;
&lt;li&gt;Web application testing&lt;/li&gt;
&lt;li&gt;Wireless security testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, if you're doing ethical hacking, Kali saves you the trouble of hunting down and installing every tool yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Comfortable With the Linux Filesystem
&lt;/h2&gt;

&lt;p&gt;One of the first mental shifts coming from Windows is realizing there's no "C: drive." Everything starts from a single root directory: &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A few directories you'll bump into constantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/home&lt;/code&gt; — where regular users keep their personal files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc&lt;/code&gt; — system and application configuration files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/var&lt;/code&gt; — logs, caches, and other data that changes often&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/root&lt;/code&gt; — the home directory of the root (admin) user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once that structure clicks, navigating any Linux system starts to feel natural.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Commands You'll Actually Use Every Day
&lt;/h2&gt;

&lt;p&gt;You don't need to memorize hundreds of commands to get productive. A small core set covers most of your daily 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;pwd&lt;/span&gt;                     &lt;span class="c"&gt;# show current directory&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;                      &lt;span class="c"&gt;# list files and folders&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;folder_name          &lt;span class="c"&gt;# change directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;new_folder        &lt;span class="c"&gt;# create a directory&lt;/span&gt;
&lt;span class="nb"&gt;touch &lt;/span&gt;file.txt          &lt;span class="c"&gt;# create an empty file&lt;/span&gt;
&lt;span class="nb"&gt;cp source &lt;/span&gt;destination   &lt;span class="c"&gt;# copy files&lt;/span&gt;
&lt;span class="nb"&gt;mv source &lt;/span&gt;destination   &lt;span class="c"&gt;# move or rename files&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;file.txt             &lt;span class="c"&gt;# delete a file&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;file.txt            &lt;span class="c"&gt;# print file content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These feel small individually, but combined they let you move around, inspect, and manipulate a system faster than any GUI ever could.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions: Read, Write, Execute
&lt;/h2&gt;

&lt;p&gt;Linux controls access through three roles — &lt;strong&gt;owner&lt;/strong&gt;, &lt;strong&gt;group&lt;/strong&gt;, and &lt;strong&gt;others&lt;/strong&gt; — and three permission types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read (4)&lt;/strong&gt; — view or open a file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write (2)&lt;/strong&gt; — modify a file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute (1)&lt;/strong&gt; — run it as a program or script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You change permissions with &lt;code&gt;chmod&lt;/code&gt;, and most professionals prefer the numeric shorthand over the &lt;code&gt;+x&lt;/code&gt; / &lt;code&gt;+w&lt;/code&gt; style because it's faster and sets everything in one shot:&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;chmod &lt;/span&gt;755 script.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single command says: full control for the owner, read-and-execute for everyone else. Clean and quick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Software: apt and dpkg
&lt;/h2&gt;

&lt;p&gt;Two commands handle almost all your software needs on Kali:&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;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nmap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;apt&lt;/code&gt; pulls packages (and their dependencies) straight from repositories. When you already have a &lt;code&gt;.deb&lt;/code&gt; file downloaded locally, &lt;code&gt;dpkg&lt;/code&gt; installs it directly:&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;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; package.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PATH and Environment Variables
&lt;/h2&gt;

&lt;p&gt;Ever wonder how Linux knows where to find a program when you just type its name? That's the &lt;code&gt;PATH&lt;/code&gt; variable at work — it's a list of directories the shell automatically searches.&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;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment variables in general are how the system and applications share small but important pieces of information, like usernames or language settings, without hardcoding them anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Networking Basics You Can't Skip
&lt;/h2&gt;

&lt;p&gt;A few networking concepts show up constantly in security work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IP address&lt;/strong&gt; — the unique identifier of a device on a network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS&lt;/strong&gt; — translates domain names like &lt;code&gt;google.com&lt;/code&gt; into IP addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gateway&lt;/strong&gt; — the device (usually your router) that connects your local network to the internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the commands to actually see this in action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip a            &lt;span class="c"&gt;# view IP address, interfaces, MAC address&lt;/span&gt;
ip route        &lt;span class="c"&gt;# view gateway and routing info&lt;/span&gt;
ping google.com &lt;span class="c"&gt;# test connectivity&lt;/span&gt;
traceroute facebook.com  &lt;span class="c"&gt;# trace the path packets take&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; tells you if a host is reachable. &lt;code&gt;traceroute&lt;/code&gt; shows you the hops your traffic takes to get there — genuinely useful when you're debugging connectivity or mapping out a network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scripting: Where Automation Begins
&lt;/h2&gt;

&lt;p&gt;Once you're comfortable with commands, the next natural step is stringing them together. That's where &lt;strong&gt;Bash scripting&lt;/strong&gt; comes in:&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="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello From Khalif"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it, make it executable, and run it — congratulations, you've automated your first task.&lt;/p&gt;

&lt;p&gt;Beyond Bash, &lt;strong&gt;Python&lt;/strong&gt; is the real workhorse in cybersecurity. It's used for building network scanners, analyzing logs, automating repetitive tasks, and even developing full security tools. If you're serious about this field, learning Python isn't optional — it's foundational.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI Fits Into All of This
&lt;/h2&gt;

&lt;p&gt;This is the part that genuinely excites me. AI tools are starting to show up as real assistants in the pentesting workflow — not replacements for skill, but accelerators for it.&lt;/p&gt;

&lt;p&gt;Tools like &lt;strong&gt;PentestGPT&lt;/strong&gt; can help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding vulnerabilities&lt;/li&gt;
&lt;li&gt;Explaining confusing tool output&lt;/li&gt;
&lt;li&gt;Suggesting the next step in an assessment&lt;/li&gt;
&lt;li&gt;Writing commands and scripts&lt;/li&gt;
&lt;li&gt;Drafting reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is also increasingly used for threat detection, malware analysis, log analysis, intrusion detection, and phishing detection — anywhere there's a large volume of data that needs fast pattern-matching.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Catch
&lt;/h3&gt;

&lt;p&gt;AI isn't magic, and it definitely isn't infallible. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suggest incorrect commands&lt;/li&gt;
&lt;li&gt;Miss context a human would catch instantly&lt;/li&gt;
&lt;li&gt;Expose sensitive data if used carelessly&lt;/li&gt;
&lt;li&gt;Lack the judgment and intuition a real analyst brings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why the right mental model is: &lt;strong&gt;AI is an assistant, not a replacement.&lt;/strong&gt; It speeds up the boring parts and helps you learn faster, but the judgment calls — and the ethics — stay with the human.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using AI Responsibly
&lt;/h3&gt;

&lt;p&gt;A few ground rules I try to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respect privacy, always&lt;/li&gt;
&lt;li&gt;Never run unauthorized tests or attacks&lt;/li&gt;
&lt;li&gt;Double-check AI-generated output before trusting it&lt;/li&gt;
&lt;li&gt;Stay within legal and ethical boundaries&lt;/li&gt;
&lt;li&gt;Treat AI as a co-pilot, not the pilot&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;None of this is groundbreaking on its own — Linux fundamentals, basic networking, a bit of scripting, and an intro to AI tools. But together, they form the backbone of how modern security work actually gets done. If you're starting out in cybersecurity, getting genuinely comfortable with these basics will take you further than jumping straight into flashy tools.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>networking</category>
      <category>scripting</category>
    </item>
    <item>
      <title>How Stuxnet Broke Into an "Offline" Nuclear Facility — Without Ever Touching the Internet</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Fri, 17 Jul 2026 17:39:20 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/how-stuxnet-broke-into-an-offline-nuclear-facility-without-ever-touching-the-internet-4mm</link>
      <guid>https://dev.to/almahmudkhalif/how-stuxnet-broke-into-an-offline-nuclear-facility-without-ever-touching-the-internet-4mm</guid>
      <description>&lt;p&gt;If you've spent any time in cybersecurity, you've probably heard the Stuxnet story thrown around as some kind of legendary tale. But here's the part that still trips people up: Iran's nuclear facility wasn't even connected to the internet. So how exactly did malware get in?&lt;/p&gt;

&lt;p&gt;Turns out, "air-gapped" doesn't mean "unreachable." It just means attackers have to get a little more creative.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Human Element Nobody Talks About Enough
&lt;/h2&gt;

&lt;p&gt;Stuxnet didn't come in through some flashy remote exploit or a phishing email. It came in through a USB drive.&lt;/p&gt;

&lt;p&gt;Somewhere along the line, an employee or contractor plugged in an infected USB drive into a computer at the facility. That's it. That was the entry point. No firewall to bypass, no network to breach — just a small piece of hardware crossing a physical boundary that no software defense could stop.&lt;/p&gt;

&lt;p&gt;It's a good reminder that "air-gapped" systems are only as secure as the humans and removable media that interact with them. You can isolate a network from the internet, but you can't fully isolate it from people.&lt;/p&gt;

&lt;h2&gt;
  
  
  From One Machine to Industrial Sabotage
&lt;/h2&gt;

&lt;p&gt;Once Stuxnet infected that first local machine, it didn't just sit there. It started spreading laterally through the internal network — the same kind of network segment that was supposed to be "safe" because it wasn't internet-facing.&lt;/p&gt;

&lt;p&gt;Eventually, it found what it was looking for: the centrifuges' operating frequency. Stuxnet was specifically engineered to manipulate that frequency, causing physical damage to the equipment while feeding false readings back to operators so everything &lt;em&gt;looked&lt;/em&gt; normal on the monitoring systems.&lt;/p&gt;

&lt;p&gt;This is what made Stuxnet genuinely different from typical malware at the time. It wasn't just stealing data or crashing systems — it was reaching through code into the physical world and causing real, mechanical destruction. That crossover from digital to physical is a big reason Stuxnet is still studied as a landmark case in industrial control system (ICS) security.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Detour: What About Bloatware?
&lt;/h2&gt;

&lt;p&gt;Slightly different topic, but worth a mention since it's related to system security hygiene: bloatware.&lt;/p&gt;

&lt;p&gt;Bloatware refers to unnecessary pre-installed software that ships with a device — stuff you never asked for and rarely use. Beyond just eating up storage and system resources, bloatware quietly increases your attack surface. Every extra piece of software running on a machine is one more potential entry point for something to go wrong, whether that's a vulnerability, a misconfiguration, or just unnecessary background access to system resources.&lt;/p&gt;

&lt;p&gt;It's a small thing, but it ties back to the same core lesson as Stuxnet: security isn't just about what's connected to the internet. It's about everything that has physical or logical access to a system — from USB drives to pre-loaded software nobody asked for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Stuxnet is a masterclass in why "isolated" systems still need serious security discipline. Air-gapping raises the bar, but it doesn't eliminate risk — it just shifts the attack vector from the network to the physical world. USB policies, endpoint monitoring, and controlling what touches your machines matter just as much as firewalls and network segmentation.&lt;/p&gt;

&lt;p&gt;Over a decade later, it's still one of the best real-world examples of why defense-in-depth isn't optional.&lt;/p&gt;

</description>
      <category>stuxnet</category>
      <category>malware</category>
    </item>
    <item>
      <title>Dark Web vs Dark Net vs TOR — Untangling Three Terms People Use Interchangeably</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Thu, 16 Jul 2026 15:39:15 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/dark-web-vs-dark-net-vs-tor-untangling-three-terms-people-use-interchangeably-383i</link>
      <guid>https://dev.to/almahmudkhalif/dark-web-vs-dark-net-vs-tor-untangling-three-terms-people-use-interchangeably-383i</guid>
      <description>&lt;p&gt;"Dark web," "dark net," and "TOR" get thrown around like they're all the same thing — usually in the same breath, usually with a slightly ominous tone. When I actually looked into it for this assignment, I realized they're related but distinct concepts, each describing a different layer of the same overall picture. Here's how I'd break it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dark Web
&lt;/h2&gt;

&lt;p&gt;The dark web is a hidden part of the internet that isn't indexed by search engines and is usually accessed through the TOR network. So when you Google something, you're searching the "surface web" or "deep web" (like your email inbox or a private database) — none of that touches the dark web at all.&lt;/p&gt;

&lt;p&gt;The dark web exists to provide privacy, anonymity, and secure communication. It's mainly accessed through the TOR browser, and — this part surprised me — it was originally created to protect sensitive government and military communications, not for the reasons it's often associated with today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dark Net
&lt;/h2&gt;

&lt;p&gt;The dark net is a private and anonymous network that hosts hidden websites and services. If the dark web is the &lt;em&gt;content&lt;/em&gt; — the actual hidden sites and pages — the dark net is closer to the &lt;em&gt;infrastructure&lt;/em&gt; underneath it, the network layer that makes accessing that hidden content possible in the first place.&lt;/p&gt;

&lt;p&gt;Like the dark web, the dark net exists to provide anonymity, privacy, and secure communication, and it's accessed using special software such as TOR. It was also created originally to protect sensitive communications and support anonymous communication more broadly.&lt;/p&gt;

&lt;h2&gt;
  
  
  TOR
&lt;/h2&gt;

&lt;p&gt;TOR (&lt;strong&gt;The Onion Router&lt;/strong&gt;) is a network and browser used to hide a user's identity and location online. It's the actual tool that makes accessing the dark web and dark net possible for a regular person.&lt;/p&gt;

&lt;p&gt;TOR exists to provide privacy, anonymity, and secure communication, and is accessed using the TOR browser. Same origin story as the other two: it was originally created to protect sensitive government and military communications, and was later released more broadly.&lt;/p&gt;

&lt;p&gt;The name "onion router" isn't random, either — TOR works by routing your traffic through multiple layers of encrypted relays (like layers of an onion), so no single point in the chain knows both who you are &lt;em&gt;and&lt;/em&gt; what you're accessing at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  So how do these three fit together?
&lt;/h2&gt;

&lt;p&gt;Here's the way I'd summarize the relationship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TOR&lt;/strong&gt; is the &lt;em&gt;tool&lt;/em&gt; — the browser and network protocol that provides anonymity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark net&lt;/strong&gt; is the &lt;em&gt;underlying network&lt;/em&gt; that hidden services run on, typically accessed via tools like TOR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark web&lt;/strong&gt; is the &lt;em&gt;content layer&lt;/em&gt; — the actual hidden websites and pages that live on the dark net, reachable through TOR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They all share the same core purpose (privacy, anonymity, secure communication) and largely overlap in practice, which is exactly why people use the terms so loosely. But technically, each one describes a slightly different piece of the same puzzle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth remembering
&lt;/h2&gt;

&lt;p&gt;None of these three technologies are inherently good or bad — they're neutral tools. The same anonymity that gets misused for illegal activity is also what protects journalists, whistleblowers, activists, and people living under oppressive surveillance regimes. Context is everything. Understanding what these terms actually mean (instead of just associating them with vague "scary internet" vibes) is a much more useful starting point than the popular narrative usually gives credit for.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>tor</category>
    </item>
  </channel>
</rss>
