<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Vijith's Blog | Application Security | Product Security | Bug bounty]]></title><description><![CDATA[Vijith's Blog | Application Security | Product Security | Bug bounty]]></description><link>https://www.vijithvellora.in</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 13:35:03 GMT</lastBuildDate><atom:link href="https://www.vijithvellora.in/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[📱 Installing a Certificate into Android's System Trust Store (Root Required)]]></title><description><![CDATA[Are you trying to intercept HTTPS traffic on Android using tools like Burp Suite or Charles Proxy, but facing SSL certificate issues or pinning? Here's a simple guide to help you import and install a custom certificate (like Burp’s CA cert) into your...]]></description><link>https://www.vijithvellora.in/installing-a-certificate-into-androids-system-trust-store-root-required</link><guid isPermaLink="true">https://www.vijithvellora.in/installing-a-certificate-into-androids-system-trust-store-root-required</guid><category><![CDATA[Android]]></category><category><![CDATA[Security]]></category><category><![CDATA[bugbounty]]></category><category><![CDATA[security testing ]]></category><category><![CDATA[android app security]]></category><dc:creator><![CDATA[Vijith]]></dc:creator><pubDate>Tue, 29 Apr 2025 13:37:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/w33-zg-dNL4/upload/cdbf6278d23fe92babc953dc3ac4c243.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Are you trying to intercept HTTPS traffic on Android using tools like Burp Suite or Charles Proxy, but facing SSL certificate issues or pinning? Here's a simple guide to help you import and install a custom certificate (like Burp’s CA cert) into your Android system — <strong>step by step</strong>.</p>
<p>⚠️ <strong>This requires root access</strong> on the Android device and is intended for <strong>testing purposes only</strong>. Do this on a rooted test device or emulator.</p>
<hr />
<h2 id="heading-why-install-a-certificate">🔧 Why Install a Certificate?</h2>
<p>By default, Android doesn't trust self-signed or custom certificates. To make the device trust your proxy tool (e.g., Burp Suite), you need to install its CA certificate into the <strong>system trusted certificate store</strong>, not just user-installed ones. That’s because many apps (especially those using SSL pinning) ignore user-installed certs.</p>
<hr />
<h2 id="heading-what-you-need">🛠️ What You Need</h2>
<ul>
<li><p>A rooted Android device or emulator</p>
</li>
<li><p>A self-signed certificate (e.g., Burp’s <code>cacert.der</code>)</p>
</li>
<li><p><code>adb</code> installed and configured</p>
</li>
<li><p><code>openssl</code> installed (comes with most Linux/macOS; use Git Bash on Windows)</p>
</li>
</ul>
<hr />
<h2 id="heading-step-by-step-guide">✅ Step-by-Step Guide</h2>
<h3 id="heading-step-1-convert-the-certificate-from-der-to-pem">Step 1: Convert the Certificate from DER to PEM</h3>
<pre><code class="lang-bash">openssl x509 -inform DER -<span class="hljs-keyword">in</span> cacert.der -out cacert.pem
</code></pre>
<hr />
<h3 id="heading-step-2-generate-the-subject-hash">Step 2: Generate the Subject Hash</h3>
<pre><code class="lang-bash">openssl x509 -inform PEM -subject_hash_old -<span class="hljs-keyword">in</span> cacert.pem | head -1
</code></pre>
<p>Rename the PEM file using the hash:</p>
<pre><code class="lang-bash">mv cacert.pem abcd1234.0
</code></pre>
<hr />
<h3 id="heading-step-3-push-the-certificate-to-your-android-device">Step 3: Push the Certificate to Your Android Device</h3>
<pre><code class="lang-bash">adb push abcd1234.0 /sdcard/
</code></pre>
<hr />
<h3 id="heading-step-4-remount-the-system-partition">Step 4: Remount the System Partition</h3>
<pre><code class="lang-bash">adb shell
su
mount -o rw,remount /system
</code></pre>
<hr />
<h3 id="heading-step-5-move-the-certificate-to-system-ca-store">Step 5: Move the Certificate to System CA Store</h3>
<pre><code class="lang-bash">cp /sdcard/abcd1234.0 /system/etc/security/cacerts/
</code></pre>
<hr />
<h3 id="heading-step-6-set-proper-permissions">Step 6: Set Proper Permissions</h3>
<pre><code class="lang-bash">chmod 644 /system/etc/security/cacerts/abcd1234.0
reboot
</code></pre>
<hr />
<h2 id="heading-done">🎉 Done!</h2>
<p>Now Android trusts your custom certificate at the system level. You should be able to intercept HTTPS traffic from most apps using tools like <strong>Burp Suite</strong> or <strong>Charles Proxy</strong>.</p>
<hr />
<h3 id="heading-how-ssl-certificate-trust-works-on-android">🔑 <strong>How SSL Certificate Trust Works on Android</strong></h3>
<ol>
<li><p><strong>System Certificate Store</strong><br /> When you install a certificate in <code>/system/etc/security/cacerts/</code> (i.e., system CA store), Android treats it as <strong>trusted by the OS</strong>. So any app that <strong>relies on the system trust anchors</strong> (i.e., does not do pinning) will trust it automatically.</p>
</li>
<li><p><strong>User Certificate Store</strong><br /> Certificates added via Settings → Security → Install from storage are added to the <strong>user CA store</strong>. Since <strong>Android 7 (Nougat)</strong>, apps <strong>don’t trust user certificates by default</strong> unless explicitly configured with <code>&lt;networkSecurityConfig&gt;</code>.</p>
</li>
</ol>
<h3 id="heading-when-ssl-pinning-does-work-properly">✅ When SSL Pinning <strong>Does Work Properly</strong></h3>
<p>If an app:</p>
<ul>
<li><p>Uses libraries like <strong>TrustKit</strong>, <strong>OkHttp with CertificatePinner</strong>, or native code with <code>SSLContext</code> pinning.</p>
</li>
<li><p>Pins the <strong>public key</strong> or <strong>certificate fingerprint</strong> explicitly.</p>
</li>
<li><p>Validates certs inside the code logic and does not rely on Android’s default trust manager...</p>
</li>
</ul>
<p>... then <strong>your interception will fail</strong>, even with a system-installed cert. You'll see SSL handshake failures or connection timeouts.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[How to Fix "frida-ps: command not found" Error on [macOS]]]></title><description><![CDATA[If you've recently installed Frida tools on your Mac and encountered the following error when running frida-ps -Ua:
-bash: frida-ps: command not found

