[{"content":" ","date":"8 April 2026","externalUrl":null,"permalink":"/","section":"","summary":"","title":"","type":"page"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/cysec/","section":"","summary":"","title":"","type":"cysec"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/categories/cysec/","section":"Categories","summary":"","title":"Cysec","type":"categories"},{"content":" TCP Flags # TCP header memiliki beberapa bit flag yang dipakai untuk mengatur perilaku koneksi. Saat sebuah flag bernilai 1, flag tersebut aktif. Contohnya, paket SYN hanya mengaktifkan flag SYN, sedangkan paket SYN/ACK mengaktifkan flag SYN dan ACK.\nDaftar flag TCP yang umum:\nURG - Urgent ACK - Acknowledgement PSH - Push RST - Reset SYN - Synchronize FIN - Finish Flag-flag inilah yang dimanipulasi untuk membedakan berbagai jenis TCP scan.\nJenis TCP Scan # SYN Scan # Argumen: -sS\nSYN scan adalah default scan Nmap, tetapi membutuhkan privileged user seperti root atau sudo. Mekanismenya sederhana: Nmap mengirim SYN. Jika target membalas dengan SYN/ACK, port dianggap terbuka. Setelah itu Nmap membalas dengan RST, bukan ACK, supaya koneksi TCP tidak benar-benar terbentuk dan logging di sisi target lebih minim.\nTCP Connect Scan # Argumen: -sT\nUntuk user tanpa privilege, TCP Connect Scan biasanya menjadi pilihan default. Scan ini melakukan TCP 3-way handshake penuh: SYN, SYN/ACK, lalu ACK. Jika koneksi berhasil terbentuk, port dinyatakan terbuka.\nUDP Scan # Argumen: -sU\nLogika singkat UDP scan, dengan asumsi tidak ada firewall:\nHost mengirim paket UDP. Jika target terbuka, host umumnya tidak mendapat balasan. Jika target tertutup, host biasanya menerima ICMP port unreachable (ICMP type 3). State Port pada Hasil Nmap # Secara dasar, sebuah port biasanya dipahami sebagai open atau closed. Nmap memberi state yang lebih detail:\nOpen - ada service yang listening di port tersebut. Closed - host reachable, tidak diblok firewall, tetapi tidak ada service yang listening. Filtered - port tidak dapat dipastikan karena kemungkinan diblok firewall atau filter lain. Open|Filtered - Nmap tidak bisa memastikan apakah port open atau filtered. Closed|Filtered - Nmap tidak bisa memastikan apakah port closed atau filtered. Unfiltered - port reachable, tetapi Nmap tidak bisa memastikan apakah open atau closed; state ini sering muncul saat menggunakan ACK scan dengan argumen -sA. Scope dan Performa Scanning # Secara default, Nmap memindai 1000 top port.\nOpsi yang umum dipakai:\n-F untuk fast mode. -p100-150 untuk menentukan range port. -p10,20,30 untuk menentukan daftar port tertentu. -T0 sampai -T5 untuk timing scan, dari lambat ke cepat. -T3 adalah normal. Untuk mengatur rate dan parallelism:\n--min-rate=[number] --max-rate=[number] --min-parallelism=[number] --max-parallelism=[number] ","date":"8 April 2026","externalUrl":null,"permalink":"/cysec/nmap-2/","section":"","summary":"","title":"Network Mapper 2","type":"cysec"},{"content":" Host Discovery dengan Nmap # Sebelum melakukan port scanning secara masif, lakukan dulu host discovery. Tujuannya sederhana: mencari tahu host mana yang hidup dan mana yang tidak. Scanning ke host yang tidak aktif hanya akan membuang waktu, resource, dan menimbulkan noise yang tidak perlu di level jaringan.\nMetode paling dasar memang ping, tetapi Nmap juga mendukung ARP, ICMP, TCP, dan UDP untuk host discovery.\nDasar Nmap # Basic usage:\nnmap [target] nmap [target1] [target2] ... nmap 10.10.10.10-20 nmap 10.10.10.10/29 nmap 10.10.0-255.101-125 nmap -iL addresslist.txt nmap -sL [target] ARP Scan # ARP scanning mengirim ARP request ke setiap device dalam satu subnet. Range target didapat dari hasil AND antara IP address dan network mask host. ARP scanning tidak bisa dilakukan antar subnet karena ARP adalah link-layer protocol dan tidak dirutekan ke subnet lain.\nSpesifik untuk ARP scan host discovery:\nnmap -PR -sn [target] Traffic yang digenerate oleh host ketika melakukan ARP scan, dicapture menggunakan Wireshark:\nAda tools yang spesifik untuk melakukan ARP scan, yaitu arp-scan. Info lengkapnya bisa dibaca di arp-scan User Guide.\nTools yang berbeda, meskipun memiliki tujuan yang sama, kadang menghasilkan output yang berbeda. Contoh perbedaan scan dengan arp-scan dan Nmap: Secara default, ketika host discovery dengan Nmap dijalankan dengan root atau sudoers, Nmap akan menggunakan ARP request. Jika target berada di luar subnet, Nmap akan menggunakan TCP dan ICMP. Jika dijalankan oleh non-sudoers, Nmap akan menggunakan TCP handshake. Ini terjadi karena root memiliki izin untuk membuat raw socket dan menyusun paket Ethernet sendiri, sehingga bisa memakai protokol layer 2 seperti ARP secara langsung. User biasa hanya punya system call yang lebih terbatas. Perbedaan metode ini berdampak pada output yang didapatkan.\nmenjalankan nmap dengan sudo ICMP Scanning # Secara konsep, ini sesederhana melakukan ping (echo / ICMP type 8) dan menunggu respon dengan ICMP type 0 dari target. Namun, banyak firewall memblokir ICMP echo.\nGunakan -PE untuk ICMP scanning, dan -sn untuk menghindari port scanning ke target.\nnmap -PE -sn [target] ICMP scanning tidak menghasilkan MAC address host target jika target berada di subnet yang berbeda.\nKarena ICMP echo type 8 banyak diblokir firewall, Nmap juga menyediakan penggunaan ICMP type 13 (timestamp request), kemudian menunggu ICMP timestamp reply (type 14). Ada juga ICMP type 17 (address mask query), kemudian menunggu ICMP address mask reply (type 18).\nGunakan -PP untuk memakai metode timestamp request.\nnmap -PP -sn [target] Gunakan -PM untuk memakai metode address mask query.\nnmap -PM -sn [target] TCP dan UDP Scanning # Koneksi TCP terbentuk setelah 3-way handshake. Pada SYN scan, host hanya akan berhenti pada SYN/ACK. Itu sudah cukup untuk mengetahui apakah hostnya hidup atau tidak tanpa tercatat di log aplikasi.\nUntuk melakukan SYN scan, gunakan -PS diikuti port number-nya.\nnmap -PS21 -sn [target] nmap -PS21-25 -sn [target] nmap -PS80,443,8080,8443 -sn [target] ACK scan konsepnya mirip SYN scan, tetapi menggunakan ACK. Jika target reply, biasanya dengan RST, maka target dinyatakan live.\nGunakan -PA untuk ACK scan.\nsudo nmap -PA21 -sn [target] sudo nmap -PA21-25 -sn [target] sudo nmap -PA80,443,8080,8443 -sn [target] ACK scan hanya bisa dilakukan oleh sudoers. -PS masih bisa digunakan tanpa sudo, tetapi akan menyelesaikan 3-way handshake. Tanpa hak khusus, prosesnya tetap akan mengikuti alur TCP normal.\nUDP Ping # UDP ping tidak mengharapkan reply dari target, tetapi jika port tujuan tertutup, diharapkan mendapatkan ICMP port unreachable dari host target. Itu menjadi indikasi bahwa target live.\nUntuk UDP scan, gunakan -PU.\nnmap -PU -sn [target] Masscan # Tools scanning lain ada masscan. Tool ini lebih berfokus ke kecepatan daripada jumlah dan akurasi informasi yang didapat. Contoh usage:\nmasscan [target] -p443 masscan 10.10.10.10/24 -p443 ","date":"31 March 2026","externalUrl":null,"permalink":"/cysec/nmap-1/","section":"","summary":"","title":"Network Mapper 1","type":"cysec"},{"content":"","date":"28 March 2026","externalUrl":null,"permalink":"/doc/","section":"","summary":"","title":"","type":"doc"},{"content":"Active Reconnaissance mengharuskan interaksi dengan target. bisa jadi panggilan telepon untuk social engineering, pengecekan port ssh yang terbuka, mengunjungi website target – basically, apapun yang berpotensi meninggalkan log. Secara legalitas, Active Recon membutuhkan izin langsung dari target.\nTools paling dasar untuk melakukan Active Recon adalah web browser – siapa yang gapernah pake coba, kita bisa menggunakan browser untuk terhubung ke server dengan http maupun https termasuk menggunakan custom port. Active recon di web browser didukung dengan adanya developer tools, klik kanan kemudian pilih inspect. ada juga beberapa extension yang bisa membantu seperti wappalyzer.\nping traceroute/tracert telnet netcat\nping adalah tools sederhana untuk mengecek apakah sebuah komputer bisa berkomunikasi dengan komputer lain menggunakan icmp\nping [tujuan] tujuan bisa berupa hostname atau ip address\ntraceroute digunakan untuk mengetahui rute yang diambil sebuah paket menuju ke host lain. hasil dari traceroute ketika digunakan di internet mungkin berubah karena adanya dynamic routing dan keadaan lain yang berpengaruh.\ntraceroute [tujuan] traceroute melakukan pengiriman paket icmp dengan ttl mulai dari 1 dan terus ditambah sampai host tujuan tercapai. dengan cara ini pada pengiriman pertama maka router pertama akan mengirimkan ttl exceeded, pengiriman kedua maka router kedua akan mengirimkan ttl exceeded dan seterusnya. dalam paket ttl exceeded akan disertakan juga ip routernya, kemudian paket-paket ini disusun membentuk suatu rute beserta waktu tempuhnya.\ntelnet dulunya digunakan sebagai remote access ke komputer lain tapi bisa juga dipakai untuk terhubung ke service lain dan mengambil \u0026lsquo;banner\u0026rsquo; servicenya.\ntelnet [tujuan] [port] // contoh untuk koneksi ke http askarhabibulloh@laptop ~ % telnet 10.48.186.174 80 Trying 10.48.186.174... Connected to 10.48.186.174. Escape character is \u0026#39;^]\u0026#39;. GET / HTTP/1.1 host: telnet HTTP/1.1 200 OK Date: Sun, 29 Mar 2026 00:14:22 GMT Server: Apache/2.4.61 (Debian) Last-Modified: Mon, 30 Aug 2021 12:09:24 GMT ETag: \u0026#34;15-5cac5b436ddfa\u0026#34; Accept-Ranges: bytes Content-Length: 21 Content-Type: text/html Telnet to port 80... Connection closed by foreign host. netcat, mirip-mirip telnet yang bisa konek ke port yang sedang listening, dia juga punya mode server (listening) dan mendukung tcp udp.\nnc [tujuan] [port] // contoh untuk terhubung ke http askarhabibulloh@laptop ~ % nc 10.49.134.133 80 GET / HTTP/1.1 host: netcat HTTP/1.1 200 OK Server: nginx/1.22.1 Date: Sun, 29 Mar 2026 00:26:00 GMT Content-Type: text/html Content-Length: 867 Last-Modified: Fri, 08 Oct 2021 04:30:27 GMT Connection: keep-alive ETag: \u0026#34;615fc963-363\u0026#34; Accept-Ranges: bytes \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Welcome to nginx on Debian!\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; ...(redacted) netcat mode listening\nnc -lp [port] nc -lvnp [port] nc -vlnp [port] // yang penting sebelum [port] harus huruf option \u0026#39;p\u0026#39; // menggunakan known port biasanya membutuhkan akses root karena netcat sudah sangat tua, banyak yang membuat successornya seperti Ncat, Socat, Pwncat, Rustcat.\n","date":"28 March 2026","externalUrl":null,"permalink":"/cysec/active-recon/","section":"","summary":"","title":"Active Reconnaissance Essentials","type":"cysec"},{"content":"","date":"28 March 2026","externalUrl":null,"permalink":"/categories/doc/","section":"Categories","summary":"","title":"Doc","type":"categories"},{"content":"Reconnaissance atau sering disingkat recon adalah proses information gathering mengenai target. Ada 2 jenis, yaitu Active dan Passive.\nPassive Reconnaissance berarti mengumpulkan informasi tanpa bersentuhan langsung dengan target, baik secara digital maupun fisik. Contohnya dalam bentuk digital: mengumpulkan DNS record, whois lookup, mengecek job posting yang berhubungan dengan perusahaan target, membaca artikel yang berkaitan dengan target. Secara fisik: mengawasi gedung target dari kafe di sekitar lokasi, mengawasi target dari CCTV publik. Singkatnya, semua hal yang tidak berpotensi meninggalkan jejak di sisi target.\nActive Reconnaissance sebaliknya, secara alamiah bersifat invasif, berisiko mengundang alert di sisi target. Beberapa contoh Active Recon dalam bentuk digital: mencoba terkoneksi ke server target dalam bentuk apa pun (HTTP, FTP, SSH, ICMP), melakukan panggilan dengan tujuan social engineering (tapi masih dalam tahap information gathering). Dalam hal fisik: masuk ke gedung target, mungkin jika gedungnya memang untuk publik, atau berpura-pura menjadi petugas panggilan. Tanpa legalitas yang jelas, melakukan active recon bisa mengarah ke permasalahan hukum.\nAda beberapa hal yang berada di titik abu-abu, misalnya mengunjungi akun LinkedIn target—kadang ada notifikasi bahwa sebuah akun telah mengunjungi akun saya. Meskipun LinkedIn bukan sistem milik target, hal ini tetap meninggalkan jejak, begitu juga melakukan interaksi dengan orang-orang yang berkaitan dengan target baik secara digital maupun fisik. Atau mengunjungi website organisasi target, dalam titik tertentu bisa meninggalkan jejak dan memicu alert, tapi tidak selalu.\nDasar-dasar Passive Reconnaissance # whois [domain-name] Untuk mendapatkan informasi dasar tentang domain target.\nnslookup [OPTIONS] DOMAIN/SUBDOMAIN [DNS_SERVER] Contoh OPTIONS: -type=MX, -type=A, -type=TXT.\nGunakan man nslookup untuk melihat konteks lengkapnya.\nBagian yang ditulis di dalam [] berarti opsional.\nPerintah ini digunakan untuk mengambil DNS record.\nbisa juga pakai dig:\ndig [@SERVER] DOMAIN/SUBDOMAIN [TYPE] Contoh:\ndig example.com txt dig bisa dibilang lebih independen dan biasanya memberi output yang lebih lengkap, karena menggunakan library sendiri, bukan resolver milik sistem operasi.\nAda juga dnsdumpster.com yang lebih advanced, tetapi penggunaan dasar nslookup dan dig tetap penting jika layanan tersebut sedang down.\nAda juga Shodan, yaitu mesin pencari untuk perangkat, layanan, dan exposure di internet. Ini berguna untuk mencari jejak target tanpa harus berinteraksi langsung dengan sistemnya.\nTujuan dari tools-tools ini adalah melakukan information gathering tentang target tanpa terhubung langsung dengan mereka.\n","date":"28 March 2026","externalUrl":null,"permalink":"/cysec/passive-recon/","section":"","summary":"","title":"Passive Reconnaissance Essentials","type":"cysec"},{"content":" Wiring ESP32 ke HY-SRF05 # Di ESP32, sensor ini bisa diberi catu dari pin 5V atau VIN supaya modul bekerja normal dan jangkauan pengukuran tetap maksimal.\nHY-SRF05 Pin ESP32 DevKit Pin Fungsi di Kode VCC VIN (5V) Power Trig GPIO 27 TRIG_PIN Echo GPIO 13 ECHO_PIN GND GND Ground Kode Minimal # Saya pakai Serial.begin(115200) supaya output di Serial Monitor lebih nyaman dibaca di ESP32.\n// Definisi pin sesuai skema wiring #define TRIG_PIN 27 #define ECHO_PIN 13 void setup() { Serial.begin(115200); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.println(\u0026#34;--- Test Sensor HY-SRF05 dengan ESP32 ---\u0026#34;); } void loop() { // Kirim trigger ke sensor digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Baca durasi pantulan long duration = pulseIn(ECHO_PIN, HIGH); // Konversi durasi menjadi jarak dalam cm float distance = duration / 58.2; Serial.print(\u0026#34;Jarak: \u0026#34;); if (distance \u0026lt;= 0 || distance \u0026gt; 400) { Serial.println(\u0026#34;Di luar jangkauan!\u0026#34;); } else { Serial.print(distance); Serial.println(\u0026#34; cm\u0026#34;); } delay(500); } Catatan dan Tips # Kalau kode memakai 115200, pastikan Serial Monitor di Arduino IDE juga diatur ke 115200. Pin Echo pada HY-SRF05 mengeluarkan sinyal 5V, sedangkan ESP32 hanya aman di level 3.3V. Untuk tes singkat biasanya masih bisa langsung dicoba, tetapi untuk penggunaan jangka panjang sebaiknya tambahkan pembagi tegangan, misalnya resistor 1k Ohm dan 2k Ohm. Kalau hasil bacaan sering nol atau tidak stabil, cek ulang kabel GND, catu daya sensor, dan posisi sensor terhadap objek. ","date":"28 March 2026","externalUrl":null,"permalink":"/doc/testing-sensor-hy-srf05/","section":"","summary":"","title":"Tes Sensor HY-SRF05 dengan ESP32","type":"doc"},{"content":"Tutorial ini merupakan langkah dasar hardening VPS Ubuntu: membuat user non-root, memberi akses sudo, memindahkan akses SSH, lalu menonaktifkan login root dan autentikasi password.\nPenting: pastikan Anda sudah bisa login menggunakan SSH key ke user baru sebelum menonaktifkan password authentication. Jika tidak, Anda berisiko terkunci dari VPS.\nDaftar Isi # 1. Buat user baru 2. Berikan akses sudo 3. Pindahkan akses SSH 4. Uji login user baru 5. Hardening SSH 6. Verifikasi konfigurasi 7. Restart dan uji ulang 1. Buat user baru # Jalankan perintah berikut saat Anda masih login sebagai root:\nadduser userbaru Anda akan diminta membuat password baru. Gunakan password yang kuat, lalu tekan Enter untuk isian seperti full name, room number, dan data lain jika tidak diperlukan.\n2. Berikan akses sudo # Tambahkan user baru ke grup sudo agar bisa menjalankan perintah administratif tanpa login sebagai root:\nusermod -aG sudo userbaru 3. Pindahkan akses SSH # Jika Anda masuk ke VPS menggunakan SSH key, salin direktori .ssh ke user baru agar login tetap bisa dilakukan. Jika Anda hanya memakai password, langkah ini bisa dilewati, tetapi SSH key tetap lebih disarankan.\nrsync --archive --chown=userbaru:userbaru ~/.ssh /home/userbaru Pastikan folder target /home/userbaru sudah ada. Pada instalasi Ubuntu standar, folder tersebut biasanya otomatis dibuat saat adduser dijalankan.\n4. Uji login user baru # Sebelum logout dari root, buka terminal baru di komputer Anda dan coba login memakai user baru:\nssh userbaru@ip_address_vps_kamu Setelah berhasil masuk, uji akses sudo dengan:\nsudo whoami Jika hasilnya root, berarti user baru sudah punya akses administratif dengan benar.\n5. Hardening SSH # Setelah user baru berhasil digunakan, lanjutkan dengan mengamankan SSH. Langkah ini akan mematikan login root dan menonaktifkan autentikasi password.\nBuka file konfigurasi SSH daemon:\nsudo nano /etc/ssh/sshd_config Cari dan ubah pengaturan berikut. Jika ada tanda # di awal baris, hapus agar konfigurasi aktif.\nPermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes Simpan perubahan dengan Ctrl + O, tekan Enter, lalu keluar dengan Ctrl + X.\n6. Verifikasi konfigurasi # Sebelum restart service, cek dulu apakah ada kesalahan sintaks:\nsudo sshd -t Jika tidak ada output error, konfigurasi SSH sudah valid.\n7. Restart dan uji ulang # Terapkan perubahan dengan me-restart service SSH:\nsudo systemctl restart ssh Jangan tutup sesi terminal yang masih aktif. Buka terminal baru dan lakukan pengujian berikut:\n# Login sebagai root seharusnya ditolak ssh root@ip_address_vps # Login sebagai user biasa seharusnya tetap berhasil dengan SSH key ssh userbaru@ip_address_vps Jika login sebagai user baru berhasil dan sudo whoami tetap mengembalikan root, maka hardening dasar SSH sudah selesai dengan aman.\n","date":"27 March 2026","externalUrl":null,"permalink":"/doc/basic-hardening-ubuntu-vps/","section":"","summary":"","title":"Basic Hardening Ubuntu VPS","type":"doc"},{"content":"Tutorial ini menjelaskan cara setup SSH Auth Key untuk user [your-username] di VPS Ubuntu.\nDaftar Isi # 1. Generate SSH key di komputer lokal 2. Pasang public key ke VPS 3. Cara login ke VPS 4. Tips keamanan 1. Generate SSH key di komputer lokal # Langkah pertama adalah membuat key di komputer lokal. Tutorial ini menggunakan algoritma ed25519 karena modern, cepat, dan aman.\nmacOS dan Linux # Buka Terminal lalu jalankan:\nssh-keygen -t ed25519 -C \u0026#34;kunci-vps-saya\u0026#34; Saat muncul prompt Enter file in which to save the key, jangan langsung menekan Enter jika Anda ingin memakai nama file custom. Gunakan nama baru agar tidak menimpa key lama.\nContoh lokasi file:\n/home/[your-username]/.ssh/vps_ubuntu /Users/[your-username]/.ssh/vps_ubuntu Masukkan passphrase jika ingin keamanan tambahan, lalu lanjutkan.\nWindows # Windows modern sudah menyertakan OpenSSH secara bawaan. Buka PowerShell lalu jalankan:\nssh-keygen -t ed25519 -C \u0026#34;kunci-vps-saya\u0026#34; Saat diminta lokasi file, masukkan nama custom, misalnya:\nC:\\Users\\[your-username]\\.ssh\\vps_ubuntu 2. Pasang public key ke VPS # Setelah key dibuat, Anda akan mendapatkan dua file:\nvps_ubuntu sebagai private key, simpan rahasia. vps_ubuntu.pub sebagai public key, file ini yang dipasang ke server. Cara otomatis di macOS dan Linux # Gunakan ssh-copy-id untuk menyalin public key ke VPS:\nssh-copy-id -i ~/.ssh/vps_ubuntu.pub [your-username]@[ip-server] Sistem akan meminta password user [your-username] satu kali untuk proses penyalinan.\nCara manual di Windows atau jika otomatis gagal # Tampilkan isi public key di komputer lokal:\ncat ~/.ssh/vps_ubuntu.pub Salin teks yang muncul, biasanya diawali dengan ssh-ed25519.\nLogin ke VPS dengan password biasa:\nssh [your-username]@[ip-server] Di dalam VPS, jalankan perintah berikut:\nmkdir -p ~/.ssh chmod 700 ~/.ssh echo \u0026#34;PASTE_ISI_PUBLIC_KEY_DISINI\u0026#34; \u0026gt;\u0026gt; ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys 3. Cara login ke VPS # Setelah key terpasang, Anda bisa masuk ke VPS dengan dua cara.\nA. Login langsung # Gunakan flag -i untuk menunjuk lokasi private key:\nssh -i ~/.ssh/vps_ubuntu [your-username]@[ip-server] B. Menggunakan file config # Cara ini lebih praktis karena Anda tidak perlu mengetik IP dan lokasi key setiap kali login.\nBuat atau edit file config di komputer lokal:\n~/.ssh/config Isi dengan konfigurasi berikut:\nHost vps-saya HostName [ip-server] User [your-username] IdentityFile ~/.ssh/vps_ubuntu Simpan lalu keluar. Setelah itu, Anda cukup menjalankan:\nssh vps-saya 4. Tips keamanan # Jika login dengan SSH key sudah berhasil, sangat disarankan untuk mematikan login password di VPS dengan mengubah PasswordAuthentication yes menjadi PasswordAuthentication no di file /etc/ssh/sshd_config.\nJangan sampai kehilangan private key Anda. Jika password login dimatikan dan private key hilang, Anda bisa terkunci dari server sendiri.\n","date":"27 March 2026","externalUrl":null,"permalink":"/doc/generate-ssh-key/","section":"","summary":"","title":"Generate dan Instalasi SSH Key untuk Autentikasi Server","type":"doc"},{"content":"Untuk menjalankan extension berbasis Python di Burp Suite, Anda perlu menambahkan Jython Standalone JAR. Jython adalah implementasi Python berbasis Java, sehingga Burp Suite bisa memakai modul Python untuk extension tertentu.\nLangkah-langkah # 1. Unduh Jython Standalone JAR # Unduh file Jython Standalone dari situs resmi Jython: https://www.jython.org/download, lalu simpan file JAR tersebut di lokasi yang mudah Anda temukan.\n2. Buka pengaturan Extensions di Burp Suite # Jalankan Burp Suite, lalu buka menu Extensions. Setelah itu, masuk ke tab Settings di bagian Extensions.\n3. Atur Python environment # Scroll ke bagian Python environment. Di kolom Location of Jython standalone JAR file, masukkan path ke file Jython JAR yang sudah Anda unduh. Selain mengetik path secara manual, Anda juga bisa klik tombol Select File untuk memilih file JAR secara otomatis.\nContoh:\n/Users/namauser/Downloads/jython-standalone.jar 4. Verifikasi konfigurasi # Setelah path diisi, simpan pengaturan tersebut. Jika konfigurasi sudah benar, Burp Suite akan mengenali Jython dan Anda bisa menggunakan extension Python yang membutuhkan runtime tersebut.\nHasil # Setelah Jython terpasang, Burp Suite dapat menjalankan extension berbasis Python dengan lebih fleksibel. Ini berguna untuk meningkatkan kemampuan pengujian keamanan dan analisis aplikasi web.\nCatatan # Proses menambahkan Jython ke Burp Suite sama di semua sistem operasi, karena Java bersifat lintas platform.\n","date":"27 March 2026","externalUrl":null,"permalink":"/doc/install-jython-burpsuite/","section":"","summary":"","title":"Instalasi Jython pada Burpsuite Extension","type":"doc"},{"content":"Tutorial ini menjelaskan cara menyiapkan Nginx reverse proxy untuk subdomain yoursubdomain.example.com ke aplikasi yang berjalan di localhost:9000, lalu mengamankannya dengan SSL/HTTPS menggunakan Certbot dan Let\u0026rsquo;s Encrypt.\nAsumsi # Server Linux seperti Ubuntu atau Debian sudah terpasang Nginx. Aplikasi berjalan di localhost:9000 pada server yang sama. DNS record A untuk yoursubdomain.example.com sudah mengarah ke IP publik server. Firewall UFW sudah mengizinkan trafik HTTP di port 80 dan HTTPS di port 443. Daftar Isi # 1. Instal Certbot 2. Buka firewall 3. Buat konfigurasi reverse proxy 4. Aktifkan konfigurasi 5. Uji Nginx 6. Pasang SSL dengan Certbot 7. Verifikasi dan uji akses 8. Cek pembaruan otomatis 1. Instal Certbot # Instal Certbot dan plugin Nginx yang dibutuhkan pada sistem berbasis Debian atau Ubuntu.\nsudo apt update sudo apt install certbot python3-certbot-nginx -y 2. Buka firewall # Jika Anda menggunakan UFW, pastikan profil Nginx sudah diizinkan.\nsudo ufw allow \u0026#39;Nginx Full\u0026#39; sudo ufw reload 3. Buat konfigurasi reverse proxy # Buat file server block untuk subdomain Anda di direktori sites-available.\nsudo nano /etc/nginx/sites-available/yoursubdomain.example.com Lalu isi dengan konfigurasi berikut.\nserver { listen 80; listen [::]:80; server_name yoursubdomain.example.com; location / { proxy_pass http://localhost:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } Jika aplikasi Anda menerima upload besar, Anda bisa menambahkan client_max_body_size 100M; di dalam blok location sesuai kebutuhan.\n4. Aktifkan konfigurasi # Buat symlink ke sites-enabled agar konfigurasi dipakai oleh Nginx.\nsudo ln -s /etc/nginx/sites-available/yoursubdomain.example.com /etc/nginx/sites-enabled/ 5. Uji Nginx # Periksa sintaks konfigurasi lalu muat ulang Nginx.\nsudo nginx -t sudo systemctl reload nginx Jika tidak ada error, aplikasi Anda seharusnya sudah dapat diakses melalui http://yoursubdomain.example.com.\n6. Pasang SSL dengan Certbot # Jalankan Certbot dengan plugin Nginx dan tentukan subdomain yang ingin diamankan.\nsudo certbot --nginx -d yoursubdomain.example.com Saat proses berjalan, Certbot biasanya akan menanyakan:\nAlamat email untuk notifikasi pembaruan dan keamanan. Persetujuan terhadap terms of service. Opsi berbagi email dengan EFF. Opsi redirect HTTP ke HTTPS. Pilih redirect agar trafik selalu memakai HTTPS. Jika berhasil, Certbot akan memodifikasi konfigurasi Nginx secara otomatis dan menambahkan blok server HTTPS dengan sertifikat Let\u0026rsquo;s Encrypt.\n7. Verifikasi dan uji akses # Setelah selesai, buka https://yoursubdomain.example.com dan pastikan browser menampilkan koneksi aman.\nJika ingin memastikan konfigurasi Nginx yang baru diterapkan, Anda juga bisa mengecek kembali status service.\nsudo systemctl status nginx 8. Cek pembaruan otomatis # Sertifikat Let\u0026rsquo;s Encrypt berlaku selama 90 hari, tetapi Certbot biasanya sudah menambahkan timer atau cron untuk pembaruan otomatis.\nUji proses perpanjangan dengan mode dry run:\nsudo certbot renew --dry-run Jika perintah ini selesai tanpa error, pembaruan otomatis Anda sudah dikonfigurasi dengan benar.\n","date":"27 March 2026","externalUrl":null,"permalink":"/doc/reverse-proxy-nginx/","section":"","summary":"","title":"Reverse Proxy dengan Nginx dan Pemasangan Sertifikat SSL","type":"doc"},{"content":"","date":"26 March 2026","externalUrl":null,"permalink":"/writeup/","section":"","summary":"","title":"","type":"writeup"},{"content":"Di lab ini, saya diposisikan sebagai investigator dari sebuah perusahaan diminta menyelidiki adanya penyalahgunaan user privilege. cloud provider yang digunakan klien adalah AWS, dan lognya dicatat ke ELK stack tersendiri. investigator diminta mencari log yang menunjukkan adanya penghapusan user.\nPenyelesaian : masuk ke menu discovery, kemudian ke bagian KQL syntax filter. secara umum bisa lakukan hal hal ini :\nfiltering hanya dari data yang berasal dari aws cloudtrail filtering ke data yang berkaitan dengan IAMUSER filtering ke data yang memiliki event DeleteUser / deletion beberapa query yang bisa dimasukkan :\ndeletion aws.cloudtrail.user_identity.type: IAMUser event.action: \u0026#34;DeleteUser\u0026#34; kemudian dari log yang didapatkan bisa kita baca detailnya seperti user yang dihapus , waktunya , dsb\u0026hellip;\n","date":"26 March 2026","externalUrl":null,"permalink":"/writeup/cwl-inf-user-vanishing-act/","section":"","summary":"","title":"CWL/INF: User Vanishing Act","type":"writeup"},{"content":"","date":"26 March 2026","externalUrl":null,"permalink":"/categories/writeup/","section":"Categories","summary":"","title":"Writeup","type":"categories"},{"content":"Tutorial ini menjelaskan cara membuat aplikasi Node.js berjalan otomatis saat server restart menggunakan PM2 dan systemd.\nDaftar Isi # 1. Instal PM2 2. Jalankan aplikasi 3. Aktifkan startup systemd 4. Simpan proses PM2 5. Verifikasi 1. Instal PM2 # Jika pm2 belum tersedia, instal secara global melalui npm.\nnpm install -g pm2 which pm2 Catat hasil which pm2 karena path ini akan dipakai oleh perintah startup systemd.\n2. Jalankan aplikasi # Masuk ke folder project Node.js Anda lalu jalankan aplikasi dengan nama proses yang jelas.\ncd /home/aska/pickupjs pm2 start app.js --name pickupjs-app pm2 status Jika entry point project Anda bukan app.js, sesuaikan dengan file utama aplikasi Anda.\n3. Aktifkan startup systemd # Buat konfigurasi startup agar PM2 otomatis aktif setelah server reboot.\npm2 startup systemd -u aska --hp /home/aska Perintah di atas akan menampilkan satu baris perintah sudo tambahan. Jalankan perintah yang dihasilkan oleh PM2 pada sistem Anda.\n4. Simpan proses PM2 # Setelah aplikasi berjalan, simpan daftar proses agar PM2 dapat memulihkan proses saat boot.\npm2 save Jika Anda menambahkan aplikasi lain ke PM2, jalankan pm2 save lagi setelah perubahan selesai.\n5. Verifikasi # Periksa status service systemd dan pastikan proses bisa pulih setelah reboot.\nsudo systemctl status pm2-aska sudo reboot Setelah server hidup kembali, cek lagi:\npm2 status sudo systemctl status pm2-aska Dengan langkah ini, aplikasi Node.js Anda akan tetap berjalan otomatis ketika server restart.\n","date":"1 March 2026","externalUrl":null,"permalink":"/doc/run-pm2-ubuntu/","section":"","summary":"","title":"Orkestrasi Proyek Node.js dengan PM2 pada Ubuntu","type":"doc"},{"content":"Versi singkat :\nEnumerasi direktori (aku pakai dirsearch) sampai ketemu halaman login, passwordnya ada di komentar file yang ditemukan.\nWhat i actually do :\nKarena halamanya tidak interaktif jadi aku coba lakukan inspect element, mengawasi traffic di tab network, mengecek local storage dan cookies tapi tidak ketemu apa-apa. Kemudian aku lanjutkan pakai dirsearch, ketemu robots.txt, di sini kita menemukan direktori pertama tapi masih static file, saya kembali melakukan inspect element dibarengi menjalankan dirsearch di direktori ini, kemudian menemukan direktori kedua yang berisi panel login.\nSetelah menemukan panel ini, seperti biasa : inspect element, pantau network, cek storage, tidak menemukan apa-apa. Coba dengan manual sqli, tidak berhasil kemudian bruteforce dengan hydra dibarengi dengan dirsearch—siapa tahu ada BAC. Tetap gagal, terus lihat lagi ke robots.txt ada komentar, kugunakan dengan kombinasi admin-komentar untuk login, Berhasil.\n","date":"18 February 2026","externalUrl":null,"permalink":"/writeup/thm-lfp26-hidden-deep/","section":"","summary":"","title":"THM/LFB26 : Hidden Deep Into my Heart","type":"writeup"},{"content":"","date":"4 February 2026","externalUrl":null,"permalink":"/blog/","section":"","summary":"","title":"","type":"blog"},{"content":"","date":"4 February 2026","externalUrl":null,"permalink":"/categories/blog/","section":"Categories","summary":"","title":"Blog","type":"categories"},{"content":" Latar Belakang # Sebuah aplikasi berbasis Moodle telah beroperasi selama kurang lebih sembilan bulan di atas shared hosting dengan sistem billing tahunan. Dalam proses pengembangannya, aplikasi ini memerlukan penambahan plugin bernama CodeRunner. Plugin ini memungkinkan penilaian otomatis untuk soal-soal pemrograman dan mensyaratkan adanya Jobe Server — sebuah server tambahan yang, saat tulisan ini dibuat, belum bisa di-deploy ke shared hosting. Oleh karena itu, kami terpaksa menggunakan VPS terpisah. Saat ini, kami menghadapi situasi di mana ada dua tagihan: shared hosting yang bersifat tahunan, dan VPS dengan sistem Pay As You Go.\nKebutuhan # Selama berjalan, aplikasi ini berfungsi sebagai pendukung pembelajaran di dalam kelas. Ini berarti trafik tidak penuh setiap hari. Meskipun aksesnya tetap dibuka, siswa sangat jarang mengakses aplikasi di luar jam pelajaran.\nKeputusan Efisiensi # Invoice shared hosting dan SSL tahunan Dengan mempertimbangkan sifat seasonal atau musiman dari penggunaan aplikasi ini, biaya yang dikeluarkan saat ini dianggap terlalu tinggi. Oleh karena itu, diputuskan bahwa keseluruhan sistem akan dipindahkan ke VPS dengan sistem billing Pay As You Go.\nPay As You Go # Sistem \u0026ldquo;Pay As You Go\u0026rdquo; (PAYG) adalah model pembayaran fleksibel di mana pengguna hanya membayar untuk sumber daya komputasi atau layanan yang benar-benar digunakan, biasanya dihitung per jam atau per menit, memungkinkan optimalisasi biaya dan skalabilitas sesuai kebutuhan tanpa komitmen jangka panjang.\nPricing di provider baru: yang atas adalah harga storage, yang bawah adalah harga komputasi dengan spek 2vCPU/2GB dihitung per jam hanya ketika VPS aktif. Eksekusi # Membuat Akun Baru # Sebelum proses migrasi dimulai, buat akun baru di lingkungan testing untuk memastikan setelah migrasi akun tetap bisa digunakan seperti biasa.\nDownload Data # Lakukan kompresi lalu download folder moodle dan moodledata dari panel web hosting. Lakukan backup juga terhadap database. Jika ada beberapa database, periksa file config.php di folder Moodle untuk mengetahui nama database yang digunakan.\nData yang perlu di-download:\nFile Moodle (source) Folder moodledata Dump database (.sql) Periksa config.php untuk bagian dbname: // contoh potongan di config.php $CFG-\u0026gt;dbname = \u0026#39;nama_database\u0026#39;; Persiapan Host Baru # Saya menggunakan VPS berbasis Ubuntu Server 24.04.\nJalankan pembaruan paket:\nsudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y Instalasi Jobe Server # Jobe Server dijalankan di atas Docker menggunakan proyek jobeinabox. Dokumentasi: https://github.com/trampgeek/jobeinabox\nInstal paket Docker (potongan ringkas):\nsudo apt-get update sudo apt-get install -y ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release \u0026amp;\u0026amp; echo \\\u0026#34;$VERSION_CODENAME\\\u0026#34;) stable\u0026#34; | sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Cek pemasangan Docker dengan menjalankan docker --version atau sudo docker ps. Opsional: jalankan Docker tanpa sudo (logout/login diperlukan setelah menambahkan user ke grup docker):\nsudo groupadd -f docker sudo usermod -aG docker $USER Jalankan container Jobe (contoh):\nsudo docker run -d -p 4000:80 --name jobe --restart unless-stopped trampgeek/jobeinabox:latest Catatan keamanan: gunakan --restart unless-stopped atau atur sistemd/unit untuk kontrol yang lebih baik. Jangan menjalankan container sebagai root yang memiliki akses tidak terbatas ke host.\nOpsional cek performa Jobe:\ndocker exec -it jobe /var/www/html/jobe/testsubmit.py --perf Sesuaikan jumlah worker Jobe sesuai spesifikasi VPS: https://github.com/trampgeek/jobeinabox?tab=readme-ov-file#setting-the-number-of-jobe-users\nUpload Data Moodle # Upload data yang sudah di-download ke VPS menggunakan sftp, rsync over SSH, atau klien SFTP (mis. Cyberduck). Contoh menggunakan rsync:\nrsync -avz /local/path/moodle user@vps:/home/user/ rsync -avz /local/path/moodledata user@vps:/home/user/ scp /local/path/backup.sql user@vps:/home/user/ Instalasi LAMP Stack # LAMP stack adalah gabungan dari Linux, Apache, MariaDB/MySQL, dan PHP. Periksa versi Moodle dan persyaratan minimal di https://moodledev.io/general/releases/\nInstal PHP dan modul yang diperlukan (contoh untuk PHP 8.3):\nsudo apt update sudo apt install -y software-properties-common sudo add-apt-repository ppa:ondrej/php -y sudo add-apt-repository ppa:ondrej/apache2 -y sudo apt update sudo apt install -y php8.3 libapache2-mod-php8.3 php8.3-mysql php8.3-curl php8.3-gd php8.3-intl php8.3-mbstring php8.3-xml php8.3-zip php8.3-soap php8.3-xmlrpc php8.3-ldap sudo a2enmod php8.3 sudo systemctl restart apache2 Contoh pengaturan php.ini (sesuaikan kebutuhan):\nmax_input_vars = 5000 max_execution_time = 300 memory_limit = 512M post_max_size = 64M upload_max_filesize = 64M date.timezone = Asia/Jakarta Instalasi MariaDB # sudo apt install -y apt-transport-https curl gnupg2 sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp \u0026#39;https://mariadb.org/mariadb_release_signing_key.pgp\u0026#39; echo \u0026#34;deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] https://mirrors.porkbun.com/mariadb/repo/10.6/ubuntu noble main\u0026#34; | sudo tee /etc/apt/sources.list.d/mariadb.list sudo apt update sudo apt install -y mariadb-server mariadb-client Jalankan sudo mysql_secure_installation dan ikuti petunjuk keamanan (set password root, hapus anonymous user, disable remote root login, hapus database test, reload privilege tables).\nContoh membuat database dan user Moodle (ubah nama dan password sesuai kebutuhan):\n-- di mysql shell CREATE DATABASE moodle_db_new CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER \u0026#39;moodle_user_new\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;your_strong_password\u0026#39;; GRANT ALL PRIVILEGES ON moodle_db_new.* TO \u0026#39;moodle_user_new\u0026#39;@\u0026#39;localhost\u0026#39;; FLUSH PRIVILEGES; EXIT; Impor database (proses bisa memakan waktu tergantung ukuran):\nsudo mysql -u moodle_user_new -p moodle_db_new \u0026lt; /path/to/your_moodle_backup.sql Konfigurasi Moodle # Ekstrak file dan pindahkan ke direktori web:\nsudo apt install -y unzip unzip moodle.zip # atau archive sesuai unzip moodledata.zip sudo mv moodle /var/www/html/ sudo mv moodledata /var/www/html/ Atur kepemilikan dan permission yang lebih aman (hindari chmod 777):\nsudo chown -R www-data:www-data /var/www/html/moodle sudo find /var/www/html/moodle -type d -exec chmod 755 {} \\; sudo find /var/www/html/moodle -type f -exec chmod 644 {} \\; # untuk moodledata: cukup berikan group write kepada www-data sudo chown -R www-data:www-data /var/www/html/moodledata sudo find /var/www/html/moodledata -type d -exec chmod 750 {} \\; sudo find /var/www/html/moodledata -type f -exec chmod 640 {} \\; Jika Moodle membutuhkan direktori yang dapat ditulis oleh web server, gunakan ACL atau tambahkan user yang tepat ke grup www-data daripada chmod 777.\nPerbaiki path apabila ada typo. Contoh yang salah sebelumnya adalah /var/www//html/moodledata — gunakan /var/www/html/moodledata.\nUbah config.php sesuai instalasi (gunakan editor favorit):\n$CFG-\u0026gt;dbhost = \u0026#39;localhost\u0026#39;; $CFG-\u0026gt;dbname = \u0026#39;moodle_db_new\u0026#39;; $CFG-\u0026gt;dbuser = \u0026#39;moodle_user_new\u0026#39;; $CFG-\u0026gt;dbpass = \u0026#39;your_strong_password\u0026#39;; $CFG-\u0026gt;wwwroot = \u0026#39;http://your_domain_or_ip/moodle\u0026#39;; $CFG-\u0026gt;dataroot = \u0026#39;/var/www/html/moodledata\u0026#39;; Terakhir, lakukan tes fungsionalitas dengan membuka situs Moodle di browser dan cek instalasi, plugin, dan integrasi Jobe.\n","date":"4 February 2026","externalUrl":null,"permalink":"/blog/moodle-to-vps/","section":"","summary":"","title":"Strategi Efisiensi : Migrasi Moodle ke VPS","type":"blog"},{"content":"Tutorial ini menjelaskan cara menjalankan project Python dengan gunicorn sebagai aplikasi service dan systemd agar otomatis aktif saat server restart.\nDaftar Isi # 1. Persiapan project 2. Instal dependensi 3. Buat service systemd 4. Aktifkan service 5. Verifikasi dan debugging 1. Persiapan project # Pastikan project Python Anda sudah siap dijalankan, misalnya memakai virtual environment dan memiliki file utama aplikasi.\nContoh struktur project:\n/home/aska/pickupSession/ ├── venv/ ├── app.py └── start.sh Jika Anda memakai Flask, FastAPI, atau framework lain, sesuaikan module dan command gunicorn dengan aplikasi Anda.\n2. Instal dependensi # Aktifkan virtual environment lalu instal gunicorn dan dependency project.\ncd /home/aska/pickupSession source venv/bin/activate pip install gunicorn pip install -r requirements.txt Jika Anda belum punya requirements.txt, pastikan minimal gunicorn dan framework Python yang dipakai sudah terpasang.\n3. Buat service systemd # Buat file unit service di /etc/systemd/system/.\nsudo nano /etc/systemd/system/pickupsession.service Lalu isi dengan konfigurasi berikut.\n[Unit] Description=PickupSession Python Gunicorn Service After=network.target [Service] User=aska Group=aska WorkingDirectory=/home/aska/pickupSession Environment=\u0026#34;PATH=/home/aska/pickupSession/venv/bin\u0026#34; ExecStart=/home/aska/pickupSession/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 app:app Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target Sesuaikan beberapa bagian berikut jika perlu:\nUser dan Group sesuai user Linux yang menjalankan project. WorkingDirectory sesuai lokasi project Anda. ExecStart sesuai module Flask/FastAPI Anda. Port 8000 bisa diganti sesuai kebutuhan. 4. Aktifkan service # Setelah file service dibuat, reload konfigurasi systemd lalu aktifkan service.\nsudo systemctl daemon-reload sudo systemctl enable pickupsession.service sudo systemctl start pickupsession.service 5. Verifikasi dan debugging # Periksa status service untuk memastikan aplikasi berjalan normal.\nsudo systemctl status pickupsession.service Untuk melihat log aplikasi secara realtime, gunakan:\nsudo journalctl -u pickupsession.service -f Dengan cara ini, project Python Anda akan berjalan sebagai service dan otomatis aktif kembali setelah server restart.\n","date":"15 January 2026","externalUrl":null,"permalink":"/doc/run-python-gunicorn/","section":"","summary":"","title":"Orkestrasi Proyek Python dengan Gunicorn pada Ubuntu","type":"doc"},{"content":"di bagian bawah dari room pertama AOC2025 ada challenge tambahan untuk memasuki Side Quest 1\nSesuatu yang selalu bersama di session, bukan file. aku duga itu adalah Environment Variables, di ubuntu bisa dicetak dengan:\nprintenv ketemu, oke lanjut.\nthe tree shows; setelah membaca ini aku jalankan untuk menampilkan tree dari home directory sekarang dan menemukan file tersembunyi berikut:\ntree -a setelah di-cat malah dapat PASSFRAG ke 3 😭\nsetelah dapat kedua PASSFRAG itu sebenarnya bisa kita tebak tebak PASSFRAG keduanya tapi kita lanjut aja deh carinya\ndi CLUE kedua ada 3 kata kunci ternyata yaitu tree-yesterday-older kata kata ini bersinggungan dengan git version control. tadi ketika melakukan tree -a dapat dilihat juga ada folder .secret_git\nsetelah kita masuk dan lakukan git log untuk melihat riwayat commit, kita mendapatkan clue lagi\nyak berarti disini pernah ada private note, kita hanya perlu melakukan checkout ke commit kemarin (yesterday) sebelum private notenya dihapus dengan menggunakan:\ngit checkout \u0026lt;hash-commitnya\u0026gt; kemudian kita jalankan:\nls dan benar saja ada sebuah file txt disana, di dalamnya ada PASSFRAG kedua\nbtw ini clue ketiganya (passfragnya udah ketemu tadi)\noke jadi kita udah dapat keynya yaitu 3ast3r-1s-c0M1nG tinggal kita gunakan untuk membuka enkripsi filenya\nroot@tbfc-web01:/home/eddi_knapp/Documents$ gpg -d mcskidy_note.txt.gpg gpg: AES256.CFB encrypted data gpg: encrypted with 1 passphrase Congrats — you found all fragments and reached this file. Below is the list that should be live on the site. If you replace the contents of /home/socmas/2025/wishlist.txt with this exact list (one item per line, no numbering), the site will recognise it and the takeover glitching will stop. Do it — it will save the site. Hardware security keys (YubiKey or similar) Commercial password manager subscriptions (team seats) Endpoint detection \u0026amp; response (EDR) licenses Secure remote access appliances (jump boxes) Cloud workload scanning credits (container/image scanning) Threat intelligence feed subscription Secure code review / SAST tool access Dedicated secure test lab VM pool Incident response runbook templates and playbooks Electronic safe drive with encrypted backups A final note — I don\u0026#39;t know exactly where they have me, but there are _lots_ of eggs and I can smell chocolate in the air. Something big is coming. — McSkidy --- When the wishlist is corrected, the site will show a block of ciphertext. This ciphertext can be decrypted with the following unlock key: UNLOCK_KEY: 91J6X7R4FQ9TQPM9JX2Q9X2Z To decode the ciphertext, use OpenSSL. For instance, if you copied the ciphertext into a file /tmp/website_output.txt you could decode using the following commands: cat \u0026gt; /tmp/website_output.txt openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -salt -base64 -in /tmp/website_output.txt -out /tmp/decoded_message.txt -pass pass:\u0026#39;91J6X7R4FQ9TQPM9JX2Q9X2Z\u0026#39; cat /tmp/decoded_message.txt Sorry to be so convoluted, I couldn\u0026#39;t risk making this easy while King Malhare watches. — McSkidy root@tbfc-web01:~$ cat decoded_message.txt Well done — the glitch is fixed. Amazing job going the extra mile and saving the site. Take this flag THM{w3lcome_2_A0c_2025} NEXT STEP: If you fancy something a little...spicier....use the FLAG you just obtained as the passphrase to unlock: /home/eddi_knapp/.secret/dir That hidden directory has been archived and encrypted with the FLAG. Inside it you\u0026#39;ll find the sidequest key. itu imagenya, selesai\u0026hellip;\nsekarang baru masuk ke challengenya (aku cuma bisa dapat 1 flag di side quest 1 jadi ga sampe selesai, hehe )\ninterface web challengenya\n","date":"30 December 2025","externalUrl":null,"permalink":"/writeup/thm-aoc25-road-sq-1/","section":"","summary":"","title":"THM/AOC25 : Road To Side Quest 1","type":"writeup"},{"content":"Room ini adalah bagian dari event Advent of Cyber 2025 yang bisa diakses di sini https://tryhackme.com/module/aoc-2025-kra8blxfpajw0vn6\nRoom ini berisi 10 tantangan dasar cybersecurity sebagai persiapan sebelum memasuki Advent Of Cyber 2025, saya akan membahas secara singkat masing masing tantangannya.\nChallenges 1, user diminta membuat password yang aman dengan beberapa kriteria, password yang kuat adalah salah satu cara paling sederhan untuk bertahan dari serangan siber. Untuk menyelesaikan step ini bisa menggunakan password generator, di dunia nyata direkomendasikan untuk menggunakan password manager sehingga passwordnya tidak disimpan dalam plaintext.\nChallenges 2, user diminta melakukan checking terhadap file executable yang ditemukan di sebuah flashdisk, pengecekan dilakukan di website semacam virustotal. Pengecekan semacam ini memang seharusnya dilakukan ke file yang tidak diketahui asal usulnya atau diragukan keamanannya. Mengeksekusi file yang tidak aman dapat berdampak ke komputer secara langsung.\nChallenges 3, 4, dan 5 berisi semacam intro ke Command Line Interface baik di Linux maupun Windows.\nChallenges 6, melakukan cek email di web semacam Have I Been Pwned untuk mengetahui apakah akun tersebut ada di data leaks atau tidak.\nChallenges 7, berisi tentang pentingnya untuk tidak membiarkan default password seperti admin-admin (biasanya pada perangkat keras seperti router), jangan gunakan predictable seperti tanggal dan nama, jangan reuse password, pakai symbols dan mixed case (lower-upper).\nChallenges 8, mengecek izin aplikasi pihak ketiga. Misal aku bisa login ke web A dengan akun github, maka web A ini disebut sebagai pihak ketiga. Pemberian izin yang berlebihan kepada aplikasi pihak ketiga bisa berujung pada hal hal yang tidak diinginkan seperti pencurian data atau akun.\nChallenges 9, intro ke LLM security, agar data yang diakses oleh LLM tidak bocor ke user yang tidak memerlukannya.\nChallenges 10, intro ke SOC, membaca sedikit log server.\n","date":"27 December 2025","externalUrl":null,"permalink":"/writeup/thm-aoc25-prep-track/","section":"","summary":"","title":"THM/AOC25 : Prep Track","type":"writeup"},{"content":"Berikut tiga cara instalasi Node.js di Ubuntu. Pilih sesuai kebutuhan: paket bawaan Ubuntu, repository NodeSource, atau NVM untuk mengelola beberapa versi Node.js sekaligus.\nDaftar Isi # 1. Instalasi dari repository Ubuntu 2. Instalasi dari NodeSource 3. Instalasi dengan NVM 1. Instalasi dari repository Ubuntu # Cara ini paling sederhana, tetapi versi Node.js biasanya mengikuti repository resmi Ubuntu dan bisa lebih lama dibanding metode lain.\nsudo apt update sudo apt install nodejs npm -y node -v npm -v Jika Anda hanya butuh Node.js dasar untuk percobaan atau paket sistem, cara ini sudah cukup.\n2. Instalasi dari NodeSource # Gunakan cara ini jika Anda ingin versi Node.js yang lebih baru melalui repository pihak ketiga yang umum dipakai di Ubuntu.\ncd ~ curl -fsSL https://deb.nodesource.com/setup_25.x -o nodesource_setup.sh sudo bash nodesource_setup.sh sudo apt install nodejs -y node -v npm -v Script setup_25.x akan menambahkan repository NodeSource untuk seri Node.js 25. Jika Anda ingin versi lain, sesuaikan angka versinya sebelum menjalankan script.\n3. Instalasi dengan NVM # NVM cocok jika Anda sering berpindah versi Node.js, misalnya untuk proyek yang membutuhkan versi berbeda.\nInformasi resmi NVM tersedia di: https://github.com/nvm-sh/nvm\n3.1 Instal NVM # curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash source ~/.bashrc Jika Anda menggunakan shell lain, misalnya Zsh, muat ulang profil shell yang sesuai setelah instalasi.\n3.2 Cek versi Node yang tersedia # nvm list-remote 3.3 Instal versi Node.js tertentu # nvm install v24.13.0 nvm use v24.13.0 nvm list node -v Jika ingin versi LTS terbaru, Anda juga bisa memakai:\nnvm install --lts nvm use --lts node -v 3.4 Catatan penggunaan # Setelah NVM aktif, Anda bisa memasang dan berpindah versi Node.js tanpa mengubah instalasi sistem. Ini paling fleksibel untuk development harian.\n","date":"9 December 2025","externalUrl":null,"permalink":"/doc/install-nodejs-ubuntu/","section":"","summary":"","title":"Instalasi Nodejs pada Ubuntu","type":"doc"},{"content":"Tutorial ini menjelaskan cara memasang pyenv di Ubuntu untuk mengelola beberapa versi Python dalam satu mesin tanpa mengganggu Python sistem.\nDaftar Isi # 1. Persiapan sistem 2. Instal dependensi 3. Instal pyenv 4. Aktifkan pyenv 5. Pasang versi Python 6. Verifikasi 1. Persiapan sistem # Perbarui daftar paket terlebih dahulu agar instalasi berjalan lancar.\nsudo apt update sudo apt upgrade -y 2. Instal dependensi # pyenv membutuhkan beberapa paket pendukung untuk proses build Python dari source.\nsudo apt install -y \\ make build-essential libssl-dev zlib1g-dev \\ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \\ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \\ libffi-dev liblzma-dev git 3. Instal pyenv # Jalankan script instalasi resmi pyenv.\ncurl https://pyenv.run | bash 4. Aktifkan pyenv # Tambahkan konfigurasi berikut ke file shell Anda, misalnya ~/.bashrc.\necho \u0026#39;export PYENV_ROOT=\u0026#34;$HOME/.pyenv\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;[[ -d $PYENV_ROOT/bin ]] \u0026amp;\u0026amp; export PATH=\u0026#34;$PYENV_ROOT/bin:$PATH\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;eval \u0026#34;$(pyenv init -)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc Jika Anda menggunakan Zsh, tambahkan baris yang sama ke ~/.zshrc lalu muat ulang shell.\n5. Pasang versi Python # Cek versi Python yang tersedia, lalu instal versi yang Anda butuhkan.\npyenv install -l pyenv install 3.12.2 pyenv global 3.12.2 Jika proyek tertentu membutuhkan versi berbeda, Anda juga bisa memakai versi lokal di folder project.\ncd /path/ke/project pyenv local 3.12.2 6. Verifikasi # Pastikan Python yang aktif berasal dari pyenv.\npython --version which python pyenv versions Dengan pyenv, Anda bisa mengelola versi Python per proyek tanpa merusak instalasi Python bawaan Ubuntu.\n","date":"22 November 2025","externalUrl":null,"permalink":"/doc/install-pyenv-ubuntu/","section":"","summary":"","title":"Instalasi pyenv pada Ubuntu","type":"doc"},{"content":"note : Tidak menggunakan Docker karena pada kasus ini host berupa LXC container yang tidak kompatibel dengan Docker.\nBerikut langkah-langkah instalasi dan pengujian Mosquitto pada Ubuntu 22.04.\nDaftar Isi # 1. Perbarui sistem 2. Instal Mosquitto 3. Tambah pengguna 4. Pengujian publish 5. Pengujian subscribe 1. Perbarui sistem # sudo apt update sudo apt upgrade -y 2. Instal Mosquitto # sudo apt install mosquitto -y sudo systemctl status mosquitto sudo systemctl enable mosquitto 3. Tambah pengguna (sesuaikan username_anda) # sudo mosquitto_passwd -c /etc/mosquitto/passwd username_anda sudo nano /etc/mosquitto/mosquitto.conf Tambahkan baris berikut di akhir file mosquitto.conf:\nallow_anonymous false password_file /etc/mosquitto/passwd listener 1883 Kemudian restart Mosquitto dan instal client tools:\nsudo systemctl restart mosquitto sudo apt install mosquitto-clients -y 4. Pengujian (publish) # Sesuaikan username_anda dan password_anda saat melakukan publish:\nmosquitto_pub -h localhost -t \u0026#34;test/topic\u0026#34; -m \u0026#34;Hello MQTT from Ubuntu!\u0026#34; -u \u0026#34;username_anda\u0026#34; -P \u0026#34;password_anda\u0026#34; 5. Pengujian (subscribe) # mosquitto_sub -h localhost -t \u0026#34;test/topic\u0026#34; -u \u0026#34;username_anda\u0026#34; -P \u0026#34;password_anda\u0026#34; Catatan: ganti username_anda dan password_anda dengan kredensial yang Anda buat sebelumnya.\n","date":"6 October 2025","externalUrl":null,"permalink":"/doc/install-mosquitto-mqtt-ubuntu-22/","section":"","summary":"","title":"Instalasi Mosquitto MQTT Server pada Ubuntu 22.04","type":"doc"},{"content":"Dalam tiga bulan terakhir, saya melakukan beberapa migrasi layanan berbasis web — mulai dari shared hosting ke VPS, VPS ke VPS, hingga dari lingkungan development ke production. Layanannya pun beragam: ada yang berbasis PHP, Python, maupun Node.js.\nSetiap migrasi punya tantangan sendiri, tapi di sisi lain memberi banyak pelajaran soal bagaimana menjaga stabilitas, efisiensi biaya, dan konsistensi lingkungan server.\nBeberapa klien memiliki alasan yang berbeda dalam melakukan migrasi: ada yang sebelumnya menggunakan shared hosting untuk aplikasi PHP namun biaya bulanannya terasa berat karena sifat aplikasinya musiman (seasonal), sehingga dipindahkan ke VPS dengan sistem Pay-as-You-Go agar hanya membayar saat aktif. Ada juga yang berpindah dari VPS ke NAT VPS untuk menekan biaya operasional, karena uptime-nya masih bisa ditoleransi untuk aplikasi non-kritis. Dari berbagai kasus ini, saya belajar beberapa hal yang akan saya tulis di sini, sebagai pengingat pribadi.\nTahapan Migrasi # biasanya saya membuat checklist dulu sebelum melakukan migrasi , berisi langkah-langkah yagn akan saya lakukan di migrasi saat itu. Saya rasa ini sangat membantu karena kadang kalau sudah masuk ke proses akan lebih fokus ke teknikal dan kadang ada fase stuck \u0026lsquo;oke sudah, habis ini ngapain ya?\u0026rsquo;\nKurang lebih ini checklistnya (disesuaikan dengan project yang sedang dimigrasikan) :\nClone source code dari repository dan backup data dari layanan lama untuk testing di server baru.\nSiapkan environment, sebisa mungkin sama dengan sistem sebelumnya atau minimal kompatibel. Jika menggunakan docker maka bagian ini akan terasa lebih mudah tapi perlu diingat juga bahwa tidak semua butuh docker, pernah ada satu project yang memaksakan penggunaan docker tapi malah menjadi tidak efisien karena ketika build image membutuhkan storage yang besar tapi setelah container berjalan sebenarnya storage itu tidak diperlukan lagi dan provider vps saat itu tidak menyediakan opsi downsize sehingga biaya storage itu menjadi beban biaya selama server beroperasi. Dengan memilih tidak menggunakan docker maka overhead itu telah dihilangkan\nJalankan aplikasi dengan mode debug.\nLakukan testing baik dengan script testing yang sudah disediakan maupun API testing menggunakan aplikasi semacam postman (kadang saya menggunakan cloudflare tunnel untuk testing sementara). Ngga semua klien punya script untuk automation testing jadi sebenarnya ini opsional aja, kadang cukup kasih link sementaranya buat dicek sama klien.\nLakukan cutover traffic dengan mengubah DNS.\nBuat reverse proxy atau virtualhost, lanjutkan dengan pemasangan sertifikat SSL, seringnya menggunakan certbot.\nUntuk NAT VPS jangan lupa lakukan konfigurasi port/domain forwarding.\nJika tidak menggunakan docker, pastikan service sudah otomatis dimulai jika server reboot, pakai systemd.\nSiapkan backup otomatis jika diminta oleh klien, fokus ke data aplikasi seperti konten web, log, atau docker volume.\nDokumentasi, terutama jika migrasinya dari shared hosting ke vps tanpa panel.\nIntinya build layanan di server baru —\u0026gt; testing —\u0026gt; alihkan traffic.\nVersioning Itu Penting # Pernah ada satu kasus di mana project yang akan di-deploy sudah setahun tidak disentuh dan tidak memiliki versioning di dependency-nya. Saat dijalankan muncul banyak error akibat perbedaan versi library.\nOtomasi # Seperti yang sudah saya jelaskan di poin sebelumnya bahwa tidak semua project ideal dengan docker, maka skrip otomasi menjadi jawabannya. Skrip ini bisa ditulis dengan shell scripting tapi saya prefer menggunakan python karena kemudahan bahasanya dan python sendiri sudah otomatis terinstall pada server berbasis ubuntu. Biasanya berisi hal hal yang berkaitan dengan setup environment dan setup service di systemd.\nPenutup # Setiap migrasi yang saya lakukan selalu punya ceritanya sendiri, kadang berjalan mulus, kadang penuh kejutan kecil yang memaksa saya berpikir ulang soal pendekatan yang digunakan. Tapi dari semua itu, saya belajar untuk tidak terburu-buru, mencatat setiap langkah, dan selalu menyiapkan \u0026lsquo;plan B\u0026rsquo; jika sesuatu tidak berjalan sesuai rencana.\n","date":"14 September 2025","externalUrl":null,"permalink":"/blog/permigrasian/","section":"","summary":"","title":"Tiga Bulan Bergelut dengan per-Migrasian Duniawi","type":"blog"},{"content":"Kalimat \u0026ldquo;not if, but when\u0026rdquo; memaksa kita menerima bahwa kegagalan itu kemungkinannya cuma sekian persen tapi dia tetap bagian dari siklus kerja sistem.\nDalam praktik sehari-hari, pola pikir ini sangat terasa saat kita bicara soal data. Semuanya normal, semuanya terlihat baik-baik saja, tidak ada log error berlebih, tidak ada incident report. Tapi, hardware tidak peduli dengan rasa aman kita. SSD bisa rusak, disk bisa korup, filesystem bisa bermasalah, dan server bisa mati di saat yang paling tidak diinginkan.\nDi titik kesadaran seperti itu, pertanyaan yang benar bukan lagi \u0026ldquo;bagaimana supaya system failure tidak terjadi?\u0026rdquo;, melainkan \u0026ldquo;apa yang harus dilakukan ketika system failure terjadi?\u0026rdquo;.\nTerbiasa dalam Bahaya # Ada kebiasaan yang sangat manusiawi di dunia infrastruktur: menunda backup karena merasa nanti bisa dilakukan manual. Kalimatnya biasanya terdengar seperti ini:\nNanti saja saya copy volume Docker-nya kalau ingat.\nPikirnya, “server kan masih jalan, nanti kalau weekend aku backup”. Tapi weekend datang, ada kerjaan lain, ada keluarga, ada hobi. Akhirnya, backup tertunda terus sampai hari ketika SSD benar-benar mati. Menggantungkan keselamatan data pada kebiasaan spontan dan asumsi bahwa memori manusia cukup andal untuk pekerjaan yang sifatnya krusial, bukan pada sistem yang dirancang untuk bekerja tanpa perlu diingat-ingat.\nBukan Takut tapi Realistis # Pola pikir \u0026ldquo;not if, but when\u0026rdquo; bukan ajakan untuk panik, ini ajakan untuk bersikap realistis.\nKalau kita mengelola server, menjalankan Docker, atau menyimpan data penting di storage apa pun, maka kita harus menganggap kegagalan hardware sebagai sesuatu yang pasti akan terjadi pada akhirnya. Mungkin besok, mungkin bulan depan, mungkin dua tahun lagi. Waktunya tidak bisa ditebak, tetapi kejadiannya sendiri hampir pasti.\nKarena itu, fokus kita bergeser:\ndari mencegah semua masalah menjadi membangun kemampuan backup recovery dari mengandalkan keberuntungan menjadi mengandalkan proses dari backup manual yang \u0026ldquo;nanti saja\u0026rdquo; menjadi backup otomatis yang berjalan konsisten dari berharap sistem baik-baik saja menjadi siap ketika sistem tidak baik-baik saja Backup yang Benar Adalah Kebutuhan # Backup bukan fitur tambahan. Backup adalah bagian dari desain sistem.\nJika kita memakai Docker volume untuk menyimpan database, file upload, konfigurasi aplikasi, atau state penting lain, maka volume itu harus diperlakukan seperti data produksi yang bernilai. Artinya, backup perlu:\nBerjalan otomatis Diuji proses restore-nya Disimpan di lokasi yang berbeda dari sumber utama Memiliki retensi yang jelas Backup yang tidak pernah diuji restore-nya sering kali cuma memberi rasa aman palsu. Di atas kertas terlihat aman, tetapi saat dibutuhkan, baru ketahuan bahwa file cadangannya rusak, tidak lengkap, atau formatnya tidak cocok untuk dipulihkan.\nDari Prevention ke Resilience # Di dunia keamanan siber, ada konsep yang mirip: assume breach. Intinya, kita berhenti berpura-pura bahwa sistem bisa dijaga tetap steril selamanya. Sebaliknya, kita membangun deteksi, pembatasan dampak, dan prosedur pemulihan.\nPrinsip yang sama berlaku untuk kegagalan infrastruktur.\nPendekatan lama biasanya bertumpu pada pencegahan semata. Pendekatan yang lebih matang bertumpu pada resilience:\nSistem dipisah agar kegagalan satu bagian tidak melumpuhkan semuanya Backup dibuat terjadwal dan terenkripsi Restore diuji secara berkala Dokumentasi disiapkan sebelum insiden terjadi Penutup # \u0026ldquo;Not if, but when\u0026rdquo; adalah pengingat untuk berhenti bersandar pada harapan dan mulai membangun kesiapan. Kita tidak bisa menjamin SSD tidak akan rusak, database tidak akan korup, atau operator tidak akan lupa. Yang bisa kita lakukan adalah memastikan bahwa ketika kegagalan datang, kita tidak mulai dari nol.\nJadi, jangan tunggu momen \u0026ldquo;nanti kalau sempat\u0026rdquo;.\n","date":"8 August 2025","externalUrl":null,"permalink":"/blog/not-if-but-when/","section":"","summary":"","title":"Not If But When","type":"blog"},{"content":"Panduan ini menjelaskan cara instalasi Docker di Ubuntu secara bertahap, mulai dari persiapan sistem sampai akses Docker tanpa sudo.\nDaftar Isi # 1. Persiapan Sistem 2. Tambahkan Kunci GPG Resmi Docker 3. Tambahkan Repositori Docker 4. Instal Docker Engine 5. Verifikasi Instalasi 6. Akses Docker Tanpa sudo 1. Persiapan Sistem # Pertama, perbarui paket indeks dan instal paket yang diperlukan:\nPerbarui indeks paket:\nsudo apt update Instal paket prasyarat:\nsudo apt install ca-certificates curl apt-transport-https software-properties-common -y 2. Tambahkan Kunci GPG Resmi Docker # Tambahkan kunci GPG resmi Docker untuk memastikan paket yang Anda unduh adalah asli.\nBuat direktori keyrings (jika belum ada) dan atur izin:\nsudo install -m 0755 -d /etc/apt/keyrings Unduh kunci GPG resmi Docker dan simpan ke keyrings:\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg Atur izin yang sesuai untuk file kunci:\nsudo chmod a+r /etc/apt/keyrings/docker.gpg 3. Tambahkan Repositori Docker # Tambahkan repositori Docker ke sumber APT Anda:\nTambahkan repositori ke sumber APT:\necho \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null Catatan: Perintah ini menggunakan $VERSION_CODENAME untuk secara otomatis mendeteksi nama kode rilis Ubuntu Anda (misalnya, noble untuk Ubuntu 24.04).\nPerbarui indeks paket APT lagi untuk memasukkan repositori Docker:\nsudo apt update 4. Instal Docker Engine # Sekarang instal paket Docker Engine dan komponen terkait:\nsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y Paket ini mencakup:\ndocker-ce: Mesin Docker (Community Edition). docker-ce-cli: Command Line Interface (CLI) Docker. containerd.io: Container runtime yang mengelola siklus hidup container. docker-buildx-plugin: Plugin untuk kemampuan build yang ditingkatkan. docker-compose-plugin: Plugin untuk mengelola aplikasi multi-container Docker. 5. Verifikasi Instalasi # Verifikasi bahwa Docker sudah terinstal dan berjalan dengan benar:\nJalankan image pengujian hello-world:\nsudo docker run hello-world Jika instalasi berhasil, Anda akan melihat pesan konfirmasi yang panjang.\nPeriksa status layanan Docker:\nsudo systemctl status docker Pastikan statusnya menunjukkan active (running).\n6. Akses Docker Tanpa sudo (Opsional tapi Direkomendasikan) # Secara default, menjalankan perintah docker memerlukan sudo. Untuk menjalankan perintah Docker sebagai pengguna non-root (tanpa sudo), Anda perlu menambahkan pengguna Anda ke grup docker.\nBuat grup docker (jika belum ada):\nsudo groupadd docker Tambahkan pengguna Anda ke grup docker:\nsudo usermod -aG docker $USER Terapkan perubahan keanggotaan grup: Anda harus keluar (log out) dan masuk kembali (log back in), atau mulai sesi shell baru dengan perintah:\nnewgrp docker Verifikasi akses tanpa sudo:\ndocker run hello-world Jika berhasil, Anda sekarang dapat menjalankan perintah Docker tanpa sudo.\n","date":"27 June 2025","externalUrl":null,"permalink":"/doc/install-docker-ubuntu-24/","section":"","summary":"","title":"Instalasi Docker pada Ubuntu","type":"doc"},{"content":"(Jika ada kekeliruan, saya terbuka untuk koreksi dan diskusi lebih lanjut.)\nSebagian body email phishing yang diterima mahasiswa Serangan ini terjadi pada tanggal 6 Maret yang lalu. Di sini tidak dibahas bagaimana email bisa dikirim dan siapa pelakunya, melainkan alur yang terjadi ketika seorang korban masuk ke permainannya.\nDiagram alur website phishing Secara garis besar ada dua proses utama:\nVerifikasi kredensial korban Pengiriman data kredensial ke pelaku (dilakukan jika kredensial dikatakan valid oleh proses pertama) Verifikasi Kredensial Korban # Ketika korban mengisi form pada halaman palsu (dalam diagram diberi kode FE), data email dan password akan dikirim ke endpoint /api/login. Endpoint ini kemudian meneruskan data ke endpoint login milik universitas dan menentukan apakah kredensial yang didapat dari FE valid atau tidak berdasarkan response dari endpoint login universitas. Berikut contoh respons yang dikembalikan oleh endpoint /api/login kepada FE.\nResponse jika kredensial dianggap valid oleh /api/login Response jika kredensial dianggap tidak valid oleh /api/login Yang menarik di sini adalah bagaimana /api/login menentukan validitas kredensial: API login universitas selalu mengembalikan status code 200 bahkan ketika autentikasi gagal, sehingga /api/login tidak bisa bergantung pada kode status. Sebagai gantinya, /api/login menentukan validitas berdasarkan pesan error di dalam body respons.\nCukup cerdik, namun menjadi masalah ketika pihak universitas menambahkan fitur captcha pada halaman login. Karena request yang dikirimkan oleh /api/login tidak menyertakan captcha, respons error dari API login universitas akan menunjukkan masalah terkait captcha. Berdasarkan algoritma di atas, respons dari /api/login ke FE akan selalu bertipe success ketika fitur captcha diterapkan, meskipun data dari FE tidak valid.\nPengiriman Data Kredensial Korban ke Pelaku # Pengiriman data hanya dilakukan ketika kredensial dianggap valid oleh /api/login. Pengiriman ini dilakukan melalui bot Telegram; data yang dikirim berisi username, password, dan alamat IP korban.\nPotongan kode JavaScript yang berisi algoritma dan kredensial bot (kredensial sudah di-revoke saat tulisan ini dibuat) Setelah pengiriman data ke Telegram pelaku berhasil, korban diarahkan ulang ke halaman login email milik universitas—mungkin pelaku berharap pengguna akan login seperti biasa dan tidak merasa curiga. Skema di atas relatif \u0026ldquo;bersih\u0026rdquo;: pelaku (seharusnya) hanya menerima kredensial yang terbukti valid. Namun pada praktiknya akun Telegram pelaku justru kena spam 🤣\nAda banyak pertanyaan menarik untuk digali lebih jauh, misalnya: mengapa targetnya akun mahasiswa? Apa yang ingin difarming pelaku? Apakah target sebenarnya lebih besar dari sekadar akun mahasiswa? Pertanyaan-pertanyaan ini belum terjawab, jadi tidak dibahas di sini 😅\n","date":"3 May 2025","externalUrl":null,"permalink":"/blog/analisis-phising/","section":"","summary":"","title":"Analisis Alur Serangan Email Phising di Universitas X","type":"blog"},{"content":"","externalUrl":null,"permalink":"/about/","section":"","summary":"","title":"","type":"page"},{"content":"","externalUrl":null,"permalink":"/resources/","section":"","summary":"","title":"","type":"page"},{"content":" Tools # Simple To-Do App Cron Expression Builder IP Subnet \u0026amp; VLSM Calculator Labs # SSRF Lab\nBlind XSS Lab\nStored XSS Lab\nRace Condition Lab\nDNSLookup Web - OS Command Injection Lab\nImage Processor Web - OS Command injection Lab\n","externalUrl":null,"permalink":"/tools/","section":"","summary":"","title":" ","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"}]