<?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: AbbatFariDi</title>
    <description>The latest articles on DEV Community by AbbatFariDi (@abbatfaridi).</description>
    <link>https://dev.to/abbatfaridi</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%2F3904532%2Fcd8610c9-d3e0-4d33-a735-47e8c3e46fb7.png</url>
      <title>DEV Community: AbbatFariDi</title>
      <link>https://dev.to/abbatfaridi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abbatfaridi"/>
    <language>en</language>
    <item>
      <title>Website Security Configuration Audit from Android in 15 Minutes: curl, openssl, dig — No Hacking, No Root</title>
      <dc:creator>AbbatFariDi</dc:creator>
      <pubDate>Wed, 29 Apr 2026 15:41:08 +0000</pubDate>
      <link>https://dev.to/abbatfaridi/website-security-configuration-audit-from-android-in-15-minutes-curl-openssl-dig-no-hacking-1gc5</link>
      <guid>https://dev.to/abbatfaridi/website-security-configuration-audit-from-android-in-15-minutes-curl-openssl-dig-no-hacking-1gc5</guid>
      <description>&lt;h2&gt;
  
  
  What You Can Find From the Outside Without Server Access
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What Is a Configuration Audit
&lt;/h3&gt;

&lt;p&gt;Analysis of publicly available HTTP responses and DNS records — no authentication, no active interference. Only external configuration is assessed: HTTP headers, TLS/SSL, DNS, open ports. No vulnerabilities are exploited. No load on the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;curl&lt;/code&gt; — HTTP server response&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openssl s_client&lt;/code&gt; — TLS connection check&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dig&lt;/code&gt; — DNS record lookup&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dev/tcp&lt;/code&gt; — open port detection without nmap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this runs on Android via Termux, without root.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Target and Method
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Domain:&lt;/strong&gt; any — with the owner's permission. For this audit: an AI-generated product on a Netlify subdomain — &lt;code&gt;adorable-dodol-5ab32d.netlify.app&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Time:&lt;/strong&gt; ~15 minutes. With the automation script — 2–3 minutes from check to PDF report.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Method:&lt;/strong&gt; publicly available data only, no authentication, no server load.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. HTTP Security Headers — Findings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Command:&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;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; - adorable-dodol-5ab32d.netlify.app &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"security&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;frame&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;referrer&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;permissions"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&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;content-type: text/html&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTF-8
strict-transport-security: max-age&lt;span class="o"&gt;=&lt;/span&gt;31536000&lt;span class="p"&gt;;&lt;/span&gt; includeSubDomains&lt;span class="p"&gt;;&lt;/span&gt; preload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;content-type: text/html&lt;/code&gt; — server parameter header, not security-relevant&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;strict-transport-security: max-age=31536000&lt;/code&gt; — HSTS enabled, browser remembers to use HTTPS for 1 year&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includeSubDomains&lt;/code&gt; — HSTS applies to subdomains&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;preload&lt;/code&gt; — domain is in the browser's preloaded HSTS list, HSTS is on by default&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;HSTS (Strict-Transport-Security)&lt;/strong&gt; instructs the browser to always use HTTPS, even if the user types &lt;code&gt;http://&lt;/code&gt;. Protects against MITM attacks. Minimum: &lt;code&gt;max-age=31536000&lt;/code&gt;. Maximum: add &lt;code&gt;includeSubDomains; preload&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;CSP (Content-Security-Policy)&lt;/strong&gt; — a whitelist of allowed sources for scripts, images, etc. Without it, a script from any domain can be injected — the browser will execute it. &lt;strong&gt;Absent on the target — vulnerability.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;content-security-policy: default-src &lt;span class="s1"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; script-src &lt;span class="s1"&gt;'self'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Formally valid but practically useless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;content-security-policy: default-src *
content-security-policy: script-src 'unsafe-inline'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;X-Frame-Options&lt;/strong&gt; — prevents the page from being embedded in an iframe on another site. Without it, clickjacking is possible: an attack where a malicious site hides the target inside an iframe to trick user interactions. &lt;strong&gt;Absent — vulnerability.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;x-frame-options: DENY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or (allow same domain only):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;x-frame-options: SAMEORIGIN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;X-Content-Type-Options&lt;/strong&gt; — prevents the browser from guessing file types. Without it, the browser may interpret a file differently from its declared &lt;code&gt;content-type&lt;/code&gt;, potentially executing a malicious file as a script. &lt;strong&gt;Absent — vulnerability.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;x-content-type-options: nosniff
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Referrer-Policy&lt;/strong&gt; — controls what URL data the browser sends when following a link. Without it, URLs containing tokens or endpoints (e.g. &lt;code&gt;https://.../path?token=secret&lt;/code&gt;) leak to the next site. &lt;strong&gt;Absent — vulnerability.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;referrer-policy: strict-origin-when-cross-origin
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sends only the origin (&lt;code&gt;https://example.com/&lt;/code&gt;) on cross-origin navigation — no path, no parameters. If the connection downgrades from HTTPS to HTTP, no referrer is sent at all.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Permissions-Policy&lt;/strong&gt; — defines which browser APIs the site may use. Without it, an embedded iframe can request camera, microphone, or geolocation access from the user. &lt;strong&gt;Absent — vulnerability.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;permissions-policy: camera=(), microphone=(), geolocation=()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Empty parentheses = denied for everyone.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. TLS — Findings
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Protocol and Cipher
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; adorable-dodol-5ab32d.netlify.app:443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-servername&lt;/span&gt; adorable-dodol-5ab32d.netlify.app 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"Protocol|Cipher"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&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;New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Protocol  : TLSv1.3
Cipher    : TLS_AES_128_GCM_SHA256
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;TLSv1.3&lt;/code&gt; — current standard ✔&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AES_128&lt;/code&gt; — symmetric encryption, 128-bit key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GCM&lt;/code&gt; — Galois/Counter Mode: combined encryption + authentication (AEAD), protects against data tampering&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SHA-256&lt;/code&gt; — hash function for integrity verification and handshake&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TLS_AES&lt;/code&gt; — Forward Secrecy built in by default in TLS 1.3 ✔&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TLS 1.2 is acceptable with strong ciphers. TLS 1.0/1.1 — deprecated, publicly known vulnerabilities, disabled in modern browsers.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Forward Secrecy&lt;/strong&gt; generates a unique key for each TLS session, stored nowhere. Traffic intercepted in the past cannot be decrypted even if a private key is later compromised. In TLS 1.3, this is guaranteed by default via &lt;code&gt;TLS_AES&lt;/code&gt; ciphers.&lt;/p&gt;




&lt;h4&gt;
  
  
  Weak Ciphers
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; adorable-dodol-5ab32d.netlify.app:443 &lt;span class="nt"&gt;-cipher&lt;/span&gt; RC4 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;Cipher
&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; adorable-dodol-5ab32d.netlify.app:443 &lt;span class="nt"&gt;-cipher&lt;/span&gt; 3DES 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;Cipher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Empty output — server refuses RC4 and 3DES. ✔&lt;/p&gt;

&lt;h4&gt;
  
  
  Certificate Expiry
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; adorable-dodol-5ab32d.netlify.app:443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-servername&lt;/span&gt; adorable-dodol-5ab32d.netlify.app 2&amp;gt;/dev/null | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;notBefore&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Feb 16 00:00:00 2026 GMT&lt;/span&gt;
&lt;span class="py"&gt;notAfter&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Mar 19 23:59:59 2027 GMT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;notAfter&lt;/code&gt; is in the past — vulnerability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Self-Signed Certificate
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; adorable-dodol-5ab32d.netlify.app:443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-servername&lt;/span&gt; adorable-dodol-5ab32d.netlify.app 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"self signed&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;verify error"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Empty output — certificate issued by a trusted CA (Let's Encrypt, DigiCert, etc.) ✔&lt;br&gt;&lt;br&gt;
If output shows &lt;code&gt;verify error:num=18:self signed certificate&lt;/code&gt; — vulnerability.&lt;/p&gt;


&lt;h3&gt;
  
  
  6. DNS / Email Protection
&lt;/h3&gt;

&lt;p&gt;Applicable to owned domains only. Subdomain audits cannot assess email configuration. General rules below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPF (Sender Policy Framework)&lt;/strong&gt; — lists servers authorized to send mail from the domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&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;-all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reject all others (strict)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Softfail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Neutral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;+all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Accept all — dangerous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No output&lt;/td&gt;
&lt;td&gt;SPF not configured&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a non-mail domain with no listed servers: &lt;code&gt;-all&lt;/code&gt; alone is correct.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;DKIM (DomainKeys Identified Mail)&lt;/strong&gt; — cryptographic signature on outgoing mail, verified by the recipient via DNS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT selector._domainkey.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The selector is chosen by the domain owner during DKIM setup. Without knowing the exact selector, DKIM presence cannot be reliably confirmed from the outside.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;DMARC (Domain-based Message Authentication, Reporting and Conformance)&lt;/strong&gt; — policy for mail that fails SPF or DKIM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT _dmarc.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&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;p=none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reporting only — weak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=quarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send to spam — acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reject — full protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No output&lt;/td&gt;
&lt;td&gt;DMARC not configured&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Additional flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;adkim=s&lt;/code&gt; / &lt;code&gt;aspf=s&lt;/code&gt; — strict match, subdomains not accepted&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;adkim=r&lt;/code&gt; / &lt;code&gt;aspf=r&lt;/code&gt; — relaxed, subdomains allowed (bypass risk)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sp=reject&lt;/code&gt; — protect subdomains without their own DMARC&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. Open Ports
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;timeout &lt;/span&gt;5 bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"echo &amp;gt;/dev/tcp/adorable-dodol-5ab32d.netlify.app/PORT"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="se"&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;"open"&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;"closed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Unexpected open =&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;Normal if redirecting to 443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;Normal if key-only access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;FTP&lt;/td&gt;
&lt;td&gt;Vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3306&lt;/td&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;Vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5432&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;Vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8080&lt;/td&gt;
&lt;td&gt;Alt HTTP&lt;/td&gt;
&lt;td&gt;Normal with access control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8443&lt;/td&gt;
&lt;td&gt;Alt HTTPS&lt;/td&gt;
&lt;td&gt;Normal with access control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Check redirect from 80 to 443:&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;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; http://adorable-dodol-5ab32d.netlify.app | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"location&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;301&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;302"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;HTTP/1.1 301&lt;/code&gt; or &lt;code&gt;302&lt;/code&gt; — normal. No output — vulnerability.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Summary
&lt;/h3&gt;

&lt;p&gt;Vulnerabilities found in 10–15 minutes without server access:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Open ports: 21, 3306, 5432&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;No Content-Security-Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;No X-Frame-Options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;No X-Content-Type-Options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;No Referrer-Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;No Permissions-Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Full audit report available at: &lt;a href="https://github.com/AbbatFariDi/Security-audits/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/AbbatFariDi/Security-audits/blob/main/README.md&lt;/a&gt;&lt;br&gt;&lt;br&gt;
*I offer external configuration audits starting at $10. DM or find me on Kwork / Upwork.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>cybersecurity</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