Don't worry! This common issue occurs because the Frida tools are installed in a local Python dire...]]></description><link>https://www.vijithvellora.in/how-to-fix-frida-ps-command-not-found-error-on-macos</link><guid isPermaLink="true">https://www.vijithvellora.in/how-to-fix-frida-ps-command-not-found-error-on-macos</guid><category><![CDATA[android pentesting]]></category><category><![CDATA[frida]]></category><category><![CDATA[Security]]></category><category><![CDATA[macOS]]></category><category><![CDATA[bug bounty]]></category><dc:creator><![CDATA[Vijith]]></dc:creator><pubDate>Wed, 12 Mar 2025 12:43:56 GMT</pubDate><content:encoded><![CDATA[<p>If you've recently installed Frida tools on your Mac and encountered the following error when running <code>frida-ps -Ua</code>:</p>
<pre><code class="lang-plaintext">-bash: frida-ps: command not found
</code></pre>
<p>Don't worry! This common issue occurs because the Frida tools are installed in a local Python directory that's not yet added to your system's PATH. Here's a quick step-by-step guide on how to fix it.</p>
<hr />
<h2 id="heading-step-1-verify-frida-tools-installation">Step 1: Verify Frida Tools Installation</h2>
<p>First, ensure that Frida tools are installed correctly. Run this command in your terminal:</p>
<pre><code class="lang-bash">pip3 install frida-tools
</code></pre>
<p>If you see output similar to this:</p>
<pre><code class="lang-plaintext">Requirement already satisfied: frida-tools in ./Library/Python/3.9/lib/python/site-packages (13.6.1)
</code></pre>
<p>This means Frida tools are already installed.</p>
<hr />
<h2 id="heading-step-2-locate-the-python-user-scripts-directory">Step 2: Locate the Python User Scripts Directory</h2>
<p>Next, find out where Python installed the scripts by running:</p>
<pre><code class="lang-bash">python3 -m site --user-base
</code></pre>
<p>You should see output like this:</p>
<pre><code class="lang-plaintext">/Users/your_username/Library/Python/3.9
</code></pre>
<p>The scripts (including <code>frida-ps</code>) are typically stored inside a <code>bin</code> folder under this directory:</p>
<pre><code class="lang-plaintext">/Users/your_username/Library/Python/3.9/bin
</code></pre>
<hr />
<h2 id="heading-step-3-add-the-directory-to-your-path">Step 3: Add the Directory to Your PATH</h2>
<p>To make sure your system recognizes the <code>frida-ps</code> command, add this directory to your PATH environment variable.</p>
<p>Open your shell configuration file (<code>~/.bash_profile</code>, <code>~/.zshrc</code>, or <code>~/.bashrc</code>) and add this line at the end:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$PATH</span>:/Users/your_username/Library/Python/3.9/bin
</code></pre>
<p>Replace <code>your_username</code> with your actual Mac username.</p>
<p>Save and close the file.</p>
<hr />
<h2 id="heading-step-4-reload-your-shell-configuration">Step 4: Reload Your Shell Configuration</h2>
<p>To apply changes immediately, run:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">source</span> ~/.bash_profile  <span class="hljs-comment"># or ~/.zshrc depending on your shell</span>
</code></pre>
<hr />
<h2 id="heading-step-5-verify-that-it-worked">Step 5: Verify That It Worked!</h2>
<p>Now run this command again:</p>
<pre><code class="lang-bash">frida-ps -Ua
</code></pre>
<p>If everything worked correctly, you should now see a list of processes or applications without any errors!</p>
<hr />
<h2 id="heading-screenshots-of-the-error-and-fix">Screenshots of the Error and Fix</h2>
<p><strong>Error Screenshot (Before Fix):</strong></p>
<pre><code class="lang-plaintext">Mac:~ user$ frida-ps -Ua
-bash: frida-ps: command not found
</code></pre>
<p><strong>Correct Output (After Fix):</strong></p>
<pre><code class="lang-plaintext">Mac:~ user$ frida-ps -Ua
 PID  Name
----  -------------------------
1234  Safari
5678  Mail
...
</code></pre>
<hr />
<p>That's it! You've successfully resolved the "frida-ps command not found" error on macOS.</p>
]]></content:encoded></item></channel></rss>